From 80a478a9db5a1f23062102566e52bd6072c950e4 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 5 Nov 2026 19:01:00 +0100 Subject: [PATCH] docs(pl): clarify maintainer and reader privacy --- README.md | 4 ++-- index.html | 13 +++++++++++-- tests/browser/site.spec.mjs | 21 +++++++++++++++++++++ tests/content.test.mjs | 2 +- tests/publication.test.mjs | 29 +++++++++++++++++++++++++++++ 5 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 tests/publication.test.mjs diff --git a/README.md b/README.md index 4be7bb107..f00288220 100644 --- a/README.md +++ b/README.md @@ -143,9 +143,9 @@ Wdrożeniem strony czytnika w GitHub Pages zarządza właściciel. Samo scalenie Adaptację przygotowywano i przeglądano z pomocą generatywnej AI. Konsultacja z agentem Prawnik AI nie jest przeglądem przez adwokata lub radcę prawnego. Historyczny run7 i jego liczba przyjętych raportów nie potwierdzają automatycznie aktualnego brzmienia porad: zmiana tekstu unieważnia odpowiednie pakiety audytu. Aktualne daty i zakres sprawdzenia pozostają przy poradach. -Sam kod czytnika nie tworzy kont, formularzy ani własnej analityki i pobiera treść z tego samego hosta. Nie oznacza to, że hosting nie przetwarza danych. [GitHub dokumentuje zapisywanie adresów IP odwiedzających Pages dla bezpieczeństwa](https://docs.github.com/en/pages/getting-started-with-github-pages/what-is-github-pages#data-collection), także bez logowania. Nie deklarujemy braku przetwarzania danych przez GitHub ani kompletnej informacji o prywatności wydawcy. +Publiczne informacje o opiekunie adaptacji, kanale korekt i działaniu czytnika mają jedno miejsce w [sekcji „Wydanie, kontakt i prywatność”](index.html#publikacja), publikowanej razem z czytnikiem. Właściciel zatwierdził oznaczenie opiekuna jako mikomiel, GitHub Issues do publicznych korekt i brak dodatkowej analityki. Nie oznacza to, że hosting nie przetwarza danych. Sekcja rozróżnia lokalne wyszukiwanie, pamięć podręczną przeglądarki, przetwarzanie przez GitHub Pages i publiczne zgłoszenia, również opracowywane z pomocą AI. Nie podawaj danych wrażliwych ani dokumentów indywidualnej sprawy. -Przed pierwszym publicznym wdrożeniem właściciel powinien ustalić, kto i w jakim charakterze publikuje, jaki podaje kontakt do korekt oraz jakie są role i obowiązki związane z hostingiem i korespondencją. Musi sprawdzić rzeczywiste operacje strony, w tym ewentualne zapisy na urządzeniu, i uzupełnić adekwatną informację o prywatności. Nie dodajemy fikcyjnych danych wydawcy, uniwersalnego regulaminu ani banera zgody bez ustalenia potrzeby. Te kwestie i ewentualne obowiązki przejrzystości dotyczące AI pozostają bramką właściciela, nie są załatwione samym zastrzeżeniem w poradniku. +To opis ustalonych funkcji i kanału kontaktu, nie deklaracja pełnej zgodności prawnej, braku przetwarzania przez GitHub ani indywidualnej porady. Nie przypisujemy opiekunowi fikcyjnej firmy, kwalifikacji zawodowych ani danych kontaktowych. Nie dodajemy formularza zgłoszeń, analityki ani banera zgody. Zmiana modelu przetwarzania wymaga ponownej oceny informacji. Treść sekcji staje się dostępna na stronie dopiero po odrębnym wdrożeniu przez właściciela; samo scalenie PR nie potwierdza aktywacji. ## Warunki licencji diff --git a/index.html b/index.html index c2f184943..9dbe7b637 100644 --- a/index.html +++ b/index.html @@ -65,7 +65,7 @@

Jak żyć lepiej

Nie musisz robić wszystkiego. Wybierz jedną zmianę, sprawdź jej koszt i zobacz, co naprawdę wynika z badań. Przy każdej poradzie znajdziesz źródła i ograniczenia.

Informacje zdrowotne i prawne są ogólne. Nie zastępują diagnozy, leczenia ani oceny indywidualnej sprawy. Sprawdź zakres i ograniczenia przy wybranej poradzie.

Porady są sprawdzane ze źródłami maszynowo, a przegląd trwa. Nie zatwierdził ich lekarz ani prawnik.

-

O wydaniu i metodzie · Polskie rozdziały w Markdown · Zgłoś poprawkę

+

O wydaniu i metodzie · Polskie rozdziały w Markdown · Zgłoś błąd · Wydanie, kontakt i prywatność

Możesz szukać bez polskich znaków. Litera opisuje rodzaj źródła, nie gwarantuje prawdziwości ani opłacalności porady. Jak czytać oceny A, B i C.

-

Nie uruchomiono czytnika. Włącz JavaScript i odśwież stronę. Użyj lokalnego serwera HTTP, jeśli otwierasz plik z dysku (instrukcja w README na GitHubie). Jeśli komunikat nie znika, odśwież stronę albo zgłoś błąd w repozytorium (odnośnik „Zgłoś poprawkę” powyżej).

+

Nie uruchomiono czytnika. Włącz JavaScript i odśwież stronę. Użyj lokalnego serwera HTTP, jeśli otwierasz plik z dysku (instrukcja w README na GitHubie). Jeśli komunikat nie znika, odśwież stronę albo zgłoś błąd w repozytorium (odnośnik „Zgłoś błąd” powyżej).

@@ -87,6 +87,15 @@

Jak żyć lepiej

diff --git a/tests/browser/site.spec.mjs b/tests/browser/site.spec.mjs index fea6ccf3a..1def9171b 100644 --- a/tests/browser/site.spec.mjs +++ b/tests/browser/site.spec.mjs @@ -65,6 +65,27 @@ test('the built site loads every verified advice under the project path, with no for (const path of ['LICENSE', 'LICENSE-CODE']) expect((await page.request.get(origin + PREFIX + path)).status(), path).toBe(200); }); +test('publication notice is reachable and local search sends no request or browser-storage write', async ({ page }) => { + await page.goto(origin + PREFIX); + await expect(page.locator('#status')).toContainText(`z ${count} opracowanych`); + await page.getByRole('link', { name: 'Wydanie, kontakt i prywatność', exact: true }).click(); + await expect(page).toHaveURL(origin + PREFIX + '#publikacja'); + const notice = page.locator('#publikacja'); + await expect(notice).toContainText('mikomiel'); + await expect(notice.getByRole('link', { name: 'GitHub Issues', exact: true })).toHaveAttribute('href', 'https://github.com/mikomiel/HowToLiveBetter-PL/issues'); + await expect(notice).toContainText('adresy IP'); + const requests = []; + page.on('request', request => requests.push(request.url())); + await page.getByLabel('Szukaj w polskich poradach').fill('prywatnosc-tylko-lokalna'); + await expect(page.locator('article:visible')).toHaveCount(0); + await page.getByLabel('Szukaj w polskich poradach').press('Enter'); + await page.getByRole('button', { name: 'Wyczyść filtry', exact: true }).click(); + await expect(page.locator('article:visible')).toHaveCount(count); + expect(requests).toEqual([]); + expect(await page.context().cookies()).toEqual([]); + expect(await page.evaluate(() => ({ local: Object.keys(localStorage), session: Object.keys(sessionStorage) }))).toEqual({ local: [], session: [] }); +}); + test('nothing outside the reader, the chapters and the licences is reachable on the built site', async ({ page }) => { for (const path of ['ads/mcyyy.webp', 'ads/wechat-reward.png', 'selfcheck.html', 'docs/README.md', 'audit/README.md', 'tools/pl/fetch.mjs', 'README.md', 'book/README.md', 'book/03-不要浪费精力.md', 'og.png', 'updates.json', 'robots.txt', '.git/config']) { expect((await page.request.get(origin + PREFIX + path)).status(), path).toBe(404); diff --git a/tests/content.test.mjs b/tests/content.test.mjs index 0a3a2709a..9c3b4f72e 100644 --- a/tests/content.test.mjs +++ b/tests/content.test.mjs @@ -172,7 +172,7 @@ test('active Polish metadata has no upstream site, ads or publication address', const html = read('index.html'); assert.match(html, //); assert.doesNotMatch(html, /googletagmanager|google-analytics|ads\/|og\.png|selfcheck\.html|eternity4719\.github\.io|\p{Script=Han}/u); - assert.match(html, /https:\/\/github\.com\/mikomiel\/HowToLiveBetter-PL\/pulls/); + assert.match(html, /https:\/\/github\.com\/mikomiel\/HowToLiveBetter-PL\/issues/); assert.match(read('robots.txt'), /Disallow: \/\n/); assert.doesNotMatch(read('robots.txt'), /Sitemap:|github\.io/i); assert.equal(existsSync(resolve(root, 'sitemap.xml')), false); diff --git a/tests/publication.test.mjs b/tests/publication.test.mjs new file mode 100644 index 000000000..fbc790c11 --- /dev/null +++ b/tests/publication.test.mjs @@ -0,0 +1,29 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; + +const read = path => readFileSync(new URL('../' + path, import.meta.url), 'utf8'); +const html = read('index.html'); +const notice = html.match(/
/)?.[0] ?? ''; + +test('public notice credits the independent maintainer and identifies the public correction channel', () => { + assert.ok(notice, 'publication notice is present in the shipped HTML'); + for (const text of ['href="https://github.com/mikomiel">mikomiel', 'niezależnej polskiej adaptacji', + 'href="https://github.com/mikomiel/HowToLiveBetter-PL/issues"', 'Zgłoszenia i komentarze są publiczne', + 'dokumentów indywidualnej sprawy', 'generatywnej AI']) assert.ok(notice.includes(text), text); +}); + +test('privacy notice separates reader behavior, browser caching and GitHub processing', () => { + for (const text of ['localStorage', 'sessionStorage', 'pamięci podręcznej', 'adresy IP', 'również bez logowania', + 'https://docs.github.com/en/pages/getting-started-with-github-pages/about-github-pages#data-collection', + 'https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement', + 'nie oznacza braku przetwarzania danych przez GitHub']) assert.ok(notice.includes(text), text); + assert.doesNotMatch(notice, /mailto:|zgodny z RODO|pełną zgodność z RODO/); +}); + +test('README points to the public notice instead of keeping the resolved publisher placeholder', () => { + const readme = read('README.md'); + assert.ok(readme.includes('index.html#publikacja')); + assert.doesNotMatch(readme, /Przed pierwszym publicznym wdrożeniem właściciel powinien ustalić/); + assert.ok(html.includes('href="#publikacja"')); +});