You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(citation-audit): retry 429 + exit-2 soft-fail on transient outages
The §10 citation-audit Gate 3 failed PR #9 with "0 mismatch / 316
unresolved": arXiv's export API rate-limited the shared GitHub runner
IP (HTTP 429), dropping all 84 arXiv ids in a single batch. No citation
was actually wrong — the gate conflated "couldn't reach arXiv" with
"fabricated citation".
- _http_get: bounded retry (3x) with Retry-After-aware exponential
back-off on 429/5xx. 404 still propagates immediately (a genuine
"DOI not found", not a throttle).
- verify_arxiv / verify_nber / verify_crossref: record ids that failed
due to transient upstream errors, distinct from ids genuinely absent
from a successful response. A Crossref 404 stays genuine (not
transient) and falls through to the DataCite fallback as before.
- main(): exit 2 (soft failure) when --strict and the ONLY unresolved
ids were transient; exit 1 still fires on any mismatch or genuine
unresolved. This wires up the exit-code contract the test suite
already documented.
- citation-audit.yml Gate 3: treat exit 2 as a ::warning:: and pass —
a throttled runner IP must not block a merge. exit 1 still blocks.
- 13 new tests pin the retry, transient-tracking, and exit-code contract.
§10 zero-hallucination integrity is preserved: a fabricated or typo'd
id, when the source is reachable, still returns exit 1 and blocks the
merge. No new references introduced.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
echo "::warning title=Citation audit soft failure::Auditor could not reach arXiv/Crossref (rate limit / network); no mismatch detected — treating as a soft pass (exit 2)."
0 commit comments