Repository navigation
Description
Finding
Evidence (live review 2026-10-26 ~22:40 CDT, laptop loopback + gh, cross-checked): /quota renders pool numbers whose sources are heterogeneous: some are machine reads (fleet feed, 3m old tonight), several are dated MANUAL console reads carried in the stewardship quota view (per the 2026-10-26 SaaS review; e.g. Meta/Go/Cline have no working machine meter). The page does not badge which is which or how old each pool's read is - yesterday this exact gap hid Go Personal at 60% vs a console 80%, and Meta as "healthy" while walled. /api/quota.json pool objects likewise carry no read-age field a consumer could check.
Proposal
Every pool/service carries source + readAt + age in the model and API; the page badges manual reads with their date and flags reads older than their pool's expected cadence (console reads: >26h) as stale, in the needs-attention strip style already used for >80%/walled.
Acceptance
- A fixture pool with an old manual read renders the stale badge; API exposes readAt/source per pool.
- Tonight's live pools each show a source + age on the page.
Refs: design(aggregator): quota + throughput view — pooled quotas, resets, burn rates, model-choice support #851.
Acceptance criteria
- Every pool/service carries source + readAt + age in the model and in /api/quota.json.
- A fixture pool with an old manual read renders the stale badge on /quota; reads older than their pool's expected cadence (console reads: >26h) are flagged stale.
- Tonight's live pools each show a source + age on the page.
Activity
developing-today commentedon Oct 27, 2026
CODE-306
dezren39 commentedon Oct 28, 2026
Intake review
Related: Live-review finding (2026-10-26). Refs #851. Sibling batch: #1171, #1169, #1167.
Notes / risks: Manual console reads are the pools most likely to be stale and least likely to look it — the badge + API readAt/source fields are both required, page-only is not enough.
Suggested approach: Use the existing needs-attention strip styling for the stale flag, per the proposal.
Live check: verified still open and unheld this run; a merged-PR search on this run (2026-10-28T10:35:00Z) returned no PR resolving this issue, so it remains live work. Acceptance criteria appended to the body (original text preserved verbatim above it) and labels normalized by the fleet monitor.
dezren39 commentedon Nov 1, 2026
🤖 Agent note · picked up
dezren39 commentedon Nov 1, 2026
🤖 Agent note · done
b56ccda5), all inpm-stack/aggregator:src/model.tsdefinesPoolFreshness { measuredAt, source, state }("Per-pool freshness from the quota gatherer (feat(quota-plane): quota-gatherer service in the PM stack — 15-minute tick, quota-current contract #1151)") andQuotaPool.freshness;src/quota-current.ts(applyEntry) sets it on every pool from the gatherer's dated reads, and/api/quota.json(server.ts) serves that same quota model. The field is namedmeasuredAtrather thanreadAt— same substance.staleonce a read passes the freshness bound (QUOTA_CURRENT_FRESH_MS= 20 min, plus the aggregator: a future-dated gatherer read is 'fresh' forever until its date passes — quota-current freshness has no upper bound, so one skewed measuredAt pins a pool's windows for weeks #1541 future-skew gate) and the pool card renders it —src/render.tspool line: "gatherer · {state} · measured {date} · {source}". Manual/console reads ride the SaaS-card path:freshnessStamp()renders "measured {date} · {age} · {source class}" plus astale — as of {date}badge and dims the card once the read is older than that card's expected cadence (UsageCard.cadenceDays, "older reads render stale"). One honest difference from the 2026-10-26 text: the cadence is per-card (cadenceDays) rather than a single hard-coded 26h console rule — the mechanism asked for (flag reads older than their pool's expected cadence) is what shipped.test/quota-current.test.tscovers the freshness classification (incl. the aggregator(quota-current): stale-path newest pick is not finite-gated — a garbage or far-future measuredAt wins the pool's displayed freshness #2253 newest-pick gate);test/usage.test.tscoversfreshnessStamprendering.