Development record
the-lifeboat-verdict-says-what-it-is-disembark-oracle-become
Summary
Delivers the third rename: disembark oracle → disembark review,
--oracle-json → --review-json, the lifeboat synthesis artefact
audit/oracle-<manifest12>.* → review/review-<manifest12>.*, and the
lifeboat-oracle agent → lifeboat-reviewer. Reverses adr-40 §5 per the
maintainer's 2026-08-16 ruling (recorded as a dated in-place amendment in
adr-40 and the decision dcn-2608160000000005, landed with the planning records). Clean
break, no aliases. Ships only after spc-27's extended surface_coverage is
armed.
Scope — the live sweep (verified inventory, 2026-08-16)
Code and surface:
internal/core/lifeboat/synthesis_oracle.go(+_test.go) →synthesis_review.go;AuditOracle→ReviewLifeboat(orReview),OracleResult→ReviewResult;synthesis_types.goandembark_types.goreferences follow. The dual-mode contract, enum gate, cite-or-be-dropped, and attestation stamping are behaviour-frozen — the moved tests assert byte-identical verdict logic.- Artefact writer: output directory
audit/→review/, basenameoracle-<manifest12>→review-<manifest12>; still excluded frommanifest_sha256. Clean-replacement across the rename: on a re-run, after writingreview/review-<manifest12>.json|.md, removeaudit/oracle-<manifest12>.json|.mdfor the same manifest12 when present (and removeaudit/if left empty); never touch other manifests' files. internal/surface/cli/cli.go+disembark_synthesis_test.go— theoraclesub-command →review, flag--oracle-json→--review-json, help text, JSON envelope keys carryingoracle.agents/lifeboat-oracle.md→agents/lifeboat-reviewer.md(name, frontmatter, prompt, canary fixture diragents/lifeboat-oracle/→agents/lifeboat-reviewer/);agents/README.mdroster;agents/CHANGELOG.mdgets a new entry (append, never rewrite).commands/disembark.md— the "Oracle audit" section → "Review (content fidelity + verdict)".docs/reference/cli/commands.md— regenerate.
Record (current-state surfaces only):
- Brief:
01-product/01-press-release.md,04-surfaces/02-disembark.md,04-surfaces/03-embark.md,05-internals/01-agents.md(the "oracle audit" prose → "review"; the seam prose keepsoraclewhere it names adr-25's seam),02-adapters.md,03-configuration.md,04-universal-patterns.md,05-prompt-quality.md,06-delivery/01-build-sequence.md,02-verification-matrix.md. 02-constraints/04-naming.md— task-class enum roworacle_reviewre-checked: the token stays (it honestly names review work reaching a model through the oracle seam); the row's source prose updates.- The
disembarksub-verb table row (spc-27 format) flips in the same change. CHANGELOG.md— breaking entry (verb, flag, and artefact path all named).
Not swept: historical/dated records; adr-25 (the seam is untouched —
oracle remains the seam's name and /abcd:oracle ask remains the reserved
seam surface); voyage/history ledger entries already written.
Approach
- Precondition: spc-27 armed, else STOP.
- Rename the core entrypoint and types, watching moved tests fail under
old names first; add the old-artefact removal step with tests: (a) fresh
pack → only
review/written; (b) old pack withaudit/oracle-*→ re-run writesreview/, removes the stale pair,audit/pruned when empty; (c) mixed manifests → only the matching manifest's files removed. - Rename the CLI sub-command and flag; surface tests pin
disembark oracleand--oracle-jsonas unknown. - Agent + canary fixture rename; injection-canary test paths follow.
- Sweep prose; flip the sub-verb row; regenerate
surface.jsonand the CLI reference.record-lint,docs-lint, drift tests,make preflightexit 0. PR classifies the residualoraclegrep (seam uses stay).
Acceptance-criteria mapping
- New spellings, old unknown — step 3's pins.
- Behaviour frozen — step 2's moved tests (deterministic mapping table, delegated gates, attestation stamping, exit codes).
- Artefact move + clean replacement — step 2's three artefact tests.
- Sweep + token re-check + boundary — steps 4–5; the naming-registry row.
- Reversal recorded — the adr-40 amendment and dcn-2608160000000005 land with the planning records (this PR), before any build.
- Armed-gate ordering — step 1.
- Breaking CHANGELOG — Scope.
Every behaviour change lands with a test watched fail before the change.
Frontmatter
| id | spc-30 |
|---|---|
| type | spec |
| lifecycle | closed |
.abcd/development/specs/closed/spc-30-the-lifeboat-verdict-says-what-it-is.md
open on GitHub ↗ · commit history ↗
References1
- itd-125The Lifeboat Verdict Says What It Isimplements
mentions9
- adr-25The LLM is host-delegated by default; oracles are opt-in adapters
- adr-40Review, audit, lint, and gate are four buckets, separated by what each compares
- dcn-26081600000000032026-08-16 — the assessment vocabulary settled at a maintainer grill and filed as adr-40 (proposed): **four buckets — lint / review / audit / gate — separated by what each compares**, not by determinism, not by trigger. The rule was already half-recorded (05-internals/01-agents.md rules the two verdict families disjoint: "reviews assess a change, criterion verdicts assess a promise vs reality") and three shipped surfaces contradict it — `intent review` emits family 2 so it is an audit, `abcd audit` is deterministic rule-checking so it is a lint (and it consumed the `/abcd:audit` name 02-constraints/04-naming.md reserves for itd-16), and `disembark oracle` emits family 1 while the brief calls its output an audit. Grill rulings: **one surface performs exactly one act** (multi-act surfaces split at design time — cheap, because every multi-act surface abcd has is unbuilt, so they are specified rather than refactored); the buckets are a **closed list extended by PR, not a criterion** (an autonomous run given a criterion interprets it; a table lookup matches or fails); `intent ready` survives as the fourth bucket **gate** because it names a decision rather than a comparison, preserving itd-94's exit-code contract; determinism is orthogonal (itd-16's hash-chain check is a deterministic *audit*; itd-85's conformance check is a *lint* however built); automatic-vs-manual never enters a verb name (the trigger is the facilitator's, per itd-97); the oracle is the model-access seam beneath review and audit, never a bucket. **Clean break, no aliases** — pre-1.0.0, `--impact breaking` drives version derivation (iss-171 precedent), users re-download; an alias would additionally collide with the documentation discipline's ban on change-narration, leaving an undocumented silent forward. The role mapping is the operational reason the split earns its cost: product thinker reads `audit` and essentially nothing else, which makes itd-99's "never hand a product thinker a technical decision" mechanically checkable. Same grill corrected a wrong finding: iss-246 was filed claiming abcd's record documents a surface far larger than the binary with no gate catching it; **false** — the `Status` column in 04-surfaces/README.md is machine-checked by `surface_coverage` (iss-35), the brief carries ~100 inline `design target` markers, and adr-5 makes the brief aspirational by design. The real defect is narrower: `surface_coverage` is blind *inside* a row, so six of twenty rows read `shipped` then qualify themselves in prose, and documents outside the registry cite those sub-verbs as live (all three citing **predecessor-store** spec ids spc-29/spc-30, whose prose survived the migration to the native store). Fix per adr-40 §6: sub-verb tables carrying two facts per verb — bucket and existence — with `surface_coverage` extended to registered cobra sub-commands, one table serving both disciplines. Also established: the twelve-step record walk completes at ten steps; step 2 (`capture promote`) has no verb and step 12 (`capture resolve`) cannot write `resolved_by`, so **walkability is sequenced before coherence** — renaming ~90 files across a process nobody can walk is polish before function. Plan at plans/2026-08-16-process-coherence-and-walkability.md; six intents to plan, none plannable unattended. Rejected: one polymorphic `review <id>` verb (merges the disjoint families, erases the role signal), classifying acts rather than surfaces (makes the bucket a statement of intent rather than a guarantee, and hands product thinkers lint findings), three buckets without `gate` (forces `intent ready` to become `intent lint`), and adding `verify`/`validate` (itd-109's verification suite is a packaging of lints and audits, not a fifth kind).
- dcn-26081600000000052026-08-16 — adr-40 §5 REVERSED at the process-planning interview (amendment recorded in-place in adr-40): `disembark oracle` renames to `disembark review` (itd-125, breaking) instead of keeping the verb and fixing prose. The investigation finding that turned it: the binary verb never invokes the oracle seam — it is a compute-or-ingest verdict endpoint (deterministic manifest+coverage mapping, or validate-and-ingest of a host-produced verdict), so the seam name claims transport the verb does not touch and collides with the `/abcd:oracle ask` design target, the seam's real surface. The sweep carries the artefact (`audit/oracle-<manifest12>.*` → `review/review-<manifest12>.*`, clean-replacement across the rename so one manifest never holds two verdicts) and the agent (`lifeboat-oracle` → `lifeboat-reviewer`). Naming convention ruled in the same session: assessment agents are target-grain + role (`intent-auditor`, `lifeboat-reviewer`). adr-25 and the seam name `oracle` stand unchanged. Rejected: prose-only fix (leaves the artefact contradicting the vocabulary), renaming the seam itself (adr-25 is correct), a superseding mini-ADR (same-day clause amendment suffices).
- iss-246`surface_coverage` is blind inside a row, so `shipped` means "the top-level verb exists" and every unbuilt sub-verb hides behind it.
- iss-250Brief-surface drift found by the v0.5.0 release gate: the full-tier crosscheck (22 checkers, both directions) returned 28 unique discrepancies between the brief's surface prose and the shipped binary — 14 false-claim, 8 undocumented-surface, 2 criterion-violation, 2 stale-count, 2 fictional-layout. Dominant clusters: the vintage/staleness surfaces (bare 'abcd version' three-line render, version --json four fields, version --check, --allow-stale-binary, uninstall --bin-dir) landed without their brief rows; the citation-baseline dry-run gate and render line are undocumented in 04-launch.md; 01-ahoy.md's envelope shape omits the banlist key and guard.detail; 05-intent.md:335 claims gap_audit is deferred (shipped) and an MG004 check ships (does not exist); 07-memory.md's spec-count claim is stale (spc-2..spc-27 exist); the agents/ plugin surface has no registry row and surface_coverage does not check it; skills/-era phrasing survives in 02-constraints/04-naming.md, 06-delivery/01-build-sequence.md and 02-verification-matrix.md. Full list with file:line, claim, reality and class: the iss35-brief-surface-crosscheck receipt for content commit d1afd2c under .abcd/work/reviews/. Not release-blocking (design-record drift, no user-facing doc affected) — same class and disposition as iss-192 at v0.4.2.
- iss-266cobra parents with no RunE are not Runnable, so cobra prints help and exits 0 WITHOUT validating args: an unknown sub-verb reads as success to a script. Confirmed on 'abcd docs nonsense' and 'abcd guard nonsense' (both exit 0); 'abcd memory nonsense' and 'abcd history nonsense' exit 1 because those parents have a RunE. spc-30 fixed the disembark parent (a retired sub-verb spelling must refuse, not silently succeed) by giving it a RunE that prints help, so cobra.NoArgs then refuses a stray token at exit 2. The same one-line fix is owed to every other RunE-less parent — sweep them so no unknown sub-verb anywhere exits 0.
- iss-2610262033205781itd-48 calls the lifeboat review agent `lifeboat-oracle`; 02-disembark calls it `lifeboat-reviewer`
- spc-27the-registry-cannot-wave-its-hands-every-surface-file-carrie