homelab-codex-ws/docs
oskar 5f1528e4ab feat(observer): 3-state node liveness (fresh/stale/dead) + transitions + read-time net
Fixes the "dead node shown NOMINAL" silent outage: node status was set only by
events and never expired, so a node that crashed/lost connectivity stayed
"online" forever (chelsty-infra was online for 16d, piha ~6d). The only thing
that flipped status to offline was a node_offline event, which an unreachable
node can never emit.

Now node status is derived from freshness (now - last_seen), recomputed every
observer cycle (incl. cycles with no new events):
  - always-on: fresh <=180s, stale 180-600s, dead >600s (3x the 60s heartbeat)
  - remote/LTE (chelsty-*): fresh <=900s, stale 900-3600s, dead >3600s

Thresholds + tier logic live in ONE shared helper, services/control-plane/src/
liveness.py, imported by the observer and both operator UIs (bind-mounted into
the agent-system webui image). No 3x copy.

Transitions are not silent: the observer emits node_stale / node_offline /
node_online (recovery) events tagged source=observer (skipped on re-ingest so
they never reset last_seen), routed by the supervisor to alert_only actions.

Read-time safety net: both UIs recompute liveness from last_seen at request
time, so a stalled observer still surfaces dead nodes. Services inherit their
node's liveness (cascade, variant B) without mutating services.json.

Replaces the earlier binary NODE_OFFLINE_TTL_SECS flip.

Tests: liveness unit tests, observer 3-state + transitions/recovery/baseline +
self-event skip, operator_ui read-time net + cascade, supervisor node-event
routing. 89 passed. docker compose config valid for both stacks.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 20:07:25 +02:00
..
sessions docs: session 2026-06-11 20:35 2026-06-11 20:35:23 +02:00
access.md Document current homelab state 2026-04-15 17:37:25 +02:00
agents.md docs: uzupelnij dokumentacje pod katem agentow AI 2026-05-20 12:06:23 +02:00
backlog.md docs: session 2026-06-11 — lustro ssh shipping fix + ha-diag-agent piha + backlog/flota-bomba 2026-06-11 14:18:00 +02:00
capabilities.md docs: uzupelnij dokumentacje pod katem agentow AI 2026-05-20 12:06:23 +02:00
chelsty-runtime.md docs: session summary 2026-05-27 + update observer/control-plane/chelsty docs 2026-05-27 16:18:31 +02:00
chelsty-stability-agent.md docs(chelsty): update docs and topology for site/node split 2026-05-20 14:23:57 +02:00
core-stack.md Document current homelab state 2026-04-15 17:37:25 +02:00
deployment.md Harden deployment runtime framework 2026-05-11 21:20:13 +02:00
event-system.md Implement filesystem-first runtime event system 2026-05-12 13:38:25 +02:00
hardware.md Document current homelab state 2026-04-15 17:37:25 +02:00
hetzner-vps.md Document VPS connectivity diagnostics 2026-04-15 20:38:09 +02:00
joplin-server.md Document VPS connectivity diagnostics 2026-04-15 20:38:09 +02:00
lifecycle.md Harden deployment runtime framework 2026-05-11 21:20:13 +02:00
networking.md Document current homelab state 2026-04-15 17:37:25 +02:00
node-onboarding.md Implement reproducible node onboarding 2026-05-12 13:18:00 +02:00
observer-runtime.md feat(observer): 3-state node liveness (fresh/stale/dead) + transitions + read-time net 2026-06-17 20:07:25 +02:00
questions.md Document Hetzner VPS handoff 2026-04-15 17:46:42 +02:00
service-model.md Add node capability model 2026-05-11 20:46:50 +02:00
services.md Document Hetzner VPS handoff 2026-04-15 17:46:42 +02:00
stability-agent-rollout.md Fix stability agent fleet deploy scripts 2026-05-17 21:09:06 +02:00
standards.md docs: uzupelnij dokumentacje pod katem agentow AI 2026-05-20 12:06:23 +02:00
topology.md Add CHELSTY home automation inventory model 2026-05-11 20:54:54 +02:00
vps-control-plane.md docs: session summary 2026-05-27 + update observer/control-plane/chelsty docs 2026-05-27 16:18:31 +02:00