Skip to content

OpenClaw: finish setup, begin passing jobs, and review results against OpenCode #2171

Open

Description

@dezren39

What this is

OpenClaw (gateway on the laptop, :18789) is running but the fleet barely uses it: ACP agents are configured on paper (PR #1728), the acpx wrappers exist, and Drew directed 2026-10-29 that we begin passing real jobs to OpenClaw and review the results against OpenCode directly.

Work

  1. Finish the setup. Verify gateway auth/binding and the agent roster once PR openclaw: enable claude, codex, agy as ACP agents alongside opencode #1728 has merged and the NixOS switch has run (both pending). Repoint the acpx adapters (Nix-package the Claude/Codex ACP adapters — repoint OpenClaw acpx off tmp/plugin-captures #1711) and land the muse-serve adapter (Build the acpx 'muse' agent — ACP adapter for the Muse CLI over muse serve (implements #1721) #2012). Confirm which agents OpenClaw can actually drive (opencode, claude, codex, agy) with a live smoke run each.
  2. Define the job-pass contract. A job goes to OpenClaw as a packet: scope, repo/worktree, evidence links, definition of done. A result comes back as: outcome, artifacts (PR/branch/files), tokens used, wall time. A result without those fields does not count as done.
  3. Begin passing jobs. First classes, in order: read-only investigations; design reviews; small, well-scoped implementations in a worktree. Grow volume only as the review below justifies it.
  4. Review every OpenClaw job against OpenCode. For each job record: outcome (accepted / needed rework / failed), tokens used, time to complete. Compare against OpenCode runs of the same job class, using queue completions and the Supabase mirror tables (agent.mirror_*) as the OpenCode baseline. The comparison lives on this issue until it earns a dashboard (External-system observability: unified PM + queue + quota attribution (webhooks, hot list, session IDs, projections) #2072).

Acceptance

  • First 5 jobs passed to OpenClaw with complete result packets.
  • A written comparison of those 5 against matched OpenCode runs: outcomes, tokens, time.
  • A recommendation on which job classes move to OpenClaw by default.

Related

#1711 (acpx repoint), #2012 (muse-serve adapter), PR #1728 (ACP agents), #2072 (observability).

Activity

  1. developing-today commented on Oct 29, 2026

    @developing-today
    Contributor
  2. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    First job passed + first review row (2026-10-29, from the scheduled-tasks study — full findings in ~/workspace/research_notes/openclaw-scheduled-tasks-20261029/findings.md; scheduling plan filed separately):

    Smoke job — read-only self-report via openclaw agent --agent main --session-key smoke-20261029 --json:

    • Outcome: ok (runId a323dfd6…). Answer quality good, one honest gap: described fleet peers from workspace docs instead of enumerating the actual second gateway agent (opencode).
    • Tokens: 13,746 input / 237 output, $0 recorded.
    • Time: 11.8s gateway (74s wall incl. CLI startup at laptop load ~20).
    • Baseline shape for comparison: a watchdog-class digest on Muse costs ~376K Claude input tokens/run; this class of run on OpenClaw costs ~14K pool tokens and zero Muse subscription tokens.

    Blockers found while passing it: (1) gateway token SecretRef does not resolve from a bare SSH shell — OPENCLAW_GATEWAY_TOKEN must be exported from ~/.secrets/openclaw/gateway-token (env only); (2) the agent primary commandcode/deepseek/deepseek-v4-flash returns 401 (pending Command Code sign-in) — the run succeeded on the design-code fallback. Both are recorded as gates on the scheduling issue.

  3. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    DREW (2026-10-29): Aster's proposed first OpenClaw-vs-OpenCode comparison is APPROVED AS DESIGNED and ORDERED RUN — five frozen fixtures (issue-delta triage, CI-log diagnosis, repo/config audit, design review, completed-run evidence review), one run per executor per fixture, 10 runs cap, identical specs and source snapshots for both sides. Results land here as review rows under the shared review contract (quality / time split / usage where measurable, supervision time noted; missing metrics = unavailable, never zero). Dispatched 2026-10-29. Also recorded from Drew: OpenClaw is placed ambitiously, not cautiously — being less proven is what using it fixes.

  4. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    OpenClaw vs OpenCode — comparison results (review rows)

    Five frozen fixtures, one run per executor per fixture (10 runs, cap respected), identical prompt + source snapshot to both, all read-only. Full findings: ~/workspace/research_notes/openclaw-vs-opencode-20261029/findings.md (artifacts, frozen prompts, and scoring ground truth alongside).

    Routes that actually served: OpenCode leg = OpenChamber-managed OpenCode instance on the laptop, agent build, route opencode-route/workhorse → deepseek-v4.1-flash#high (door varied per run — see table). OpenClaw leg = gateway agent main, primary commandcode/deepseek/deepseek-v4-flash on all five runs, first attempt, zero fallbacks — the key replaced tonight works; the smoke test's 401/fallback behaviour is gone.

    Fixture Executor Wall Tokens in / out (cache read) Route Outcome
    F1 issue triage OpenCode 61s 15,202 / 795 (14,336) opencode-go.personal → deepseek-v4.1-flash#high complete
    F1 OpenClaw 50s (gateway 30.8s) 35,084 / 2,282 (0) commandcode → deepseek-v4-flash complete
    F2 CI diagnosis OpenCode 26s 54,865 / 580 (256) opencode-go.lab → deepseek-v4.1-flash#high complete
    F2 OpenClaw 31s (gateway 23.1s) 60,654 / 1,217 (0) commandcode → deepseek-v4-flash complete
    F3 config audit OpenCode 187s 20,614 / 3,028 (14,336) opencode-go.personal → deepseek-v4.1-flash#high complete
    F3 OpenClaw 168s (gateway 165.1s) 40,497 / 23,903 (0) commandcode → deepseek-v4-flash complete
    F4 design review OpenCode 47s 9,841 / 2,300 (15,722) cline-pass → deepseek-v4.1-flash#high complete
    F4 OpenClaw 40s (gateway 36.8s) 31,108 / 2,980 (0) commandcode → deepseek-v4-flash complete
    F5 evidence review OpenCode 374s unavailable (errored turn) opencode-go (base) → deepseek-v4.1-flash#high FAILED — provider stream error, no deliverable
    F5 OpenClaw 62s (gateway 60.1s) 32,157 / 7,319 (0) commandcode → deepseek-v4-flash complete

    Token caveat: the systems count differently (OpenClaw input includes its full harness prompt uncached; OpenCode's rides in cache reads) — compare cost-relatively, not as absolute totals.

    Per-fixture verdicts

    Headline: answer quality is at parity (both DeepSeek Flash-class; OpenCode deeper on judgment-heavy work, OpenClaw cleaner in classification and equal on triage/diagnosis). The difference is platform reliability: OpenClaw dispatched 5/5 first-try on its primary route; the OpenCode leg completed 4/5, and only after routing around two non-viable surfaces (opencode run blocks without creating a session; the standing 13420 server hangs on prompt POST, session DB stale ~Oct 6). Also surfaced: five OpenCode runs drew four different provider doors from the workhorse composition — door-level variance inside the pool is real, and the single failure came on the base door.

  5. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Bug issues filed from the 1v1 findings (Drew's ask; evidence: research_notes/openclaw-vs-opencode-20261029/findings.md):

    1. opencode run blocks indefinitely without creating a session — already tracked: opencode#193 ("opencode run (CLI) hangs after init on headless Linux", open since 2026-10-20). No duplicate filed; the comparison's fresh reproduction (two attempts killed, no session created at all) was added as evidence: opencode run (CLI) hangs after init on headless Linux — investigate developing-today-forks/opencode#193 (comment)
    2. Standing server prompt POST hangs (:13420) — NEW: opencode#857 (kind/bug, priority/high). The server accepted a session but the prompt POST hung >15 min producing nothing; one F1 prompt POST died with it, and the whole comparison had to route around it via OpenChamber's managed instance (:36183). It blocks the fleet's standard session route.
    3. F5 stream failure on the base opencode-go door (provider.invalid-output — stream ended without finish_reason, 374s, no deliverable) — per-door reliability evidence; it falls inside opencode#6's adopted scope (per-credential health state + escalating cooldown per the task-3287 design pass), so it was filed as evidence on Bump build/buck/preludes/buck2-prelude from 3a02ea3 to 4371899 #6 rather than a new issue: feat(routing): automatic multi-credential failover on 429 quota exhaustion via credential.activate developing-today-forks/opencode#6 (comment)
  6. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Round 2 (OpenClaw on workhorse) — BLOCKED before any run; config change needed

    At Drew's order I attempted the round-2 retest: same five frozen fixtures through OpenClaw, but carried by opencode-route/workhorse instead of Command Code, to isolate platform vs door. No fixture ran — under the current rendered config there is no per-run way to do it, and the task barred config edits for a test hack (~/.openclaw/openclaw.json is a read-only Nix symlink regardless). Full record appended to the findings file ("Round 2 — OpenClaw on workhorse").

    Routes tested, in order:

    1. openclaw agent --model opencode-route/workhorse → Unknown model. OpenClaw's providers are only agy / codex-proxy / commandcode / design-code (local proxies :18743/:18744/:18748/:18746); none fronts the OpenCode server or exposes route ids.
    2. /acp spawn opencode in a CLI session → treated as an ordinary turn; no ACP session created, and a follow-up probe in the same session was answered by main itself on Command Code (envelope-verified). ACP bindings are a chat-channel feature.
    3. sessions_spawn({runtime:"acp", agentId:"opencode", mode:"run", model:"opencode-route/workhorse"}) via the gateway main agent → the agent reports there is no sessions_spawn tool in its environment (searched its full catalog).
    4. Same via openclaw agent exec → same answer: tool not exposed on the embedded headless surface either.

    The ACP plumbing itself is healthy (acpx backend, dispatch enabled, opencode allowed and mapped to opencode acp; OpenCode's default model is already the workhorse route after the defaults sweep). What's missing is a dispatch surface. Any one of these unblocks round 2 (all are home/openclaw/default.nix changes riding the switch):

    • Add an ACP-runtime agent to agents.list[] (runtime.type="acp", runtime.acp.agent="opencode") — smallest; matches the Add OpenClaw to #alignment — decide one shared channel vs point-to-point #2170 topology.
    • Expose sessions_spawn to headless/CLI sessions (tool-profile change).
    • Add an opencode-route provider to models.providers — largest; also needs an OpenAI-compatible front for the OpenCode server, which doesn't exist today.

    Note: PR #1728 widens acp.allowedAgents, which is necessary but not sufficient — it governs which harnesses may be spawned, not whether a headless session can spawn at all. This gap survives it.

    Door-vs-platform verdict: not yet decidable. Round 1 (quality parity, OpenClaw reliability win, all five OpenClaw runs on the Command Code door) stands as recorded; the confound round 2 was meant to remove is still in place until one option above lands. The re-run is then mechanical: frozen fixtures, ACP opencode harness, model opencode-route/workhorse, door verified per run from the OpenCode v2 session tables.

  7. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Round-2 unblock — direction update (Drew, 2026-10-29): build all three mechanisms, no menu. Tracked on #2229:

    1. ACP-runtime agent in home/openclaw/default.nix (agents.entries.*.runtime.acp.agent="opencode") — standing OpenClaw→OpenCode dispatch.
    2. sessions_spawn for headless/CLI sessions — determined from the installed OpenClaw 2026.10.7 dist: NOT a config/tool-profile knob. The tool is created only when !embedded || allowGatewaySubagentBinding (upstream createOpenClawTools); embedded mode is a process-local flag the CLI entry point sets, and the binding flag is passed only by gateway/channel entry points. So this one is a fleet packaging patch on the pinned OpenClaw build, documented as such on OpenClaw cannot reach the OpenCode server: build all three dispatch mechanisms (ACP-runtime agent, headless sessions_spawn, opencode-route provider front) #2229.
    3. opencode-route provider front — a local proxy on the next fixed port (18750, per Local proxy discovery: port files, sockets, or a registry instead of fixed ports? #437) mirroring the commandcode-proxy pattern, backed by the laptop OpenCode server's v2 API (:13420 — verified live today: session create + prompt + wait completes, route resolves through the workhorse pool), plus the models.providers entry so --model opencode-route/workhorse works directly.

    Each mechanism: own PR, proven live (an OpenClaw run actually carried by opencode-route/workhorse, verified in the OpenCode v2 session tables) where the mechanism allows.

  8. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Method 3 of #2229 (the priority target) is built and live-proven: PR #2250 adds the opencode-route provider proxy (port 18750). An OpenClaw run with --model opencode-route/workhorse completed carried by the workhorse pool (OpenCode session ses_e5e78b6f4f4ffeVyPSZquFZkwV, opencode-go/deepseek-v4.1-flash). Details on #2229. Methods 1 and 2 continue next.

  9. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Scope final on #2229 (Drew, 2026-10-29): method 3 (opencode-route provider front) was the priority build — done, PR #2250, live-proven. Methods 1 and 2 are descoped to follow-ups: method 1 (ACP-runtime agent) → #2256, method 2 (sessions_spawn for headless/CLI) → #2257, each with its determination/starting point recorded and the trigger "sometime soon / when an OpenClaw-origin workload needs it".

  10. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    agent-note:v1 — task 7856 picked up by lane code-k (repo-worker-code). Execution lane assigned: opencode — handed off to the opencode claimant, which will launch a bound session to triage issue #2171 at current main.

  11. added
    queue/queuedHas a queued task in the Supabase agent queue
    source/creatorFiled by the new-issue-creator job
    task/triageQueue packet kind: verify, reproduce, and route this item
    on Nov 3, 2026
  12. developing-today commented on Nov 3, 2026

    @developing-today
    Contributor

    agent-note:v1
    state: triaged (coverage pass)
    Coverage pass 2026-11-03: reviewed in the fleet-wide per-issue pass (drift / overlap / already-handled / stale / blockers / ordering). Verdict: still live; queued in repo-health-code-pilot as triage at priority 30 (priority/none). If this is already handled at current main, the triage closes it with evidence; if it needs splitting, the triage files the split.
    Found via: coverage pass 2026-11-03

  13. removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 3, 2026
  14. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

    • Agent: queue worker (repo-worker-code), lane code-f
    • Session / ID: task 7856
    • Found via: queue claim
    • Task: Handed off to the opencode execution lane (prior handoff lease expired unbound, where applicable); the laptop claimant launches the bound opencode session, which drives task 7856 to its terminal state.
    • Expectation: effort m; done = worked per the task packet at current main, verified terminal state.
    • Links: issue OpenClaw: finish setup, begin passing jobs, and review results against OpenCode #2171
  15. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor
    No description provided.
  16. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    Triage (task 7856, coverage pass 2026-11-03, verified at origin/main 8e151e8)

    Verdict: still live, not already-done. Setup is part-finished, the 5-fixture comparison is recorded, but the acceptance recommendation is missing and several setup pieces are still open.

    What is done at current main:

    What remains (fix path + ordering):

    1. Nix-package the Claude/Codex ACP adapters — repoint OpenClaw acpx off tmp/plugin-captures #1711 (acpx store repoint off tmp/plugin-captures) — OPEN, queued. Wrappers still run from ~/.openclaw/acpx per default.nix comments.
    2. Build the acpx 'muse' agent — ACP adapter for the Muse CLI over muse serve (implements #1721) #2012 (muse ACP adapter) — OPEN, status/blocked + user/escalated. Genuinely Drew's call per labels.
    3. Follow-up (#2229): ACP-runtime agent entry for OpenClaw→OpenCode dispatch (opencode-acp) #2256 (ACP-runtime agent entry) — OPEN, blocked on nix-openclaw schema oneOf (OpenClaw ACP-runtime agent entry cannot evaluate: nix-openclaw generated schema makes the acp runtime branch unreachable #2509 analysis in default.nix). Restore once schema can express it.
    4. Follow-up (#2229): expose sessions_spawn to headless/CLI OpenClaw sessions (packaging patch) #2257 (sessions_spawn for headless/CLI) — OPEN, priority/high. Fleet packaging patch on pinned OpenClaw build.
    5. Round-2 retest (same 5 fixtures via OpenClaw carried by opencode-route/workhorse, isolating platform vs door) — unblocked by method 3 landing, not yet run.
    6. Acceptance gap: recommendation on which job classes move to OpenClaw by default — not yet written. Needs round-2 + job-pass contract decision (no contract doc exists in repo at main; runs so far used ad-hoc packets).
    7. Job classes 2–3 (design reviews in production, small worktree implementations) — not started; volume growth gated on the recommendation.

    Suggested ordering: #1711 + #2257 → round-2 retest → recommendation → phased job classes; #2012 and #2256 proceed on their own blockers (Drew decision; #2509 schema) without gating the recommendation.

    Execution note: laptop SSH unreachable from this lane session (tunnel proxy CONNECT failed), so verification was read-only via local clone + gh API at origin/main 8e151e8; no worktree created, no edits made (triage-only task).

  17. added
    user/reviewNeeds a user-look: Muse reviews first and handles what it can
    on Nov 6, 2026
  18. developing-today commented on Nov 6, 2026

    @developing-today
    Contributor

    🤖 Agent note · escalated

    • Agent: fleet monitor (repo-fleet-monitor)
    • Session / ID: repo-fleet-monitor run 2026-11-05 20:12 CST
    • Found via: monitor reconciliation (in-progress tracker, Duty 3)
    • Task: Escalation — this issue still carries + with no live queue claim, and has had no activity since 2026-11-03 (~55 hours, past 2x the deadline for effort classes xs/s/m). The latest agent notes from 2026-11-03 suggest the work was completed/triaged then, but the terminal label cleanup never happened and the issue is still open.
    • Expectation: reviewer (Muse, per the flow) confirms whether the 2026-11-03 outcome closed the work: if done, remove the stale lifecycle labels and close or re-scope the issue; if not done, requeue — swap labels to + and enqueue a fresh triage packet. The monitor did not auto-requeue because the last notes claim completion.
  19. developing-today commented on Nov 6, 2026

    @developing-today
    Contributor

    Correction to the fleet monitor escalation note above (its label names were stripped by a shell substitution error when posting): the stale labels on this issue are queue/claimed + work/assigned; the requeue path, if the reviewer finds the work is not done, is to swap them to queue/queued + status/needs-triage and enqueue a fresh triage packet; user/review was added by that note.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

queue/claimedQueue worker lifecycle statesource/creatorFiled by the new-issue-creator jobstatus/in-progressQueue worker lifecycle statetask/triageQueue packet kind: verify, reproduce, and route this itemuser/reviewNeeds a user-look: Muse reviews first and handles what it canwork/assignedQueue worker lifecycle state

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions