Makes a missing credential a labelled degraded leg instead of a blackout of the whole digest.
Problem
scripts/daily-infra-report.py raised SystemExit at import when ZULIP_API_KEY was absent (lines 25-27)
and sys.exit(1) at the mail leg without EMAIL_PASSWORD (lines 674-676), so the captain's 10:30 UTC
daily digest produced no artifact at all on 2026-09-20 and 2026-09-21 — even though email is the
captain-decided destination.
Change (single file, +17/-5)
Missing ZULIP_API_KEY → ZULIP_AUTH = None plus a printed credential-missing: ZULIP_API_KEY line,
instead of SystemExit.
Missing EMAIL_PASSWORD → printed credential-missing: EMAIL_PASSWORD line and a labelled degraded
return, instead of sys.exit(1).
End-of-run summary now prints Degraded legs (n) with each leg named, or All legs fully credentialed.
for s in (storages or []) in the PVE storage section: pre-existing crash on a None PVE response.
No credential was placed, moved or substituted. The digest must never silently use a key it has not
verified as abiba-bot, and this change does not add such a fallback.
Related: zulip-health-credential-placeholder-20260913 (credential placement held for the captain),
daily-health-digest-delivery-20260920.
cc @abiba
Makes a missing credential a **labelled degraded leg** instead of a blackout of the whole digest.
## Problem
`scripts/daily-infra-report.py` raised `SystemExit` at import when `ZULIP_API_KEY` was absent (lines 25-27)
and `sys.exit(1)` at the mail leg without `EMAIL_PASSWORD` (lines 674-676), so the captain's 10:30 UTC
daily digest produced **no artifact at all** on 2026-09-20 and 2026-09-21 — even though email is the
captain-decided destination.
## Change (single file, +17/-5)
- Missing `ZULIP_API_KEY` → `ZULIP_AUTH = None` plus a printed `credential-missing: ZULIP_API_KEY` line,
instead of `SystemExit`.
- Missing `EMAIL_PASSWORD` → printed `credential-missing: EMAIL_PASSWORD` line and a labelled degraded
return, instead of `sys.exit(1)`.
- End-of-run summary now prints `Degraded legs (n)` with each leg named, or `All legs fully credentialed`.
- `for s in (storages or [])` in the PVE storage section: pre-existing crash on a `None` PVE response.
No credential was placed, moved or substituted. The digest must never silently use a key it has not
verified as `abiba-bot`, and this change does not add such a fallback.
Related: zulip-health-credential-placeholder-20260913 (credential placement held for the captain),
daily-health-digest-delivery-20260920.
cc @abiba
- ZULIP_API_KEY: no longer SystemExit, now reports 'credential-missing: ZULIP_API_KEY'
- EMAIL_PASSWORD: no longer sys.exit(1), now appends to DEGRADED_LEGS and returns success
- PVE API: fixed None check in storage section
- Summary: reports degraded legs before summary
This allows the digest to be produced and emailed even when credentials are missing,
while still explicitly logging which legs are degraded.
Test: empty env produces JSON report + degraded leg labels, no SystemExit.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Makes a missing credential a labelled degraded leg instead of a blackout of the whole digest.
Problem
scripts/daily-infra-report.pyraisedSystemExitat import whenZULIP_API_KEYwas absent (lines 25-27)and
sys.exit(1)at the mail leg withoutEMAIL_PASSWORD(lines 674-676), so the captain's 10:30 UTCdaily digest produced no artifact at all on 2026-09-20 and 2026-09-21 — even though email is the
captain-decided destination.
Change (single file, +17/-5)
ZULIP_API_KEY→ZULIP_AUTH = Noneplus a printedcredential-missing: ZULIP_API_KEYline,instead of
SystemExit.EMAIL_PASSWORD→ printedcredential-missing: EMAIL_PASSWORDline and a labelled degradedreturn, instead of
sys.exit(1).Degraded legs (n)with each leg named, orAll legs fully credentialed.for s in (storages or [])in the PVE storage section: pre-existing crash on aNonePVE response.No credential was placed, moved or substituted. The digest must never silently use a key it has not
verified as
abiba-bot, and this change does not add such a fallback.Related: zulip-health-credential-placeholder-20260913 (credential placement held for the captain),
daily-health-digest-delivery-20260920.
cc @abiba