Development record
The record verbs are sound; the failures were all at the edges, where the tool knows something and does not say it.
The record verbs are sound; the failures were all at the edges, where the tool knows something and does not say it.
This is the synthesis a session reached after a day of autonomous work in a managed repository, and it is recorded as its own claim rather than as a note on any one finding, because it is a claim about WHERE abcd fails rather than a list of failures.
The centre held. The record store, the folder-as-status model, and the verbs that move records between states all worked, including under 27 parallel branches from separate worktrees, and the ledger's one-file-per-record shape produced no merge conflict in the entire run. Nothing found in that run argues against the core design.
What failed was a repeatable shape at the boundary. In each instance abcd possesses the exact information the operator needs, at the exact moment it refuses, and emits a refusal without it:
- the accepted values it is validating against, when it rejects a
--categoryor a--source(it holds the enum; the error names only the offending value); - the closing commit it had in hand at
spec close, when the fidelity-review request it later emits asks the host to supply the delivered range (it had the commit at mint time and did not write it on the receipt); - the include file it is looking for, when
launch --dry-runrefuses (it names the path but not the condition, not how to create one, and not that this repo may not need one at all).
Others found in the same run fit the shape: the id that appears in a default-branch commit message while its record stays open; the record it just wrote that is untracked; the sibling lint it does not run and does not mention; the dangling symlink whose target it already read.
The claim is testable, which is what makes it worth a record. If it holds, the class has one remedy rather than many: at every refusal, emit what the tool already knows about the thing it is refusing — the legal set, the value it had, the condition it is checking. That is cheaper than the individual fixes and it closes the ones nobody has hit yet.
The individual findings from this run are its evidence. It should be graded, and either promoted to a principle or falsified by the next run's findings landing somewhere other than the edges.
Evidence from the same run, by record. The three instances cited above:
iss-2608290810037524 (the accepted enum values, corroborated twice in this run),
iss-2609100506265392 (the delivered range the receipt could have carried from
spec close), iss-2608270559313719 (the include file launch --dry-run names
without naming the condition, corroborated twice in this run). The others that
fit the shape: iss-2609100507421759 (an open id cited in a default-branch
commit), iss-2609100508570527 (the record it just wrote is untracked),
iss-2609100508566033 (the sibling capability it never names),
iss-2609100506256636 (the dangling symlink whose target it already read),
iss-2609100505140261 (the provenance hashes one half of a verb requires and the
other half never emits), iss-2609100505142469 (the redaction it performed and
reports only as a count). The positive control is iss-2609100508570803: the
centre, exercised hardest, produced one wording defect and no failures.
Grounds
- pursued: the failures of the record verbs sit at their refusals, where the tool withholds what it knows; it would be shown wrong by the next run's findings landing somewhere other than the edges
Frontmatter
| id | iss-2609100509531349 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | major |
.abcd/work/issues/resolved/iss-2609100509531349-the-record-verbs-are-sound-the-failures.md
open on GitHub ↗ · commit history ↗
mentions12
- at-every-refusal-emit-what-the-tool-knowsAt every refusal, emit what the tool knows
- dcn-26092300000000122026-09-23 — "At every refusal, emit what the tool knows" is a principle (product thinker, ruling on iss-2609100509531349, grading the claim that record from the 2026-09-09/10 field run made): a refusal names the allowed values, the value it had, and the condition it checked. It lives at principles/at-every-refusal-emit-what-the-tool-knows.md. Five open records are breaches of it (iss-2608290810037524, iss-2609100506265392, iss-2608270559313719, iss-2609100508570527, iss-2609100508566033), and the record that proposed it is resolved by the promotion.
- iss-2608270559313719abcd launch --dry-run (and ship) in a NON-plugin-payload repo dies with a raw 'include config not found: .abcd/config/launch-payload.json' (LoadIncludes preflight in internal/core/launch/includes.go), giving the operator no idea WHY. launch preview/ship is a plugin-payload-repo feature (it needs launch-payload.json, and ship additionally needs .claude-plugin/plugin.json); a repo that ships no plugin bundle legitimately has neither and should be told so, not handed a missing-file error. Fix (loud-staging/legibility): when the launch config is absent AND the repo is not a plugin-payload repo, the dry-run should explain 'launch preview/ship applies to plugin-payload repos; this repo's release path is launch scaffold + the CHANGELOG roll + auto-release' rather than reporting a raw missing include config. Surfaced from a Testimony (non-plugin repo) onboarding session.
- iss-2608290810037524The capture verb refuses an unrecognised source value with a message that names neither the offending flag nor the accepted set, and blames the wrong layer: an invalid source produces a malformed-frontmatter error quoting the value, when the value came from a command-line flag and never reached any frontmatter the caller wrote. The accepted values are discoverable only by grepping existing records. The flag's help text lists no enumeration either. The same shape likely applies to category and to any other closed-set flag on this path. A closed set should be named in the refusal and in the help text.
- iss-2609100505140261`abcd intent audit <itd-N>` emits a fidelity-review request that carries no `policy.rubric_hash` and no `policy.prompt_hash`, but `abcd intent audit ingest` rejects a verdict whose `policy` hashes are empty. The two halves of the same verb disagree, and the gap lands on whoever writes the verdict.
- iss-2609100505142469The capture redactor rewrites the leading component of a reverse-DNS identifier when it happens to equal the local account name, silently corrupting technical content in a permanent record. This refines iss-2609061504302157, which reports the same root cause on an ordinary dictionary word; the dotted-identifier class is broader, and its damage is unrecoverable rather than merely noisy.
- iss-2609100506256636abcd's own test suite leaves a dangling symlink on PATH, and `ahoy install` then refuses to complete for ever, with no supported way to clear it.
- iss-2609100506265392The fidelity-review request names its delivered side as "the diff/commit range that realised spc-N (host supplies the range)", and there is no mechanism by which the host can supply it.
- iss-2609100507421759Nothing tells you an open issue is already fixed. The ledger goes stale silently, and the cost of finding out lands on whoever plans the next piece of work.
- iss-2609100508566033abcd does not name its own adjacent capabilities, so a verb that exactly answers the operator's need is found by accident or not at all. Three instances in one run, from two independent sessions.
- iss-2609100508570527`abcd capture` writes the record file and never says the record is not in git, so a ledger entry can be invisible to every branch and every gate that reads the committed tree.
- iss-2609100508570803Positive finding, recorded as evidence rather than as a defect: every record verb the run reached worked correctly from a git worktree, throughout a day of heavy parallel use.