Repository navigation
feat(runner): writers for external providers and a Muse Code provider (#263, #258) - #268
Conversation
Recorded on pro14: `muse --help`, `muse exec --help`, `muse usage` logged in and logged out, and `muse exec --json` streams for a read-only lane, a writer lane, an unknown model and a SIGINT cancellation. The writer stream drops the streamed `run.output.delta` records; the SIGINT stream keeps its first 40 records. Refs #258 Refs #263 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A model sheet may hold one `<provider> writer sandbox: bounded|full-access` line per provider. The parent passes `--writer-sandbox full-access` only to an external isolated-write lane of the provider whose line says full-access. A provider whose route lists only `isolated-write-full-access` writes only with that line. Setup keeps every setting line, asks once about Codex and about each opt-in-only provider a writer role uses, warns that nothing stops a stray write, probes such a writer with a create-and-run task, and refuses a writer role on a provider that cannot write. The catalog renders each provider's child environment for every access kind it supports. Refs #263 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Measured on pro14 with a linked worktree beside its main repository and a sibling directory, under the home directory: - devin (3000.11.234): bounded isolated-write under --sandbox, a confined shell-only writer; opted-in full access runs --permission-mode dangerous. - dsh (0.2.1-rc.2): bounded isolated-write under a workspace-write policy, confined except the system temporary folders. The version guard moves to 0.2.1-rc.2, whose disabled credentials row the patch now enables. - opencode (1.19.1), agy (1.5.2), cursor (2026.10.22-27dcf5f), muse (1.4.14): writes escaped the worktree, including into the shared .git, so each writer is opt-in only (isolated-write-full-access). - amp stays read-only: its login had expired, so no writer was measured. The Muse adapter runs `muse exec --json` read-only with writes and the shell disabled, or as an opted-in writer with the sandbox on. Its parser reads the terminal event, maps an unknown model to unavailable-model and exits 130/143 to cancelled, and proves the model by pinned argv. No family is registered. Refs #263 Refs #258 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…alled harness A new `writers` feature, reachable when a provider adapter changes and run only when named, dispatches one sheet-driven writer per changed provider (devin and dsh bounded; opencode, agy and cursor with their full-access line) into a linked worktree. Each writer runs a command that writes the SHA-256 of a per-run nonce, so the case proves execution, not a model claim. Muse gets a writer and a reader case on launcher arguments, because no Muse family is registered. The sheet filters recognize every provider's writer sandbox line. The setup cases move off Devin, which can now write: `read-only-provider` and `writer-refusal` use OpenCode, whose writer needs the opt-in line. Refs #263 Refs #258 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs #258 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merge Protections🟢 All 2 merge protections satisfied — ready to merge. Show 2 satisfied protections🟢 Queue ready pull requestsAutomatically queue non-draft pull requests targeting main after verify and live-gate pass on the head and every review thread is resolved.
🟢 🚦 Auto-queueWhen all merge protections are satisfied and these conditions match, this pull request will be queued automatically.
|
|
[High impact] The PR expands write access in configured external-provider lanes. Fix the setup check before merging; it rejects valid saved provider settings. FindingsSummaryAdds bounded Devin and dsh writers, full-access opt-ins for other external writers, and a Muse provider. Default role choices stay unchanged.
Acknowledged or deferred by
Reviews (1) · Last reviewed commit: "chore(runner): drop a comment that repea..." · Reviewed by Greptile |
🛑 6 blocking findings🟡 Medium · configure case fails when the sheet has another provider's writer line 🟡 Medium · Setup accepts full-access lines for bounded-only providers 🟡 Medium · Writer recipes are unreachable for recipe-only changes 🟡 Medium · Empty XDG_CONFIG_HOME loses the existing Muse login 🔵 Low · Agy notes still invoke the old agent 🔵 Low · Correct agy's unconditional tool-restriction disclosure WalkthroughThis PR
Advisories (2)
Since the last review
Repair promptRead the
Details
Reviewed the whole pull request. @unfret review · @unfret status · @unfret help |
There was a problem hiding this comment.
🛑 4 blocking findings
🟡 Medium · configure case fails when the sheet has another provider's writer line
🟡 Medium · Reject full-access settings for bounded-only providers
🟡 Medium · Make writers reachable for changes to its own recipes
🔵 Low · agy notes still name the old agent and a wrong tool surface
Check
Live evidence: Open Pstack
|
Live evidence: Open Pstack
|
Refs #258 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Live evidence: Open Pstack
|
Refs #258 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Live evidence: Open Pstack
|
✅ Merged into
|
There was a problem hiding this comment.
🛑 6 blocking findings
🟡 Medium · configure case fails when the sheet has another provider's writer line
🟡 Medium · Setup accepts full-access lines for bounded-only providers
🟡 Medium · Writer recipes are unreachable for recipe-only changes
🟡 Medium · Empty XDG_CONFIG_HOME loses the existing Muse login
🔵 Low · Agy notes still invoke the old agent
🔵 Low · Correct agy's unconditional tool-restriction disclosure
Check
Why
Interrogate's adversaries now prove findings by running code (1.17.0), so they need writer lanes, and six external providers were read-only. This gives every external provider a writer where one can be measured: confined writers by default, unconfined ones only behind a per-provider model-sheet opt-in. It also adds Meta's Muse Code as a provider. Closes #263, closes #258.
Summary
--sandbox); opt-indangerous--sandbox: inside writes and a Python run work; sibling, main checkout, shared.git, home, symlinks and/tmpgetOperation not permittedworkspace-write)/tmpand$TMPDIR.git, home,/tmp--dangerously-skip-permissionswrote everywhere;--mode autounavailable for the account.git, home.gitand/tmpAll measurements ran through the real runner on pro14 (macOS) against a linked worktree of a disposable repository, with fixtures outside
/tmpso a/tmpallowance could not mask an escape.Evidence
writersverifier feature (new, runs only when named): one writer case per changed provider; each child runs a Python command that writes the SHA-256 of a per-run nonce toresult.txt, which the model cannot produce without running it. Plusmuse-writerand amuse-readerthat must return a per-run marker.runner/fixtures/muse/): preflightmuse usage; final text inrun.terminal.completed; usage fromrun.usage; unknown model exits 1; SIGINT 130 and SIGTERM 143;run.model.configuredonly echoes the request, so model proof is pinned argv.Merge Danger
Door: two-way
Blast Radius: opt-in
No default role changes. A sheet with no new setting lines gains only Devin and dsh writers, which are confined. Unconfined writers run only after the operator writes
full-accessfor that provider; setup warns that nothing stops a stray write, including into the main repository's shared.git.Acceptance criteria
#263:
model-catalog.mdprovider notes.isolated-writeby the rules above, and refuses the opt-in-only providers without the sheet line" — done; adapter suite tests./setup-pstackasks about and warns on the opt-in line" — done,setup-pstack/SKILL.mdstep 2; it probes opt-in writers in a disposable worktree.#258:
muse --helpandmuse exec --help" — done; recorded underrunner/fixtures/muse/.provider-dispatch.md… no default role changes" — done; pinned argv, no family registered.Gate results
On
0087ba6:bun run test0 (508 pass, 0 fail),bun run typecheck0,bun run static0,claude plugin validate plugins/pstack0.no-commentspass: one comment deleted (muse.ts).Not verified
writerscases need pro14's provider CLIs, and every Muse turn on pro14 fails authorization since its Muse config was changed to route through a proxy on 2026-11-06 07:26.amp loginon pro14.META_API_KEYworks, MCP and plugin suppression, workspace switching, and whether--reasoning-effortbeats per-model effort in Muse'ssettings.json..envhandling and session-log upload were not rechecked.toolslist (writes are still denied); noted in the catalog, not changed here.🤖 Generated with Claude Code