- Bulk per-source quietness un-ack — closes the un-mute symmetry on the rev-146 bulk-ack patternRev 148 shipped the single un-ack endpoint (operators could revoke a rev-145 quietness ack one source at a time) but the inline-vs-batch symmetry was open: an operator who bulk-muted N feeds via the rev-146 chip realising one or more are actually critical (the customer-onboarding RSS that just started publishing again, the partner's release feed that woke up after 3 weeks) still had to click the rev-148 chip on every row. Rev 149 closes that with `POST /api/sources/quietness-unack/bulk` + a matching `POST /api/v1/sources/quietness-unack/bulk` v1 mirror in lockstep. New `bulkUnacknowledgeSourceQuietness()` helper caps at 50 source IDs per call; only sources whose `quietnessAckedAt` stamp is currently non-null are revoked at the SQL layer, so passing already-clean sources is a silent no-op (the dispatch count matches actually-changed rows — no closure receipts fire for sources that were never acked).
- SourceQuietnessBulkUnack dashboard chip + brand-color teal paletteNew `SourceQuietnessBulkUnack` client component mounts inside the rev-142 source cadence summary block alongside the rev-146 SourceQuietnessBulkAck chip when 2+ feeds are currently muted. Brand-color teal palette mirrors the rev-148 single un-ack chip so the inline + bulk un-mute affordances read as siblings (un-mute vocabulary) distinct from the rev-146 amber bulk-ack chip (mute vocabulary). Two sibling bulk surfaces, two sibling colour stories, one consistent structural-quietness mental model. New `.ld-source-quietness-bulk-unack` CSS uses the same brand-color teal palette (`rgba(31,143,137,*)`) as the rev-148 single un-ack so the structural-quietness un-mute vocabulary is uniform regardless of single vs bulk shape, with hover lift + focus-visible ring + success-flash matching the existing chip vocabulary.
- Per-item closure-receipt fan-out — same shape as the rev-148 single un-ackBulk un-ack fires one `source.quietness_unacked` outbound event per actually-revoked source — keeps the closure-receipt contract uniform with single un-ack calls (rather than inventing a divergent bulk-shape event). Mirrors the rev-87 source chronic bulk-ack + rev-146 quietness bulk-ack closure-receipt fan-out exactly. Activity-log entry records the bulk action with a single line summarising the count + 'mute revoked' framing so the audit trail captures both lineage and operation. External integrations (FinOps tool, monitoring dashboard, CRM mirroring source state) reconcile the un-mute as N independent closure events, just as they would if the operator had clicked the rev-148 chip N times.
- OpenAPI 3.1 typed coverage on the new endpoint — 71st unbroken cadence revOpenAPI spec types the new `POST /sources/quietness-unack/bulk` endpoint with full request schema (sourceIds[≤50] required, min 1) + response schema (ok + revokedCount + revokedSources[]). 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 71st unbroken rev with rev 149. The OpenAPI spec changelog header gains a rev-149 block explaining the inline-vs-batch un-mute symmetry closure on the per-source quietness lifecycle. The `/api/v1` self-describing endpoint index + `/docs` page both document the new endpoint inline so MCP-host integrators reading the index discover it without opening the spec. The full per-source quietness lifecycle on v1 is now five axes deep: visibility (rev 144) + ack (rev 145) + bulk-ack (rev 146) + un-ack (rev 148) + bulk-un-ack (rev 149).