Development record
The reasoning behind what was pursued no longer evaporates at the gate — readiness and triage record grounds for the conjecture, not only the decision
Press Release
abcd records why a thing was pursued, at the moment it is pursued. Grounds were recorded for deliberate non-action only — a wontfix carries a note, an ADR carries its alternatives — while the reasoning behind what went forward evaporated at the gate. Now the readiness gate and capture's triage routes take a grounds argument with a small vocabulary —
pursued,deferred,declined— and the grounds name the conjecture being acted on, not merely the route taken. A triage without grounds is refused.
What's In Scope
- A grounds argument on
intent readyand on the capture triage routes (promote / resolve / wontfix), refusal on absence. - The three-value vocabulary, with the grounds text free-form and naming the conjecture.
What's Out of Scope
- Rewriting the ADR family's grounds — decision-granularity grounds stay where they are; this intent adds the finer grain beside them.
Scope Conditions
None stated.
Acceptance Criteria
- Given a capture routed to an intent draft, when triage runs without grounds, then the command refuses.
- Given a gate decision, when it is recorded, then the grounds name the conjecture, not only the decision.
Grounds
- pursued: Pursued now because the reasoning behind what went forward is the half of the record that is never written down, and it is unrecoverable once the session ends: a wontfix keeps its note and an ADR keeps its alternatives, while every pursued conjecture leaves only its outcome. Recording it at the moment of pursuit is the only moment it is still known.
Audit Notes
Fidelity review — receipt rcp-ff0fec29d2cf (verifier abcd:intent-auditor claude-opus-5[1m]).
Provenance: abcd:intent-auditor@claude-opus-5[1m] · rubric_hash sha256:542ed2cd51ff938717a3f47b2b332e8d47910beec0ca7ecdfd238ae7edf5ced5 · prompt_hash sha256:e5e158f517453eb879ac2931f683e6490b090b603c290856dde331bbcd2bbc0b Input attestations: diff:932629f9...build/itd-179 (9bdf7d478f00dea3ce5f2d27430a09450588e06d)@sha256:2e28a1d9af6525ac95319cccdad5d6a6378179ee85a7a8a515af3287dad55b61;
Acceptance rollup: MET 0 · MET_WITH_CONCERNS 2 · NOT_MET 0 · INCONCLUSIVE 0
Per-criterion verdicts:
- ac-1 — MET_WITH_CONCERNS: I did not read this one, I ran it. Against a binary built from the branch tip in a throwaway repo:
abcd capture promote iss-2608310903083914with no --grounds exited 2, printed the usage refusal, and left.abcd/development/intents/drafts/EMPTY; the same call with--grounds "", with an out-of-vocabulary token (maybe:), and with degenerate text (pursued: pursued, refused at the 3-word floor) each exited 2 and minted nothing;capture resolvewithout --grounds exited 2 andcapture wontfixwith an empty reason exited 2. The refusal is structurally ahead of the mint — requireGrounds runs before findIssue, before the lock, and before CreateDraft — which is why the residue is zero rather than merely usually zero. The happy path then wrote- pursued: <text>to the issue's## Grounds, and a later resolve APPENDED a second bullet rather than overwriting the first, so the promote-then-resolve sequence keeps both conjectures. CONCERN, two parts, and they are named rather than waved at. (i) SCOPE NARROWER THAN THE CRITERION'S 'a capture routed to an intent draft'. There are TWO routes that mint an intent draft, and only one is governed by this flag.capture promote <rdi-N>— a dispositioned reading item — dispatches at promote.go:109 BEFORE requireGrounds is ever reached, takes no --grounds, and I confirmed it mints a draft with the flag absent (TestCapturePromoteReadingItemNeedsNoGrounds, run green). It is not ungoverned — promoteReadingItem refuses without a disposition record, and the late find fixed before merge (9bdf7d47) makes it refuse an operand it would otherwise have accepted and discarded — but the record it delegates to carriesdisposition_groundsas FREE TEXT with no vocabulary token and no substance floor (cli.go:2819), which is a second, weaker grammar under the same flag name on the same verb. So on the rdi route the criterion holds by delegation to a laxer artefact, not by the mechanism this intent shipped. (ii) OVER-REFUSAL THAT MAKES THE ROUTE UNREACHABLE — iss-2608301908270888, open and unclosed. I reproduced it verbatim:abcd capture "the loader drops rules when the < !-- abcd-review marker is stale..."is accepted with no warning, and thereafter promote, resolve AND wontfix ALL refuse that record, permanently and identically, andabcd capture --helpconfirms there is no edit, amend or reopen verb to escape with. This does not falsify ac-1 — the criterion asks for refusal WITHOUT grounds, and this refuses WITH them too — so it is a concern, not a counterexample. But it means the triage route this criterion promises can be closed forever by ordinary captured prose. The delta fix made it survivable (the refusal names the construct and the body line instead of blaming the operator's grounds text; Promote mints no orphan — I checked the drafts directory after all three refusals and found only the one legitimate draft), and the body half was deliberately left live. evidence: internal/core/capture/promote.go:116 — "g, gRedacted, gDegraded, err := requireGrounds(repoRoot, "promote", req.Grounds)" evidence: internal/core/capture/promote.go:109 — "if reReadingItemID.MatchString(req.ID) {" evidence: internal/core/capture/promote.go:303 — "if strings.TrimSpace(req.Grounds) != "" {" evidence: internal/surface/cli/cli.go:2940 — ""abcd capture " + verb + " requires --grounds \"" + grounds.UsageSpelling() + ": <text>\" "" evidence: internal/surface/cli/cli.go:2819 — "dispositionCmd.Flags().StringVar(&dispGrounds, "grounds", "", "disposition_grounds: why this answer (free text; required on every state except held)")" evidence: internal/core/capture/grounds.go:80 — "return grounds.Grounds{Token: grounds.Declined, Text: folded}, 0, deg, nil" evidence: internal/core/grounds/record.go:223 — "return "an HTML comment (< !--with no-- >)"" evidence: .abcd/work/issues/open/iss-2608301908270888-an-unclosed-comment-or-fence-in-an-issue.md:37 — "There is noedit,amendorreopenverb. The only exit is a hand edit of a" evidence: internal/surface/cli/capture_surface_test.go:954 — "const run, item = "rdg-2608300000000001", "rdi-2608300000000002"" - ac-2 — MET_WITH_CONCERNS: The recording half is delivered and I exercised it end to end:
abcd intent ready itd-2on a planned record with no grounds reported[fail] grounds: no recorded grounds — the conjecture behind pursuing itd-2 is unrecordedand exited 1;--grounds "pursued: ..."wrote the bullet into the record's## Groundssection and flipped the check to[ ok ]at exit 0; a second call APPENDED rather than replaced, so the earlier conjecture survives the later one; the closed vocabulary is enforced (maybe:refused, naming the three legal tokens); the substance floor holds on both halves and is genuinely script-aware — a 2-word/29-letter text was refused at the word floor while a Chinese-script text with no inter-word spaces at all was ACCEPTED, so scriptio continua is not punished for having one run; the migration is complete (zero## Grounds (pursued)stand-in sections remain on any spec, thirteen intents now carry the section); the record lint blocks a frontmattergrounds:key and says why; and the six user-facing spellings do render fromgrounds.UsageSpelling()/ProseList()rather than being typed. CONCERN, and it is the whole weight of this verdict: THE CRITERION'S ACTUAL OBSERVABLE IS NOT PRODUCED BY ANYTHING IN THE DELIVERED CODE. The criterion is not 'grounds are recorded' — it is that the grounds NAME THE CONJECTURE, NOT ONLY THE DECISION. I put the spec's OWN counterexample through the shipped gate:abcd intent ready itd-2 --grounds "pursued: planned it because it is next"— the exact phrase spc-57 uses to define a restatement of the decision — was accepted, written verbatim to the committed record, and reported by the gate as[ ok ] grounds: 1 recorded ground(s), most recent pursued, exit 0. Nothing anywhere refused it. The package concedes this in its own doc comment: no machine reads a sentence and knows which it is, so what ships is a FLOOR that 'claims nothing more'. The producer of the conjecture-naming property is therefore an INTERVIEW PROMPT, not a gate —Ask for the expectation and its falsifierat commands/intent.md:177 and commands/capture.md:139, both of which state outright that the floor 'cannot tell a conjecture' from a restatement. Applying itd-192: that producer DOES exist and IS wired in this phase, on both shipped surfaces, which is why this is MET_WITH_CONCERNS and not NOT_MET. But itd-192 also obliges me to name the intent that closes the gap, and I cannot: spc-57 puts semantic judgement out of scope and names NO successor, and itd-195 (filed as a stub on this branch) addresses executable claims about code behaviour, not the judging of grounds prose. So the conjecture-naming half rests on an unenforceable prose instruction with no scheduled closure. It demonstrably works when followed — itd-179's own entry names an expectation and why it is unrecoverable otherwise — but 'works when followed' is a discipline, not a gate, and this criterion was written as an outcome. evidence: internal/core/intent/ready.go:307 — "c.Detail = "no recorded grounds — the conjecture behind pursuing " + it.ID + " is unrecorded"" evidence: internal/core/intent/ready.go:323 — ""(vocabulary: " + grounds.ProseList() + ") — name the conjecture being acted on, not the route taken"" evidence: internal/core/grounds/grounds.go:22 — "property and no machine reads a sentence and knows which it is, so what lives" evidence: internal/core/grounds/grounds.go:23 — "here is a FLOOR — it refuses the degenerate cases and claims nothing more. The" evidence: commands/intent.md:177 — "Ask for the expectation and its falsifier. "Planned it because it is next"" evidence: commands/capture.md:139 — "Ask for the expectation and its falsifier. "Promoted it because it is next"" evidence: internal/core/lint/schema.go:1264 — "grounds is in frontmatter; a frontmatter scalar is SET, so a later triage route overwrites the conjecture an earlier one recorded" evidence: .abcd/development/intents/shipped/itd-179-the-reasoning-behind-what-was-pursued-no.md:50 — "- pursued: Pursued now because the reasoning behind what went forward is the half of the record that is never written down" evidence: .abcd/development/intents/disciplines/itd-192-an-acceptance-criterion-whose-producer.md:27 — "- Wired in this phase — the criterion isMET_WITH_CONCERNS, and the"
Gap audit:
- honoured:
- A grounds argument on capture's triage routes, refusing on absence — promote and resolve exit 2 and write nothing, verified by running the shipped binary, with the refusal ordered ahead of the mint so no orphan draft is left behind. evidence: internal/core/capture/promote.go:116 — "g, gRedacted, gDegraded, err := requireGrounds(repoRoot, "promote", req.Grounds)" evidence: internal/core/capture/workflow.go:265 — "g, gRedacted, gDegraded, err := requireGrounds(rr, "resolve", req.Grounds)"
- The readiness gate carries a refusing
groundscheck reported last — exit 1 with a remedy naming the flag and the vocabulary, exit 0 once an entry is recorded. Run, not read. evidence: internal/core/intent/ready.go:307 — "c.Detail = "no recorded grounds — the conjecture behind pursuing " + it.ID + " is unrecorded"" - The vocabulary is closed and held once as data; the six user-facing spellings render from the definition rather than being typed at each surface. evidence: internal/core/grounds/grounds.go:72 — "var Vocabulary = []Token{Pursued, Deferred, Declined}" evidence: internal/surface/cli/cli.go:1613 — "Use: "ready <itd-N> [--grounds \"" + grounds.UsageSpelling() + ": <conjecture>\"]""
- Recording is append-only and shared by both record halves through core/mdrecord — a promote then a resolve leaves BOTH bullets on the issue, and two
intent readycalls leave both on the intent. Verified by running the sequence. evidence: internal/core/capture/workflow.go:516 — "newContent, err = appendGrounds(verb, newContent, *g)" evidence: .abcd/development/decisions/adrs/0057-grounds-accumulate-as-an-append-only.md:13 — "# ADR-57: Grounds accumulate as an append-only section, in one shared form" - The substance floor is real and script-aware in the way promised: a 2-word text is refused at the word floor while a Chinese-script text with no inter-word breaks is accepted, so a scriptio-continua script is not refused for having one run. evidence: internal/core/grounds/grounds.go:110 — "const MinTextLetters = 20" evidence: internal/core/grounds/grounds.go:112 — "// MinTextWords is the same floor measured in LEXICAL UNITS, and it is the half"
- Wontfix records
declinedfrom the reason it already takes, needing no new required flag — the record lands with- declined: <reason>under## Grounds. Verified live. evidence: internal/core/capture/grounds.go:80 — "return grounds.Grounds{Token: grounds.Declined, Text: folded}, 0, deg, nil" - Grounds live on the intent record and the pre-tooling spec stand-in is retired: zero
## Grounds (pursued)sections remain on any spec, and thirteen intents carry the section. evidence: .abcd/development/specs/closed/spc-57-the-reasoning-behind-what-was-pursued-no.md:65 — "pre-tooling stand-in was a## Grounds (pursued)section on the spec, named as" - A frontmatter
grounds:key is blocked by the record lint and told where the value belongs, closing the overwrite path the section form replaced. evidence: internal/core/lint/schema.go:1264 — "grounds is in frontmatter; a frontmatter scalar is SET, so a later triage route overwrites the conjecture an earlier one recorded" - Plain
abcd capturedeliberately still takes no grounds, so recording a finding stays cheaper than fixing one — confirmed by capturing an issue with no flags. evidence: commands/capture.md:117 — "## Grounds: why this triage, not just which one"
- diverged:
- 'A grounds argument on the capture triage routes (promote / resolve / wontfix), refusal on absence' is delivered for the ISSUE route only. The rdi route to an intent draft dispatches before the gate, requires no grounds, and delegates to a
disposition_groundsfield that is free text with no vocabulary token and no substance floor — a second grammar under the same flag name on the same verb. The late find fixed before merge (9bdf7d47) closed the worse half of this, where the route ACCEPTED and DISCARDED an operand while exiting 0. evidence: internal/core/capture/promote.go:109 — "if reReadingItemID.MatchString(req.ID) {" evidence: internal/surface/cli/cli.go:2819 — "dispositionCmd.Flags().StringVar(&dispGrounds, "grounds", "", "disposition_grounds: why this answer (free text; required on every state except held)")" - 'The grounds name the conjecture' is delivered as a prose interview prompt plus a degeneracy floor, not as anything that can refuse a restatement of the decision. The spec's own counterexample passes the shipped gate at exit 0 and is written to the record. Disclosed in the spec and in the package doc; still a delta between the criterion's outcome and the delivered mechanism, with no successor intent named to close it. evidence: internal/core/grounds/grounds.go:23 — "here is a FLOOR — it refuses the degenerate cases and claims nothing more. The" evidence: .abcd/development/specs/closed/spc-57-the-reasoning-behind-what-was-pursued-no.md:112 — "falsifier. The spec claims the floor, not the judgement."
- NOT IN THE DECLARED DEVIATIONS. spc-57's staging paragraph reports its own cost wrongly at the state it names. It says 'measured at the branch tip, 10 of the 66 planned/ records carry an entry, 56 fail the grounds check'. Measured at the actual branch tip (build/itd-179 = 9bdf7d47): 63 planned records, 6 carrying a
## Groundssection, 57 failing. Every one of the three numbers is wrong. This is the exact failure mode iss-2608301918362294 diagnoses — a prose statement of fact about the tree cannot fail, so it cannot be maintained — recurring on a COUNT rather than on an enumeration, inside the record that files the diagnosis. evidence: .abcd/development/specs/closed/spc-57-the-reasoning-behind-what-was-pursued-no.md:129 — "corpus: measured at the branch tip, 10 of the 66planned/records carry an" evidence: .abcd/work/issues/open/iss-2608301918362294-a-prose-enumeration-of-where-a-value-is.md:41 — "**A prose enumeration of facts about the codebase cannot fail, so it cannot be" - NOT IN THE DECLARED DEVIATIONS, and it understates deviation 3 by an order of magnitude. iss-2608301747006182 says 'fourteen records that reached resolved/ before grounds existed carry none'. The measured figure across the delivered range is far larger: 95 records entered
.abcd/work/issues/resolved/AFTER the refusal commit e7a3bd5a landed on this branch, and 69 of them carry no## Groundssection at all — because they were authored directly intoresolved/with aresolution:frontmatter key rather than passing throughcapture resolve. The gate is not bypassed; it is simply never invoked. That is a wider hole than the record admits, and it means the branch that shipped the obligation is itself the largest producer of grounds-less terminal records. evidence: .abcd/work/issues/open/iss-2608301747006182-no-gate-requires-a-terminal-folder.md:18 — "A gate demanding one would be red today: the fourteen records that reached" evidence: .abcd/work/issues/resolved/iss-2608300227224016-record-stores-config-can-hide-a.md:10 — "resolution: "The nested-store-root exemption is now derived from the code-side recordStores"
- 'A grounds argument on the capture triage routes (promote / resolve / wontfix), refusal on absence' is delivered for the ISSUE route only. The rdi route to an intent draft dispatches before the gate, requires no grounds, and delegates to a
- missing:
- A record whose captured body leaves an HTML comment or code fence open is locked out of promote, resolve AND wontfix permanently, with no edit/amend/reopen verb to recover it. Reproduced live from ordinary prose with no malice:
abcd capture "...when the < !-- abcd-review marker is stale"is accepted silently, and all three triage routes then refuse that record forever. The press release promises the triage routes take grounds; for this class of record they take nothing at all. Open as CRITICAL against this intent's own surface, deliberately left live — the delta made it survivable (named construct and line, no orphan draft) and closed the frontmatter half only. evidence: .abcd/work/issues/open/iss-2608301908270888-an-unclosed-comment-or-fence-in-an-issue.md:37 — "There is noedit,amendorreopenverb. The only exit is a hand edit of a" evidence: internal/core/grounds/record.go:223 — "return "an HTML comment (< !--with no-- >)"" - Coverage the frontmatter form had and the section form does not: a malformed
grounds:VALUE was judgeable by the schema gate, but a malformed BULLET under## Groundsreads as prose, so the entry is silently absent and no gate says so. Open and unclosed. evidence: .abcd/work/issues/open/iss-2608301747001641-a-malformed-grounds-bullet-on-an-issue.md:19 — "A malformed bullet under## Groundsis prose: the reader takes what parses and" - No mechanism distinguishes a conjecture from a restatement of the decision, and none is scheduled. spc-57 puts semantic judgement out of scope and names no successor intent; itd-195, the only stub filed on this branch about unverifiable claims, addresses executable claims about code behaviour rather than the judging of grounds prose. Under itd-192 the conditional half of ac-2 has no named closure to be re-checked against at phase close.
evidence: .abcd/development/specs/closed/spc-57-the-reasoning-behind-what-was-pursued-no.md:178 — "- Any semantic judgement of whether a grounds text really names a conjecture."
evidence: .abcd/development/intents/disciplines/itd-192-an-acceptance-criterion-whose-producer.md:27 — "- Wired in this phase — the criterion is
MET_WITH_CONCERNS, and the" - The docs still spell the closed vocabulary by hand even though the behavioural copy is now derived — deliberately, and recorded. The behavioural half is genuinely closed (the six user-facing spellings render from
grounds.UsageSpelling()/ProseList()), so what is missing is the executable enumeration the record itself prescribes as the remedy and declines to apply. evidence: .abcd/work/issues/open/iss-2608301918362294-a-prose-enumeration-of-where-a-value-is.md:46 — "Remedy, deliberately NOT applied tonight: make the enumeration executable."
- A record whose captured body leaves an HTML comment or code fence open is locked out of promote, resolve AND wontfix permanently, with no edit/amend/reopen verb to recover it. Reproduced live from ordinary prose with no malice:
Frontmatter
| id | itd-179 |
|---|---|
| type | intent |
| lifecycle | shipped |
| kind | standalone |
| severity | minor |
.abcd/development/intents/shipped/itd-179-the-reasoning-behind-what-was-pursued-no.md
open on GitHub ↗ · commit history ↗
Referenced by7
- adr-57Grounds accumulate as an append-only section, in one shared formrelated
- iss-2610262034428117itd-179 says a capture triage without grounds is refused; the capture chapter says resolving records grounds only when given, their absence parked.related
- iss-2610262034431772itd-179 has intent ready refuse when grounds are absent; the intent chapter reports the readiness gate's grounds row as advisory, never withholding readiness.related
- iss-2610262041291369itd-179 refuses capture promote, resolve and wontfix without grounds; the verification matrix says resolve records grounds only when they are givenrelated
- iss-2610262042580667'declined' is a reading-item disposition state in the glossary and a capture-triage grounds value in itd-179.related
- iss-2610262045201587itd-94 has the agent run `abcd intent ready itd-93` with no other argument and read its verdict; itd-179 makes `intent ready` refuse without a grounds argumentrelated
- spc-57Grounds at conjecture granularityimplemented by
mentions49
- dcn-26083000000000122026-08-30 — itd-179 round-3: the grounds substance floor is measured in letter-runs (`MinTextWords = 3`) alongside the character count, not instead of it. Rejected: replacing the character floor, which would admit "a b c"; raising the word count further, which the corpus (shortest real entry, 32 words) does not need and which would start refusing terse honest reasoning.
- dcn-26083000000000132026-08-30 — itd-179 round-3: the double-quoted frontmatter scalar decoder's canonical home is `internal/core/frontmatter` (`Unquote`), joining `IsNull` there, rather than exporting `capture.unquote`. Rejected: lint importing capture, which is an import cycle — capture's own tests import lint.
- dcn-26083000000000142026-08-30 — itd-179 round-4: the grounds floor's unit is a WORD where the script separates words and a LETTER where it does not (`textUnits` + a named, deliberately partial `scriptioContinua` set: Han, Hiragana, Katakana, Thai, Lao, Khmer, Myanmar, Tibetan, Javanese), and `MinTextWords = 3` is unchanged. The letter test is load-bearing, not tidy: a Unicode SCRIPT table carries its script's digits, punctuation and combining marks too, so counting table members would have made twenty Thai digits — or twenty Tibetan tsheg, which are twenty dots — a twenty-unit text and reopened iss-2608301206034359 once per script. Rejected: the review-converged shape of "contains a scriptio-continua rune → skip the run count and apply the rune floor", because `supercalifragilistic 中` then clears a 20-rune floor on one word; the shipped counting refuses it at two units, though the closure is one ideograph deep (`supercalifragilistic 中中` passes, as `supercalifragilistic 中 中` already did before this change). Rejected: Hangul in the set — Korean is spaced, and counting its syllables would let two Korean words clear a three-word floor. Limit stated in the doc comment: a scriptio-continua script not named in the set still counts as one word and is still refused, and the set is where that is fixed, one script at a time.
- dcn-26083000000000152026-08-30 — itd-179 round-4: the grounds floor's character half counts LETTERS (`MinTextLetters = 20`, `isTextLetter`) and is asked AFTER the unit half. Both halves stay, as the round-3 entry above requires — what changes is the unit each is measured in and the order they are asked in. A rune count is answered by whatever occupies a rune: `a b c` plus seventeen dots cleared twenty "characters" carrying three letters of reasoning, and a text of Hangul fillers cleared the whole floor while rendering as nothing end to end. Rejected: asking the letter count first, which makes the scriptio-continua refusal unreachable — every unit that refusal speaks for is a single letter, so a text with twenty letters has twenty units and can never be below the three-unit floor, and one with fewer would be refused for its letters instead. Rejected: filtering only the zero-width format characters, which leaves the filler class open because U+115F, U+1160, U+3164 and U+FFA0 are category Lo; `unicode.Other_Default_Ignorable_Code_Point` names exactly those four letters and nothing else. Corpus: the 25 recorded grounds texts in the tree are refused by neither the old floor nor the new one.
- dcn-26083000000000162026-08-30 — itd-179 round-5: the ISSUE ledger's grounds become APPEND-ONLY, as a `## Grounds` body section mirroring the intent half, and the frontmatter `grounds:` scalar is retired (16 committed records migrated in the same change). A scalar is SET, so a resolve or wontfix silently destroyed the conjecture a promote recorded — on the ledger's mainline sequence, since fourteen resolved records carry `promoted_to` — and the result still reported success (iss-2608301657354776). Rejected: refusing a transition that would overwrite a non-empty grounds, as the record proposed; promote, resolve AND wontfix all REQUIRE grounds, so the refusal would make a promoted issue impossible to resolve. Rejected: last-write-wins declared as a chosen tradeoff, because `intent/grounds.go` already argues the opposite for the same data — the earlier conjecture is precisely what a later reader checks the outcome against. One-canonical-primitive: the record form (heading, section reader, append, readability check) moved to `core/grounds`, and the generic markdown-body machinery under it to a new leaf `core/mdrecord`, so both record families share ONE definition rather than holding two. Rejected: leaving the form in `core/intent` and having capture call it, which is one implementation but puts an issue-record body parser behind the intent package's door. The retired key is TOLERATED in `issueschema.Known`, not refused: a refusal makes capture SKIP the record, and a record invisible to every surface while it still sits in the ledger is worse than a value nothing reads — the record lint's `record_schema` blocks the misplacement and names the section instead.
- dcn-26083000000000172026-08-30 — itd-179 round-5: a RELOCATION is not a BACKFILL, and the forward-only rule forbids only the second. Moving a pre-tooling `## Grounds (pursued)` section from a spec onto its intent (commit 09f7d91a, thirteen specs) put text authored at the moment of pursuit where it belongs; nothing was reconstructed, which is the whole of what "never backfilled" refuses. Three shipped intents therefore carry a `## Grounds` section — itd-177, itd-182, itd-188 — and the surface claim now says so instead of asserting the corpus carries none (iss-2608301657357989). The enforcement is unchanged and stays maximally strict: `RecordGrounds` refuses a shipped or superseded record whatever the provenance of the text, because nothing in it can tell relocated text from invented text, so the relocated state is deliberately not reachable through `abcd intent ready --grounds`. Rejected: weakening the refusal to admit a `--relocate` escape, which would make the distinction a caller's assertion rather than a reviewable fact about a commit.
- dcn-26083000000000182026-08-30 — itd-179 round-5, correction to the round-4 letter-floor entry above: `unicode.Other_Default_Ignorable_Code_Point` does NOT "name exactly those four letters and nothing else", and the remainder is not "format characters and variation selectors". Measured over the whole code space: the table holds 3776 code points, of which exactly seven are assigned — the four Hangul filler letters (Lo) and three non-spacing marks (Mn) — and the other 3769 are unassigned; it carries zero format characters and zero variation selectors, which reach `Default_Ignorable_Code_Point` through the other contributors to that derived property. The conclusion the round-4 entry drew is unchanged and was verified exhaustively — the only LETTERS the table can exclude are those four — but the description of the rest of it was wrong, so it is corrected here rather than left to be re-derived (iss-2608301657350399).
- dcn-26083000000000192026-08-30 — itd-179 delta close: the grounds APPEND and its read-back run over the record BODY, spliced back onto the frontmatter, rather than over the whole file. `frontmatter.Split` is the one lossless answer to where the block stops and `grounds.Body` is what both halves ask, so the writer judges the bytes the reader consults and the writer/reader disagreement is unrepresentable rather than banned one spelling at a time (iss-2608301805069999). The intent half's reader moves to the same scope, where the whole-file reading would have found an empty pseudo-section. Rejected: refusing a frontmatter `# Grounds` comment, which bans the one spelling that was reported and leaves the scope split that produced it.
- dcn-26083000000000202026-08-30 — itd-179 delta close: body scope does NOT close consequence A, and the record says so. An unclosed opener in the BODY still masks the body, so an appended entry still cannot read back and every triage route still refuses — verified by a test that stayed red at the body-scope commit and only passed at the next one. What makes that survivable is the other two halves: the refusal names the opener's line and construct instead of the grounds operand, and promote dry-runs the append against the pre-flight bytes so a deterministic refusal mints nothing (iss-2608301803423101). Rejected: refusing every record carrying an unclosed opener, which would refuse writes that succeed — a `## Grounds` section ABOVE the opener takes the entry perfectly well. Rejected: a file-relative line number in the refusal, because the triage verbs append after setting their note field and the number would name a line the unwritten record on disk does not have; the number is body-relative and the opener's text is quoted beside it.
- dcn-26083000000000212026-08-30 — itd-179 delta close: `mdrecord.findBacktickRun`'s superlinear shape stays, on a measurement rather than a shrug. A line of 120 distinct-length backtick runs costs ~200us and an ordinary record line ~76ns; precomputing the runs into a slice takes the bad line to ~7us and the ordinary line to ~115ns with one allocation per line, and stepping between runs with `strings.IndexByte` takes the bad line to ~243us. Both trade the case that always happens for a case no record body has. Rejected: landing the precomputed-run version, which reads as an optimisation and is a regression on this repo's workload. The two benchmarks and the numbers live in the package so the trade is not re-litigated.
- dcn-26083000000000222026-08-30 — Correction to the itd-179 delta-close entry above, which is
- iss-2608300227224016record_schema's nested-store-root exemption is derived from every value in the record_stores config map, including keys naming no store the scanner knows, so a committed config line such as an unknown prefix pointing at .abcd/work/issues/anything hides that directory from the undeclared-bucket blocker without anything scanning it; the file's own comment says a config that could add a bucket could also hide one and that the list is code, not config. Build the nested set from the code-side recordStores looked up in the config, and refuse unknown record_stores keys at parse.
- iss-2608300930057882itd-179 ruthless findings: the plugin surface instructs the host to report a redacted member from intent ready --grounds --json that the verb never emits — the redaction note goes to stderr and the JSON is the unchanged readiness result, so the redaction-is-never-silent promise is broken on the one plane the feature is wired for (render an envelope carrying the grounds result beside the readiness result); the readiness reader admits a hand-typed entry below the writer's substance floor, so the seventh check under-enforces its own claim (skip sub-floor bullets in ParseGrounds); a successful write followed by a readiness fault exits 2 with no receipt, so a retry appends a duplicate entry; RecordGrounds enforces no bucket rule while the shipped-bucket exemption says never backfilled and the branch itself backfilled three shipped intents (refuse terminal buckets, or word the exemption honestly); missing versus malformed --grounds exit 2 versus 1 unevenly; the 36-record NOT READY consequence and the forward-only choice are recorded nowhere in the decision log.
- iss-2608301206032013a control character in --grounds passes the pre-mint gate and faults inside the locked stamp leaving an orphan draft
- iss-2608301206034359the grounds substance floor counts runes not letters so twenty zero-width spaces satisfy the promoted refusal
- iss-2608301206036067RecordGrounds is an unlocked read-modify-write so a concurrent second grounds write silently discards the first
- iss-2608301206073609hidden runes reach committed records verbatim because termsafe.EncodeHiddenRunes is not applied at the record-write boundary
- iss-2608301206074955an indented continuation under a valued frontmatter key skips the record in every reader while record_schema reports nothing
- iss-2608301212423009the comment authorising the promoted grounds refusal misstates the corpus state it rests on
- iss-2608301212423956two stated guarantees in the grounds path are mutation-vacuous: the wontfix declined-token refusal and the read-back count check
- iss-2608301212424896unescapeScalar in the schema gate is a second independent copy of capture.unquote and the parity table has no escaping row
- iss-2608301212428844itd-179 round-2 ruthless cosmetics: backticked wontfix flag usage, double-counted redaction spans, refusal message names a cause that did not occur
- iss-2608301244450106a wontfix reason-derived grounds value skips ValidateText so a control character in wontfix_reason still reaches yamlScalar
- iss-2608301244458074internal/core/frontmatter has no entry in the internal README package map
- iss-2608301301041887the lock assertion in the grounds test is wall-clock so a loaded runner could pass it with no lock held
- iss-2608301301044588the grounds word floor counts letter runs so a language written without inter-word spaces is refused and its bullet is silently dropped by the reader
- iss-2608301306580014the privacy backstop has two blind spots over the issue ledger: the escaped Windows home path yamlScalar writes and a harness_leak root that excludes the ledger
- iss-2608301306587401Link and Plan do unlocked read-modify-writes on records RecordGrounds now locks
- iss-2608301423540137the orchestrator committed record bodies to three build branches without running the record and site gates, turning site-render red on two of them
- iss-2608301620341037spc-57's Tests section lists none of the grounds floor tests added in rounds three to five
- iss-2608301657350399five nits from the round five ruthless review including a weak negative assertion in the control refusal test
- iss-2608301747001641a malformed grounds bullet on an issue record reads as prose so no gate can review it losing coverage the frontmatter rule had
- iss-2608301747006182no gate requires a terminal folder record to carry a grounds entry so fourteen resolved records have none
- iss-2608301803423101an unclosed comment or fence anywhere in an issue record blinds every grounds triage route permanently and promote orphans a draft per attempt
- iss-2608301803425790five nits from the itd-179 delta review including two exported functions with no caller and a renamed citation that now names the wrong predicate
- iss-2608301803426383three doc comments outlived the tests and the rule they describe and one contradicts the comment eight lines below it
- iss-2608301805069999the grounds writer judges the whole file while the reader judges the body so a frontmatter Grounds comment makes triage report success and record nothing
- iss-2608301836222858grounds.Vocabulary claimed to be the one copy every gate and every flag description reads, and no surface reads it
- iss-2608301908270807the decision log entry says the record states the residual survives and it does not and it cites a label that appears nowhere
- iss-2608301908270888an unclosed comment or fence in an issue body still locks the record out of every triage verb and no open record tracks it
- iss-2608301908284034the vocabulary comment says every refusal renders it when two of thirteen do and the drift record omits the one copy that is a gate
- iss-2608301908288212four nits from the itd-179 fix delta review including a body line offset that is one ahead of the rendered body
- iss-2608301918362294a prose enumeration of where a value is copied cannot be maintained and has now been wrong four times on two different symbols
- iss-2608310912203724a record authored straight into resolved never invokes capture resolve so the grounds obligation reaches only records that pass through the verb
- iss-2608310912217521the grounds flag carries two incompatible grammars on one verb family with a floor on three routes and free text on the fourth
- itd-2In-Session Subagent Dispatch — the Default Host-Delegated Oracle
- itd-192An acceptance criterion whose producer does not exist is judged by whether this phase wires it, not by whether the narrowing was disclosed
- itd-195A claim about how the code behaves is executable, or it is not made
- itd-2609020625400445A committed preset declares the window it was calibrated for, and the record holds every preset to its declaration