Repository navigation
Open
Labels
app/pm-stackpm-stack (Pad/Grist) in developing-today/codepm-stack (Pad/Grist) in developing-today/codeeffort/mMedium: expected under 1 day of workMedium: expected under 1 day of workkind/featureNew feature or capability requestNew feature or capability requestpriority/normalOrdinary priority (the default)Ordinary priority (the default)queue/parkedQueue task is parked (waiting on CI, time, or an event)Queue task is parked (waiting on CI, time, or an event)queue/queuedHas a queued task in the Supabase agent queueHas a queued task in the Supabase agent queuesource/creatorFiled by the new-issue-creator jobFiled by the new-issue-creator jobstatus/needs-triageNot yet triaged; needs a first lookNot yet triaged; needs a first lookstatus/parkedDeliberately paused with a recorded resume conditionDeliberately paused with a recorded resume conditiontask/triageQueue packet kind: verify, reproduce, and route this itemQueue packet kind: verify, reproduce, and route this item
Description
Part of epic #1184; implementation follow-up of design issue #1259 (spend rollups). Design note: doc/spend-rollups-design-1259.md. Depends on the rollup-store slice of #1259.
Scope
Detect cost anomalies from the spend rollups and surface them through the existing alert throat (pm-stack/aggregator/src/alerts.ts, #3676) into Needs-you (/attention) and the Today/brief summary — no new notification path.
Anomaly classes (v1, thresholds are named constants with tests, per the design note)
- Burn without progress: an epic/project consumes spend in a window while closing zero child issues in the same window.
- Single-session dominance: one root session accounts for more than the threshold share of an epic's window spend.
- Unattributed growth: the unattributed share of total spend rises window-over-window beyond the threshold.
- Charge without activity: a matched PAYG charge for a service with no corresponding session/quota activity in its period.
Rules
- Missing or partial data suppresses the anomaly, never fabricates it: an anomaly needs a complete window on both sides of its comparison.
- Each surfaced anomaly names its evidence: scope, window, the two compared values, and a link to the rollup/drill-down.
- Delivery class: page + ledger (warning) in v1; no push, per the alerts design (warnings never push in v1).
Acceptance criteria
- One test per anomaly class: fires on the constructed pattern, silent on partial data, silent just below threshold.
- Dedupe: a continuing anomaly updates the existing incident (alert-throat dedupe), it does not re-post every tick.
- Anomaly constants live in one named place, so Drew's threshold rulings (open questions in the design(pm-stack): spend rollups — token and dollar attribution per project and per epic, rendered on Projects/Roadmap #1259 design note) change one file.
Checks
bun testandbunx tsc --noEmitinpm-stack/aggregatorpass (CI on the PR).
Metadata
Metadata
Assignees
Labels
app/pm-stackpm-stack (Pad/Grist) in developing-today/codepm-stack (Pad/Grist) in developing-today/codeeffort/mMedium: expected under 1 day of workMedium: expected under 1 day of workkind/featureNew feature or capability requestNew feature or capability requestpriority/normalOrdinary priority (the default)Ordinary priority (the default)queue/parkedQueue task is parked (waiting on CI, time, or an event)Queue task is parked (waiting on CI, time, or an event)queue/queuedHas a queued task in the Supabase agent queueHas a queued task in the Supabase agent queuesource/creatorFiled by the new-issue-creator jobFiled by the new-issue-creator jobstatus/needs-triageNot yet triaged; needs a first lookNot yet triaged; needs a first lookstatus/parkedDeliberately paused with a recorded resume conditionDeliberately paused with a recorded resume conditiontask/triageQueue packet kind: verify, reproduce, and route this itemQueue packet kind: verify, reproduce, and route this item
Activity
dezren39 commentedon Nov 3, 2026
agent-note:v1
state: triaged (coverage pass)
Coverage pass 2026-11-03: reviewed in the fleet-wide per-issue pass (drift / overlap / already-handled / stale / blockers / ordering). Verdict: still live; queued in repo-health-code-pilot as triage at priority 40 (priority/normal). If this is already handled at current main, the triage closes it with evidence; if it needs splitting, the triage files the split.
Found via: coverage pass 2026-11-03
23 remaining items
dezren39 commentedon Nov 4, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 4, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 5, 2026
🤖 Agent note · handed off