- Per-assignee cost-spike acknowledgment (closes rev-62 alarm-only gap)New `workspace_member.costSpikeAckedAt` timestamp column + `acknowledgeAssigneeCostSpike()` helper + `POST /api/cost/by-assignee/{assigneeId}/cost-spike-ack` route + matching v1 mirror + new `AssigneeCostSpikeAckButton` mounted directly beside the rev-62 โก pill on every spiking row of the rev-52 cost-by-assignee panel. The rev-62 detector + daily Slack push + outbound `assignee.cost_spike` event + new rev-63 digest section all skip assignees acked in the current TZ-day so a triaged spike doesn't keep firing. Mirrors rev-56 task ack + rev-59 source ack at the per-recipient axis exactly. Ack = 'I see this teammate's queue spike, stop alarming today, but watch for tomorrow.' Strategic significance: the four-axis cost-spike alarm cluster (workspace rev 32 / per-task rev 55 / per-source rev 58 / per-assignee rev 62) now has a complete operator counter-action surface on every axis.
- Bulk per-assignee ack + v1 parity (closes 4-axis bulk-ack symmetry)New `bulkAcknowledgeAssigneeCostSpikes()` helper + `POST /api/cost/by-assignee/cost-spike-ack/bulk` + bearer-auth `POST /api/v1/cost/by-assignee/cost-spike-ack/bulk`. New bulk-ack bar surfaces inline in the cost-by-assignee panel when 2+ rows are spiking, mirroring the rev-57 top-cost-tasks + rev-60 cost-by-source bulk pattern at the per-recipient axis. Caps at 50 IDs per call, matching the rev-26 / rev-33 / rev-34 / rev-36 / rev-57 / rev-60 bulk surface vocabulary. The rev-62 daily Slack push lists up to 5 assignee spikes; until rev 63 operators landing on the dashboard had to ack each spiking teammate individually. Bulk-ack collapses that to one tap. The cost-axis MCP cluster on the protocol-bound surface now closes the **detect โ triage โ ack** loop on every axis (workspace rev 32 / per-task rev 55-56 / per-source rev 58-59 / per-assignee rev 62-63) โ the MCP server has nothing left to design on the cost-spike ack surface.
- Per-assignee cost-spike digest section (closes alarm push-channel symmetry)New `buildAssigneeCostSpikesSection()` helper in `src/lib/digest.ts` mirrors the rev-55 per-task + rev-60 per-source sections at the per-recipient axis. Pre-fetched once per workspace inside `runDailyDigest()` and reused across every recipient โ same pattern the rev-55 + rev-60 sections use. The rev-36 `previewDigestForUser()` admin testing path also mirrors so admins iterating on configuration see the same surface they'll receive in production. Workspace-shared (every owner/admin recipient sees the same list โ 'this teammate's queue is anomalously expensive' is workspace-level diagnostic context). Strategic significance: closes the per-assignee push surface across all three operator-loaded channels โ in-app โก pill + ack button (rev 62 + rev 63), Slack push (rev 62), digest email (rev 63). Solo founders and email-first operators who don't have the dashboard tab open get the same heads-up Slack-first teams already have. The full per-assignee cost story is now end-to-end visible across attribution + trajectory + alarm + ack in every channel an operator might be on.
- assignee.cost_spike_acked outbound event (closure receipt) + visual polishNew `assignee.cost_spike_acked` outbound event + `dispatchAssigneeCostSpikeAckedWebhook()` fires when an operator acks an assignee spike (single or bulk). Mirrors the rev-61 `task.cost_spike_acked` + `source.cost_spike_acked` closure-receipt pattern at the per-recipient axis โ lets downstream integrations (CRM, FinOps dashboard, board-status integration) close their own alarm tickets without polling. Plus subtle visual polish: new `.ld-cost-assignee-spike-ack` ack button + `.ld-cost-assignee-bulk-bar` bulk-ack bar share the rev-59 source ack visual vocabulary so the four cost panels (workspace banner, top-cost-tasks, cost-by-source, cost-by-assignee) read with one consistent ack vocabulary. New row-hover lift on every cost-by-assignee row matches the rev-60 cost-by-source hover pattern so all three cost-cluster panels feel scannable rather than static. Cumulative micro-polish โ every rev 22+ has carried at least one. Strategic significance: closes the closure-receipt loop on the alarm cluster's fourth axis. The full alarm story is now consistent across all four axes (detect โ push โ ack โ closure receipt).