diff --git a/CHANGELOG.md b/CHANGELOG.md index a87dcfc..60d2a46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,30 @@ +## the decoy sweep — can this gate be fooled by a label? (2026-09-01, R-421) — NOT A RELEASE + +**No product code, no version bump, no image, no golden.** A scripts change is not a release. + +Four times in one week a gate turned out to match a NAME instead of the thing it named — R-410 (a +`mkdir` turned the release gate green), R-400 (seven debug controls answering nothing), R-378 (a +status word inside a sentence), R-419 (a phrase inside prose, including prose saying the marker was +absent). **All four found by accident.** The gates enforce everything else here and were the one part +nothing had checked. + +**All 29 gate scripts read and decoyed. 16 were fooled.** 10 fixed here, 4 left with rows +(R-422..R-425), 6 could not be given a plausible decoy and are named (R-426 group d). + +**The largest single cause was mundane:** eight gates set their SCOPE with `os.listdir` (one level). +Green and correct today; blind the moment anyone adds `templates/partials/`. `mojibake` and +`docker-v` already used `os.walk`, caught the identical planted file, and are the control that +proves the cause was the listing rather than the decoy. + +Full survey table, and the five decoys withdrawn as illegitimate (mine, named): +`documentation/audits/AUDIT-gate-decoys-2026-09-01.md`. + +**In this repo:** no gate changed, and that is the result. `release-complete` was decoyed and is +SOUND — the sweep's attempt (a non-version heading on top of `CHANGELOG.md`) was WITHDRAWN as +illegitimate, because `HEAD_RE.search` scans the whole file and still names `v0.130.0`. The three +shared gates are covered from `felhom.eu`; the remaining two are named in the decoy-coverage +exemption list (R-426) as UNTESTED, not as sound. + ## v0.130.0 — the agent was the one leaking connections onto the off-site box (2026-08-20, R-344) > **RELEASED 2026-08-20**, on the operator's word, after the fix was proved on both boxes. diff --git a/CLAUDE.md b/CLAUDE.md index dbff38c..742f90d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -101,3 +101,11 @@ the mechanism are exempt. - **Confirm your own last push's CI run went green, by run ID** — CI mails on failure, which is a PUSH signal; this is the PULL check that catches a lost or unread mail. An unchecked green is an assumption, not an observation. + +**A gate ships with a decoy test that has been seen to fail (R-421).** A decoy is the LABEL without +the FACT — a directory with the right name and no bake log, a note whose prose mentions the marker it +lacks. `scripts/decoy_coverage_gate.py` refuses a new gate that has neither a decoy nor a named +exemption carrying its row. The four shapes, the 2026-09-01 sweep that fooled 16 of 29 gates, and the +decoys withdrawn as illegitimate: `documentation/audits/AUDIT-gate-decoys-2026-09-01.md` and +`felhom-controller/.claude/rules/gates.md`. **Scope is a fact too** — prefer `os.walk` over +`os.listdir`, and a glob over a hand-maintained list.