Reviews that expire unread

Branch feat/coderabbit-harvest-stage, 2026-09-03. On Yonatan-HQ/platform, last 80 PRs measured 2026-09-02: CodeRabbit posted 65 threads on 24 PRs. 3 resolved, 4 outdated, and 23 of the 24 PRs merged with every thread still open. A hand-verified batch on 08-24 was 6 real out of 9, so the reviews were worth reading and nobody read them. The new create-pr phase makes reading them a gate.

1. The measured baseline

MeasureValueWhat it means
PRs sampled80Yonatan-HQ/platform, newest first
PRs CodeRabbit reviewed24the rest had no threads
threads posted65one GraphQL read per PR sees them all
threads resolved34 more went outdated on later pushes
reviewed PRs merged with open threads23 of 24no SDLC step read the review before merge
hand-verified findings that were real6 of 908-24 batch; refuting is cheaper than ignoring

2. Walk a sample PR through the contract

Five threads as the harvest script prints them. For each, the refuter returns refuted: true or false. Survivors get a fix commit and a reply naming the sha; refuted ones get a one-line dismissal. Every thread is resolved either way. The phase ends only when the unresolved count is zero.

unresolved5
merge blocked
path:lineseveritytitlerefuter verdictreply postedstate
bash "$H" "$PR" --unresolved | jq length 5

3. The severity and title parser

The script reads CodeRabbit's body format: the first line carries _category_ | _emoji Severity_ | _effort_, and the first bold line is the title. Paste any thread body and see what the jq filter extracts. Unknown severities do not fail the read; they print unknown and still count as unresolved.

4. Where the phase sits

checks green โ†’ harvest (1 GraphQL read, coderabbitai only) โ†’ refuter per thread, isolated Agent, never edits โ†’ survived: fix, commit, push, reply "Fixed in <sha>" โ†’ refuted: reply "Dismissed: <reason>" โ†’ --resolve every thread โ†’ --unresolved must print [] โ†’ gh pr merge / --auto

Termination. A fix push can trigger new threads. Those get exactly one more pass; anything left is replied Deferred to #<issue> with a filed issue and resolved, so the phase cannot loop. Skipped when the repo has no .coderabbit.yaml or the PR is still a draft. Read mode was exercised against a real PR with four threads; no real thread was replied to or resolved.