Development record
Nothing You Notice Gets Lost
Press Release
abcd turns the steady drip of nitpicks, review findings, and "huh, that's odd" moments into a queryable ledger. A new
/abcd:capturecommand writes structurediss-Nentries in seconds; the entries live in a committed.abcd/work/issues/ledger with stable IDs (iss-N) and folder-as-status (open/,resolved/,wontfix/). TheMandatory Issue Recordingrule no longer depends on the agent remembering — there's a fast deliberate path with a structured destination, and the ledger is ready for the cross-corpus synthesist (/abcd:dredge, see itd-25) to mine once enough data has accumulated."I do thorough plan and implementation reviews and they always surface nitpicks the agent files away in the transport output but not on disk," said Maya, autonomous-development practitioner. "I'd write 'remember to log this' a dozen times a session and still lose half of them. With abcd, I just say 'capture: T7 cache_ttl_days dead-config alternative' and it's structured, IDed, and queryable. The synthesis layer (itd-25) depends on the ledger having enough volume to be worth synthesising — but the capture surface is there from day one."
Why This Matters
The ~/ABCDevelopment/.claude/CLAUDE.md Mandatory Issue Recording rule is correct in spirit but unreliable in practice. Reviews and manual testing surface nitpicks that vanish unless the persona explicitly tells the agent to log them. When they are logged, .abcd/.work.local/issues.md is gitignored, per-repo, free-form Markdown — there's no way to ask "what categories of finding recur across my repos and over time?".
Two distinct problems compound: capture is unreliable (during-work) and synthesis doesn't exist (over-time, cross-repo). They have very different value-timing: capture earns its keep on day one; synthesis only earns its keep once a meaningful ledger has accumulated. This intent ships capture only. The cross-corpus synthesist that uses the ledger as input is a separate intent (itd-25), deferred until the ledger has sufficient volume.
This split closes a separate loop on /abcd:capture as a command name. The maritime-metaphor review for /abcd:intent established that "capture" is too neutral for product-framing intent work — but it's exactly right for issues, where the verb genuinely shouldn't pre-commit to whether a finding is a bug, nitpick, or systemic pattern. The synthesist (itd-25) decides that later. So abcd lands /abcd:capture not as a rename of /abcd:intent but as its sibling. Two meta-development surfaces with distinct jobs: intent frames product, capture ingests signal. capture and intent are metaphor-exempt; dredge (itd-25) rejoins the maritime convention as the cross-corpus counterpart to lifeboat.
Brief-revision dependency: Promoting this intent invalidates several "5 commands" claims in the brief body. Brief revisions land in the accompanying brief rewrite, not at intent-plan time.
What's In Scope
/abcd:capturecommand (6th plugin command) — single-entry ingest, with subverbs:capture <text>— fast path; appends a structurediss-Nentry to the ledger with auto-assignediss-N, timestamp, and source provenance (which session / command / file the persona was in)capture list [--open|--resolved|--wontfix|--all]— query the ledgercapture promote <iss-N>— promote aniss-Nentry to an intent draft (calls/abcd:intent newwith the entry body + bidirectional link)capture resolve <iss-N>— move toresolved/with optional resolution notecapture wontfix <iss-N> <reason>— move towontfix/with explicit decision
iss-Nledger structure at.abcd/work/issues/:open/iss-N-<slug>.md— captured, not yet acted onresolved/iss-N-<slug>.md— fixed (with resolution notes)wontfix/iss-N-<slug>.md— explicit non-action decision- Frontmatter schema:
id,slug,severity,category,source(review / manual-test / drift / nitpick / observation),found_during,found_at(path),related_intents(list ofitd-N),related_epics(list ofspc-N),created,updated - Folder-as-status (mirrors intent and spec-roadmap conventions)
- Stable
iss-NIDs (unpadded; mirrorsitd-Nconvention; lexical-vs-numeric sort handled at tool layer)
- Brief § 5 update (lands in the accompanying brief rewrite): exemption note for
/abcd:intent+/abcd:capture; reserved-meta-command table covering/abcd:dredge(see itd-25),/abcd:audit(reserved, see itd-16 hash-chain-merkle-audit),/abcd:reflect(reserved, see itd-24). .abcd/.work.local/issues.mdmigration path:dev-syncpromotes existing.abcd/.work.local/issues.mdentries to the structured ledger on first run after install (or first/abcd:ahoyupgrade). Idempotent. Old.abcd/.work.local/issues.mdbecomes a staging buffer (still works for ad-hoc scribbles; promoted on nextdev-syncor/abcd:capture promote).intent-fidelity-reviewerextension: when an intent ships that was promoted from aniss-Nentry, the reviewer cross-references whether the relatediss-Nentry actually moved toresolved/. Mismatch = drift finding.
What's Out of Scope
/abcd:dredgecross-corpus synthesist — a separate intent (itd-25). Capture's value is immediate (every capturediss-Nentry is useful from day one); dredge's value depends on having an accumulated ledger to synthesise. Shipping dredge without a meaningful ledger produces a synthesist with nothing to synthesise.issue-synthesistagent — belongs to itd-25 (/abcd:dredge).- Auto-capture hooks (the "B" tier of the design exploration). Stop-hook / PostToolUse heuristic extraction of
iss-N-shaped statements from session output. Brittle on output-style drift; risks false-positive fatigue. Defer until the ledger has accumulated real usage data showing whether the manual path's volume is sufficient. - Cross-repo
iss-Ncopying. Entries stay in the repo where they were captured. No "promote to a global ledger" behaviour. - Severity-based prioritisation UI. This intent surfaces severity as frontmatter; no dashboard, no SLA, no triage workflow.
- Renaming
/abcd:intentto/abcd:capture. Explicitly considered and rejected. - Real-time
iss-Ntracking integration (Linear / GitHub Issues sync). The existingissue-scoutagent already covers GitHub upstream annotation; sync in the other direction is a separate intent.
Scope Conditions
None stated.
Acceptance Criteria
BDD format, per
itd-1-acceptance-gates. These gates are checked byintent-fidelity-reviewerwhen this intent moves toshipped/.
- Given an abcd-installed repo, when the persona runs
/abcd:capture "review nitpick: T7 cache_ttl_days dead-config alternative", then a new file.abcd/work/issues/open/iss-N-<slug>.mdexists with frontmatter populated (id, severity, category, source, found_during) and the captured text in the body. - Given an existing
iss-Nentry at.abcd/work/issues/open/iss-3-foo.md, when the persona runs/abcd:capture resolve iss-3 "fixed in spc-7 task 4", then the file moves to.abcd/work/issues/resolved/iss-3-foo.mdwith the resolution note appended to the body. - Given an existing
iss-Nentry, when the persona runs/abcd:capture promote iss-N, then/abcd:intent newis invoked with the entry's content as the seed; the resulting intent's frontmatter hasrelated_issues: [iss-N]; theiss-Nentry's frontmatter hasrelated_intents: [itd-M](the new intent's ID). Drift detection enforced by spc-23 (predecessor store; intent-fidelity-reviewer--issue-drift). - Given a fresh
/abcd:ahoyupgrade with an existing.abcd/.work.local/issues.md, whendev-syncruns, then every entry in.abcd/.work.local/issues.mdis promoted to a corresponding.abcd/work/issues/open/iss-N-<slug>.mdwith provenance noting "migrated from .abcd/.work.local/issues.md". - Given the persona runs
/abcd:capture list --open, when there are 5 openiss-Nentries, then the output lists all 5 with id, slug, severity, and one-line summary.
Open Questions
- Manual-only capture vs hook-assisted. This intent defers auto-capture (B) to a future intent. Should a minimal hook ship (e.g., a Stop-hook that simply prompts "Any captures from this session?" rather than auto-extracting), or wait for ledger-volume data first?
iss-NID space — per repo, or global across the corpus? Per-repo is simpler and matchesitd-N(which is per-plugin-repo). Global would require a registry. Default: per-repo.- Promotion from
iss-N→ intent: 1:1 only. N:1 (multipleiss-Nentries fold into a single intent) pairs naturally with itd-25 (dredge) and is deferred to that intent. This intent supports 1:1 only. - Migration semantics for existing
.abcd/.work.local/issues.md. The current file has rich free-form structure (categories in[brackets], "Found while", "Location", "Details", "Suggested fix"). The structured ledger should preserve all of this. Do we auto-migrate (risk: lossy) or interactive-migrate (cost: tedious for ~20 existing entries)?
Implementing specs
itd-4 was implemented across multiple specs of the superseded pre-Go record
system; those ids are preserved below as history. The native spec store
reuses each number for another spec, so each carries the predecessor-store
qualifier. The frontmatter spec_id records the native spec,
spc-6, the record catch-up that verifies the shipped engine against the
Acceptance Criteria and carries the open AC3 (promote) gap. Historical index:
- spc-20 (predecessor store; primary) —
iss-N-ledger primitives (iss-Nallocator, schema, capture/resolve/wontfix/update_field workflow, structure under.abcd/work/issues/). - spc-21 (predecessor store) —
/abcd:capturecommand surface (flow-text ingest into the ledger). - spc-22 (predecessor store) —
.abcd/.work.local/issues.mdmigration to the structured ledger (dev-sync workorchestrator, regex-extracted intent linkage on migrated issues). - spc-23 (predecessor store) —
intent-fidelity-reviewer --issue-driftmode (bidirectional cross-reference walk; reader half of the bidirectional contract).
Audit Notes
Fidelity review — receipt rcp-2662745d5344 (verifier intent-auditor claude-fable-5-1).
Provenance: intent-auditor@claude-fable-5-1 · rubric_hash sha256:effa65b3e9e88ff29433b443ec2be159522a8b0b71cf1434526514aa61edb13e · prompt_hash sha256:63bbd14cfb62139b464a3b8539b3fefb484da8342a9dfa91bc2373aa0f092da4 Input attestations: diff:e86d4f95..07b41ab5 (PR #689, tree read at 07b41ab5)@sha256:32bb9ea2da11af3bf3bf14944bdd3d23bdd28da6be56765809fae7d0d437d984;
Acceptance rollup: MET 1 · MET_WITH_CONCERNS 3 · NOT_MET 1 · INCONCLUSIVE 0
Per-criterion verdicts:
- ac-1 — MET: capture writes open/iss-N-< slug>.md with id, severity, category, source and found_during in frontmatter and the text as body; the round-trip test asserts every field and the filename; the plugin page invokes the same verb evidence: internal/core/capture/workflow.go:132 — "{"severity", string(req.Severity)}, {"category", ...}, {"source", ...}, {"found_during", req.FoundDuring}" evidence: internal/core/capture/workflow_test.go:89 — "func TestCaptureAppendAndReadBack" evidence: internal/core/capture/workflow_test.go:165 — "filepath.Base(got.Path) != tc.want.ID+"-"+tc.want.Slug+".md"" evidence: commands/capture.md:4 — "argument-hint: "[text] | list --open|--resolved|--wontfix|--all | ..."
- ac-2 — MET_WITH_CONCERNS: resolve moves open/ to resolved/ and persists the note, but as the frontmatter scalar
resolution:rather than appended to the body as the criterion says; the divergence is signed off (dcn-2607170000000002, adjudication 1) and the test asserts the scalar evidence: internal/core/capture/workflow.go:289 — "transition(req.RepoRoot, req.IssuesRoot, req.ID, "resolve", "resolution", req.Resolution," evidence: internal/core/capture/workflow_test.go:291 — "tr.FromStatus != StateOpen || tr.ToStatus != StateResolved" evidence: internal/core/capture/workflow_test.go:299 — "lr.Issues[0].Resolution !=" evidence: dcn-2607170000000002 — "AC2's resolve note lives as the structured frontmatter scalarresolution:... not body-appended prose as the AC letter says" - ac-3 — MET_WITH_CONCERNS: promote mints the draft with related_issues: [iss-N] and appends itd-M to the issue's related_intents, the drift walker checks the join and is enforced in preflight and CI; concerns: the seed is a by-id pointer, not the entry's content (spc-24 design), the mint goes through intent.CreateDraft rather than a
/abcd:intent newinvocation (that alias is deprecated), and the check is namedabcd intent audit --issue-drift, not intent-fidelity-reviewer evidence: internal/core/capture/promote.go:222 — "RelatedIssue: req.ID," evidence: internal/core/intent/create.go:427 — "b.WriteString(RelatedIssuesKey + ": [" + opts.RelatedIssue + "]\n")" evidence: internal/core/capture/promote.go:266 — "setListField(content, "related_intents", appendUnique(related, itdID))" evidence: internal/core/intent/lifecycle.go:543 — "func AddRelatedIssue(repoRoot, intentID, source string) (Intent, error)" evidence: internal/core/capture/promote_test.go:114 — "draft frontmatter missing related_issues: [%s]" evidence: internal/core/capture/drift.go:75 — "func IssueDrift(req IssueDriftRequest) (IssueDriftResult, error)" evidence: internal/core/capture/drift_test.go:49 — "func TestIssueDriftReportsEveryBrokenJoinAndNothingElse" evidence: internal/surface/cli/cli.go:3609 — "promote < iss-N> [--grounds "< token>: < text>"] | promote < rdi-N>" evidence: internal/surface/cli/cli.go:2306 — "Use: "audit [< itd-N>] | audit --issue-drift [--strict]"" evidence: Makefile:172 — "issue-drift:" evidence: .github/workflows/ci.yml:346 — "- name: Issue-drift (promote-join gate)" evidence: commands/capture.md:406 — "and appends the minteditd-Nto the issue'srelated_intents" evidence: commands/intent.md:534 — "intent audit --issue-drift # warnings on stderr, exit 0" evidence: internal/core/capture/promote.go:216 — "seed := "Graduated from" + req.ID + ": " + title +" evidence: .abcd/development/specs/closed/spc-24-an-issue-graduates-into-an-intent.md:50 — "a by-id pointer, never a copy of the issue body (SSOT)" evidence: internal/surface/cli/cli.go:1996 — "WARNING:abcd intent newis deprecated; useabcd intent "<text>"" - ac-4 — NOT_MET: promised: the plugin's sync step promotes every entry of the local-tier issues file into open/ with provenance 'migrated from' that file; delivered: no verb or sync step reads that file (its only mention is a package comment), no ledger record carries that provenance (grep over .abcd/work/issues/ finds none), and the source file is absent; the ruling of 2026-07-17 declares it satisfied-by-history, which records the omission rather than realising the outcome evidence: internal/core/capture/capture.go:2 — "a per-repo issue ledger that replaces the free-form" evidence: dcn-2607170000000002 — "AC4 migration recorded satisfied-by-history (source absent, ledger populated iss-1..iss-103); no dead migration code built" evidence: .abcd/work/issues/resolved/iss-1-launch-phase-ownership.md:9 — "found_during: "roadmap-consistency-review"" evidence: .abcd/development/specs/closed/spc-6-issue-capture.md:106 — "satisfied-by-history ... Record-only; no code."
- ac-5 — MET_WITH_CONCERNS: the pin test captures five issues and asserts
capture list --open --jsonreturns all five with id, slug, severity and the one-line body; concern: the human render prints id, status, severity and slug with no summary, so the criterion holds on the JSON surface only (captured as iss-2609240307549105) evidence: internal/surface/cli/capture_surface_test.go:182 — "func TestCaptureListOpenRendersIssueFields" evidence: internal/surface/cli/capture_surface_test.go:220 — "if iss.ID == "" || iss.Slug == "" || iss.Severity == "" || iss.Body == """ evidence: internal/surface/cli/cli.go:3447 — "fmt.Fprintf(w, "%s %s %s %s%s\n", iss.ID, iss.Status, iss.Severity, iss.Slug, blockedNote(iss))" evidence: .abcd/work/issues/open/iss-2609240307549105-itd-4-ac5-says-capture-list-open-lists.md:1 — "id: "iss-2609240307549105""
Gap audit:
- honoured:
/abcd:capture <text>writes a structured iss-N entry into the committed ledger with stable ids and folder-as-status evidence: internal/core/capture/workflow.go:132 — "{"severity", string(req.Severity)}" evidence: internal/core/capture/capture.go:9 — "status directories (open/, resolved/, wontfix/) whose folder membership IS"- resolve and wontfix move the record between status folders evidence: internal/core/capture/workflow_test.go:278 — "func TestResolveTransition" evidence: internal/core/capture/workflow_test.go:364 — "func TestWontfixTransition"
- promote writes both halves of the issue-intent join, in mint mode and in link mode evidence: internal/core/capture/promote.go:266 — "setListField(content, "related_intents", appendUnique(related, itdID))" evidence: internal/core/capture/promote_related_test.go:17 — "func TestPromoteLinkModeWritesBothHalvesOnAnIssue"
- the drift check reports a shipped intent whose promoted issue did not move to resolved/ (the intent-fidelity-reviewer extension the scope names) evidence: internal/core/capture/drift.go:121 — "if bucket == intent.BucketShipped && strings.HasPrefix(src, "iss-")" evidence: internal/core/capture/drift_test.go:62 — "DriftShippedUnresolved + " itd-5 iss-5""
- drift detection is enforced: a make preflight prerequisite and a CI check step, both --strict, and the decision log corrects its own earlier 'not wired' statement evidence: Makefile:306 — "preflight: load-check lint-reviews lint-issues lint-decisions record-lint issue-drift" evidence: .github/workflows/ci.yml:348 — "run: go run ./cmd/abcd intent audit --issue-drift --strict" evidence: dcn-2609230000000017 — "Decision (5) says the drift check is not wired into preflight or CI. That contradicts the criterion it delivers"
- every retired back-link in the tree was migrated to the two-sided join and the gate reports nothing at HEAD evidence: internal/core/capture/migrate_test.go:106 — "func TestMigrateRewritesEveryRetiredBackLinkIntoTheTwoSidedJoin" evidence: .abcd/work/issues/open/iss-327-managed-repo-pii-config-wrong-and-abcd-lint-missing-privacy-hygiene-error.md:10 — "related_intents: [itd-93]" evidence: internal/surface/cli/issue_drift_surface_test.go:67 — "func TestIntentAuditIssueDriftStrictCleanExitsZero"
- both verbs are reachable from the plugin markdown surface evidence: commands/capture.md:399 — "capture promote < iss-N> --grounds "pursued: < conjecture>" --json" evidence: commands/intent.md:535 — "intent audit --issue-drift --strict # exit 1 on any finding (CI)"
- diverged:
- resolve note appended to the body — delivered as the frontmatter scalar
resolution:(signed off 2026-07-17) evidence: internal/core/capture/workflow.go:289 — ""resolve", "resolution", req.Resolution" evidence: dcn-2607170000000002 — "recorded as intentional design evolution, not a gap" - promote seeds the draft with the entry's content — delivered as a by-id pointer to the issue, never a copy (spc-24 SSOT design)
evidence: internal/core/capture/promote.go:216 — "seed := "Graduated from
" + req.ID + ": " + title +" evidence: .abcd/development/specs/closed/spc-24-an-issue-graduates-into-an-intent.md:50 — "a by-id pointer, never a copy of the issue body (SSOT)" /abcd:intent newis invoked — delivered as a direct call of intent.CreateDraft, the primitive the quoted-text create shares; theintent newalias is deprecated evidence: internal/core/intent/create.go:303 — "created.RelatedIssues = []string{opts.RelatedIssue}" evidence: internal/surface/cli/cli.go:1996 — "abcd intent newis deprecated"- drift detection by
intent-fidelity-reviewer --issue-drift(spc-23 of the retired record system) — delivered asabcd intent audit --issue-drift [--strict]evidence: internal/surface/cli/cli.go:2375 — "auditCmd.Flags().BoolVar(&issueDrift, "issue-drift", false," - frontmatter field
related_epics(list of spc-N) — delivered asrelated_specs(the glossary bans 'epic') evidence: internal/core/issueschema/issueschema.go:69 — ""related_specs": true, "related_issues": true," evidence: internal/core/capture/workflow_test.go:122 — "RelatedSpecs: []string{"spc-12"}" capture list --openoutput carries a one-line summary — delivered on the --json surface only; the human render omits it (captured as iss-2609240307549105) evidence: internal/surface/cli/cli.go:3447 — "iss.ID, iss.Status, iss.Severity, iss.Slug, blockedNote(iss)" evidence: internal/surface/cli/capture_surface_test.go:199 — "runCLI(t, "capture", "list", "--open", "--json")"
- resolve note appended to the body — delivered as the frontmatter scalar
- missing:
- the plugin's sync-step migration of the local-tier issues file into the ledger with 'migrated from' provenance (ruled satisfied-by-history 2026-07-17; nothing in the tree performs or evidences it) evidence: dcn-2607170000000002 — "no dead migration code built" evidence: internal/core/capture/capture.go:2 — "a per-repo issue ledger that replaces the free-form"
- brief § 5 reserved-meta-command table covering /abcd:dredge and /abcd:reflect — the brief reserves /abcd:audit alone
evidence: .abcd/development/brief/04-surfaces/16-lint.md:16 — "
/abcd:auditstays reserved for itd-16's hash-chain fidelity surface."
Frontmatter
| id | itd-4 |
|---|---|
| type | intent |
| lifecycle | shipped |
| kind | standalone |
| severity | major |
.abcd/development/intents/shipped/itd-4-issue-capture.md
open on GitHub ↗ · commit history ↗
Referenced by22
- adr-12`.work/issues.md` stays the live operational ledger; the structured per-issue store is deferred until the native spec layer schedules the migration (historical)related
- adr-32The issue ledger is working-tier data, not authored recordrelated
- iss-2610262032042626The context page says `abcd intent new` is refused; itd-4's `capture promote` calls `/abcd:intent new`.related
- iss-2610262034550860itd-4 has capture promote call intent new with the issue's body; the capture surface page says promotion mints the draft natively with a by-id pointer, not a copy.related
- iss-2610262034566586itd-4 names the issue ledger's spec-link field related_epics; the capture surface page's schema names it related_specs.related
- iss-2610262034567348itd-4's shipped scope migrates scratch issues through dev-sync; the capture surface page says that migration is not built and rides a dev-sync surface that is only a design target.related
- iss-2610262039487315itd-4 ships a `dev-sync` migration of `.abcd/.work.local/issues.md`; 03-configuration says no `dev-sync` verb exists.related
- iss-261026203949497904-universal-patterns classes issue-ledger entries as immutable once created; itd-4's `capture resolve` moves an entry and adds a resolution note.related
- iss-2610262041559803The glossary enforces 'epic' as a forbidden synonym; itd-4's issue schema names a related_epics field holding spec ids.related
- iss-2610262041563970The verification matrix marks migrating a flat issue list into the ledger as staged with no verb; shipped itd-4 scopes that migration.related
- iss-2610262044218994`abcd audit` names a repo-conformance check in one record and is reserved for the hash-chain merkle audit in anotherrelated
- iss-2610262045343669itd-4's issue schema carries related_epics; itd-43 says the validator uses related_specs exclusivelyrelated
- iss-2610262045478245itd-4's capture promote calls /abcd:intent new; itd-2609212130136102 removes intent newrelated
- itd-20`/abcd` Tells You Where You Arebuilt on by
- itd-25Patterns Surface Themselvesblocks
- itd-46`/abcd:intent "<text>"` And `/abcd:capture "<text>"` Become Symmetric Create Pathsbuilt on by
- itd-82`abcd drain` fixes the issues that need no decision, and hands the rest back by kindbuilt on by
- itd-116Validated GitHub Issues Become Ledger Entries Without Retypingbuilt on by
- itd-119An Issue Graduates Into An Intent Without Retypingbuilt on by
- itd-120A Resolved Issue Points At What Fixed Itbuilt on by
- itd-2609221656361680A managed repository reports back to abcd, and abcd says so at its next startbuilt on by
- spc-6issue-captureimplemented by
mentions32
- adr-3Directory location is the source of truth for lifecycle state
- dcn-26071700000000022026-07-17 — Burst 3 (M3, itd-4/spc-6), three record adjudications: (1) AC2's
- 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.
- dcn-26092300000000162026-09-23 — itd-4 AC3 built as ruled (B3): the promote join's back-links are `related_issues` on the intent and `related_intents` on the ledger record, and `abcd intent audit --issue-drift` checks them. Seven implementation decisions the ruling left open, taken by the implementing lane. (1) No reader tolerates the retired `promoted_to` / `promoted_from`: the ledger reader refuses and skips a record carrying `promoted_to`, the intent reader ignores `promoted_from`, and a promote write meeting either refuses. The refusal, the record gate's finding and the drift finding each name the successor and the remedy, `abcd capture migrate --apply`, a verb that reports by default, writes only with `--apply`, and is idempotent. It is a verb and not a one-off script because managed repositories hold the same retired names and need the same repair. (2) "Promoted" is the PAIR, an intent in the record's `related_intents` that names the record back in its `related_issues`, because an issue's `related_intents` already carried loose relations before the rename and still does; the double-promote refusal and the record page's next move read the pair. So the migration completes a join an older abcd wrote from one end only (iss-327 and itd-93, iss-2609091642508005 and itd-2609111003026787), or those records would stop reading as promoted. (3) Link mode on the issue route writes both halves; before the rename it stamped the issue alone, which left a hand-filed draft with no edge back. (4) `related_issues` holds `rdi-N` as well as `iss-N`: a reading item lives in the issue ledger's tree and graduates the same way, and one key per side keeps the join one shape. The first entry is the record the intent was promoted from; a later link appends, so `back_edge_kept` still reports the first. (5) The drift check reports an intent naming a record that does not name it back, but not an ISSUE naming an intent that does not name it back, since that is a loose relation; a reading item carries no loose relation, so from its end a one-way stamp is drift. A shipped intent naming an issue in `wontfix/` is drift, like one in `open/`, because the itd-4 scope asks whether the issue "actually moved to resolved/". The check is not wired into preflight or CI; `--strict` is there for whoever wires it. (6) The historical passages in shipped intents, closed specs and adr-0057 carry a `(historical)` marker beside the retired names, the precedent `development/activity` set, so the new `retired-promote-back-links` ban can gate every current record. (7) The impact is `breaking`: itd-4 declares none, and the rename removes `promoted_to` from `capture list --json`, `promoted_from` from the intent JSON and both link keys from the record page, and makes an unmigrated ledger unreadable until the migration runs.
- dcn-26092300000000172026-09-23 — Two corrections to the entry above recording itd-4 AC3 built as ruled, appended because the ledger is append-only. (1) Decision (5) says the drift check is not wired into preflight or CI. That contradicts the criterion it delivers, which says drift detection is ENFORCED, so it is wired: `make issue-drift` runs `abcd intent audit --issue-drift --strict` as a `make preflight` prerequisite, and the CI `check` job runs the same line on its Linux leg. A promote join that stops reading the same from both ends now fails the pre-push gate and CI. (2) Decision (6) is narrowed: the `(historical)` marker goes on the authored passages, never inside an INGESTED Audit Notes block, because an audit receipt is written only by the ingest. The `retired-promote-back-links` ban exempts those receipt lines by the line shapes the ingest renders (a per-criterion verdict, a scope-condition disposition, an evidence pointer), and it exempts the two gap-audit claims that name a retired key by their own text, since a gap-audit claim is a bare nested bullet and exempting that shape would also exempt live prose.
- iss-1launch phase ownership contradicts across the record: phase-1-ahoy.md and build-sequence.md make install plus launch the first milestone, but 04-surfaces/04-launch.md says full launch builds in Phase 5. ADR-bound.
- iss-3phase membership and lifecycle directories disagree: planned intents (itd-20, itd-24, itd-29, itd-46) appear in no phase Scope, while draft itd-43 is scoped into Phase 0/1 yet listed later-phase. ADR-bound.
- iss-5disembark and embark status banners point to the wrong phase: 02-disembark.md says Phase 4, 03-embark.md says Phase 5, but phase-6-lifeboat.md owns both.
- iss-103gitutil.CheckIgnored returns an empty map for every non-zero git exit, conflating 'nothing ignored' (exit 1) with 'git cannot answer' (exit 128 not-a-repo/corrupt, or git absent). This is intentional fail-open and correct for the audit-rule callers (which guard with InRepo). The one reachable defect was the launch bundle's finalize calling it unguarded, so a git failure silently admitted every gitignored file to the release bundle — that is already fixed (was B18: launch now uses a fail-closed checkIgnoredStrict). Recorded from the multi-agent bug hunt (was B23) for the record: consider lifting a strict, error-returning CheckIgnoredStrict into gitutil so the launch package need not keep its own copy, while preserving the fail-open CheckIgnored for audit. Nitpick / tech-debt; no live defect remains.
- iss-327The ship flow permits an unreleasable cut: launch ship writes the dated heading with no check that the receipts protocol can complete, so the receipt gate fires at tag time — the most expensive possible moment, unrecoverable once tagged. Folded into itd-93 by maintainer decision: the emit prints the receipts protocol as a checklist, the ingest refuses a cut it cannot prove releasable, and a launch receipts sub-verb runs the release job's exact check locally before the merge
- iss-2609231553391212The promote join's back-links are renamed: an intent's `promoted_from` becomes `related_issues` and a ledger record's `promoted_to` becomes `related_intents`, in the files and the JSON output. Nothing reads the retired names; a record still carrying `promoted_to` is refused. A managed repository runs `abcd capture migrate --apply` once to rewrite them (without `--apply` it only reports).
- iss-2609240307549105itd-4 AC5 says `capture list --open` lists every open issue with id, slug, severity and a one-line summary. The human render prints id, status, severity and slug and no summary (internal/surface/cli/cli.go, the list render's Fprintf); only `--json` carries the body. spc-6's AC5 pin, TestCaptureListOpenRendersIssueFields, asserts the --json shape alone, so the shipped criterion is covered on one of its two surfaces. Found during the fidelity audit of itd-4 (receipt rcp-2662745d5344), criterion ac-5.
- iss-2609240311058767The store-before-commit redactor rewrites a hyphenated vocabulary word when its first token equals the local account name. Observed on `abcd intent audit ingest` for itd-4 (receipt rcp-2662745d5344): the verdict's ac-4 rationale named the historical sync verb of the plugin, the two-token hyphenated term the intent's own fourth acceptance criterion carries verbatim, and the ingested Audit Notes now read `[redacted-user]-sync` in two places (the criterion line and the gap-audit claim) while the criterion text forty lines above carries the term unredacted. The identity kinds in internal/adapter/scanner/redact.go (kindLocalUser, replaced by the marker at redactionReplacement) treat a hyphen as a word boundary, so a product term is redacted as a person. The committed record is machine-dependent: on an account with another name the same ingest writes the term. Found during the fidelity audit of itd-4 in the autonomous run.
- iss-2609290448510918The predecessor-store qualifier sweep reaches past the six intents iss-2609261536147903 named: outside drafts/ and those six, 192 citation sites across about forty intents name a spc-N at or below spc-70 that is not the citing intent's own spec, with no '(predecessor store)' on the line. Some are live cross-references (the cold-reading family's intents cite each other's live specs), and some are the predecessor store's (itd-4, itd-6, itd-29, itd-47 and itd-49 describe pre-rebuild work in its terms), so each site needs the same reading against the live spec it collides with; the specs charter's Two spc-N Namespaces section is the rule. Found while sweeping the pattern of iss-2609261536147903 in lane drainDrift3; a census script over intents/{planned,shipped,disciplines} reproduces the count.
- iss-2609300025372991Two shipped intents' Implementing specs sections misstate where their predecessor-store spec ids stand: itd-36 says its frontmatter spec_id records spc-38 as the primary delivering spec, while the frontmatter records spc-2609211905174684 and live spc-38 and spc-39 are itd-136's record explorer and itd-137's relationship chart; itd-4 says its spc-20 to spc-23 do not exist in the native spec store, while the live store holds all four as other specs (banlist, fresh install, stale-binary warning, tier placement). Found while qualifying predecessor-store citations for iss-2609290448510918.
- iss-2609300032219282Superseded itd-47's Implementing specs section says its frontmatter spec_id records spc-27 as the primary delivering spec, while the frontmatter holds spec_id: null, and spc-27 and spc-32 are predecessor-store ids that the live store reuses for the surface-coverage registry and abcd update. The same defect iss-2609300025372991 fixed in itd-36 and itd-4, found in a third intent while qualifying predecessor-store citations for iss-2609290448510918.
- iss-2610262030410509Invariant 17 makes the intent-to-spec relation 1:n; the intent chapter's kinds table maps a standalone intent to one spec (1:1)
- iss-2610262033557020The intent chapter's kinds table maps a standalone intent to one spec (1:1); the record-families map says an intent has one or more specs.
- itd-1Every Intent Has Acceptance Criteria; Every Audit Verifies Them
- itd-5Every Agent Prompt Carries Its Version, Earns Its Lock, And Survives Injection
- itd-16`/abcd:audit` Is the Umbrella; Conversation/Edit Chain Is Its Default Application
- itd-24Completed Releases Get A Retrospective
- itd-93abcd Scaffolds a Release Gate That Works on the First Try
- itd-2609150819445595A shipped intent's owed fidelity review is listed, so the debt is paid
- spc-7abcd-intent-quoted-text-create-symmetric
- spc-12disembark-grounds-a-lifeboat-s-open-questions-on-a-repo-s-to
- spc-20name-banlist
- spc-21a-fresh-plugin-install-just-works-the-hook-binary-survives
- spc-22a-stale-abcd-never-answers-silently-every-surface-that-runs
- spc-23development-instructions-live-in-the-right-tier-abcd-manages
- spc-24an-issue-graduates-into-an-intent-without-retyping-abcd-capt
- spc-2610021456200324The consistency pass at commit time: a stable finding key, cross-document lint codes, chunked review, and a pre-commit gate