Skip to content

Move CodeRabbit to opportunistic; disambiguate the CLAUDE.md rows - #19

Merged
dsnger merged 2 commits into
mainfrom
bots-coderabbit-opportunistic
Jul 27, 2026
Merged

Move CodeRabbit to opportunistic; disambiguate the CLAUDE.md rows#19
dsnger merged 2 commits into
mainfrom
bots-coderabbit-opportunistic

Conversation

@dsnger

@dsnger dsnger commented Jul 27, 2026

Copy link
Copy Markdown
Owner

Docs-only. Two files, no plugin path touched, so no version bump.

1. CodeRabbit leaves Wait for

The grounds are the observed history, kept in the file:

PR Head reviewed?
#12, #13 no — merged unreviewed, found afterwards
#15 no at first; count reached 1 after ~3 min
#16 no on one head, yes two heads later
#17 no — zero CodeRabbit review records on the PR for any head
#18 yes — 3 findings on the live head, count 1

Five consecutive unreviewed heads and then a genuine review is the whole argument. Blocking on CodeRabbit always terminated — its check goes green regardless — so the failure was never a hang; it was that the signal predicted nothing about delivery. A real findings source with unpredictable delivery and no completion signal you can block on is this file's own definition of the opportunistic category. Wait for is now empty; Greptile set the precedent.

Also added to its row, both first observed on #17:

  • the status check goes green whether or not a review happened (already documented, now stated in the row itself);
  • @coderabbitai review is a no-op while automatic reviews are active — CodeRabbit's own words, "This command is applicable only when automatic reviews are paused". This retroactively explains Ship the §5 companion files, the deferred template sync, and 0.6.0 #14's "the re-trigger produced nothing", which the file had recorded as an unexplained observation.

Plan note corrected: Free per Daniel. "Pro Plus" was observed on PR #1 only and no longer describes the account — which matters, because the review-limit behaviour is what a Free plan produces.

The per-head count rule is untouched. What changed is a statement of its scope: it is a merge-time check, and the blocking half of the completion-signal distinction now binds no bot. It still tells you whether a head was reviewed; it is no longer paired with a bot you wait on.

Sentences the move falsified, corrected in place — the §5 standing lens applied to a docs change:

  • "the check is a signal you block on" (in the Ship the §5 companion files, the deferred template sync, and 0.6.0 #14 write-up) — reframed, with a note that it was written while CodeRabbit was waitable;
  • "Do the CodeRabbit-gated pass, and read whatever Greptile has posted at that moment" — there is no gated pass now;
  • "The opportunistic category exists because Greptile forced it" — still true, and now records that CodeRabbit widened it: Greptile has no signal, CodeRabbit has one that always fires and means nothing. The category is about whether a signal predicts delivery, not whether one exists.

One judgement call worth naming: the instruction "if no qualifying record exists, re-trigger once" sits inside the count rule I was told to leave alone, but I had just documented that the re-trigger is a no-op. Leaving it bare would have made the file contradict itself. I qualified it in place rather than removing it — the attempt is cheap and has not been observed to hurt — and flag it here as the one edit adjacent to the preserved rule.

Empty Wait for — checked, no plugin change needed

process-pr-review.md Step 2 reads "Block only on the bots under Wait for", which is vacuous when the list is empty, then proceeds to "Then, without blocking, read whatever each Process opportunistically bot has posted at that moment." The timing anchor degrades from "when the gate clears" to "when the pass begins", which Step 1 (the CI check) already establishes. Nothing in the command requires the list to be non-empty. Verified by reading Steps 0–2 and grepping the plugin for other Wait-for assumptions — so this stays docs-only.

2 & 3. MANIFEST.md — three files, one bare name

The row read | CLAUDE.md | discipline rules §1–5 | /workflow-init template (project file) |. Every row in that table names a path under source-files/, but read alone the bare name resolves to the repo root — which is exactly how CodeRabbit reached a false Major on #18, calling the root file "a reusable template" that must not hardcode a user's name.

Row qualified to source-files/CLAUDE.md, plus prose distinguishing all three: the frozen seed, the inline scaffold in workflow-init.md (invariant 8 — the only copy a user's project ever receives, scoped §1–§5), and the root file as this repo's own instance.

And the durable guard the #18 review asked for: root §6 (context canary) sits outside the §1–§5 template range by design and must never be synced into the scaffolded template. The section number is the mechanism — a sync copying §1–§5 leaves it behind by construction — and this sentence is the record of why, since nothing enforces the range. Placed in prose rather than in product files, per the request.

Gate B

N/A — every staged path is explanatory documentation (docs/pr-review-bots.md, MANIFEST.md) per §5's prose rule. Battery green before commit: shellcheck (6 files), hook tests, invariant tests + check (123 assertions), version-bump tests + check (36 assertions), claude plugin validate . --strict.

Summary by CodeRabbit

  • Documentation
    • Updated repository guidance to clarify the roles of the three CLAUDE.md files and protect local context from being included in generated templates.
    • Revised pull request review guidance to treat automated review tools as opportunistic rather than blocking.
    • Clarified merge-readiness checks, review-record counting, pagination, filtering, and interpretation of completion signals.

docs/pr-review-bots.md — CodeRabbit leaves Wait for. Five consecutive heads
went unreviewed (#12, #13, #15, #16, #17 — the last with zero review records
on the PR at all), then #18 came back genuinely reviewed with three findings.
That is a real findings source with unpredictable delivery and no completion
signal you can block on, which is this file's own definition of the
opportunistic category. Wait for is now empty; Greptile set the precedent.

Two quirks added to its row: the status check goes green whether or not a
review happened, and `@coderabbitai review` is a no-op while automatic
reviews are active — CodeRabbit's own message on #17, which retroactively
explains why #14's re-trigger produced nothing. Plan corrected to Free per
Daniel; "Pro Plus" was observed on PR #1 only.

The per-head count rule is unchanged. Its scope is now stated: it is a
merge-time check, and the blocking half of the completion-signal distinction
binds no bot, because nothing sits under Wait for. Sentences the move
falsified are corrected in place (the "check you block on" framing, the
"CodeRabbit-gated pass" anchor, the category rationale).

process-pr-review needs no change for an empty Wait for list: Step 2 reads
"block only on the bots under Wait for", vacuous when empty, then proceeds to
the opportunistic reads, whose timing anchor is the start of the pass that
Step 1 already establishes. Verified, not assumed — no plugin path touched,
so no version bump.

MANIFEST.md — the bare `CLAUDE.md` row named a path under source-files/ but
read alone resolves to the repo root, which is how CodeRabbit reached a false
Major on #18 calling the root file a reusable template. Row qualified, and the
three distinct files distinguished: the frozen seed, the inline scaffold in
workflow-init.md (invariant 8, §1–§5), and the root file as this repo's own
instance. Records that root §6 (context canary) sits outside the template
range by design and must never be synced into it — the durable guard the #18
review asked for, in prose rather than in product files.

Gate B: N/A — every staged path is explanatory documentation
(docs/pr-review-bots.md, MANIFEST.md) per §5's prose rule.
Battery green: shellcheck (6 files), hook tests, invariant tests + check
(123 assertions), version-bump tests + check (36 assertions),
`claude plugin validate . --strict`.
@cursor

cursor Bot commented Jul 27, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The PR clarifies which CLAUDE.md file seeds the workflow template and documents excluded repository-local context. It also revises PR review-bot routing so CodeRabbit and Greptile are opportunistic, with per-head review records used for merge gating.

Changes

Template manifest clarification

Layer / File(s) Summary
CLAUDE.md artifact mapping
MANIFEST.md
Identifies source-files/CLAUDE.md as the workflow-init seed and distinguishes it from the inline scaffold and repository-root rules, including the excluded context canary.

PR review-bot routing

Layer / File(s) Summary
Completion and routing rules
docs/pr-review-bots.md
Documents empty “Wait for” routing, opportunistic CodeRabbit and Greptile handling, per-head review-record verification, pagination and filtering requirements, and updated processing instructions.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

Poem

A bunny reads the rules anew,
Three CLAUDEs marked for what they do.
Bots may hop, but checks don’t prove,
Count the reviews before you move.
With canaries safely left behind,
Clearer paths are now designed.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title captures the two main docs changes: CodeRabbit routing and CLAUDE.md disambiguation.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Jul 27, 2026

Copy link
Copy Markdown

Greptile Summary

Updates review-bot documentation to route CodeRabbit opportunistically and clarifies the distinct roles and synchronization boundaries of the three CLAUDE.md artifacts.

Confidence Score: 5/5

The documentation-only PR appears safe to merge.

The revised routing remains compatible with the command’s empty Wait-for behavior, preserves the separate merge-time per-head verification, and accurately distinguishes the CLAUDE.md artifacts.

Important Files Changed

Filename Overview
MANIFEST.md Disambiguates the source seed, inline project scaffold, and repository-local CLAUDE.md while documenting why root §6 must remain outside the scaffold.
docs/pr-review-bots.md Moves CodeRabbit from blocking to opportunistic processing and updates the supporting history, completion-signal guidance, and merge-time verification scope consistently.

Reviews (1): Last reviewed commit: "Move CodeRabbit to opportunistic; disamb..." | Re-trigger Greptile

The count rule carried two facts fused into one sentence. They separate:

1. The per-head count is the arbiter of whether a head was reviewed —
   unchanged, and the diagnostic for any bot. Routing a bot opportunistically
   does not make its review record less readable or the answer less true.
2. "Merge only on an explicit recorded human decision" binds only bots under
   Wait for. An absent review from an opportunistic bot blocks nothing and
   needs no exception: every head reaching a PR has already passed Gate B,
   the workflow's actual cross-model review, and the PR bots are a
   supplementary third instance. Requiring a recorded exception whenever a
   supplementary reviewer stayed quiet would reimpose as ceremony the
   blocking that opportunistic routing removed.

The clause is dormant, not retired — Wait for is empty, so nothing triggers
it; promote a bot back and it reactivates unchanged for that bot. The #12#18
history and the #14 precedent stay as the record of when it was live: a real
requirement under the routing of its time.

Four sentences elsewhere attached a merge consequence to a `0` and are
corrected to state the routing dependency: the scope paragraph above the
completion-signal list, the "decides whether you may merge" bullet, "`0`
means do not merge", and the "run it on every merge" lead-in to the query.

Gate B: N/A — the only staged path is explanatory documentation
(docs/pr-review-bots.md) per §5's prose rule.
Battery green: shellcheck (6 files), hook tests, invariant tests + check
(123 assertions), version-bump tests + check (36 assertions),
`claude plugin validate . --strict`.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/pr-review-bots.md`:
- Around line 129-134: Remove the `@coderabbitai review` re-trigger instruction
from the deterministic merge-verification procedure, including its associated
wait and expectation text. Keep the pagination, slurping, and `DISMISSED`
filtering guidance intact; only retain the retry as explicitly optional
historical diagnostics if needed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 553a0bc2-8586-4699-874a-29e1ddaad111

📥 Commits

Reviewing files that changed from the base of the PR and between 4ce6148 and 2634bf2.

📒 Files selected for processing (2)
  • MANIFEST.md
  • docs/pr-review-bots.md

Comment thread docs/pr-review-bots.md
Comment on lines 129 to +134
`--paginate` matters: without it only page one is read, so a qualifying review can sit on
page two and be read as absent. `jq -s` is what slurps the pages — `gh api --slurp` cannot
do it here, being rejected outright when combined with `--jq`. `DISMISSED` is excluded — a dismissed review is not
a review of that head. If no qualifying record exists, re-trigger once; if it is still
absent, **merge only on an explicit human decision**, recording that the head went
unreviewed.
a review of that head. If no qualifying record exists, re-trigger once (expect nothing —
`@coderabbitai review` is a no-op while automatic reviews are active, so the attempt
costs a wait and is kept only because it is cheap and has not been observed to hurt).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Remove the ineffective re-trigger from merge verification.

The document says @coderabbitai review is a no-op while automatic reviews are active, but still instructs operators to retry it. That action cannot change the count and only adds delay; remove it from the deterministic verification path or label it as an optional historical diagnostic.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/pr-review-bots.md` around lines 129 - 134, Remove the `@coderabbitai
review` re-trigger instruction from the deterministic merge-verification
procedure, including its associated wait and expectation text. Keep the
pagination, slurping, and `DISMISSED` filtering guidance intact; only retain the
retry as explicitly optional historical diagnostics if needed.

@dsnger

dsnger commented Jul 27, 2026

Copy link
Copy Markdown
Owner Author

Per-head count, run as a diagnostic before merge — per the rule this PR writes.

head  = 2634bf219e196ba96e5a2e659a2d83538579505e
count = 1

Reviewed. One COMMENTED record on the live head, one inline comment. Recording it either way, as agreed: a 0 here would have blocked nothing, because Wait for is empty and an absent review from an opportunistic bot needs no exception — which is precisely the clause this PR scopes. The count is run as the diagnostic it now is, not as a gate.

CI: quality SUCCESS, mergeStateStatus CLEAN.

The one finding — 🟡 Minor, "Remove the ineffective re-trigger from merge verification."

CodeRabbit's point: the file says @coderabbitai review is a no-op while automatic reviews are active, then still instructs operators to run it; it cannot change the count and only adds delay. Either drop it from the deterministic path or mark it explicitly optional.

Valid, and independently arrived at — this is the same seam flagged to Daniel when the qualification was written, where the choice was between removing the step and qualifying it in place. The current text does qualify it heavily ("expect nothing… kept only because it is cheap and has not been observed to hurt"), but the imperative "re-trigger once" still sits inside the procedure, which is what CodeRabbit is objecting to. It is a wording call, not a defect in what the procedure computes.

Disposition: collected, not actioned. §5's mechanics are explicit — Blocker/Major must resolve, "Minor · Nit → collect, never iterate" — so it does not gate this merge. Worth a follow-up that decides the step's status outright rather than describing it twice.

@dsnger
dsnger merged commit 286c55f into main Jul 27, 2026
2 checks passed
@dsnger
dsnger deleted the bots-coderabbit-opportunistic branch July 27, 2026 18:22
@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

@dsnger: Agreed. The count confirms observed delivery on this head, while the empty Wait for set means it remains diagnostic rather than a merge gate.

The re-trigger wording is a valid Minor consistency improvement, but its collected/not-actioned disposition is consistent with the documented §5 policy. A follow-up can decide definitively whether to remove that step or make it explicitly optional outside the deterministic path.


✏️ Learnings added
Learnt from: dsnger
URL: https://github.com/dsnger/dev-workflow-kit/pull/19

Timestamp: 2026-07-27T18:22:31.808Z
Learning: In `docs/pr-review-bots.md`, the per-head review-record count is a pre-merge diagnostic. Merge exceptions for absent bot reviews apply only to bots in the **Wait for** category; when that set is empty, an opportunistic bot’s zero review records do not block merging.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

dsnger added a commit that referenced this pull request Jul 27, 2026
Resolves the Minor collected on #19. The file established that
`@coderabbitai review` is a no-op while automatic reviews are active, then
instructed operators to run it anyway inside the deterministic merge
verification — described twice, once imperatively and once undercut.

The imperative is out; the procedure ends at the DISMISSED filter and the
step survives once, as an explicitly optional note beside the human-exception
clause it precedes, which also scopes it to Wait-for bots.

Facts kept: the no-op behaviour with its #17 source, that #14 and #17 both
produced nothing, that nothing claims a re-trigger cannot work (only that
this account has never seen one work), and that `full review` must not be
claimed effective without a run observed here.

Pre-merge diagnostic: per-head count 0 on head 55c3d74 — which blocks nothing,
Wait for being empty. Recorded on the PR: this 0 is a false negative. CodeRabbit
reported "No actionable comments were generated in the recent review" over
286c55f..55c3d74, so the head was reviewed and simply had nothing to say; a
zero-finding review posts no review record. The count conflates "not reviewed"
with "reviewed, clean". Follow-up, not fixed here.

Gate B: N/A — single explanatory documentation path per §5's prose rule.
Battery green before commit.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant