- Per-tag cost-spike acknowledgment + inline 'Ack' button (closes named rev-67 candidate)New `workspace.tagCostSpikeAcks` JSONB column (`Record<tag, ISO date>`) โ tags are workspace-scoped strings, not entities, so the per-axis ack lives on the workspace row instead of a per-entity column. New `acknowledgeTagCostSpike()` helper + `POST /api/cost/by-tag/{tag}/cost-spike-ack` route + `TagCostSpikeAckButton` client component mounted directly beside the rev-67 โก pill on every spiking row of the rev-66 cost-by-tag panel. The rev-67 detector now skips tags acked in the current workspace-TZ day, so the โก pill, daily Slack push, outbound `tag.cost_spike` event, and rev-68 digest section all agree on what 'acked' means. **Strategic significance**: closes the named rev-67 next-sprint candidate at the operator counter-action surface. Mirrors the rev-56 task ack / rev-59 source ack / rev-63 assignee ack at the per-tag axis. The five-axis cost-spike alarm cluster (workspace rev 32 / per-task rev 55 / per-source rev 58 / per-assignee rev 62 / per-tag rev 67) now has a complete operator counter-action surface on every axis. Distinct from rev-29 focus tags (which BIAS attention TOWARD the tag) โ focus is a sustained operator preference, ack is a one-day mute.
- Bulk per-tag cost-spike ack (dashboard + v1 in lockstep)New `bulkAcknowledgeTagCostSpikes()` helper + `POST /api/cost/by-tag/cost-spike-ack/bulk` route + matching `POST /api/v1/cost/by-tag/cost-spike-ack/bulk` v1 mirror. New bulk-ack bar surfaces inline in the rev-66 `CostByTagPanel` when `canAck && visibleSpikingTags.length >= 2`, mirroring the rev-57 task bulk + rev-60 source bulk + rev-63 assignee bulk pattern at the per-tag axis. Caps at 50 tags per call. **Strategic significance**: rev-67 daily Slack push lists up to 5 spiking tags; until rev 68 operators landing on the dashboard had to ack each spiking workstream 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 / per-tag rev 67-68) โ the MCP server has nothing left to design on the cost-spike ack surface across the five-axis cluster.
- Per-tag cost-spike section in the daily digest emailNew `buildTagCostSpikesSection()` helper in `src/lib/digest.ts` mirrors the rev-55 per-task / rev-60 per-source / rev-63 per-assignee sections at the per-tag axis. Every owner/admin recipient sees up to 5 spiking workstreams with ratio + today vs avg + contributing-task count + tag handle + deep-link to the rev-66 cost-by-tag panel. Pre-fetched once per workspace via `detectTagCostSpikes()` and reused across every recipient โ same pattern the rev-55/60/63 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. **Strategic significance**: rev-67 closed the per-tag cost-spike push surface on the dashboard โก pill + Slack + outbound channels but the daily digest email channel was missing. Solo founders and email-first owners who don't have the dashboard tab open and don't sit in Slack now get the same heads-up Slack-first teams already have. The full per-tag cost story is now end-to-end visible across attribution (rev 66) + trajectory (rev 67) + alarm (rev 67) + ack (rev 68) in every channel an operator might be on (dashboard / Slack / digest email / outbound webhook / v1 / MCP). Closes the alarm cluster's fifth axis on the email channel โ workspace (rev 32) / per-task (rev 55) / per-source (rev 60) / per-assignee (rev 63) / per-tag (rev 68) all now reach every operator-loaded channel.
- tag.cost_spike_acked outbound event + closure receiptNew `tag.cost_spike_acked` outbound event + `dispatchTagCostSpikeAckedWebhook()` fires when an operator acks a tag spike (single or bulk). Mirrors the rev-61 `task.cost_spike_acked` + `source.cost_spike_acked` + rev-63 `assignee.cost_spike_acked` closure-receipt pattern at the per-tag axis. Wired into both `acknowledgeTagCostSpike` and `bulkAcknowledgeTagCostSpikes` via `void dispatch...({...})` so a downstream failure can't block the ack itself. Plus subtle visual polish: new `.ld-cost-tag-spike-ack` ack button + `.ld-cost-tag-bulk-bar` bulk-ack bar styles share the rev-63 assignee ack visual vocabulary so the five cost panels (workspace banner, top-cost-tasks, cost-by-source, cost-by-assignee, cost-by-tag) read with one consistent ack vocabulary across all five axes. **Strategic significance**: until rev 68, downstream integrations watching the rev-67 `tag.cost_spike` event had no closure signal โ they'd see 'alarm fired' but never 'alarm acknowledged.' A FinOps tool tracking AI cost on a per-workstream dashboard, a project tracker grouped by initiative, or a board-status integration aggregating 'open cost issues this week' had to either poll the dashboard for the current ack state or accept stale alarms. Rev 68 closes the loop on the alarm cluster's fifth axis.