--- name: branch-review description: "Multi-perspective code review for a branch before merging. Use when: reviewing a branch, preparing a PR, pre-merge review, auditing a feature branch, or when /branch-review is invoked. Spawns three constructive reviewer subagents (correctness, security, usability), then runs an adversarial gap analysis to find what they missed, and synthesizes all findings into a unified review report. All intermediate artifacts are persisted to .copilot/ so the process can be restarted from any step." argument-hint: "Branch name or merge target (e.g. 'main' or 'feature/foo -> main')" --- # Branch Review Perform a thorough multi-perspective code review of a branch before it is merged. Four independent reviewers examine the diff from competing viewpoints, and their findings are synthesized into one actionable report. ## When to Use - A feature branch is ready to merge and needs review - Preparing a pull request - Final quality gate before integration ## Severity Levels Findings use the same severity scale as the **review-loop** skill: | Severity | Meaning | |----------|---------| | **critical** | Correctness bug, security vulnerability, or data loss risk. Must fix. | | **high** | Likely bug, race condition, or significant design flaw. Should fix. | | **medium** | Code smell, unclear logic, missing edge case, or maintainability concern. Recommended fix. | | **low** | Style nit, naming suggestion, minor improvement. Fix at discretion. | ## Persistence and Restart Every intermediate artifact produced by this skill is written to disk under `.copilot/reviews//`, where `` is a short kebab-case name derived from the branch under review (e.g. `work-stealing-scheduler` for a branch named `feature/work-stealing-scheduler`). This makes the process **fully resumable**: if any step fails, is interrupted, or produces an unsatisfactory result, you can re-run only the affected step using the on-disk artifacts from prior steps as input. ### Directory layout ``` .copilot/reviews// ├── 00-context.md # Step 2 output (shared context block) ├── 00-diff.patch # Step 1 raw diff ├── 00-changed-files.txt # Step 1 file list ├── 10-review-correctness-lens.md # Step 3 outputs (one per lens) ├── 10-review-security-lens.md ├── 10-review-usability-lens.md ├── 20-adversarial.md # Step 4 output ├── 30-synthesis.md # Step 5 output (deduped findings) ├── 40-report.md # Step 6 output (final unified report) ├── 50-fixes-iter1.md # Step 7 notes (per fix pass, optional) ├── 50-fixes-iter2.md └── ... ``` Numeric prefixes preserve chronological order. The `` directory is created at step 1 and reused for the whole run. If the same branch is re-reviewed after fixes (step 8 loop-back), append a generation suffix (e.g. `-r2/`) rather than overwriting the prior review. ### Restart contract At the start of every step, **check whether the corresponding output file already exists**. If it does: - Either reuse it (skip re-running the step), or - Explicitly overwrite it (re-run the step from scratch). Ask the user which to do if the choice is non-obvious. Never silently discard an existing artifact. When the user asks to "restart from step N", load all artifacts numbered below N into context and re-run from step N onward. ## Procedure ### 1. Gather the Diff Determine the branch and its merge target (default: `main`) and derive the slug. Create `.copilot/reviews//` if it does not already exist. Collect the diff using one of these methods, in order of preference: 1. `git diff ... -- . ':!*.lock'` — full diff against the merge base. Save to `00-diff.patch`. 2. `get_changed_files` — if the working tree has uncommitted changes that are part of the review. Also collect the list of changed files and save to `00-changed-files.txt`: ``` git diff --name-only ... ``` Read the full current content of every changed file so reviewers have both the diff and the surrounding context. ### 2. Build the Context Block Assemble a context block that every reviewer will receive and write it to `.copilot/reviews//00-context.md`. This file must be self-contained: any subagent reading it should have everything it needs without further file lookups (beyond the diff/changed-files artifacts referenced by path). Include: - **Branch and merge target** — branch name, base, commit range. - **Diff** — the full unified diff (or a reference to `00-diff.patch` if large, with key hunks inlined). - **Changed files** — list from `00-changed-files.txt` plus full current content of each modified file (or excerpts with line ranges if very large). - **Related tests** — content of test files that cover the changed code, if identifiable. - **Project conventions** — brief summary of relevant conventions from `copilot-instructions.md` (style, commenting, error handling, etc.). - **Prior audits** — pointers to any prior review artifacts the user has flagged as already-covered (so reviewers know what is in/out of scope). Keep the context block identical across all four reviewers to ensure a fair comparison. ### 3. Spawn Three Constructive Reviewer Lens Subagents Launch three subagents **in parallel**, each using a named lens agent operating in **review mode**. Each receives the context block (by path) and must return findings in the severity-tagged format defined above. | # | Agent | Focus | |---|-------|-------| | 1 | `correctness-lens` | Logic errors, broken invariants, test gaps | | 2 | `security-lens` | Injection, overflows, trust boundary violations | | 3 | `usability-lens` | Naming, complexity, conventions, maintainability | Each subagent prompt must include: - A directive to read `.copilot/reviews//00-context.md` as its context - An instruction to operate in **review mode** - A directive to **write the resulting findings to** `.copilot/reviews//10-review-.md` and return a brief confirmation plus the file path - These instructions: > Review the diff and changed files from the perspective described above. > For each issue found, report it in this exact format: > > **[SEVERITY] Short title** > - **Location:** file path and line number(s) > - **Problem:** what is wrong and why it matters > - **Suggestion:** concrete fix or remediation > > where SEVERITY is one of: critical, high, medium, low. > > If you find no issues from your perspective, state that explicitly. > Do NOT fabricate issues. Only report genuine problems. > Order findings by severity (critical first). After the subagents return, verify all three `10-review-*.md` files exist before continuing. ### 4. Adversarial Gap Analysis After the three constructive reviewers return, spawn a fresh `adversarial-lens` subagent operating in **review mode**. This step runs **sequentially** — the adversarial reviewer receives the existing findings so it can focus on what the others missed. The adversarial subagent prompt must include: - A directive to read `.copilot/reviews//00-context.md` and all three `.copilot/reviews//10-review-*.md` files - A directive to write its findings to `.copilot/reviews//20-adversarial.md` - These instructions: > You are the adversarial reviewer. The findings in the `10-review-*.md` > files were produced by three constructive reviewers (correctness, > security, usability). Your job is to find what they missed. > > Focus on: > - Code sections covered by NO existing finding (overlooked areas) > - Issue categories not represented in the existing findings > - Cross-component interactions no single lens would catch > - Unchecked assumptions and untested preconditions > - Silent divergences with no test coverage > - Fragile coupling where changing one thing silently breaks another > > For each issue found, report it in this exact format: > > **[SEVERITY] Short title** > - **Location:** file path and line number(s) > - **Problem:** what is wrong and why it matters > - **Suggestion:** concrete fix or remediation > > where SEVERITY is one of: critical, high, medium, low. > > If the existing findings are comprehensive and you find no gaps, the > file must contain exactly: "No additional issues found." > Do NOT duplicate issues already reported. Only report NEW problems. > Order findings by severity (critical first). ### 5. Deduplicate and Synthesize Read all four reviewer outputs (`10-review-*.md` and `20-adversarial.md`) and write a synthesized findings list to `.copilot/reviews//30-synthesis.md`: 1. **Merge duplicates.** If multiple reviewers flag the same issue, keep the most detailed version and note which perspectives flagged it (higher confidence). 2. **Resolve conflicts.** If reviewers disagree (e.g., correctness wants inlining but maintainability wants extraction), note both sides and flag the trade-off for the user. 3. **Verify critical/high findings.** Before presenting critical or high findings, attempt to verify them — trace the code path, run relevant tests, or construct a minimal reproduction. Mark any finding you cannot verify as **[unverified]**. Each synthesized finding should retain its severity tag and a "Flagged by" attribution listing the contributing lenses. ### 6. Present the Report Assemble the final report at `.copilot/reviews//40-report.md` and present it to the user. The report must contain these sections, in order: 1. **Summary** — one-paragraph overview: number of findings by severity, overall assessment (e.g., "ready to merge with minor fixes" or "has blocking issues"). 2. **Positive observations** — bullet list of things the reviewers agreed were done well (design choices, test quality, documentation, etc.). Keep it brief but genuine — this provides signal about what to preserve during remediation. 3. **Findings — Critical / High** — a Markdown table with columns: `#`, `Severity`, `Title`, `Location`, `Flagged by`, `Status`. Below the table, expand each row with the full problem description and suggested fix. 4. **Findings — Medium** — same table + expansion format. 5. **Findings — Low** — same table + expansion format. 6. **Trade-offs** — any unresolved disagreements between reviewers, with both sides stated. 7. **Remediation plan** — a numbered, ordered list of concrete steps to address the findings. Group related fixes into a single step where sensible. Each step should name the finding(s) it addresses and briefly describe what to do. Order by priority: blocking issues first, then medium, then low. 8. **Action prompt** — ask the user which findings to address. Options: - Fix all (follow the remediation plan) - Select specific findings by number - Dismiss specific findings - Ask for clarification ### 7. Apply Fixes For each approved finding: 1. Implement the fix (or the user's alternative if provided). 2. Confirm each fix briefly as it is applied. 3. Run relevant tests after each fix to verify no regressions. Record a short summary of the pass to `.copilot/reviews//50-fixes-iter.md` (incrementing `i` for each re-review pass) noting which findings were addressed, which were deferred, and any test results. This makes it possible to resume mid-remediation if the session is interrupted. If a fix is ambiguous or touches architecture, ask the user for guidance and record the decision in the same `50-fixes-iter.md` file. ### 8. Check Exit or Re-review After all approved fixes are applied: > All approved fixes have been applied and tests pass. Should I run another > review pass on the updated diff, or is the branch ready to merge? - If the user wants another pass → create a new generation directory (e.g. `-r2/`) and go to **step 1** with the updated diff. The prior review's artifacts remain on disk for reference. - If the user is satisfied → exit. ## Guidelines - **Fresh context per pass.** Each review pass spawns new subagents with no memory of prior passes, preventing anchoring bias. - **Do not auto-fix without approval.** Always present findings and wait for the user to decide. - **Scope to the diff.** Reviewers should focus on changed code. Pre-existing issues in unchanged code are out of scope unless the change makes them worse. - **Keep it bounded.** If a re-review returns only low-severity findings, suggest exiting the loop. - **Test after fixing.** Run the test suite (or at minimum the relevant subset) after applying fixes to catch regressions early.