Skip to content

Deployed laptop opencode config has drifted from canonical HEAD — claude-code pause (PR #1316) not in effect live #1425

Closed

Description

@dezren39

Found by the stewardship daily model + route audit, 2026-10-27 ~09:57 CDT (manual recovery run for the daily console reads / model audit skipped by cycles 75-77).

Finding

The laptop's deployed OpenCode config (~/code/.opencode/opencode.jsonc on amd-6, which ~/.config/opencode symlinks to) is a dirty working-tree file that diverges substantially from the repo's canonical HEAD version of the same file:

Concrete consequence already verified: the Claude-plan pause merged in PR #1316 (commit 7b7e5d36 — claude-code added to disabled_providers, config default moved to opencode-route/workhorse, because Drew put the Claude plan on the free tier) is not in effect in the deployed file: the working copy has no claude-code entry in disabled_providers, its default is claude-code/claude-haiku-5-5, and the haiku-plan route's first target is the direct claude-code/claude-haiku-5-5 leaf. Sessions placed on the laptop therefore still default to the paused Claude plan route.

Ask

Reconcile the deployed config with canonical HEAD through the normal PR flow: determine whether any working-tree-only changes are intentional (preserve them via a PR if so), then deploy the canonical file, restart/reload as needed, and verify live that disabled_providers includes claude-code and the default route is opencode-route/workhorse. Do not silently overwrite until the working-tree-only deltas are reviewed — some may be deliberate local seats.

Evidence

Acceptance criteria

  • The working-tree-only deltas in the laptop's deployed opencode.jsonc are reviewed; anything intentional is preserved through the normal PR flow, anything accidental is dropped with a note on this issue.
  • The canonical HEAD version of the config is deployed on the laptop and live-verified: disabled_providers includes claude-code (PR feat(opencode): pause claude-code (free tier) + terra-plan door correction #1316) and the default route is opencode-route/workhorse.
  • A drift check or documented step exists so a deployed-config divergence of this size is noticed within a day, not by audit luck.

Activity

  1. developing-today commented on Oct 27, 2026

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

    @dezren39
    MemberAuthor

    Intake review

    Fleet monitor intake pass, 2026-10-27 (repo-fleet-monitor).

    Related: #1297 (automatic provider-catalog updates), #1317 (codex door question), #1272 (routing policy alignment) — all cited in the issue body. The concrete harm is already merged-but-not-live: PR #1316's Claude-plan pause.

    Notes: Priority set high (monitor judgment): the live laptop config silently routes against a cost/policy decision Drew already made, and the drift is large (1,093 diff lines). Not held/user/owned — but the fix touches Drew's laptop working tree, so the review-the-deltas step in the acceptance criteria is a hard gate, not a formality.

    Risks: Overwriting deliberate local seats/settings if the deploy is done blind; the issue body explicitly warns against that.

    Suggested approach: diff the working file against HEAD section by section, PR anything intentional, then deploy canonical, restart/reload, and verify disabled_providers + default route live.

  3. added
    kind/bugSomething isn't working (prefixed form of the classic bug label)
    priority/highImportant and time-sensitive
    effort/sSmall: expected under 2 hours of work
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 27, 2026
  4. dezren39 commented on Oct 28, 2026

    @dezren39
    MemberAuthor

    Prepared proposal (NOT landed) — Meta pool availability is proven; no default change needed; three fixes proposed for review

    Prepared 2026-10-27 evening CDT after Drew corrected a conflation in the day's quota reporting. Evidence gathered firsthand; nothing was merged or landed under the old premise (PR #1465 was not merged and is left for its own review).

    Verified today — the meta door works and is in use

    • Deployed config (laptop ~/code/.opencode/opencode.jsonc, primary clone at main): meta provider defined and enabled (baseURL https://api.meta.ai/v1); the muse provider remains commented out per Drew's 2026-10-25 order; claude-code is in disabled_providers (the free-tier pause IS live in the deployed config — this corrects quota-view's older claim that it was not).
    • Live probe: the laptop's stored meta API key called muse-spark-1.3-contributor directly → HTTP 200 with a real completion (~15:35 CDT).
    • The laptop server's own route telemetry (route_attempt, 2026-10-27 00:00Z onward): 147 successful meta attempts, 0 failures (784K input tokens). All-time: 648 successes vs 10× 402 (the 2026-10-26 probe batch), 37× 401 (an older key era), one 60-second cooldown today that expired normally. The 402 is historical, not a live blocker.
    • The default route opencode-route/workhorse already seats meta/muse-spark-1.3-contributor#xhigh at weight 2 of 12. Workhorse routing decisions today: DeepSeek Flash 265, Luna 51, Sol 40, Meta 27, Haiku 2. Meta carries its designed seat — it was never configured to carry most tasks, and DeepSeek Flash high remains the default workhorse per the POOL MAP (Drew, 2026-10-25) and Decision 008.

    The premise correction

    The Power→Maximum subscription is the assistant's own app/website plan. It is not a pool, no provider draws on it, and its usage percentage never gated any route. The day's under-use question therefore resolves at the lane and gate level, not the pool level — see the three proposals.

    Proposed for review (in this issue's reconciliation scope)

    1. Gate inputs: the OpenChamber dispatcher requires a ≤60-min-old quota picture per pool before dispatching. For hours today the compiled picture (quota-view) was stale and conflated the assistant's subscription with this pool, which mechanically suppresses dispatch. Propose the gate take the Meta pool's fresh picture from the laptop /api/quota exporter (code#1301) plus route_health/route_attempt telemetry instead of compiled views.
    2. Doctrine drift: the dispatcher instruction still applies "a pool at ≥85% of window gets finishing work only," while the registry records Drew's 2026-10-27 rule that pools are used to 100% and close only at a known 100%. Aligning the instruction text is a job-body/instruction change — Drew's go-ahead needed per the standing hold; not done here.
    3. If more Meta share is wanted, the lever is the workhorse weight on meta/muse-spark-1.3-contributor (currently 2) via the switchboard PR — a doctrine call for Drew, not a repair. No weight change is proposed by this note.

    Records corrected today (dated notes, history preserved)

    • quota-view.md: Muse consumer summary row and detail section (the "this same Meta pool" / ≥85% phrasing is corrected; Maximum plan state recorded), Meta Model API section (probe + telemetry verification appended).
    • provider-quota-registry.md: addendum scope-limiting the 15:31 correction note — the Maximum figures describe the assistant subscription only; the Meta pool's availability rests on its own evidence.
  5. dezren39 commented on Oct 28, 2026

    @dezren39
    MemberAuthor

    Design landed for review — OpenCode-half redesign (Drew's order, 2026-10-28)

    Drew ordered: "redesign so at least half the tasks will use opencode." The design is drafted at files/opencode-half-redesign-2026-10-28.md in the keep-the-four-repos-healthy goal workspace. Nothing live was changed — no job body or shift instruction was edited; the proposed instruction edits are quoted in the design review thread for Drew's go-ahead, per the standing hold this issue already records.

    The design in one paragraph

    The split happens at claim time, deterministically: a per-queue assignment ledger counts tasks in flight or executed per lane; a new claim is assigned opencode iff the opencode count is ≤ the direct count (ties to opencode), which guarantees ≥50% of assignments at every prefix — no randomness, fully replayable. For an opencode-lane task the shift stays the queue citizen (claim, revalidation, label sync, laptop worktree under ~/git/fleet/, heartbeats, verification, terminal verb) but launches one OpenCode session per task on the laptop server (attach pattern, #1344/#1363) via the #1357 helper, with the model picked by the registry POOL MAP ladder under the ≤60-min measurement gate (workhorse = DeepSeek Flash high; Meta only through the meta provider; muse/* never; the claude-code pause stays). The shift shepherds the session, verifies its outcome against fresh GitHub state exactly as it does for its own work today, and writes the terminal verb itself — a dead session can never evaporate a claim.

    Honesty mechanisms

    • Fallbacks are recorded misses, by reason (server_unreachable, quota, saturated, laptop_load, session_failed, …): the task executes directly, the miss lands in the ledger, and because the executed count moves to the direct side, the assignment rule sends subsequent claims to opencode until the executed share recovers to ≥50% on its own.
    • Measurement is daily and published: per-queue + fleet counts by executed lane, misses and exclusions by reason, and the rolling 7-day executed share written to hidden_files/lane-share.json, summarised in the morning readout and the stewardship cycle log. Two consecutive days under 50% → main-chat alert + a comment here with the miss breakdown.

    Dependencies and rollout

    Implementation issues are being filed and linked below. Risks named in the design: keeper/babysitter supervision load, quota burn rate (Go plans lapse Nov 2 / Nov 6 mid-pilot), and laptop load — each with its mitigation (concurrency cap, per-launch measurement gate, laptop_load fallback).

  6. dezren39 commented on Oct 28, 2026

    @dezren39
    MemberAuthor

    Implementation issues filed for the OpenCode-half redesign (in dependency order): step 0 = #1357 (attach-first helper, already open) · step 1 = #1654 (claim-time lane assignment: ledger + lane verb) · step 2 = #1655 (shift executor mode) · step 3 = #1656 (keeper/babysitter binding-aware coverage) · step 4 = #1657 (daily lane-share measurement + below-floor alert) · step 5 = #1658 (code-queue pilot + extension to the other queues).

  7. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Stewardship daily model audit verification, 2026-10-29 ~06:45 CDT (cycle 120): the deployed laptop config was read directly this cycle (~/code/.opencode/opencode.jsonc, 203,268 B, mtime 2026-10-29 05:16 CDT). The material drift this issue was filed for appears RESOLVED in the deployed file: disabled_providers now includes claude-code (identical 18-entry disabled set to canonical origin/main 5a34fa7), and the default model is opencode-route/workhorse with small_model: opencode-route/speed — no direct claude-code leaf default remains. Residual deployed-vs-canonical difference is catalog lag only: 179 diff lines; deployed 551 models vs canonical 565 (cline-pass 15 vs 18, commandcode 87 vs 98; all other provider counts identical). Leaving open for the owning lane to confirm closure or narrow to the catalog-lag remainder.

  8. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    🚨 Lane-share below-floor alert (code#1657)

    Rolling 7-day executed share is 31.8% (floor 50%) on two consecutive days: 2026-10-30 and 2026-10-31 (America/Chicago).

    • Fallbacks by reason (trailing 7d): {"Lane A resume shift finished the parked PR-shepherd task directly: verified CI/Codex, dispositioned CodeRabbit threads, merged PR 930; no code changes were needed in this shift": 1, "Lane B shift did the fix directly in the laptop worktree; no session work needed": 1, "Lane B shift resumed the parked PR task directly: only CI revalidation and merge remained, no session work needed": 2, "Triage task: verification was API/code reading on the sandbox plus queue enqueue, no session work needed": 2, "cron lane shift executes directly in-run; assigned lane opencode not used by lane shifts (consistent with sibling completions)": 1}
    • Exclusions by reason (trailing 7d): {"Direct lane work this shift: fixed two Codex P2 findings on PR 888 in the laptop worktree (no session needed); parked awaiting Codex re-review + CI": 1, "Packet executed directly by the lane-B cron worker (no opencode session); work done on laptop worktree per fleet rule": 2, "Resume of parked PR-shepherd task: remaining work was CI/Codex verification, review-thread disposition and merge only; no code change for a session to make": 1, "Resume/merge shift: PR 839 already built by a prior launch; this lane dispositioned the Codex finding with a small follow-up commit, verified CI/Codex, and merged \u2014 no new opencode session work to assign.": 1, "Resumed parked task whose PR was already open; merge-decision/verification work done directly by lane shift, no coding session needed": 1, "Resumed parked task: PR 879 already built and validated by prior shift; this shift only revalidated CI/Codex and merged \u2014 no session work needed": 1, "Resumed parked task: PR 884 already built by prior shift; this shift only revalidated CI/Codex/diff and merged \u2014 no session work needed": 1, "Small bounded fix implemented directly by the lane worker in the laptop worktree (one call-site swap to the shared bounded reader plus tests); no opencode session needed for a packet of this size.": 1, "cron lane shift completing an already-merged task; no session lane": 1, "cron lane shift executes directly, not as an opencode session": 1, "resumed in-flight PR: direct lane execution, no session lane": 1}

    Full series: hidden_files/lane-share.json in the keep-the-four-repos-healthy goal workspace. This alert fires exactly once per below-floor streak.

  9. dezren39 commented on Nov 2, 2026

    @dezren39
    MemberAuthor

    Agent note — picked up (OpenChamber scheduled lane)

  10. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed on Nov 2, 2026
  11. dezren39 commented on Nov 2, 2026

    @dezren39
    MemberAuthor

    Agent note — triage verdict: no longer reproducible (OpenChamber scheduled lane)

    • Agent: queue worker (`repo-worker-code`), lane `bf419306-c4ef-470f-a553-beabf93239de` · task 2583, 2026-11-02T23:05Z
    • Verdict: both prongs of the issue are resolved on current `origin/main` (`0e26fa4b3`). No follow-up packet needed.

    Evidence (probed on the laptop just now):

    1. Drift is gone. `diff` of the deployed file `~/code/.opencode/opencode.jsonc` (161,975 bytes, modified Nov 2 16:08) against `git show origin/main:.opencode/opencode.jsonc` → byte-identical. The 1,093-line diff from Oct 27 no longer exists.
    2. The feat(opencode): pause claude-code (free tier) + terra-plan door correction #1316 pause IS in effect live. The live file has `"claude-code"` in `disabled_providers` (line ~154) and `"model": "opencode-route/workhorse"` (line 174) — exactly the pause state PR feat(opencode): pause claude-code (free tier) + terra-plan door correction #1316 (`7b7e5d36`, merged as `621b8fe24`) established. (Unrelated: `ce4ac25c9` re-enabled a different door, `muse-direct`; `claude-code` was untouched.)
    3. Symlink intact: `~/.config/opencode -> ~/code/.opencode`, so the running config reads this file.

    Closing as no-longer-reproducible. If the drift reappears, the check to re-run is: `git -C ~/git/code show origin/main:.opencode/opencode.jsonc | diff - ~/code/.opencode/opencode.jsonc`.

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

Metadata

Metadata

Assignees

Labels

effort/sSmall: expected under 2 hours 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-sensitivesource/stewardshipFiled by the stewardship review

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions