- Per-source poll-cadence override — closes the named rev-140 next-sprint candidateRev 140 shipped per-workspace cadence control via `workspace.loopIntervalMinutes`; rev 141 closes the per-source axis. New `source.pollIntervalMinutes` integer column (nullable — null = follow the workspace cadence as before) + `setSourcePollInterval()` helper + extended PATCH `/api/sources/{id}` Zod schema accepting a third mutually-exclusive payload `{ pollIntervalMinutes: int 1-1440 | null }` alongside the rev-6 status flip + rev-95 rename. Operators with mixed source mixes (a daily-published RSS feed alongside a high-cadence LinkedIn bridge) had no per-source primitive — they had to either drag the entire workspace down to the slowest feed's sensible cadence or let the noisy feed flood the queue at the workspace cadence. Rev 141 closes that gap.
- RSS poller honours per-source `lastSyncedAt + pollIntervalMinutes``pollRssSourcesForWorkspace()` extended to skip any source whose `lastSyncedAt + pollIntervalMinutes` is still in the future at run time. A daily-published RSS feed configured for 1440-minute cadence is therefore skipped on every workspace pulse cycle except the one that crosses the 24-hour boundary since its last successful poll. Pure additive on top of the rev-5 RSS poll loop, the rev-6 pause/resume, the rev-26 keyword filter, and the rev-59/62 cost-spike auto-pause — stacks on every existing source-side primitive at the cadence axis. New `skippedForCadence` field on the poller's return shape so the rev-1 pulse engine sees a clean separation between cost-spike skips (rev 59) and cadence skips (rev 141).
- v1 mirror in lockstep — closes the v1 parity gap on the rev-141 dashboard primitivePATCH `/api/v1/sources/{id}` accepts the same third payload via the same Zod union schema, delegates to the same `setSourcePollInterval()` helper. GET `/api/v1/sources` projection extended with `pollIntervalMinutes` so MCP hosts driving the desk programmatically can read each feed's per-source cadence without a follow-up call. The cadence pattern from rev 37 onwards (every dashboard mutation has a v1 equivalent within one rev) holds unbroken into rev 141. The MCP server's per-source-mutation tooling has nothing left to design across status / label / cadence (rev 6 / rev 95 / rev 141).
- OpenAPI 3.1 typed coverage on the new payload + cumulative dashboard polishOpenAPI spec types the new `pollIntervalMinutes` payload on the PATCH endpoint with full description (1-1440 minutes; null clears the override and reverts to the workspace cadence). The cadence pattern of typing every v1 enhancement in the same cycle holds (63rd unbroken rev). New `SourcePollInterval` client component mounts on every RSS-style source row beside the rev-95 rename + rev-6 pause/resume + rev-26 keyword filter — a one-tap chip → popover with five presets (15m / 30m / 1h / 4h / 1d) plus a 'Follow workspace' reset that clears the override. Active override surfaces inline as a brand-color 'Cadence · Nm' chip with a tooltip explaining it overrides the workspace cadence. Presets below the workspace cadence render with a dashed border + amber ↑ mark matching the rev-140 plan-floor visual treatment so the workspace cadence reads as a soft floor.