docs(architecture): Etap 0 changes appendix in recon; telegram-frontend pattern in legacy doc

RECON appendix summarizes the whole etap-0 cleanup (topology dormant status,
hosts reconciliation, dead-code removal, legacy decision), carries the
runbook line for the stale chelsty pending action
(rm /opt/homelab/actions/pending/redeploy-chelsty-infra-ha-diag-agent.json —
verified the only chelsty-targeted pending file 2026-07-30), and lists
discrepancies found but out of scope: lustro watchtower, stale solaria/chelsty
world-state keys, piha naming-drift duplicate keys, gokapi still down with a
stuck pending redeploy, outline/joplin/umami still lacking services/ dirs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
oskar 2026-07-30 15:36:29 +02:00
parent 89454ea7e1
commit 615b6ab2a8
2 changed files with 91 additions and 1 deletions

View file

@ -549,3 +549,91 @@ Decisions a human must make; no recommendations attached.
accepted policy and which are defects, and whether "event emitted but accepted policy and which are defects, and whether "event emitted but
unroutable" should be visible anywhere. At stake: the difference between unroutable" should be visible anywhere. At stake: the difference between
"monitored" and "logged". "monitored" and "logged".
---
## Etap 0 changes (2026-07-28)
Repo-only truth cleanup driven by this recon (commits 2026-07-28 → 2026-07-30,
branch `task/porzadki-topologia` plus earlier etap-0 commits already on master).
No runtime state was touched.
**Topology / nodes**
- `inventory/topology.yaml`: chelsty-infra and chelsty-ha marked
`status: dormant` (site hardware down since ~2026-06-01, pending physical
revival — F20.12 / open question 6); per-node service enumerations removed —
`hosts/<node>/services.yaml` is authoritative (F20.1-2); `deployment.mode`
corrected to `push` (F20.10); lustro added as a full monitored node with its
duty cycle documented (nightly ~23:30 power-off, one liveness cycle per day —
same pattern as solaria, F20.11).
- Supervisor reads `status: dormant` from `inventory/topology.yaml`
(`_load_dormant_nodes`) and skips desired-state loading, disk-cleanup and
node-alert generation for dormant nodes — replacing the hardcoded
chelsty-name checks (topology is readable from the supervisor's runtime
context, so no env-var fallback was needed).
**hosts/ reconciliation (B6/F20)**
- `hosts/solaria/services.yaml`: added stability-agent, node_exporter, and
planner-agent (`monitor: false`, legacy ai-cluster family, retirement
candidate).
- `hosts/vps/services.yaml`: added stability-agent, npm, outline,
joplin-server, umami (all verified healthy in world state 2026-07-30);
humanai-mailer / humanai-landing added as `unmanaged: true` +
`monitor: false` (hand-run, no compose labels); ai-cluster deliberately gets
NO entry — comment block points at `ai-cluster-LEGACY.md`.
- `hosts/piha/services.yaml`: single comment block enumerating the ~28 known
unmanaged containers (B5) — bringing them in is a later stage (open
question 5).
- `hosts/saturn/services.yaml`: created with an explicit empty service list
(dev workstation / orchestrator, nothing monitored — F20.4).
- `hosts/lustro/services.yaml`: added node-exporter and piper-tts (verified
running); watchtower noted as deliberately unmanaged.
- `services/stability-agent/service.yaml`: `owner_node: chelsty`
`per-host` (B7/F20.5).
- `services/mosquitto/service.yaml`: marked NOT DEPLOYED / legacy manifest —
matches nothing that runs (C8/F20.6); kept for reference pending open
question 7.
**Dead code**
- `scripts/deploy/deploy-role.sh` deleted (referenced nonexistent `roles/`,
B7).
- Supervisor: `mqtt_unreachable` removed from `CONTAINER_RESTART_TRIGGERS`
(dead branch — the observer never creates incidents with that trigger_type,
D15).
**Legacy**
- `docs/architecture/ai-cluster-LEGACY.md`: ai-cluster is retired in place,
not migrated (bus idle since 2026-06-09, C9); branch `task/ai-cluster-solaria`
stays unmerged as documentation; surviving patterns listed; runtime
retirement runbook (stop stack on vps, observe `free -m`, remove containers)
to be executed in a separate supervised session.
**Runbook — stale chelsty action (from 1c, do in a runtime session)**
- On vps: `rm /opt/homelab/actions/pending/redeploy-chelsty-infra-ha-diag-agent.json`
— the only chelsty-targeted pending action as of 2026-07-30 (verified via
`grep -l chelsty /opt/homelab/actions/pending/*.json`).
**Discrepancies found during this pass, NOT covered by etap 0**
- lustro also runs `watchtower` (auto-updater) — undocumented anywhere;
whether unattended container updates on a monitored node are policy needs a
decision.
- World state carries stale solaria keys (`solaria/executor`,
`solaria/operator-ui`, `solaria/kb-postgres`, `solaria/paperless-worker`) for
containers that do not run there (B5 counted 5) — world state never prunes
departed services; same mechanism keeps all `chelsty-infra/*` keys alive.
- piha world state holds duplicate keys from naming drift
(`piha/node-exporter` vs `piha/node_exporter`, `immich-server` vs
`immich_server`, generic `app`/`db`/`database`/`broker` keys) — event-source
naming is not normalized.
- `gokapi` remains desired-but-down with its `redeploy` action stuck in
`pending` (F20.3); the wider undrained queue (18 pending actions) is open
question 4 — untouched here.
- `outline`, `joplin`, `umami` run on vps with no `services/<name>` dir on
master — their hosts entries added in etap 0 document this; actual GitOps
cutover (compose in repo) is still pending (F20.2).

View file

@ -32,7 +32,9 @@ z ai-clustra **wzorce projektowe**:
- allowlisty kształtu komend przed wykonaniem czegokolwiek na hoście — z lekcją - allowlisty kształtu komend przed wykonaniem czegokolwiek na hoście — z lekcją
z reconu (A2): allowlist musi być **egzekwowana i celowana** (martwa stała z reconu (A2): allowlist musi być **egzekwowana i celowana** (martwa stała
`SERVICE_NAMES` + substring-match po `docker ps` to antywzorzec), `SERVICE_NAMES` + substring-match po `docker ps` to antywzorzec),
- tryb preview/diagnose przed wykonaniem. - tryb preview/diagnose przed wykonaniem,
- frontend telegramowy jako kanał operatorski (wzorzec żyje dalej w
agent-system/telegram-bot na piha — ten zostaje).
Kod ai-clustra **nie jest** przenoszony. Kod ai-clustra **nie jest** przenoszony.