Development record
Knowledge That Compounds, Not Knowledge That Re-Derives
Closed as delivered on 2026-09-21 on the product thinker's ruling:
/abcd:memory ingest,askandlint, the quotation budgets (MQ001, MQ002), the source-class rules (MS001, MS002), the licence rule (ML001) and--keep-originalshipped in v0.1.0 while this record sat planned with no spec. The three criteria that wait on other records (the dredge synthesiser's output, the shared registry with the code-vendoring path, the lifeboat's restrictive-licence gate on a kept original) are captured as their own issues rather than carried here: iss-2609211905340006, iss-2609211905346507 and iss-2609211905347458.
Packaging framing per adr-28 (supersedes adr-18). The restrictive-licence gate's consumer is the lifeboat (
/abcd:disembark), future/inert at launch: the curated release excludes.abcd/**wholesale, so/abcd:launchnever evaluates what the gate guards. The canonical framing lives in the brief (05-internals/09-provenance-substrate.md § 4,07-memory.md § 4,04-surfaces/04-launch.md § 2).
Press Release
abcd ships
/abcd:memory— a per-voyagecurated knowledge substrate that compounds across sessions instead of being re-derived from scratch every conversation. Researchers and engineers running avoyageunder abcd can drop external sources (PDFs, transcripts, articles, talks) into thevoyage, and abcd reads them, distils them into typed entity/topic pages with full citation, and discards the original by default. The same.abcd/memory/namespace also receives synthesised principles from session memory (existing behaviour), cross-references from oracle reviews and.abcd/work/notes, and synthesis output from/abcd:dredge(itd-25, a separate intent). New sub-verb/abcd:memory ask <question>queries the substrate and returns synthesis with citations;/abcd:memory lintenforces quotation budgets, licence declarations, and cross-source provenance hygiene. The pattern is theKarpathy LLM Wiki(April 2026) — "compile once, query repeatedly" replacing RAG-shaped re-derivation."Last quarter I'd open a session, paste the same ten paragraphs of background context, and lose half the conversation rebuilding shared ground," said Carol, technical lead. "Now I point the agent at
.abcd/memory/and we pick up where we left off — and I can see exactly where each claim came from. The default-no-original rule means I can ingest a 200-page paper without worrying about copyright; the lint catches when a derivative page quotes too much. Nothing I've ever paid for accidentally ends up in a public repo."
Why This Matters
Today's .abcd/memory/ is the receiving end of a single upstream — vendor session memory (Claude / opencode), distilled by the memory writer into domain-grouped principle pages. That's the per-project compounding-curated agent-experience layer. Useful, but narrow.
There's a real gap: per-project durable knowledge has multiple legitimate upstreams, not just session memory. Research-shaped projects ingest external papers; mixed-licence projects ingest internal notes alongside paywalled academic sources; long-running projects accumulate patterns from oracle reviews and the issue ledger. Today the user has no abcd surface for any of this — they paste context into chat, lose it at session end, and re-derive it next session. RAG patterns help but re-derive synthesis on every query. The Karpathy LLM Wiki pattern (April 2026, gist 5k+ stars) names a different shape: synthesis happens at ingest, not query — cross-references pre-built, contradictions flagged during maintenance.
The reframe lands cleanly because abcd doesn't need a new namespace. .abcd/memory/ already exists as the per-project compounding-curated artefact. Widening its upstream funnel from "vendor session memory only" to "session memory + external sources + reviews + notes + dredge synthesis + spec-extracted theory" is structurally smaller than creating a new top-level namespace — and avoids the visibility-rule violations that would come with a separate .abcd/knowledge/ directory (per the locked decision in 05-internals/03-configuration.md § 1: "no exceptions to the visibility rule").
Default-no-originals is what makes ingest copyright-safe. External sources may be paywalled, NDA'd, or under restrictive licences. Storing the original creates a copyright-laundering vector. Default-no-originals + bounded per-page quotation (≤5%, no contiguous span >150 words) + cumulative source-coverage lint (≤25% deduplicated coverage across all pages citing the same source, span-level dedup) closes the laundering vector for the common case. --keep-original is the explicit opt-in for sources the user owns or has clear redistribution rights for; the restrictive-licence gate (consumed by the lifeboat /abcd:disembark, per adr-28) then refuses to surface anything under .abcd/memory/sources/ unless an explicit allowlist entry exists.
Loot substrate reuse compresses cost. itd-26 /abcd:loot (per itd-26) and /abcd:memory ingest need the same machinery: licence detection, citation generation, source-hash registry, the lifeboat's restrictive-licence gates. This intent ships the substrate as a separable component spec at 05-internals/09-provenance-substrate.md. itd-26's verb sits on top — no re-implementation, no fragile bespoke licence layer.
What's In Scope
/abcd:memorycommand with sub-verbsingest/ask/lint. Bare invocation renders state per the universal bare-command-as-render discipline. Surface contract:04-surfaces/07-library.md, the memory verbs having merged into/abcd:library(itd-2610090831227812). Substrate spec:05-internals/07-memory.md.- Schema extension on
.abcd/memory/(NOT migration): three new conventional sibling files (index.mdgenerated catalog,log.mdappend-only ingest history,contradictions.mdcurator-surfaced register) plus typedsource:frontmatter on every memory page. Existing flat-named pages preserved; schema extends in place. - Typed
source:frontmatter with closed-enum source-class taxonomy:session_memory/external_pdf/external_transcript/external_article/oracle_review/work_notes/issue_ledger/dredge_synthesis/spec_modification_grammar/modification_grammar. Every external source carriescitation+licence+source_hash+ingested_at. - Default-no-originals +
--keep-original: ingest reads → distils → discards by default; flag opts into storage at.abcd/memory/sources/<sha256>.<ext>; the lifeboat licence gate refuses to surfacesources/files without an explicit allowlist entry. - Quotation budgets, two layers: per-page (
MQ001: ≤5% per page, no >150-word contiguous span) + cumulative source-coverage (MQ002: ≤25% deduplicated coverage across all pages citing onesource_hash, span-level dedup, configurable threshold). - Source-class lints:
MS001(advisory: single-source-class synthesis is low cross-validation),MS002(blocks: cross-class synthesis withoutweighting_notefield),ML001(blocks:external_*page missinglicencefield;unknownis acceptable but must be explicit). - Curator role on
principle-distiller(existing agent; itd-31 precedent — agent count stays 15). Inputs extended: external-source ingest pipeline added alongside existing session-memory + reviews + work-dir + code-rescuer inputs. New output mandate: typedsource:frontmatter on every emitted page. New lint pass:MQ/MS/MLcodes. - Provenance/licence substrate at
05-internals/09-provenance-substrate.md— separable spec; SPDX licence detection; citation generation; source-hash registry at.abcd/memory/.sources_index.json(regenerable per the lifecycle taxonomy); the lifeboat's restrictive-licence gates. Shared with itd-26 loot. - Karpathy citation in
05-internals/07-memory.md(component description) +research/related-work.md(prior-art table). NOT in01-product/03-mental-model.md(per idea-1 R5 review: mental model is for axes, not components; six-week-old citations don't belong in the project's most-stable file). - Brief edits: artefact-lifecycle taxonomy added to
05-internals/04-universal-patterns.md § 8(regenerable / append-only / compounding-curated). Reserved-vocabulary entry in02-constraints/04-naming.mdforsource.class+ lifecycle classes.
What's Out of Scope
- A separate
.abcd/knowledge/namespace. Initially proposed (idea-1 pre-review draft); killed by RP review (visibility-rule lock; namespace-creep). Memory unification at the destination (existing.abcd/memory/namespace) is the right shape; new top-level was wrong. - Schema migration of existing flat-named pages. Current
<type>_<domain>_<slug>.mdalready encodes Karpathy's three axes (type = page class; domain = topic; slug = entity ID). Renaming to nested directories would be cosmetic and would touch every existing memory page; not justified. /abcd:dredgeabsorption./abcd:dredge(itd-25) stays a distinct verb. Its synthesis output writes to.abcd/memory/<type>_<domain>_<slug>.mdwithsource.class: dredge_synthesis(shared destination namespace), but the verb is not folded into/abcd:memory. User moments differ (dredge = "look across what we already have"; ingest = "I have a new source"); folding into one surface mismatches the user's mental grouping. Independent revisit triggers preserved.- Cross-project frontier sharing. Per-project in this intent (privacy + curation overhead). Cross-project sharing surfaces as a fresh idea when triggers fire (≥3 projects with non-trivial accumulated knowledge AND user-driven request).
- Close-paraphrase detection. The quotation lint catches quotation, not close paraphrase. A page that paraphrases an entire source at 100% coverage in its own words is a derivative work and isn't fair-use protected. This intent acknowledges this as a documented limitation in
05-internals/07-memory.md § 5; semantic-similarity infra to detect paraphrase is a separate intent. - Auto-classify the upstream. This intent requires the user to invoke
/abcd:memory ingest <path>explicitly. Auto-detection (e.g., scanning~/Downloads/*.pdffor ingest candidates) is deferred — a separate intent if friction proves real. - MCP server for runtime memory editing. Other knowledge frameworks ship MCP servers for
add_page,merge_pages, etc. This intent ships JSON-on-disk + CLI surface only; the curator agent (principle-distiller) edits via standard file-edit tools. MCP integration is deferred if friction is real.
Mechanism
None stated.
Scope Conditions
None stated.
Acceptance Criteria
BDD format, per itd-1 acceptance gates. These gates are checked by
intent-fidelity-reviewerRole 1 when this intent moves toshipped/.
- Given an external source with declared SPDX licence in a
LICENSEfile, when the user runs/abcd:memory ingest <path>, then the resulting memory page(s) carrysource.licence: <spdx-id>AND the original is NOT stored at.abcd/memory/sources/AND a registry entry exists at.abcd/memory/.sources_index.json[<sha256>]whoseconsumersmap contains thememorykey. - Given an external source ingested without
--keep-original, when the user later runs/abcd:memory ask <question>referencing that source, then the answer cites the source by(class, citation, source_hash)but never reproduces the original; if the original is needed for re-distillation, the user is prompted to re-ingest. - Given an external source ingested with
--keep-original, when/abcd:disembarkruns the restrictive-licence gate, then the gate refuses to surface.abcd/memory/sources/<sha256>.<ext>unless.abcd/launch-allowlist.jsonexplicitly names it (the allowlist re-includes files into the gate's own evaluation input, never into the launch payload — adr-28). - Given a memory page with
source.class: external_pdfand ≥150-word contiguous quotation, when/abcd:memory lintruns, then the lint emitsMQ001and points at the offending span. - Given N memory pages collectively citing one
source_hashwith cumulative deduplicated coverage ≥25%, when/abcd:memory lintruns, then the lint emitsMQ002and refuses any further quotation block from that source until coverage drops below the threshold (via summarisation rewrite of existing pages). - Given a memory page with
source.class: session_memoryonly (no cross-class inputs), when/abcd:memory lintruns, then the lint emitsMS001(low cross-validation; advisory only — does not block). - Given a memory page mixing
session_memory+external_pdfsources without aweighting_notefield, when/abcd:memory lintruns, then the lint emitsMS002and blocks until the weighting note is added. - Given an external source ingested without a
licence:field, when/abcd:memory lintruns, then the lint emitsML001and blocks until the licence is declared (unknownis acceptable but must be explicit). - Given an existing pre-itd-36 project with flat-named memory files, when
/abcd:ahoyruns after itd-36 ships, then the existing files are NOT renamed;index.mdis generated over them;source.class: session_memoryis backfilled as the default. - Given dredge synthesis output (itd-25), when dredge runs, then the dredge agent writes its synthesised entries to
.abcd/memory/<type>_<domain>_<slug>.mdwithsource.class: dredge_synthesisAND the per-run report stays at.abcd/logbook/dredge/<ts>/. - Given the same source content is ingested by both
/abcd:memory ingest(as documentation) and/abcd:loot(as code, per itd-26), when both have run, then the registry has one entry withingest_count: 2whoseconsumersmap holds both thememoryandlootkeys (memory and loot share one substrate registry). - Given the lifeboat's gated payload includes a file with
citation.licence: GPL-3.0AND the project is being published as MIT, when/abcd:disembarkruns the restrictive-licence gate, then the gate refuses with a licence-mismatch error AND lists the offending file. Override via--accept-licence-risklogs the override in the disembark report. - Given this intent's cost-discipline boundary, when a promotion proposes adding
known_failure_modes(or any other dynamic-state field) to memory frontmatter, then the proposal is rejected as scope creep — those fields belong to other intents (Frontier Awareness, per a separate intent, forknown_failure_modes).
Implementing specs
itd-36 was implemented across two specs of the predecessor store; those ids are
preserved below as history. The native spec store reuses both numbers for other
specs (live spc-38 is itd-136's record explorer, live spc-39 itd-137's
relationship chart), so each carries the predecessor-store qualifier. The
frontmatter spec_id records the native spec, spc-2609211905174684, the
record catch-up that covers the write core and the quality gate together.
Historical index:
- spc-38 (predecessor store; primary) —
/abcd:memorywrite core (the memory substrate, ingest, registry). - spc-39 (predecessor store) —
/abcd:memory lintquality gate (quotation-budget / licence / provenance lint).
Ship gate — adversarial worked examples
Per the idea-1 R5 review: the push replaces "≥3 projects in anger" (unachievable pre-ship) with three adversarial worked examples demonstrated before itd-36 is closed. Confirmatory examples are not enough; pick projects where ingest might fail:
- Research-shaped project — heavy external PDFs, papers, talks. Test: does the synthesis stay coherent across 20+ external sources? Does the cumulative coverage lint trigger correctly? Are entity/topic pages distinguishable from a stack of PDF summaries?
- Tooling project (e.g., abcd itself dogfooding) — almost no external sources; mostly session memory + reviews + notes. Test: does the schema feel cluttered with
source.class: session_memorydefaults? Doesindex.mdprovide value when most pages are principle-shaped? - Mixed-licence project — open-source docs + proprietary internal notes + paywalled academic sources. Test: do the licence gates and quotation budgets behave correctly? Does the lifeboat licence gate correctly refuse to surface proprietary content under
--keep-original?
If all three produce coherent .abcd/memory/ outputs, this intent ships. If one produces sprawl or fails the licence gates, scope is reduced and the failed example becomes the primary debug target.
Decisions
Ruled by the product thinker on 2026-09-21: close as delivered; the remainders become issues so they are not forgotten.
Open Questions
None open; the four this record carried were operational and are answered by what shipped (the persona quote's role stands as written; the lint codes are the ones the package carries; ingest takes one source per call; the coverage index is rebuilt on demand).
Audit Notes
Fidelity review — receipt rcp-f3f5495f519e (verifier intent-auditor claude-fable-5-1).
Provenance: intent-auditor@claude-fable-5-1 · rubric_hash sha256:effa65b3e9e88ff29433b443ec2be159522a8b0b71cf1434526514aa61edb13e · prompt_hash sha256:fe668f0ff8a49b54b541d71193702b9a2e7a70f0834d839d33ae89ed0ecdb3e0 Input attestations: diff:internal/core/memory, internal/surface/cli, commands/memory.md and .abcd/work/issues/open at chore/audit-run-a-1 80b44890 (git ls-tree -r; spc-2609211905174684 closed with criteria 3, 10, 11, 12 declared out of scope)@sha256:ac58bb5ee41ee25ad15be29a66180b35651db93a7b764206dcbbf6361f98ce0f;
Acceptance rollup: MET 5 · MET_WITH_CONCERNS 4 · NOT_MET 4 · INCONCLUSIVE 0
Per-criterion verdicts:
- ac-1 — MET: DetectLicence reads an SPDX header, then a manifest or LICENSE file, and ingest writes the result as the page's licence; the original is copied under sources/ only when KeepOriginal is set; the registry at .abcd/memory/.sources_index.json is keyed by content hash and its entry's consumers map is written under the memory key evidence: internal/core/memory/provenance.go:302 — "// DetectLicence detects the licence of a source. Priority: in-file SPDX header," evidence: internal/core/memory/ingest.go:227 — "if req.KeepOriginal {" evidence: internal/core/memory/provenance.go:46 — "return filepath.Join(Dir(repoRoot), ".sources_index.json")" evidence: internal/core/memory/ingest.go:170 — "memoryConsumer, _ = consumers["memory"].(map[string]any)" evidence: internal/core/memory/ingest.go:205 — "ContentHash: contentHash, Consumer: "memory", SourceClass: sourceClass,"
- ac-2 — MET_WITH_CONCERNS: ask returns AskCitation values carrying class, citation and source_hash copied from the page's source block, and reads only distilled pages, never a kept original; the concern is that no path in ask prompts a re-ingest when the original is needed — the only re-ingest suggestion in the package is lint's MQ003 fix text
evidence: internal/core/memory/ask.go:30 — "type AskCitation struct {"
evidence: internal/core/memory/ask.go:33 — "SourceHash string
json:"source_hash"" evidence: internal/core/memory/lint.go:446 — "fix := "Re-ingest the source (or backfillsource_token_countin.sources_index.json)."" - ac-3 — NOT_MET: disembark packs the record families by path and reads neither source.licence nor a kept original, so nothing refuses to surface .abcd/memory/sources/< sha256>.< ext> against the launch allowlist; the spec declares criterion 3 out of scope and the gap is the open issue iss-2609211905347458 evidence: .abcd/work/issues/open/iss-2609211905347458-the-lifeboat-s-restrictive-licence-gate.md:16 — "The lifeboat restrictive-licence gate does not read a kept memory original." evidence: .abcd/development/specs/closed/spc-2609211905174684-memory-unification.md:44 — "criteria 3,"
- ac-4 — MET: the quotation budget's MaxContiguousQuoteWords is 150 and lint emits MQ001 at the offending span's line when a contiguous quoted span exceeds it, with a test on the budget evidence: internal/core/memory/coverage.go:44 — "MaxContiguousQuoteWords: 150," evidence: internal/core/memory/lint.go:432 — "l.emit("MQ001"," evidence: internal/core/memory/memory_test.go:326 — "func TestLintQuotationBudgetMQ001(t *testing.T) {"
- ac-5 — MET_WITH_CONCERNS: the corpus pass computes deduplicated cumulative coverage per source hash and emits MQ002 as a blocker at or over the 25% CumulativeBlockPct, which fails the lint's exit until pages are rewritten; the concern is that only unambiguous single-source coverage blocks — the same coverage driven by ambiguous multi-source attribution is capped at warn — and the refusal is the blocker exit rather than a per-quotation-block refusal evidence: internal/core/memory/coverage.go:47 — "CumulativeBlockPct: 0.25," evidence: internal/core/memory/lint.go:539 — "Code: "MQ002", Severity: "blocker", File: indexPath," evidence: internal/core/memory/lint.go:546 — "Code: "MQ002", Severity: "warn", File: indexPath,"
- ac-6 — MET: a page whose sources resolve to one class emits MS001 at severity info, which the exit contract says never affects exit evidence: internal/core/memory/lint.go:61 — ""MS001": "info"," evidence: internal/core/memory/lint.go:352 — "l.emit("MS001"," evidence: internal/core/memory/lint.go:727 — "Exit contract: blockers exit nonzero; warnings are curator-advisory (exit 0, non-blocking); infos never affect exit."
- ac-7 — MET: a page mixing source classes with no weighting_note emits MS002 at severity blocker, so the lint exits non-zero until the note is added evidence: internal/core/memory/lint.go:62 — ""MS002": "blocker"," evidence: internal/core/memory/lint.go:359 — "l.emit("MS002","
- ac-8 — MET: an external source with no licence field emits ML001 at severity blocker on both the single-source and the plural-sources shapes, the message states that an explicit unknown is acceptable and a missing field is the violation, and the schema refuses an empty licence string; tests cover the plural-class and whitespace shapes evidence: internal/core/memory/lint.go:63 — ""ML001": "blocker"," evidence: internal/core/memory/lint.go:385 — "l.emit("ML001"," evidence: internal/core/memory/schema.go:182 — "licence must be a non-empty string (explicit 'unknown' is acceptable)" evidence: internal/core/memory/licence_plural_classes_test.go:44 — "func TestLicenceGateReadsPluralSourceClasses(t *testing.T) {"
- ac-9 — MET_WITH_CONCERNS: backfillLegacy rewrites a flat pre-itd-36 page's frontmatter in place with source.class session_memory and never renames the file, and the bare verb renders index.md over the pages it finds; the concern is the trigger — the criterion names /abcd:ahoy, and ahoy has no memory step, so the backfill runs when a memory verb touches the store evidence: internal/core/memory/writer.go:481 — "func backfillLegacy(mem string) ([]string, error) {" evidence: internal/core/memory/schema.go:41 — "const backfillSourceClass = "session_memory"" evidence: internal/core/memory/bare.go:93 — ""index.md": RenderIndex(infos)," evidence: internal/core/memory/backfill_preamble_test.go:120 — "func TestBackfillLegacyStillBackfillsGenuineLegacyPages(t *testing.T) {" evidence: internal/core/ahoy/gitignore.go:39 — ""public": {"/.abcd/", "/memory/"},"
- ac-10 — NOT_MET: no dredge synthesiser writes dredge_synthesis pages into the memory store; the spec declares criterion 10 out of scope and the gap is the open issue iss-2609211905340006 evidence: .abcd/work/issues/open/iss-2609211905340006-dredge-synthesis-output-lands-in-the.md:3 — "id: "iss-2609211905340006"" evidence: .abcd/development/specs/closed/spc-2609211905174684-memory-unification.md:45 — "10, 11 and 12 are the out-of-scope items"
- ac-11 — NOT_MET: the registry is written by memory ingest alone; no loot consumer shares it and no ingest_count of 2 with both keys can arise; the spec declares criterion 11 out of scope and the gap is the open issue iss-2609211905346507 evidence: .abcd/work/issues/open/iss-2609211905346507-one-registry-entry-for-a-source-ingested.md:3 — "id: "iss-2609211905346507"" evidence: internal/core/memory/ingest.go:205 — "ContentHash: contentHash, Consumer: "memory", SourceClass: sourceClass,"
- ac-12 — NOT_MET: no disembark gate compares a citation's licence with the project's, and no --accept-licence-risk override exists anywhere under internal/; the spec declares criterion 12 out of scope and the open issue iss-2609211905347458 names the GPL-3.0-against-MIT refusal as wanted evidence: .abcd/work/issues/open/iss-2609211905347458-the-lifeboat-s-restrictive-licence-gate.md:16 — "refuse a gated payload carrying a GPL-3.0 citation when the project publishes as MIT"
- ac-13 — MET_WITH_CONCERNS: the page schema fails closed on any key outside it, so a known_failure_modes field cannot enter memory frontmatter without a schema change; the concern is that the criterion describes a proposal-review boundary, and no gate reviews proposals — the schema is the only mechanical form of the rejection evidence: internal/core/memory/schema.go:425 — "DistilledPage carries unknown key(s) %v — the boundary fails closed on keys outside the schema"
Gap audit:
- honoured:
- ingest detects the licence, keeps no original unless asked, and registers the source under the memory consumer evidence: internal/core/memory/ingest.go:227 — "if req.KeepOriginal {"
- the five lint codes with their promised severities evidence: internal/core/memory/lint.go:58 — ""MQ001": "warn","
- legacy flat pages are backfilled in place, never renamed evidence: internal/core/memory/writer.go:481 — "func backfillLegacy(mem string) ([]string, error) {"
- diverged:
- MQ002 refuses any further quotation block from an over-budget source evidence: internal/core/memory/lint.go:546 — "Code: "MQ002", Severity: "warn", File: indexPath,"
- the backfill runs under /abcd:ahoy evidence: internal/core/memory/bare.go:93 — ""index.md": RenderIndex(infos),"
- ask prompts a re-ingest when the original is needed
evidence: internal/core/memory/lint.go:446 — "fix := "Re-ingest the source (or backfill
source_token_countin.sources_index.json).""
- missing:
- the disembark restrictive-licence gate over kept originals and licence mismatches (criteria 3 and 12) evidence: .abcd/work/issues/open/iss-2609211905347458-the-lifeboat-s-restrictive-licence-gate.md:16 — "The lifeboat restrictive-licence gate does not read a kept memory original."
- dredge synthesis pages in the memory store (criterion 10) evidence: .abcd/work/issues/open/iss-2609211905340006-dredge-synthesis-output-lands-in-the.md:3 — "id: "iss-2609211905340006""
- one registry shared by memory and loot (criterion 11) evidence: .abcd/work/issues/open/iss-2609211905346507-one-registry-entry-for-a-source-ingested.md:3 — "id: "iss-2609211905346507""
References
- Full assessment in a local working note (unmigrated), with 5-round review trail (chat
adversarial-review-llm-w-4970CE); pre-review framings preserved in chat record. 05-internals/07-memory.md— substrate spec (page-class enum, source classes, curator behaviour, lifecycle class).05-internals/09-provenance-substrate.md— provenance/licence subsystem shared with itd-26 loot.04-surfaces/07-library.md— surface contract for/abcd:memory, now the memory verbs of/abcd:library.research/related-work.md § Karpathy LLM Wiki— pattern source.itd-1-acceptance-gates.md— companion discipline; this intent's acceptance criteria conform to its Given-When-Then shape.itd-37-modification-grammar.md— companion discipline; ships alongside itd-36 (page-classesspec_modification_grammar+modification_grammarare part of itd-36's source-class enum).itd-25-dredge-cross-corpus-synthesist.md— sibling intent; writes to.abcd/memory/withsource.class: dredge_synthesis; verb stays distinct (storage vs operation per dredge-pushback in idea-1 R4).itd-26-loot-oss-vendor.md— sibling intent; consumes the same provenance/licence substrate this intent ships.
Grounds
- pursued: the record is being closed for work v0.1.0 carried, so that the store's state matches what ships and the release cut stops carrying a planned intent whose code is on main; shown wrong if the delivered verbs are found not to meet the criteria this record keeps
Frontmatter
| id | itd-36 |
|---|---|
| type | intent |
| lifecycle | shipped |
| kind | standalone |
| severity | major |
.abcd/development/intents/shipped/itd-36-memory-unification.md
open on GitHub ↗ · commit history ↗
References1
- adr-28One repository, a curated release artifact — no dev→public mirrorrelated
Referenced by20
- adr-13Durable memory writes — single-writer, atomic-rename crash modelrelated
- adr-32The issue ledger is working-tier data, not authored recordrelated
- adr-2610141646523373Ingested pages are private by default and reach the project only by a person's promotionrelated
- iss-2610262032046139The register reserves `voyage` for the operator-level operations namespace; itd-36 uses `voyage` to mean a project abcd manages.related
- iss-2610262033155666itd-36, closed as delivered, has the lifeboat licence gate refusing to surface kept originals; the launch chapter says that restrictive-licence gate is future and inertrelated
- iss-2610262034535349itd-36 calls bare-command-as-render a universal discipline; the intent surface page says it is a common convention, not a universal one.related
- iss-2610262034587290itd-36 says the lifeboat licence gate refuses to surface kept originals; the library surface page says that gate is not built and the ingest never refuses on a licence.related
- iss-2610262038000309itd-36 ships /abcd:memory as the ingest, ask and lint knowledge substrate under .abcd/memory/; the memory chapter's /abcd:memory keeps agents' memory notes with add, list and remove.related
- iss-2610262039522985`/abcd:memory` is itd-36's curated knowledge store with `ingest`, `ask` and `lint`, and also the README's command for short lessons agents keep.related
- iss-2610262039527135itd-36 gives `principle-distiller` a curator role over memory ingest from external sources; 01-agents lists it as feeding only `disembark principles`.related
- iss-2610262041468809The provenance chapter says the source-hash registry is durable and only partly regenerable; itd-36 scopes it as regenerable.related
- iss-2610262041476159/abcd:memory names the memory-note command in the glossary, but itd-36 names the curated knowledge substrate with ingest, ask and lint.related
- iss-2610262041481549The voyage glossary entry forbids using voyage for a project; itd-36 uses voyage to mean the project a researcher runs under abcd.related
- iss-2610262041504223The internals index counts eighteen shipped agent prompts; itd-36 says the agent count stays at 15.related
- iss-2610262044356372'memory' names the curated knowledge namespace .abcd/memory/ and also the agent memory-notes file .abcd/memory.jsonrelated
- itd-25Patterns Surface Themselvesbuilt on by
- itd-26Raid the Open Ocean, Bring the Cargo Home with Papersblocks
- itd-37Every Spec Externalises How It Should And Shouldn't Be Modifiedbuilt on by
- itd-2610091918433290Agents keep memory notes with /abcd:memory, recalled when they matterrelated
- spc-2609211905174684memory-unificationimplemented by
mentions37
- dcn-26070800000000142026-07-08 — itd-37's itd-36 edge downgraded blocked_by → builds_on: the
- dcn-26082100000000042026-08-21 — Bug-hunt round 6, branch bughunt-b/round-6. Baseline (make preflight
- iss-12memory shipped versus planned is ambiguous: docs say spc-38/spc-39 shipped, but itd-36 lives in planned and intents README says shipped is empty until Go capabilities ship.
- iss-18phase-order violation: Phase 0 scopes itd-37 whose declared blocker itd-36 is Phase 2; split the hard-on-half edge (capture half vs memory-routing half) or reschedule
- iss-23itd-36 is partially superseded by adr-28 (launch-gate framing rewritten); reconcile body with the ADR before its spec plans
- iss-27corpus tooling graduates into the Go core: the sources-corpus contract (per-source folders with location-as-classification, CSL-JSON metadata, append-only provenance ledger, banlist projection) is proven by the user-tier script MVP; absorb it as a native abcd sources/ingest verb family, converging with the itd-36 provenance substrate (internal/core/provenance: licence detection, citation generation, source-hash registry) rather than porting standalone. The scripts remain the reference implementation until the native verbs are wired; /abcd:consult and /abcd:ingest keep one surface across the swap.
- 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.
- iss-2609211905346507One registry entry for a source ingested as documentation and vendored as code. itd-36 (closed as delivered on 2026-09-21) asked that the same source content ingested by memory ingest and by the code-vendoring path (itd-26, loot, still a draft) share one provenance registry entry with an ingest count of two; the vendoring path does not exist, so the registry has one writer and no count. Wanted, when itd-26 is planned: the registry keyed by source hash across both paths, the count, and one licence declaration read by both.
- iss-2609211905347458The lifeboat restrictive-licence gate does not read a kept memory original. itd-36 (closed as delivered on 2026-09-21) asked that disembark refuse to surface .abcd/memory/sources/<sha256>.<ext> (an original kept with --keep-original) unless the launch allowlist names it, and refuse a gated payload carrying a GPL-3.0 citation when the project publishes as MIT; the memory pages carry source.licence today, and disembark packs the record families by path without reading that field. Wanted: the disembark gate reads source.licence on memory pages and the kept originals, refuses a restrictive licence against the project licence, and names the allowlist that admits one.
- 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-261025221452602707-library.md:435-438 says itd-36 is non-decomposable and 'a partial ship is not meaningful'; itd-36 shipped with ac-3 and ac-12 NOT_MET (itd-36-memory-unification.md:140, :175) and without the curator role the paragraph says the sub-verbs need (07-library.md:413).
- iss-261025221539538207-memory.md:42 says source.class is backfilled 'on first /abcd:ahoy after itd-36 ships'; itd-36:163 records that ahoy has no memory step and that the backfill runs when a memory verb touches the store
- iss-2610262031003182/abcd:memory names the itd-36 curated memory substrate with ingest/ask/lint in the tradeoffs record, and a separate memory-notes store with add/list/remove in the memory chapter
- iss-261026203243169207-memory relies on the first /abcd:ahoy after itd-36 backfilling memory pages' source class; ahoy's detection and apply passes carry no such step
- iss-2610262032580449itd-37 extends principle-distiller into a curator that writes memory pages from specs when they complete; disembark says its lifeboat agents, principle-distiller among them, read the packed lifeboat's files
- iss-2610262034090653itd-37 has principle-distiller, as itd-36's role-extended curator, extract each spec's Modification Grammar into memory pages at spec completion; the library surface says that curator role is not built
- iss-2610262034120625itd-26 builds loot's refusing licence check on itd-36's shared substrate, launch licence gate included; the library surface says that gate is not built and ingest never refuses on a licence
- iss-2610262034370169itd-39's hook queries a user-scope memory store at ~/.abcd.noindex/memory/; the library chapter lists user-scope memory outside the repo as not built.
- iss-2610262035280605The decide chapter says a decision record is never edited; the lifecycle taxonomy puts the decisions folder in the compounding-curated class, whose pages are modified, contradicted and deprecated.
- iss-2610262040403877itd-26 calls the substrate's knowledge consumer /abcd:memory ingest; the provenance substrate calls it /abcd:library ingest.
- 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-39abcd Surfaces the Right Memory at the Right Moment
- itd-89Capture the Session You Just Had, Because You Cannot Capture It Later
- itd-136Alice opens the record explorer and reads the whole development record — every decision, intent, spec and issue as a page, with contributors and references — without reading YAML on GitHub
- itd-137Maya sees how every decision connects — one relationship chart with a date coil and a links-only layout, and a five-lane genealogy of the record over time
- itd-2610090831227812A person who types `/abcd:` sees the commands people use
- itd-2610141646126492A librarian turns sources into a quoted reading pack
- itd-2610141646467500Ingested pages stay private until a person promotes them
- itd-2610142116477426A research question becomes a shared, citable note
- script-first-mvpScript-first MVP
- spc-4start-the-transcript-clock
- spc-38alice-opens-the-record-explorer-and-reads-the-whole-developm
- spc-39maya-sees-how-every-decision-connects-one-relationship-chart
- spc-2610111627213138memory-recall