- Per-source scheduled pause-until — closes the long-outstanding gap on the source-management primitive clusterRev 21 shipped scheduled-pause at the *workspace* level (5 preset windows + auto-resume sweep), but operators muting a noisy LinkedIn bridge during a launch week, a partner source during a holiday window, or a chatty RSS feed while reviewing the signal mix had no per-source equivalent — they paused manually via rev-6 and had to remember to re-enable. Rev 150 closes that with a deterministic 'auto-resume on Friday 9am' primitive distinct from rev-6 manual pause (no schedule, indefinite), rev-141 cadence override (still polls, just slower), rev-145 quietness ack (separate axis), and rev-62 chronic auto-pause (alarm-driven). New `source.pausedUntilAt` timestamp column + `setSourcePauseUntil()` helper validates 14-day max window + `sweepSourcePauseExpiries()` auto-resume helper. Mirrors the rev-21 workspace pauseUntilAt pattern at the per-source axis exactly — same 14-day max window, same 5-preset popover vocabulary.
- Dashboard chip + popover with 5 preset windows + RSS poller integration via existing pending-status filterNew `SourcePauseUntilButton` client component mounts on every source row alongside the rev-6 SourceActions + rev-95 SourceRename. Five preset windows (1h / 4h / tomorrow 9am / next Monday 9am / 1 week) match the rev-21 workspace pause-until vocabulary. When pausedUntilAt is set + still in the future, the chip renders as brand-amber 'Paused {Nh}' with click-to-extend + 'Resume now' actions; when clear, the chip renders as muted '⏰ Schedule pause' affordance available to editor+ roles only. The RSS poller integration is implicit — `setSourcePauseUntil` flips the source's status to `pending` and the rev-5 `pollRssSourcesForWorkspace` already filters `status !== 'pending'` so the existing skip path handles the schedule naturally. Pure reuse of the rev-6 status filter; no new poller logic.
- Auto-resume sweep wired into runDailyDigest + runDeskPulseNew `sweepSourcePauseExpiries()` helper finds every source with `status='pending'` AND `pausedUntilAt <= now`, flips status back to `connected`, clears the column, and writes an activity-log entry. Wired into both the daily digest cron (alongside rev-21 workspace pause sweep + rev-49 stale-task auto-archive + rev-148 quietness sweeps) AND the rev-1 cron pulse `runDeskPulse` so cron-driven workspaces don't have to wait for the next daily digest to recover an expired source schedule. Pure no-op on workspaces with no scheduled pauses (filters at the SQL level on a non-null + lte predicate).
- v1 mirror + OpenAPI 3.1 typed coverage on the rev-150 endpoint — 72nd unbroken cadence revNew bearer-auth `PATCH /api/v1/sources/{sourceId}/pause-until` mirrors the dashboard endpoint exactly (same Zod schema accepting `{ pausedUntilAt: ISO | null }` with the 14-day max window, same `setSourcePauseUntil` delegation). Indexed in the `/api/v1` self-describing endpoint list. OpenAPI 3.1 spec types the new endpoint with full request schema (pausedUntilAt nullable string format date-time) + response schema (ok + sourceId + pausedUntilAt + status) + 400 error path (invalid timestamp). The cadence pattern from rev 78 onward (every dashboard primitive has a v1 equivalent typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 72nd unbroken rev with rev 150. The OpenAPI spec changelog header gains a rev-150 block explaining the long-outstanding gap closure on the source-management cluster.