Skip to content

feat: dependency-aware capture ledger in the work tier (ADR-32) - #4

Merged
REPPL merged 2 commits into
mainfrom
refactor/capture-ledger-schema-tier
Jul 7, 2026
Merged

feat: dependency-aware capture ledger in the work tier (ADR-32)#4
REPPL merged 2 commits into
mainfrom
refactor/capture-ledger-schema-tier

Conversation

@REPPL

@REPPL REPPL commented Jul 7, 2026

Copy link
Copy Markdown
Owner

What

Redesigns the capture issue ledger so running abcd's own capture no longer breaks abcd's own record-lint.

Dogfooding surfaced a shipped-vs-shipped contradiction: capture's schema required a created: field, while record-lint's no_git_metadata bans it under .abcd/development. Root cause was a category error — the ledger is generated, schema-governed working data, not authored design record.

Changes (ADR-32)

  • Tier — ledger moves to .abcd/work/issues/, out of the record-lint root. Dissolves the conflict at its source (no lint exemption).
  • Schema — drop the git-inferable created/updated; git is canonical. The reader tolerates legacy ones (accept, then drop) so older ledgers degrade gracefully.
  • Dependency edges + derived priority — new --blocked-by flag stores a one-direction blocked_by edge; capture list/status render a derived-priority view (unblocked-first, then severity; blocked rows annotated [blocked-by iss-N]). No stored priority — resolving a blocker re-prioritises dependents automatically.
  • Store README — one contract at the store root; state leaves self-evident.

Testing

make preflight green (build, gofmt, vet, go test ./..., -race), record-lint clean, check-reviews OK. New tests: blocked_by round-trip, derived priority (list + status), CLI end-to-end + bad-token rejection.

Not in this PR

The roadmap-consistency review and its 15 captured issues are a separate housekeeping concern (follow-up branch). This PR is the ledger machinery + its ADR only.

Assisted-by: Claude

REPPL added 2 commits July 8, 2026 00:08
Running abcd's own `capture` broke abcd's own `record-lint`: the issue schema
required a `created:` field while `no_git_metadata` bans it under
`.abcd/development`. Root cause is a category error — the ledger is generated,
schema-governed working data, not authored design record.

Records the decision: move the ledger to the work tier, drop git-inferable
timestamps, derive priority from a `blocked_by` edge, and keep per-folder
READMEs as local contracts for the authored record only. Also records the
reversal of the first-pass fix (a record-lint path exemption) as the
methodology-over-local-fixes principle in action.

Assisted-by: Claude:claude-opus-4-8
Implements ADR-32.

- Move the ledger to `.abcd/work/issues/`, out of the record-lint root, so
  running `capture` no longer breaks `record-lint`.
- Drop the git-inferable `created`/`updated` fields; the reader tolerates
  legacy ones (accept, then drop) so older ledgers degrade gracefully.
- Add a one-direction `blocked_by` dependency edge (`--blocked-by`) and a
  derived-priority view: unblocked-first, then severity, blocked rows
  annotated `[blocked-by iss-N]`. Priority is a read-time projection, never
  stored, so resolving a blocker re-prioritises its dependents automatically.
- Add a store-contract README; state leaves stay self-evident.

Wired on both the CLI and the plugin markdown surface.

Assisted-by: Claude:claude-opus-4-8
@REPPL
REPPL merged commit 2be0b81 into main Jul 7, 2026
12 checks passed
@REPPL
REPPL deleted the refactor/capture-ledger-schema-tier branch July 7, 2026 23:12
REPPL added a commit that referenced this pull request Jul 8, 2026
* chore: land roadmap-consistency review and capture its findings

An external consistency review of the design record landed at
.abcd/work/reviews/2026-07-07-roadmap-consistency/. Its 14 findings plus iss-15
(the capture/record-lint conflict, fixed by ADR-32) are captured to the ledger
as the tracked triage backlog, with blocked_by edges linking the dependent
majors to the criticals they wait on. Gitignore the allocator lock.

Assisted-by: Claude:claude-opus-4-8

* chore: resolve iss-15 (capture ⊥ record-lint) — fixed by ADR-32

The conflict that motivated the ledger redesign is closed by PR #4: capture no
longer writes git-inferable metadata into the record-lint root.

Assisted-by: Claude:claude-opus-4-8

* docs: resolve iss-1 (launch phase ownership) — ADR-33

The record disagreed on which phase owns /abcd:launch: the roadmap and build
sequence make install + launch the first milestone, while the brief's launch
surface still carried the pre-rebuild 'builds in Phase 5 (round-trip and ship)'
banner. ADR-33 decides: the roadmap phase index is the sole source of phase
numbering and ownership; Phase 1 owns the curated-release cut; the launch
deepenings (itd-65/66/70/72/73) are separately scheduled intents, attributed by
intent rather than phase number. The launch surface banner, its in-body Phase-5
references, and the launch-gatekeeper agent row are rewritten accordingly.

Assisted-by: Claude:claude-fable-5

* docs: resolve iss-2 (release-version source of truth) — align to ADR-31

Three sites still described superseded versioning models: the roadmap README
tracked releases by the working-tree plugin.json version (the tree is
unversioned per ADR-19), and the launch surface plus verification matrix
described phase-completion bump tiering with a manual --version override.
ADR-31 already decides this: the version is derived from the shipped intents'
impact, with the surface-diff guardrail; no version is ever authored. All
three sites now state that model.

Assisted-by: Claude:claude-fable-5

* docs: resolve iss-3 (phase membership vs lifecycle) — ADR-34

The intents README defined planned/ as 'scoped into a roadmap phase' while
fifteen planned intents appeared in no phase Scope and two Scope-named intents
(itd-43 Phase 0, itd-7 Phase 6) still sat in drafts/. ADR-34 decides the two
axes are orthogonal — lifecycle is commitment (directory, adr-3), scheduling
is phase Scope membership (adr-9) — with one directional invariant: scheduled
implies planned/. itd-43 and itd-7 move to planned/ (itd-43's kind bound to
standalone per its suggested_kind, which the intent_lifecycle lint requires of
planned intents); the README's planned/ definition and directory listings now
match disk.

Assisted-by: Claude:claude-fable-5

* docs: resolve iss-6, iss-9, iss-10 (unblocked majors)

iss-6 — the brief's scope page listed seven user-facing commands while the
surfaces index lists nine; /abcd (itd-20) and /abcd:reflect (itd-24) added.
iss-9 — the glossary home is .abcd/development/brief/glossary/ (adr-30); the
Phase 3 milestone and the disembark terminology render source still pointed at
the old foundation/terminology/ path, and the glossary README's layout block
labelled the tree root terminology/. All three standardised.
iss-10 — the phases README said Phase 0 has no user-facing command while
phase-0-substrate.md deliberately carries /abcd:intent review; the README now
states the phase doc's qualifier (no product-capability user moment, one
substrate sub-verb).

Assisted-by: Claude:claude-fable-5

* docs: resolve iss-4, iss-5 (six-vs-seven phases, disembark/embark banners)

Both findings are instances of the superseded six-phase numbering ADR-33
identifies. iss-4: four brief files said six planned phases (Phase 0-5); the
roadmap index has seven (Phase 0-6). iss-5: the disembark banner said Phase 4,
the embark banner Phase 5, while phase-6-lifeboat.md owns both; the agent
catalog's lifeboat-pipeline rows carried the same old numbers. All sites now
point at the owning phase doc per ADR-33.

Assisted-by: Claude:claude-fable-5

* docs: resolve iss-7, iss-8 (hand-kept counts, stale out-of-scope corpus)

iss-7 — the brief hand-maintained a 'thirteen phased intents' count and list
that the phase docs outgrew; both sites now derive by pointer to the phase
docs' Scope sections (adr-9), keeping no static copy that can re-drift.
iss-8 — the out-of-scope enumeration omitted ten current drafts (itd-57..75)
and still included itd-43 (scheduled, moved to planned/ by ADR-34). The list
is regenerated in lockstep with the drafts/ corpus and the derivation command
loses its exclusion set: per ADR-34 a scheduled intent cannot live in drafts/,
so the filesystem is the list.

Assisted-by: Claude:claude-fable-5

* docs: resolve iss-11..iss-14 (minors + nitpick)

iss-11 — agent count 15 -> 16 in the press release, scope page, and
prompt-quality page, each now deferring to the 01-agents.md catalog as the
canonical roster.
iss-12 — the memory docs asserted spc-38/spc-39 capability as shipped while
itd-36 sits in planned/ and nothing Go-built has shipped; the references are
demoted to spec attribution and the surface header defers delivery state to
the intent lifecycle.
iss-13 — stale status narration stripped from brief contracts (per adr-5):
false 'shipped' status cells in the agent catalog corrected to design target
(no agents/ directory exists in this repo), '(spc-N — shipped)' parentheticals
reduced to attribution, dated capture-history prose dropped from the scope
page, and a delivery-state provenance note added to the brief README covering
residual predecessor spc-N references.
iss-14 — the intent-fidelity-reviewer section moved from § 6 to § 7 of
05-intent.md; every deep link and textual reference re-anchored (the § 6
lint-rule reference in intents/README.md verified still correct).

Assisted-by: Claude:claude-fable-5
REPPL added a commit that referenced this pull request Jul 11, 2026
* docs: ADR-32 — the issue ledger is working-tier data

Running abcd's own `capture` broke abcd's own `record-lint`: the issue schema
required a `created:` field while `no_git_metadata` bans it under
`.abcd/development`. Root cause is a category error — the ledger is generated,
schema-governed working data, not authored design record.

Records the decision: move the ledger to the work tier, drop git-inferable
timestamps, derive priority from a `blocked_by` edge, and keep per-folder
READMEs as local contracts for the authored record only. Also records the
reversal of the first-pass fix (a record-lint path exemption) as the
methodology-over-local-fixes principle in action.

Assisted-by: Claude:claude-opus-4-8

* feat: dependency-aware capture ledger in the work tier

Implements ADR-32.

- Move the ledger to `.abcd/work/issues/`, out of the record-lint root, so
  running `capture` no longer breaks `record-lint`.
- Drop the git-inferable `created`/`updated` fields; the reader tolerates
  legacy ones (accept, then drop) so older ledgers degrade gracefully.
- Add a one-direction `blocked_by` dependency edge (`--blocked-by`) and a
  derived-priority view: unblocked-first, then severity, blocked rows
  annotated `[blocked-by iss-N]`. Priority is a read-time projection, never
  stored, so resolving a blocker re-prioritises its dependents automatically.
- Add a store-contract README; state leaves stay self-evident.

Wired on both the CLI and the plugin markdown surface.

Assisted-by: Claude:claude-opus-4-8
REPPL added a commit that referenced this pull request Jul 11, 2026
* chore: land roadmap-consistency review and capture its findings

An external consistency review of the design record landed at
.abcd/work/reviews/2026-07-07-roadmap-consistency/. Its 14 findings plus iss-15
(the capture/record-lint conflict, fixed by ADR-32) are captured to the ledger
as the tracked triage backlog, with blocked_by edges linking the dependent
majors to the criticals they wait on. Gitignore the allocator lock.

Assisted-by: Claude:claude-opus-4-8

* chore: resolve iss-15 (capture ⊥ record-lint) — fixed by ADR-32

The conflict that motivated the ledger redesign is closed by PR #4: capture no
longer writes git-inferable metadata into the record-lint root.

Assisted-by: Claude:claude-opus-4-8

* docs: resolve iss-1 (launch phase ownership) — ADR-33

The record disagreed on which phase owns /abcd:launch: the roadmap and build
sequence make install + launch the first milestone, while the brief's launch
surface still carried the pre-rebuild 'builds in Phase 5 (round-trip and ship)'
banner. ADR-33 decides: the roadmap phase index is the sole source of phase
numbering and ownership; Phase 1 owns the curated-release cut; the launch
deepenings (itd-65/66/70/72/73) are separately scheduled intents, attributed by
intent rather than phase number. The launch surface banner, its in-body Phase-5
references, and the launch-gatekeeper agent row are rewritten accordingly.

Assisted-by: Claude:claude-fable-5

* docs: resolve iss-2 (release-version source of truth) — align to ADR-31

Three sites still described superseded versioning models: the roadmap README
tracked releases by the working-tree plugin.json version (the tree is
unversioned per ADR-19), and the launch surface plus verification matrix
described phase-completion bump tiering with a manual --version override.
ADR-31 already decides this: the version is derived from the shipped intents'
impact, with the surface-diff guardrail; no version is ever authored. All
three sites now state that model.

Assisted-by: Claude:claude-fable-5

* docs: resolve iss-3 (phase membership vs lifecycle) — ADR-34

The intents README defined planned/ as 'scoped into a roadmap phase' while
fifteen planned intents appeared in no phase Scope and two Scope-named intents
(itd-43 Phase 0, itd-7 Phase 6) still sat in drafts/. ADR-34 decides the two
axes are orthogonal — lifecycle is commitment (directory, adr-3), scheduling
is phase Scope membership (adr-9) — with one directional invariant: scheduled
implies planned/. itd-43 and itd-7 move to planned/ (itd-43's kind bound to
standalone per its suggested_kind, which the intent_lifecycle lint requires of
planned intents); the README's planned/ definition and directory listings now
match disk.

Assisted-by: Claude:claude-fable-5

* docs: resolve iss-6, iss-9, iss-10 (unblocked majors)

iss-6 — the brief's scope page listed seven user-facing commands while the
surfaces index lists nine; /abcd (itd-20) and /abcd:reflect (itd-24) added.
iss-9 — the glossary home is .abcd/development/brief/glossary/ (adr-30); the
Phase 3 milestone and the disembark terminology render source still pointed at
the old foundation/terminology/ path, and the glossary README's layout block
labelled the tree root terminology/. All three standardised.
iss-10 — the phases README said Phase 0 has no user-facing command while
phase-0-substrate.md deliberately carries /abcd:intent review; the README now
states the phase doc's qualifier (no product-capability user moment, one
substrate sub-verb).

Assisted-by: Claude:claude-fable-5

* docs: resolve iss-4, iss-5 (six-vs-seven phases, disembark/embark banners)

Both findings are instances of the superseded six-phase numbering ADR-33
identifies. iss-4: four brief files said six planned phases (Phase 0-5); the
roadmap index has seven (Phase 0-6). iss-5: the disembark banner said Phase 4,
the embark banner Phase 5, while phase-6-lifeboat.md owns both; the agent
catalog's lifeboat-pipeline rows carried the same old numbers. All sites now
point at the owning phase doc per ADR-33.

Assisted-by: Claude:claude-fable-5

* docs: resolve iss-7, iss-8 (hand-kept counts, stale out-of-scope corpus)

iss-7 — the brief hand-maintained a 'thirteen phased intents' count and list
that the phase docs outgrew; both sites now derive by pointer to the phase
docs' Scope sections (adr-9), keeping no static copy that can re-drift.
iss-8 — the out-of-scope enumeration omitted ten current drafts (itd-57..75)
and still included itd-43 (scheduled, moved to planned/ by ADR-34). The list
is regenerated in lockstep with the drafts/ corpus and the derivation command
loses its exclusion set: per ADR-34 a scheduled intent cannot live in drafts/,
so the filesystem is the list.

Assisted-by: Claude:claude-fable-5

* docs: resolve iss-11..iss-14 (minors + nitpick)

iss-11 — agent count 15 -> 16 in the press release, scope page, and
prompt-quality page, each now deferring to the 01-agents.md catalog as the
canonical roster.
iss-12 — the memory docs asserted spc-38/spc-39 capability as shipped while
itd-36 sits in planned/ and nothing Go-built has shipped; the references are
demoted to spec attribution and the surface header defers delivery state to
the intent lifecycle.
iss-13 — stale status narration stripped from brief contracts (per adr-5):
false 'shipped' status cells in the agent catalog corrected to design target
(no agents/ directory exists in this repo), '(spc-N — shipped)' parentheticals
reduced to attribution, dated capture-history prose dropped from the scope
page, and a delivery-state provenance note added to the brief README covering
residual predecessor spc-N references.
iss-14 — the intent-fidelity-reviewer section moved from § 6 to § 7 of
05-intent.md; every deep link and textual reference re-anchored (the § 6
lint-rule reference in intents/README.md verified still correct).

Assisted-by: Claude:claude-fable-5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant