Skip to content

Wire-identity conformance program: per-provider User-Agent verification, binary drift watch, and tool-call probes #1876

Open

Description

@dezren39

Program

Drew's directive (2026-11-06 12:00 CST): "ensure appropriate user agent is used for each different provider. verify with binary itself then once a week or so pull down the latest version if different then diff the binaries look for mechanisms that could change the wire format. ensure tools calls etc all work for each provider."

This issue is the program's home. The weekly job weekly-binary-wire-check (Mondays ~08:12 America/Chicago, repo copy in the code/docs tree under the nix/mcpx/opencode goal) executes the recurring spec:

  1. Versions + binary diff — per in-scope binary (claude, agy, vibe, commandcode, muse, codex): installed version (the install the fleet depends on, not just PATH) vs latest upstream. Unchanged → one line. Changed → download the new binary to scratch (never install it), diff old-vs-new (strings, embedded endpoints, UA/version patterns, header names, auth/refresh flows, quota endpoints, signing/telemetry mechanisms) and judge whether the wire format our provider imitates could change.
  2. Re-capture on relevance — if wire-relevant or uncertain: re-run the ground-truth capture (real binary vs a local recording listener — the capture-first method) and the fork-side capture; on drift, file an issue in this repo with the diff findings, update the fork's stamps in a worktree → PR → merge, and update the scorecard below + the Wire identity fidelity: direct providers must present their binary's User-Agent #1834 baseline table.
  3. Functional probes — per provider route, cheap, plan seats only, never funds: a minimal live session proving completion + a tool-call round-trip + streaming. Wall-aware: one attempt on a walled pool; its own quota response is the reachability proof; legs marked pending-reset.
  4. Digest — one compact report to the job's delivery chat (changed binaries, wire verdicts, scorecard deltas); a single all-clear line when literally nothing changed and every probe passed.

Ground-truth rule for everything in this program: the binary's actual outgoing request is the only source of truth — not docs, not release notes, not a previous audit's capture (v1 below contains a case where the previous audit's capture method itself produced a wrong baseline).

Baseline wire table: #1834. Muse-specific findings live on #1825 (the muse-direct rebuild lane owns those files). Captures from the v1 pass: laptop /home/user/wire-conformance-2026-11-06/.

Wire-identity conformance — scorecard v1 (2026-11-06 conformance pass)

Method (Drew's directive, 2026-11-06 12:00 CST): for every provider, ground truth is the real client binary's actual outgoing request, captured on the laptop against a recording listener (base-URL/config override, MITM where no override exists, grep -a byte scans as corroboration) — never docs or memory. The fork side is captured the same way from the deployed build (2.0.30+5e9b135, fastlane) or from source where a fix was made. Functional legs: one minimal live session per route (plan seats only, never funds) proving completion + a tool-call round-trip + streaming; a walled pool's own quota response over the correct wire counts as the reachability proof and the legs are marked pending-reset. Raw captures: laptop /home/user/wire-conformance-2026-11-06/<provider>/.

Provider Genuine client (captured against) Identity Tool call Streaming Notes
claude-code Claude Code CLI 2.1.306 (credential-owning install ~/.local/share/claude/versions/; PATH install is 2.1.293; latest upstream 2.1.319) ✅ match — deployed wire: claude-cli/2.1.306 (external, cli), x-app: cli, identity betas claude-code-20250219+oauth-2025-04-20, OAuth Bearer; auth-layer stamp verified winning over the session UA ⏳ pending — probe hit Anthropic 429 rate_limit_error (authenticated, real request_ids — identity accepted, quota-classified); retest on pool recovery ⏳ partial — SSE session events flowed; no token stream under the 429 Judged non-identity with evidence: print mode's (external, sdk-cli) entrypoint label, X-Stainless-* set (SDK-generated; not gated; would assert a false runtime), ?beta=true path suffix. On upgrade to 2.1.319: stamp → claude-cli/2.1.319 and drop beta prompt-caching-scope-2026-01-05 (genuine default list changed; verified by controlled captures of both binaries)
antigravity-direct Antigravity CLI (agy) 1.5.0 (~/.gemini/bin/agy, keyring owner; PATH install 1.4.8; latest upstream 1.5.2) ✅ match — MITM capture of genuine 1.5.0: antigravity/cli/1.5.0 (aidev_client; os_type=linux; arch=amd64; cl=1013440158; auth_method=consumer); fork's FALLBACK_UA identical, 12/12 fork captures ✅ pass (gemini-3.8-flash, shell tool round-trip) ✅ pass No literal UA exists in either installed binary (grep -a verified) — fallback is the effective identity. Body delta (non-identity): genuine sends enabledCreditTypes, fork omits. Production unit sets AGY_BIN to the 1.4.8 install (secret-scan path only; UA unaffected). On upgrade to 1.5.2: FALLBACK_UA → antigravity/cli/1.5.2 (… cl=1015175089 …) — already MITM-captured from a scratch-updated copy
vibe-direct Mistral Vibe CLI 3.1.0 (= latest upstream) 🔧 fixed in main — genuine wire: mistral-client-python/Mistral-Vibe/3.1.0 (built-in mistral backend prepends mistral-client-python/); fork stamped Mistral-Vibe/3.1.0. PR #1873 merged (0cd3069b); from-source re-capture shows the corrected UA on 12/12 requests with the stamp winning post-merge. Deployed build still emits the old UA until the next deploy ✅ pass (deployed build, plan seat) ✅ pass ⚠️ The #1834 baseline's vibe row was wrong: its capture used a generic-backend provider, which omits the prefix. Baseline correction recorded on #1834
commandcode Command Code CLI 1.74.1 (latest upstream 1.88.4) ✅ exact match — re-verified both sides on the wire: User-Agent: cli, x-command-code-version: 1.74.1, x-cli-environment: production, POST /alpha/generate ✅ pass on fixed code / ❌ deployed build fails (see notes) ✅ pass on fixed code / ❌ deployed Functional defect found by this pass, live in production: the native provider inherited models.dev's seeded baseURL (https://api.commandcode.ai/provider/v1) → /provider/v1/alpha/generate 404s (production route_attempt rows confirm). PR #1875 merged (d8212e27) — seeded hosted-API base dropped in configuredRoute, regression test added; post-fix live run vs the real backend passed all legs. Deployed build keeps failing until the fix is built + switched in. Non-blocking deltas: genuine also sends x-project-slug, x-taste-learning: true. On upgrade: x-command-code-version → 1.88.4 (1.88.4 wire-captured in scratch; identity shape otherwise unchanged)
openai.main Codex CLI 0.160.0 (latest 0.167.0 — acceptance surface verified identical) ✅ accepted as declared — the doors deliberately declare originator: opencode + the harness UA rather than impersonating codex_exec; every backend acceptance element matches the genuine client: /codex/responses path, Responses shape, store:false, x-codex-beta-features: remote_compaction_v2 verbatim, WS-first (responses_websockets=2026-02-06), per-seat chatgpt-account-id ✅ pass (pool had reset early — not walled at probe time) ✅ pass Minor deltas vs genuine Codex, noted: no thread-id / x-client-request-id / x-codex-window-id / x-codex-turn-metadata
openai.alternate Codex CLI 0.160.0 (as above) ✅ as declared (as above); backend answered the probe with its quota response — identity accepted, seat walled ⏳ pending-reset ⏳ pending-reset Verbatim wall: usage_limit_reached, weekly (secondary) window 100%, resets_at 2026-11-09T17:04:02Z — recorded as this seat's reachability proof
muse-direct Muse CLI 1.4.13 (Nix-pinned; no public release feed) ❌ divergent — genuine: muse-build/1.4.13 (non-interactive; linux-x86_64; build 39490bd065c800195489caec34473582f7650b54) + x-client-id: tbh:exec + x-tbh-* set. Deployed leg (muse-proxy direct path): User-Agent is literally node, no identity headers at all. Full record on #1825 (comments 6691871047 + 6691959167) for the in-flight wire-native rebuild ⏳ rebuild in flight ⏳ rebuild in flight Meta pool also walled until Sun 2026-11-08 18:00 CST. The proxy's warm/exec fallbacks do produce genuine-shaped traffic, but only when the direct leg gets no upstream response
meta (fork-native) n/a-binary — first-party API surface (api.meta.ai), no consumer binary to imitate n/a (scratch capture: harness UA on Responses shape) — currently in disabled_providers; its conformance lands with the muse-direct rebuild ⏳ disabled ⏳ disabled See #1825 record
mistral (official) n/a-binary as an API door (the Vibe identity lives on vibe-direct) harness UA opencode/prod/2.0.30+5e9b135/cli (wire capture) — not probed (pool = Mistral API budget, exhausted; live calls would be funds) — —
opendesign n/a-binary (hosted gateway, no first-party client binary) harness UA (wire capture) ⏳ pending-reset (pool walled to 2026-11-10) ⏳ pending-reset Body-shape record: max_completion_tokens + store
cline-pass n/a-binary for UA purposes (api.cline.bot is Cline's backend, but this door is OpenAI-compatible API traffic, not Cline-client imitation) harness UA (wire capture). Observation: in a listener scratch shape the door sent no Authorization header (config carries no apiKey; auth-store entry not attached by that path in scratch) — observation only, not a production claim ⏳ pending — probe returned 401 provider.auth (see notes) ◐ partial — SSE session events flowed; the step failed before any deltas Verbatim error: Unauthorized: Please make sure you're using the latest version of Cline and re-authenticate your Cline account. Quota was NOT the blocker (fresh read at probe time: 5h 6% / weekly 2% / monthly 1%). Two live hypotheses, not yet disambiguated: the stored ClinePass credential is stale/rejected, or auth is not attached outside the full production shape (the listener capture's missing Authorization header points this way; serve-shape scratch servers could not be made to both redirect and verifiably attach). Next step: one session in full production shape (real data home + config, scratch DB/port) to test the credential as production attaches it, or re-authenticate the ClinePass account
opencode-go.drewrypope / .popesdrew OpenCode itself (OpenCode Go gateway) — the genuine client is our own lineage ✅ harness UA is the honest identity (wire captures; both doors byte-shape identical) ⏳ pending-reset (weekly windows walled) ⏳ pending-reset —
deepseek n/a-binary (official API only; no first-party coding client) — (provider disabled; PAYG reserve) n/a — never funds n/a —

Cross-cutting observations

  • The harness discloses itself additively on emulated doors (x-opencode-*, b3/traceparent, x-session-* headers ride along even where the UA stamp is correct). No evidence any provider gates on them today; recorded as an open observation for the weekly check, not fixed in this pass.
  • Two of today's three real defects were not UA strings: a wrong UA in the baseline record itself (vibe — the audit's capture method was flawed) and a functional break with a correct UA (commandcode baseURL seeding). Identity conformance has to include the baseline's own capture method and a functional leg, or it certifies fiction — both are now in the weekly spec.
  • Deployed-build caveat: production runs 5e9b135f. PRs fix(ai): vibe-direct presents the Mistral backend's real User-Agent #1873 (vibe UA) and fix(ai): commandcode provider must not inherit the catalog hosted-API baseURL #1875 (commandcode route) are merged on main but not yet deployed; the scorecard marks identity/functional per build accordingly.

Acceptance criteria

  • The weekly weekly-binary-wire-check job runs on its Monday cadence and records one line per in-scope binary (claude, agy, vibe, commandcode, muse, codex): unchanged, or changed with a wire-relevance judgment.
  • For every changed binary, the diff covers strings/endpoints, User-Agent and version patterns, header names, and auth/refresh, quota, and signing/telemetry mechanisms, with the conclusion recorded on this issue or a linked weekly record.
  • When a change is wire-relevant or uncertain, the ground-truth capture is re-run for the affected provider and any User-Agent / wire-format mismatch found is filed as its own issue and linked here.
  • Tool-call probes pass for each in-scope provider after any wire-format adjustment.

Activity

  1. dezren39 commented on Nov 6, 2026

    @dezren39
    Author

    cline-pass 401 — verdict: probe-shape artifact; the credential is healthy

    Re-ran cline-pass in full production shape (2026-11-06), per the open question on this issue: attached to the production opencode server on the laptop, session created with the model set at creation (cline-pass/glm-5.3-flash), one minimal prompt ("Reply with exactly: PROBEOK"). No config changes, no provider flips.

    Result: SUCCESS.

    • Session ses_e5e4dcfc464ffePSPfRi8b6k7w: assistant completed, finish=stop, reply "PROBEOK", no error.
    • route_attempt 316547 (2026-11-06T18:47:47Z): provider=cline-pass, model=glm-5.3-flash, outcome=success, first token 1236 ms, response 1340 ms, tokens 17421 in / 4 out.
    • Auth attached by production: the attempt carries a stored credential reference (credential_id cred_10c5d7f81001ItXj8WYivvzWX5) — production presented the stored cline-pass credential and api.cline.bot accepted it. No 401 anywhere in the production-shape attempt.

    So the conformance probe's scratch 401 ("Unauthorized: Please make sure you're using the latest version of Cline and re-authenticate your Cline account") was the probe's own defect — consistent with its listener capture showing no Authorization header leaving. The scratch shapes never attached the credential, and Cline's API answers a credential-less request with that re-authenticate wording. Quota was never the blocker either (fresh read 6%/2%/1%).

    Caveat for the weekly conformance set: cline-pass legs must run in production shape (through the production server, model set at session creation). Scratch/listener shapes cannot attach auth for this provider and will report false auth failures.

    No credential failure, no re-auth needed, no Drew involvement.

  2. dezren39 commented on Nov 6, 2026

    @dezren39
    Author

    Fastlane deploy 2026-11-06: wire-identity fixes #1873 + #1875 LIVE in production

    Production opencode (laptop, user unit opencode.service, 127.0.0.1:13420) cut over at 13:07:10 CST from fork 5e9b135f to a build of fork main 1b27880fb0e27ad9b1bce00ac77b1e4295734d1e.

    Blocker found and fixed en route: stale node_modules FOD hash

    Fork main did not build at all: nix/hashes.json pinned x86_64-linux nodeModules sha256-an3N7l..., stale for the current bun.lock; the FOD fails with a hash mismatch. The correct value sha256-WLI1jWYltgPZEWQ4LqseuEXA6DoC1FDfyw4iULldLIA= was produced independently by CI's nix-hashes compute job (2026-11-06T17:42Z, run 42263623640 — its update-hashes commit never landed because the aarch64-darwin leg was cancelled) and reproduced byte-identically by a local fake-hash build. This build's source is fork main 1b27880 with exactly that one line restamped; all program code is byte-identical to fork main. (Version string renders 2.0.30+dirty because the input was a local tree.) The same one-line fix has since landed upstream as PR #1880 (main now 08eca393d6d1), and a dispatched nix-hashes run (42276082160) completed green — so a switch/pin build from current main converges on identical package content.

    Verification

    • fastlane-probe: the claude-code direct leg's request reached Anthropic over the wire and returned its own 429 rate-limit error in 461 ms (not a routing/plugin failure — contrast the old plugin bug's 2.7 ms loopback 404). The haiku-plan route leg could not complete because both pool members are currently walled (claude-code 429; opendesign 402 quota-exhausted) — the cascade's failover across those attempts is visible in route_attempt. Organic production traffic on the new build is healthy (first minutes post-restart: openai.main 247 successes, vibe-direct 22, antigravity-direct 19, cline-pass 5; only failures are pool-wall 429/402s).
    • No plugin residue: opencode-claude appears 0 times in the live global config and the runtime overlay.
    • commandcode (fix(ai): commandcode provider must not inherit the catalog hosted-API baseURL #1875) — PRODUCTION FIX CONFIRMED: pre-deploy, every commandcode attempt 404'd (meta/muse-spark-1.3-contributor, "Not found. Check the docs for available routes."). Post-deploy probe session ses_e5e4db51124ffe62reCOAd1p10, pinned to the commandcode provider in production shape: route_attempt success (3,234 ms), assistant completed with finish=stop. Binary contains the corrected wire constants (https://api.commandcode.ai + /alpha/generate).
    • vibe-direct (fix(ai): vibe-direct presents the Mistral backend's real User-Agent #1873): probe session ses_e5e4db008bbffeLVZvVBri9qQG (mistral-small-latest) completed finish=stop, attempt success (925 ms). The outbound UA itself is not recorded server-side; the corrected literal mistral-client-python/Mistral-Vibe/3.1.0 (the fix(ai): vibe-direct presents the Mistral backend's real User-Agent #1873 CLI_USER_AGENT) is verified present in the deployed binary.
  3. dezren39 commented on Nov 6, 2026

    @dezren39
    Author

    Supersession note (same day, 13:17 CST)

    Ten minutes after the cutover recorded above, the muse-direct lane completed its own deploy and production moved to a pure build of fork main 08eca393d6d1 (which by then included PR #1880's hash fix): /nix/store/dy8kimkyrdb9byppbwnbd4x4hpapqxm0-opencode-2.0.30+08eca39-wrapped (code pin afdad961, GC root fastlane-gcroot-08eca39, unit restarted 13:17:19 CST). The two builds' program code is identical — 08eca393 differs from 1b27880fb0 only by the hashes.json line the 13:07 build already carried as a local restamp — so the verifications above carry over; additionally, on the current build: a commandcode probe session (ses_e5e4dab273affe2uJ122X4OpQ5) completed finish=stop with a successful attempt (3,591 ms), and vibe-direct is succeeding organically. All three GC roots (08eca39, 1b27880, 5e9b135) are retained; rollback chain intact. fastlane/state.json updated to the current state.

  4. dezren39 commented on Nov 6, 2026

    @dezren39
    Author

    Pin bump landed — the pending anomalyco#5647 switch now makes the current production build permanent.

  5. added
    priority/normalOrdinary priority (the default)
    effort/lLarge: multi-day or open-ended; expect staged check-ins
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Nov 7, 2026
  6. dezren39 commented on Nov 7, 2026

    @dezren39
    Author

    🤖 Intake review — fleet monitor

    • Related: none found in a quick scan of recent open issues — this is the program's home issue and the weekly job is its execution arm (per the body).
    • Notes: A clear recurring-program issue that arrived with no labels and no acceptance-criteria section. Labels normalized (kind/infrastructure, priority/normal, effort/l, status/needs-triage) and an Acceptance criteria section appended; original body preserved verbatim above it.
    • Risks: The weekly cadence is the value — a silently skipped week breaks the drift watch. The job's run record should land somewhere this issue links, so a missed week is visible.
    • Suggested approach: Keep this as the standing program tracker; file per-finding issues for any wire mismatch rather than accumulating findings here.
  7. dezren39 commented on Nov 7, 2026

    @dezren39
    Author

    Wire-conformance review: muse-direct native provider (PR #1872)

    Commit: f4514086e5 (merged in #1872, ancestor of deployed build 08eca393d6)
    Scope: Wire-conformance review under the Wire-Identity Conformance Program (#1876) and Audit B (#1825). Ground-truth baseline from /home/user/wire-conformance-2026-11-06/muse/ (partA-capture.jsonl, partB-scratch-capture.jsonl). Full analysis archived at /home/user/gemini-burn-2026-11-06/REVIEW-FORK.md.


    Conformance Verdict

    • Wire-Only / Binary-Independence Doctrine: ✅ CONFORMANT
      Zero binary commands (secret-tool, muse CLI) and zero subprocesses (child_process, execa, Bun.spawn) anywhere in packages/ai/src/providers/muse-direct*. The loopback proxy (muse-proxy on :18747) is retired and dead. Auth and inference run entirely in-process over HTTPS.
    • Wire-Identity Conformance: ❌ DIVERGENT
      The native provider faithfully ported the direct leg of bin/muse-proxy.mjs verbatim (Option B). Because the proxy direct leg never stamped identity headers and sent user-agent: node (audit follow-up: antigravity + vibe credential paths spawn secret-tool; antigravity refresh requires the agy binary #1825 comment 6691871047), the merged provider reproduces that divergence: it sets no User-Agent and none of the genuine Muse CLI identity headers (x-client-id: tbh:exec, x-tbh-*). Session traffic presents the OpenCode harness UA (opencode/.../cli), and key exchange presents the runtime node fetch default.

    Code Evidence Table

    Wire Property / Header Genuine Muse CLI 1.4.13 (partA-capture.jsonl) Native muse-direct (PR #1872) Verdict Code Reference in Fork
    User-Agent (Inference) muse-build/1.4.13 (non-interactive; linux-x86_64; build 39490bd065c800195489caec34473582f7650b54) opencode/prod/<version>/cli (harness UA) ❌ Divergent packages/ai/src/providers/muse-direct-auth.ts:241 (only sets authorization; harness UA from packages/core/src/session/model-request.ts:291 reaches wire)
    User-Agent (Key Exchange) N/A (CLI skips exchange on stored key) node (Node/undici default fetch UA) ❌ Divergent packages/ai/src/providers/muse-direct-auth.ts:146-150 (no user-agent set on fetch)
    x-client-id tbh:exec (Omitted) ❌ Missing Not present anywhere in packages/ai/src/providers/muse-direct*
    x-tbh-contributor-mode 0 (Omitted) ❌ Missing Not present anywhere in packages/ai/src/providers/muse-direct*
    x-tbh-session-id Session UUID (e.g. 01a1b207-...) (Omitted) ❌ Missing Not present; sends x-opencode-session-id instead (model-request.ts:286)
    x-meta-ai-gateway-session-id Session UUID (matches x-tbh-session-id) (Omitted) ❌ Missing Not present anywhere
    x-tbh-thread-id Thread UUID (Omitted) ❌ Missing Not present anywhere
    x-tbh-root-session-id Root Session UUID (Omitted) ❌ Missing Not present anywhere
    x-tbh-agent-role main (or reminder:skill-reminder) (Omitted) ❌ Missing Not present anywhere
    x-tbh-parent-thread-id Parent Thread UUID (on subagents) (Omitted) ❌ Missing Not present; sends x-opencode-parent-session-id instead (model-request.ts:287)
    traceparent 00-<32 hex trace id>-<16 hex span id>-01 (Omitted) ❌ Missing Not modeled in provider/protocol
    Endpoint URL Path POST https://api.meta.ai/responses POST https://api.meta.ai/v1/responses ⚠️ Divergent packages/ai/src/providers/muse-direct.ts:28,82 (retains proxy's /v1/responses)
    Credential Flow Directly presents stored api_key; skips exchange Always exchanges access_token at /muse-code/key ⚠️ Divergent packages/ai/src/providers/muse-direct-auth.ts:197-205

    Detailed Findings

    1. What User-Agent and headers does the native muse-direct provider actually send now?

    • Key Exchange (POST https://api.meta.ai/muse-code/key):
      • packages/ai/src/providers/muse-direct-auth.ts:147-150 sends:
        • authorization: Bearer <accountToken>
        • x-api-version: 1.0.0
        • content-type: application/json
      • It sets no User-Agent. In Node.js / undici fetch, this sends user-agent: node (wire-captured in partB-scratch-capture.jsonl:1).
    • Inference (POST https://api.meta.ai/v1/responses):
      • packages/ai/src/providers/muse-direct.ts:77-86 registers the route with { providerOptions: { store: false, include: ["reasoning.encrypted_content"] } } and no custom headers.
      • packages/ai/src/providers/muse-direct-auth.ts:240-242 applies auth via:
        loadKeyEffect(sources).pipe(Effect.map((key) => Headers.set(authInput.headers, "authorization", Bearer ${key})))
        Only authorization is set. Unlike claude-code-auth.ts, vibe-auth.ts, or antigravity-auth.ts, it does not call Headers.setAll to stamp a provider user-agent.
      • Consequently, session traffic carries the OpenCode harness headers from packages/core/src/session/model-request.ts:285-295:
        User-Agent: opencode/prod/<version>/cli, x-opencode-session-id, x-session-affinity, x-opencode-project, x-opencode-client.

    2. Does it match the genuine client's identity shape?

    No. It diverges in 12 distinct aspects from the genuine client identity captured in partA-capture.jsonl:

    • User-Agent is missing from key exchange (node) and falls through to the harness UA on inference (opencode/.../cli).
    • None of the genuine identity headers are present (x-client-id: tbh:exec, x-tbh-contributor-mode: 0).
    • None of the session tracking headers are present (x-tbh-session-id, x-meta-ai-gateway-session-id, x-tbh-thread-id, x-tbh-root-session-id, x-tbh-agent-role, x-tbh-parent-thread-id).
    • W3C traceparent is omitted.
    • The endpoint targets /v1/responses rather than the CLI's /responses.

    3. Does the provider still depend on spawning the Muse binary or a proxy process anywhere?

    No.

    • Grep of packages/ai/src/{providers,protocols}/muse-direct* returns 0 occurrences of child_process, execa, or Bun.spawn.
    • Auth file reading uses in-process node:fs/promises (readFile) in muse-direct-auth.ts:121-128. No secret-tool helper is called.
    • Loopback port :18747 is dead and unreferenced; muse-proxy service is retired and unlinked in developing-today/code PR feat: Add kotlin lsp integration anomalyco/opencode#6601/[FEATURE]: MCP Tool Output anomalyco/opencode#6604.
    • All network traffic is in-process HTTPS fetch and SSE streaming.

    Remediation Path

    To close the wire-identity gap, follow the pattern established in #1873 / #1875 / #1835:

    1. Export CLI_USER_AGENT = "muse-build/1.4.13 (non-interactive; linux-x86_64; build 39490bd065c800195489caec34473582f7650b54)" and CLIENT_ID = "tbh:exec" in packages/ai/src/providers/muse-direct-auth.ts.
    2. In museDirectAuth (muse-direct-auth.ts:241), use Headers.setAll to stamp user-agent, x-client-id, and x-tbh-contributor-mode: 0 after the transport merge.
    3. In exchangeMintedKey (muse-direct-auth.ts:146), pass user-agent: CLI_USER_AGENT and x-client-id: CLIENT_ID.
    4. In muse-direct-responses.ts or auth, inject x-tbh-* session headers mapping OpenCode session IDs.
  8. added
    queue/queuedHas a queued task in the Supabase agent queue
    task/triageQueue packet kind: verify, reproduce, and route this item
    queue/claimedA queue worker has claimed the task for this item
    and removed on Nov 7, 2026
  9. 10 remaining items

  10. added
    work/assignedAn agent holds this item via the queue (claimed task)
    queue/claimedA queue worker has claimed the task for this item
    and removed on Nov 8, 2026
  11. developing-today commented on Nov 8, 2026

    @developing-today

    Triage (task 11858, lane opencode-a): prior triage verdict CONFIRMED — this is the standing program home, not a fix item; no new packet.

    Re-verified fresh 2026-11-07 (America/Chicago) against current state:

    This issue stays OPEN as the program tracker. It should not be re-enqueued as a triage/fix item by done-task audits; its cadence is the weekly job, and per-finding issues are filed by that job when drift is found.

  12. added
    work/assignedAn agent holds this item via the queue (claimed task)
    queue/claimedA queue worker has claimed the task for this item
    and removed
    queue/claimedA queue worker has claimed the task for this item
    work/assignedAn agent holds this item via the queue (claimed task)
    on Nov 8, 2026
  13. dezren39 commented on Nov 8, 2026

    @dezren39
    Author

    Triage (task 12946, lane opencode-a): re-triage CONFIRMS task 11858 — standing program home, no fix packet, issue stays open.

    Re-verified fresh 2026-11-08 against current GitHub state:

    Outcome for queue task 12946: triaged — verdict recorded here, no follow-up packet, issue remains OPEN as the program tracker.

  14. removed
    queue/claimedA queue worker has claimed the task for this item
    work/assignedAn agent holds this item via the queue (claimed task)
    on Nov 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    effort/lLarge: multi-day or open-ended; expect staged check-inskind/infrastructureInfrastructure workmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions