Development record
Patterns Surface Themselves
Press Release
abcd ships
/abcd:dredge— the cross-corpus synthesist that turns the issue ledger into systemic insight. Run it after months of captures have accumulated, and abcd'sissue-synthesistagent clusters open issues across every repo in.abcd/corpus.json, surfacing recurring themes as candidate intent drafts. Three months of captured nitpicks and review findings becomes "nine of your open issues across four repos all touch the same dev-sync race conditions — promote as a single intent?". The thing you were doing in your head is now something the system does for you."abcd gave me a structured ledger but I had to scan it manually to spot patterns," said Maya, autonomous-development practitioner. "Dredge looks at every repo's open ledger together, finds the clusters I'd otherwise miss, and offers each as a candidate intent. The first dredge after six months of captures showed me three systemic patterns I'd been working around individually instead of fixing structurally."
Why This Matters
itd-4 ships /abcd:capture and the structured .abcd/work/issues/ ledger. That's the capture half of the original combined intent. The synthesis half — /abcd:dredge plus the issue-synthesist agent — was deliberately split out because its value is empty until the ledger has accumulated meaningful data. Shipping a synthesist with no ledger to synthesise produces a tool that everyone tries once and nobody returns to.
Once the ledger has months of usage across the corpus repos, the synthesist has something to chew on. The pattern echoes the broader abcd philosophy: ship the capture surface that earns its keep on day one; defer the synthesis surface until there's enough data for synthesis to be more than empty ceremony.
The maritime metaphor lands cleanly here: /abcd:dredge is the cross-corpus counterpart to /abcd:disembark's lifeboat (per-project rescue ↔ cross-corpus latent-value rescue). Three meta-development surfaces total once both are shipped: intent frames product, capture ingests signal, dredge surfaces patterns.
Day-one local subset. The cross-corpus synthesist is deferred until the corpus has scale, but a lightweight single-repo view earns its keep immediately: an abcd capture list --dedupe form renders likely-duplicate captures within one repo at implementation time — the same clustering signal (category, file proximity, similarity) applied to one ledger and shown, rather than synthesised into candidate intents. It is the local, non-agentic subset of this intent, and it pairs with the per-capture form recorded as iss-2608270550201935 (a non-blocking advisory-dedup echo on write) that catches the duplicate one step earlier.
What's In Scope
/abcd:dredgecommand — cross-corpus synthesis, with sub-verbs (bare invocation = status+help only per the universal convention):dredge synth— invokeissue-synthesistagainst open-issue ledgers across all repos in.abcd/corpus.json; writessynthesis-report.{json,md}to.abcd/logbook/dredge/<timestamp>/and surfaces top-N clusters interactively. Flag-shaped modifiers:--repo <path>(limit to a single repo),--since <date>(only consider issues created/updated since the given date)dredge promote <cluster-id>— fold a synthesist cluster into a new intent draft (calls/abcd:intent newwith the cluster summary + bidirectional links to all member issues; setsresolves_issues:reciprocally on the intent)dredge list— show recent synthesis reports from.abcd/logbook/dredge/
issue-synthesistagent — invoked by/abcd:dredge synth:- Reads open-issue ledgers across all repos in
.abcd/corpus.json - Clusters by category, file proximity, semantic similarity, and frontmatter tags
- Outputs
synthesis-report.{json,md}to.abcd/logbook/dredge/<timestamp>/ - Surfaces top-N clusters as candidate intent drafts (operator can promote any via
/abcd:dredge promote <cluster-id>) - Oracle backend chain (same as other agents): host-delegated by default, with the opt-in RepoPrompt adapter and Codex CLI as configured alternatives
- Reads open-issue ledgers across all repos in
- N:1 promotion semantics — a cluster of related issues should fold into a single intent. The bidirectional link convention extends
related_intents: [itd-N]on multiple issues pointing to the same intent, and the intent's frontmatter gainsresolves_issues: [iss-N, iss-NM, iss-NO]reciprocally. The intent lint extends to verify these reciprocally. - Synthesist cadence option — on-demand via
/abcd:dredge synth, or periodic via the existingdev-synccadence (itd-13 covers scheduleddev-sync). Default: on-demand; couple to scheduleddev-syncif itd-13 has shipped. intent-fidelity-reviewerextension — when an intent ships that was promoted from an issue cluster, the reviewer cross-references whether the cluster's open issues actually moved toresolved/. Mismatch = drift finding.
What's Out of Scope
- Cross-repo issue copying. The synthesist reads across the corpus to find patterns, but issues stay in the repo where they were captured. No "promote to a global ledger" behaviour.
- Issue deduplication across repos. Clustering is a synthesis output, not a destructive merge. Two repos can have overlapping issues; the synthesist surfaces the overlap as a finding, not as a forced unification.
- Severity-based prioritisation UI. Severity is frontmatter; no dashboard, no SLA, no triage workflow. The synthesist is the prioritisation surface.
- Real-time issue tracking integration (Linear / GitHub Issues sync). The existing
issue-scoutagent already covers GitHub upstream-issue annotation; sync in the other direction is a separate intent.
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 user runs bare
/abcd:dredge, then the command renders status (last-synthesis timestamp + last-known cluster count) plus the full list of previously-synthesised clusters with member issue count, provenance (which corpus repos contributed), and timestamp — per the universal bare-command-as-render discipline (see02-constraints/04-naming.md). No synthesis runs without an explicit verb. - Given an abcd-installed repo with ≥10 captured issues across the corpus, when the user runs
/abcd:dredge synth, then a synthesis report is written to.abcd/logbook/dredge/<timestamp>/synthesis-report.{json,md}with at least one identified cluster. - Given a synthesis report with cluster
c-1containing 3 member issues, when the user runs/abcd:dredge promote c-1, then/abcd:intent newis invoked with the cluster summary; the resulting intent hasresolves_issues: [iss-A, iss-B, iss-C]; each member issue hasrelated_intentsupdated to include the new intent's ID. - Given the corpus has issues only in repo X, when the user runs
/abcd:dredge synth --repo X, then clusters are limited to repo X's ledger. - Given the user runs
/abcd:dredge synth --since 2026-01-01, when there are 5 issues created before that date and 3 after, then clusters are computed only over the 3 post-date issues.
Boundary with itd-4 (capture)
itd-4 /abcd:capture promote is strict 1:1 (one issue → one intent). itd-25 /abcd:dredge promote <cluster-id> is the N:1 surface (a cluster of N issues → one intent). The two subverbs do not overlap; the user picks based on whether they're working from one issue or from a synthesis cluster.
Boundary with itd-36 (memory unification)
itd-36 ships .abcd/memory/ as the multi-upstream curated knowledge substrate (per the Karpathy LLM Wiki pattern). Dredge synthesis output writes to .abcd/memory/<type>_<domain>_<slug>.md with source.class: dredge_synthesis (registered in itd-36's source-class enum at 05-internals/07-memory.md) — shared destination namespace. The verb stays distinct (per the dredge-pushback in idea-1 R4 review): user moments differ ("look across what we already have" vs "I have a new source"); independent revisit triggers; storage-vs-operation framing prevents surface entanglement. Per-run dredge reports stay at .abcd/logbook/dredge/<ts>/synthesis-report.{json,md} per universal pattern 6.
Revisit triggers
This intent moves from drafts/ to planned/ when ANY of the following happens:
- First synthesis-worthy ledger volume: ≥50 issues across the corpus (synthesis below this floor produces noisy clusters).
- First user-reported pattern miss: a user manually identifies a cross-corpus pattern they wished
/abcd:dredgehad surfaced. - itd-13 (scheduled dev-sync) ships: scheduled sync makes dredge naturally periodic; the coupling decision (auto-couple vs on-demand) becomes concrete.
SOTA
Surveyed on 2026-10-23; sources, evidence tiers and the local fit risks are in the memory-knowledge SOTA note.
- Revisit trigger 1 has fired. This repository alone holds 544 open issue records; the filing-time match's threshold was read off 449 of them on 2026-09-26 (
internal/core/record/match). - Lexical overlap is the strong baseline for same-finding detection. On a six-project benchmark, REP, an information-retrieval detector "proposed a decade ago", beat the deep-learning detectors by 22.3% average RR@10 "for most projects", and Bugzilla's full-text search was "a useful baseline"; data age and tracker choice "cause a significant difference" (Zhang et al., TOSEM). That is duplicate-report detection, an analogue for clustering rather than a measurement of it.
- Cluster, let a model name the cluster, let people review the names. Clio extracts facets, embeds one, runs k-means, keeps clusters above a size floor, has a model write each title and summary, audits them and builds a hierarchy; 94% reconstruction of known categories on synthetic data; $48.81 per 100,000 items (Tamkin et al.). The shape transfers; the embedding step need not at a few hundred records.
- Write-time and batch are two ends of one job. Mem0 judges each new fact against its ten nearest memories as it arrives; abcd has that half shipped (itd-2609212137116617,
duplicates:andrefines:links). Dredge is the retrospective pass over what write-time matching let through. - Source predicts recurrence. Bugs found by code-analysis tools or human review were reopened 0.52 to 0.85 times the baseline, those from system testing or customers 1.12 to 1.46 times (Zimmermann et al., ICSE 2012); a cluster report should carry its members'
source:distribution. - Path 2: native agglomerative clustering over the existing pairwise match score, with complete or average linkage rather than single linkage so every member clears the threshold against the cluster and not only against one neighbour, with a floor of three members, deterministic and explicable, with the host-delegated synthesist confined to naming and the one-line "why now", checked cite-or-drop against member ids;
capture list --dedupeis a render of the same pairs. The seam is the pairwise scorer. No dependency. The independent fit-challenge runs at plan time.
Open Questions
- Synthesist output format. JSON cluster report is mechanical; the human-readable Markdown should answer "what should I look at first?" — what's the right shape? Top-3 clusters with member-issue links and a one-line "why this matters now" per cluster, or something denser?
- Wontfix retention. Do
wontfix/issues feed the synthesist? Probably yes — patterns of "what we keep deciding not to do" are themselves useful signal. But weight differently fromopen/. - Synthesist cadence. If itd-13 (scheduled dev-sync) hasn't shipped, dredge is on-demand only. If itd-13 has shipped, does dredge auto-couple to dev-sync or stay on-demand?
- Cluster confidence reporting. Should each cluster carry a confidence score the reviewer can use to weight findings, or is the user expected to sense-check each cluster manually?
- (SOTA 2026-10-23) Cluster floor and identity. Clio keeps a cluster only above a minimum size; what is the floor here (three members?), and is a cluster's identity across runs its member set, so that a report can say a pattern grew since the last dredge rather than re-discovering it?
Audit Notes
Empty. Populated by intent-fidelity-reviewer when intent moves to shipped/.
Frontmatter
| id | itd-25 |
|---|---|
| type | intent |
| lifecycle | drafts |
| kind | standalone |
| severity | minor |
.abcd/development/intents/drafts/itd-25-dredge-cross-corpus-synthesist.md
open on GitHub ↗ · commit history ↗
References3
Referenced by20
- iss-2609211905340006Dredge synthesis output lands in the memory store as its own source class. itd-36 (closed as delivered on 2026-09-21) asked that the dredge synthesiser (itd-25, still a draft) write its synthesised entries to .abcd/memory/<type>_<domain>_<slug>.md with source.class dredge_synthesis and the per-run provenance the lint reads; dredge does not exist yet, so the memory store has no such class and the lint has no rule for it. Wanted, when itd-25 is planned: the class in the closed enum, the writer in the dredge path, and MS001/MS002 reading it as a cross-class input.related
- iss-2610262031301413itd-25 writes dredge synthesis reports under .abcd/logbook/dredge/, the retired logbook locationrelated
- iss-2610262031315138itd-25's dredge promote calls /abcd:intent new, which the brief says is refusedrelated
- iss-2610262031318900itd-25 designs a plain dredge list sub-verb, which the bare-command-as-render discipline forbidsrelated
- iss-2610262034005768itd-25 extends an 'intent-fidelity-reviewer'; the intent surface names the one agent that owns intent fidelity intent-auditorrelated
- iss-2610262034012499itd-25 grounds dredge's bare status+help in 'the universal convention'; the intent surface says bare-command-as-help is common, not universalrelated
- iss-2610262034017438itd-25 keys the intent side of an issue-to-intent link resolves_issues; the capture surface's promote join writes that side as related_issuesrelated
- iss-2610262037227384itd-25 calls an intent's back-link to its issues resolves_issues; 35-drain reads that same back-link as related_issues.related
- iss-2610262038565943itd-25 writes dredge reports under .abcd/logbook/dredge/; 04-universal-patterns puts dredge output in the local tier's logsrelated
- iss-2610262038572033itd-25 says other agents have RepoPrompt and Codex CLI alternatives; 02-adapters routes only a build lane's two reviews off the hostrelated
- iss-2610262038577903itd-25 calls issue-scout an existing agent; 01-agents lists it in a design roster of which none existsrelated
- iss-2610262040369028itd-25 writes dredge reports to .abcd/logbook/dredge/; the memory chapter puts them in .abcd/.work.local/logs/dredge/.related
- iss-2610262040379523itd-25 calls the intent-side back-edge to promoted issues resolves_issues; the verification matrix calls it related_issues.related
- iss-2610262040388759itd-25's dredge promote calls /abcd:intent new; the skills chapter says the canonical create is /abcd:intent with quoted text.related
- iss-2610262042363456The agent that audits a shipped intent is intent-auditor in itd-1 and intent-fidelity-reviewer in itd-25related
- iss-2610262043297244itd-25's dredge promote calls /abcd:intent new, which itd-2609212130136102 removedrelated
- iss-2610262043303389itd-25 reads every repo listed in .abcd/corpus.json; itd-40 says abcd does not group repos and keeps one registryrelated
- iss-2610262043466977itd-25's dredge promote calls /abcd:intent new; itd-46 replaced the new sub-verb with quoted-text createrelated
- iss-2610262043470447itd-25 says agents are host-delegated by default with RepoPrompt opt-in; itd-6 keeps RP MCP as the preferred first backend in the oracle chainrelated
- itd-26Raid the Open Ocean, Bring the Cargo Home with Papersbuilt on by
mentions12
- dcn-26092900000000112026-09-29 — The product thinker answered the twenty-six Group J rulings (plan or close), J1 to J26 (recorded by lane recGroupJ of autonomous run A, for orchestrator abcd-fc). The answers are kept verbatim in the local-tier file `.abcd/.work.local/scratch/reports/rulings-answered-2609-29.md`, section "Group J", dated 2026-09-29, and are restated here because that file is not committed. PLAN: the installer script becomes a minimal starter with an ownership-checked hand-over, planned as a new intent with its planning interview owed (J2, iss-377, draft itd-2609292106557115); token metering and size classes are planned as one intent (J3, iss-2608301744251874 and iss-2608301856299268), and session token accounting in the history store joins that metering intent (J4, iss-2608220150157508; all three in draft itd-2609292107351737); the sources tooling moves into abcd's core with ingest and consult as abcd verbs (J5, iss-27, whose corpus half itd-76 already delivered), and the backfill of the placeholder source entries is part of that intent (J6, iss-55; both in draft itd-2609292108089653); the grill hands off to an installed external interview skill and falls back to its own (J11, iss-165, draft itd-2609292108373494); an opt-in local-model prompt sanitiser is planned (J14, iss-2608261543489261, draft itd-2609292109005937); decision-to-transcript links are planned, with the anchor kind and the link's home settled in the planning interview owed for draft itd-171 (J16, iss-2608290819228175); the dredge synthesis, its write-ups as their own memory source class, is planned together with draft itd-25, whose planning interview is owed (J19, iss-2609211905340006); one provenance register across ingest and vendoring is planned together with draft itd-26, whose planning interview is owed (J20, iss-2609211905346507); release retention, keeping the newest release per version line, is automated by planning draft itd-70 (J21, iss-282); a rules-backend seam with an opt-in CARL adapter is planned, the native loader staying the default (J22, iss-64, draft itd-2609292109214516); core-owned managed pre-commit gates are planned with draft itd-62 (J23, iss-84); a behavioural end-to-end scenario suite per verb family is planned (J24, iss-48, draft itd-2609292109475690). Every draft stays in drafts/ until a person plans it, and each source issue links its draft and names that planning interview in its deferral. BUILD: the teaching plane, the rules-loader safety domain generated from the hazard registry, is built as a lane, the registry being the single source (J10, iss-151 and itd-103; a code lane owns it). RULED DETAILS: `source_kind` carries both, as two separate labels, one for the tool and one for the route (J13, iss-2608230752354928); the prompt router's removal signal is the full list of active domains every time, a domain's absence meaning it has stopped (J15, iss-2608261550580260); setup offers an outside AI service (for example OpenRouter) at install, skippable, once the API adapter ships (J18, iss-2609081951416843, which waits on the API adapter); the salvage-hook timeout is 120 seconds, the wait must show a counter or a message while it runs and never stall silently, and every per-event timeout is pinned in a test (J25, iss-323). J13, J15 and J25 are carried by code lanes. CLOSE: the quick-tunnel preview protocol is closed unless the need recurs (J26, iss-2608230617385431, wontfix with that reason). PARKED ON A TRIGGER: agent payment protocols are kept under watch, not now, revisited as the protocols mature (J8, iss-138); the findings-only skill waits for the skill format to be versioned and stewarded (J9, iss-139); the disposition worksheet as an intent and a site page waits until after the first study (J17, iss-2609021815529020). DECIDE LATER: the Homebrew tap stays parked (J1, iss-380); pluggable search back ends (J7, iss-26); forge-backed record numbering (J12, iss-2608210737264758).
- dcn-26092900000000202026-09-29 — The product thinker answered the twenty-six Group J rulings (plan or close), J1 to J26 (recorded by lane recGroupJ of autonomous run A, for orchestrator abcd-fc). The answers are kept verbatim in the local-tier file `.abcd/.work.local/scratch/reports/rulings-answered-2609-29.md`, section "Group J", dated 2026-09-29, and are restated here because that file is not committed. PLAN: the installer script becomes a minimal starter with an ownership-checked hand-over, planned as a new intent with its planning interview owed (J2, iss-377, draft itd-2609292106557115); token metering and size classes are planned as one intent (J3, iss-2608301744251874 and iss-2608301856299268), and session token accounting in the history store joins that metering intent (J4, iss-2608220150157508; all three in draft itd-2609292107351737); the sources tooling moves into abcd's core with ingest and consult as abcd verbs (J5, iss-27, whose corpus half itd-76 already delivered), and the backfill of the placeholder source entries is part of that intent (J6, iss-55; both in draft itd-2609292108089653); the grill hands off to an installed external interview skill and falls back to its own (J11, iss-165, draft itd-2609292108373494); an opt-in local-model prompt sanitiser is planned (J14, iss-2608261543489261, draft itd-2609292109005937); decision-to-transcript links are planned, with the anchor kind and the link's home settled in the planning interview owed for draft itd-171 (J16, iss-2608290819228175); the dredge synthesis, its write-ups as their own memory source class, is planned together with draft itd-25, whose planning interview is owed (J19, iss-2609211905340006); one provenance register across ingest and vendoring is planned together with draft itd-26, whose planning interview is owed (J20, iss-2609211905346507); release retention, keeping the newest release per version line, is automated by planning draft itd-70 (J21, iss-282); a rules-backend seam with an opt-in CARL adapter is planned, the native loader staying the default (J22, iss-64, draft itd-2609292109214516); core-owned managed pre-commit gates are planned with draft itd-62 (J23, iss-84); a behavioural end-to-end scenario suite per verb family is planned (J24, iss-48, draft itd-2609292109475690). Every draft stays in drafts/ until a person plans it, and each source issue links its draft and names that planning interview in its deferral. BUILD: the teaching plane, the rules-loader safety domain generated from the hazard registry, is built as a lane, the registry being the single source (J10, iss-151 and itd-103; a code lane owns it). RULED DETAILS: `source_kind` carries both, as two separate labels, one for the tool and one for the route (J13, iss-2608230752354928); the prompt router's removal signal is the full list of active domains every time, a domain's absence meaning it has stopped (J15, iss-2608261550580260); setup offers an outside AI service (for example OpenRouter) at install, skippable, once the API adapter ships (J18, iss-2609081951416843, which waits on the API adapter); the salvage-hook timeout is 120 seconds, the wait must show a counter or a message while it runs and never stall silently, and every per-event timeout is pinned in a test (J25, iss-323). J13, J15 and J25 are carried by code lanes. CLOSE: the quick-tunnel preview protocol is closed unless the need recurs (J26, iss-2608230617385431, wontfix with that reason). PARKED ON A TRIGGER: agent payment protocols are kept under watch, not now, revisited as the protocols mature (J8, iss-138); the findings-only skill waits for the skill format to be versioned and stewarded (J9, iss-139); the disposition worksheet as an intent and a site page waits until after the first study (J17, iss-2609021815529020). DECIDE LATER: the Homebrew tap stays parked (J1, iss-380); pluggable search back ends (J7, iss-26); forge-backed record numbering (J12, iss-2608210737264758).
- iss-2608270550201935Ship an advisory-dedup echo into 'abcd capture': on write, run a NON-BLOCKING similarity scan over open/ issues plus draft intents, and when a strong match is found return it in the capture result (e.g. 'captured iss-N; possible overlap: itd-91, iss-193 — review?') WITHOUT gating the write. This gives the user immediate 'this area is already tracked' reassurance while keeping capture one-line and friction-free — verifier-selects/gates-decide: the tool proposes the overlap, the human disposes (keep / wontfix / promote). Distinct from itd-84's capture-time VALIDATOR (a deterministic pre-pass that decides INTENT decomposition FILE-AS-IS/SPLIT/HOLD, not issue-duplicate detection) and from itd-87 (recurrence-escalation in capture). The deeper cross-corpus combine — merging issue clusters and promoting to intents — is a separate periodic step (e.g. a 'capture list --dedupe' view), not per-capture. Motivated 2026-08-27 by a session that recorded a duplicate of itd-91 and caught it only after the write; until this ships, the documented protocol (agent recall-checks the ledger before recording) is the gate. Candidate for promotion to an intent.
- iss-2608271804189287the .abcd namespace documents lag the tree in four places: .abcd/README.md describes only the three subdirectories and none of the nine tracked root files the binary reads; the config/ directory and its three members are documented nowhere; the brief's canonical layout tree lists corpus.json which does not exist and nothing reads (annotate as the itd-25 design target rather than delete); and both CLAUDE.md and .abcd/README.md misstate .work.local/'s contents (missing reviews/ — the intent-audit receipt outbox — and private-names.txt, the per-machine banlist layer). One documentation sweep, framed as an index pointing at the owning records, not duplicated schemas.
- iss-261026203122680304-naming dates its reserved commands to a later phase; the glossary retires the phase as a unit.
- iss-2610262032061118The naming register still schedules reserved commands by 'a later phase'; itd-2609211913453478 retired the phase as a unit of sequencing.
- itd-1Every Intent Has Acceptance Criteria; Every Audit Verifies Them
- itd-31The Brief and Every Intent Stay Consistent — Or Abcd Tells You Why They Don't
- itd-32Every Audit In Abcd Knows What It Audits, By What, And Against What
- itd-33Multiple Agents Coordinate On Intent And Spec Work Without Duplicating Effort Or Producing Competing Artefacts
- itd-2609212137116617A new capture or draft is matched against the record before it is written
- spc-2609211905174684memory-unification