feat(seidroid-review): post each verdict as a new comment - #73
Conversation
The verdict was upserted in place: find the marker comment, PATCH its body. That kept one comment per pull request, but it also meant a re-review did not move in the thread, notified nobody, and destroyed the previous verdict's text. The result is a verdict that is nearly indistinguishable from no verdict. A review that finished four minutes ago renders at the position of the comment it replaced -- eighteen hours up the page, with only an "edited" marker to say otherwise. Diagnosing a broken reviewer today, that display cost real time: runs completed green, the thread showed nothing new, and the verdict was sitting above every comment we were reading. POST a new comment instead, and leave the earlier ones standing. They are the record of what the review said before the author's fixes, which is what a reader compares against. A long pull request accumulates a few; that is the accepted cost, and it is what the tooling this replaced did. It also removes a hazard: the marker is shared with the unplaced-findings note this job posts, so selecting `.[0]` by marker could overwrite that note rather than the previous verdict. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PR SummaryLow Risk Overview This fixes re-reviews that looked like they never ran: patching in place left the comment at its original position (often far up the thread), sent no notification, and replaced the prior verdict text. Comments in the workflow file document that trade-off and note that keeping history matches the old ai-review behavior. The change also drops marker-based lookup ( Reviewed by Cursor Bugbot for commit 0d59b8f. Bugbot is set up for automated code reviews on this repo. Configure here. |
There was a problem hiding this comment.
The swap from sticky upsert to a plain POST is correct and self-contained — set -e handling, the posted flag, and the unposted-verdict fallback are all preserved, and MARKER is still required elsewhere. The only leftovers are four surviving comments that still describe the verdict comment as upserted, one of which is a rationale that no longer holds.
Findings: 0 blocking | 2 non-blocking | 0 posted inline
Blockers
- None at the file/PR level.
Non-blocking
.github/workflows/seidroid-review.yml:1039— the "State the review's position" step justifies skipping an opinionless review with "a review cannot be edited later the way that comment is upserted, so an opinionless one is permanent clutter." After this PR the verdict comment is not upserted either, so the contrast that rationale rests on is gone: both artifacts are now permanent. The conclusion (don't post an opinionless review) may still be right, but the stated reason no longer is.- Three other comments still say "upsert" for behaviour this PR removed: line 43 ("The posting step never upserts a placeholder when the driver produced no verdict"), line 1127 ("a no-verdict run never upserts a placeholder"), and line 1167 ("the upsert below is rejected" — it is now the POST that would be rejected). Given how much this file leans on its comments as the explanation of record, worth sweeping in the same change.
What
Replaces the sticky upsert with a plain POST. Each review posts a new verdict
comment; earlier ones stay.
Why
Editing a comment in place leaves it at its original position in the
thread and notifies nobody. So a re-review did not move, did not notify, and
silently destroyed the previous verdict's text — three properties that
together make a verdict nearly indistinguishable from no verdict.
This is not theoretical. Diagnosing a broken reviewer today, on sei-load#96
and #90:
23:18:4523:22:4920:5323:18:4623:24:0621:19Both verdicts were written 4–5 minutes after the trigger and rendered
eighteen hours up the page. Runs completed green, the bottom of the thread
showed nothing new, and the conclusion "seidroid is still broken" was wrong —
the review had worked and its output was invisible.
Why earlier verdicts stay
They are the record of what the review said before the author's fixes,
which is what a reader compares against. A long pull request accumulates a
few; that is the accepted cost, and it is the behaviour of the
ai-reviewtooling this replaced.
A hazard this removes
<!-- seidroid-review -->is also the marker on the unplaced-findings noteposted by the preceding job (line 1099). The old lookup took
.[0]— theoldest marker comment — so on a pull request where that note came first,
the verdict would have overwritten the note instead of the previous verdict.
Verification
actionlintreports the same 5 pre-existing findings asmain(lines 326/1001/1177); none from this change. YAML parses; the
postedflagand its unposted-verdict fallback path are untouched.
The consumer pin bump is
sei-load#97.
🤖 Generated with Claude Code