Skip to content

aggregator(quota): opendesign stale rendering drops the dated fallback windows — page shows no windows + 'No dated read' while the read carries 0/0 @18:15Z #6942

Open

Description

@dezren39

Found by the pool-quota steward, 226th run, 2026-11-07T19:21Z tick.

Read (quota-current.json, source opencode-quota, generatedAt 2026-11-07T19:21:03.647Z):

  • heartbeat perProvider opendesign = error: 'Open Design usage API returned HTTP 503' (the hub leg now errors too; the live :3000 /api/quota/opendesign probe returns the same HTTP 503 error).
  • The providers[] entry for opendesign carries the dated fallback windows standing: 5h 0% / 7d 0%, full credits (50000/50000; 150000/150000), measuredAt 2026-11-07T18:15:38.825Z, state ok (fallback entry).

Page (/api/quota.json, same tick, gatherer generatedAt identical 2026-11-07T19:21:03.647Z):

  • opendesign pool renders state 'stale', freshness {measuredAt 2026-11-07T18:15:38.825Z, source opencode-quota, state stale}, windows: [] (empty), note: 'No dated read. Live windows arrive through the quota gatherer ...'.

Diff: per the pass-through rule (PR #5080), a pool whose read entry is in error should show that error as its freshness with the dated fallback windows standing. Here the freshness shows 'stale' rather than the read error, the dated fallback windows (0/0 @18:15Z) do not stand — they are dropped entirely — and the note 'No dated read' contradicts the read, which does carry a dated read.

All other pools matched the read 13/13 on presence, freshness and percentages this run; turso saas section matched. This is an aggregator rendering bug, not a steward input problem; no quota-view prose was edited to compensate.

Acceptance: when the opendesign gatherer leg errors, /api/quota.json (and /quota) render the pool with the error as its freshness and the last dated windows from the read standing (percentages identical to the read entry), matching the documented correct rendering.

Acceptance criteria

  • When the opendesign gatherer leg errors, /api/quota.json and /quota render the pool's freshness as that read error (not 'stale').
  • The last dated fallback windows from the read stand in the rendering, with percentages identical to the read entry (this report: 5h 0% / 7d 0% @2026-11-07T18:15:38.825Z).
  • The 'No dated read' note is not shown when the read carries a dated read.
  • Other pools' rendering is unchanged (13/13 matched the read in this report).

Activity

  1. developing-today commented on Nov 7, 2026

    @developing-today
    Contributor
  2. added
    kind/bugSomething isn't working (prefixed form of the classic bug label)
    priority/normalOrdinary priority (the default)
    effort/sSmall: expected under 2 hours of work
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Nov 7, 2026
  3. dezren39 commented on Nov 7, 2026

    @dezren39
    MemberAuthor

    Intake review

    • Related: PR quota: straight pass-through of the OpenCode quota read (Drew, 2026-11-03) #5080 (pass-through rule this rendering should follow, per the report).
    • Notes: Verified live at filing: the read (quota-current.json, 2026-11-07T19:21Z tick) carries dated fallback windows for opendesign while the page renders windows: [] and a contradictory 'No dated read' note. Aggregator rendering bug, not a steward input problem.
    • Risks: Low — rendering-only; the fix must not alter gatherer/read semantics.
    • Suggested approach: In the aggregator's opendesign rendering path, when the per-provider read is in error, pass the error through as freshness and keep the read entry's dated windows, matching the PR quota: straight pass-through of the OpenCode quota read (Drew, 2026-11-03) #5080 rule already applied to other pools.
    • Acceptance criteria appended by the fleet monitor intake pass; meta/enriched applied.
  4. developing-today commented on Nov 8, 2026

    @developing-today
    Contributor

    🤖 Agent note · picked up

  5. developing-today commented on Nov 8, 2026

    @developing-today
    Contributor

    🤖 Agent note · done

    Triage verdict: CONFIRMED — shell pools lose the read's dated windows on the stale path

    Verified fresh at origin/main 4fee73fb4b556649ee57193d152ef1df85ff95a5 (2026-11-08):

    • opendesign is a shell pool (pm-stack/aggregator/src/quota-extract.ts, SHELL_POOLS): windows: [] and the note "No dated read. Live windows arrive through the quota gatherer … overlaid onto this pool by overlayQuotaCurrent." It has no dated-read extractor — the only dated windows for this pool anywhere are the ones the quota read's providers[] entry carries.
    • In pm-stack/aggregator/src/quota-current.ts, applyEntry() on the stale (and error) path sets pool.freshness/pool.state and returns without copying the entry's windows. That is correct for spec pools — their base windows ARE the dated read, and pm-stack/aggregator/test/quota-current.test.ts pins exactly that ("dated read, not the aged gatherer value", 69%). For a shell pool the same path leaves windows: [] and lets the shell note stand against a read that does carry a dated read — the reported page, exactly.
    • Freshness shows stale rather than the leg error because the failing tick's providers[] entry is the retained fallback: markRetained (quota-gather-map.ts) stamps retainedFromFailedTick and preserves the entry verbatim — no error field — and entryState classifies retained entries stale immediately (perf(quota-plane): parallel provider fetching + per-provider timeout budget for the 15-min tick #1268). The actual leg error (HTTP 503) sits in the tick's heartbeat perProvider, which no overlay path consults for a pool's freshness. The gatherer summary in the same overlay does surface per-provider state, so the information reaches the aggregator; it just never reaches this pool's freshness.
    • No test covers the shell-pool stale/retained path (quota-current.test.ts pins spec pools only; no opendesign case), and no PR references issue aggregator(quota): opendesign stale rendering drops the dated fallback windows — page shows no windows + 'No dated read' while the read carries 0/0 @18:15Z #6942.

    Routing: task 11449 (small_fix) with the issue's acceptance criteria, scoped to the aggregator: on the stale/error path a pool with no windows of its own takes the entry's dated windows (percentages identical), the shell note is suppressed when the read carries a dated read, and the pool's freshness surfaces the leg error — while the pinned spec-pool stale tests keep passing and the #1268 classification for spec pools is untouched. One design point is named in the packet for the fix worker: where the error text comes from (the retained entry carries none; the heartbeat perProvider error is the available source).

  6. added
    queue/queuedHas a queued task in the Supabase agent queue
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 8, 2026
  7. dezren39 commented on Nov 8, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

  8. dezren39 commented on Nov 8, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · parked

  9. added
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    status/parkedDeliberately paused with a recorded resume condition
    and removed
    queue/claimedQueue worker lifecycle state
    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/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/normalOrdinary priority (the default)queue/parkedQueue task is parked (waiting on CI, time, or an event)status/parkedDeliberately paused with a recorded resume conditionstatus:in-reviewwork/assignedQueue worker lifecycle state

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions