skills(review): stop at the review on PRs this bot authored - #1007
skills(review): stop at the review on PRs this bot authored#1007tend-agent wants to merge 2 commits into
Conversation
tend-agent
left a comment
There was a problem hiding this comment.
One residual instance of the term this PR splits. Step 6's CI-failure branch — the bullet ending apply the fix per step 8 so the PR can go green, since no author will act on the offer — still says On **bot PRs** (Dependabot, renovate, etc.), the undifferentiated heading step 8 just renamed. That's the path where the push decision actually gets made on a red PR, and a session reading it on a self-authored PR gets the pre-split answer: this is a bot PR, so apply the fix. Following its pointer to step 8 now lands on the new paragraph and self-corrects, but the PR's own premise is that the ambiguous phrasing produced opposite reads on the same PR ninety seconds apart — one instance left in place keeps that open. Matching the rename (On **third-party bot PRs** (Dependabot, renovate, etc.)) closes it, and the self-authored case is already covered by the same pointer.
The rest checks out against the workflow: the verify job's pull_request_review branch is exactly PR_AUTHOR = BOT_NAME plus a non-empty body or a fresh inline comment, with no decision point; the review-dispatch prompt does tell that session to action a review it authored ("your reviewer role speaking, not a self-loop, so action it"); and a self-pushed commit does get stamped by its own session per step 9. No other file in the repo carries the renamed heading.
I'm stopping at the review rather than pushing the one-word fix — under the rule this PR adds, the mention run this review dispatches boots as the author and can apply it.
|
Applied in I added one clause beyond the rename. With only the rename, a session on a red self-authored PR matches neither named case in that bullet — Scope check and verificationOther instances.
Verification. |
Review step 8's Bot PRs paragraph is written for Dependabot and renovate — "there is no human author to act on feedback" — but it also reads as covering PRs this bot authored, where a successor does exist: submitting a review with a body or a fresh inline comment dispatches
tend-mention, which boots as the author and is explicitly told to action that review. The successor boots either way, so a reviewer that also pushes the fix just makes it boot to discover the work is done, and its own commit ends up carrying thetend-review/<n>examined-stamp written by the session that authored it. This splits the paragraph in two so the third-party case keeps its "if you can articulate the fix, apply it" rule and the self-authored case stops at the review; verified against the generatedtend-mentionworkflow, whoseverifyjob boots on exactly that condition.Evidence, mechanism, and gate assessment
What was observed
Both rounds of review on #1005 ran this morning, and the two sessions read step 8 in opposite directions on the same PR:
tend-mentiondispatches onpull_request_reviewfor bot-authored PRs, so a successor session owns applying them." The dispatched mention run 32107876748 applied all three findings as0b7c9d3, replied to both inline threads, and polled CI green.afb6e7c, 06:50:17), reasoning "this is a bot-authored PR with no human waiting on it". The mention run its own review dispatched, 32108568636, booted at 06:49:13, read the state, found the work landed, and exited silently — $0.69 and 12 turns for nothing.Same PR, same skill text, ninety seconds apart, opposite reads. That is the signature of an instruction that admits two answers, not of one session getting it wrong.
The dispatch is deterministic, not incidental
tend-mention'sverifyjob boots a session on precisely the shape a reviewer creates on a bot PR (.github/workflows/tend-mention.yaml):and the prompt it hands that session says to action the review "including when you authored the review: a review your review workflow left on your own PR is your reviewer role speaking, not a self-loop". So the author seat is already occupied by the time the reviewer decides whether to push.
running-in-cialready documents this mechanism, but only from the author's seat — "A review that lands while you poll is not yours to action". The reviewer's half was never written down, which is why step 8's Dependabot rule filled the gap.The second cost: a self-written commit carries its own examined-stamp
Round 2's session stamped
0b7c9d3at 06:50:26, pushedafb6e7cat 06:50:17, then stampedafb6e7cat 06:52:08. The queued review run 32108653260 evaluated its gate at 06:52:33 and skipped on that stamp, soafb6e7c— the head #1005 currently sits on — was never examined by a session other than the one that wrote it. Round 1's path produced the opposite:0b7c9d3was written by the mention session and then genuinely reviewed by round 2, which found a further real defect in it.Gates
#993(2026-08-15, folded by the sibling, no loss),#999(2026-08-17, $1.85 duplicated edit/test cycle),#1005round 2 (this window, $0.69). Structural because the dispatch condition above has no decision point. Recorded in #801 across the 2026-08-17 and 2026-08-18 entries, where the 2026-08-17 assessment pre-registered this exact subtraction and named the open-PR budget as the only thing holding it.Verification
uvx pre-commit run --files plugins/tend-ci-runner/skills/review/SKILL.md— all applicable hooks pass (typos, trailing whitespace, the plugin-skill bang-backtick guard, install-tend reference sync). No other file inplugins/or.claude/references the renamed Bot PRs heading.