failclosed v0.2.0 — gate-hardening
Two latent fail-open paths closed — a merge could report MERGE_READY while a
real, unresolved review signal was still open, the exact failure class failclosed
exists to prevent — plus reviewer-format currency and idempotent thread resolution.
Fixed
- Codex reviewer threads are no longer dropped. The GitHub Codex reviewer
(chatgpt-codex-connector) is now recognized, so its unresolved threads are
counted before the gate decides. Previously the gate could clear with an open
Codex P1 thread. - The receipt classifier is fail-closed by construction. A pathless review
thread auto-resolves only when, after carving out the receipt phrase, no content
remains — Unicode-aware and NFKC-normalized. A real finding that merely opens
with "No findings…", in any language or disguised with homoglyphs, keeps the
thread open. (A denylist of weak words / continuation markers is unbounded-
bypassable; this inverts to a pure-receipt check.)
Added
- Parser currency for codex CLI ≥0.13x native review (
[P0–P3]markers +
trailing em-dashpath:start-end). - Idempotent reply/resolve — re-checks live thread state and skips a duplicate
reply on a partial-failure retry; best-effort probes never suppress the resolve.
Full notes in CHANGELOG.md. 59 tests; ruff + leak gate clean.