xreview: remove dry-run - #50
Conversation
Dry-run suppressed the driver's verdict post and nothing else. It cost a full runner and a full sandbox session, so it was not a cheap preview, and it required a per-repo opt-in before any adopter could get a verdict onto a PR, which is the only thing the feature exists to do. It also read as a safety mode without being one. policy.dry_run_guard's own docstring said so: Bash is permitted in both modes and the agent keeps its vended gh/git token, so dry-run gated the driver's post and not the agent's writes. The prompt did carry a DRY RUN instruction asking the agent not to mutate anything, but that is a request to a model rather than a control, and it never applied in the mode everyone actually runs. Removed: the SEIDROID_XREVIEW_DRY_RUN repo variable, the --dry-run command flag, the dry-run job-summary step, the driver's --dry-run argument and ReviewRequest field, the prompt instruction, and policy.dry_run_guard. Posting is now gated on a real verdict having been produced, which it already was. The trigger match is now an exact whole line, so a comment that quotes or discusses the command still does not trigger a review. That property used to be described in terms of not letting prose force dry-run, and it survives on its own. The untrusted-content preconditions in the README are kept and promoted. They never depended on dry-run: the risk belongs to running the agent at all, and dry-run was arguably making it easier to overlook. The section now says there is no review mode that mitigates it. The safety-properties list loses the dry-run bullet and gains the one that is actually true, that a run producing no verdict posts nothing. Breaking for consumers: the driver CLI drops --dry-run and the workflow drops the guard's dry_run output, so this wants a version bump and a consumer ref bump. Verified: driver selftest ALL PASS (18 checks), ruff check clean, ruff format clean on the three files touched (selftest.py's pre-existing deviation left alone), both workflow YAMLs parse.
PR SummaryMedium Risk Overview The reusable workflow drops Docs are updated to state that dry-run was never a cheap or safe preview (full sandbox + vended Reviewed by Cursor Bugbot for commit 7a218f3. Bugbot is set up for automated code reviews on this repo. Configure here. |
Two documentation/organization tidy-ups in `.github/seidroid/`, no behavior change. ## 1. Rename `auto-review/` → `ai-review/` The folder holding the seidroid[bot] workflow prompts is renamed to match the `ai-review` workflow name. Updated every reference so the live prompt fetches keep resolving: - `ai-review.yml` / `ai-assistant.yml`: the `sparse-checkout` path and the `cat .../scout|review|assistant.md`, plus the `see …/README.md` doc pointers. - the seidroid index table row + link. The folder contents (README, scout.md, review.md, assistant.md) are unchanged; the workflows fetch the same files from the new path. ## 2. Trim the xreview README to xreview only `xreview/README.md` no longer documents `ai-review`/`ai-assistant` — dropped the cross-capability comparison table and the "difference is the engine" prose, and added a pointer to the seidroid index (`../README.md`) for how the capabilities relate. Also fixed a stray `job summary)` fragment the dry-run removal (#50) left behind. Verified: no `auto-review` references remain anywhere; both workflows parse; the xreview README has no `ai-review`/`ai-assistant` mentions. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
What
Removes dry-run from
seidroid xreviewentirely. Posting the verdict to the PR becomes the only behaviour.Why
Dry-run suppressed the driver's verdict post and nothing else. It still claimed a runner and created a full sandbox session, so it was never a cheap preview — and because the repo variable defaults to dry (
${REPO_DRY_RUN:-true}), every adopting repo needed a per-repo opt-in before it could do the one thing the feature is for.It also read as a safety mode without being one.
policy.dry_run_guard's own docstring said so:The prompt did append a
DRY RUN: do not post ... do not push, merge, or otherwise mutate anythinginstruction, but that is a request to a model rather than a control, and it never applied in the mode repos actually run in.What changed
SEIDROID_XREVIEW_DRY_RUNrepo variable +${REPO_DRY_RUN:-true}resolution.github/workflows/seidroid-xreview.yml--dry-runcommand flag in the trigger regexdry_runoutput, drive step'sDRY_RUNenv +--dry-runarg--dry-runCLI arg,ReviewRequest.dry_rundriver/__main__.py,driver/driver.pyDRY RUN:prompt instructiondriver/driver.pydry_run_guarddriver/policy.pyPosting is now gated on
steps.drive.outputs.verdict_produced == 'true'alone, which it already was in addition to the mode.Two properties deliberately preserved
The exact-line trigger match. Previously described in terms of stopping prose from forcing dry-run; it stands on its own and is kept, so a comment that quotes or discusses
seidroid xreviewstill does not trigger a review.The untrusted-content preconditions. These never depended on dry-run — the risk belongs to running the agent at all — so they are kept and promoted rather than trimmed alongside the mode. The section is retitled "Before pointing this at untrusted content" and now states plainly that no review mode mitigates it, which the old framing arguably obscured by offering dry-run as a first step. The precondition that was purely about enabling posts ("a successful dry run has completed") is the only one dropped.
The safety-properties list loses the "Dry-run is the default" bullet and gains the one that is now true: a run that produces no verdict posts nothing.
Breaking
The driver CLI drops
--dry-runand the workflow drops the guard'sdry_runoutput, so this wants a version bump.sei-protocol/platformpinsuci v0.0.14by commit SHA in two places (uses:andwith: uci-ref) and needs a companion bump once this is tagged — I have that PR ready to open against the new tag.Verification
ruff check driver/: cleanruff format --check: clean on the three files touched.driver/tests/selftest.pyhas a pre-existing deviation onmainand is left alone.guard,xreview).Neither the selftest nor ruff is currently wired into CI, so these were run locally.