Skip to content

Ship the §5 companion files, the deferred template sync, and 0.6.0 - #14

Merged
dsnger merged 3 commits into
mainfrom
hardening-cycle-close-nudge
Jul 26, 2026
Merged

Ship the §5 companion files, the deferred template sync, and 0.6.0#14
dsnger merged 3 commits into
mainfrom
hardening-cycle-close-nudge

Conversation

@dsnger

@dsnger dsnger commented Jul 26, 2026

Copy link
Copy Markdown
Owner

PR 2 of the canvas field-findings round. #13 took the mechanical checks; this takes the prompt-text changes and the release.

Two of the four findings were cut rather than shipped, and that is the main
result of this round. Finding A (a route from a fixed finding to the ledger for
projects that never open PRs) drew a Major on all five Gate-A passes; finding B
(a §5 version stamp) on two. Both are now stories in todos.md, opening with
the findings that killed them rather than a restatement of intent.

What ships

C — companions <slot>-dispositions.md and a cycle-stable resume note, in both §5 copies
template sync the ad-hoc-briefs paragraph, downstream-neutral
taxonomy one class, session-bound-context-not-durable
ledger one appended row
todos.md five edits
pr-review-bots.md the completion-signal caveat, three sites
release 0.5.1 → 0.6.0 + CHANGELOG

Why the resume note is cycle-stable, not pass-named: a note keyed to the
interrupted pass is exactly the file a resuming agent will not look for once the
counter moves or an incomplete pass is discounted. Gate B gets one note even
under reviewType: full — the per-branch findings files race only because
Codex's two reviewers write them concurrently, while the resume note is written
by the outer agent, sequentially.

Why the template sync is not verbatim: the repo paragraph links
docs/sparring-briefing.md, which /workflow-init never scaffolds, and asserts
this repo's own incident count. Downstream gets a neutral variant preserving
both halves of the principle — briefs carry the checklist's habits, and
nobody reviews a brief against all 12 items. Dropping the second half would
invent a process nobody runs.

The ledger row states that nothing enforces the companions. They are
optional notes; P std does not make context durable, it recommends durable
notes. A row implying otherwise would be unverified-enforcement-claim — the
class resolved at rung 2 in #13, one PR ago.

The bot caveat, and how it was found

#12 and #13 both merged heads that were never reviewed. The check passed
while the comment read "Review rate limited"; on #13 the only CodeRabbit review
record names eed589c while the merged head was 92de0d2.

docs/pr-review-bots.md now separates "the check stopped pending" (the
blocking signal) from "the final head was reviewed" (a separate verification),
across the table row, the Wait-for entry and the completion-signal paragraph.

The verification command took three passes, and each defect needed a different
method:

defect invisible to caught by
gh api --slurp is rejected with --jq — the command could not run reading executing it
prose still credited --slurp after the fix executing reading
claim described the jq stage while the pipeline ends in grep -qv executing reading

A quality pass had reviewed that file clean, under instruction to check the
pipeline, while the unrunnable command was in it. That is why AGENTS.md carries
"never document a command that wasn't run" as a rule rather than a review
expectation. The command is now measured in both directions: the jq stage
prints 0 for the merged head and 1 for the reviewed commit; the full
pipeline exits 1 and 0, inverted so exit 0 means "a qualifying review
exists" and it can gate a merge.

Review

Gate A: 8 passes, clean (8 → 8 → 7 → 9 → 5 → 5 → 3 → 0; the drop is where A was
cut). Gate B: 5 passes, final spec and quality both clean on an unchanged tree.
Invariant-11 self-review run over both changed prompt texts.

workflow-init.md still carries exactly one column-zero Target model: line
and a checklist agreeing with the repo copy at 12 — verified after each edit,
since #13's checks are live on main and police the file this PR edits.

Summary by CodeRabbit

  • New Features

    • Added optional companion files for findings dispositions and interrupted-cycle resume notes.
    • Findings files remain the sole required artifact, including for zero-finding passes.
    • Expanded prompt guidance to cover ad-hoc task briefs and verified success criteria.
  • Documentation

    • Clarified review-bot verification, commit matching, pagination, and rate-limit handling.
    • Added hardening guidance for preserving context beyond chat sessions.
    • Added release notes and workflow documentation updates.
  • Release

    • Updated the plugin version to 0.6.0.

Three findings came out of a real project running this workflow. This is the
second of two PRs; #13 took the mechanical checks. Finding A was cut after five
Gate-A passes and finding B after two — both are stories now, carrying the
findings that killed them as their opening evidence.

**Companions (finding C).** The §5 protocol knew only about the findings file,
so dispositions and interrupted-cycle state lived in chat history and died with
the session. Both §5 copies now describe two advisory companions: a per-pass
dispositions file, and a cycle-stable resume note — gate-a-spec-resume.md,
gate-a-plan-resume.md, gate-b-resume.md. Cycle-stable rather than pass-named
because a note keyed to the interrupted pass is exactly the file a resuming
agent will not look for once the counter moves. Gate B gets one note even under
reviewType: full: the per-branch findings files race only because Codex's two
reviewers write them, while the resume note is written by the outer agent,
sequentially. Both are optional and nothing enforces them — the ledger row says
so rather than implying P std made context durable.

**Template sync.** The ad-hoc-briefs paragraph, deferred since #12, is now in
the scaffolded template — but not verbatim. The repo paragraph links a file
/workflow-init never scaffolds and asserts this repo's own incident count, so
downstream gets a neutral variant preserving both halves of the principle:
briefs carry the checklist's habits, and nobody reviews a brief against all 12
items. The canvas provenance line stays repo-only, per prompt-standards item 8.

**Bot completion signal.** #12 and #13 both merged heads that were never
reviewed: the check passed while the comment read "Review rate limited", and on
#13 the only CodeRabbit review record names eed589c while the merged head was
92de0d2. docs/pr-review-bots.md now separates "the check stopped pending" from
"the head was reviewed" across all three sites, with a verification command that
was found broken by running it — gh api --slurp is rejected with --jq — and is
now measured in both directions.

Gate A: 8 passes, clean. Gate B: 5 passes, final spec and quality both clean on
an unchanged tree.
@cursor

cursor Bot commented Jul 26, 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 26, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@dsnger, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 15 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 82481eae-e79d-4832-b293-52c8ead18553

📥 Commits

Reviewing files that changed from the base of the PR and between b5610a5 and 613ed16.

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

Walkthrough

The PR documents optional findings companions and ad-hoc prompt guidance, expands CodeRabbit review verification instructions, adds a hardening taxonomy and ledger entry, updates follow-up records, and bumps the plugin version to 0.6.0.

Changes

Workflow hardening and release

Layer / File(s) Summary
Companion files and prompt guidance
CLAUDE.md, plugins/dev-workflow/commands/workflow-init.md, plugins/dev-workflow/CHANGELOG.md, docs/superpowers/plans/..., todos.md
Documents optional findings companions, preserves the findings terminator as the only validation requirement, and adds ad-hoc task briefs to prompt standards.
Hardening taxonomy, ledger, and follow-up records
docs/hardening-taxonomy.md, docs/hardening-log.md, todos.md, docs/superpowers/plans/...
Adds the session-bound-context-not-durable classification, records it in the ledger, and updates related checklist and calibration entries.
CodeRabbit review verification guidance
docs/pr-review-bots.md, docs/superpowers/plans/...
Separates status completion from final-head review and documents paginated API and jq verification rules.
Release metadata and PR scope
plugins/dev-workflow/.claude-plugin/plugin.json, plugins/dev-workflow/CHANGELOG.md, docs/superpowers/plans/...
Defines the 0.6.0 release scope and updates the plugin manifest version.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Poem

A bunny reads the findings file,
With companions stacked in style.
“Green” checks hop, but heads need proof,
New hardening notes roof the roof.
Version six goes dancing by—
Thump, thump, release into the sky!

🚥 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 clearly names the main changes: companion files, the template sync, and the 0.6.0 release bump.
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 26, 2026

Copy link
Copy Markdown

Greptile Summary

This PR releases dev-workflow 0.6.0 with documentation and scaffold updates.

  • Adds optional disposition files and cycle-stable resume notes to both §5 prompt copies.
  • Synchronizes downstream-neutral guidance for ad-hoc task briefs.
  • Documents verification that CodeRabbit reviewed the live PR head.
  • Adds the companion-context taxonomy and ledger entries, updates deferred work, and records the release.

Confidence Score: 5/5

The PR appears safe to merge, with no concrete changed-code failure identified.

The two prompt copies remain aligned, companion artifacts stay explicitly optional and outside pass validation, the live-head review command has coherent pagination and exit-status behavior, and the release metadata describes the shipped scope consistently.

Important Files Changed

Filename Overview
CLAUDE.md Adds optional companion-file guidance while preserving findings-file validation as the only hard requirement.
plugins/dev-workflow/commands/workflow-init.md Synchronizes the companion protocol and downstream-neutral task-brief guidance into scaffolded documentation.
docs/pr-review-bots.md Separates CodeRabbit check completion from final-head review verification and provides a paginated review-record check.
docs/hardening-taxonomy.md Adds a distinct fingerprint for session-bound context that was never made durable.
docs/hardening-log.md Appends the corresponding hardening record and accurately identifies the guidance as optional and unenforced.
plugins/dev-workflow/.claude-plugin/plugin.json Bumps the plugin version from 0.5.1 to 0.6.0 for the user-visible scaffold changes.
plugins/dev-workflow/CHANGELOG.md Documents both shipped prompt changes without claiming that deferred work was released.
todos.md Resolves the completed template sync and records the intentionally deferred design work.
docs/superpowers/plans/2026-07-26-cycle-close-nudge-and-companions.md Records the release plan, constraints, exclusions, and verification criteria consistently with the implemented changes.

Reviews (1): Last reviewed commit: "Ship the §5 companion files, the deferre..." | Re-trigger Greptile

@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: 3

🤖 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 41-49: Update the merge-gate command example around the
`gh`/`jq`/`grep` pipeline to avoid relying on unpinned runtime tools: either
remove the shell example or document and invoke a repository-pinned or
runtime-locked toolchain provisioned for this check. Ensure the documented
command uses that locked tooling for the review filtering logic.

In `@todos.md`:
- Around line 134-141: Make the P2 + P6 entry in the todos.md work queue
consistent: either remove the “FIRED” trigger state and leave the unchecked item
pending, or check/move it into an active queue state with a concrete next
action. Ensure it no longer simultaneously indicates that the trigger fired and
that implementation has not started.
- Around line 232-240: Update the process-pr-review step reference in the
“Finding A” entry to use step 5, matching the mandated ledger-check step and the
rest of the story; leave the surrounding scope and behavior text unchanged.
🪄 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: d67e9166-ffeb-4e95-9064-bc992a0c13b6

📥 Commits

Reviewing files that changed from the base of the PR and between 9ff8bcd and b5610a5.

📒 Files selected for processing (9)
  • CLAUDE.md
  • docs/hardening-log.md
  • docs/hardening-taxonomy.md
  • docs/pr-review-bots.md
  • docs/superpowers/plans/2026-07-26-cycle-close-nudge-and-companions.md
  • plugins/dev-workflow/.claude-plugin/plugin.json
  • plugins/dev-workflow/CHANGELOG.md
  • plugins/dev-workflow/commands/workflow-init.md
  • todos.md

Comment thread docs/pr-review-bots.md
Comment on lines +41 to +49
```sh
head=$(gh pr view <n> --json headRefOid --jq .headRefOid) # the LIVE head, not local HEAD
gh api --paginate repos/<owner>/<repo>/pulls/<n>/reviews | jq -s "
[ .[][]
| select(.user.login==\"coderabbitai[bot]\")
| select(.commit_id==\"$head\")
| select((.body // \"\") | test(\"rate limit\"; \"i\") | not)
| select(.state==\"COMMENTED\" or .state==\"APPROVED\" or .state==\"CHANGES_REQUESTED\")
] | length" | grep -qv '^0$'

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "File excerpt:"
sed -n '1,90p' docs/pr-review-bots.md | cat -n

echo
echo "Search for exact tool usage in docs/pr-review-bots.md:"
rg -n '\b(gh|jq|grep)\b' docs/pr-review-bots.md || true

echo
echo "Search pinning examples in docs/scripts:"
git ls-files '*.{md,sh,json,yml,yaml}' | xargs rg -n '\b(gh|jq|grep)\b' | head -200

Repository: dsnger/dev-workflow-kit

Length of output: 40198


🌐 Web query:

docs/prompt-standards.md CodeRabbit checks required

💡 Result:

There is no standard requirement or built-in check named docs/prompt-standards.md in CodeRabbit [1][2]. CodeRabbit employs a system of "Code Guidelines" to enforce coding standards, which automatically detects and applies existing configuration files used by other AI agents [3][4]. The default list of files monitored for these guidelines includes [1]: -.cursorrules -.github/copilot-instructions.md - CLAUDE.md - GEMINI.md -.cursor/rules/ -.windsurfrules -.clinerules/ -.rules/* - AGENT.md - AGENTS.md - REVIEW.md If you have your coding standards stored in a file named docs/prompt-standards.md, CodeRabbit will not detect it automatically by default [1][3]. To use this file, you must explicitly add it to your configuration in your .coderabbit.yaml file using the knowledge_base.code_guidelines.filePatterns setting [3]: yaml knowledge_base: code_guidelines: filePatterns: - "docs/prompt-standards.md" Once configured, CodeRabbit will pick up the rules defined in that file and apply them as review criteria [3][4]. Note that adding guideline files to path_instructions is incorrect, as that treats the file as source code to be reviewed rather than as a source of rules [3].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Find prompt-standards:"
git ls-files | rg '(^|/)docs/prompt-standards\.md$|prompt-standards' || true

if [ -f docs/prompt-standards.md ]; then
  echo
  echo "First 220 lines of docs/prompt-standards.md:"
  sed -n '1,220p' docs/prompt-standards.md | cat -n
fi

echo
echo "Determine whether docs/pr-review-bots.md is a skill/command/agent/hook message/scaffold:"
git ls-files | rg '^plugins/dev-workflow/(skills|commands|hooks|.*templates.*)|(^|/)\.mcp\.json$|(^|/)docs/prompt-standards\.md$|(^|/)AGENTS\.md$' | sed -n '1,220p'

Repository: dsnger/dev-workflow-kit

Length of output: 10748


Pin or avoid unpinned runtime tools in the merge-gate command.

docs/pr-review-bots.md is Markdown, but the documented pipeline still depends on unsigned/pinned tool versions (gh, jq, grep). Treat this as documented executable tooling: either remove the shell example or document where a repository-pinned/runtime-locked toolchain is provisioned and use it for the merge-gate check.

🤖 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 41 - 49, Update the merge-gate command
example around the `gh`/`jq`/`grep` pipeline to avoid relying on unpinned
runtime tools: either remove the shell example or document and invoke a
repository-pinned or runtime-locked toolchain provisioned for this check. Ensure
the documented command uses that locked tooling for the review filtering logic.

Source: Coding guidelines

Comment thread todos.md
Comment on lines 134 to +141
- [ ] **P2 + P6 — risk/security profiles, and security sections in the intake, spec and
gate templates.** One story: the profile is what the sections key off, so shipping
the sections without it just adds a heading nobody knows how to fill in.
*Trigger: the first real intake in a product project* — the first time a story
exists whose risk profile is a real answer rather than a guess about what product
projects might need.
*Trigger: the first real intake in a product project* — **FIRED.**
Calibration point (infinite-portfolio-canvas, 2026-07-26): 51 Gate-A pass files
across 2 stories — spec 14, plan 14, replan 4, amend 12, a3-spec 7 — in a product
project on a long-lived branch. That is a real risk profile to key sections off,
not a guess about what product projects might need.

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 | 🟠 Major | ⚡ Quick win

Keep the trigger state consistent with the work queue.

Line 137 marks P2 + P6 as FIRED, but the item remains unchecked under ## Next while the plan explicitly says it is not implemented and nothing belongs under ## Now. Either leave the trigger pending until work is pulled, or move it to an active state with a next action; do not record both “fired” and “not started.”

🤖 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 `@todos.md` around lines 134 - 141, Make the P2 + P6 entry in the todos.md work
queue consistent: either remove the “FIRED” trigger state and leave the
unchecked item pending, or check/move it into an active queue state with a
concrete next action. Ensure it no longer simultaneously indicates that the
trigger fired and that implementation has not started.

Source: Coding guidelines

Comment thread todos.md
CodeRabbit on #14: the parked Finding A entry said the mandated ledger check
lives in `process-pr-review` step 4. It is step 5 — step 4 is the
stop-and-ask-the-user step. Verified against the command itself, which this PR
does not modify.

Validated by hand rather than by subagent: #14 touches CLAUDE.md and plugins/,
so process-pr-review's instruction-path precheck bars triage.

Left alone deliberately: docs/superpowers/specs/2026-07-18-... also says step 4.
That is a historical artifact recording what was true when written, this PR does
not touch it, and docs/superpowers/ is excluded from the conformance checks for
exactly that reason.

Gate B triviality skip, documented per CLAUDE.md §5: a one-word correction to a
backlog entry, no behaviour and no mechanism changed.
@dsnger

dsnger commented Jul 26, 2026

Copy link
Copy Markdown
Owner Author

Processed — three tracked claims: one accepted and fixed, two dismissed.

This PR touches CLAUDE.md and plugins/, so /dev-workflow:process-pr-review's
instruction-path precheck barred subagent triage — a subagent loads the whole
CLAUDE.md hierarchy, and a PR editing instruction files would be rewriting the
rules its own reviewer runs under. I validated all three myself, and this
reply says so rather than implying a triage that did not happen.

1. todos.md — wrong process-pr-review step — accepted, fixed in 787dd9a

Correct. The mandated ledger check is step 5; step 4 is the
stop-and-ask-the-user step. Verified against the command itself:

149:5. Check accepted **and actionable** findings — those fixed under item 3 —
      against `docs/hardening-log.md` (anchored column-2 grep, …)

Good catch — the error would have sent a future implementer of that story to the
wrong step while the story's own scope rule (which does say step 5) contradicted it.

One site deliberately left alone: docs/superpowers/specs/2026-07-18-… also says
step 4. That is a historical artifact recording what was true when written, this
PR does not touch it, and docs/superpowers/ is excluded from the conformance
checks for exactly that reason.

2. todos.md — P2+P6 "simultaneously fired and not started" — dismissed

That is the intended state, not a contradiction. This backlog is trigger-gated
throughout: - [ ] means not done, and FIRED means now eligible. Every
row in that section carries a *Trigger: …* clause for the same reason. The
entry says the trigger condition has been met and the work has not begun — which
is precisely the position, and the calibration data (51 Gate-A pass files across
2 stories) is what fired it.

Checking it or moving it to an active queue would assert work that has not
started; removing FIRED would discard the evidence that made it eligible.

3. docs/pr-review-bots.md — unpinned gh/jq/grep in the merge-gate command — dismissed

Invariant 5's scope is explicit in AGENTS.md:

Scope: things that execute in a run — CI actions and runners, npm
packages, Docker images, MCP servers.

A verification command a human runs at a terminal is not a run dependency. The
repo already documents 5 unpinned gh invocations in process-pr-review.md and
3 grep recipes in AGENTS.md's Don'ts, deliberately — pinning a developer's
local gh would be a new policy, not this invariant, and it would not make the
check more reproducible in any way that matters.

I'd also gently push back on the Security & Privacy / Major framing: the
command is a read-only gh api query against a public reviews endpoint.

On the command itself

Worth noting, since it is the subject of this PR: that block took three passes
and each defect needed a different method.
gh api --slurp is rejected when
combined with --jq, so the originally documented command could not run at all —
invisible to review, caught only by executing it, after a quality pass had
reviewed that exact file clean. The two follow-on defects (prose still crediting
--slurp, and a claim describing the jq stage while the pipeline ends in
grep -qv) were invisible to execution and caught only by reading.

The command has now been run against this PR's own head, which is the first time
in three PRs it has confirmed a positive rather than caught a miss.

@dsnger

dsnger commented Jul 26, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

#12 and #13 merged unreviewed heads and the miss was found afterwards. On #14 the
verification query caught it BEFORE merging: check green, comment rate-limited,
zero qualifying reviews for the head. Re-trigger produced nothing; merged on an
explicit human decision with the exception recorded.

Gate B triviality skip, documented per CLAUDE.md §5: prose-only addition to a
descriptive table's surrounding notes, no mechanism or routing changed.
@dsnger

dsnger commented Jul 26, 2026

Copy link
Copy Markdown
Owner Author

Merge exception — recorded before merging

Merging with head unreviewed, on an explicit human decision, per the bounded
path this PR itself documents.

head 613ed16 (was 787dd9a when first caught)
CodeRabbit check pass
CodeRabbit comment "Review rate limited"
qualifying reviews for head 0
last genuine review b5610a5, COMMENTED
re-trigger posted once, produced nothing in ~7 min — retry path exhausted

What is unreviewed: a one-word prose correction CodeRabbit itself requested
(process-pr-review step 4 → 5 in a backlog entry), plus this exception note in
docs/pr-review-bots.md. All substantive content — both §5 copies, the template
sync, the taxonomy class, the ledger row, the bot caveat, 0.6.0 — was reviewed at
b5610a5 and cleared by Gate B on both branches.

This is the fourth observation of the pattern and the first caught before a
merge; #12 and #13 both merged unreviewed heads and the miss surfaced afterwards.
Recorded in the CodeRabbit row.


Round report — canvas field findings

Four findings from a real project running this workflow. Two shipped, two were
cut
— and the cuts are the substantive result.

finding outcome
D — mechanical prompt-conformance checks merged, #13
C — optional gate companions this PR
A — ledger route for no-PR projects cut after 5 Gate-A Majors → story
B — §5 version stamp cut after 2 Gate-A Majors → story

Both cuts followed the same signal: sustained review fire on one paragraph means
it is a design, not a sentence. Each story now opens with the findings that
killed it — A with "same-session memory cannot carry the fixed-finding set" and
"scope must match step 5 exactly, not approximate it"; B with the false
version-bump coupling (invariant 12's checker is pull_request-only).

Gate totals. #13: Gate A 9 passes, Gate B 8 passes, 13 defects. #14: Gate A 8
passes, Gate B 5 passes, 4 defects. Every #13 defect was one of two shapes — a
claim outrunning the code, or a gate reporting success without doing its work.
The second family took four passes and closed at six depths, ending where
grep | head | sed exposed only sed's status.

What review could not catch. The verification command in this PR could not
execute — gh api --slurp is rejected with --jq — and a quality pass had
already cleared that file under instruction to check the pipeline. Running it
found it. Two follow-on defects in the prose around it were invisible to
execution and caught only by reading. Three defects, one block, three detection
methods.

Left open, deliberately: harden-finding's recurrence rule is still
scope-blind (parked, with the branch logic corrected after I filed it inverted);
A and B are parked with their evidence; the P2+P6 story's trigger is FIRED and
awaits its own brief.

@dsnger
dsnger merged commit 18d8c5b into main Jul 26, 2026
2 checks passed
@dsnger
dsnger deleted the hardening-cycle-close-nudge branch July 26, 2026 14:22
dsnger added a commit that referenced this pull request Jul 27, 2026
Documents that CodeRabbit's "Review rate limited" message carries no information in
either direction — it appears on heads that were never reviewed and on heads that were
— so the per-head review count is the only arbiter.

MERGED AS AN EXPLICIT HUMAN EXCEPTION — head c62455b went unreviewed by CodeRabbit.

Per-head verification ran twice against c62455b and
returned 0 both times: before the re-trigger, and after `@coderabbitai review` plus a
~5 minute wait. Zero CodeRabbit review records exist on this PR for any head. Its
status check was green throughout.

CodeRabbit's own comments: at 12:13Z "Review limit reached — you've reached your PR
review limit, so we couldn't start this review"; after the re-trigger, "Review
finished… does not re-review already reviewed commits" with no review record produced.
The re-trigger cannot recover this head.

Decision by Daniel, following the #14 precedent. The change is docs-only
(docs/pr-review-bots.md, no other path) and Greptile reviewed it — check green.
dsnger added a commit that referenced this pull request Jul 27, 2026
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`.
dsnger added a commit that referenced this pull request Jul 27, 2026
Docs-only, two files, no plugin path — no version bump.

CodeRabbit leaves Wait for after five consecutive unreviewed heads (#12, #13,
#15, #16, #17 — the last with zero review records on the PR) followed by a
genuine review on #18. Real findings source, unpredictable delivery, and a
completion signal that fires regardless of whether a review happened: the
opportunistic category by this file's own definition. Wait for is now empty.

Row additions: 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 #14's
"re-trigger produced nothing". Plan corrected to Free; "Pro Plus" was observed
on PR #1 only.

The count rule's two facts separated: the per-head count remains the arbiter of
whether a head was reviewed, for any bot; the recorded-human-decision
requirement binds only bots under Wait for, and is dormant while that list is
empty. Every head reaching a PR has already passed Gate B, so a quiet
supplementary reviewer needs no exception.

MANIFEST.md: the bare `CLAUDE.md` row resolved to the repo root and produced a
false Major on #18. Qualified to source-files/CLAUDE.md, with the three files
distinguished, and root §6 (context canary) recorded as deliberately outside
the §1–§5 template range and never to be synced into the scaffolded template.

Pre-merge diagnostic: per-head count 1 on head 2634bf2 — reviewed. One Minor
finding (drop or explicitly optionalize the re-trigger step) collected, not
actioned, per §5's Minor/Nit rule.

Gate B: N/A — every path is explanatory documentation per §5's prose rule.
Battery green at each commit.
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