Record the guards, the narrowing, and the two things I could not do
gates / gates (push) Successful in 30s

R-273's owed guards are both built and closed. R-291 records what CI stopped
covering and why, so it can be widened deliberately rather than discovered.
R-292 is new and was found by a test failing for the wrong reason:
artifact_sha_invalid conflates "version missing", "registry unreachable" and
"bad sha" into one message. v0.102.0 works around it by ORDERING -- the probes
run first, so an unreachable registry is reported as unreachable -- but the
message itself is untouched.

CONTEXT gains the rule this session is about: a check and the policy it enforces
must read the same number from the same place, or they drift and the drift looks
like a defect in something else. Two corollaries, both of which cost something:
a bounded check must print what it stopped covering on every run, and an
unreadable policy is INCONCLUSIVE rather than unbounded.

Stated in the report rather than glossed: Part 4 (finding receipts for the twelve
downgraded claims) was NOT done and is a shortfall, not a decision -- splitting
it would have produced exactly the half-checked green the exercise exists to
prevent. Part 5 was droppable and dropped. The tag-push green is not re-proved
tonight and is not claimed; the evidence offered is runs 190 and 216.
This commit is contained in:
2026-08-09 19:28:45 +02:00
parent 36bcd12543
commit 985f0ba63c
4 changed files with 184 additions and 167 deletions
+22
View File
@@ -15,6 +15,28 @@
> would make one of the two audiences stop reading. `STATUS.md` is also a **view of `OPEN-ITEMS.md`**
> and holds nothing of its own; this file does hold its own content, namely the standing rulings below.
## A check and the policy it enforces must read the same number from the same place
**Earned 2026-08-09.** The container registry retains N versions per package; `check-published-versions.py`
demanded that **every** git tag still be downloadable. Both rules are individually sensible and together
they are impossible. Nothing connected them, so the day the (N+1)th agent was published the oldest was
evicted and CI went red **at a commit whose own run had been green the day before** — on a true finding
nobody could act on, and one that would have returned at the very next publish.
**The drift looks like a defect in something else.** It was filed as CI being "sensitive to tag refs",
which it is not; two earlier tag pushes had passed, and the gate reads its version list from an API that
does not know what ref is checked out. A whole session went into the wrong explanation before the two
numbers were even compared.
So: **one file owns the number, and every consumer reads it from there** — today
`felhom-agent/scripts/retention-policy.json`, read by the check and referenced by the prune procedure.
Two corollaries, both of which cost something to learn:
- **A bounded check must print what it stopped covering, every run.** A narrowing that goes quiet becomes
permanent by accident.
- **An unreadable policy is INCONCLUSIVE, never "unbounded".** A check that silently loses its bound is
worse than one that fails.
## Standing rulings
**S-39 — "WE DO NOT KNOW" IS NEVER DRAWN AS "FINE", AND THE CODEBASE HAS ONE WAY OF SAYING IT