Merging is a manual act
Nothing moves unless a person moves it: every change reaches main because someone decided the moment had come and clicked the button.
- Merging is a manual step performed by a person on every change
- The team merges pull requests at least weekly
- Basic CD pipeline exists (even if simple or manually triggered)
- Deploy frequency is at least weekly
- PR merge history showing manual approvals
- Deploy logs showing manual trigger or simple CD pipeline
What It Is
Merging is a manual act: someone clicks the button on every change. A developer opens a pull request, waits for whatever the team considers sufficient, and then merges it themselves at a moment of their own choosing. There is no policy enforcement, no automation, and no queue. The rules about when a change may land live in the heads and habits of the team rather than in the tooling.
This guide is about how a change flows, not about whether it is any good. Forming the verdict - reading the diff, judging correctness, deciding the change meets the bar - belongs to Code Review & Quality, and everything below assumes that verdict exists in some form. The question here is what happens next: who acts on it, when, in what order, and what the system does if two people act at once. At this level the answer to all four is "a human, whenever they get round to it".
At L1 this is not just a tooling choice - it reflects an underlying assumption that the act of merging is itself a judgement call, distinct from the judgement already made about the code. Approval and merge are two separate human decisions, separated by an arbitrary gap, and the second one carries information nobody has written down: is main stable right now, is it too close to the release, did anything else land in the meantime. This model works when volume is low (under 10 pull requests a day), the team is small, and everyone can hold the state of main in their head.
The hidden cost of this model only becomes visible under load. When a team starts using AI agents to produce code - even just developers using Copilot or Claude Code - volume rises faster than anyone's willingness to keep clicking. A team that comfortably handled 5-8 pull requests a day starts seeing 20-30, and the manual merge becomes a wall independent of review: changes that everybody agrees are fine sit approved and unmerged, sometimes for days. Worse, the changes that do land were each tested against a main that has since moved, because nothing verifies a change against the state it will actually merge into.
This is the state to understand and escape, not to optimise. Improving the review itself is worthwhile and is covered in its own area, but it does not address this bottleneck: a perfectly reviewed change still waits for a human to click. The goal here is to map what is manual about the flow, work out why, and separate the part that genuinely needs a human decision (shipping authority on a risky change, timing around a release) from the part that is only manual because nobody has written the rule down.
Why It Matters
- Baseline diagnosis - most teams don't realize how much of their merge process is manual by default rather than by design; mapping it explicitly reveals the automation opportunities
- Approved-but-unmerged becomes the real backlog - the visible queue is changes awaiting a verdict, but under agent load the larger and quieter pile is changes that already have one and are waiting for someone to act on it
- Inconsistent enforcement - when the conditions for merging live in people's heads rather than in tooling, what lands depends on who happened to click and on what day; policy drift is invisible until something breaks main
- No throughput ceiling visibility - without measuring how many changes move through the system, teams do not know they have hit the wall until delivery dates start slipping
- Nothing is tested in the state it lands in - manual merges are serialised only by luck, so two independently green changes can combine into a broken main, and the breakage is discovered by whoever pulls next
- Foundation for automation - understanding the current manual process in detail is the prerequisite for automating it; you can't automate what you haven't mapped
Getting Started
- Map your current process explicitly - write down every step from "PR opened" to "code in main." Who does what? What triggers each step? Where do PRs wait? How long does each wait typically take? This map will reveal the bottlenecks you didn't know existed.
- Measure baseline PR cycle time - use GitHub Insights, LinearB, or a simple script to pull average time from PR open to merged for the last 30 days. Break it down: time to first review, time to approval, time from approval to merge. This is your L1 baseline.
- Count PRs per day - how many PRs does your team merge on a typical day? A typical week? Track this number. It will tell you when you've hit the manual process ceiling.
- Identify what the reviewers actually check - interview your reviewers: what do they look for? How much of it is mechanical (formatting, naming, test coverage) versus judgment (architecture, correctness, security)? The mechanical checks are automation candidates.
- Define your merge criteria explicitly - write down what "approved and ready to merge" actually means for your team. This is the first step toward codifying it as policy. Even a simple checklist (CI passes, one approval, no unresolved comments) is progress.
- Pick one manual step to eliminate - don't try to automate everything at once. Start with the most mechanical step: for most teams, this is "wait for CI to pass before merging." Add a branch protection rule that requires CI green before the merge button is enabled.
Common Pitfalls
Treating every change as equally risky on the way in. A CSS tweak and a schema migration take the same path to main and wait behind the same people. Routing all changes identically regardless of blast radius means the risky ones get no extra care and the trivial ones get no less. Segmenting changes by risk is what later lets different classes flow at different speeds, and it is worth starting the segmentation long before there is any automation to apply it to.
Fixing the verdict when the problem is the flow. Teams at L1 often respond to a growing backlog by working on review itself - better checklists, more thorough comments - when the changes are already approved and simply are not moving. Improving how a verdict is reached does nothing for the interval between reaching it and acting on it. Measure the two stages separately before deciding which one to invest in.
No visibility into the queue. PRs waiting for review are often invisible. There's no dashboard, no SLA, no alert when a PR has been waiting more than 4 hours. Without visibility, the queue grows silently until someone notices a feature hasn't shipped in two weeks.
Merging manually without a consistent strategy. Some developers merge with squash, some with rebase, some with merge commits. Inconsistent merge strategies produce a noisy git history that makes debugging, bisecting, and reverting harder. This is a small friction at L1 but compounds significantly as volume grows.
Merging without checking what landed in the meantime. A change that was green three days ago is a claim about a main branch that no longer exists. At L1 nothing re-verifies before the click, so the first sign of a bad combination is a broken build for everyone. Rebasing before merge is the manual version of the fix, and noticing how often it is skipped is what makes the case for a queue later.
How Different Roles See It
Bob's team has been using GitHub Copilot for three months and PR volume has quietly doubled. His team lead mentioned that the review queue is "getting a bit long" but hasn't escalated it as a formal problem. Bob's instinct is to add another senior reviewer to the rotation, which would address the symptom but not the cause.
What Bob should do: Bob needs to look at the data before adding headcount to the review queue. He should pull 30-day PR cycle time broken down by stage. If the bottleneck is "time from first review to merge," the problem is throughput, not quality, and the solution is automation, not more reviewers. Bob should use this analysis to frame the L2 investment: a merge queue and basic branch protection rules will do more for delivery velocity than another reviewer in the rotation. The data makes the case for automation credibly.
Sarah has been tracking developer satisfaction and sees friction appearing in standup notes: "waiting on review," "PR has been sitting for two days," "merged stale code by mistake." These are symptoms of a manual process under load, but they're scattered across many retros and hard to aggregate into a single narrative.
What Sarah should do: Sarah should set up a simple PR cycle time dashboard - GitHub's built-in Insights view or a free tier of LinearB will show average time-to-merge. Then she should present the trend line to the team: "Our average PR takes X hours to merge and that number is going up." This creates shared visibility and a concrete improvement target. The next step is to identify the single biggest time sink (almost certainly "time waiting for first review") and design a lightweight intervention: a Slack notification when PRs are older than 4 hours with no review, or a daily digest of open PRs. These don't require tooling changes and can be operational within a week.
Victor has noticed something odder than a slow review queue: changes he approved days ago are still open. Nobody is arguing about them. The author moved on to something else, and the merge click never happened. When several of them are eventually merged in a burst, main breaks, because no two of them were ever tested together.
What Victor should do: Victor should measure the gap nobody is looking at: the time between a change being approved and the same change being merged. A week of data is enough, and on most teams the number is embarrassing and completely invisible in the existing dashboards. He should pair it with a count of how many merges happened without a rebase onto current main, because that is the mechanism behind the breakages. Together the two numbers make a specific proposal rather than a general complaint: require branches to be current before the merge button unlocks, which is a branch protection setting rather than a project. Victor should frame it as protecting main rather than as automation, since that is the version of the argument nobody objects to, and it establishes the principle - the conditions for merging belong in the tooling - that everything at the next level builds on.
Further Reading
How This Guide Changed
What each edition changed in this guide, newest first.
- V1.6September 2026LATEST
The L1 baseline stopped being about review and became about the click. Reading the diff and forming a verdict is Code Review & Quality's subject; what this rung describes is the gap that follows it, where approved changes sit unmerged waiting for a human to act, and each one that does land was verified against a main branch that has since moved. Separating the two makes the bottleneck visible, because a perfectly reviewed change still waits.
- V1.0March 2026
Part of the original set of L1 descriptions. Its argument at launch was that manual review and a manual merge click are not a tooling gap but an assumption - that merging is inherently a human judgement call - and that the assumption holds up fine at eight pull requests a day and collapses at thirty. It was written as a state to leave rather than a state to optimise.
Where does your team actually sit on this?
This guide describes one level of one area. Run the assessment to place your team across all 16 areas, see which gates you have passed, and get a report you can take to your stakeholders.
Merge & Deploy