Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
13 changes: 11 additions & 2 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,15 @@ <h1>Jak żyć lepiej</h1>
<p class="intro">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.</p>
<p class="intro">Informacje zdrowotne i prawne są ogólne. Nie zastępują diagnozy, leczenia ani oceny indywidualnej sprawy. Sprawdź zakres i ograniczenia przy wybranej poradzie.</p>
<p class="intro" id="review-notice">Porady są sprawdzane ze źródłami maszynowo, a przegląd trwa. Nie zatwierdził ich lekarz ani prawnik.</p>
<p><a href="https://github.com/mikomiel/HowToLiveBetter-PL/blob/main/README.md">O wydaniu i metodzie</a> · <a href="https://github.com/mikomiel/HowToLiveBetter-PL/tree/main/book/pl">Polskie rozdziały w Markdown</a> · <a href="https://github.com/mikomiel/HowToLiveBetter-PL/pulls">Zgłoś poprawkę</a></p>
<p><a href="https://github.com/mikomiel/HowToLiveBetter-PL/blob/main/README.md">O wydaniu i metodzie</a> · <a href="https://github.com/mikomiel/HowToLiveBetter-PL/tree/main/book/pl">Polskie rozdziały w Markdown</a> · <a href="https://github.com/mikomiel/HowToLiveBetter-PL/issues">Zgłoś błąd</a> · <a href="#publikacja">Wydanie, kontakt i prywatność</a></p>
<form class="controls" role="search" aria-label="Wyszukiwanie porad">
<div class="search-control"><label for="search">Szukaj w polskich poradach</label><input id="search" type="search" placeholder="Np. sen, spotkanie, konto" aria-describedby="search-help" disabled></div>
<div><label for="chapter">Rozdział</label><select id="chapter" disabled><option value="">Wszystkie rozdziały</option></select></div>
<div><label for="grade">Ocena dowodów</label><select id="grade" aria-describedby="search-help" disabled><option value="">Wszystkie oceny</option><option value="A">A — synteza ilościowa</option><option value="B">B — badania i wytyczne</option><option value="C">C — normy i zalecenia</option></select></div>
<button id="reset" type="button" disabled>Wyczyść filtry</button>
</form>
<p id="search-help">Możesz szukać bez polskich znaków. Litera opisuje rodzaj źródła, nie gwarantuje prawdziwości ani opłacalności porady. <a href="https://github.com/mikomiel/HowToLiveBetter-PL/blob/main/README.md#jak-czytac-dowody">Jak czytać oceny A, B i C</a>.</p>
<p id="status" role="status" aria-live="polite">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).</p>
<p id="status" role="status" aria-live="polite">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).</p>
<button id="retry" type="button" hidden>Spróbuj wczytać ponownie</button>
<noscript><p>Włącz JavaScript, aby użyć wyszukiwania, lub otwórz rozdział w Markdown. Nie wczytano żadnych porad.</p></noscript>
</header>
Expand All @@ -87,6 +87,15 @@ <h1>Jak żyć lepiej</h1>
<footer>
<p>Niezależna polska adaptacja HowToLiveBetter autorstwa <a href="https://github.com/eternity4719/HowToLiveBetter">eternity4719</a>. To wybór rozdziałów, nie tłumaczenie całej książki. Tylko treść o stanie verified jest publikowana w tym czytniku.</p>
<p>Tekst: <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a> (<a href="LICENSE">pełna licencja</a>). Kod: <a href="LICENSE-CODE">MIT</a>, Copyright (c) 2026 eternity4719. Zmiany i weryfikację opisano przy każdej poradzie. Brak gwarancji poprawności; sprawdzaj ograniczenia i źródła.</p>
<section id="publikacja" aria-labelledby="publikacja-tytul">
<h2 id="publikacja-tytul">Wydanie, kontakt i prywatność</h2>
<p><strong>Opiekun niezależnej polskiej adaptacji:</strong> <a href="https://github.com/mikomiel">mikomiel</a>. To nie jest oficjalne wydanie autora.</p>
<p><strong>Kontakt do korekt:</strong> <a href="https://github.com/mikomiel/HowToLiveBetter-PL/issues">GitHub Issues</a>. Podaj numer porady, kwestionowane zdanie i źródło. Zgłoszenia i komentarze są publiczne. Nie przesyłaj danych zdrowotnych, haseł, danych innych osób ani dokumentów indywidualnej sprawy.</p>
<p>Przy redakcji treści i opracowaniu publicznych zgłoszeń używamy też generatywnej AI. Nie jest to indywidualna konsultacja medyczna ani prawna.</p>
<p><strong>Działanie czytnika:</strong> wyszukiwanie i filtrowanie odbywa się w przeglądarce. Kod czytnika nie wysyła wpisanej frazy do serwera i nie zapisuje jej w cookies, localStorage ani sessionStorage. Nie dodajemy własnej analityki, reklam ani kont czytelnika. Przeglądarka może przechowywać pobrane pliki w pamięci podręcznej.</p>
<p><strong>Hosting i zewnętrzne serwisy:</strong> stronę udostępnia GitHub Pages. Według <a href="https://docs.github.com/en/pages/getting-started-with-github-pages/about-github-pages#data-collection">dokumentacji hostingu</a> GitHub zapisuje adresy IP odwiedzających w celach bezpieczeństwa, również bez logowania. Brak własnej analityki nie oznacza braku przetwarzania danych przez GitHub. Po otwarciu zgłoszeń lub zewnętrznych źródeł korzystasz z tych serwisów według ich zasad; zobacz <a href="https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement">informację o prywatności GitHuba</a>.</p>
<p>Opis dotyczy działania tego czytnika i publicznego kanału korekt. Nie jest deklaracją pełnej zgodności prawnej publikacji ani zastępstwem zasad hostingu.</p>
</section>
</footer>
<script type="module" src="reader.mjs"></script>
</body>
Expand Down
21 changes: 21 additions & 0 deletions tests/browser/site.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion tests/content.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ test('active Polish metadata has no upstream site, ads or publication address',
const html = read('index.html');
assert.match(html, /<html lang="pl">/);
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);
Expand Down
29 changes: 29 additions & 0 deletions tests/publication.test.mjs
Original file line number Diff line number Diff line change
@@ -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(/<section id="publikacja"[\s\S]*?<\/section>/)?.[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</a>', '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"'));
});
Loading