Development record
a lint-and-test-green write path can still be broken; nothing requires running the built binary
a lint-and-test-green write path can still be broken; nothing requires running the built binary
The definition of done asks for make preflight, gofmt, and a test watched
fail then pass. A change to the issue-ledger write path on 2026-08-23 satisfied
every one of them and still broke the verb.
What happened
Redaction was added to abcd capture so free text could not carry a home path
into a committed record (iss-2608231025198888). It redacted the RENDERED record,
which treats the structural frontmatter as free text. The CLI derives the slug
from the issue text, so a home path in the body reached the slug, redaction
rewrote it to a bracketed placeholder, and the kebab-case validator then refused
the whole capture:
abcd: redaction produced an invalid record: malformed frontmatter:
slug "the-path-entry-is-users-[redacted-user]-local-bin-abcd-and-it-moved"
is not kebab-case
The verb was unusable for exactly the inputs the change existed to handle. It reached main and the installed binary.
Why every gate passed
The unit tests constructed a CaptureRequest by hand and passed a written-out
Slug. Production does not: the CLI derives the slug from the issue text. So
the tests exercised a caller that does not exist, and the caller that does was
never covered. make preflight was green, gofmt was clean, and both tests had
been watched fail before the change and pass after — the discipline was followed
exactly and caught nothing.
It surfaced only by building the binary and running one real capture.
The shape, again
A check measuring the right property over a subject set that excludes the real case. That is the same shape as iss-2608230847432286 and iss-2608230957104179, and this instance sits inside the fix for one of them, which is the strongest evidence in the ledger that the shape is not obvious to the person committing it.
What this is not
Not an argument for more process on every change. The floor in adversarial-review-scales-with-blast-radius is right, and this must not become a mandatory review stage on ordinary work. The claim is narrower: for a change to a user-invocable path that WRITES, the built binary is the only artefact that answers the question the gates are being asked to answer, and running it once costs seconds.
Honest limit
n=1, and the author of the record is the author of the defect. A single instance argues for a documented step, not for tooling. Per recurrence-is-signal, a second occurrence is what would justify more.
Grounds
Frontmatter
| id | iss-2608231120121681 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | major |
.abcd/work/issues/resolved/iss-2608231120121681-a-lint-and-test-green-write-path-can.md
open on GitHub ↗ · commit history ↗
mentions4
- dcn-26092300000000012026-09-23 — The product thinker ruled on the owed items of the autonomous run of 2026-09-23 in one interview, one question at a time (07:51Z to 09:32Z, while the run was paused): two release blockers, two intents, the 35 major captures routed to the product thinker, and two older owed rulings. The release waits for two things: version-stamped plugin payloads (iss-2609230733497536, built by a run lane, with no criterion amended and no deferral) and a release press release composed at the cut from the shipped intents' press releases, which is a new capability and gets an intent and its planning interview before any lane builds it. The run may approve the release environment itself once every gate is green; that agenda line is written in the release commit, not here. itd-4's AC3 is built as written, the `--issue-drift` check and the rename of the back-links to `related_issues` / `related_intents` together, and spc-6 closes only when both land (the 2026-07-17 ruling stands). itd-43's third criterion is moot and dropped, so spc-8 closes. The guard contract is extended to read a host-supplied per-call working directory (iss-2609212142557657, option A), after a probe of what the host does when none is supplied. Four majors are ruled to a build (iss-2608231120121681 write-path smoke, iss-2608290810036869 preflight before the push connects, iss-2609090828371674 per-agent staging locks, iss-2609120505141653 the provenance comment) and do not hold the tag. The rulings that set a rule each have their own entry below; every other routed major is deferred past v0.9.0 with its ruling as the `deferral_reason`, and the 168 routed minor and nitpick captures take the run's default deferral. The product thinker also asked that the interview be kept as autonomous-run experiment data, towards making a run transparent to the person it serves; the observations feed the run's end-of-run research note. Rejected, as the frame: the run taking any of these rulings itself.
- iss-2608230847432286a gate that validates a proxy for a claim switches off the vigilance an absent gate would have preserved
- iss-2608230957104179the scan-before-mutating rule enumerates four git operations and misses shared artefacts outside git
- iss-2608231025198888abcd capture writes to the ledger without running the redaction scanner