- Per-source chronic-warning ack (`source.chronicAckedAt`)New `source.chronicAckedAt` timestamp column + `acknowledgeSourceChronicWarning()` helper + `POST /api/sources/{sourceId}/chronic-ack` route + `SourceChronicAckButton` client component mounted directly beside the rev-61 `โณ Nd` chronic chip on every spiking row of the rev-57 cost-by-source panel whose `consecutiveSpikeDays >= 3`. The rev-61 persistent-spike recommendation banner + rev-62 chronic auto-pause sweep both skip sources whose chronic-ack stamp is younger than the 7-day TTL. **Strategic significance**: closes the named rev-71 next-sprint candidate ('per-source chronic-warning ack') on the operator counter-action surface at the per-source axis. Distinct from the rev-59 daily ack (which mutes today's rev-58 alarm) โ the rev-61/62 chronic surface fires on a *structural* problem (keyword filter, permanent pause, remove the source) so the right operator response is 'I see this, I'm intentionally letting it run, mute the chronic surface for a week' rather than 'stop alarming today.' Different surface, different TTL (7 days vs same-day), different intent. Mirrors rev-71 per-tag chronic ack at the per-source axis.
- Per-assignee chronic-warning ack (`workspace_member.chronicAckedAt`)New `workspace_member.chronicAckedAt` timestamp column + `acknowledgeAssigneeChronicWarning()` helper + `POST /api/cost/by-assignee/{assigneeId}/chronic-ack` route + `AssigneeChronicAckButton` client component mounted beside the rev-64 `โณ Nd` chronic chip on every spiking row of the rev-52 cost-by-assignee panel whose `consecutiveSpikeDays >= 3`. The rev-64 chronic-warning sub-sweep in `pingAssigneeCostSpikes` now skips assignees whose chronic-ack stamp is younger than the 7-day TTL โ the rev-64 Slack push + outbound `assignee.chronic_warning` event mute together. **Strategic significance**: mirrors the rev-71 per-tag + rev-72 per-source chronic ack at the per-recipient axis exactly. Closes the chronic-ack symmetry across all three dimensions where chronic makes sense (per-tag rev 71 + per-source rev 72 + per-assignee rev 72). The full per-recipient cost story is now end-to-end across detection (rev 62) โ daily ack (rev 63) โ chronic counter (rev 64) โ chronic warning push (rev 64) โ chronic ack (rev 72).
- v1 mirrors in lockstep (`POST /api/v1/sources/{id}/chronic-ack`, `POST /api/v1/cost/by-assignee/{id}/chronic-ack`)Two new bearer-auth endpoints mirror the rev-72 dashboard chronic-ack primitives in the same cycle the dashboard primitives ship (cadence pattern from rev 37 onward). MCP hosts can now ack chronic warnings programmatically on every axis โ daily mute for one day on the per-task / per-source / per-assignee / per-tag daily alarms (rev 56 / 59 / 63 / 68), chronic mute for one week on the per-source / per-assignee / per-tag chronic surfaces (rev 72 / 72 / 71). **Strategic significance**: the cost-axis MCP cluster now closes the **detect โ triage โ daily-ack โ chronic-ack** loop on every axis where chronic makes sense without a single dashboard-only path. Pairs with rev-71 v1 chronic-ack at the per-tag axis to form the complete chronic-ack v1 cluster.
- Muted chronic-pill state + visual polishNew `.ld-cost-source-chronic-ack` + `.ld-cost-assignee-chronic-ack` CSS using the same amber/warning palette as the rev-71 `.ld-cost-tag-chronic-ack` so all three chronic-ack buttons read with one consistent vocabulary across the per-tag / per-source / per-assignee surfaces. New `.is-acked` modifier on every chronic chip class โ when the workspace has acked the chronic warning, the `โณ Nd` chip switches to a muted neutral-grey palette with a strikethrough so the eye reads it as 'I've already triaged this' without losing visibility into the underlying chronic state. The full row-level reading order across all three chronic-axis panels is now: โก pill (red, today's alarm) โ Ack button (red, mute today) :: โณ chip (red, structural alarm) โ Ack 7d button (amber, mute 7d) โ โณ chip muted-grey when acked. Different alarms, different acks, different states, one consistent reading order. Cumulative micro-polish โ every rev 22+ has carried at least one.