- Per-memory cost-spike ack (memoryEntries.costSpikeAckedAt column + acknowledgeMemoryCostSpike helper) closes the rev-161 alarm-only gapCloses the named rev-161 next-sprint candidate ('per-memory cost-spike acknowledgment') on the operator counter-action surface. New nullable timestamp column on memory_entry. Stamped by acknowledgeMemoryCostSpike() when the operator clicks the rev-162 'Ack' button beside the rev-161 ⚡ pill on the rev-159 TopCostMemoryPanel. The rev-161 detector + Slack daily push + outbound memory.cost_spike event all skip memory entries whose ack stamp is >= today's day-start in workspace TZ so a triaged spike doesn't keep firing today. Mirrors the rev-56 task / rev-59 source / rev-63 assignee / rev-68 tag ack at the per-memory axis on the cost dimension. Distinct from rev-5 pin (permanent — exempts from rev-161 detector forever via the same load-bearing-by-design exclusion that rev-161 already applies). Ack = 'I see this entry's spike, stop alarming today, but watch for tomorrow.'
- Bulk per-memory ack-all chip on TopCostMemoryPanel + bulkAcknowledgeMemoryCostSpikes helperNew bulkAcknowledgeMemoryCostSpikes() helper caps at 50 memory IDs per call matching the rev-26 / rev-33 / rev-34 / rev-36 / rev-57 / rev-60 / rev-63 / rev-68 bulk surface vocabulary. New 'Ack all N' chip surfaces inline on TopCostMemoryPanel when canAck && visibleSpikingCount >= 2 (gated to editor+ via the rev-16 role enforcement on the dashboard layer). The rev-161 daily Slack push lists up to 5 spiking memory entries; until rev 162 operators landing on the dashboard had to ack each entry individually via the rev-162 inline button. Bulk-ack collapses that to one tap. Pairs with the per-row inline ack chip for the inline-vs-batch ack symmetry — the same pattern rev 6 / 26 / 33 / 34 / 36 / 57 / 60 / 63 / 68 followed across all four core entities + per-source / per-assignee / per-tag spike alarms now applies to the rev-161 per-memory spike alarm.
- memory.cost_spike_acked outbound event + dispatchMemoryCostSpikeAckedWebhook closes the rev-37 closure-receipt pattern at the per-memory axisNew OutboundEvent value memory.cost_spike_acked plus matching dispatchMemoryCostSpikeAckedWebhook() in src/lib/outbound.ts. Wired into both acknowledgeMemoryCostSpike() and bulkAcknowledgeMemoryCostSpikes() via void dispatch...({...}) so a downstream failure can't ripple back to block the ack itself. Mirrors the rev-61 task.cost_spike_acked + source.cost_spike_acked + rev-63 assignee.cost_spike_acked + rev-68 tag.cost_spike_acked closure-receipt pattern at the per-memory axis. Closes the alarm-cluster's seventh axis on the closure-receipt loop. External integrations watching the rev-161 memory.cost_spike event can now reconcile alarm-open with alarm-acknowledged at the per-knowledge-entity axis just as they already could at task / source / assignee / tag — load-bearing for FinOps tools tracking AI cost on a per-knowledge-asset dashboard, CRMs tagging knowledge entries by ROI, and board-status integrations aggregating 'open cost issues this week' surfaces. Rate-limited correctly: only fires when the SQL UPDATE returns at least one acked row so a no-op bulk call doesn't poison the audit trail.
- Dashboard + v1 ack routes (single + bulk) + OpenAPI 3.1 typed coverage — 84th unbroken cadence revFour new endpoints — POST /api/memory/{memoryId}/cost-spike-ack, POST /api/memory/cost-spike-ack/bulk, POST /api/v1/memory/{memoryId}/cost-spike-ack, POST /api/v1/memory/cost-spike-ack/bulk — mirror the rev-68 tag-ack route shape exactly at the per-memory axis. Editor+ role at the dashboard layer; bearer-auth via existing ingest token at v1. The OpenAPI 3.1 spec types both new v1 endpoints with full request/response schemas (memoryIds[≤50] required + acknowledgedCount response shape) plus extends the rev-161 GET /memory/cost-spikes response with the new costSpikeAckedAt field (nullable date-time) so MCP hosts render the muted-state chip without a follow-up call. The OpenAPI spec changelog header gains a rev-162 block explaining the operator counter-action closure on the per-memory axis and the new outbound event. The cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 84th unbroken rev with rev 162. The cost-spike ack v1 cluster on the protocol-bound surface is now five axes deep (per-task rev 56-57 / per-source rev 59-60 / per-assignee rev 63 / per-tag rev 68 / per-memory rev 162). The MCP server's cost-axis tooling has nothing left to design across attribution + trajectory + alarm + ack at every meaningful axis.