- `source.chronic_warning` Slack push + outbound event โ closes the per-source chronic-warning push parity gapCloses the named rev-73 next-sprint candidate. Until rev 74 the rev-61 source persistent-spike banner was *in-app only* โ per-tag (rev 70) and per-assignee (rev 64) chronic warnings had Slack pushes + outbound events but per-source did not, so operators using the rev-61 nudge-only flow (vs the rev-62 auto-pause flow) had no push channel telling them a feed had crossed the chronic threshold. Rev 74 closes that gap. New `buildSourceChronicWarningSlackPayload()` Slack block + `dispatchSourceChronicWarningWebhook()` outbound dispatch fire from the daily sweep when one or more sources have crossed the chronic threshold (3+ consecutive days running) AND haven't been chronic-acked. Rate-limited to once per workspace per 24h via the new `source_chronic_warning` activity-log kind so the chronic axis doesn't drown out the rev-58 daily โก alarm. Distinct from the rev-62 `source.chronic_auto_paused` event (which fires only when the operator opted into auto-pause); rev 74 fires for every chronic state regardless of action configuration. Mirrors `tag.chronic_warning` (rev 70) + `assignee.chronic_warning` (rev 64) at the per-source axis. **Strategic significance**: closes the chronic-warning push parity gap so all three axes where chronic makes sense (per-tag, per-source, per-assignee) now have a complete in-app banner + Slack push + outbound event trio.
- `source.chronic_resumed` outbound event โ closes the rev-62 closure-receipt loop on auto-pauseCloses the named rev-73 next-sprint candidate. Until rev 74, downstream integrations watching the rev-62 `source.chronic_auto_paused` event saw 'alarm fired' but never 'alarm resolved' โ when the operator resumed an auto-paused source after triage, the closure had to be inferred or polled. Rev 74 closes the loop. New `dispatchSourceChronicResumedWebhook()` fires from `setSourceStatus()` and `bulkUpdateSources()` whenever a source whose `lastErrorMessage` starts with 'Auto-paused after' (the rev-62 sweep marker) is resumed back to `connected`. Payload carries the source identity, the operator who resumed it, and the consecutive-spike-days count at the time of auto-pause for downstream context. Also clears the stale auto-pause `lastErrorMessage` + resets `consecutiveSpikeDays` to 0 on resume so the dashboard doesn't keep showing the auto-pause reason after triage. Mirrors the rev-37 `task.unblocked` closure pattern at the chronic auto-pause axis. **Strategic significance**: external integrations (CRM, FinOps tool, project tracker grouped by initiative) can now reconcile alarm-open with alarm-resolved on the per-source chronic axis without polling the dashboard โ same primitive that landed in rev 37 for the dependency-blocked โ unblocked transition, now applied to the rev-62 auto-pause โ resume transition.
- Outbound subscription picker + activity log glyphs extended for the two new event kindsThe rev-73 grouped picker now exposes `source.chronic_warning` and `source.chronic_resumed` in the Chronic warnings group alongside the rev-62 `source.chronic_auto_paused` so operators can subscribe to the full per-source chronic lifecycle (warning โ auto-pause โ resume) from one URL. Activity log surfaces a `โณ` glyph + 'Source chronic warning' label on every `source_chronic_warning` row, matching the rev-35 per-kind tinting vocabulary used by `tag_chronic_warning` and `assignee_chronic_warning`. **Strategic significance**: closes the dashboard-surface parity gap on the per-source chronic axis โ every channel an operator might be on (in-app banner, Slack push, outbound webhook, activity log, outbound picker) now reads with one consistent vocabulary.
- Chronic-auto-paused source row visual treatment + `(was chronic-auto-paused)` resume affordanceEvery paused source whose `lastErrorMessage` starts with 'Auto-paused after' now wears a soft amber left-border + `โณ auto-paused (chronic)` pill in the sources panel โ distinct from operator-paused sources (default neutral) and feed-error sources (red `โ error`). The pill carries an info tooltip explaining why the desk paused the source. Resume from the source-actions row continues to fire the rev-74 closure receipt and clear the stale message. Cumulative micro-polish โ every rev 22+ has carried at least one โ but rev 74's polish is load-bearing because chronic-auto-paused sources need a different triage decision (apply a keyword filter / remove / accept the cost) than operator-paused or feed-error sources. **Strategic significance**: the operator scanning the sources panel can now distinguish the three pause states (operator, error, chronic-auto-paused) without reading every detail line.