Guide / 2026-09-28

What to do when an AI agent opens a 40-file pull request

Inventory an oversized agent diff, separate independent work from dependencies, and rebuild reviewable PRs without losing the original change.

Canopy pull request review beside an agent workspace and code diff
Canopy pull request review beside an agent workspace and code diff

A large agent-written PR can contain a real feature, generated files, refactors, and unrelated cleanup in one diff. A reviewer cannot approve it by counting green checks or asking for a longer summary. First preserve the work and identify its independent decisions. Then choose a smaller PR, a stack of dependent PRs, or a reasoned exception for an indivisible change. This guide uses a hypothetical 40-file settings feature; file count is a prompt to inspect, not a universal size limit.

Freeze the branch and inventory the patch

Ask the agent to stop editing and record the PR head, base branch, worktree path, and current status. Read the changed-file list, diff summary, commits, generated artifacts, dependency or lockfile changes, migrations, and deleted tests. Keep the original branch intact until a reviewed replacement exists. A large change might be appropriate for generated code or a mechanical migration, but that does not remove the need to check its source and outcome. GitHub recommends small focused PRs because they make purpose and risk easier to understand; this is a review-capacity decision, not an accusation that the agent's code is wrong.

  • Mark files that implement the requested behavior, support it, or are unrelated.
  • Identify auth, payments, data, configuration, and test changes for specialist review.
  • Record the original acceptance check and the running behavior before moving commits.

Split by decisions and dependencies

For the settings example, the patch may contain a profile API change, form UI, visual polish, and an unrelated lint refactor. The lint refactor can be a separate follow-up or omitted if it was not requested. The API and UI depend on one another but can often form two reviewable layers if the API has a stable contract and tests. A database migration might need to precede both and deserves its own rollback and data review. Do not split solely by an arbitrary number of files: each PR should have a coherent reason, an acceptance check, and a reviewer who can decide it. If two slices cannot build or be understood independently, explain their dependency in a stack.

Example decomposition of one mixed settings PR.
SliceDependencyReview question
Profile API and testsBase branchDoes save enforce ownership and return the agreed result?
Settings form and UI checksProfile API sliceDo success, failure, and retry work in the browser?
Unrelated lint cleanupNoneIs it needed for this feature or a separate issue?
Generated client outputSource schema or generatorWas it produced by the documented command from reviewed input?

Choose separate PRs or a stack deliberately

Independent slices can branch from the normal base and be reviewed in any order. Dependent slices can use stacked PRs: GitHub describes a bottom PR against the trunk and higher PRs targeting the branch below, so each layer shows its own diff. GitHub's stacked-PR feature is in public preview and has repository and client requirements; check availability before prescribing its controls. Canopy's v0.3.4 release notes list support for asynchronous stacked PR merges, but the exact installed UI should be tested. If your team does not use GitHub stacks, ordinary dependent branches still need explicit base branches, review order, and careful rebasing. Do not force-push a shared PR history merely to make the page look smaller; coordinate with the PR owner and reviewers first.

  • Keep every dependency visible in the PR description and branch base.
  • Put foundational contracts below the code that consumes them.
  • Preserve a link to the original PR or branch while rebuilding the review sequence.

Have the agent deliver one slice at a time

Give the implementing agent the approved split: slice purpose, allowed files or behavior, starting branch, tests, and stop point. Ask it to prepare the first diff and stop for review before beginning the next. A second agent can review the slice read-only against the original issue, but should cite reachable defects rather than expand scope. In Canopy, verify each agent's checkout, branch, changed files, running app, and PR context; an agent session title is not proof that the files are isolated. If moving existing commits between branches, inspect the resulting diff and test after each move. Do not discard the 40-file branch until all intended behavior is accounted for.

  • A smaller diff is only useful if it remains buildable and honest about dependencies.
  • Keep generated files with the source change that produces them when the repository requires both.
  • Review changed tests for weakened assertions as well as added coverage.

Verify the combined result before the final merge

Each PR needs its own reviewable change and checks on its latest commit. After lower layers merge or update, retest dependent branches against their new base and inspect what changed during a cascade or rebase. Finally run the original settings workflow against the integrated code: a valid save persists, another user cannot edit it, and a failed request permits retry. Check the final diff against the original 40-file inventory so useful work was not lost and unrelated edits did not slip through. The team should record accepted work, deferred cleanup, and who owns the final merge. A neat stack can still ship a broken combined feature if nobody checks the whole path.

  • Confirm PR bases and latest checks before approving each layer.
  • Re-review affected layers after a lower contract changes.
  • Record one integrated user-journey result before calling the feature done.

Copyable resources

Oversized PR split plan

Use with the PR owner before rewriting any published branch history.

Original PR / head / base / worktree: [ ]
Original issue and acceptance checks: [ ]
Changed files grouped by behavior, generated output, tests, config, migration, unrelated work: [ ]
Risky paths and assigned reviewer: [ ]
Slice A: purpose [ ]; branch base [ ]; files/behavior [ ]; check [ ]
Slice B: purpose [ ]; dependency [ ]; files/behavior [ ]; check [ ]
Independent follow-up or rejected scope: [ ]
Stack feature available in this GitHub repo/client? [yes/no/unknown]
Canopy installed version and stacked-PR behavior tested: [ ]
Original branch preserved until: [ ]
Latest checks per PR and integrated user journey: [ ]
Final owner and merge order: [ ]

Frequently asked questions

Is a 40-file AI pull request automatically bad?

No. Generated or mechanical changes can be large for a coherent reason. Inspect whether the diff contains one understandable decision, reviewable source, meaningful checks, and a clear owner.

Should I ask the agent to split the PR by file count?

Split by purpose and dependency. An arbitrary file cap can leave half a behavior or generated output in the wrong PR.

When are stacked PRs useful?

When one reviewable change depends on another unmerged change. Each PR targets the branch below it and shows a focused layer. Check GitHub's current availability and your team's merge process.

Can I force-push the original branch after splitting it?

Coordinate with the PR owner and reviewers before rewriting published history. Preserve the original state until replacement branches, diffs, and checks are verified.

Browse more Canopy questions →

Sources and further reading