Skip to content

opencode-route-proxy: normalizeTarget drops target 'window' gates — no window handling exists in the proxy (PR #2549 Codex P2 unaddressed) #3225

Closed

Description

@dezren39

Finding (from PR review, unaddressed)

On PR #2549, Codex raised a P2 that was never fixed and never replied to:

Apply target time windows before expanding route candidates — For the checked-in background route, object targets carry window gates referencing experimental.model_route_windows, but this normalization discards those gates and the resolver never evaluates them. Consequently, time-windowed route targets are expanded outside their windows.
— chatgpt-codex-connector[bot], 2026-10-30T03:48:34Z

Evidence:

Still live on current main (verified 2026-10-31)

bin/opencode-route-proxy.mjs on current main contains no window handling at all (searching the file for window returns zero hits), and normalizeTarget still reduces an object target to its model ref and variant map:

const normalizeTarget = (t) => {
  if (typeof t === "string") return { ...parseTargetRef(t), variantMap: null };
  if (t && typeof t.model === "string")
    return { ...parseTargetRef(t.model), variantMap: t.variants || null };
  return null;
};

Any window gate on a configured target is discarded at normalization, so time-windowed targets are eligible at all hours.

Caveat for triage: if the window-gates feature was deliberately retired in the proxy redesign, then the live defect is not the proxy but the stale checked-in config that still carries window gates — triage decides which side is wrong (restore window evaluation in the proxy, or remove the dead gates from the config) and closes accordingly.

Acceptance criteria

  • Triage records which is true: windows are a live feature (proxy must evaluate them) or a retired one (config must stop carrying them).
  • If live: targets are only expanded inside their configured windows; a test pins an out-of-window exclusion.
  • If retired: the checked-in config no longer carries window gates, and the removal is noted where the feature was documented.
  • Or: resolve by a documented decision on this issue.

Activity

  1. added
    task/triageQueue packet kind: verify, reproduce, and route this item
    priority/normalOrdinary priority (the default)
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 31, 2026
  2. dezren39 commented on Oct 31, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · filed

  3. dezren39 commented on Oct 31, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

  4. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 31, 2026
  5. 4 remaining items

  6. dezren39 commented on Oct 31, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

    • Agent: fleet monitor (repo-fleet-monitor)
    • Session / ID: queue task 4702 (status: queued, no live lease)
    • Found via: monitor reconciliation
    • Task: Claim-evaporated label repair — the queue claim on this issue evaporated (task 4702 is queued and unclaimed, attempts 1/3, checkpoint stage: claimed) while the issue still carried claimed/assigned labels. Labels reset to the truth: queue/queued + status/needs-triage. The task is queued and unclaimed; the next lane claim resumes from the checkpoint.
    • Expectation: re-claim by a queue lane; no holder until then
  7. added
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 31, 2026
  8. dezren39 commented on Oct 31, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · triaged — verdict: LIVE FEATURE, proxy is the defect

    • Agent: queue worker (repo-worker-code), lane D shift
    • Session / ID: queue task 4702 (triage)
    • Found via: queue claim
    • Verdict: windows are a LIVE feature; the checked-in config is correct and bin/opencode-route-proxy.mjs is the defect. The retired-feature alternative is ruled out by the config's own current documentation.
    • Evidence (fresh on main, 2026-10-31T23:30Z):
      • bin/opencode-route-proxy.mjs (fetched from main, 806 lines): searching the file for window returns zero hits; normalizeTarget (line 315) still reduces an object target to parseTargetRef(t.model) + variantMap — t.window is discarded, exactly as the Codex P2 on PR feat(opencode-route): routing-only door — resolve the route, call the pool member directly #2549 (discussion r4420257675) said.
      • .opencode/opencode.jsonc (main): the background route's targets carry window gates (lines ~6982–6994) in both forms — a window name (deepseek-peak-early, deepseek-peak-late) and { "name": "deepseek-peak-early", "invert": true } — and experimental.model_route_windows (line 7299) defines them: Mon–Fri 01:00–04:00 UTC and 06:00–10:00 UTC.
      • The config comments state the feature is live and deliberate: "opencode#639 is LIVE (named windows landed in fork PR fix(deps): update p2panda-store digest to da80c05 #649; gates are the target window field…)" (2026-10-28 peak-windows pass), and the peak times were "VERIFIED 2026-10-29 against DeepSeek's own pricing page" — peak deductions double, so expanding gated targets outside their windows is a live cost/order defect, not dead config.
      • Effect through the proxy: the background route's ordered chain is mis-ordered at all hours — MiMo positions gated ON peak windows and the Flash position gated inverted are all treated as ungated.
    • Routing: follow-up fix task 4736 enqueued on repo-health-code-pilot (kind small_fix, dedupe repo-health:v1:fix:developing-today/code:issue:3225): preserve window in normalizeTarget (both forms), evaluate gates against experimental.model_route_windows in candidate expansion, pin in-window / out-of-window / inverted / ungated behavior in bin/opencode-route-proxy.test.mjs. This issue stays open until that fix lands.
  9. added
    queue/queuedHas a queued task in the Supabase agent queue
    and removed
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    on Oct 31, 2026
  10. dezren39 commented on Oct 31, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

    • Agent: queue worker (repo-worker-code), lane C
    • Session / ID: queue task 4736, lane C shift 2026-10-31 17:54 CDT
    • Found via: queue claim
    • Task: Triage decision recorded: windows are a LIVE feature — the checked-in config (.opencode/opencode.jsonc, background route) states the clock-gated chain designed under opencode#639 is LIVE (fork PR fix(deps): update p2panda-store digest to da80c05 #649), defines deepseek-peak-early/late in experimental.model_route_windows, and carries window gates on its targets today. So the proxy side is wrong, not the config: implementing window evaluation in bin/opencode-route-proxy.mjs (gate = window name, or {name, invert:true}; window = {daysOfWeek, start, end, timezone}) plus pinning tests.
    • Expectation: effort s; done = PR opened with bin/opencode-route-proxy.test.mjs passing incl. new window tests (out-of-window exclusion + invert form), ungated/string targets unchanged.
    • Links: branch queue/4736-3225-window-gates, laptop worktree ~/git/fleet/4736-3225-window-gates
  11. added a commit that references this issue on Oct 31, 2026
  12. dezren39 commented on Oct 31, 2026

    @dezren39
    MemberAuthor

    🤖 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

app/opencode-route-proxybin/opencode-route-proxy.mjs fleet proxypriority/normalOrdinary priority (the default)queue/queuedHas a queued task in the Supabase agent queuesource/pr-comment-reviewFiled by the pr-comment-review jobtask/triageQueue packet kind: verify, reproduce, and route this item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions