- Per-task cost spike detector + daily Slack push + outbound eventCloses the named rev-54 next-sprint candidate. New detectTaskCostSpikes() helper mirrors the rev-32 workspace-level detectCostSpike() at the per-task axis using the rev-54 dailyCostHistory primitive. Surfaces every open (non-done) task whose today spend in the workspace timezone is >= 2ร the trailing 7-day daily average AND >= $0.50 absolute, sorted by spike ratio descending (loudest first). Skips tasks with fewer than 3 historical days of non-zero spend so a brand-new expensive task can't trigger on its first day. New pingTaskCostSpikes() sweep added to runDailyDigest() โ pings Slack via the new buildTaskCostSpikeSlackPayload() block, fires the new task.cost_spike outbound event, writes a task_cost_spike activity-log entry. Rate-limited via the activity log to once per workspace per 24h, same shape as the rev-32 workspace-level alarm. The rev-32 alarm answers 'is this workspace anomalously expensive?'; rev-55 answers 'WHICH TASK is anomalously expensive?' โ the missing diagnostic axis on the cost-spike story.
- GET /api/v1/tasks/cost-spikes โ bearer-auth mirrorBearer-auth endpoint returns the same per-task spike list the dashboard pill + daily Slack push + digest section read from. Each row carries taskId, title, status, priority, todayUsd / baselineUsd / spikeRatio, plus the assignee block when set. Indexed in the /api/v1 self-describing endpoint list. Closes the v1 parity gap on the rev-55 dashboard primitive in the same cycle the dashboard primitive ships (the cadence pattern that started rev 37 holds through rev 55). Pairs with /api/v1/cost/today (workspace axis), /api/v1/cost/by-assignee (per-recipient axis), /api/v1/tasks/top-cost (per-task absolute cost), and /api/v1/tasks/{id}/cost-trajectory (per-task trajectory) as the cost-axis MCP cluster. Until rev 55 an MCP host driving the desk had to read every task's cumulative cost (rev 51) and 7-day trajectory (rev 54) and compute the spike condition itself; rev 55 makes the answer load-bearing on the protocol surface.
- Inline โก cost-spike pill on every spiking task cardEvery active-work card whose task is currently spiking gets a pulsing red โก Nร pill in the header pill row alongside the rev-51 cost pill and the rev-54 trajectory sparkline. Pure derived state โ the dashboard payload now includes the spike list and the renderTaskCard hot path looks up the spike via O(1) map lookup. The cost story now reads cumulative ($X.XX, rev 51) โ trajectory (7-bar sparkline, rev 54) โ spike (โก Nร, rev 55) across three pills in one row. The active-work card pill row has accumulated 8+ pills + 5 affordance rows over rev 21โ54; rev 55 is the first ALARM-level pill on the cost axis (vs ambient context). Pulsing animation matches the rev-37 'now ready' visual vocabulary so the alarm reads as load-bearing without overwhelming the queue.
- Per-task cost spike section in the daily digest emailNew buildTaskCostSpikesSection() helper drops a workspace-shared 'โก Per-task cost spike' block into every owner/admin recipient's digest email. Solo founders and email-first operators who don't have the dashboard tab open get the same heads-up that Slack-first teams already had via the rev-55 daily Slack push. Pre-fetched once per workspace inside runDailyDigest() and reused across every recipient so the call is cheap. The rev-36 previewDigestForUser() admin testing path also mirrors the change so admins iterating on configuration see the same surface. Closes the cost-spike push surface across all three operator-loaded channels: in-app pulsing pill (the operator's eye), Slack push (the operator's chat), digest email (the operator's inbox). The full per-task cost story is now end-to-end visible without the operator having to mentally aggregate cumulative + trajectory + cap data.