Migrated from the pre-public development archive (issue #129 there); archive PR/issue numbers in the body refer to that archive.
Pre-flip audit (failure-mode UX lens), MEDIUM, not launch-gating.
The gh circuit breaker trips on rate_limit/5xx but not plain 403 (collect_runs.py ~1239/1268; partial kind at ~1627-1628). If a token expires mid-run after the run lists succeed, the late per-run job fetches pile up 403 errors with gave_up=False and no sample_gaps, so the report renders the mild sample_thinned framing instead of a loud collection-failure banner.
Honest (the error count is disclosed and verify-enforced; the 20-PR sample_complete floor still trips a short-sample disclosure) but soft for "your token died". Consider escalating to the loud banner past a threshold of consecutive/late 403s, or classifying auth-shaped 403 bodies as a breaker-tripping kind.
Pre-flip audit (failure-mode UX lens), MEDIUM, not launch-gating.
The gh circuit breaker trips on rate_limit/5xx but not plain 403 (collect_runs.py ~1239/1268; partial kind at ~1627-1628). If a token expires mid-run after the run lists succeed, the late per-run job fetches pile up 403 errors with gave_up=False and no sample_gaps, so the report renders the mild
sample_thinnedframing instead of a loud collection-failure banner.Honest (the error count is disclosed and verify-enforced; the 20-PR sample_complete floor still trips a short-sample disclosure) but soft for "your token died". Consider escalating to the loud banner past a threshold of consecutive/late 403s, or classifying auth-shaped 403 bodies as a breaker-tripping kind.