homelab-codex-ws/kb/incidents/2026-07-14-ha-diag-agent-node-unknown.md
oskar e87bef4cf2 feat(kb): SPLIT backlog.md (72 KB) -> 19 dokumentow + cienki indeks
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>
2026-08-04 16:53:57 +02:00

2.6 KiB

okf type visibility status updated links
0.1 incident private active 2026-08-03
../phases/backlog.md

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:20node_name: str = "unknown" (domyślne, gdy env NODE_NAME nie 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 do piha w hosts/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.pySystemExit(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.