Rozstrzygniecie 1. Monolit mieszal cztery typy OKF. Rozbity PER TYP po
granicy sekcji `##`:
10 x decision — pozycje backlogu (w tym backlog-aktywne 28 KB
i backlog-zamkniete 12 KB, ktore zostaja calosciami)
7 x incident — bugi/awarie dotad wtopione w backlog: cutover HA ken,
checkpoint observera, ha-diag-agent node=unknown,
deploy-local ghost-kontenery, paperless-worker config,
deploy-node nie przebudowuje obrazu, ollama bez sterownika
2 x phase — HA configs-as-code, monitoring floty Prometheus
kb/phases/backlog.md zostaje jako cienki indeks (type: phase, status: active):
oryginalna preambula + wygenerowany spis linkow do wszystkich 19 elementow.
23 przychodzace odwolania zostaja przepiete na ta sciezke w grupie 7.
NIE rozbijano po `###` (38 pozycji w "Aktywne" + 13 w "Zamkniete" = 51
plikow). Rozstrzygniecie mowi "rozbij per typ", a nie per pozycja;
rozdrobnienie do 51 plikow rozerwaloby czytelnosc backlogu.
Kontrola: preambula + 19 sekcji == oryginal z HEAD (multizbior niepustych
linii). Tresc pozycji nietknieta.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2.6 KiB
| okf | type | visibility | status | updated | links | |
|---|---|---|---|---|---|---|
| 0.1 | incident | private | active | 2026-08-03 |
|
Bug: ha-diag-agent emituje eventy z node="unknown" do katalogu innego węzła (2026-07-14) — ZROBIONE (2026-07-15, f2ba81b)
Kontekst. To był plik-truciciel z buga checkpointu wyżej:
evt-unknown-1781254800-ha_update_available-homeassistant-951.json w
events/piha/. Node w evencie = unknown, ale plik wylądował w katalogu piha/.
Sufiks -951 to _seq emittera → agent nachodził długo, wyemitował 951 eventów,
wszystkie jako node="unknown".
Root cause (config-wiring). Tożsamość agenta (node_name) i KATALOG eventów
pochodzą z DWÓCH niezależnych źródeł:
services/ha-diag-agent/src/ha_diag/config.py:20→node_name: str = "unknown"(domyślne, gdy envNODE_NAMEnie dotrze do procesu w kontenerze).services/ha-diag-agent/docker-compose.yml:12→ wolumen/opt/homelab/events/${NODE_NAME:-ha-diag}:/events—${NODE_NAME}jest interpolowane po stronie HOSTA (compose), a katalog jest dodatkowo twardo przypięty dopihawhosts/piha/runtime/ha-diag-agent/docker-compose.override.yml.
Jeśli NODE_NAME trafi do interpolacji wolumenu/override (→ piha), ale NIE do
environment: procesu (albo Settings.load() przez os.environ.setdefault go nie
nadpisze), aplikacja czyta node_name="unknown" i pisze eventy node="unknown"
do katalogu events/piha/. Rozjazd między nazwą w evencie a katalogiem docelowym.
Skutek. Poza zatruciem checkpointu (już naprawione osobno): eventy node="unknown"
są bezużyteczne dla world_state (observer tworzy węzeł-widmo unknown, potem prune go
kasuje bo nie ma go w topologii) — realny sygnał z ha-diag na piha przepada.
Fix — ZROBIONE (2026-07-15, f2ba81b, docs/sessions/2026-07-15.md). Wariant (a):
node_name NIGDY nie może być "unknown" w produkcji. config.py
Field(default="unknown", validate_default=True) + validator odrzuca ""/"unknown";
main.py → SystemExit(1) FATAL przy braku NODE_NAME; EventEmitter.__init__ jako
ostatnia bramka przed nazwą pliku eventu. +18 testów, 0 regresji. Zmergowany i
zdeployowany na PIHA (rebuild, NODE_NAME=piha dochodzi do procesu). Pliki
evt-unknown-* na VPS/PIHA: 0 (potwierdzone).
Pozostaje osobno (druga warstwa obrony, nadal TODO): observer/emitter powinien
docelowo odrzucać/kwarantannować event, którego node w treści != katalog docelowy —
dzisiejszy fix zamyka źródło (unknown nie powstaje), ale nie waliduje spójności
node↔katalog dla innych, przyszłych źródeł eventów.