docs: R-168 is CLOSED — correct the stale "CI is still owed" sentence carried into the trim (R-229)
gates / gates (push) Successful in 8s

Found by the checklist's own last item (confirm your push's CI run by run ID). Corrected here and
in the three sibling repos. Ledger J2 records the two lessons: a trim is a VOLUME operation and
carries stale claims forward unless each is re-checked, and the gate cannot catch this class --
"this register item is closed" is not mechanically checkable from the instruction file.
This commit is contained in:
2026-08-06 11:03:40 +02:00
parent 9c10c5d600
commit a0b50eb48f
3 changed files with 57 additions and 1 deletions
+3 -1
View File
@@ -93,7 +93,9 @@ today that is all of them. **A missing gate script is a FAILURE, never a skip.**
**The pre-push hook** (`.githooks/pre-push`) runs it with `--fast` and refuses a failing push. It is **The pre-push hook** (`.githooks/pre-push`) runs it with `--fast` and refuses a failing push. It is
**per-clone** — switch it on once with `git config core.hooksPath .githooks`, and a manual run WARNS **per-clone** — switch it on once with `git config core.hooksPath .githooks`, and a manual run WARNS
when this clone is unarmed. `git push --no-verify` bypasses it deliberately; **say so in the session when this clone is unarmed. `git push --no-verify` bypasses it deliberately; **say so in the session
report when you use it.** Both facts are why CI is still owed (`OPEN-ITEMS.md` R-168). report when you use it** — CI re-runs the same entry point on every push and **emails the operator
on failure**, so a bypass is noticed even though it is not blocked (R-168, CLOSED 2026-08-02; CI
reports rather than refuses because there is no PR to gate — R-169).
<!-- <!--
WHY A RUNNER AND NOT FIVE INVOCATIONS (2026-08-02, R-29): a census of all thirteen gates across the WHY A RUNNER AND NOT FIVE INVOCATIONS (2026-08-02, R-29): a census of all thirteen gates across the
@@ -140,6 +140,22 @@ only the six Google auth stubs. Per §5 that means **write nothing**. The Go cod
either: one direct dependency in `felhom-agent`, and the hub and controller are stdlib-only by either: one direct dependency in `felhom-agent`, and the hub and controller are stdlib-only by
standing rule. standing rule.
## 12b. A stale claim the checklist caught — corrected in all four repos
Confirming this session's own push by run ID (checklist's last item) surfaced that **four instruction
files claimed CI was still owed** (R-168) — and **R-168 was CLOSED on 2026-08-02**. CI exists, runs
`repo_gates.py --fast` on every push, and emails on failure; this session's commits produced runs
117 (`success`) and 118.
One of the four was `felhom.eu/CLAUDE.md`, where **this session carried the stale sentence forward
through the trim**. `felhom-agent/CLAUDE.md` **contradicted itself** — its release section already
said R-168 mails the failure. Corrected in all four, pushed.
**Two lessons about this task, not about CI:** a trim is a *volume* operation and carries stale
content forward unless each claim is re-checked; and the gate cannot catch this class — "this
register item is closed" is not mechanically checkable from the instruction file. The thing that
caught it was the checklist item demanding a **run ID** rather than a memory.
## 13. Registers ## 13. Registers
- **R-229** re-scoped — legs (a) and (c) **CLOSED**; (b) remains; (d) moved to R-230. - **R-229** re-scoped — legs (a) and (c) **CLOSED**; (b) remains; (d) moved to R-230.
@@ -226,6 +226,44 @@ upstream images are the only plausible consumer, and there `docker inspect` stil
--- ---
## J2. A stale claim found by the checklist's own last item — corrected in all four repos
The end-of-session checklist says **"confirm your own last push's CI run went green, by run ID."**
Doing that surfaced a contradiction in the file that had just been trimmed.
Four instruction files asserted that continuous integration **was still owed** (`OPEN-ITEMS.md`
R-168). **R-168 was CLOSED on 2026-08-02**: `.gitea/workflows/gates.yml` re-runs each repo's gate
entry point on every push and emails the operator on failure via Resend. This session's own commits
produced runs 117 (`success`) and 118 against the real SHAs.
| File | Status |
|---|---|
| `felhom.eu/CLAUDE.md` | **carried forward into the trim by this session** — corrected |
| `felhom-controller/.claude/rules/gates.md` | from part 1 — corrected |
| `felhom-agent/CLAUDE.md` | from part 1 — corrected |
| `app-catalog-felhom.eu/CLAUDE.md` | older wording, same claim — corrected |
**`felhom-agent/CLAUDE.md` contradicted itself.** Its release section already said *"R-168 sends that
failure by mail"* while its gates section said CI was still owed — a contradiction **inside a single
instruction file**, which is exactly the class the whole R-229 effort exists to find, sitting in a
file part 1 had already gone through.
Two lessons, both about this task rather than about CI:
1. **A trim carries stale claims forward unless each is re-checked.** Compressing 227 lines to 115 is
a *volume* operation; it does not validate content. This sentence survived because it read as
settled — the same reason the nine invariant comments in the project's own case table survived.
2. **The gate cannot catch this class.** It checks length, version literals, expired TEMPORARY blocks,
rule scoping and copy identity. "This register item is closed" is not mechanically checkable from
the instruction file alone. The checklist item that *did* catch it is a human PULL check, and it
only worked because it demands a **run ID**, not a memory.
No new register row: found, fixed, and pushed in the same session. `REPORT.md` was deliberately **not**
overwritten in the three sibling repos — a one-line docs correction must not destroy the record of
their last real implementation.
---
## K. Observations — noticed, not acted on ## K. Observations — noticed, not acted on
1. **`target-selection.md` t740 error** — still present, carried from part 1 §L.1. 1. **`target-selection.md` t740 error** — still present, carried from part 1 §L.1.