062a7027ab
gates / gates (push) Successful in 8s
Surgical corrections only; the file is deliberately NOT restructured (deferred). Deleted the expired TEMPORARY block. It read "felhom-pve is at a remote site (until ~2026-08-02) ... Delete this block on return" and was still being read as current fact on 2026-08-06, four days past its own deadline, while felhom-controller/CLAUDE.md asserted the opposite. The location-independence fact worth keeping (localapi binds 169.254.253.1:8443 on vmbr9 since the R-50 island migration) moved to an HTML comment. Every component version literal is gone from effective text, including the --version reading and the go.mod Go directive. Versions change several times a day; ask the hub's /hosts + /configs or the box. The drill-VM claim and the host addresses now point at documentation/operations/nodes.md, which already stated both correctly. This file's drill-VM claim was the correct one -- confirmed by qm list on demo-hp. The R-115/R-188/R-186 release narratives moved to an HTML comment and to the felhom-build-deploy skill; the directives stayed (never hand-roll the build; the build -> tag -> publish -> push order; reproducible -trimpath -buildvcs=false). The health-check block-I/O rule became .claude/rules/health-checks.md, scoped to the five packages where health checks are written. It had been duplicated from felhom.eu/CLAUDE.md with a note explaining that that file does not load in an agent-only session -- correct reasoning, made obsolete by path-scoped rules. agent_gates.py registers the shared instructions gate. Docs only -- no Go, no version bump, nothing built or deployed. Ledger: felhom.eu/documentation/audits/LEDGER-instruction-trim-2026-08-06.md Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JJc8sAGRWmavP3rMtdpkr2
27 lines
1.3 KiB
Markdown
27 lines
1.3 KiB
Markdown
---
|
|
paths: ["internal/capability/**", "internal/storage/**", "internal/localapi/**", "internal/hub/**", "internal/guesthook/**"]
|
|
---
|
|
|
|
# A health check issues no block I/O
|
|
|
|
No `statfs`, no `getdents`, no read, write or `fsync` — **not even behind a timeout**.
|
|
|
|
A probe that touches a wedged device enters uninterruptible sleep, survives `SIGKILL`, and cannot be
|
|
recovered until the device returns or the host reboots — so `systemctl restart` hangs too. A timeout
|
|
protects the caller's control flow and nothing else: the blocked thread remains.
|
|
|
|
**Liveness is decided from `/proc` and the kernel's own state**, never by reading or writing the
|
|
filesystem.
|
|
|
|
<!--
|
|
Measured, R-117 spike §6.3 (felhom.eu/documentation/audits/SPIKE-r117-bind-liveness-2026-07-30.md):
|
|
a probe stayed in D state 3m50s after kill -9; a buffered write with no fsync blocked too (O_CREAT
|
|
needs journal access); and statfs/getdents returned HEALTHY on a namespace that EIOs every byte —
|
|
fast, and wrong.
|
|
|
|
This rule used to be duplicated verbatim in felhom-agent/CLAUDE.md with a note explaining that
|
|
felhom.eu/CLAUDE.md "does not load in an agent-only session". That reasoning was correct before
|
|
path-scoped rules existed. The single source is now felhom.eu/CLAUDE.md "Code quality rules"; this
|
|
file is the scoped copy that loads exactly where health checks are written. (2026-08-06)
|
|
-->
|