- Per-source quietness summary chip on TodayPanel — closes the named rev-146 next-sprint candidateUntil rev 147 the rev-144 quiet-source count was visible only on the rev-142 cadence summary block above the source list — operators glancing at the dashboard top-of-page (rev-33 TodayPanel) saw the rev-75 ChronicSummary chip when chronic cost spikes fired but had no equivalent for the structural-quietness axis. Rev 147 collapses that to a slate 🌙 N-source chip beside the rev-75 amber chip. New `QuietnessSummary` subcomponent in TodayPanel reads the new `quietSourcesActive` field on the dashboard payload (count of quiet sources whose rev-145 ack stamp is null OR expired), tap to scroll to the rev-1 sources panel where every per-row 🌙 chip + rev-145 ack chip + rev-146 bulk-ack chip live for triage. Hidden when count is 0 so quiet-day desks never see clutter. Pairs with rev-32 cost-spike banner + rev-75 chronic-warning summary as the third structural-alarm horizon on the morning-check surface — three orthogonal alarms (descriptive, chronic, quietness) in one consistent chip vocabulary at three distinct attention levels.
- GET /api/v1/sources/quietness response shape extended with quietSourcesActive + quietnessAckedAt projectionThe dashboard primitive ships with the v1 mirror in lockstep (the rev-37 cadence pattern holds unbroken through rev 147 — every dashboard primitive has a v1 equivalent within one rev). New `quietSourcesActive` field on the `/sources/quietness` response is the count of quiet sources whose rev-145 ack stamp is null OR has expired (i.e. not currently ack-muted). MCP hosts rendering 'how many quiet feeds need attention?' read this directly instead of enumerating perQuietSource and filtering client-side. Always <= quietSources. Also closes a small rev-145 bug: the route never projected `quietnessAckedAt` per-row even though the OpenAPI spec documented it (and the rev-145 column + computeSourceQuietness logic populated it). MCP hosts wanting to render the rev-145 muted-state per-source were getting null on every row; rev 147 closes that.
- OpenAPI 3.1 typed coverage on the rev-147 response shape — 69th unbroken cadence revCloses the typed-contract gap on the rev-147 v1 enhancement in the same cycle the dashboard primitive ships. The OpenAPI spec types the new `quietSourcesActive` field (integer, required) on the `/sources/quietness` response shape. 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 69th unbroken rev with rev 147. The OpenAPI spec changelog header gains a rev-147 block explaining the today-glance axis closure on the per-source quietness surface. MCP-host code generators reading the spec see a typed contract for the rev-147 today-glance primitive immediately + the rev-145 muted-state per-row primitive that was previously documented but unprojected.
- Visual polish — slate-palette quietness chip distinct from amber chronic + brand-amber costCumulative micro-polish (every rev 22+ has carried at least one) — and rev 147's polish is load-bearing because the morning-check surface (TodayPanel) now reads three structural-alarm horizons (chronic / cost-spike / quietness) on one panel. The slate palette (`rgba(90,100,120,*)`) sits at a distinctly lower attention level than the rev-75 amber chronic chip and the rev-32 brand-amber cost-spike alarm — quietness is the *quietest* of the three structural alarms because the action it suggests (consider removing/replacing the feed) is structural and rarely time-sensitive. The three chips together give the operator's eye a complete morning-glance picture: chronic-cost rising (amber, urgent), cost spiking (brand-amber, today's anomaly), feeds dormant (slate, structural). New `.ld-today-quiet-summary` CSS shares the same chip shape as the rev-75 chronic chip + rev-101+ share-affordance chip cluster so the dashboard's chip vocabulary stays uniform. Tactile hover + `:focus-visible` outline ring matches the rev-38 dashboard accessibility pattern.