Development record
The claude runner cannot run on a Claude subscription, so a person without an API key has no route to any role abcd runs from a plain terminal: the planning interview, a build's implementer and validators, the drain's judge.
The claude runner cannot run on a Claude subscription, so a person without an API key has no route to any role abcd runs from a plain terminal: the planning interview, a build's implementer and validators, the drain's judge.
internal/core/runner/claude.go:116-157 always starts claude --print --bare …. The vendor's headless documentation (https://code.claude.com/docs/en/headless and https://code.claude.com/docs/en/authentication, read 2026-10-24) says --bare never reads OAuth credentials or the keychain and ignores CLAUDE_CODE_OAUTH_TOKEN, so on a subscription-only login every routed role fails at launch, with no early check naming why. Surfaced 2026-10-24 when abcd intent interview refused a person whose account is a subscription and the only remedy it offered was a runner they cannot run.
The restriction is ruling RN2 of the technical facilitator (dcn-2610020000000016, 2026-10-02: "runner keeps --bare with an API key … subscription-only owners run the role in their own session"), restated in the brief (.abcd/development/brief/04-surfaces/34-build.md:465-470, "The claude runner stays bare, on an API key alone") and built on by dcn-2610161624025493, whose headless shell approver is designed around --bare ("dropping --bare would let the repository's hooks, plugins and CLAUDE.md run"). RN2 rests on two grounds, and both have to fall for the remedy to stand:
- Isolation. RN2's research (the cli-reference, read 2026-10-02) found that "no flag set short of the bare flag seals project instructions, plugins, skills and agents". The documented flags read on 2026-10-24 (https://code.claude.com/docs/en/cli-reference) cover settings sources, MCP servers (
--strict-mcp-config --mcp-config), inline--settings, tools (--tools/--allowedTools) and plugins (--plugin-dir), but no page read states that any of them stops CLAUDE.md, skills, agents or auto-memory loading. This ground is not shown to fall: it has to be proven by a live probe that startsclaude -pwithout--bareunder the candidate flag set in a repository carrying a CLAUDE.md, a skill, an agent, a plugin and a hook, and reads the run'ssystem/initevent for what loaded, before anyone is asked to rule. - Terms. The vendor's legal page as read on 2026-10-24 (https://code.claude.com/docs/en/legal-and-compliance) bars a developer from routing requests through Free, Pro or Max credentials on behalf of their users and from collecting or storing Claude.ai tokens, and states that it does not prevent an end user from signing in to the unmodified Claude Code binary with their own subscription; Pro and Max limits assume ordinary individual use. On that reading, abcd starting the person's own
claudeon their own machine under their own login is the permitted case. A second reviewer could not fetch the page, so the reading is one session's and is to be re-read when the ruling is asked.
Reversal flag (advisory, for the technical facilitator to rule): the remedy reverses RN2 for a route with no API key, and the brief paragraph and the --bare premise of dcn-2610161624025493 with it; dcn-2610161624025493's approver, which reaches the run through --mcp-config, is unaffected by the flag itself. Nothing is applied until the probe has run and the ruling is given.
The runner has no notion of a key today (no ANTHROPIC_API_KEY reference in internal/core/runner/ outside tests), so "a route with no API key" needs a stated test: the presence of the variable in the runner's environment, never its value, or an explicit machine setting naming the credential the route uses.
Probe 2026-10-24: the isolation ground, tested live
Claude Code 2.1.310 on macOS, a subscription login with ANTHROPIC_API_KEY and CLAUDE_CODE_OAUTH_TOKEN unset, model haiku, in a throwaway repository under ~/.abcd.noindex/probes/<root-sha>/safe-mode-2610241000/ carrying a decoy CLAUDE.md (an instruction to say a fruit word), a project skill, a project agent, a project SessionStart hook and a project .mcp.json. Each run read the system/init event and the result.
Flag set (beside -p --output-format stream-json --verbose --no-session-persistence --tools Read) |
Auth | Project CLAUDE.md, skill, agent, hook, MCP | User plugins | abcd's --mcp-config approver |
abcd's --settings hook |
Auto-memory |
|---|---|---|---|---|---|---|
--safe-mode |
ran, apiKeySource: none |
none loaded | not loaded | not loaded | did not run | off |
--setting-sources "" --disable-slash-commands --strict-mcp-config --mcp-config <approver> --permission-prompt-tool mcp__abcd__approve |
ran, apiKeySource: none |
none loaded | not loaded (only the harness's built-ins) | connected | ran | on |
the row above with --settings '{"autoMemoryEnabled":false}' |
ran | none loaded | not loaded | (empty config) | — | off |
What it shows: a subscription login runs claude -p without --bare; --safe-mode seals the project but also drops abcd's own approver and hook, so it cannot replace --bare for a shell role; the second set, with auto-memory turned off in the inline settings, sealed every decoy the probe planted while keeping the approver and abcd's hook. What it does not show: the user layer's own CLAUDE.md and skills (the probe planted none there), output styles, and behaviour on another Claude Code version; the runner should still refuse a run whose system/init lists anything outside the expected set.
Deferral 2026-10-27
Deferred past v0.15.1: Waits on the technical facilitator's ruling on reversing RN2 (dcn-2610020000000016) after a live isolation probe; subscription owners keep running roles in their own session, as v0.15.1 documents (ruled 27 October 2026).
Frontmatter
| id | iss-2610240932215918 |
|---|---|
| type | issue |
| lifecycle | open |
| severity | major |
.abcd/work/issues/open/iss-2610240932215918-the-claude-runner-cannot-run-on-a-claude.md
open on GitHub ↗ · commit history ↗
mentions5
- dcn-26100200000000162026-10-02 — Ruling RN2 of the technical facilitator, FINAL (2026-10-02, asked in plain words by abcd-a2 [75597f]; same local-tier file as the H3-0 entry above; recorded by lane rd2), verbatim: "YES, SEALED, PAID KEY ONLY — runner keeps --bare with an API key; only machine-layer (personal) routes may hand a role to a runner; repo routes skipped with a warning; subscription-only owners run the role in their own session." It supersedes the provisional answer, "TREAT IT LIKE A PAID SERVICE", given with the note "are you sure it cannot run via a subscription? Investigate first.", which stood only until a research pass returned: no flag set short of the bare flag seals project instructions, plugins, skills and agents (code.claude.com/docs/en/cli-reference, read 2026-10-02), and the vendor's terms do not permit third-party developers to route requests through Free, Pro or Max plan credentials on behalf of their users (code.claude.com/docs/en/legal-and-compliance, read 2026-10-02). Not built at this entry's base; lane runnerSeal of autonomous run A builds it with OC1 and OC2.
- dcn-26101616240254932026-10-16 — A headless claude run whose role's contract grants the shell gets its permission prompts answered by abcd's guard through the harness's --permission-prompt-tool, naming the one tool of an 'abcd guard approve' MCP server that the launch passes inline with --mcp-config and --strict-mcp-config, under --permission-mode default; the shell is no longer pre-granted on that launch, so every shell command the harness would ask about reaches the guard, which approves only a clean allow (no entry, signal or diagnostic, a program the line names, no inline code handed to a non-shell interpreter) and refuses every other prompt with the guard's reason. The expected shape, a PreToolUse hook in a per-launch --settings file, cannot work: --bare skips every hook, those --settings declares included (probed on claude 2.1.301: a SessionStart and a UserPromptSubmit hook from --settings ran without --bare and not with it), and dropping --bare would let the repository's hooks, plugins and CLAUDE.md run. A role whose contract grants no shell keeps dontAsk, which already refuses every prompt; opencode has no per-launch approval callback and is unchanged; the person's host settings are never touched. This change adds no sandbox; sandboxing autonomous runs is a separate later step (dcn-2610161619296615). Grounds: claude --help 2.1.301; code.claude.com/docs/en/cli-reference, /headless, /agent-sdk/permissions, /agent-sdk/user-input; live probes of the prompt tool's request and allow/deny answers, and of --bare connecting an --mcp-config server.
- dcn-26102719225024802026-10-27 — Majors ruling for the next cut, product thinker, 27 October 2026, on abcd-78's recommendations for the 17 hand-captured majors since v0.15.1. Fix before the cut: the eight recommended fixes (iss-2610251555094324, iss-2610241537197997, iss-2610241414124940, iss-2610241911052191, iss-2610241240133009, iss-2610241133284600, iss-2610241239492159, iss-2610241519088123) and five recommended for deferral that the product thinker chose to fix instead: the short install command in the docs (iss-2610240827243654), a worktree per session (iss-2610240859590333), clearing lapsed holds everywhere (iss-2610241107191205), the reflect criteria (iss-2610241431221889) and the measured home-folder receipt (iss-2610241551259104). Deferred one cycle: iss-2610241228359748, iss-2610240932215918, iss-2610241613191748. Amended and closed: iss-2610241427397332 (itd-3's obsolete criteria). The 69 consistency-pass majors are ruled on branch decisions/interview-2026-10-27.
- iss-2610240932444000`abcd intent interview` never hands the interview to a host session, and its refusal names only a runner, so a person sent to the verb is not told that the session they are in may conduct the interview.
- itd-2610240933025076abcd plans unattended and asks only what a person owns