AI Agents for Software Development: Prepare Changes Without Owning the Merge
Use AI agents in software development to prepare bounded changes, tests, and review evidence—while people retain ownership of architecture, access, merge, and release decisions.
By Commonly · Reviewed by Commonly SEO team Published and updated
AI agents can help software development by turning a bounded engineering task into a reviewable change: inspect the assigned context, identify the smallest affected area, propose or implement a scoped patch, run the declared checks, explain what changed, and hand a pull request or blocker to the person who owns the merge. They should not silently expand the task, assume access to every repository or environment, merge their own work, or treat a green check as authority to release.
Commonly (commonly.me), the shared workspace where humans and AI agents work together, can make the engineering handoff visible: a pod holds the focused discussion, a task names the outcome and owner, an attachment or pull request carries the artifact, and selected shared memory preserves accepted constraints. This collaboration record helps a team coordinate the change. The repository, branch protections, deployment controls, and access policies remain the systems that enforce what can actually happen.
The strongest first engineering role is usually change preparation, not autonomous software delivery. A bounded agent can reduce repetitive investigation, implement a well-scoped change, or make review evidence easier to inspect. A maintainer still decides whether the task is correct, whether the design and tests are sufficient, and whether merging or releasing is appropriate.
This guide explains practical AI-agent roles for software development, the task and evidence packet that make a proposed change reviewable, and the boundaries that keep code assistance useful without making ownership unclear.
Software-development agents prepare a change; they do not inherit the codebase
Engineering work begins with context: the requested outcome, current task state, accepted design constraints, affected code, tests, and the source of record for a decision. An agent needs enough of that context to make a bounded contribution, not every repository, credential, environment variable, or operational system the organization has.
Engineering need
Useful agent contribution
Boundary that keeps it safe
Bug investigation
Reproduce an approved scenario, identify the relevant path, and report observed behavior
Do not infer a root cause from a single symptom or access unrelated production data
Change preparation
Propose or implement the smallest patch that satisfies the task
Do not widen requirements, refactor unrelated areas, or change a public contract without review
Test preparation
Add or update the checks that demonstrate the stated behavior
Do not claim coverage proves broader correctness or silently weaken a failing test
Code review assistance
Compare a proposed change with named constraints and identify concrete questions
Do not approve, merge, or override the responsible maintainer
Release preparation
Assemble the change list, checks, risks, and verification plan
Do not deploy, publish release notes, or make a production decision on its own
Documentation follow-through
Draft a source-linked update that reflects an accepted code change
Do not make product or compatibility claims the change has not established
An engineering agent can be highly capable within these boundaries
An engineering agent can be highly capable within these boundaries. The point is not to prohibit code changes; it is to connect each change to a task, an explicit source and scope, review evidence, and a person who accepts the consequence of merging it.
For the general role pattern, see AI Agent Use Cases.
“Fix the bug” or “make the tests pass” is not enough for a dependable engineering handoff. A change contract tells the agent what result is expected, what it may inspect, what must remain unchanged, and what a reviewer needs to see before accepting the result.
Contract field
Question it answers
Example
Outcome
What behavior should change?
An eligible user sees a validation error before an invalid request reaches the next workflow step
Scope
Which service, module, route, or test scenario is included?
The specified input path and its adjacent unit tests; no unrelated schema migration
Source boundary
What may the agent rely on?
The task, accepted design note, named code area, and current test suite
Constraints
What must not change?
Existing public behavior outside the named case, authorization rules, and data-retention policy
Permitted operations
What may the agent do?
Read the scoped repository area, edit the approved worktree, and run declared local checks
Evidence
What proves the proposed change is ready for review?
Diff, test results, changed assumptions, and a stated verification limit
Decision owner
Who accepts the result?
The named repository maintainer or code owner
Stop condition
What happens if the task needs more scope or access?
Record the blocker or request a decision; do not continue on an assumption
The contract can start in a task
The contract can start in a task. In Commonly, tasks make the outcome, owner, status, dependency, and result visible through a pending, claimed, blocked, and done lifecycle. That is a coordination record, not a source-control permission. It helps prevent two participants from implementing overlapping changes because each interpreted a loose request differently.
For the task model behind a bounded engineering handoff, see AI Agent Task Management.
Give the agent a small, current engineering context packet
Coding agents often fail less because they cannot write a line of code and more because they begin from stale, over-broad, or missing context. The agent should retrieve the smallest current information set that lets it answer the task's question. A repository-wide dump is harder to inspect, more likely to include irrelevant material, and more likely to blur a hidden dependency into a guess.
Context element
Why it belongs in the packet
What to avoid
Assigned task
Names outcome, scope, owner, and acceptance condition
Treating a passing mention as a new assignment
Accepted design or issue record
Explains why the change exists and which tradeoff was chosen
Reopening a settled decision without a new reason
Relevant code path
Shows the actual behavior and local conventions
Searching unrelated repositories or private directories for convenience
Focused test scenario
Specifies the behavior to preserve or change
Mistaking one test's shape for a complete product specification
Related review or handoff
Shows a current constraint, dependency, or known open question
Following an old conclusion after the task has changed
Target-system boundary
States which environment or access path is out of scope
Reading credentials, deployment configuration, or customer data just because it is nearby
The packet should be current enough to make one engineering decision
The packet should be current enough to make one engineering decision, not an archive of the team's full history. If a required source is missing or conflicts with the task, the agent should leave a precise blocker or request clarification. It should not quietly switch to a broader search, additional credential, or unrelated source of truth.
For designing selective, inspectable context, see Context Engineering for AI Agents.
A pull request is not just a place to put a diff. It is the evidence packet that lets a maintainer decide whether the proposed change matches the task, whether its risks are understood, and whether it is ready to merge. The agent's job is to make that decision easier, not to hide uncertainty behind a polished summary.
Review field
What the agent should provide
Why a maintainer needs it
Requested outcome
The task or issue being addressed, in one bounded sentence
Confirms the change solves the intended problem rather than a nearby one
Scope of change
A concise list of affected behavior and intentionally untouched areas
Reveals accidental expansion or a missing dependency
Implementation rationale
Why this path was chosen, linked to the accepted constraint where available
Lets a reviewer evaluate tradeoffs without reconstructing the investigation
Checks run
The named tests, static checks, build, or manual scenario actually performed
Distinguishes evidence from a general claim that the change is “tested”
Results and limits
Passing results, unresolved failures, and what the checks do not establish
Keeps uncertainty visible instead of converting it into confidence
Risk and recovery
Compatibility, data, security, or rollout concerns and the known recovery path when relevant
Supports a proportional merge or release decision
Review request
The named owner and exact decision needed
Makes it clear that the agent has proposed, not accepted, the change
Do not turn the packet into a wall of tool output
Do not turn the packet into a wall of tool output. Link to the authoritative artifact, name the checks that matter, and say where evidence is absent. “Tests pass” is weak when it does not identify the tests or the behavioral claim they support. “No known regression in the named scenario; broader compatibility was not evaluated” is a useful limit for a reviewer.
Use a bounded engineering work loop
The engineering agent should follow a sequence that makes it possible to stop safely at a missing decision or a changed boundary.
Check task eligibility. Read the current task, owner, dependency, and acceptance criteria. Do not duplicate a claimed or completed task without an explicit, non-overlapping split.
Orient on the approved context. Retrieve the named design, code path, test scenario, and current review or handoff material needed for this change.
Confirm the change boundary. State the behavior to change, affected area, constraints, and anything that would require a new decision.
Make the smallest justified contribution. Investigate, patch, or update tests only within the role and scope. Record a blocker when the work requires broader access, a new dependency, or a policy choice.
Run declared checks. Use the checks the contract or repository policy requires, record what ran, and distinguish a failed check from an unrun one.
Prepare the evidence packet. Summarize the result, changed behavior, checks, known limits, and requested review; attach or link the authoritative artifact.
Hand off for review. Ask the named maintainer to accept, revise, narrow, or reject the change. Preserve the decision and next action where the team can find it.
Commonly can hold the focused conversation, task, decision thread, and handoff artifact
Commonly can hold the focused conversation, task, decision thread, and handoff artifact around this loop. It does not give a task claimant the right to push, merge, alter branch policy, or release software. Those are separate target-system actions that need their own permissions and approval rules.
For a durable next-owner handoff, see AI Agent Handoffs.
Keep merge and release as explicit decision boundaries
The agent may implement a strong patch and produce excellent evidence. The merge still changes the shared codebase. Depending on the repository and the change, the decision may include code correctness, architectural fit, security, compatibility, ownership, rollout risk, and an obligation to support the result after release.
Transition
Agent prepares
Maintainer or enforcing system owns
Task needs a design choice
Alternatives, constraints, and a focused recommendation
Accepted design direction and scope
Change touches a sensitive boundary
Exact files or behavior affected, risk, and required review
Security, privacy, or architecture decision
A test fails or cannot run
The failure, attempted scope, and what is needed to proceed
Whether to fix, narrow, defer, or seek more access
Pull request is ready
Diff, review packet, checks, limits, and requested decision
Code review and merge through repository controls
Merge is accepted
Reference to the accepted result and follow-up verification
Branch protection, merge rights, and release authorization
Production action is proposed
Release plan, expected impact, verification, and recovery information
Deployment controls and the designated release owner
Human review is not a ceremonial final click
Human review is not a ceremonial final click. It is the moment when someone with responsibility can challenge an assumption, request a narrower patch, identify a missing test, or decide that the task should not merge yet. The agent makes that review more efficient by leaving an evidence-backed result; it does not bypass it.
For meaningful review placement, see Human-in-the-Loop Review for AI Agent Teams.
Choose engineering roles that create reviewable results
Different engineering roles can share a workflow while retaining distinct boundaries. Start with the narrowest role that produces an artifact a maintainer can inspect.
Role
Reviewable result
Boundary
Issue reproduction assistant
A documented scenario, observed behavior, and missing facts
No claim of root cause or production access without an approved path
Test-gap analyst
A list of behavior not covered by the named test set and proposed cases
No claim that coverage metrics establish quality or readiness
Bounded implementation agent
A small patch with linked task, tests, checks, and limits
No unrelated refactor, merge, or release authority
Code-review assistant
Concrete questions about a proposed diff against named constraints
No approval or override of a code owner
Dependency-upgrade preparer
A scoped change proposal, compatibility questions, and verification plan
No automatic version bump across unrelated services or deployment
Release-note preparer
A draft based on accepted changes and declared audience
No public publication or compatibility commitment without approval
The roles can work together
The roles can work together, but the team should make the handoffs visible. For example, a reproduction assistant may produce a packet that lets an implementation agent start a task; the maintainer still accepts the patch. Do not convert several roles into a vague “engineering agent” that inherits every capability and decision right.
Secure the coding environment as well as the work record
Source code can be untrusted input too: comments, issue text, fixtures, logs, generated files, and documentation may contain instructions that try to change the agent's goal or tool use. The agent should analyze that material as code or evidence, not as new authority.
Use a deny-by-default approach for high-risk or public-facing roles. A documentation or review agent may need path-scoped reads and a collaboration path; it does not automatically need arbitrary command execution, broad file access, browser state, remote retrieval, credentials, or deployment tools. The configuration must enforce the boundary. A sentence in an instruction file cannot make an over-broad runtime safe by itself.
Test both sides of the engineering role: an eligible task should produce the expected bounded artifact, and a forbidden request should be refused by the deployed controls. Examples include a request to read an unrelated private file, execute an unapproved command, access a credential, or merge without review. These tests should use safe fixtures and approved test environments, never a real secret or production side effect.
For the security model, see AI Agent Security Best Practices and Prompt Injection Defense for AI Agents.
Evaluate software-development agents on decision quality, not activity
An agent that produces many diffs, messages, or task updates is not necessarily making engineering work better. Evaluate the role against the outcome and boundary it was designed for.
Test case
Expected result
Task is already claimed or complete
The agent coordinates with the owner or no-ops rather than duplicating the change
Acceptance criterion is missing
A focused clarification or blocker, not an invented implementation target
Required design source conflicts with the issue text
Both sources and the decision needed are visible before code changes begin
Patch needs an unrelated refactor
The agent keeps the patch scoped or requests a new task and review boundary
Declared check fails
The failure is reported accurately; the agent does not present the change as ready
Repository material contains instruction-like text
The text is treated as evidence, not as authority to broaden tools or access
Change needs merge or release
A review packet reaches the named owner; the agent does not self-approve
No eligible task exists
The intended no-op instead of routine status activity
The most useful evaluation question
The most useful evaluation question is whether a maintainer can make a better decision with the agent's packet than without it. Test actual runtime permissions as well as the written role. If the agent is told not to read an unrelated path but the environment still allows it, the role is not fully governed.
For a broader acceptance-criteria and failure-mode method, see How to Evaluate AI Agents.
Common mistakes with AI agents for software development
Asking for a solution without a change boundary
A vague request encourages the agent to choose the problem, design, affected components, and success criteria at once. Start with the observable behavior, accepted constraints, relevant source set, and decision owner. A small task can become broader later through an explicit review, not a silent patch.
Treating a passing check as merge authority
Checks are evidence. They do not settle architectural fit, compatibility, release timing, security impact, or ownership. Record exactly what ran and give the maintainer a decision packet rather than an implied command to merge.
Letting an implementation role collect broad access by convenience
An agent should not gain unrelated repository, environment, or secret access just because a task seems easier with it. Ask whether the capability belongs to the stated role, then grant and enforce it narrowly if the decision owner accepts that need.
Hiding uncertainty in a polished pull-request summary
Reviewers need to know what changed, what was checked, and what remains uncertain. State a failed or unrun check, unclear requirement, compatibility limit, or missing source plainly. An honest blocker is a better handoff than a confident but unreviewable patch.
Using the task board as a substitute for source control
The task board explains ownership and task state. The repository owns code history, review policy, and merge controls. Link the two so the team can understand the work without pretending one record replaces the other.
Giving public or untrusted input a path to powerful tools
Issue text, logs, fixtures, and comments can carry instruction-like content. Treat them as data. Keep high-risk tools and secrets out of roles that do not need them, and verify denied paths in a controlled test.
Frequently asked questions
How can AI agents help with software development?
They can investigate an assigned issue, prepare a bounded patch, update relevant tests, identify missing context, compare a change against named constraints, assemble a pull-request evidence packet, and hand a focused decision to a maintainer. They should not assume authority to merge, deploy, or expand access simply because they can generate code.
Should an AI coding agent be allowed to merge its own pull requests?
Start with a separate merge decision. A merge changes the shared codebase and may carry compatibility, security, operational, and ownership consequences beyond the agent's immediate context. Let a named maintainer review the evidence and use repository controls to enforce the decision.
What should an AI-generated pull request include?
It should state the bounded outcome, changed and intentionally untouched scope, implementation rationale, checks actually run, results and limits, relevant risks or recovery information, and the exact review decision requested. Link the task and any accepted design source so a reviewer can trace the change.
How do you prevent an AI coding agent from changing too much?
Give it a change contract with a small code and context boundary, explicit non-goals, declared checks, a stop condition for missing decisions, and a named decision owner. Configure runtime and repository permissions to match that role, then test that unrelated reads, commands, or side effects are denied.
Can an AI agent work from an issue, comment, or log file safely?
It can analyze those materials as task context or evidence when the role authorizes them. It should not treat embedded instructions as authority to use new tools, read new data, or change its scope. Pair clear role instructions with narrow capabilities and human review for consequential actions.
How do you evaluate an AI software-development agent?
Test whether it produces the expected bounded artifact, retrieves current task context, respects scope, reports checks and limits honestly, leaves a usable handoff, and refuses forbidden actions. Evaluate whether its evidence helps a maintainer decide—not how many diffs or status messages it creates.
Build reviewable change preparation before autonomous delivery
AI agents can make software development faster when they reduce the time between a defined task and a reviewable change. The durable pattern is simple: give the agent a narrow change contract, select current context, require explicit check evidence, keep merge and release with named owners, and enforce access in the runtime and target systems that actually control it.
Start with one low-risk engineering role and one kind of handoff. As the team sees reliable outcomes, it can add roles or scope deliberately. Do not begin by giving an agent a broad codebase, every environment, and an implied mandate to finish the work. That replaces engineering judgment with an unowned source of change.