Decision date: 2026-05-08 UTC Issue: #1364 Status: Active (pre-launch digest posture)
Routine CI and cron-job Slack notifications are consolidated into a single
daily digest (07:00 UTC via ci-digest-cron.yml). Per-event pings are
reserved for production incidents and security findings at CRITICAL/HIGH.
This is a pre-launch posture. At launch — when Raxx has real customers using the platform — routine surfaces flip back to per-event per the flip-back checklist in this document.
Before Raxx reaches real production users, CI/cron notifications generate noise without actionable signal. Most pings are routine successes or no-drift confirmations. The operator confirmed on 2026-05-08 UTC:
"Digest posture is the standing default until Raxx has real customers."
Condensing to a daily digest reduces per-day routine Slack posts from approximately 12+ (baseline) to 1 (digest) + per-incident pings only.
One Slack message at 07:00 UTC daily, via .github/workflows/ci-digest-cron.yml.
Covers the prior 24 h window:
| Section | Source |
|---|---|
| Cron job pass/fail counts | GH Actions API (/runs) per workflow file |
| Flag drift detections | drift_run_results DB rows (if CONSOLE_DATABASE_URL set) |
| Security scan status | nightly-security-scan + security-zap run conclusions |
| PR throughput (merged/open) | GH Actions API |
These surfaces post to Slack immediately regardless of digest posture:
| Surface | Trigger | Why |
|---|---|---|
| Production incidents | H12 / WORKER TIMEOUT / vault degradation tile | Customer impact; cannot wait |
| Security findings | CRITICAL or HIGH severity | Requires immediate triage |
| Nightly security scan — failed | scan job result = failure |
Missed scan = operational gap |
| Nightly security scan — skipped | scan job result = skipped/cancelled |
Missed scan = operational gap |
| ZAP scan — failed | zap-antlers or zap-api result = failure |
HIGH alerts require immediate review |
| ZAP scan — skipped (no target) | resolve-targets.has_target == false on schedule/dispatch |
Schedule miss = operational gap |
| CI (PR) — failure | CI workflow conclusion = failure |
PR gate failure blocks the team |
| CI Digest build failure | build-digest result != success |
Broken digest = blind spot |
| Flag drift detected | mismatch_count > 0 |
Unauthorized flag change on prod |
.github/workflows/slack-notify.ymlCI workflow completion (success + failure).CI workflow conclusion = failure.conclusion == 'failure' guard from the notify
job's if: clause..github/workflows/synthetic-gate.ymlworkflow_dispatch.git show origin/main:.github/workflows/synthetic-gate.yml | grep cron)..github/workflows/nightly-security-scan.ymlnotify-scan-status job — Slack alert on scan result = failure,
skipped, or cancelled. Succeeds are silent..github/workflows/security-zap.ymlnotify-zap-status job — Slack alert when has_target == false
on a scheduled/dispatch run (scan skipped, no target resolved), or when
zap-antlers or zap-api result = failure..github/workflows/ci-digest-cron.yml (new)scripts/ci/build_ci_digest.py.When Raxx has real customers, execute the following to restore per-event posture:
slack-notify.yml — remove conclusion == 'failure' guard from notify
job if: clause. Restore "fires on every CI conclusion" behaviour.synthetic-gate.yml — restore dense market-hours schedule. Replace the
single '0 13 * * 1-5' cron with the full list from git history.ci-digest-cron.yml — decide whether to retire, repurpose as a weekly
summary, or keep daily. Operator decision at launch.flag-drift-check.yml — confirm the Slack gating logic (mismatch_count > 0)
is appropriate for live operations. Consider adding a clean-run notification
channel if regulatory audit needs it.| Source | Estimated daily Slack posts |
|---|---|
| flag-drift-check (every 4 h) | ~6 |
| synthetic-gate (every 30 min market hours) | ~14 weekdays / ~24 weekends |
| slack-notify (every PR CI conclusion) | ~5–15 (varies by PR activity) |
| nightly-security-scan (silent on success, no failure alert) | 0 (missed gap) |
| security-zap (no schedule alert) | 0 (missed gap) |
Total routine Slack posts (pre-#1364, typical weekday): ~25–35
Post-#1364: 1 digest + per-incident pings only.
.github/workflows/ci-digest-cron.yml — digest cronscripts/ci/build_ci_digest.py — digest body builderdocs/agents/onboarding.md — repo structure reference