feat(harness): opencode CLI harness + config_files launcher (RFC-006 Phase 5)#54
Merged
Conversation
…auncher
Third agentic harness (model-agnostic, sst/opencode). Uses opencode's BUILT-IN
openai provider with a baseURL override → our proxy (the provider is bundled in
the binary, so the no-egress sandbox needs no run-time npm). Built + isolation-
smoked end-to-end (opencode run → proxy → wrote a file in the sandbox).
Adds the config_files launcher write (DockerHarnessLauncher._write_config_files):
a harness's config (opencode.json now; codex config.toml next) is written into
the workspace BEFORE the git base commit, so the harness finds it AND it stays
out of the captured patch. Shared infra for opencode / codex / Crush.
- infra/docker/harness-opencode: node base + npm opencode-ai@1.15.13 (uid-1000
`node` user matches the host bind owner).
- _opencode_invocation recipe (opencode.json via config_files; -m openai/<alias>).
Promoted opencode proven → out of _PENDING_RECIPES.
- stacks/opencode/stack.yaml: command `opencode run`, L1+L2+L3+L4.
- tests: opencode recipe-proven + config_files-written-then-excluded-from-patch;
supported_harnesses = {aider, goose, opencode}.
729 tests green; ruff + mypy --strict clean; 12/12 stack specs valid.
Refs: rfc-006-stack-executor
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… finding) Runs the opencode grid (--add-stack opencode, same 4 coder models, 2 seeds) and merges the column into board.json (now 23/29 scored). opencode × qwen-3-14b = 6.92; the other 3 coders FAILED — a real harness×model-compat finding: qwen3-coder-30b / codestral / devstral emit tool calls in an XML-ish format (`<function=read>...`) that opencode's openai-provider doesn't parse → no file edit → NO_PATCH. Not a timeout (the run finishes in ~5s). opencode's tool-calling is more format-sensitive than goose/aider, which tolerate these models. Shown honestly (FAILED cells render "—"), never hidden. Refs: rfc-006-stack-executor Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Third agentic harness — opencode (sst), model-agnostic. Also adds the
config_files launcher (shared infra for opencode / codex / Crush).
Result (live on the board)
board.jsonnow 23/29 scored. opencode column onbe_01_jwt_auth:Harness × model finding (honest, not a bug)
opencode's tool-calling is format-sensitive: among our open coders only
qwen-3-14b emits OpenAI-native
tool_callsthat opencode parses. qwen3-coder-30b/ codestral / devstral emit XML-ish tool calls (
<function=read>…) thatopencode's openai provider drops → no file edit → NO_PATCH (not a timeout —
the run finishes in ~5s). goose/aider tolerate these models; opencode is pickier.
Real harness×model data, shown honestly (FAILED cells render "—").
How
opencode-ai@1.15.13; uses opencode's built-inopenai provider with a baseURL override → our proxy (bundled in the binary,
so the no-egress sandbox needs no run-time npm). Isolation-smoked end-to-end.
DockerHarnessLauncher._write_config_files): writesa harness's config (opencode.json now, codex config.toml next) into the
workspace before the git base commit — the harness finds it AND it stays
out of the captured patch.
_opencode_invocationrecipe +stacks/opencode/stack.yaml(opencode run).Verify
Refs: rfc-006-stack-executor
🤖 Generated with Claude Code