homelab-codex-ws/kb/phases/kb-m5-faza5-wiki.md
oskar 308ae6a9f4 docs(kb): faza5-wiki §6 — rozliczenie rekoncyliacji kb-wiki (2026-08-27)
Operator zdecydował: opcja 1 z §4 (scalić). Wykonane w klonie roboczym
~/kb-wiki (repo prawdziwe, master, poza tym worktree) — cztery commity
lokalne, świadomie nie pushnięte, czekają na review operatora:

1. sprawy/fll-2025-26.md — scalone przed tą sesją (commit c4127b9 w
   kb-wiki, już pushnięty), ta sesja tylko zweryfikowała ponownie.
2. podmioty/mbank.md i osoby/pawel-cesar-sanjuan-szklarz.md przeniesione z
   ~/kb-wiki-etap1-sesja-2026-08-27/ bez kolizji, linki [[...]] przepisane
   na rzeczywistą konwencję repo (bez prefiksu katalogu).
3. check_okf.py (walidator sesyjny) przeniesiony do kb-wiki, zaadaptowany
   do layoutu repo (type=meta, wyjątek README/INDEX/lint-reports).
4. Decyzje (d)-(f) audytu 08-26 (fallback chunk-id, sekcja "Niepewne/
   sprzeczne" + polityka aktualizacji, inwariant 7) scalone do
   _meta/conventions.md bez duplikowania tego, co repo już miało.

Stan końcowy: 7 stron w repo, 74/74 sources + 150/150 przypisów inline
zweryfikowanych wprost w bazie (KB_DSN, SELECT-only), zero wiszących
linków. Pełny raport: _meta/lint-reports/2026-08-27-rekoncyliacja.md w
kb-wiki. ~/kb-wiki-etap1-sesja-2026-08-27/ pozostawione nietknięte na
żądanie operatora.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W7AnxL6pbgySpEgcCwAfww
2026-08-27 19:57:39 +02:00

19 KiB
Raw Blame History

okf type visibility status updated links
0.1 phase private active 2026-08-27
../audits/wiki-kompilat-recon-2026-08-26.md
kb-m5-faza3.md
kb-m5-faza-mailowa.md

Moduł 5, faza 5 — wiki-kompilat (Etap 1: bootstrap + proof, i odkrycie rozjazdu)

**Status: Etap 1 wykonany 2026-08-27 — ale w cieniu ważniejszego znaleziska: proof-of-concept wiki-kompilatu (repo kb-wiki, 5 stron) już istniał od 2026-07-21, na Forgejo (https://forgejo.kapala.org/oskar/kb-wiki), i kb/audits/wiki-kompilat-recon-2026-08-26.md tego nie wykrył. Ta sesja (2026-08-27) zbudowała niezależny, równoległy lokalny bootstrap (~/kb-wiki-etap1-sesja-2026-08-27/, 3 strony) nie wiedząc o repo z lipca — dowiedziała się dopiero przy Części C tego zadania, kiedy próba udokumentowania "remote nie istnieje" (cytat z polecenia sesji, zgodny z audytem) skłoniła do sprawdzenia Forgejo wprost. Nic nie zostało wypchnięte do prawdziwego zdalnego repo — ta sesja tylko czytała je (git clone, pull-only).

Rekoncyliacja domknięta 2026-08-27 (operator zdecydował: opcja 1 z §4 — scalić). kb-wiki ma teraz 7 stron: 5 lipcowych + fll-2025-26 scalone (dwie niezależne kompilacje tej samej encji) + mbank/ pawel-cesar-sanjuan-szklarz przeniesione bez kolizji. Cztery commity na master lokalnie, nie pushnięte — czekają na review operatora przed pushem do Forgejo. Pełne rozliczenie: §6.


0. Jak doszło do odkrycia (żeby przyszła sesja nie powtórzyła tej samej luki)

kb/audits/wiki-kompilat-recon-2026-08-26.md (2026-08-26, decyzje a-h zatwierdzone 2026-08-27) stwierdza wprost w nagłówku: „Nic nie zostało zaimplementowane, zdeployowane ani skommitowane poza tym dokumentem." Dowody audytu: worktree homelab-codex-ws cięty z mastera, pilot ~/narty-2027/saalbach-kb (lokalny odczyt), żywa baza kb na PIHA (ssh piha 'docker exec kb-postgres psql...'), systemctl status na PIHA. Forgejo nie było w tym zestawie dowodów — audyt nie odpytał API/repo Forgejo, mimo że CLAUDE.md i inventory/topology.yaml jasno wskazują git_provider: forgejo jako miejsce, gdzie kb-wiki miało w ogóle powstać (decyzja D7 faza3 §8.2: „osobne repo kb-wiki", bez wskazania konkretnego hosta w chwili pisania szkicu — Forgejo to naturalna, ale niejawna implikacja).

Zlecenie tej sesji (2026-08-27, Etap 1) powtórzyło za audytem: „REMOTE NIE ISTNIEJE — nie konfiguruj, nie pushuj; operator założy repo na Forgejo później." To zdanie okazało się faktycznie nieprawdziwe — sprawdzone dopiero przy pisaniu tego dokumentu (Część C zlecenia), zapytaniem GET do http://100.108.208.3:3000/ api/v1/repos/search?q=kb-wiki (read-only, bez uwierzytelnienia, private: false więc odpowiedź jawna) i następnie git clone (pull-only, potwierdzone uprawnieniami API: "push": false, "pull": true) do katalogu tymczasowego poza tym repo.

Wniosek na przyszłość: „repo nie istnieje" w planie/audycie nie jest wystarczające bez sprawdzenia bezpośrednio w systemie, który je hostuje (inventory/topology.yamlgit_provider: forgejo → Forgejo API/git ls-remote), nie tylko w obrębie homelab-codex-ws i lokalnych klonów znanych z wcześniejszych sesji. Ten sam błąd metodologiczny mógłby się powtórzyć przy dowolnym innym „osobnym repo" planowanym w dokumentacji, ale nigdy nie zweryfikowanym wprost u hosta.


1. Co faktycznie istnieje w oskar/kb-wiki (Forgejo, od 2026-07-21)

Stan wg git clone https://forgejo.kapala.org/oskar/kb-wiki.git (read-only, 2026-08-27), 3 commity na master:

156925c struktura: katalogi, konwencje, README
42c7731 compile: pzu, warta, ubezpieczenie-auto-ga431ja-2026, fll-2025-26, wspolnota-mieszkaniowa-targowa-2a ← kaskada retrievalu kb-postgres@PIHA
c52f867 lint: pierwszy raport ręczny 2026-07-21

Struktura: README.md, INDEX.md (wielka litera — inaczej niż plik zarezerwowany OKF index.md, patrz §3 niżej), _meta/conventions.md, _meta/lint-reports/ lint-report-2026-07-21.md, 5 stron-encji:

Strona Typ Skrót
podmioty/pzu.md podmiot PZU — OWU Auto/OC, karty produktu, oferta T1531938417
podmioty/warta.md podmiot WARTA — OWU AC Standard/Komfort/Moje Auto
sprawy/ubezpieczenie-auto-ga431ja-2026.md sprawa Porównanie ofert PZU/WARTA/InterRisk, Mazda 6 (GA431JA), 06.2026
sprawy/fll-2025-26.md sprawa FLL Challenge UNEARTHED, drużyna #1100, Warszawa II
sprawy/wspolnota-mieszkaniowa-targowa-2a.md sprawa Wspólnota Mieszkaniowa Targowa 2A (Pruszków) — zebranie roczne 2026

osoby/, umowy/, tematy/ istnieją jako katalogi puste (.gitkeep) — zero stron typu osoba w lipcowym proof-of-concept. To jest jedyna luka pokrycia typów, którą Etap 1 tej sesji (§2) faktycznie domyka, nie duplikuje.

Jakość: wysoka, metodologicznie zgodna z tym, co audyt 08-26 dopiero rekomendował (sekcja „Niepewne/sprzeczne" jako wzorzec — tam nazwana wprost inaczej, ale ta sama funkcja; degradacja przy uszkodzonym OCR zamiast ślepego zaufania streszczeniu; 84/86 wpisów sources[].chunks i 73/73 przypisów inline zweryfikowanych wprost w bazie, udokumentowane w _meta/lint-reports/lint-report-2026-07-21.md). Pełna treść: _meta/conventions.md tamtego repo (różni się od konwencji tej sesji w kilku miejscach nieistotnych merytorycznie — casing INDEX.md/index.md, typ meta vs temat dla conventions.md — patrz §3).

kb-m5-faza4.md (linia 17, docs/sessions/2026-07-21.md) już to dokumentowały poprawnie — ten fakt był w repo homelab-codex-ws cały czas, czytelny git log/ grep -r kb-wiki. Audyt 08-26 po prostu tego nie sprawdził (§0 wyżej).


2. Co ta sesja (2026-08-27) faktycznie zrobiła — Etap 1 wg zlecenia, lokalnie, bez wiedzy o §1

Zbudowany od zera, niezależnie: ~/kb-wiki-etap1-sesja-2026-08-27/ (przemianowany z ~/kb-wiki/ po odkryciu §1 — żeby nie kolidować ścieżką z przyszłym git clone prawdziwego repo). Git lokalny, 6 commitów, nigdy nie pushowany do żadnego remote (żaden remote nie był skonfigurowany — zgodnie z literą pierwotnego zlecenia, które okazało się oparte na błędnym założeniu z §0).

3 strony proof, celowo zróżnicowane typy (jak żądał audyt §9 Etap 1):

Strona Typ Pokrycie względem §1
sprawy/fll-2025-26.md sprawa Duplikat tej samej encji co lipcowe repo — skompilowany niezależnie, z częściowo innym zestawem chunków (uzupełniające, nie identyczne sources). Wysoka zgodność wniosków — patrz §4.
podmioty/mbank.md podmiot Nowe pokrycie — nie istnieje w lipcowym repo (tam tylko PZU/WARTA, ubezpieczyciele)
osoby/pawel-cesar-sanjuan-szklarz.md osoba Domyka lukę — lipcowe repo ma katalog osoby/ pusty; to pierwsza strona typu osoba w całym projekcie, jedyny dotąd test entity-resolution na aliasach

Pełna treść stron, _meta/conventions.md tej sesji (napisane niezależnie od lipcowego — patrz różnice §3), check_okf.py (walidator, którego lipcowe repo nie ma jako skomitowanego pliku — tamta sesja weryfikowała sources/przypisy ad hoc, bez zostawienia narzędzia), i _meta/lint-reports/2026-08-27.md — wszystko w ~/kb-wiki-etap1-sesja-2026-08-27/, 6 commitów (git log --oneline): struktura+konwencje, walidator, 3× compile:, 1× lint:.

DoD audytu §9 Etap 1 (tabela, 4 punkty) — spełnione lokalnie, w tym repo równoległym: repo istnieje z konwencjami, walidator działa (zielono, 40 par sources + 47 inline przypisów zweryfikowanych wprost w KB_DSN), 3 strony proof spełniają inwarianty 1-2, raport lintu ręcznego zapisany.

Weryfikacja lint:

$ python3 check_okf.py     # w ~/kb-wiki-etap1-sesja-2026-08-27/
ZGODNE z OKF v0.1 (kb-wiki): [...] wszystkie 40 przypisów zweryfikowane w bazie.

scripts/kb/check_okf.py z homelab-codex-ws uruchomiony na tym samym repo — zgodnie z rozjazdem przewidzianym w zleceniu:

$ python3 scripts/kb/check_okf.py ~/kb-wiki-etap1-sesja-2026-08-27
Zakres: kb, docs/sessions
Sprawdzono plików .md: 0
BRAK plików w zakresie — nie ma czego walidować.

SCOPE = ("kb", "docs/sessions") w tamtym skrypcie jest wpisany na sztywno względem rootkb-wiki (żadna z dwóch kopii, lipcowa ani ta) nie ma podkatalogu kb/ ani docs/sessions/, więc walidator zawsze zwróci "brak plików" dla tego layoutu. Nie hackowany — to jest realny, ustrukturalny rozjazd (nie błąd w kb-wiki), odnotowany tu jako follow-up: albo scripts/kb/ check_okf.py dostaje parametr --scope, albo kb-wiki (dowolna wersja) trzyma własny walidator na stałe (rekomendacja tej sesji — już częściowo zrobione, patrz check_okf.py w repo tej sesji).


3. Różnice konwencji: lipiec vs ta sesja (nieistotne merytorycznie, warto ujednolicić)

Aspekt Lipiec (oskar/kb-wiki, prawdziwe repo) Ta sesja (lokalne) Rekomendacja
Plik nawigacyjny root INDEX.md (duża litera), osobny od OKF-owego index.md (nie istnieje w ogóle w lipcowym repo — brak pliku index.md) index.md (mała litera, OKF §11 reserved-file, pełni tę samą rolę) Do rozstrzygnięcia przez operatora — lipcowe repo nie ma pliku index.md w ogóle, więc formalnie nie przechodzi check_okf.py tej sesji (brak bloku frontmattera nie wystąpi, bo pliku nie ma, ale reguła "root index.md wymagany" by to złapała, gdyby uruchomić walidator tej sesji na lipcowym repo — nie testowane, bo nie nasze repo do modyfikacji)
type dla _meta/conventions.md meta (dodatkowa wartość w słowniku typów) temat (nadużycie istniejącego typu, bo TYPES tej sesji nie miało meta) Lipcowe podejście czystsze — warto przyjąć meta jako 6. typ przy rekoncyliacji
Frontmatter sources obowiązkowe niepuste Nie wymuszone narzędziem (ręczna dyscyplina) Wymuszone w check_okf.py (poza _meta/) Zachować regułę tej sesji przy rekoncyliacji — tańsze niż poleganie na dyscyplinie
Walidator jako plik w repo Brak (weryfikacja ad hoc, nieskomitowana) check_okf.py, skomitowany, wielokrotnego użytku Przenieść check_okf.py tej sesji do prawdziwego repo przy rekoncyliacji
Remote skonfigurowany Tak (Forgejo, master) Nie (lokalny, celowo)

Żadna z różnic nie jest błędem — obie konwencje są spójne z faza3 §8.2 i audytem 08-26 w rzeczach, które się nakładają (format [^envelope_id#chunk_id], fallback, sekcja niepewności, CC/API-only, izolacja retrievalu kompilacji od source='wiki').


4. Rekoncyliacja — do operatora, nie rozstrzygane przez tę sesję

To jest decyzja o realnych, już opublikowanych danych osobowych (finanse, ubezpieczenia, dziecko na turnieju) w prawdziwym repo — powyżej progu, przy którym ta sesja podejmuje decyzje sama. Opcje, bez rekomendacji wiążącej:

  1. Scalić nowe strony tej sesji do prawdziwego repo. podmioty/mbank.md i osoby/pawel-cesar-sanjuan-szklarz.md nie kolidują z niczym w lipcowym repo — czysty dodatek. sprawy/fll-2025-26.md koliduje (dwie różne kompilacje tej samej encji) — wymaga porównania treść-po-treści przez operatora albo kolejną sesję CC, nie automatycznego scalenia.
  2. Porównanie dwóch niezależnych kompilacji fll-2025-26 jako test jakości kompilatora. Obie wersje (lipcowa i ta) zgadzają się merytorycznie w kluczowych punktach: wynik 195 pkt jako jedyny czytelny wprost z chunka (paperless:119#277/#278 — obie sesje trafiły w ten sam chunk niezależnie), pozostałe dwa wyniki (165/230) tylko ze streszczenia, nominacja do Nagrody Sędziów niepotwierdzona wprost w chunku, imiona z formularzy zgód celowo pominięte, nazwisko trenera nieczytelne OCR. Rozbieżność: ta sesja znalazła i zacytowała sprzeczność liczebności drużyny (10 vs 8 osób, z korespondencji gmail — lipcowa wersja jej nie ma, bo nie sięgnęła po te same koperty gmail). Lipcowa wersja znalazła niejednoznaczność sezonu SUBMERGED vs UNEARTHED (paperless:6) i konkretne imiona dzieci z nazw plików (metadane, nie treść dokumentu) — ta sesja pominęła paperless:6 całkowicie i nie sięgnęła po entities[type=filename]. Dwie niezależne kompilacje tej samej encji nie są sprzeczne, są komplementarne — dobry sygnał, że metoda jest powtarzalna, zły sygnał, że jedna kompilacja pomija realne dowody, które druga znalazła.
  3. Zostawić oba repo osobno, jawnie zarchiwizować to jako dwa niezależne przebiegi tej samej fazy. Najbezpieczniejsze, ale traci szansę na scalenie uzupełniających się dowodów z punktu 2.

Krok operatora, niezależnie od wyboru z (1)-(3): ~/kb-wiki-etap1-sesja-2026-08-27/ istnieje lokalnie, nigdy nie pushowany — do usunięcia/scalenia/zachowania wg decyzji, nie automatycznie.


5. Poza zakresem tej notatki (Etap 2, jeśli operator potwierdzi kontynuację)

Zależnie od wyniku rekoncyliacji z §4:

  • Skala do pełnej listy 17 encji z audytu §3 (już częściowo pokryta lipcowym repo inną listą — PZU/WARTA/wspólnota/FLL nie pokrywają się z 17-pozycyjną listą audytu poza fll-2025-26; wymaga ponownego review, które z 17 są już zrobione pod innymi nazwami).
  • Lint automatyczny w kodzie (kb-wiki/lint.py, inwariant 3 pełny) — żadna z dwóch kopii tego nie ma, obie robiły lint ręcznie.
  • Jednorazowy skan <EFBFBD>/\x00 na źródłach, które faktycznie zasiliły PoC (decyzja h) — nie wykonany w żadnej z dwóch kompilacji; oba proof-of-concept napotkały uszkodzony OCR organicznie (paperless:119/120 w obu wersjach fll-2025-26, mbank.md ta sesja) bez systematycznego skanu.
  • Integracja source='wiki' w packages/kb-retrieval (inwariant 5+7) — poza zakresem obu przebiegów.
  • Rozjazd scripts/kb/check_okf.py (SCOPE sztywny) — patrz §2, nie naprawiony celowo (instrukcja zlecenia: nie hackować).

6. Rekoncyliacja domknięta (2026-08-27, decyzja operatora: opcja 1 z §4)

Operator zdecydował scalić — bez rozstrzygania punktu 3 z §4 (dwa osobne repo) i bez samego jedynie archiwizowania punktu 2 (test jakości kompilatora, wykonany przy okazji scalenia fll-2025-26, patrz niżej). Wykonano w klonie roboczym ~/kb-wiki (repo prawdziwe, master), cztery commity, lokalnie, świadomie nie pushnięte — review operatora przed pushem do Forgejo jest krokiem następnym, nie tej sesji.

6.1 fll-2025-26 — scalenie dwóch niezależnych kompilacji

Wykonane przed tą sesją reconciliation (kb-wiki commit c4127b9, autor: operator lub wcześniejsza sesja — poza zakresem tego zadania, ta sesja zastała je już na master i pushnięte: "Push zrobiony", cytat zlecenia). Wynik zgodny z analizą §4 punkt 2: zero sprzecznych twierdzeń, czysto komplementarne pokrycie (lipiec: 14 kopert paperless; sierpień dodał 6 kopert gmail + paperless:183) — 21 kopert finalnie (15 paperless + 6 gmail), 38/38 par sources + 45/45 przypisów inline zweryfikowanych w bazie przy tamtym scaleniu. Ta sesja nie modyfikowała tej strony — tylko zweryfikowała ją ponownie w ramach pełnego lintu repo (§6.4).

6.2 mbank i pawel-cesar-sanjuan-szklarz — przeniesione bez kolizji

Zgodnie z §4 punkt 1 ("nie kolidują z niczym w lipcowym repo — czysty dodatek"): skopiowane z ~/kb-wiki-etap1-sesja-2026-08-27/ do ~/kb-wiki, linki [[...]] przepisane ze składni sesyjnej ([[../katalog/plik]]) na rzeczywistą konwencję repo ([[plik]], bez katalogu). Treść merytoryczna nietknięta. INDEX.md dopisany o oba wpisy. sprawy/fll-2025-26.md przestało być sierotą w grafie [[...]] (link przychodzący z obu nowych stron, sekcja „Powiązane" — decyzja sesyjna sprzed przeniesienia, nie tej rekoncyliacji: „sprawdzone wprost, zero wspólnego dowodu", link mimo braku dowodu).

6.3 Konwencje: check_okf.py przeniesiony, decyzje (d)-(f) scalone

check_okf.py (walidator sesyjny) przeniesiony do ~/kb-wiki — lipcowy proof-of-concept nie zostawił żadnego skomitowanego narzędzia (§3 tabela, rekomendacja "Przenieść check_okf.py tej sesji do prawdziwego repo przy rekoncyliacji" — wykonana dosłownie). Zaadaptowany do rzeczywistego layoutu tego repo: TYPES rozszerzone o meta (repo miało 6. typ od lipca, sesyjny walidator znał tylko 5), README.md/INDEX.md/_meta/lint-reports/*.md wyjęte z wymogu frontmattera stron-konceptów (istniały bez niego od 2026-07-21 — dokumentacja/raporty, nie skompilowane encje).

Decyzje (d)-(f) audytu 08-26, wypracowane w _meta/conventions.md sesji (§5/§7/§8 tamtego pliku), scalone do _meta/conventions.md prawdziwego repo — bez duplikowania tego, co repo już miało z lipca/wcześniejszej sesji (6 typów wliczając meta, sekcja „Brak danych w KB" — obie już scalone, commity 156925c/3bd2441, przed tym zadaniem):

  • (d) fallback envelope-only[^envelope_id] bez #chunk_id, gdy dowód nie ma konkretnego chunka albo chunk zniknął po re-chunkingu.
  • (e) sekcja „Niepewne / sprzeczne" jako nazwana sekcja końca strony (już używana de facto na żywych stronach, teraz sformalizowana pisemnie) + polityka aktualizacji „dopisz, nie nadpisuj" przy nowym sprzecznym dowodzie.
  • (f) inwariant 7 — izolacja retrievalu kompilacji od source='wiki' (mitygacja self-citation/citogenesis), CC/API-only jako wykonawca.

Różnica konwencji z §3 tabeli dotycząca casingu pliku nawigacyjnego (INDEX.md vs OKF-owy index.md) pozostaje nierozstrzygnięta — zgodnie z §3, do operatora, poza zakresem tej rekoncyliacji. check_okf.py pragmatycznie traktuje oba pliki root (README.md, INDEX.md) jako wyjęte z wymogu frontmattera, bez przesądzania, który plik "wygrywa".

6.4 Lint na całości — stan końcowy: 7 stron, zero błędów

python3 check_okf.py w ~/kb-wiki: ZGODNE, 74/74 par sources (wszystkie 6 stron-konceptów poza _meta/) zweryfikowanych w KB_DSN (SELECT-only). Osobny, pełny przebieg (skrypt jednorazowy, nieskomitowany — check_okf.py nie parsuje treści Markdown) po wszystkich przypisach inline [^envelope_id#chunk_id] na wszystkich 7 stronach: 150/150 zweryfikowanych, 0 zdegradowanych do fallback. Zero wiszących linków [[...]], zero błędów przypisania chunk→envelope. Pełny raport: _meta/lint-reports/2026-08-27-rekoncyliacja.md w kb-wiki.

Metryka Wynik
Stron w repo (po rekoncyliacji) 7 (5 lipiec + fll-2025-26 scalone + 2 przeniesione)
sources: (agregat frontmatter) zweryfikowane w bazie 74/74
Przypisy inline zweryfikowane w bazie 150/150
Wiszące linki [[...]] 0
Przypisy zdegradowane (fallback envelope-only) 0
Commity rekoncyliacji na kb-wiki:master 4, lokalne, nie pushnięte

6.5 Co zostało poza zakresem tej rekoncyliacji

  • ~/kb-wiki-etap1-sesja-2026-08-27/ — pozostawione nietknięte na żądanie operatora ("skasuję sam po weryfikacji"), nie usuwane przez tę sesję.
  • Push kb-wiki:master do Forgejo — czeka na review operatora.
  • Wszystko z §5 (skala do 17 encji, lint automatyczny w kodzie, skan <EFBFBD>/\x00 na źródłach, integracja source='wiki' w retrievalu, rozjazd scripts/kb/check_okf.py) — nadal otwarte, nie ruszone tą rekoncyliacją.