The incremental failure-rate gate was counting every core read failure against the changed set. A repository already known to fail (Cloudflare 403, host timeouts) is re-read every time it changes, fails again, and is counted as a new problem even though its previous records are kept.
The gate now:
- excludes repositories already marked for a publication/document retry
- uses the remaining event repositories as the denominator
- still applies the configured 10% rate, but allows at least 20 new core failures so a small sample cannot refuse an otherwise complete run
npx vitest run scripts/panoptiblog passes 176 tests and prek passes.