Development record
The autonomous run is a pluggable seam, not a Ralph port
Context
abcd's autonomous execution was Ralph: a specific iteration loop with its own post-iteration edge, where abcd hung behaviour like the autodrain gate (ADR-16). That tied abcd's "run work unattended" capability to one bundled loop and its internals. The rebuild drops Ralph as a hard dependency (ADR-22), so the autonomous run needs a shape that does not assume any one loop is present.
Decision
The autonomous run is a pluggable run seam, not a Ralph port. abcd defines
what an autonomous run is — iterate over ready work, gate each step on a
receipt, apply a safety guard — and lets the loop itself be supplied by
an adapter:
- Claude Workflows — delegate the loop to the host's workflow engine.
- The companion harness's agent loop — drive the companion harness's loop as a peer over conventions/MCP (ADR-24).
- Thin native Go loop — a minimal built-in fallback that iterates, gates on receipts, and enforces the safety guard, so abcd can run autonomously with no external loop present.
Because the loop is now an adapter and Ralph's post-iteration edge no longer exists as a fixed thing, this ADR supersedes ADR-16: the autodrain behaviour ADR-16 anchored to Ralph's edge is re-expressed as receipt gating inside the seam — a report-don't-block gate at each iteration boundary, whichever adapter provides the loop.
Alternatives Considered
- Port Ralph natively. Preserves the shipped loop behaviour. Rejected: it re-hard-codes one loop shape and its edge semantics, exactly the bundling ADR-22 removes, and forecloses delegating to a host workflow engine that may do it better.
- No autonomous run in the MVP. Simplest. Rejected: unattended execution is core to abcd's value, and the thin native loop is cheap enough to be the always-available fallback.
- Chosen: a
runseam with receipt gating and a safety guard, three adapter loops behind it, thin native Go loop as fallback. Autonomy without binding to any one engine.
Consequences
- abcd runs autonomously out of the box via the thin native loop; richer loops are opt-in adapters, and their absence degrades to the fallback rather than disabling the run.
- The autodrain/gate behaviour becomes a receipt-gated, report-not-block step at the iteration boundary defined by the seam, no longer coupled to Ralph's post-iteration hook.
- The safety guard is part of the seam contract, so every adapter loop inherits the same stop conditions rather than each re-implementing them.
- Ralph-specific overlay and edge machinery is removed with the rest of the bundled-dep subsystem (ADR-22).
Frontmatter
| id | adr-27 |
|---|---|
| type | adr |
| status | accepted |
| date | 2026-07-06 |
.abcd/development/decisions/adrs/0027-autonomous-run-pluggable-seam.md
open on GitHub ↗ · commit history ↗
References2
- adr-25The LLM is host-delegated by default; oracles are opt-in adaptersrelated
- adr-16not in the treesupersedes
Referenced by8
- adr-22Bundled dependencies become pluggable adapters over a native defaultrelated
- adr-2609291342092738A drain takes an issue alone only when its fields say it needs no decisionrelated
- itd-51abcd Knows What "Safe Enough to Adopt" Means Before a New Harness Arrivesrelated
- itd-57Every abcd Voyage Ships With A Manual-Hold Sentinel That Blocks A Spec From Autonomous Pickup Until A Human Lifts Itrelated
- itd-58A Real Reviewer's SHIP Verdict Reaches The Session Gate Through A Channel The Worker Cannot Forgerelated
- itd-59Every Autonomous Run Pass Leaves the Same Durable, Queryable Transcript an Interactive Session Doesrelated
- itd-80An Intent Ships Itself: `planned → shipped` Follows Its Spec Closing, With A Fidelity Audit Attachedrelated
- itd-82`abcd drain` fixes the issues that need no decision, and hands the rest back by kindrelated
mentions13
- adr-24the companion harness is a peer integrated via conventions and MCP, not a code dependency
- dcn-26071200000000052026-07-12 — autonomous-run surface named /abcd:run, taking itd-29's reserved
- iss-2608210932052003abcd launches autonomous bug hunts (and other routines) for the user, opt-in — beyond handing the user a prompt to paste into a cloud routine. Today the bughunt is a Desktop prompt the user wires into an external cloud routine by hand; the direction is abcd owning the launch: the user opts in, and abcd assembles and starts the routine, applying the run contract it already governs (the human git identity per itd-131, the gates, the merge decision, the state issue). This is the realisation of the run seam — adr-27 (run is a pluggable seam, not a bespoke engine), itd-29 (the run operator surface: start/status/pause/resume/ship), itd-107 (routines assemble from one versioned template; the bughunt and a delivery-pipeline archetype), and the reframed iss-381 (the deterministic delivery pipeline survives as an itd-107 archetype, not an engine). When abcd launches the routine it sets the human git identity at launch, which is the clean mechanism the itd-131 identity gate points at for routine commits (vs today's prompt/env workaround). Big, cross-record capability — needs decomposition and likely ideate before it is filable; recorded so the direction is durable.
- iss-2608220150157498Eight typed cross-references point at targets absent from the tree — adr-22 supersedes adr-14, adr-15 and adr-17; adr-25 supersedes adr-8; adr-27 supersedes adr-16; adr-28 supersedes adr-18; adr-35 supersedes adr-4 (all retired under retire-the-name); itd-3 names spec_id spc-1 which has no file — and nothing checks supersedes targets today. The 2026-08-21 site investigation counted six; the in-session grep found eight. The planned site build arms the detector via the .abcd/site-baseline.json ratchet, seeded with what the build finds, and the tombstones-or-stubs question (itd-136/itd-137) decides how they render
- iss-2610252215061740glossary/core/loop.md:35-40 says 'abcd never owns the run loop ... a pluggable adapter supplies the loop itself'; the run seam's native default is a 'thin native Go loop (adr-27)' (05-internals/02-adapters.md:25) and the implement loop is abcd's own loop over a state file (04-surfaces/34-build.md:5-7). The Senses table also lacks the implement/build-loop sense step.md:18 and oracle.md:25 use. docs/reference/terminology.md:45 repeats 'never owns the loop'.
- iss-2610262040284640The spec glossary says specs are driven to completion by the pluggable run seam; the build sequence says the run seam does not ship.
- iss-2610262040545166The glossary says abcd never owns the run loop; the build intent makes abcd's own verb that loop.
- itd-29Domain Experts Run A Spec Autonomously And Recover From Anything Without Touching Git
- itd-47Oracle-Backed Gates Pass Honestly Without A Human In The Loop
- itd-160Eight typed cross-references point at targets absent from the tree — adr-22 supersedes adr-14, adr-15 and adr-17; adr-25 supersedes adr-8; adr-27 supersedes adr-16; adr-28 supersedes adr-18; adr-35 supersedes adr-4 (all retired under retire-the-name); itd-3 names spec_id spc-1 which has no file — and nothing checks supersedes targets today. The 2026-08-21 site investigation counted six; the in-session grep found eight. The planned site build arms the detector via the .abcd/site-baseline.json ratchet, seeded with what the build finds, and the tombstones-or-stubs question (itd-136/itd-137) decides how they render
- itd-2609201916151817One verb takes a READY intent to delivered, and refuses while a decision is open
- spc-38alice-opens-the-record-explorer-and-reads-the-whole-developm
- spc-52dangling-supersedes-and-spec-targets-nothing-checks-them