Simplify Git Worktree Ignore Configuration · Entire
Code Review
1. Determine Diff Against origin/main
Always review changes against origin/main directly. Do not use local main, git merge-base, a PR base branch, or a user-specified alternate base.
Get the CURRENT diff — never use cached results from earlier in the conversation. Include both committed and uncommitted changes (staged + unstaged):
BASE=origin/main
git diff $BASE --stat
Note: git diff origin/main (not origin/main...HEAD) diffs origin/main against the working tree, capturing committed changes, staged changes, and unstaged changes in one pass.
Show the user the file list and total count. If there are 0 changed files, report that to the user and stop — there is nothing to review. Otherwise, immediately proceed to the review agents. Do NOT wait for confirmation.
Before launching agents, build a concise review context and pass it to every agent. Show the context as a table before launching agents so assumptions are visible:
| Context | Source | Value |
|---|---|---|
| User goal | Conversation | One-line summary, or not provided |
| Implementation plan | Conversation / docs | One-line summary, or not provided |
| PR context | PR title/body | One-line summary, or no PR found |
| Commits | git log --oneline origin/main..HEAD |
One-line summary of commit intent |
| Changed surface | diff file list | Main packages/files touched |
| Inferred behavior | commits/tests/docs/user text | Intended behavior change, or diff-only inference |
2. Spawn Parallel Review Agents
Review Philosophy
Pass these rules to every agent:
- It is OK to find nothing. A clean review is a valid outcome. Do NOT manufacture findings to justify the review. Only flag issues you are confident are real problems.
- Be opinionated and consistent. If a pattern is acceptable, don't flag it. If you flag something, commit to that position — don't suggest the opposite approach on a re-review.
- Don't flag trade-offs with no clear winner. If there are two reasonable approaches and neither is clearly better, don't flag it. The author already made a choice.
- High confidence only. Every finding must pass the bar: "I am confident this is a problem, and I can explain specifically what goes wrong if it's not fixed." Vague unease is not a finding.
- Permission-friendly reads. Avoid shell pipelines, command separators, subshells, and output filters for read-only investigation because they create extra permission prompts and block background review agents.
- Intent-aware review. Review changed code against the review context, not against the old behavior alone. Do not classify an intentional behavior change as Required merely because it differs from
origin/main. A Required finding must either contradict stated intent, break an existing contract that the intent did not change, introduce a concrete bug/security issue, or leave the intended behavior unverified in a way that would likely fail.
Launch four baseline sub-agents in parallel using the Agent tool. Pass each agent origin/main as the base ref, the full list of changed files, the review context, and the review philosophy above.
When the repository is a Go project and the diff includes Go-related files (*.go, go.mod, or go.sum), also launch Agent 5 in the same batch.
Agent 1: Security & Adversarial
Review git diff $BASE with fresh eyes for:
- Injection — command injection, SQL injection, path traversal
- TOCTOU and race conditions — check-then-act patterns, concurrent access without synchronization
- Unvalidated input at system boundaries — user input, API parameters, external data
- Auth/authz gaps — missing permission checks, privilege escalation paths
- Secrets or credentials — hardcoded tokens, leaked keys, credentials in code or config
For EACH finding: read the actual source file and trace whether the code path is reachable in production. Discard any finding you cannot confirm with a concrete code reference.
Agent 2: Correctness & Quality
Review git diff $BASE for:
- Logic errors — off-by-one, wrong comparison, inverted conditions
- Nil/null handling — unchecked nil dereferences, missing error checks (especially unchecked errors in Go)
- Edge cases in concurrency — goroutine leaks, missing locks, channel misuse, deferred unlock ordering
- Redundant state — state that duplicates existing state, cached values that could be derived
- Production test seams — mutable function variables, package-wide settings, reset hooks, or exported knobs added only so tests can swap behavior instead of using dependency injection or a higher-scope test
- Parameter sprawl — adding new parameters instead of restructuring
- Leaky abstractions — exposing internal details, breaking existing abstraction boundaries
- Stringly-typed code — using raw strings where constants or typed values already exist in the codebase
- Test coverage and scope gaps — changed behavior, edge cases, or error paths not exercised by meaningful tests; tests that prove implementation details instead of behavior; or unit tests used where integration/e2e coverage is the right confidence boundary
- Test helper over-abstraction — helpers that hide the behavior, expected values, or assertions and make the test harder to understand than a small amount of duplication
For EACH finding: verify the claim by reading the source. Check call sites to confirm the issue is real, not hypothetical.
Agent 3: Simplification & De-slop
Use the local pfleidi:de-slop skill's slop taxonomy as the source of truth: skills/pfleidi/skills/de-slop/SKILL.md ("What Counts as Slop"). Apply its criteria as a detection lens only — find and report slop; do not run de-slop's remediation workflow, create commits, or open a PR.
Review git diff $BASE for:
- Dead code — unreachable branches, unused functions, struct fields never read, data computed but never used
- Reinvention — hand-rolled solutions to problems already solved by the repo, the standard library, or a dependency in use
- Code reuse & duplication — existing utilities and helpers that could replace newly written code; near-duplicate blocks that should be unified
- Unnecessary abstractions — wrapper types, indirection, single-caller layers, or overly defensive fallbacks that mask errors
- Premature optimization — complexity added for performance no one measured; prefer the clear version unless a bottleneck was shown
- Unnecessary work — redundant computations, repeated file reads, duplicate API calls, N+1 patterns
For EACH suggestion: verify it does not break existing behavior by checking call sites and usages. Discard cosmetic-only suggestions.
Agent 4: Readability & Go Idioms
Review git diff $BASE for code that is hard to read, maintain, or reason about:
- Poor factoring — functions doing multiple jobs, tangled control flow, or missing helper extraction where a small local helper would clarify behavior
- Mixed abstraction levels — high-level orchestration mixed with low-level I/O, parsing, protocol, or data-structure details; low-level helpers that also make workflow or policy decisions
For EACH finding: explain the readability cost in concrete maintenance terms. Prefer small, local refactor suggestions.
Agent 5: Clean Go & Modern Go (Go diffs only)
Use the local pfleidi:clean-go skill as the source of truth: skills/pfleidi/clean-go/SKILL.md.
Review only changed Go code plus surrounding source, tests, interfaces, and call sites needed to verify findings.
3. Synthesize Report
After all launched agents complete:
- Collect findings from both the first-pass agents and the second-pass coverage sweep.
- Deduplicate — merge findings from different agents that point to the same underlying issue.
- Verify — for any finding where the agent did not cite a specific file:line with evidence, read the source and confirm or discard it.
- Group by file.
- Sort by severity within each file: Critical > High > Medium > Low.