Skip to content

rework(vetter): resume a dead auditor before redispatching, and name the path taken - #276

Open
thedavidmeister wants to merge 1 commit into
mainfrom
2026-08-11-issue-275-resume-first-auditor-recovery
Open

rework(vetter): resume a dead auditor before redispatching, and name the path taken#276
thedavidmeister wants to merge 1 commit into
mainfrom
2026-08-11-issue-275-resume-first-auditor-recovery

Conversation

@thedavidmeister

Copy link
Copy Markdown
Contributor

Closes #275

What

An auditor that dies mid-run is now resumed, not replaced — and the log must say which happened.

Run 20260810T230003Z redispatched the cyclofinance/cyclo.site#404 audit from scratch (~$2.70 of a $15.46 run: a fourth full audit-skill injection, a first call holding zero inherited context) while narrating "resuming it so it continues from where it left off". The narration could not have been true: SendMessage — the harness's only continue-a-subagent channel — was denied in review-settings.json, so a fresh redispatch was the only expressible recovery.

  • review-prompt.txt (FAN OUT): new rule — a dead auditor's context is intact and paid for, so the first recovery act is ListAgents + SendMessage to that auditor; a fresh dispatch is the fallback taken only when the resume itself fails, and the narration and run summary name the path taken (resumed the <pr> auditor / resume failed (<why>) — redispatched fresh). SendMessage is confined by the same rule: continuing this run's own auditor is its one legal use.
  • review-settings.json: ListAgents and SendMessage move to allow; SendMessage leaves deny. Every write denial (Bash/Write/Edit/NotebookEdit) is untouched — the CI gate review-settings.json denies every write tool still passes by construction, and SendMessage writes nothing to GitHub or disk.
  • README.md: recovery paragraph in Fanning the audit out; the permissions bullet now names the resume pair instead of claiming Task was the only permission ever moved.
  • pr-review-report-rs/src/main.rs: the_vetter_can_resume_a_dead_auditor pins both halves — permission pair allowed-and-not-denied, prompt states RESUMED, NOT REPLACED and requires redispatched fresh naming — the same shape as the_vetter_can_dispatch_but_still_cannot_write, and for the same reason: either half alone is inert or unconfined.

QA

  • Discriminating tests: the_vetter_can_resume_a_dead_auditor — fails on base by construction of mutant A below (base's review-settings.json IS the pre-change settings, and the test panics against it at main.rs:53382); on this head, nix develop .#rust -c cargo test -p pr-review-report the_vetter_can_resume reports test result: ok. 1 passed; 0 failed; … 1278 filtered out, and the full vetter filter suite passes (exit 0, including the 12 usage_gate_skip vetter integration tests).
  • Mutations applied: the tests read the tree at runtime, so mutants ran without recompiling. (A) review-settings.jsongit checkout HEAD~1 -- (SendMessage back in deny, ListAgents gone from allow) → killed by the_vetter_can_resume_a_dead_auditor, panic at main.rs:53382. (B) review-prompt.txtsed the RESUMED, NOT REPLACED sentence to its negation → killed by the same test, panic at main.rs:53396. Tree restored clean after each (git status --short empty).
  • Oracle: the harness's own subagent-continuation contract — a stopped agent is continued by SendMessage to its id and a fresh Task/Agent dispatch starts with no inherited context — plus trace 20260810T230003Z as the measured counterexample (fourth audit-skill injection, replacement first call at the 18.4k dispatch floor with zero cache-read of prior work), independent of any code in this repo.
  • Category check: vetter auditor recovery redispatches from scratch while logging "resuming" — resume the dead session instead #275 asks (a) resume-first recovery on transient auditor death, (b) redispatch only as fallback when resume fails, (c) the log names which path was taken, never a redispatch described as a resume; covered (a) review-prompt.txt FAN OUT rule + the settings pair that makes it executable, (b) the same rule's explicit fallback condition, (c) the mandated narration spellings in prompt + run-summary rule, pinned by the redispatched fresh assertion. Self-review: the pre-existing "doubted claim → SECOND DISPATCH" sentence is the doubt case, not the death case — no surviving sentence permits a silent redispatch on death. No shell script changed, so no bash -n; plugins/ untouched, so version-hygiene's bump gate does not fire.

🤖 Generated with Claude Code

…the path taken

An auditor that dies mid-run leaves a stopped agent whose context is intact
and already paid for. Run 20260810T230003Z redispatched #404's audit from
scratch (~$2.70 of a $15.46 run) while logging 'resuming it so it continues
from where it left off' — the resume channel (SendMessage) was denied, so
redispatch was the only expressible recovery and the narration could not be
true.

- review-prompt.txt FAN OUT: resume-first via ListAgents + SendMessage;
  fresh redispatch only when the resume itself fails; the narration and run
  summary name which path was taken.
- review-settings.json: ListAgents and SendMessage move to allow;
  SendMessage leaves deny. The write denials are untouched.
- README.md: recovery paragraph in the fan-out section; the permissions
  bullet now names the resume pair.
- main.rs: the_vetter_can_resume_a_dead_auditor pins both halves — the
  permission pair and the prompt rule — the same shape as
  the_vetter_can_dispatch_but_still_cannot_write.

Closes #275

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@thedavidmeister thedavidmeister self-assigned this Aug 11, 2026
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Warning

Review limit reached

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

Next review available in: 29 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

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: ASSERTIVE

Plan: Pro Plus

Run ID: 26e09e1a-f622-4052-8875-85ae643cc998

📥 Commits

Reviewing files that changed from the base of the PR and between 8093f2e and 5ac5c6c.

📒 Files selected for processing (4)
  • README.md
  • pr-review-report-rs/src/main.rs
  • review-prompt.txt
  • review-settings.json

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.

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.

vetter auditor recovery redispatches from scratch while logging "resuming" — resume the dead session instead

1 participant