Skip to content

agy-proxy: bridge drops tool schemas — the workhorse-primary agy leg cannot execute tools and masks it as success (Codex P1 on #2200, now on main) #2270

Closed

Description

@dezren39

Defect

The agy bridge drops tool schemas: bin/agy-proxy.mjs formats only body.messages, never forwards the caller's offered tool schemas, and emits only content with finish_reason: 'stop' — so OpenCode can never receive structured tool calls through this leg, and because the responses look successful, no failover triggers. Tool-dependent workhorse jobs routed here silently cannot complete. Codex flagged this as a P1 on PR #2200 (the Gemini-burn PR, which added agy to the workhorse primary pool, sending roughly half of primary selections through this bridge). PR #2200 has since merged (2026-10-29), so this defect is on main today.

The Codex finding (verbatim, PR #2200)

Require tool-call support before adding agy to the primary pool

For workhorse tasks that need the caller's tools, this new leg routes roughly half of primary selections through a text-only bridge. bin/agy-proxy.mjs formats only body.messages (lines 865–867), never forwards the offered tool schemas, and emits only content with finish_reason: 'stop' (lines 1022–1028 and 1054–1060), so OpenCode cannot receive structured tool calls. These responses appear successful rather than triggering failover, leaving tool-dependent jobs unable to complete their work. Add tool-call translation to the bridge or keep this provider out of the primary pool until it supports it.

Finding: #2200 (comment) (filed against .opencode/opencode.jsonc line 6626, PR #2200)

Fix direction (as Codex prescribed)

Either add tool-call translation to bin/agy-proxy.mjs (forward tool schemas; translate model tool calls into OpenAI tool_calls with a truthful finish_reason), or keep this provider out of the workhorse primary pool until it supports it. Note #865 (closed) fixed the same defect class for the sibling antigravity-ls-proxy; this issue is the agy-proxy bridge specifically.

Source

Codex review-value audit 2026-10-29 (research_notes/codex-review-value-20261029/findings.md §2, best catch #5): classified REAL-CATCH; PR #2200 merged 2026-10-29 with the finding unacted, so the defect is on main. Verification: defect confirmed present on main 2026-10-29.

Acceptance criteria

  • The agy bridge forwards the caller's offered tool schemas and emits structured tool calls OpenCode can execute — or agy is removed from the workhorse primary pool until it does
  • A tool-dependent workhorse job routed through the agy leg completes with real tool calls (evidence linked), and a text-only response can no longer masquerade as success for a tool-requiring request
  • The masking is gone: when the bridge cannot honour tools, the response fails over instead of returning finish_reason 'stop' content

Activity

  1. added
    kind/bugSomething isn't working (prefixed form of the classic bug label)
    priority/highImportant and time-sensitive
    queue/queuedHas a queued task in the Supabase agent queue
    effort/mMedium: expected under 1 day of work
    on Oct 29, 2026
  2. developing-today commented on Oct 29, 2026

    @developing-today
    Contributor
  3. added
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 30, 2026
  4. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    Intake review

    Related: PR #2200 (merged — added agy to the workhorse primary pool; Codex P1 finding r4410496158 quoted in the body)

    Notes: Filed from the Codex P1 on PR #2200, which merged 2026-10-29, so the defect is on main: bin/agy-proxy.mjs formats only body.messages (lines 865–867), never forwards tool schemas, and emits only content with finish_reason 'stop' (lines 1022–1028, 1054–1060) — roughly half of workhorse-primary selections route through a leg that cannot execute tools and looks successful doing it. Already labelled kind/bug, priority/high, effort/m by the filer; this pass appends acceptance criteria and marks enriched.

    Risks: Silent incapacity is worse than failure: jobs burn their full budget producing plausible text instead of failing over to a capable leg.

    Suggested approach: Either implement tool-call translation in the bridge (schema forwarding + structured emission), or pull agy from the primary pool until that lands — the pool change is the xs stopgap, the translation is the fix.

    🤖 Agent note · filed

    • Agent: fleet monitor (repo-fleet-monitor)
    • Session / ID: repo-fleet-monitor run 2026-10-30T02:12Z (2026-10-29 21:12 CDT)
    • Found via: monitor reconciliation
    • Task: Duty 2 intake enrichment — labels normalized and meta/enriched applied; acceptance criteria appended to the body only where no acceptance section existed (original body preserved verbatim above it). Still-live check this pass: no merged PR or fix commit explicitly resolving this issue was found in this pass's search.
    • Expectation: see the effort label; done = the acceptance criteria are met.
    • Links: this issue
  5. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 2, 2026
  6. dezren39 commented on Nov 2, 2026

    @dezren39
    MemberAuthor

    Verdict (2026-11-02, task 3425): resolved via the removal branch — no code change needed

    Codex's prescription was translation OR removal from the primary pool. Removal happened (Drew's pool edits + the 2026-10-30 Antigravity retirement). Verified at HEAD + deployed state on amd:

    • agy out of the primary pool: workhorse-primary targets are now exactly openai-plan/gpt-6-luna#xhigh + muse-direct/muse-spark-1.3-contributor#xhigh (.opencode/opencode.jsonc:4106+). The antigravity-agy/gemini-4-argon leg added by TEMPORARY: workhorse primary adds Antigravity Gemini 4 Argon to the burn round-robin (#2173) #2200 is gone (traced through the 10-29→11-02 seat comments; no Antigravity leg remains in primary).
    • Masking impossible: provider antigravity-agy sits in disabled_providers (opencode.jsonc:158-159; "a provider is ON unless listed"); no enabled seat references it. bin/agy-proxy.mjs remains in-repo as history, uninvoked — no unit (removed with the retirement), and :18743 has no localhost listener, so no traffic can reach the bridge. A tool-requiring request can no longer be answered with fake-success content from this leg.
    • Sibling door retired too: antigravity-ls-proxy likewise removed; single Antigravity door is antigravity-direct on :18751 (active, serving).

    Cosmetic leftovers (NOT this defect — no traffic impact, noted for whoever touches those files): home/openclaw/default.nix:101 still lists agy-proxy.service in openclaw-gateway's After= (ordering-only, benign), and the stale proxy-supervisor comment above it; home/common/default.nix:1645+ still ships agy-proxy/antigravity-ls-proxy CLI shims around the retired bridges.

    Closing as already-done via removal. Reopen if agy is ever re-seated in a primary pool without tool-call translation.

    🤖 Agent note · done

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

Metadata

Metadata

Assignees

Labels

effort/mMedium: expected under 1 day of workkind/bugSomething isn't working (prefixed form of the classic bug label)meta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/highImportant and time-sensitive

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions