Development record
RepoPrompt over MCP is one opt-in reviewer route, beside the host's own agents
⚠️ Framing superseded by ADR-25 (host-delegated LLM is the default; RepoPrompt is one optional oracle adapter among many, not abcd's single integration — see also ADR-22). The intent itself stays live and is scheduled in Phase 0's
## Scopeas the oracle adapter seam: read "abcd's only RP integration is MCP" below as the contract of the RP adapter, not of abcd — the RP-specific mechanics (MCP bridge, cascade position,chat_idsemantics) are adapted to the adapter seam at spec time.
Re-filed on 2026-09-21 by the product thinker: not abcd's one integration but one opt-in reviewer adapter. abcd is host-delegated by default; with
oracle.review = rpconfigured, a lane's reviews go to RepoPrompt over MCP, and when it is unreachable the host's own agent runs the review and the receipt says so. The three-step cascade, the setup discovery and the non-Mac flow this record first described are dropped; the press release and scope below are read through this paragraph and the Decisions section. itd-7 waits on this record.
Press Release
abcd has exactly one integration with RepoPrompt: the MCP API. abcd never picks an
oracle, never reads RP's preset selection, never spawns its own subprocess for code review. It calls RP via MCP and RP uses whateveroraclethe persona has configured for whatever task — Claude via the persona's subscription, Codex via the persona's subscription, Gemini, any preset RP knows. The persona configuresoraclebackends inside RP once; abcd uses them forever. Zero abcd-sideoraclelogic, zero "which preset?" prompts, zero hard-coded routing.Status: built as the re-filed route, on 2026-10-12. The re-filed scope, spc-2609211950427074, built it from nothing:
oracle.review = rpopts a lane's reviews in, andinternal/adapter/repopromptspeaks MCP, with the standard library alone, to the server the person names. TheRPUnavailableerror, theMCPBridgeand theoracle.pyaudit-fix loop this record names belong to an earlier Python lineage: its specspc-5-rp-mcp-integration-declare(predecessor store; not thespc-5in this repository's spec store) and its ADR-02 and ADR-03 (not this repository's adr-2 and adr-3). None of them is in this binary, andgo.modcarries no MCP dependency. See the Implementation status section."I had wired up Claude, Codex, and Gemini in RP with task-specific presets," said Bob, staff engineer. "I'd worried abcd would keep asking me which to use. The RP MCP bridge just calls RP; when RP is not reachable it raises a typed
RPUnavailableso the tooling can react cleanly instead of guessing. RP picks theoracle. I don't think about it."
Why This Matters
abcd's oracle backend chain (brief § 6.7) treats RP as one of three transports (RP MCP / Codex CLI / in-session subagent). That framing implied abcd had model-selection logic to manage. It doesn't. RP is not a transport — it's an orchestrator that already abstracts over Claude, Codex, Gemini, and any model the user has configured.
Phase 0's plan-review surfaced a real friction point: getting the right RP model selected for a review felt like work. The fix is not "abcd auto-detects the active model" — it's "abcd's only RP integration is MCP, and RP handles everything else." The user configures models inside RP once (per their tastes, per their subscriptions), and abcd never touches that configuration.
This intent re-frames the brief's RP integration: drop "select RP backend with preset awareness" complexity; lock "MCP call to RP, full stop". The brief § 6.7 already implies this — itd-6 makes it explicit.
What's In Scope
- Single integration point: abcd calls RP via
mcp__RepoPrompt__*tools. Period. No subprocess spawning ofclaude -p, no direct LLM API calls, no model detection. - RP MCP server presence check: ahoy verifies RP MCP is reachable; if not, surface "open RP and try again" once (per session)
- Drop "active model detection": previous draft of this intent assumed abcd needed to read RP's active preset. It doesn't. abcd issues MCP calls; RP routes to whatever the user has configured for that call type.
- Three-transport oracle chain stays: RP MCP (preferred) → Codex CLI subprocess (alternative for non-Mac / no-RP users — RP is macOS-only) → in-session subagent (final fallback). The itd-6 architectural correction is specifically about the RP-side: abcd never reads RP's preset, never picks an RP model, never spawns
claude -pto bypass RP. Codex is a separate transport the user explicitly chooses when they don't have RP. - Failure mode: if RP MCP is unreachable, abcd falls through to Codex if configured, then in-session subagent. Three-step cascade.
- One-time RP setup discovery: ahoy detects the RP MCP server config (in
~/Library/Application Support/RepoPrompt/MCP/or.mcp.json), notes it in.abcd/config.json→oracle.rp.mcp_config_path, and tests reachability. If reachable: lockoracle.backend = "rp". If not: lockoracle.backend = "codex"(if Codex CLI present) or"in-session"(final fallback) and surface a one-time hint about how to enable RP later.
- Same-chat re-review semantics (codified abcd rule, narrowed by ADR-02 § 3): when abcd re-runs an oracle/review/audit after applying fixes (plan-review → fix → re-review; impl-review → fix → re-review; lifeboat-oracle → fix → re-audit), the re-call MUST stay in the same RP chat — never
--new-chat, never freshrp builder. RP chats accumulate context (original artefact + first review + fix summary); same-chat re-runs let the model do incremental "are these fixes correct?" checks instead of starting from scratch. The harnessmcp_callfor an RP audit MUST returnchat_idinMcpResult; the audit-fix loop in abcd'soracle.pyMUST thread that ID back as thechat_idarg on the next call. Narrowed (ADR-02 Criterion 3b): "same chat" means within oneabcd-clicommand invocation's stdio session. Cross-invocation chat continuation requires fresh GUI approval and is out of scope for autonomous operation. Same rule applies whether the backend is RP, Codex, or in-session subagent (in-session usesTaskwith continuation prompts). Verdict direction across iterations: the verdict can change in EITHER direction across audit-fix iterations — a fix can resolve issues (NEEDS_WORK→SHIP) AND a fix can introduce regressions (SHIP→NEEDS_WORK). Both are valid signal; abcd'sre_auditMUST NOT reject downgrades (mirroring the anti-pattern list of spc-2, predecessor store). Lifecycle narrowing (added after spc-5 (predecessor store), per ADR-02 § 3): "same chat" now narrows further — it means same-MCP-session / same-MCPBridge-instance only. In spawn mode the session is perabcd-cliinvocation; in host-reuse mode (ADR-03) the session lives for the lifetime of the injected host harness. Achat_idis only meaningful within theMCPBridgeinstance that produced it — cross-bridgechat_idreuse is undefined behaviour, not a supported continuation path.
What's Out of Scope
- Auto-launching RP if not running (out of scope; user opens RP themselves)
- Configuring presets/models inside RP (RP's UI handles this; abcd reads, never writes)
- Routing different oracle calls to different RP "modes" (e.g., "this audit needs Opus") — abcd issues an MCP call, RP picks; if the user wants a specific model for a specific call type, they configure RP accordingly
- Cost tracking per model (covered by itd-17 model effectiveness tracking — independent concern)
- Spawning Claude Code subprocesses with
claude -p— explicitly NOT how abcd works; abcd is the consumer, not the spawner - Direct OpenAI / Google / Anthropic API integrations — out of scope; route everything through RP
- Capability-aware cascade routing (added 2026-05-08 per idea-4 jagged-frontier review). The cascade defined by this intent (RP MCP → Codex CLI → in-session subagent) is and stays availability-driven (per
04-universal-patterns.md § 7"fixed cascade"). Capability-aware routing — when Frontier Awareness ships — is a pre-cascade selector layer above the cascade, NOT a modification. The selector picks which backend the cascade starts from based on(task_class, agent, model_id) → preferred_backend_ranking; the fixed cascade per this intent and itd-2 begins from that backend without contract change.
Scope Conditions
None stated.
Mechanism
We expect a reviewer route a person has already configured and paid for to be used over one abcd would have to own, because the review is the run's scarcest step and the person's own tool is where their model choices already live; shown wrong if nobody opts in within a release of it shipping.
Acceptance Criteria
- Given
oracle.review = rpin the repository's or the machine's abcd configuration, when abuildlane reaches its reviews, then the ruthless and security review requests are sent to RepoPrompt over MCP and each returned verdict is recorded by the loop as any validator's is. - Given the adapter is configured and RepoPrompt is unreachable, when a review is due, then the host's own agent runs it and the receipt states that the review fell back and why; no review is silently skipped.
- Given the adapter is not configured, when a review runs, then nothing differs from today, and abcd never spawns, installs or configures RepoPrompt.
- Given the adapter ships, when the brief's adapters chapter and the command page are read, then the adapter is one entry beside the command-line runner, with the opt-in named.
Decisions
Ruled by the product thinker on 2026-09-21, in the interview that gave this intent its spec:
- One opt-in reviewer route, not the integration; the host stays the default.
- Reviews only, not audits.
- Unreachable falls back to the host, with the receipt saying so.
- itd-7 waits on this record and is not in the run.
Open Questions
None open.
Resolved (post-spc-5)
These questions were settled against the earlier Python lineage's design — its spc-5 spec (predecessor store) and its ADR-02 and ADR-03, not this repository's spc-5, adr-2 and adr-3 — and the Phase 0 harness-interface research note (01-harness-interface.md). The answers stand as design input for the re-filed adapter; the MCPBridge, McpResult, RPUnavailable and oracle.py they name are that lineage's, and none of them is in this binary.
- Does RP MCP support the long-running, async-result pattern abcd needs (e.g., a 5-minute Carmack review)? Or is it strictly synchronous within an MCP call lifetime?
Resolved by ADR-02 § 4: the
MCPBridgecontract is synchronous within an MCP call lifetime —mcp_callblocks for the call's duration. There is no async-result handle. The long-running case is handled by a generous per-toolcall_timeout_sbudget (oracle_send/context_builderget 600 s) inside one held-warm stdio session, not by an async poll. - If RP MCP returns a chat ID for long-running work, how does abcd poll/listen for completion?
Resolved by ADR-02 §§ 3–4: there is no polling. The call is synchronous;
mcp_callreturns when the tool call returns. Thechat_idonMcpResultis for same-session re-review threading, not completion polling. The async-vs-sync decision referenced for "Task 5's harness.py" is settled — the harness method stays synchronous (ADR-01 § 3 lock), and the concrete sync↔async bridge is internal to theMCPBridgeof spc-5 (predecessor store). - Chat identity and continuation — what does a
chat_idmean, and can a chat be resumed acrossabcd-cliinvocations? Resolved by ADR-02 § 3 and the spc-5 (predecessor store).6exception mapping: achat_idis meaningful only within theMCPBridgeinstance / MCP session that produced it. Cross-invocation (and cross-bridge) chat continuation is not supported — RP's GUI approval gate forecloses it, and any RP-infrastructure failure surfaces as the typedRPUnavailable(OSErrorsubclass) declared by spc-5 (predecessor store). "Same chat" therefore means same-MCP-session only; the spc-5 (predecessor store).6failure-path mapping routes every unreachable-RP path throughRPUnavailableso callers cascade cleanly rather than relying on a stalechat_id.
Resolved Questions
- Failure semantics: if an MCP call to RP times out, does abcd retry, fall through to in-session, or both?
Resolved by ADR-02 (spc-4-phase-0-p1-patch-viability-framing-mcp.4, predecessor store):
On any RP-infrastructure failure (
RPUnavailable— subprocess spawn fail,startup_timeout_sexpiry, RP approval denial viaMcpError: Connection closed,call_timeout_sexpiry, or mid-call transport failure),oracle.pyroutes todispatch_agent(agent_name="codex", ...). No silent retry within the RP transport; fall-through IS the retry (to the next cascade level). Timeout defaults:startup_timeout_s = 10.0 s(combined spawn + initialize);call_timeout_sdefault 30 s with per-tool overrides. See ADR-02 §§ 4–6. The re-filed Decisions (3) replace the Codex step: an unreachable RepoPrompt falls back to the host's own agent, with the receipt saying so, and this repository has nooracle.py.
Implementation status
Prerequisites, recorded 2026-09-29 (iss-2609240227236354). The readiness gate
reads this record READY, but its spec (spc-2609211950427074) stands on four
things the tree does not hold yet, and builds_on names the four intents
behind them:
- The validator stage the adapter implements.
abcd buildships its loop's first pieces, and the validators are a later piece of the same spec (itd-2609201916151817, spec spc-2609202134338445 open; seeinternal/core/implement/loop/loop.go). - The
oracle.reviewroute. The layered configuration reader (internal/core/layered) exists; the review-route intents it serves, itd-2609170822093401 and itd-2609201925079472, are still planned with specs open. - The command-line runner the adapters chapter entry sits beside (itd-2609201916056194, spec spc-2609221533057881 open).
- An MCP client. The spec's Approach names one as a new dependency, subject
to the new-dependency sign-off;
go.modcarries none.
The readiness gate does not read builds_on, so these edges inform a reader
and a run that picks this record; they do not change the gate's verdict.
Built on 2026-10-12 by
spc-2609211950427074,
from nothing: the validate stage and the command-line runner had landed, the
oracle.review key is read through internal/core/layered by the delivery's own
reader, and the MCP client is the standard library's, so go.mod still carries no
MCP dependency. Before it, a grep for MCPBridge, RPUnavailable and RepoPrompt
over internal/ and cmd/ found only the scanner's RepoPrompt session-key pattern
(internal/adapter/scanner/patterns.go), a guard corpus line, and the doc comment of the
configuration layer (internal/core/layered) naming oracle.review as a consumer it serves.
The bridge, the typed error
and the host-reuse path an earlier Python lineage's spc-5-rp-mcp-integration-declare (predecessor store) describes
belong to that lineage, not to this binary, so no part of the route was a foundation to build on.
The four acceptance criteria above are the re-filed set, and
spc-2609211950427074
carries all of them.
Audit Notes
Fidelity review — receipt rcp-d270e2e0acfb (verifier abcd:intent-auditor claude-opus-5-5).
Provenance: abcd:intent-auditor@claude-opus-5-5 · rubric_hash sha256:effa65b3e9e88ff29433b443ec2be159522a8b0b71cf1434526514aa61edb13e · prompt_hash sha256:ac9edc6f4a31d514575d1b4b0d066d26901309910e8b635ba651cdbbca57f36f Input attestations: diff:d1255b8c59858e7a795005631f89cb28c1b659b6..141a1b9be0e3887c6d6533eda0d9c328f2497c52, the change PR #976 (feat/repoprompt-reviewer-cloud) brought onto main on 2026-10-15: 35 commits, 67b6e22e0 to 331d18bc0, including the spec close 94128c891; located from git history, since the request names no range@-; repository:2e03c61e454bf09ecda8cee0ae2f377157b522f7 (origin/main when reviewed); the route's code is unchanged since 141a1b9be apart from two assertions in validate_review_test.go@-;
Acceptance rollup: MET 3 · MET_WITH_CONCERNS 0 · NOT_MET 0 · INCONCLUSIVE 1
Audit owed (receipt rcp-d270e2e0acfb): ac-1 INCONCLUSIVE. Remedy: re-run the audit. Carried by iss-2610241426406882.
Per-criterion verdicts:
- ac-1 — INCONCLUSIVE: abcd's side is built: oracle.review is read from either file, implement step hands a ruthless or security review given to the host to DriveReview, the adapter sends it as one MCP Streamable HTTP session, and the return is checked by the same parseVerdict and recorded through the same receipt as a host's. Whether the requests reach RepoPrompt cannot be settled from the inputs. Every test answers from mcptest, a server the test owns, and the brief says no test reaches a real RepoPrompt. The adapter assumes RepoPrompt serves Streamable HTTP at a loopback URL and offers oracle_send taking message, and nothing in the delivery checks either. Ruling H1b (dcn-2609290000000007) says itd-6 is finished only after one run against the real RepoPrompt app, and no such run is recorded. The route is also narrower than the Given: oracle.review = rp alone sends nothing, because the route needs oracle.rp.url in the machine's file (the repository's file is refused) and otherwise falls back as absent. evidence: internal/surface/cli/build.go:1045 — "review, lerr := loop.LoadReviewRoute(roots, agentPrompt)" evidence: internal/surface/cli/build.go:1059 — "res, err = loop.DriveReview(ctx, root, id, res, loop.DefaultStages(), loop.Options{}, review)" evidence: internal/adapter/repoprompt/repoprompt.go:244 — "args := map[string]any{"message": request}" evidence: internal/core/implement/loop/validate.go:946 — "route := runner.RouteRecord{Asked: rr.Name, Ran: rr.Name}" evidence: internal/core/implement/loop/validate.go:569 — "word, err := parseVerdict(string(raw), reviewerVerdicts[v.Role])" evidence: internal/core/implement/loop/validate_review_test.go:80 — "func TestTheReviewsGoToRepoPromptOverMCPAndTheLoopRecordsTheirVerdicts(t *testing.T) {" evidence: internal/adapter/repoprompt/mcptest/mcptest.go:3 — "no test reaches a real RepoPrompt or the network" evidence: .abcd/development/brief/05-internals/02-adapters.md:247-249 — "RepoPrompt's MCP server must therefore answer over HTTP at that address; abcd starts no bridge to a server that speaks only stdio." evidence: .abcd/work/decisions/dcn-2609290000000007-the-product-thinker-answered-twenty-six.md:6 — "itd-6 is finished only after running once against the real RepoPrompt app, a check owed to a person" evidence: internal/core/oracle/review.go:108 — "if f.Layer != layered.Machine {" evidence: internal/core/implement/loop/validate.go:1331 — "return "", &reviewFailure{runner.ReasonAbsent, rr.Absent}"
- ac-2 — MET: With the route configured and nothing answering (connection refused, a bound run out, no server named, a refused or unparsable answer, a return with no verdict, a step interrupted), DriveReview hands every review with no usable return to fallBack. fallBack records a FallbackReceipt (role, asked rp, reason, abcd's detail, ran host) in the run's state and record, retried while the lock is busy, and the step's next move names it. The host is handed the same brief and return path, and its return is then recorded as any validator's. Loop and front-door tests hold each reason, and status and record count the fallbacks. evidence: internal/core/implement/loop/validate.go:923 — "return fallBack(repoRoot, runID, res, aw, rr, err, o)" evidence: internal/core/implement/loop/validate.go:1003 — "fb := runner.FallbackReceipt{At: o.now(), Role: aw.Role, Asked: rr.Name, Reason: runner.ReasonFailed, Detail: fallbackDetail(cause), Ran: runner.Host}" evidence: internal/core/implement/loop/drive.go:218-220 — "the %s was routed to %s, which was %s (%s); %s runs it" evidence: internal/core/implement/loop/validate_review_test.go:198 — "func TestAReviewTheRouteDoesNotReturnFallsBackToTheHostWithAReceipt(t *testing.T) {" evidence: internal/core/implement/loop/validate_review_test.go:296 — "func TestAnInterruptedStepFallsBackAsInterrupted(t *testing.T) {" evidence: internal/surface/cli/build_review_surface_test.go:115 — "func TestAReviewTheOracleDoesNotReturnFallsBackAndIsCountedAtTheFrontDoor(t *testing.T) {"
- ac-3 — MET: With oracle.review unset or host, LoadReviewRoute returns nil and DriveReview passes the step's result through untouched, and oracle.rp is not read at all off the rp route. A test holds the step's result and the state byte-identical to the plain host-driven step, with no request rendered. The adapter's files import no process, file, environment or system-call API. No other abcd code references RepoPrompt or writes oracle.review or oracle.rp; the scanner's pre-existing sessionKey pattern only redacts. evidence: internal/core/implement/loop/validate.go:867 — "if rv.Route != oracle.ReviewRP {" evidence: internal/core/implement/loop/validate.go:902 — "if rr == nil || res.Awaiting == nil || !res.handed || res.Route != nil || res.Fallback != nil {" evidence: internal/core/oracle/review.go:86 — "if rv.Route != ReviewRP {" evidence: internal/core/implement/loop/validate_review_test.go:320 — "func TestAnUnconfiguredRouteLeavesTheReviewAndTheStateByteIdentical(t *testing.T) {" evidence: internal/core/oracle/review_test.go:37 — "func TestTheReviewRouteIsTheHostUnlessConfigured(t *testing.T) {" evidence: internal/adapter/repoprompt/nothing_test.go:17 — "func TestTheAdapterStartsNothingAndReadsNothing(t *testing.T) {" evidence: internal/adapter/repoprompt/repoprompt.go:9 — "The adapter connects and nothing else. It never starts RepoPrompt or any"
- ac-4 — MET: The adapters chapter puts both reviewer routes under one heading, the command-line runner and RepoPrompt over MCP as adjacent bullets, each naming its opt-in (roles.< role>.runner; oracle.review = rp with oracle.rp.url in the machine's file). The build command page puts the RepoPrompt paragraph right after the command-line runner's, naming the same opt-in, and the implement page does the same.
evidence: .abcd/development/brief/05-internals/02-adapters.md:189 — "### Reviewer routes — the command-line runner, and RepoPrompt over MCP"
evidence: .abcd/development/brief/05-internals/02-adapters.md:197 — "- The command-line runner (
internal/core/runner, itd-2609201916056194)" evidence: .abcd/development/brief/05-internals/02-adapters.md:226-228 — "RepoPrompt over MCP (internal/adapter/repoprompt, itd-6) sends the review to the RepoPrompt the person runs, which answers with whichever model the person configured in it. The opt-in isoracle.review = rpin the" evidence: commands/build.md:401 — "A role can run through a command-line runner instead of an agent you start." evidence: commands/build.md:443-444 — "A build lane's reviews can go to RepoPrompt over MCP instead of a reviewer you start. This is an opt-in:oracle.reviewset torpin the repository's" evidence: commands/implement.md:287 — "Withoracle.reviewset torp(the repository's.abcd/config.jsonor"
Gap audit:
- honoured:
- Host-delegated by default, and oracle.review = rp in the repository's or the machine's file opts a lane's reviews in, the repository's file winning (decision 1). evidence: internal/core/oracle/review.go:76 — "v, err := layered.Get(s, ReviewKey, ReviewHost, func(name string) error {" evidence: internal/core/oracle/review_test.go:52 — "func TestOracleReviewIsReadFromTheRepositoryOrTheMachine(t *testing.T) {"
- abcd picks no oracle and no model and reads no RepoPrompt preset: the request carries only the tool's message (and new_chat when the tool declares it), and RepoPrompt answers with the model the person configured. evidence: internal/adapter/repoprompt/repoprompt.go:6 — "RepoPrompt answers with whichever model the person configured in it" evidence: internal/adapter/repoprompt/repoprompt.go:244 — "args := map[string]any{"message": request}"
- abcd spawns nothing for a review and never starts, installs or configures RepoPrompt: the adapter only connects to the address it is handed, and a test holds its imports to no process, file or environment API. evidence: internal/adapter/repoprompt/nothing_test.go:17 — "func TestTheAdapterStartsNothingAndReadsNothing(t *testing.T) {" evidence: internal/adapter/repoprompt/repoprompt.go:9 — "The adapter connects and nothing else. It never starts RepoPrompt or any"
- An unreachable RepoPrompt falls back to the host's own agent, and a receipt says it fell back and why, counted per route and per role (decision 3). evidence: internal/core/implement/loop/validate.go:1003 — "Asked: rr.Name, Reason: runner.ReasonFailed, Detail: fallbackDetail(cause), Ran: runner.Host}" evidence: internal/core/implement/loop/drive.go:218 — "st.Fallbacks = append(st.Fallbacks, fb)" evidence: internal/surface/cli/build_review_surface_test.go:115 — "func TestAReviewTheOracleDoesNotReturnFallsBackAndIsCountedAtTheFrontDoor(t *testing.T) {"
- Reviews only, not audits: only the ruthless and security reviewers take the route, and the intent-auditor stays on the host (decision 2). evidence: internal/core/implement/loop/validate.go:906 — "words, ok := reviewerVerdicts[aw.Role]" evidence: internal/core/implement/loop/validate_review_test.go:1027 — "func TestAnAuditorsVerdictIsNeverTheRoutes(t *testing.T) {"
- MCP is spoken with the standard library alone, so go.mod carries no MCP dependency; the delivered range leaves go.mod and go.sum unchanged (Status paragraph). evidence: internal/adapter/repoprompt/repoprompt.go:2-3 — "a client of the Model Context Protocol's Streamable HTTP transport, spoken with the standard library alone" evidence: go.mod:5-13 — "require ("
- The brief's adapters chapter and the command page show the adapter as one entry beside the command-line runner, with the opt-in named (spec scope 5). evidence: .abcd/development/brief/05-internals/02-adapters.md:189 — "### Reviewer routes — the command-line runner, and RepoPrompt over MCP" evidence: commands/build.md:443-444 — "A build lane's reviews can go to RepoPrompt over MCP instead of a reviewer you start. This is an opt-in"
- diverged:
- The Given 'oracle.review = rp in the repository's or the machine's configuration' sends the reviews to RepoPrompt (re-filed paragraph, ac-1, CHANGELOG.md:109). In the delivery the route also needs oracle.rp.url, which only ~/.abcd.noindex/config.json may declare (a repository declaring oracle.rp is refused). With oracle.review = rp alone, every review falls back as absent. The spec records this as an agent's choice for review, and open issue iss-2610151422150430 notes the changelog line omits the URL.
evidence: CHANGELOG.md:109 — "With
oracle.review = rpin the repository's or the machine's abcd configuration, abuildlane sends its ruthless and security reviews to RepoPrompt over MCP" evidence: internal/core/oracle/review.go:108 — "if f.Layer != layered.Machine {" evidence: internal/core/implement/loop/validate.go:1331 — "return "", &reviewFailure{runner.ReasonAbsent, rr.Absent}" evidence: .abcd/development/specs/closed/spc-2609211950427074-rp-mcp-only-integration.md:70 — "2026-10-12 (agent's choice, for review): **The server's address is the" - 'It calls RP via MCP' (first scoped as the mcp__RepoPrompt__* tools) is delivered as MCP's Streamable HTTP transport only, to a loopback URL the person names. A RepoPrompt MCP server that speaks only stdio is out of reach, since abcd starts no bridge. The tool shape (oracle_send taking message, optional new_chat) is assumed, not checked against RepoPrompt. evidence: .abcd/development/brief/05-internals/02-adapters.md:247-249 — "RepoPrompt's MCP server must therefore answer over HTTP at that address; abcd starts no bridge to a server that speaks only stdio." evidence: internal/adapter/repoprompt/repoprompt.go:55 — "const DefaultTool = "oracle_send"" evidence: internal/adapter/repoprompt/repoprompt.go:329 — "the %s tool takes no message argument, so it cannot take a review request"
- The typed RPUnavailable of the press release's quote is delivered as *repoprompt.Error with a Kind (unreachable, timeout, refused, unparsable, failed) that becomes the fallback's reason. No RPUnavailable type exists, as the Status paragraph says. evidence: internal/adapter/repoprompt/repoprompt.go:125 — "KindUnreachable Kind = "unreachable"" evidence: internal/adapter/repoprompt/repoprompt.go:134 — "type Error struct {"
- The in-scope same-chat re-review semantics (a re-review MUST stay in the same RP chat, with chat_id threaded back) are delivered as a new chat for every review (new_chat: true when the tool declares it), and no chat_id is read. The re-filing's list of drops does not name this rule; the spec records the drop as an agent's choice for review. evidence: internal/adapter/repoprompt/repoprompt.go:246 — "args["new_chat"] = true" evidence: .abcd/development/specs/closed/spc-2609211950427074-rp-mcp-only-integration.md:99-100 — "the intent's same-chat re-review rule belongs to the predecessor lineage the re-filing set aside"
- The original scope's three-step cascade (RP MCP, Codex CLI, in-session) and ahoy's one-time setup discovery were dropped by the 2026-09-21 re-filing. The delivery is one route that falls straight back to the host. ahoy's presence check ('open RP and try again' once per session), which the re-filing does not name, is not built: reachability is found per review and recorded as the fallback's reason. evidence: internal/core/implement/loop/validate.go:1003 — "Ran: runner.Host}" evidence: internal/adapter/repoprompt/repoprompt.go:11 — "for a server: the one address it reaches is the URL its caller hands it"
- The Given 'oracle.review = rp in the repository's or the machine's configuration' sends the reviews to RepoPrompt (re-filed paragraph, ac-1, CHANGELOG.md:109). In the delivery the route also needs oracle.rp.url, which only ~/.abcd.noindex/config.json may declare (a repository declaring oracle.rp is refused). With oracle.review = rp alone, every review falls back as absent. The spec records this as an agent's choice for review, and open issue iss-2610151422150430 notes the changelog line omits the URL.
evidence: CHANGELOG.md:109 — "With
- missing:
- The live run against the real RepoPrompt app. Ruling H1b says itd-6 is finished only after one such run, a check owed to a person. The delivery moved the intent to shipped/ with every test on a test-owned MCP server and no record of the run, and no ledger issue tracks it as owed; the command-line runner's equivalent is tracked as iss-2609301519558538. evidence: .abcd/work/decisions/dcn-2609290000000007-the-product-thinker-answered-twenty-six.md:6 — "itd-6 is finished only after running once against the real RepoPrompt app, a check owed to a person" evidence: .abcd/development/brief/05-internals/02-adapters.md:276-277 — "No test reaches a real RepoPrompt: every one runs against an MCP server the test owns on the loopback address." evidence: internal/adapter/repoprompt/mcptest/mcptest.go:3 — "no test reaches a real RepoPrompt or the network"
Linkage note (2026-09-30)
builds_on named itd-2 (in-session subagent dispatch), which is superseded by
itd-2609201916056194. The edge is dropped: its live successor is already in this
record's builds_on, so the relink would list it twice.
Grounds
- pursued: the run's reviews are its scarcest step, one at a time on a weekly budget that ran out mid-pilot, and a second route is the relief; we expect the person's own configured reviewer to carry some of them; shown wrong if nobody opts in within a release
Frontmatter
| id | itd-6 |
|---|---|
| type | intent |
| lifecycle | shipped |
| kind | standalone |
| severity | minor |
.abcd/development/intents/shipped/itd-6-rp-mcp-only-integration.md
open on GitHub ↗ · commit history ↗
References4
- itd-2609170822093401abcd proposes the model each agent deserves, and facilitates it where it canbuilds on
- itd-2609201916056194A role runs through the command-line harness the operator chose, and every fall back to the host is recordedbuilds on
- itd-2609201916151817One verb takes a READY intent to delivered, and refuses while a decision is openbuilds on
- itd-2609201925079472An autonomous run paces itself by default, and one flag sets the pacebuilds on
Referenced by32
- adr-2609221009491186A provider adapter serves only the models it lists, under a vendor denylist no listing overrides; everything else runs on the hostrelated
- adr-2609300107513982A provider adapter's allowlist alone decides which models it serves, and abcd bundles no vendor denylistrelated
- iss-2610241426406882The after-merge fidelity audit of itd-6 could not decide a criterion, so its check is still owed: ac-1 INCONCLUSIVErelated
- iss-2610262032144104itd-6 keeps a fixed RP MCP → Codex CLI → in-session cascade; the dependencies page says no such fixed cascade exists and that RepoPrompt, codex and a direct API oracle are opt-in adaptersrelated
- iss-2610262033202441itd-6 says abcd makes no direct LLM API calls, only RP over MCP; 01-ahoy has delegating verbs send steps straight to a configured providerrelated
- iss-2610262033219255itd-6 has ahoy discover RP and lock `oracle.backend = "rp"`; 01-ahoy records host-delegated without asking, as the only answer with an adapterrelated
- iss-2610262035171024itd-6's scope makes RepoPrompt over MCP the preferred oracle transport ahead of a Codex CLI and the in-session agent; the status-board chapter says every delegated step runs through the harness unless a routing table is acceptedrelated
- iss-2610262036514870itd-6 says abcd never spawns Claude Code subprocesses; the guard chapter describes agents that abcd starts through its claude runnerrelated
- iss-2610262036529540itd-6 rules out direct provider integrations and sends everything through RP; the reading chapter routes a cold-reading position straight to a configured provider through abcd's own tier routingrelated
- iss-2610262038033829itd-6 selects the reviewer route with `oracle.backend` (rp, codex, in-session); 34-build selects it with `oracle.review` (host, rp)related
- iss-2610262038043808itd-6 falls an unreachable RepoPrompt through Codex and then an in-session subagent; 34-build falls a review the rp route does not return straight back to the hostrelated
- iss-2610262038052818itd-6 says abcd never spawns Claude Code subprocesses; 35-drain has the drain move start the claude runner for the drain judge itselfrelated
- iss-2610262040082360The agent catalog says the oracle seam is never a fixed cascade; itd-6 says its RP MCP, then Codex CLI, then in-session cascade is the fixed cascade of universal-patterns § 7related
- iss-2610262040093616The adapters chapter says the RepoPrompt route opens a new chat for each reviewer; itd-6 requires re-reviews to stay in the same RP chat, never a new onerelated
- iss-2610262040125215The configuration chapter says abcd never configures RepoPrompt or writes its route keys; itd-6 has ahoy find RP's server config and write it into .abcd/config.jsonrelated
- iss-2610262042130595itd-6 keeps a re-review in the same chat for every backend, the in-session subagent included; the verification matrix says consecutive host-delegated calls are independent dispatches.related
- iss-2610262042143519itd-6 rules out direct provider API integrations and puts RP MCP first in the oracle cascade; the build sequence ships an opt-in OpenAI-compatible provider and makes the host the default.related
- iss-2610262043470447itd-25 says agents are host-delegated by default with RepoPrompt opt-in; itd-6 keeps RP MCP as the preferred first backend in the oracle chainrelated
- iss-2610262043485833itd-19 sets the oracle backend from the project's stage; itd-6 has ahoy lock it based on whether RP is reachablerelated
- iss-2610262043494574itd-2609301918174237 sends the auditor and consistency pass to remote providers; itd-6 rules out direct provider API integrationsrelated
- iss-2610262044485589Shipped itd-6 says abcd has no oracle logic and no routing of its own; itd-2609170822093401 has abcd propose and apply a model tier for each agentrelated
- iss-2610262044499326Shipped itd-6 sends a lane's reviews to RepoPrompt through `oracle.review`; itd-2609170822093401 says nothing reads the oracle value and builds a separate routing table for each agentrelated
- iss-2610262044503777Shipped itd-6 says abcd only uses agent sessions and never starts Claude Code ones itself; itd-2610222215485265 has `abcd drain --drive` start Claude sessionsrelated
- iss-2610262044512344Shipped itd-6 leaves cost tracking per model to itd-17; itd-2609221009495079 records itd-17 as supersededrelated
- iss-2610262045146746itd-6 rules out direct provider API integrations and routes everything through RP; itd-166 records model calls made through command-line runners and provider connectionsrelated
- iss-2610262045177576itd-6 still calls the lifeboat verdict pass lifeboat-oracle and re-audit; itd-125 renamed it a review so that one word names itrelated
- iss-2610262045365573itd-6 says abcd never spawns claude -p; itd-2609201916056194 ships a claude CLI print-mode runnerrelated
- iss-2610262045372683itd-6 rules direct model API integrations out and routes everything through RepoPrompt; itd-2609081951381895 ships an OpenAI-compatible API adapterrelated
- itd-2609081951381895abcd ships an OpenAI-compatible API adapter, and a provider serves only the models it listsrelated
- itd-2609201916056194A role runs through the command-line harness the operator chose, and every fall back to the host is recordedrelated
- itd-2609221017023290abcd keeps every external credential the same wayrelated
- spc-2609211950427074rp-mcp-only-integrationimplemented by
mentions37
- adr-1Three-layer mental model (brief / intent / spec)
- adr-2Three intent kinds (standalone / bundle-member / discipline)
- adr-3Directory location is the source of truth for lifecycle state
- adr-22Bundled dependencies become pluggable adapters over a native default
- adr-25The LLM is host-delegated by default; oracles are opt-in adapters
- dcn-26070800000000142026-07-08 — itd-37's itd-36 edge downgraded blocked_by → builds_on: the
- dcn-26092500000000052026-09-25 — The layered configuration resolver has one home, `internal/core/layered`, and two file families; every later consumer reads through it rather than opening a file of its own (lane implementer, autonomous run A, on spc-2609180535002478 part 1). Precedence is flag, then repository, then machine, then bundled, and every value comes back with the layer and the origin that supplied it. The families are `layered.Config`, which is `.abcd/config.json` in the checkout the session resolved and `~/.abcd/config.json` on the machine, and `layered.OracleRouting`, which is `.abcd/config/oracle-routing.json` and `~/.abcd/oracle-routing.json`, the files itd-2609170822093401 names. Scalar keys go in `Config` under a namespace: `pace.*` (itd-2609201925079472), `oracle.review` (itd-6), `roles.<role>.runner` (itd-2609201916056194) and `match.threshold` (itd-2609212137116617). The per-agent routing table keeps its own file, as its intent names, and no new file family is added without an entry here. Loudness: an absent file is an absent layer; a present file that is malformed, symlinked, carries a key twice, trails content, declares the wrong `schema_version`, or (machine layer) is not the caller's own owner-only-writable file is an error naming it; a consumer claims its namespace and every key in it (`Stack.Claim`, with `*` for an open segment such as the role name), and an unknown key under a claimed namespace is refused. Because ahoy writes `oracle.backend` into the shared file, whoever claims `oracle` lists `backend` too. A winning value that does not decode or fails its check is refused, and nothing falls through to a lower layer or to the default.
- dcn-26092500000000072026-09-25 — Every claimant of a shared namespace in `.abcd/config.json` lists the union of the keys any writer puts there, not only the keys it reads itself (lane implementer, autonomous run A, on the tier1 review's finding 3; this adds to the entry above on the layered resolver and does not amend it). `Stack.Claim` holds no registry across callers: each claim refuses every key it does not list, so two claimants listing different subsets each refuse the other's file. For the `oracle` namespace the union today is `backend` (written by `ahoy install`), `review` (itd-6's reviewer route) and `rp` (itd-6's `oracle.rp.mcp_config_path`, which ahoy's setup discovery writes), so itd-6's claimant calls `Claim("oracle", "backend", "review", "rp")`, and a key a later writer adds under `oracle` is added to every claimant in the same change. Separately, the ceiling of 1 recorded above makes a routing row's `fan_out` inert today: every value either equals the ceiling or is clamped to it, and the field only bites once an agent contract declares a ceiling above 1.
- dcn-26092900000000072026-09-29 — The product thinker answered twenty-six owed rulings and the published-history question in one interview, asked one at a time by orchestrator abcd-23 of autonomous run A (recorded by lane recRulings for orchestrator abcd-cb). The answers are kept verbatim in the local-tier file `.abcd/.work.local/scratch/reports/rulings-answered-2609-29.md`, dated 2026-09-29, and are restated here because that file is not committed. Published history is left as it is, with no rewrite. The build loop's fidelity audit runs once, on the lane that closes the spec, over the whole delivery (AI). On the vendor denylist the product thinker answered, verbatim: "I think we need an allow list rather than trying to catch a deny list." The interviewer's reading of that answer, recorded as a reading and not as the product thinker's words, is that the per-provider allowlist is the control and the vendor denylist is not extended to chase spellings, with whether the bundled `anthropic/*` entry stays as a backstop left to the technical facilitator (AA(a)). Only a route the person set up on their own machine may use their paid key, and a repository's own route to it is refused, which replaces the route half of itd-2609081951381895 decision 8 (AA(b)). The live site setup, the API adapter and the decision adapter may each close on tests against a simulated service, with the live paid check recorded as owed to a person (iss-2609291925387011, iss-2609291925393913, iss-2609291925398978). itd-111's last criterion is met by an agent's timing check on macOS plus the Linux CI run, so the intent may be finished. Automated dependency updates are switched on, pushed with a personal or app token the person creates and stores as a repository secret (itd-2609221842494980; creating the token is the person's act, and the lane builds everything else and names the secret it expects). itd-6 adds a Go MCP module, proposed for the person's explicit sign-off before it is fetched; closing itd-6 on a fake server was not ruled in this interview. (A later answer the same day, H1b in the local-tier file `.abcd/.work.local/scratch/reports/rulings-answered-2609-29-b.md`, dated 2026-09-29, rules that it is not: itd-6 is finished only after running once against the real RepoPrompt app, a check owed to a person.) For itd-148: the store under the home folder wins (adr-2609091248200336); the store draft itd-2609091014076309 owns add, list and clean-up and itd-148 uses them; a session that declares itself the coordinator is exempt from the write block in the primary checkout and every other session is blocked; and the store draft is planned first, with nothing from the store draft, the merged-worktree clean-up included, built before its planning interview (Q4). itd-148's own wait is not part of that ruling: it follows from Q2, because itd-148 uses the store's verbs, and is carried by the `blocked_by` below. itd-148 and spc-42 are rewritten to match in this change, and itd-148 is now `blocked_by` the store draft. A release retrospective is seeded from a release, the intents a tag shipped (AD); itd-24 and its spec are rewritten to the release in this change. An unpointed route is refused naming the one setting to add, as built in 35100512e, so AC11 of itd-2609170822093401 is complete (BR1). A missed target becomes `next`, whatever the following release is numbered (BS1). Spec pieces keep "step" and the lane stages are renamed, a breaking change to the JSON fields `step`, `performed` and `refusal.step` that resolves iss-2609291313276243 and corrects the glossary entry `core/step.md` (BU1), and the old command spellings are removed in that same breaking release (BT1). The text board shows Later as a count only while the site and `--json` keep the full list (BV1), and an intent in progress appears only under Now (BV2). A pause of zero is allowed (BW1); drain stays in the agents' help list until it runs end to end (BX1); a managed repository must hold the drain eligibility decision in its own record, and drain refuses there until it does (BX2); a capture without a remedy is refused (BX3), which tightens the one-line capture friction `commands/capture.md` promises, so the lane that builds it reconciles that page, the principle wording and every caller that files a capture; a run's pick reason keeps the shared `pursued:` kind with its marker (BZ1); and an intent whose blocker was superseded waits on the successor, transitively (BZ2). The five itd-48 follow-ups are planned as one intent, drafted as itd-2609291923559186 (BT2), and all warn rules share one shrink-only baseline file in which a new warning fails, drafted as itd-2609291924469783 (BT3); both drafts wait on their planning interviews. Each ruling that contradicts a shipped behaviour or another record is amended in the change that builds it, not here. itd-7's planning interview stays owed.
- iss-22itd-6 sits in planned/ while its own banner records supersession-in-framing by ADR-25 (one optional adapter among many); lifecycle look needed
- iss-251Two lint engines under one vocabulary: internal/core/repolint (post-itd-6 rename; Rule/Evaluate/tri-state exit) and internal/core/lint (RuleConfig/Finding stream) are separate engines with separate rule models and config schemas, already entangled (repolint's rule_docs.go wraps docs-lint as a conformance rule). Every new rule author must pick an engine. Consolidating the rule models is a deliberate future intent - deliberately kept out of the itd-123-era rename sweep after adversarial review of merge-now vs rename-only.
- iss-2608221457227162a superseded Phase-0 pseudo-ADR sits in research/notes/ claiming ADR-01, outside every record gate
- iss-2609211738504433A planned intent with no spec cannot be given one by any verb. Fourteen intents sit in planned/ with spec_id null (itd-6, 7, 24, 27, 28, 34, 36, 42, 48, 50, 53, 58, 63, 69), planned before the spec seam existed; the readiness gate reports each as not ready, and the autonomous run treats them as skips with a planning brief each. The way to a spec is closed on every side: intent plan on an already-planned record does the identity step alone and touches no spec; intent link writes a spec_id only for a spec that exists; the spec store has no mint of its own, only close. So the only path is a hand move of the record from planned/ back to drafts/ and a fresh plan, which no verb performs and the lifecycle does not name. Wanted: intent plan on a planned record whose spec_id is null mints and links the spec the way it does for a draft, without moving a bucket, on the same human sign-off; the readiness gate's remedy names that command instead of one that cannot run.
- iss-2609240227150859itd-6's Implementation status and its post-spc-5 Status paragraph say spc-5 built a typed RPUnavailable error in internal/core and a concrete MCPBridge (the ADR-02 spawn implementation and the ADR-03 host-reuse path), and its Resolved sections route failures through oracle.py. None of it is in the binary: grep for MCPBridge, RPUnavailable and RepoPrompt over internal/ and cmd/ finds only the scanner's RepoPrompt sessionKey pattern (internal/adapter/scanner/patterns.go) and a guard corpus line, and go.mod carries no MCP dependency. The sections describe an earlier Python lineage, so a planner or an implementer reading the planned record is told a foundation exists that does not; the re-filed scope (spc-2609211950427074) needs that foundation built from nothing.
- iss-2609240227236354itd-6 passes its readiness gate (intent ready itd-6: READY, all seven checks ok) but cannot be built from today's tree: its spec spc-2609211950427074 stands on four things that do not exist. (1) The build loop's validator stage the adapter implements, itd-2609201916151817 (planned, spec spc-2609202134338445 open; there is no build verb). (2) The layered oracle.review resolver the model-tier and pacing intents share, itd-2609170822093401 and itd-2609201925079472 (both planned, specs spc-2609180535002478 and spc-2609202134341288 open). (3) The command-line runner the adapters chapter entry sits beside, itd-2609201916056194 (planned, spec spc-2609221533057881 open). (4) An MCP client, which the spec's Approach names as a new dependency subject to the new-dependency sign-off; go.mod has none. itd-6 declares builds_on [itd-2] only, so the gate has no edge to refuse on and READY reads as buildable to a run that picks it.
- iss-2609240227447110itd-7 (planned, spec_id null) hangs its workspace pull on abcd dev-sync, which has no verb and no code: the CLI's command list carries no dev-sync, grep over internal/ and cmd/ finds none, and the only record of it is the draft itd-13 (scheduled dev-sync). Its lifeboat route does not exist either: embark writes only four record families, adrs, issues, intents and specs (embarkFamilies in internal/core/lifeboat/embark_types.go), and names every other file as one it does not write, so .abcd/rp/workspace.json has no path from a lifeboat into a target repository as acceptance criteria 6 and 7 require. itd-6 Decision 4 already has itd-7 waiting; the record does not say that its own two prerequisites are missing as well.
- 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-2609301519558538Deferred, owed to a person: the live proof of the command-line runner (itd-2609201916056194). Phase 1 and 2 prove every criterion on fake harness binaries only; no ruling admits a live check of the runner (ruling L names the site setup, the API adapter and the decision adapter; H8 lists the three paid-service checks and itd-6's RepoPrompt run), so the intent cannot close. What a person must run: (1) the intent's first proof, criterion 7 live: a ruthless review of a real lane routed roles.ruthless-reviewer.runner=opencode, from a lane the host drives, its return recorded beside a host-run review's and differing only in the route; (2) the claude runner under --bare with --permission-mode dontAsk and --allowedTools, confirming a nested claude does not refuse under an inherited CLAUDECODE, and noting that the headless page (read 2026-09-30) says bare mode never reads OAuth or the keychain, so the claude runner needs ANTHROPIC_API_KEY, a paid API key rather than the person's subscription; (3) opencode run --format json --pure: the event shape (the CLI page does not document it; the adapter assumes step_start/text/step_finish with a sessionID and a part) and whether run mode prompts for a permission, which the timeout bounds and records as a fallback.
- iss-2610151422138325The brief at .abcd/development/brief/05-internals/03-configuration.md:1118 says: Plugin layout: internal/adapter/ holds scanner/, gitleaks/, hosting/, openaiapi/, tailscale/ ('hosting, openaiapi and tailscale are adapters outside the capability seams'). The shipped surface differs: internal/adapter/ also holds repoprompt/ (the RepoPrompt reviewer route, itd-6, listed in internal/README.md:290), which the tree omits. (v0.14.2 release crosscheck, fictional-layout, raised by opus in a34.)
- iss-2610151422144124The brief at .abcd/development/brief/06-delivery/01-build-sequence.md:35, .abcd/development/brief/06-delivery/01-build-sequence.md:26-29 says: Three further adapter packages stand outside the capability seams: `openaiapi`, `hosting`, and `tailscale`. The shipped surface differs: internal/adapter/ holds four packages beyond the scanner seam and its gitleaks backend: hosting, openaiapi, tailscale and repoprompt (the RepoPrompt reviewer-route MCP client, itd-6, imported by internal/core/oracle/review.go and listed in internal/README.md:290). The count is three where the tree has four, and the chapter never names repoprompt. (v0.14.2 release crosscheck, stale-count, raised by opus+sonnet in a37.)
- iss-2610151422150430At CHANGELOG.md:16; RELEASE.md:7: The entry says that with `oracle.review = rp` in the repository's or the machine's configuration, a build lane sends its reviews to RepoPrompt. In the code (internal/core/oracle/review.go) the route also needs `oracle.rp.url`, and only ~/.abcd.noindex/config.json may set it: a repository that sets it is refused. With only `oracle.review = rp`, every review falls back to the host. commands/build.md and commands/implement.md state this correctly; the changelog line does not mention the URL. (v0.14.2 release docs-currency review, raised by opus.)
- iss-2610171626370813The v0.15.1 release review found the brief at .abcd/development/brief/06-delivery/01-build-sequence.md:35-38 out of step with the shipped code. It says: Three further adapter packages stand outside the capability seams: openaiapi, hosting and tailscale In the code: internal/adapter/ holds four non-scanner, non-backend adapters: openaiapi, hosting, repoprompt (the RepoPrompt MCP reviewer route, itd-6) and tailscale (gitleaks being the scanner's external backend); 05-internals/02-adapters.md:34 and 04-universal-patterns.md:175 list repoprompt
- iss-2610252224353794Ruling H1b says itd-6 is finished only after one live run against the real RepoPrompt app, a check owed to a person. itd-6 moved to shipped/ with every test on a test-owned MCP server (internal/adapter/repoprompt/mcptest/mcptest.go) and no record of the run, and no ledger record tracks it; the command-line runner's equivalent is tracked as iss-2609301519558538.
- itd-2In-Session Subagent Dispatch — the Default Host-Delegated Oracle
- itd-5Every Agent Prompt Carries Its Version, Earns Its Lock, And Survives Injection
- itd-7Lifeboats Carry RepoPrompt Workspace Definitions Forward
- itd-17Pick the Right Oracle for the Job, Automatically
- itd-27Domain Experts Get Their Intents Grilled Before Anyone Codes Them
- itd-47Oracle-Backed Gates Pass Honestly Without A Human In The Loop
- itd-48`intent-fidelity-reviewer` Gains Its Cross-Doc And Kind-Classification Roles
- spc-2intent-lifecycle-automation
- spc-4start-the-transcript-clock
- spc-5folder-classification
- spc-8epic-to-spec-terminology
- spc-2609202134338445one-verb-takes-a-single-intent-from-ready-to-delivered-witho
- spc-2609221011153746abcd-ships-an-openai-compatible-api-oracle-adapter-the-first
- spc-2609221533057881abcd-runs-a-delegated-agent-through-a-command-line-model-run