Context (ORB round-2 adversarial audit)
All 7 close-enforcement guards in src/queue/review-evasion.ts (draft-dodge :307-320, reopen-reclose :504-510, self-close :733-743, review-evasion-draft :893-903, draft-cycle :1062-1072, draft-pr-close-policy :1219-1229, synchronize-close-policy :1350-1360) post the contributor's ONLY explanation via `createIssueComment(...).catch(() => undefined)`. These closes are independent of the gate-check comment — a secondary-rate-limit/5xx on the comment leaves a permanently closed one-shot PR with zero visible reason, and no reconciliation sweep backfills it.
Fix
Either bounded retry of the explanation comment (RetryableJobError), or extend the reconcile sweep to detect "closed by loopover, no marker comment present" and backfill. Prefer the sweep (covers all 7 sites at once + heals historical cases). Tests for the backfill detection both ways.
99%+ patch coverage, branch-counted.
Context (ORB round-2 adversarial audit)
All 7 close-enforcement guards in src/queue/review-evasion.ts (draft-dodge :307-320, reopen-reclose :504-510, self-close :733-743, review-evasion-draft :893-903, draft-cycle :1062-1072, draft-pr-close-policy :1219-1229, synchronize-close-policy :1350-1360) post the contributor's ONLY explanation via `createIssueComment(...).catch(() => undefined)`. These closes are independent of the gate-check comment — a secondary-rate-limit/5xx on the comment leaves a permanently closed one-shot PR with zero visible reason, and no reconciliation sweep backfills it.
Fix
Either bounded retry of the explanation comment (RetryableJobError), or extend the reconcile sweep to detect "closed by loopover, no marker comment present" and backfill. Prefer the sweep (covers all 7 sites at once + heals historical cases). Tests for the backfill detection both ways.
99%+ patch coverage, branch-counted.