Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
137 commits
Select commit Hold shift + click to select a range
94f02fc
fix(cli): name the verb once on the routing stderr lines
REPPL Sep 28, 2026
eacb98c
chore: resolve iss-2609251606543515 — routing stderr names the verb once
REPPL Sep 28, 2026
ec535a9
fix(reading): refuse an unreadable output for its own reason under --…
REPPL Sep 28, 2026
88ceab5
chore: resolve iss-2609251606553359 — routed reading ingest gives the…
REPPL Sep 28, 2026
e9d2c9b
fix(actionsexpr): compare mismatched types by GitHub's number coercion
REPPL Sep 28, 2026
e7f1eaf
chore: resolve iss-2609251616248870 — test evaluator's == follows Git…
REPPL Sep 28, 2026
bacec65
fix(site): read the checkout, wherever the site verbs are run from
REPPL Sep 28, 2026
e4192cc
chore: resolve iss-2609251750202525 — site verbs read the checkout root
REPPL Sep 28, 2026
f439faf
fix(banlist): hold every rev-parse answer to one absolute path
REPPL Sep 29, 2026
99beae9
chore: resolve iss-2608291924452604 — primary-worktree resolution val…
REPPL Sep 29, 2026
680834d
fix(gitutil): read export attributes from the archived revision
REPPL Sep 29, 2026
f2f0c98
chore: resolve iss-2609260933592838 — archive listing reads the revis…
REPPL Sep 29, 2026
976e04c
fix: refuse a symlinked ancestor where the spec, ADR and scribe store…
REPPL Sep 29, 2026
8eba5f4
fix: never follow a citation's redirect off https
REPPL Sep 29, 2026
0ea3161
fix: refuse a PATH abcd whose own file is world-writable
REPPL Sep 29, 2026
5b52293
fix(guard): leave a source-ledger flip to the person
REPPL Sep 29, 2026
a182bb7
fix(ideate): describe a refused closed-set value instead of quoting it
REPPL Sep 29, 2026
b68093d
chore: capture the host-payload refusals that still quote a refused v…
REPPL Sep 29, 2026
a0461aa
fix: actionsexpr coerces strings to numbers as the Actions runner does
REPPL Sep 29, 2026
f2ec7c8
fix(lint): find a local-tier artefact one step off the modelled incident
REPPL Sep 29, 2026
043aee2
test(ideate): mark the planted home path as illustrative
REPPL Sep 29, 2026
ef2b4ae
test(glossary): pin the guarded term read against a FIFO, a link and …
REPPL Sep 29, 2026
950b69c
fix: keep a refused payload value out of the lifeboat review and inte…
REPPL Sep 29, 2026
57145c1
chore: capture the reading ingest's unredacted refusal echo, deferred
REPPL Sep 29, 2026
101fd7d
chore: resolve iss-2609012037137250 — the spec store refuses a symlin…
REPPL Sep 29, 2026
dd4ddc2
chore: resolve iss-2609012037440084 — a citation's redirect never lea…
REPPL Sep 29, 2026
8198d22
chore: resolve iss-2609020352438590 — a hook refuses a world-writable…
REPPL Sep 29, 2026
4eed3b7
chore: resolve iss-2609252007448074 — the guard leaves a ledger flip …
REPPL Sep 29, 2026
ab6709d
chore: resolve iss-2609090951295881 — ideate describes a refused value
REPPL Sep 29, 2026
21afce4
chore: resolve iss-173 — the layout check finds the residual evasions
REPPL Sep 29, 2026
ddea1e8
chore: resolve iss-2609290033521472 — lifeboat review and intent audi…
REPPL Sep 29, 2026
5402ddc
chore: resolve iss-2609231526392449 — the refusal note's wording, fix…
REPPL Sep 29, 2026
ccb71ac
chore: resolve iss-2609012037125129 — the guarded glossary read, fixe…
REPPL Sep 29, 2026
8477ca2
docs(brief): state the ledger-flip entry without naming its shape
REPPL Sep 29, 2026
5d8bdc0
fix(fsutil): one path-boundary predicate for RedactRoot and the home …
REPPL Sep 29, 2026
936b240
chore: capture the leading-boundary disagreement between the home red…
REPPL Sep 29, 2026
bf4f6f6
chore: resolve iss-2608292037564347 — one path-boundary predicate
REPPL Sep 29, 2026
120d110
docs(writing-style): name harness_leak's own line escape
REPPL Sep 29, 2026
f45018e
chore: resolve iss-2609020833531987 — harness_leak escape documented
REPPL Sep 29, 2026
7f29243
docs(brief): move the renamed verbs' rows to the audit and review voc…
REPPL Sep 29, 2026
4d55190
chore: resolve iss-2609231101102072 — matrix vocabulary follows the r…
REPPL Sep 29, 2026
29d4ef0
docs(research): state each prompting baseline's standing against agents/
REPPL Sep 29, 2026
2b22655
chore: resolve iss-241 — prompting research inventory matches agents/
REPPL Sep 29, 2026
3468a4b
docs(itd-6): correct the implementation status to the tree
REPPL Sep 29, 2026
4c82c47
chore: resolve iss-2609240227150859 — itd-6 status matches the tree
REPPL Sep 29, 2026
fb923e9
docs(decisions): call the sources refresh template's two stances prov…
REPPL Sep 29, 2026
97d909a
chore: resolve iss-2609252055533837 — sources refresh entry corrected…
REPPL Sep 29, 2026
f3665ab
ci: say what the record-lint job runs and why it keeps the id
REPPL Sep 29, 2026
b3631de
chore: resolve iss-2609251358062952 — the record-lint job says what i…
REPPL Sep 29, 2026
99452ab
docs(ledger): append dated corrections where a resolution names a rem…
REPPL Sep 29, 2026
7781076
chore: resolve iss-2609261034583909 — stale test names annotated
REPPL Sep 29, 2026
6248753
docs(ledger): append a correction to a ninth record naming a removed …
REPPL Sep 29, 2026
bbba011
chore: name the ninth corrected record in iss-2609261034583909's reso…
REPPL Sep 29, 2026
749fcf9
test: prove the intent mint lock by observed contention, not elapsed …
REPPL Sep 29, 2026
14d51a6
chore: resolve iss-2608301301041887 — mint lock proven by contention
REPPL Sep 29, 2026
56e49ff
fix(ideate): give a reframed verdict its own next line
REPPL Sep 29, 2026
7a09824
chore: resolve iss-2609100508573400 — reframed verdict reads as reframed
REPPL Sep 29, 2026
c8732bf
refactor(reading): derive opensTag from htmlTagRe's own opening rule
REPPL Sep 29, 2026
c2fe73e
chore: resolve iss-2608301251394412 — one definition of what opens a tag
REPPL Sep 29, 2026
8cf52a7
fix(help): size each help block on its own and refuse help --agent by…
REPPL Sep 29, 2026
62140a1
fix(intent): name the ledger the issue-drift audit read
REPPL Sep 29, 2026
e4cf40e
fix(embark): name a directory the walk cannot open by its lifeboat path
REPPL Sep 29, 2026
4a37e7e
fix(launch): refuse a ship in the ship-to-tag window as a release in …
REPPL Sep 29, 2026
b674d47
chore: resolve iss-2609251645374557 — each help block sizes its own c…
REPPL Sep 29, 2026
2f0bcac
chore: resolve iss-2609251645376019 — help --agent names the spelling…
REPPL Sep 29, 2026
e27d7c8
chore: resolve iss-2609252004013212 — embark names the entry it canno…
REPPL Sep 29, 2026
53160cb
chore: resolve iss-2609251235119402 — issue-drift names its ledger
REPPL Sep 29, 2026
f112561
chore: resolve iss-2609252117203691 — ship refuses the window as in f…
REPPL Sep 29, 2026
4ad2725
fix: intent audit describes a refused _type instead of quoting it
REPPL Sep 29, 2026
6a00ab1
chore: name the _type refusal fix in iss-2609290033521472's resolution
REPPL Sep 29, 2026
b8d6953
docs: RedactRoot's comment states its alphanumeric right boundary
REPPL Sep 29, 2026
dae2085
chore: capture the intent consistency ingest's unredacted refusal echoes
REPPL Sep 29, 2026
2594f84
chore: record two more redactor disagreements on iss-2609290055092630
REPPL Sep 29, 2026
cd89fa4
refactor(fsutil): one reader matches every home-scoped path declaration
REPPL Sep 29, 2026
c9be07c
chore: resolve iss-2609090951283654 — one home-declaration reader
REPPL Sep 29, 2026
1f85430
chore: resolve iss-2609090951297149 — fold seam in both declaration r…
REPPL Sep 29, 2026
19b64d7
test(lint): pin the auto-release detect step's run-view failure and i…
REPPL Sep 29, 2026
45f11fd
chore: resolve iss-2609251616310535 — detect step's remaining reads a…
REPPL Sep 29, 2026
c436944
test(scanner): pin the separator-run bound's over-report and unhook f…
REPPL Sep 29, 2026
3098108
chore: resolve iss-2609251728586400 — separator-run bound is pinned
REPPL Sep 29, 2026
b708661
test(evals): open the widening ordering gate through the comparative …
REPPL Sep 29, 2026
3823028
chore: resolve iss-2609251842111403 — ordering gate opened by the rea…
REPPL Sep 29, 2026
5f20348
test(site): build at a v1 release and assert the Beta badge is gone
REPPL Sep 29, 2026
d312436
chore: resolve iss-2609261423210391 — Beta badge absent at v1 is tested
REPPL Sep 29, 2026
2ee7095
fix(rules): the bundled COMMITTING domain carries the recurring attri…
REPPL Sep 29, 2026
b0ea1de
chore: resolve iss-2608210923437502 — COMMITTING carries the attribut…
REPPL Sep 29, 2026
49f9e15
merge: land fix/drain-bugs (drainBugs)
REPPL Sep 29, 2026
0118ba1
fix(grounds): the append refusals locate what they name, and the writ…
REPPL Sep 29, 2026
f204d07
chore: resolve iss-2608301908288212 — the itd-179 fix-delta nits
REPPL Sep 29, 2026
3033ff3
merge: land fix/drain-security (drainSec)
REPPL Sep 29, 2026
c79673c
fix: reading and consistency ingests describe a refused payload value
REPPL Sep 29, 2026
e2410a2
merge: land fix/drain-ux (drainUx)
REPPL Sep 29, 2026
134155d
chore: resolve iss-2609290043245353 — reading ingest refusals no long…
REPPL Sep 29, 2026
d36e86a
chore: resolve iss-2609290144116254 — consistency ingest refusals no …
REPPL Sep 29, 2026
f1fb9d0
test(cli): the locked-body wontfix refusal names body line 1
REPPL Sep 29, 2026
c11d0c9
chore: capture the host-payload refusal echoes left in four more ingests
REPPL Sep 29, 2026
6b23946
merge: land fix/drain-drift-2 (drainDrift2)
REPPL Sep 29, 2026
32876a1
fix: reading's refusal redactor fails closed on a degraded scanner
REPPL Sep 29, 2026
0a7d576
fix: scribe, release, ideate and lifeboat refusals describe or redact…
REPPL Sep 29, 2026
c418923
chore: capture the refusal echoes the sweep found outside its record
REPPL Sep 29, 2026
e76ce15
chore: resolve iss-2609290218032954 — scribe, release, ideate and lif…
REPPL Sep 29, 2026
883df85
fix: the release page's persona refusal describes the attributed name
REPPL Sep 29, 2026
c18344c
refactor: reading and consistency refusals use the one canonical reda…
REPPL Sep 29, 2026
33455a0
chore: capture the release cut's unredacted write of public release text
REPPL Sep 29, 2026
ecd4518
fix: the release cut refuses a secret or the caller's identity in rel…
REPPL Sep 29, 2026
4fe8383
fix: the memory page schema describes or redacts a refused payload value
REPPL Sep 29, 2026
231da76
chore: capture the memory writer's page-filename refusal echo
REPPL Sep 29, 2026
47a510f
fix: the memory writer names a refused page with its secret sealed
REPPL Sep 29, 2026
06432db
fix: the implement loop's receipt refusals describe or redact the rec…
REPPL Sep 29, 2026
ac2f719
chore: resolve iss-2609290405381338 — the release cut refuses a hard_…
REPPL Sep 29, 2026
32dc6db
chore: resolve iss-2609290300464268 — the memory page schema no longe…
REPPL Sep 29, 2026
ced8122
chore: resolve iss-2609290411321963 — the memory writer seals the sec…
REPPL Sep 29, 2026
99595dc
chore: resolve iss-2609290300462829 — the implement loop's receipt re…
REPPL Sep 29, 2026
1c7f908
chore: correct the resolved_by stamp of iss-2609290405381338
REPPL Sep 29, 2026
7a7ea01
fix: say a host-delegated chapter ships as a command page
REPPL Sep 29, 2026
d9621dc
chore: resolve iss-2609231931006041 — host-delegated appendix sentence
REPPL Sep 29, 2026
d12cc62
fix: carry each issue's one-line summary in the capture list row
REPPL Sep 29, 2026
220587a
chore: resolve iss-2609240307549105 — capture list row carries a summary
REPPL Sep 29, 2026
efe9ad1
docs: record the prerequisites itd-6 and itd-7 stand on
REPPL Sep 29, 2026
20f77a4
chore: resolve iss-2609240227447110 — itd-7 names its missing prerequ…
REPPL Sep 29, 2026
95fc0b1
docs: qualify the predecessor-store spec ids six intents cite
REPPL Sep 29, 2026
dc4f0e1
chore: resolve iss-2609261536147903 — predecessor ids qualified
REPPL Sep 29, 2026
7f66911
docs: reconcile the intents that still spell the pre-adr-35 lifeboat
REPPL Sep 29, 2026
8735102
chore: resolve iss-94 — the intents spell the adr-35 lifeboat
REPPL Sep 29, 2026
6b96c44
chore: defer seven drift records as rulings owed to the product thinker
REPPL Sep 29, 2026
d2f7a96
docs: correct the brief's last crosscheck claims to the shipped tree
REPPL Sep 29, 2026
e6f9b0c
chore: resolve iss-2609020735520603 — the crosscheck findings are dra…
REPPL Sep 29, 2026
a48df6a
chore: defer the two sweep-sized drift records out loud
REPPL Sep 29, 2026
e197140
docs: count the four intents itd-6's builds_on adds
REPPL Sep 29, 2026
7fd5101
docs: drop the retired sequencing term from the adapter seam note
REPPL Sep 29, 2026
614a508
fix(capture): drop a leading markdown marker from the list summary
REPPL Sep 29, 2026
409eddf
merge: bring main (#744) into the integration branch
REPPL Sep 29, 2026
bc17180
merge: land fix/drain-echo (drainEcho, c11d0c9c9)
REPPL Sep 29, 2026
38d3193
merge: land fix/drain-echo-2 (drainEcho2, e76ce15d1)
REPPL Sep 29, 2026
a8bc0c2
merge: land fix/drain-echo-3 (drainEcho3, 1c7f90803)
REPPL Sep 29, 2026
e7cac3e
merge: land fix/drain-drift-3 (drainDrift3, 614a5081b)
REPPL Sep 29, 2026
91440f1
merge: land fix/drain-debt (drainDebt, f1fb9d066)
REPPL Sep 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .abcd/development/brief/01-product/01-press-release.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Press Release

> **abcd helps a product thinker realise an intent as a high-fidelity prototype or demonstrator — carrying the why from idea to shipped reality.** State what should exist, why, for whom, and what good looks like, as a press-release intent (`/abcd:intent "<text>"`); abcd holds that why through planning (`/abcd:intent plan`), the readiness gate (`/abcd:intent ready`) and delivery, and when the work lands it is audited against the intent's own acceptance criteria (`/abcd:intent audit`), with the verdict recorded on the intent, so what was promised and what was delivered are read side by side. The lifeboat is a key capability of the same product: point `/abcd:disembark <source-repo> to <dest>` at any repository — one that has grown unwieldy, or one that died years ago and that abcd never managed — and abcd reads it without writing a single byte back, packing its hard-won knowledge — decisions, principles, pitfalls, the graveyard of what failed, the spine of what was built and why — into a portable lifeboat artefact at `<dest>`, alongside a coverage report that names what it could *not* ground and the questions a human must answer. `/abcd:disembark probe <source-repo>` renders that coverage verdict on its own, and `/abcd:embark from <path>` unpacks a lifeboat into a clean foundation with the same wisdom but none of the cruft. A small command surface rounds out the workflow: install (`/abcd:ahoy install`) and public release (`/abcd:launch ship`); `/abcd:capture` keeps discovered issues structured as the project evolves; and `/abcd:memory` curates a queryable knowledge substrate from those same sources. Bare invocation of any command shows status + suggested next actions; state-mutating actions require an explicit sub-verb (the universal abcd convention).
> **abcd helps a product thinker realise an intent as a high-fidelity prototype or demonstrator — carrying the why from idea to shipped reality.** State what should exist, why, for whom, and what good looks like, as a press-release intent (`/abcd:intent "<text>"`); abcd holds that why through planning (`/abcd:intent plan`), the readiness gate (`/abcd:intent ready`) and delivery, and when the work lands it is audited against the intent's own acceptance criteria (`/abcd:intent audit`), with the verdict recorded on the intent, so what was promised and what was delivered are read side by side. The lifeboat is a key capability of the same product: point `/abcd:disembark pack <source-repo> <dest>` at any repository — one that has grown unwieldy, or one that died years ago and that abcd never managed — and abcd reads it without writing a single byte back, packing its hard-won knowledge — decisions, principles, pitfalls, the graveyard of what failed, the spine of what was built and why — into a portable lifeboat artefact at `<dest>`, alongside a coverage report that names what it could *not* ground and the questions a human must answer. `/abcd:disembark probe <source-repo>` renders that coverage verdict on its own, and `/abcd:embark from <path>` unpacks a lifeboat into a clean foundation with the same wisdom but none of the cruft. A small command surface rounds out the workflow: install (`/abcd:ahoy install`) and public release (`/abcd:launch ship`); `/abcd:capture` keeps discovered issues structured as the project evolves; and `/abcd:memory` curates a queryable knowledge substrate from those same sources. Bare invocation of any command shows status + suggested next actions; state-mutating actions require an explicit sub-verb (the universal abcd convention).
>
> "I know what I want built and I can tell in a minute whether a prototype got it right. What I could never do was hold that line through the engineering. abcd takes the why as I wrote it, builds against it, and shows me what was promised next to what was delivered," said Iris, a product thinker.
>
Expand All @@ -20,7 +20,7 @@ The lifeboat widens from whole repositories to narrower sources — a single fea

## What's In Scope

- **Pack the lifeboat:** `/abcd:disembark <source-repo> to <dest>` runs three passes (settled artefacts → targeted chat retrieval → distil/compose/audit) over a project's specs, ADRs, transcripts, oracle reviews, and curated memory. `/abcd:disembark probe <source-repo>` is the user-facing read-only half: the coverage report alone, rendered to stdout and written nowhere. Pack is **read-only in the source repo and writes out-of-tree** (adr-35): the source is never modified, so any repository can be mined — including a dead one abcd has never touched. Output at `<dest>` is a structured directory with synthesised principles, decisions timeline, pitfalls, a `graveyard/` of what was tried and abandoned, press-release framing, verbatim copies of specs, ADRs, and user docs, and a first-class `coverage.{json,md}` pair recording what could not be grounded (`grounded` / `partial` / `blank`), what was searched, and the question a human must answer. abcd refuses a destination it did not produce — it writes only into an absent path, an empty directory, or one carrying a parseable `_provenance.json`. Operations state (the append-only voyage log) lives at the operator level under `~/.abcd/voyage/<source-root-sha>/`, keyed on the root-commit SHA and never committed.
- **Pack the lifeboat:** `/abcd:disembark pack <source-repo> <dest>` runs three passes (settled artefacts → targeted chat retrieval → distil/compose/audit) over a project's specs, ADRs, transcripts, oracle reviews, and curated memory. `/abcd:disembark probe <source-repo>` is the user-facing read-only half: the coverage report alone, rendered to stdout and written nowhere. Pack is **read-only in the source repo and writes out-of-tree** (adr-35): the source is never modified, so any repository can be mined — including a dead one abcd has never touched. Output at `<dest>` is a structured directory with synthesised principles, decisions timeline, pitfalls, a `graveyard/` of what was tried and abandoned, press-release framing, verbatim copies of specs, ADRs, and user docs, and a first-class `coverage.{json,md}` pair recording what could not be grounded (`grounded` / `partial` / `blank`), what was searched, and the question a human must answer. abcd refuses a destination it did not produce — it writes only into an absent path, an empty directory, or one carrying a parseable `_provenance.json`. Operations state (the append-only voyage log) lives at the operator level under `~/.abcd/voyage/<source-root-sha>/`, keyed on the root-commit SHA and never committed.
- **Unpack the lifeboat:** `/abcd:embark from <path>` reads the lifeboat, runs a press-release interview to confirm the framing with the user, scaffolds the new repo at canonical locations, and writes provenance so the rebuild knows where it came from. `<path>` is wherever a prior disembark landed its lifeboat; there is no in-tree lifeboat home and no `home` shorthand.
- **Install / promote:** `/abcd:ahoy install` bootstraps abcd in any repo (transparent prompts, visibility-driven gitignore, marker block in CLAUDE.md/AGENTS.md, prompt-router hook). `/abcd:launch ship` cuts a curated release from the single repo — `.abcd/**` excluded from the artifact by packaging — with secret/PII scans and a version stamp.
- **Forward-looking discipline:** `/abcd:intent` captures product intents in three structural kinds per itd-34 — `standalone` (one user moment, one spec), `bundle-member` (coupled intents share a spec), and `discipline` (cross-cutting rules with no user moment, e.g., the itd-1 acceptance-gates rule that enforces Given-When-Then on every other spec). Standalone and bundle-member intents are press-release-shaped; disciplines use a `## Rule` template instead. `/abcd:capture` runs a structured issue ledger at `.abcd/work/issues/` rather than free-form notes. `/abcd:intent ready` answers the question that gates the build: is this intent ready to implement, and if not, what is missing. After shipping, `/abcd:intent audit` (Role 1 of `intent-auditor`) reviews delivered reality against the press release, and `/abcd:intent consistency` (Role 2, per itd-48, which superseded itd-31) catches drift between documents, filing each contradiction it finds as an issue. Two companions are designed and not yet built: `/abcd:intent grill` (per itd-27), a Socratic interview that stress-tests an intent, or a brief section, before it is planned; and `/abcd:intent shape` (Role 3), which keeps each intent's `kind` honest as the corpus grows.
Expand All @@ -34,9 +34,9 @@ Code-bundling lifeboats, cross-corpus synthesis, public-source vendoring with pr

## Acceptance Criteria

- **Given** a corpus repo with a spec store, ADRs, and a memory backend present, **when** `/abcd:disembark <source-repo> to <dest>` runs to completion, **then** `<dest>` contains all sections specified in [`04-surfaces/02-disembark.md § 5`](../04-surfaces/02-disembark.md#5-output-shape) plus `coverage.{json,md}`, the source repo's tree hash is byte-for-byte unchanged, and the lifeboat review returns a registered verdict (`SHIP` / `NEEDS_WORK` / `MAJOR_RETHINK`) with specific findings (not vague approval).
- **Given** a destination directory that is non-empty and carries no parseable `_provenance.json`, **when** `/abcd:disembark <source-repo> to <dest>` runs, **then** the command refuses with the offending path cited and writes nothing — abcd never overwrites a directory it did not produce (adr-35).
- **Given** a lifeboat produced by `/abcd:disembark <source-repo> to <dest>` and an empty target repo, **when** `/abcd:embark from <dest>` runs, **then** the user is presented with the press-release interview as the first interaction, the amended press release becomes the new repo's `.abcd/development/brief/README.md`, and all canonical-location files (specs, ADRs, memory, docs, terminology, principles) land at the locations specified in [`04-surfaces/03-embark.md § 3`](../04-surfaces/03-embark.md#3-scaffold-steps).
- **Given** a corpus repo with a spec store, ADRs, and a memory backend present, **when** `/abcd:disembark pack <source-repo> <dest>` runs to completion, **then** `<dest>` contains all sections specified in [`04-surfaces/02-disembark.md § 5`](../04-surfaces/02-disembark.md#5-output-shape) plus `coverage.{json,md}`, the source repo's tree hash is byte-for-byte unchanged, and the lifeboat review returns a registered verdict (`SHIP` / `NEEDS_WORK` / `MAJOR_RETHINK`) with specific findings (not vague approval).
- **Given** a destination directory that is non-empty and carries no parseable `_provenance.json`, **when** `/abcd:disembark pack <source-repo> <dest>` runs, **then** the command refuses with the offending path cited and writes nothing — abcd never overwrites a directory it did not produce (adr-35).
- **Given** a lifeboat produced by `/abcd:disembark pack <source-repo> <dest>` and an empty target repo, **when** `/abcd:embark from <dest>` runs, **then** the user is presented with the press-release interview as the first interaction, the amended press release becomes the new repo's `.abcd/development/brief/README.md`, and all canonical-location files (specs, ADRs, memory, docs, terminology, principles) land at the locations specified in [`04-surfaces/03-embark.md § 3`](../04-surfaces/03-embark.md#3-scaffold-steps).
- **Given** a fresh repo with no `.abcd/` directory, **when** `/abcd:ahoy install` runs to completion, **then** the repo is bootstrapped per [`04-surfaces/01-ahoy.md § Acceptance`](../04-surfaces/01-ahoy.md#acceptance), and re-running `install` at the same `setup_version` is idempotent (no marker duplication, transparent re-confirm of visibility).
- **Given** a clean tree with a deliberate PII fixture (e.g., a real email in a comment), **when** `/abcd:launch ship` runs, **then** preflight hard-fails with the offending file/line cited and no payload is written; a `/abcd:launch dry-run` on the same tree prints the would-refuse finding and exits 0 (report-only preview per [`04-surfaces/04-launch.md`](../04-surfaces/04-launch.md)).
- **Given** the user runs `/abcd:intent "<text>"` (canonical bare quoted create), **when** the interview completes, **then** an `intents/drafts/itd-N-<slug>.md` file exists with press-release content, customer quote from the persona registry, and a `## Acceptance Criteria` section in Given-When-Then format (per itd-1).
Expand Down
4 changes: 2 additions & 2 deletions .abcd/development/brief/01-product/02-context.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ You did a manual lifeboat from iDelphiZero → iDelphi (`idelphiDev/.work/lifebo
abcd ships these user-facing commands:

- **`/abcd:ahoy install`** — install / update abcd in any project (bootstraps configuration, gitignore, marker blocks, PATH symlink). Bare `/abcd:ahoy` shows status+help.
- **`/abcd:disembark <source-repo> to <dest>`** — *pack* a lifeboat by **reading** `<source-repo>` — any repository, including one abcd has never touched — and writing the artefact **out-of-tree** to the operator-chosen `<dest>`. The source is never written to; the destination must be absent, an empty directory, or one carrying a parseable `_provenance.json` ([adr-35](../../decisions/adrs/0035-lifeboat-as-coverage-experiment.md)). Bare `/abcd:disembark` shows status+help; `probe <source-repo>` and `dry-run` sub-verbs preview without writing — `probe` reports **coverage** (which brief sections a repository can ground, and which come back blank).
- **`/abcd:disembark pack <source-repo> <dest>`** — *pack* a lifeboat by **reading** `<source-repo>` — any repository, including one abcd has never touched — and writing the artefact **out-of-tree** to the operator-chosen `<dest>`. The source is never written to; the destination must be absent, an empty directory, or one carrying a parseable `_provenance.json` ([adr-35](../../decisions/adrs/0035-lifeboat-as-coverage-experiment.md)). Bare `/abcd:disembark` shows status+help; `probe <source-repo>` and `dry-run` sub-verbs preview without writing — `probe` reports **coverage** (which brief sections a repository can ground, and which come back blank).
- **`/abcd:embark from <dest>`** — *unpack* the lifeboat at `<dest>` (wherever a disembark wrote it) into a (typically empty) target project. Bare `/abcd:embark` shows status+help; `scan` and `probe <path>` sub-verbs discover/inspect without unpacking.
- **`/abcd:launch ship`** — cut a curated release from the single repo (the packaging filter denies `.abcd/**`, so the released binaries do not carry it), scrub for PII/secrets, stamp the version, update the marketplace entry. Bare `/abcd:launch` shows status+help; `dry-run` sub-verb runs the full pre-flight gate suite without writing the release artifact.
- **`/abcd:intent`** — bare quoted `/abcd:intent "<text>"` is the canonical create (spc-30/itd-46), plus the `plan` / `ready` / `audit` / `link` / `consistency` sub-verbs that ship (alongside the deprecated `new` alias; `consistency` per itd-48, which superseded itd-31), with `refine` / `grill` / `ship` / `shape` / `reclassify` remaining design targets. There is no plain `list` sub-verb — it is folded into the bare render per SD001. Manages **intents** (press-release-format intent docs at `.abcd/development/intents/{drafts,planned,shipped,disciplines,superseded}/`). `plan` promotes an intent to `planned/` and plans the work as a spec on the native spec store ([adr-26](../../decisions/adrs/0026-native-spec-layer-ccpm-backend.md); the companion harness `ccpm` as the deeper backend); `ship` drives that spec to completion (or the full pipeline if from drafts/); a spec-close hook reconciles standalone/bundle intents planned → shipped automatically on a successful close (spc-28 `intent_lifecycle.reconcile`); disciplines move from drafts/ to disciplines/ on plan and stay there. Bare `/abcd:intent` shows status+help.
Expand All @@ -21,7 +21,7 @@ abcd ships these user-facing commands:
```
[source repo: specs, .abcd/memory/ (or legacy memory/), ADRs, docs, code, transcripts]
│ READ-ONLY — the source tree is never written to
│ /abcd:disembark <source-repo> to <dest> (PACK)
│ /abcd:disembark pack <source-repo> <dest> (PACK)
▼
[lifeboat artefact at <dest>: a portable directory, out-of-tree]
├── README.md, press-release.md, principles.md ← synthesised
Expand Down
4 changes: 2 additions & 2 deletions .abcd/development/brief/02-constraints/01-platform.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ The core is a transport-agnostic Go package ([adr-23](../../decisions/adrs/0023-

## Lifeboat path

**Out-of-tree, at an operator-chosen destination** — `disembark <source-repo> to <dest>`. There is no in-tree lifeboat home and nothing to gitignore in the source, because **disembark never writes to the source repo** (a test hashes its tree before and after). Per [adr-35](../../decisions/adrs/0035-lifeboat-as-coverage-experiment.md), superseding adr-4's `.abcd/lifeboat/`: mining a dead or archived project must not require installing abcd into a repo we only want to read.
**Out-of-tree, at an operator-chosen destination** — `disembark pack <source-repo> <dest>`. There is no in-tree lifeboat home and nothing to gitignore in the source, because **disembark never writes to the source repo** (a test hashes its tree before and after). Per [adr-35](../../decisions/adrs/0035-lifeboat-as-coverage-experiment.md), superseding adr-4's `.abcd/lifeboat/`: mining a dead or archived project must not require installing abcd into a repo we only want to read.

**Lifeboat is always *output*.** `<dest>` holds the latest snapshot only — produced by `disembark`, regenerable from current state; there is no `lifeboat-v1/` / `lifeboat-v2/` proliferation. Re-running is governed by a **destination safety gate**, not adr-4's `.bak` overwrite: refuse unless the destination is absent, an empty directory, or one carrying a parseable `_provenance.json`. **abcd never overwrites a directory it did not produce.** Past disembarks are recorded as manifests (hash + file list + label) at the operator level, not as preserved snapshots — see [`04-surfaces/03-embark.md § 7`](../04-surfaces/03-embark.md#7-voyage-layout--embarkdisembark-provenance-and-history).

Expand All @@ -24,7 +24,7 @@ The core is a transport-agnostic Go package ([adr-23](../../decisions/adrs/0023-

**Embark sources, in order (post bare-as-help refactor — see [`04-surfaces/03-embark.md`](../04-surfaces/03-embark.md)):**

1. `embark from <path>` (any explicit path to a lifeboat destination a disembark wrote) — **there is no `home` shorthand**, because there is no in-tree lifeboat home to expand it to (adr-35). The round-trip / self-test case is just `disembark <repo> to <dest>` followed by `embark from <dest>`.
1. `embark from <path>` (any explicit path to a lifeboat destination a disembark wrote) — **there is no `home` shorthand**, because there is no in-tree lifeboat home to expand it to (adr-35). The round-trip / self-test case is just `disembark pack <repo> <dest>` followed by `embark from <dest>`.
2. `embark scan` (or `embark scan --deep`) → discovery sub-verb that walks sibling directories (`../`), lists **lifeboat destinations** — directories carrying a parseable `_provenance.json`, the same marker the destination safety gate keys on — ranked by mtime; does not unpack; pass the chosen path to `embark from <path>`
3. Free-text path input via the embark interview if `<path>` is omitted on `from`

Expand Down
Loading
Loading