Development record
Raid the Open Ocean, Bring the Cargo Home with Papers
Press Release
abcd makes it fun and responsible to vendor code from public OSS repositories. A new
/abcd:lootcommand clones selected files from a GitHub repo into the consuming project'svendor/<source>/directory, records full provenance — origin URL, licence text, commit SHA, files taken, rationale — into.abcd/work/loot/<source>.md, and refuses to proceed when the licence is incompatible with the consuming project's declared licence stance. The pirate verb is intentional: "loot" prompts the licence-check reflex that "import" or "vendor" wouldn't, while the structured provenance trail means future you (or future auditors) can always answer "where did this code come from, why is it ours now, and are we allowed to keep it?"."I kept finding small, perfect snippets in OSS repos — a 30-line scheduler here, a clever retry-with-jitter there — and the choice was always between adding a heavy dependency for one function or copy-pasting and forgetting where it came from," said Bob, full-stack engineer. "I run
/abcd:loot https://github.com/example/scheduler --files src/jitter.pyand abcd vendors the file, writes a provenance card with the MIT licence text inline, and commits everything as one operation. Six months later I can run/abcd:lootand see every external bit I've absorbed, with SHAs and licences. The name made me smile, then made me actually read the LICENSE file."
Why This Matters
Three patterns repeat across abcd-managed projects:
- Useful OSS snippets get copy-pasted without provenance. A clever helper from a CC0 repo and a slightly-rewritten function from a GPL repo end up looking identical in the consuming codebase. By the time licence questions arise, the trail is cold.
- Heavy dependencies are pulled in for tiny needs. Adding
lodashfor one utility, orrequestsfor one HTTP call, because the alternative ("copy 30 lines, attribute properly") feels like more work thannpm install. abcd's other principles (sovereignty, committed artefacts, structured ledgers) point toward vendoring — but the tooling doesn't make vendoring easy enough to compete with package managers. - The verb shapes the behaviour.
importandvendorare mechanical verbs that don't prompt any reflexive consideration.lootcarries a faint "are you sure you have rights to this?" undertone that pulls licence-checking up from "thing I should probably do" to "thing the verb is asking me about". Playfulness is doing real compliance work.
This intent ships the missing surface: a single command that makes the right thing (vendor with full provenance + licence verification) easier than the wrong thing (copy-paste-and-forget or add-a-package-for-one-function). The maritime metaphor pairs cleanly with /abcd:dredge (own-corpus salvage) — loot is the public-corpus counterpart, deliberately raid-coded rather than salvage-coded because the action genuinely is opportunistic gathering from outside, not rescue from within.
This is also a chance to formalise the vendor/ convention abcd projects should use: vendored OSS code lives at vendor/<source>/, with .abcd/work/loot/<source>.md as the provenance card. Both committed; both first-class.
What's In Scope
/abcd:lootcommand with subverbs:loot <github-url> [--files <glob>...] [--branch <ref>]— clone the source repo (sparse if--filesgiven), display licence + a manifest of what would be copied, ask for confirmation (transparent prompt per § 6.1), copy files intovendor/<source>/<sub-path>/, write provenance card to.abcd/work/loot/<source>.md, stage both for commit. Single atomic operation.loot search <query> [--license <permissive|copyleft|any>] [--max <N>]— search GitHub for repos matching the query; preferflow-next:github-scoutif installed, internal fallback otherwise; rank by stars × recency × licence-permissiveness; offer to loot the top result interactively.loot list [--source <source>]— show all looted entries in the current project (driven by reading.abcd/work/loot/).loot update <source>— refresh a looted source to a newer commit; computes diff, asks for confirmation if local modifications exist, appends a "Refreshed at SHA → SHA on YYYY-MM-DD" line to the provenance card. Re-runs the licence check against the current policy at refresh time (catches the case where policy tightened between original loot and refresh).loot remove <source>— deletevendor/<source>/and move the provenance card to.abcd/work/loot/archived/<source>.md(don't delete the historical record).loot verify [--source <source>]— re-fetch licence text from the source repo at the recorded SHA and assert it still matches the provenance card's recorded licence (catches retroactive licence changes in the upstream).loot policy add <SPDX-id> --rationale <text>— amend.abcd/config.json→loot.acceptable_licences. The only pathway to make a previously-refused loot pass; see "Licence compatibility check" below.loot policy list— show current acceptable-licence list and amendment history.
- Provenance card schema (owned by the
abcd lootverb ininternal/core/loot, frontmatter + Markdown body):- Frontmatter:
source(URL),vendor_path,commit_sha,branch_or_tag,licence_spdx,licence_path_in_source,looted_at(date),rationale(one-line),files(list of source-paths with byte-counts),refreshed_at(list of date+SHA pairs),local_modifications(boolean — true once any vendored file is touched in-tree). - Body: full licence text inlined, then the looter's notes ("why we wanted this", "what we changed", "what we left out").
- Frontmatter:
- Licence compatibility check (non-circumventable):
- Project declares its licence stance in
.abcd/config.json→loot.acceptable_licences = ["MIT", "Apache-2.0", "BSD-3-Clause", "CC0", ...](set by ahoy with permissive defaults; user can edit). lootrefuses to proceed when source licence isn't on the list. There is no per-loot bypass. No--override, no--force, no global mode (e.g. a future "pirate mode" — see RFC-1) circumvents this gate. The check is part of the loot operation, not a confirmation around it.- The only pathway past a refusal is to amend the policy:
loot policy add <SPDX-id> --rationale <text>updates.abcd/config.json→loot.acceptable_licenceswith a structured rationale recorded in.abcd/work/loot/_policy-amendments.md(one entry per amendment: SPDX-id added, date, rationale, who-added). Subsequent loots of code under that licence then pass the unchanged gate against the amended policy. - Why no escape hatch: per-loot overrides get used reflexively after the third or fourth time a developer hits the refusal; per-policy amendments require editing a file the developer will re-read every time the policy is consulted. Friction is placed deliberately at the policy layer (where it generates real deliberation about what licences fit the project's stance), not at the per-loot layer (where it would just become the path of least resistance).
- Hard principle, lifted to brief § 6 as a universal pattern when this intent is
planned: abcd's licence checks are non-circumventable; the only pathway past a refusal is to amend the policy explicitly.
- Project declares its licence stance in
vendor/convention codified:vendor/<source>/is the canonical landing zone for looted code (regardless of language).- Per-language adapters for "where the rest of the project is" remain unchanged; loot doesn't try to merge into existing source trees, it lands code in
vendor/and lets the consumer wire imports. .gitignoresemantics:vendor/is always committed (loot's whole point is committed provenance). No visibility-driven exception.
loot-quartermasteragent (16th agent — provisional name; the loot-equivalent oflifeboat-oracle):- Audits the proposed loot operation before commit: confirms licence is correctly identified, manifest matches what was copied, no unwanted files (e.g., the source repo's
.git/, build artefacts, secrets) crept intovendor/<source>/. - Oracle backend chain: host-delegated by default, with the opt-in RepoPrompt adapter and Codex CLI as configured alternatives.
- Failure aborts the loot operation (atomic; nothing is left half-vendored).
- Audits the proposed loot operation before commit: confirms licence is correctly identified, manifest matches what was copied, no unwanted files (e.g., the source repo's
- Brief § 5 reserved-commands table update (already landed): row for
/abcd:lootreflecting raid-frame + provenance scope. - Provenance/licence substrate reuse from itd-36 (added 2026-05-08). The licence-detection / citation-generation / source-hash-registry / launch-gate-licence-gate machinery itd-26 needs is the same machinery memory ingest needs. itd-36 ships the substrate as a separable spec at
05-internals/09-provenance-substrate.md; itd-26 sits on top — no re-implementation, no fragile bespoke licence layer. Two distinct user-facing verbs (/abcd:lootfor code,/abcd:memory ingestfor knowledge); one shared substrate. The cross-consumer registry (.abcd/memory/.sources_index.json) is shared; theconsumerfield disambiguates which verb produced each entry.
What's Out of Scope
- Replacing package managers. Loot is for vendoring small focused snippets and single-purpose utilities, not for managing graphs of versioned dependencies.
npm/pip/cargocontinue to handle that. - Cross-host support beyond GitHub (GitLab, Bitbucket, Codeberg, sourcehut, etc.). The initial implementation is GitHub-only; other hosts are itd-N-future when demand emerges.
- Looting from private repos. Authentication, rate-limiting, and per-org policy are large surfaces. The initial implementation is public-only; the verb's rationale (loot the open ocean) reinforces the scope.
- Automatic security scanning of looted code. gitleaks / Presidio scanning of the consumer project at launch time (per the native launch scan) covers the looted code transitively. No per-loot security scan is added; that's a possible itd-N extension.
- Dependency resolution / transitive looting. If the looted code itself depends on another OSS snippet, loot doesn't follow the chain. The user decides what to vendor.
- Auto-updating loot when upstream changes. No watcher, no scheduled refresh.
loot updateis explicit and manual. Drift between looted SHA and upstream HEAD is intentional — that's the point of vendoring. - A treasure-themed alias.
/abcd:treasurewas deliberately not reserved in the reserved-commands work. Loot is the canonical OSS-vendor verb; no alias.
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:loot, then the dispatcher shows recently vendored sources, currentloot.acceptable_licencesfrom.abcd/config.json, and suggested next actions (per the universal bare-command-as-help convention) — no vendoring runs without an explicit URL argument or sub-verb. - Given a project with
loot.acceptable_licences = ["MIT", "Apache-2.0", "BSD-3-Clause", "CC0"]in.abcd/config.json, when the user runs/abcd:loot https://github.com/example/scheduler --files src/jitter.pyagainst an MIT-licensed source, then the file is copied tovendor/scheduler/src/jitter.py, a provenance card is written to.abcd/work/loot/scheduler.mdwith full licence text inlined, and both are staged for commit as one atomic operation. - Given the same project, when the user attempts to loot from a GPL-3.0 source NOT on the acceptable list, then the operation refuses BEFORE copying any file, displays the offending licence + the project's current acceptable list, and points to
loot policy addas the only pathway — no--force, no--override, no per-loot bypass exists. - Given a refused loot, when the user runs
loot policy add GPL-3.0 --rationale "needed for embedded copyleft component", then.abcd/config.jsonis updated, an entry is appended to.abcd/work/loot/_policy-amendments.mdwith date + rationale + actor, and re-running the original loot command now succeeds. - Given an existing looted source, when the user runs
loot update <source>with local modifications present invendor/<source>/, then the command surfaces the local diff vs. upstream, requires explicit confirmation, re-runs the licence check against the current policy, and appends a "Refreshed at SHA → SHA on YYYY-MM-DD" line to the provenance card. - Given the user runs
loot verify --source scheduler, when the command executes, then it re-fetches the licence text from the recorded source URL at the recorded SHA and asserts byte-identity with the licence inlined in the provenance card — any mismatch is reported as a "retroactive licence change" finding. - Given a
loot-quartermasteragent is invoked before commit, when the audit runs, then the agent confirms the licence is correctly identified, the manifest matches what was copied, no.git/or build artefacts crept in, and any irregularity aborts the loot atomically (nothing left half-vendored). Note: the brief's agent count of 15 is preserved;loot-quartermasterbumps the count to 16, recorded in the brief changelog when this intent ships. - Given two looted sources collide on default vendor path (
vendor/bar/), when the second loot is attempted, then the command applies the org-namespace strategy (vendor/foo/bar/andvendor/baz/bar/) automatically OR — if the user prefers — accepts an explicit subpath via--vendor-path <subpath>to override. - Given
/abcd:launch shipruns against a project with recentloot policy addamendments, when the gatekeeper inspects the launch payload, then the policy amendment history is surfaced as a weak warning ("recent licence-stance expansion") so the public sibling repo's release notes can reflect the change.
SOTA
Surveyed on 2026-10-23; sources, evidence tiers and the local fit risks are in the sources-provenance SOTA note.
- A content-addressed id for every looted file is now a standard. SWHID (ISO/IEC 18670, per the OpenChain announcement of April 2025; the spec page itself names neither) computes a content id as SHA1 over
blob <length>\0plus bytes and a directory id over sorted entries, "compatible with the way the current version of Git proceeds", though that compatibility is "incidental and is not guaranteed to be maintained in future versions"; qualifiersorigin=,anchor=,path=,lines=carry context, and the spec notes an origin "can change or disappear over time" (SWHID specification v1.2). It is git's own hash for SHA-1 repositories, computable offline with no dependency; a SHA-256 git repository needs the SHA-1 computed separately. - Existing vendoring tools record the commit, never the licence.
git subtree --squashwritesgit-subtree-dir:andgit-subtree-split:trailers; vendir's lock recordssha,commitTitleandtags; Go'svendor/modules.txtlists module versions and thegocommand errors when it disagrees withgo.mod(the three projects' documentation). - Licence detection has a reference implementation. Licensee reads root licence files and
LICENSES/by default, package manifests and READMEs only when enabled, matches at 98 per cent confidence and treats a copyright-only file as unlicensed; GitHub serves its result per repository andrefasspdx_idornull(licensee documentation; GitHub licenses API). - Per-file declaration in the vendored tree is REUSE 3.3: a header or
.licensesidecar, or aREUSE.toml[[annotations]]table for a directory, with the text inLICENSES/<id>.txt. - The policy list has a grammar. SPDX expressions (
MIT OR Apache-2.0,GPL-2.0-or-later,LicenseRef-);NOASSERTIONis a defined value and under the no-bypass rule a refusal. OSADL publishes machine-readable obligation and compatibility data, a later rung at most since the intent keeps an allow-list. - Path 2: the card keeps the draft's fields and adds a SWHID per file and for the set, recomputed offline by
loot verifybefore the licence text is compared;vendor/<source>/carries aREUSE.tomlannotation; detection runs GitHub's licence endpoint, then a native match of the root licence file against the pinned SPDX text set itd-164 brings, then refusal with the file shown, never README prose, and manifests only as an opt-in layer, as licensee reads them. This departs from the layered detector in the open question below (its layers 1–2 include package metadata); the planning interview should rule. The seam is the card'sfiles[]entries. No Go dependency. The independent fit-challenge runs at plan time.
Open Questions
- (SOTA 2026-10-23)
vendor/is reserved by the Go toolchain andgo builderrors whenvendor/modules.txtdisagrees withgo.mod; does a Go consumer loot into a different directory, or does loot maintainmodules.txtfor the files it lands? - (SOTA 2026-10-23) Does the provenance substrate (itd-36) adopt the SWHID as its content key, so loot and memory ingest share one hash rather than two?
- Default
--filesbehaviour. When the user runsloot <url>without--files, do we default to (a) cloning the whole repo intovendor/<source>/(simple, but often pulls 95% irrelevant code), (b) refusing without--files(forces explicit selection but adds friction), or (c) interactively offering a file tree for selection (best UX, most implementation cost)? Probably (c), with (b) as fallback when no TTY. - Licence detection accuracy. Many repos have a clear
LICENSE/LICENSE.mdfile; many don't, and rely on aLicense: MITline inpackage.jsonorCargo.toml. Need a layered detector: file → package metadata → SPDX-classifier on README → fail-closed and ask the user. The initial implementation ships layers 1–2; layer 3 is itd-N. - What about CC-licenced content (docs, schemas, prompts)? abcd itself might want to loot prompt patterns or schema definitions. Same command, or a cousin like
/abcd:loot --kind docs? Probably same command — provenance card schema is the same — but akind: code|docs|schema|promptfrontmatter field categorises the loot for future querying. - ~~Licence override audit trail.~~ Resolved by 2026-05-04 design lock: there is no per-loot override. Policy amendments via
loot policy addare the only pathway; rationales are mandatory and recorded in.abcd/work/loot/_policy-amendments.md. Open sub-question: should/abcd:launch's gatekeeper surface recent policy amendments as a warning before public release? Probably yes, weakly — the public sibling repo's prospective community deserves visibility into "this project recently expanded its licence stance". - Interaction with
code-rescueragent. code-rescuer (narrowed to principle extraction) and loot-quartermaster (proposed) overlap conceptually — both deal with "extract from source code". Distinction: code-rescuer pulls principles (no code lifted), loot pulls code (with provenance). Worth a §-level note in the brief. - Vendor-path collision strategy. What if the user loots
https://github.com/foo/barthen later lootshttps://github.com/baz/bar? Default vendor pathvendor/bar/collides. Options: (a) namespace by org →vendor/foo/bar/andvendor/baz/bar/, (b) collision detected → prompt for explicit subpath, (c) refuse second loot until first is removed/renamed. Probably (a) as default with (b) as override. - ~~Does loot deserve to be a later command, or fold in sooner?~~ Resolved 2026-05-08 — brought forward to align with README's command shape. Plan-review verifies dredge has accumulated enough usage data before starting work on loot.
Audit Notes
Empty. Populated by intent-fidelity-reviewer when intent moves to shipped/.
Frontmatter
| id | itd-26 |
|---|---|
| type | intent |
| lifecycle | drafts |
| kind | standalone |
| severity | minor |
.abcd/development/intents/drafts/itd-26-loot-oss-vendor.md
open on GitHub ↗ · commit history ↗
References2
Referenced by14
- 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.related
- iss-2610262031343432itd-26 names the knowledge ingest verb /abcd:memory ingest, while the brief puts ingest under /abcd:libraryrelated
- iss-2610262031344534itd-26 designs a plain loot list sub-verb, which the naming discipline forbidsrelated
- iss-2610262031347358itd-26 calls loot-quartermaster the 16th agent, while the scope chapter already counts eighteenrelated
- iss-2610262032585048itd-26 calls the licence gate a launch gate; launch says the restrictive-licence gate is not the release artefact's gate, and that its consumer is the lifeboatrelated
- 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 licencerelated
- iss-2610262034127412itd-26 names `/abcd:memory ingest` as the knowledge verb beside loot; the library surface merged `memory` into `library`related
- iss-2610262037238195itd-26 names /abcd:memory ingest as a user-facing verb for taking in knowledge; in 37-memory, /abcd:memory is an agents' command whose only sub-verbs are add, list and remove.related
- iss-2610262038581765itd-26 names /abcd:memory ingest as the knowledge-ingest verb; the surfaces register gives the name memory to the notes commandrelated
- iss-2610262040391985itd-26 writes loot provenance cards to .abcd/work/loot/; the provenance substrate puts loot citations in .abcd/development/loot/.related
- iss-2610262040403877itd-26 calls the substrate's knowledge consumer /abcd:memory ingest; the provenance substrate calls it /abcd:library ingest.related
- iss-2610262042452621itd-26 makes /abcd:memory ingest the knowledge-ingest verb; itd-2610091918433290 makes /abcd:memory the agents' memory-notes commandrelated
- iss-2610262043026422itd-26 names the knowledge-ingest verb '/abcd:memory ingest'; itd-39 records that 'memory' is now the agents' notes command.related
- iss-2610262043310309itd-26 names /abcd:memory ingest as the user-facing knowledge-ingest verb; itd-2610090831227812 makes /abcd:memory an agent's command for memory notesrelated
mentions7
- dcn-26082100000000032026-08-21 — Bug-hunt round 5, branch bughunt-b/round-5. Baseline (make preflight
- 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-2608211432482363rfc-1 declares related_intents itd-26 but itd-26 has no reciprocal related_rfcs, a one-sided pair the RFC bidirectional convention expects (last unswept half after round-4 rfc-2/adr-43 fix)
- itd-1Every Intent Has Acceptance Criteria; Every Audit Verifies Them
- itd-164A source is licence-vetted before the record may lean on it: cite refresh records the verdict, the gate reads the committed baseline
- spc-2609211905174684memory-unification