- Per-source quietness ack (workspace + v1) — closes the named rev-144 next-sprint candidate at the operator counter-action axisNew `source.quietnessAckedAt` timestamp column + `acknowledgeSourceQuietness()` helper + `POST /api/sources/{sourceId}/quietness-ack` route + matching `POST /api/v1/sources/{sourceId}/quietness-ack` v1 mirror in lockstep. New `SourceQuietnessAckButton` client component mounts directly beside the rev-144 🌙 quiet pill on every quiet source row whose ack stamp is older than the rev-145 7-day TTL. The chip stays visible on the row when ack-muted but switches to a brand-color teal palette + 'muted' suffix so the visual hierarchy reads as 'I know about this, intentionally ignored' rather than 'alarm pending action.' Distinct from rev-6 pause (permanent until resumed), rev-26 keyword filters (per-item gating), rev-72 chronicAckedAt (cost-spike axis). Quietness ack = 'I see this is silent, intentionally, mute the alarm for 7 days.' 7-day TTL matches the rev-72 chronic-ack cadence (structural problem, not transient).
- Daily Slack push + outbound `source.quietness_warning` event for chronically quiet feedsNew `pingSourceQuietness()` cron sweep added to `runDailyDigest()` mirroring the rev-58 source cost-spike sweep shape. For every onboarded workspace, fetches the rev-144 `getSourceQuietnessOverview()`, filters out ack-muted sources within the rev-145 7-day TTL, and (a) pings Slack via the new `buildSourceQuietnessWarningSlackPayload()` block (`:new_moon: Per-source quietness` header + listing each quiet source with `Nd silent` + label + type + last-polled fact + recommendation copy), (b) dispatches the new `source.quietness_warning` outbound event via `dispatchSourceQuietnessWarningWebhook()`, (c) writes a `source_quietness_warning` activity-log entry. Rate-limited via the activity log to once per workspace per 24h with the same dead-Slack-webhook auto-clear path as rev-58 cost-spike + rev-74 chronic-warning. Distinct from rev-58 (cost rising, still producing) and rev-74 (cost rising 3+ days running) — quietness fires on *absent* signal across the staleness floor. Three orthogonal structural alarms, one consistent Slack/outbound vocabulary.
- Closure-receipt outbound `source.quietness_acked` event + activity-log per-kind glyph + tintNew `source.quietness_acked` outbound event + `dispatchSourceQuietnessAckedWebhook()` fires when an operator clicks the rev-145 ack chip. Mirrors `source.chronic_warning_acked` (rev 73) at the structural-quietness axis so a downstream integration (CRM, FinOps tool, monitoring dashboard) closes its loop on a muted-quiet source: detected → acked → silenced 7d. Activity log gains a 🌙 glyph + slate per-kind tint for `source_quietness_warning` and a teal tint for `source_quietness_acked` so operators reading the log scan the per-source observability axes (cost / chronic-spike / quietness) at three distinct attention levels without parsing copy.
- OpenAPI 3.1 typed coverage — 67th unbroken cadence revCloses the typed-contract gap on the rev-145 v1 endpoint in the same cycle the dashboard primitive ships. The OpenAPI spec types the new POST `/sources/{sourceId}/quietness-ack` endpoint with full response schema (ok + acknowledgedAt date-time). The existing GET `/sources/quietness` perQuietSource row schema picks up the new `quietnessAckedAt` field (string|null, format date-time) so MCP hosts render muted-state without a follow-up call. The cadence pattern from rev 78 onward (every v1 enhancement gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 67th unbroken rev with rev 145. The OpenAPI spec changelog header gains a rev-145 block explaining the operator counter-action closure + dual outbound events (warning + acked) at the structural-quietness axis. The `/api/v1` self-describing endpoint index also documents the new endpoint inline so MCP-host integrators reading the index discover it without opening the spec.