- Per-source cost attribution panel + GET /api/v1/cost/by-sourceCloses the cost-axis cluster on the upstream side. New `getCostBySource()` helper joins per-task AI spend (the rev-51 cumulative columns) through `task.sourceSignalIds[] → signal.sourceId → source` so the dashboard and v1 surface answer 'which source is driving the most AI spend?'. Cost is split equally across the distinct sources contributing to a task — a defensible aggregation that avoids over-weighting a chatty source landing alongside a load-bearing one. New `CostBySourcePanel` mounts as a sibling of the rev-51 top-cost-tasks panel and rev-52 cost-by-assignee panel; the three together form the four-axis cost-observability cluster (per-task / per-recipient / per-source / per-cycle). Mirrored on `/api/v1/cost/by-source` so MCP hosts can answer the same question with one bearer-auth call. The MCP-cost surface is now five axes deep on the protocol-bound side and functionally complete on every axis.
- End-of-day spend forecast on TodayPanelLinearly extrapolates today's current spend across the remaining hours of the workspace-TZ day so operators get a forward-looking answer to 'if today keeps going at this pace, will I hit my cost cap before the day rolls over?'. New `projectedEndOfDayCents` + `hoursElapsedToday` fields on the existing `TodaySnapshot` shape (zero schema cost — pure derived state). Inline chip beside the rev-53 7d-baseline + sparkline turns amber and shows percent-of-cap when the projection would breach. Pairs with the rev-21 80% cap warning + rev-32 spike alarm: the cap warning fires at a hard threshold, the spike alarm fires on baseline drift, the projection lets the operator see where today is going *before* either alarm fires. Suppressed in the first hour of the day to avoid noisy extrapolation; clamps to actual spend after 23h so a near-finished day doesn't display a slightly-larger forecast.
- Bulk cost-spike acknowledgment (dashboard + v1)Mirrors the rev-56 single-task ack across many task IDs in one call. New `bulkAcknowledgeTaskCostSpikes()` helper + `POST /api/tasks/cost-spike-ack/bulk` route + matching `POST /api/v1/tasks/cost-spike-ack/bulk` v1 mirror in lockstep. New bulk-ack bar surfaces inline in the rev-51 `TopCostTasksPanel` when 2+ visible tasks are spiking — operators landing on the dashboard from the rev-55 daily Slack push (which lists up to 5 spikes) can now clear all of them in one tap instead of scrolling each card individually. Caps at 50 IDs per call, matching the rev-26 / rev-33 / rev-34 / rev-36 bulk surface vocabulary. Spiking rows in the panel also gain a quiet ⚡ pill so the row reads as alarmed without screaming.
- Cost cluster polish + 'View breakdown ↗' jump from TodayPanelThree small cumulative pieces of cost-cluster polish. (a) The TodayPanel spend stat now carries a 'View breakdown ↗' link that scrolls smoothly to the rev-51 top-cost-tasks panel — closes the rev-33-to-rev-57 cost navigation loop so operators no longer have to scroll to find the per-task / per-team / per-source breakdowns. (b) The rev-57 per-source panel uses a teal→amber gradient bar that visually anchors it as a sibling to the rev-51 brand→amber and rev-52 indigo→teal panels — three complementary takes on the same dollar figure, one consistent visual vocabulary. (c) The rev-51 top-cost-tasks panel now decorates spiking rows with a quiet red left-border accent + tinted amount color so operators can scan the panel and triage by alarm state without reading every meta line. Cumulative micro-polish — every rev 22+ has carried at least one.