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>
49 lines
2.6 KiB
Markdown
49 lines
2.6 KiB
Markdown
---
|
|
okf: "0.1"
|
|
type: incident
|
|
visibility: private
|
|
status: active
|
|
updated: 2026-08-03
|
|
links:
|
|
- ../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:20` → `node_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.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.
|
|
|