In this article
There was a time when writing software meant typing every line yourself. You opened an editor, created a file, wrote a function, ran it, watched it fail, and tried again. The feedback loop was tight, manual, and deeply personal. Today, a growing number of developers begin a task by describing an outcome in plain language, then review and refine code that an AI coding agent has already written, tested, and staged on a branch. That shift is not a small productivity tweak. It changes what programming feels like, what skills matter, and where human judgement still earns its keep.
The tooling landscape has fractured into distinct categories. IDE extensions, agentic editors, terminal-first agents, and cloud development environments now compete for the same developer attention. Understanding the differences matters more than picking a favourite brand, because each approach assumes a different level of trust, a different workflow, and a different idea of what the developer is actually for.
What AI coding agents actually are
An AI coding agent is not an autocomplete engine with a larger model bolted on. Autocomplete predicts the next token or the next line based on local context. An agent receives a goal, gathers relevant context from a repository, forms a plan, calls tools, executes commands, inspects the results, and iterates. The distinction is autonomy over actions, not just suggestions.
Traditional code completion tools such as the early versions of Jev AI and similar AI programming assistants operated on a narrow slice of the file in front of them. A modern agent can read the folder structure, search for symbols, open documentation, run a test suite, parse the failure output, and modify multiple files in response. It behaves less like a spellchecker and more like a junior engineer who has read the repository and is willing to try things.
The practical consequence is that the developer’s job moves upstream. Instead of translating a specification into syntax, you define the constraints, review the plan, inspect the diff, and decide whether the result is safe to ship. That is a different kind of work, and it demands a different kind of vigilance.
How an AI coding agent works under the hood
The internals are less mysterious than they look. An agent receives a prompt, then performs a context-gathering phase. It searches the repository for relevant files, reads configuration, inspects dependency manifests, and sometimes queries documentation or issue trackers. This phase is where many agents fail quietly: if the context is wrong, the plan will be wrong, and the code will be confidently incorrect.
After gathering context, the agent produces a plan. In tools such as enterprise AI platforms built for governed software delivery, that plan can be surfaced to a human before execution. In more autonomous setups, the plan is internal and only the final diff is exposed. The difference matters for trust and for debugging.
Tool calling is where agents become genuinely useful. The agent can run shell commands, query a database, call an API, install a dependency, execute a test suite, or open a browser. Each tool call returns output that the agent feeds back into its reasoning loop. This is the same pattern used by AI project management workflows that coordinate multiple agents across tasks: observe, plan, act, validate, repeat.
Validation is the step that separates a demo from a development tool. A good agent runs the tests, checks the linter, inspects the diff for unintended changes, and reports what it could not verify. A weak agent declares success as soon as the code compiles. The gap between those behaviours is where most real-world frustration lives.
The evolution from autocomplete to autonomous systems
The progression has been rapid but uneven. Inline autocomplete arrived first and changed typing speed. Chat interfaces arrived next and changed how developers explored unfamiliar code. Agentic IDEs followed, combining chat with file editing and terminal access. The current frontier is the autonomous coding agent: a system that can accept an issue, plan multi-step work, execute in a sandbox, and open a pull request with minimal human intervention.
GitHub Copilot illustrates the trajectory. It began as an IDE extension for inline suggestions and now includes a cloud agent, repository memory, and custom agent definitions. The identity and access management patterns used in Keycloak Docker setups are increasingly relevant here, because agents that access repositories and cloud resources need the same authentication rigour as human users.
Cursor, built as a fork of VS Code, took a different route. It rebuilt the editor around an agent panel and later introduced an Agents Window for running parallel agents locally or in the cloud. Windsurf integrated its Cascade agent with a planning loop, code maps, and up to twenty tool calls per prompt. Claude Code chose the terminal as its native habitat and leaned into long-horizon reasoning. OpenAI Codex extended the agent into a desktop application and cloud environments. Gemini Code Assist added an agent mode with auto-approve and checkpoint rollbacks. Replit Agent pushed towards fully autonomous app building, with parallel agents and self-testing loops.
| Capability | AI coding assistant | AI coding agent |
|---|---|---|
| Primary mode | Suggests code in the editor | Executes tasks across files and tools |
| Repository access | Usually limited to the open file or nearby context | Searches and reads the wider repository |
| Tool execution | Rare or absent | Terminal commands, test runners, APIs, and browsers |
| Planning | Minimal or implicit | Explicit multi-step planning and task breakdown |
| Debugging | Explains errors on request | Runs tests, reads failures, and iterates |
| Human supervision | Continuous, line by line | Milestone-based, diff review, and checkpoint approval |
Table 1: The line between assistants and agents is blurring, but the distinction between suggesting and acting remains useful.
How agents interact with real development environments
The environment is where agentic coding earns or loses trust. An agent that can only edit text is a text generator. An agent that can run npm test, read the failure output, inspect the relevant source file, apply a fix, and rerun the test is doing something qualitatively different. It is participating in the feedback loop that defines software engineering.
Git integration is equally important. Agents need to understand branches, diffs, commit history, and pull request conventions. In teams that use monorepos, the agent must navigate workspace boundaries and package relationships. In teams that deploy to managed infrastructure, the agent may need to inspect logs from a Supabase instance hosted on a VPS or a comparable backend platform before it can diagnose a runtime issue.
Documentation access matters more than vendors sometimes admit. A model trained months ago may not know the latest API change. An agent that can search documentation in real time has a meaningful advantage. Windsurf’s Cascade, for example, can search the web and read documentation pages through explicit mentions, and Claude Code supports MCP connections to external knowledge sources. These are not cosmetic features. They are how the agent avoids confidently writing code against an outdated interface.
Assistants, agentic IDEs, and autonomous systems
These categories are often conflated, but they describe different contracts between human and machine. An assistant suggests. An agentic IDE provides a controlled environment where an agent can act with the developer watching. An autonomous system accepts a high-level goal and operates with limited oversight, usually in a sandbox, producing a pull request or a deployed application for review.
The differences show up in the product design. Cursor’s Agents Window is built for parallel work, with agents running locally or in the cloud and checkpoints available for rollback. Claude Code’s agent view lets a developer manage multiple sessions from one screen. GitHub Copilot’s cloud agent lives inside the repository’s Agents tab and integrates with pull requests. Replit Agent treats the entire development environment, including the database and deployment target, as part of the agent’s workspace.
| Tool | Primary workflow | Strengths | Limitations | Ideal use case |
|---|---|---|---|---|
| GitHub Copilot | IDE extension with cloud agent and repository memory | Deep GitHub integration, pull request workflows, team conventions | Less autonomous than terminal-first agents for long refactors | Teams already standardised on GitHub and Visual Studio Code |
| Cursor | Agentic editor with parallel agents and cloud execution | Visual diff review, multi-model access, strong editor experience | Requires willingness to adopt a new editor | Developers who want a visual IDE with deep agent integration |
| Windsurf | Agentic editor built around the Cascade agent | Planning loops, code maps, multi-step tool use | Smaller ecosystem than larger competitors | Teams that want an integrated agent with strong context awareness |
| Claude Code | Terminal-first agent with IDE and web surfaces | Long-horizon reasoning, MCP support, multi-agent sessions | No free tier, terminal-centric learning curve | Complex refactors and codebase-wide reasoning tasks |
| OpenAI Codex | Desktop app, cloud agent, and IDE extension | Parallel agents, cloud environments, pull request review | Best experience within the OpenAI ecosystem | Teams that want multi-surface agent deployment |
| Gemini Code Assist | IDE agent mode with plan approval | Multi-step plans, inline diffs, checkpoint rollback | Agent mode behaviour varies by IDE | Google Cloud teams and developers who want a plan-first workflow |
| Replit Agent | Cloud development environment with autonomous agent | End-to-end app building, self-testing, design iteration | Less suited to existing complex repositories | Prototyping, small applications, and rapid experimentation |
Table 2: A practical comparison based on current documented workflows, not benchmark scores. Capabilities shift quickly, so verify specifics before committing a team to a tool.
Practical workflows: what agentic coding looks like day to day
The abstract descriptions become clearer when you look at actual tasks. The following scenarios are representative of how developers are using agents today, including where the agent does well and where human review remains essential.
Scenario one: debugging a refresh token expiry bug
Imagine a Node.js API that issues refresh tokens. Users are being logged out prematurely, and the issue appears only in production after a deployment. A developer gives the agent a tightly scoped instruction.
The agent reads the authentication middleware, the token service, the environment configuration, and the relevant tests. It might notice that the token expiry is being calculated from the wrong timestamp unit, or that a configuration value is being parsed as milliseconds when it is expressed in seconds. It proposes a minimal diff, runs the authentication test suite, and reports that one test now passes but another still fails because of a fixture mismatch. The developer reviews the diff, confirms the fix is correct, and asks the agent to update the fixture.
What the agent did well: locating the relevant code, forming a hypothesis, and validating with tests. What the human did: defining the constraint about the schema, judging whether the proposed fix was semantically correct, and deciding that the fixture change was acceptable.
Scenario two: refactoring a React component without changing behaviour
Refactors are where agents can save time but also where they can quietly break things. A developer working on a React dashboard needs to simplify a component that has accumulated conditional rendering logic.
The agent inspects the component, its tests, its Storybook stories, and any analytics calls that reference the data attributes. It proposes a new structure with smaller helper components, updates the imports, and runs the test suite. If the component has snapshot tests, the agent can compare snapshots and flag any unintended DOM changes. The developer then reviews the diff with particular attention to the analytics attributes and the public prop interface.
// Before: a component with nested conditionals
function DashboardCard({ title, metrics, isLoading }: Props) {
return (
<div data-testid="dashboard-card">
{isLoading ? (
<Skeleton />
) : (
<>
<h3>{title}</h3>
{metrics.length === 0 ? (
<EmptyState />
) : (
<MetricList items={metrics} />
)}
</>
)}
</div>
);
}
// After: the agent extracts rendering branches but preserves the wrapper and data attribute
function DashboardCard({ title, metrics, isLoading }: Props) {
return (
<div data-testid="dashboard-card">
<CardContent title={title} metrics={metrics} isLoading={isLoading} />
</div>
);
}
The risk here is that the agent might also “clean up” a data attribute it considers redundant. A good prompt explicitly preserves those contracts. A good agent respects the constraint. A good developer checks anyway.
Scenario three: writing integration tests for a Python endpoint
Test generation is one of the strongest use cases for agents because tests provide immediate, machine-checkable feedback. A developer working on a FastAPI service asks for coverage of failure modes.
The agent reads the endpoint, the Pydantic models, the authentication dependency, and the existing conftest fixtures. It writes tests for missing fields, malformed payloads, expired tokens, and database exceptions. It runs the tests, notices that one fixture is not isolated correctly, and proposes a fix to the fixture rather than to the application code. The developer reviews the test names, confirms that the assertions are meaningful rather than tautological, and checks that the database session is rolled back after each test.
def test_create_order_rejects_missing_customer_id(client, auth_headers):
response = client.post(
"/orders",
json={"items": [{"sku": "ABC-1", "quantity": 1}]},
headers=auth_headers,
)
assert response.status_code == 422
assert "customer_id" in response.text
def test_create_order_rejects_expired_token(client, expired_token):
response = client.post(
"/orders",
json={"customer_id": "cust_123", "items": []},
headers={"Authorization": f"Bearer {expired_token}"},
)
assert response.status_code == 401
The tests are only useful if they fail for the right reasons. An agent can generate a test that passes trivially because it asserts nothing meaningful. Human review is still required to judge test quality, not just test coverage.
How agents are changing different parts of software engineering
Frontend development has been particularly receptive because the feedback loop is visual and the component boundaries are well defined. Agents can generate a component, run it in a browser, inspect the rendered output, and adjust styles. Tools that can drive a browser have an advantage here, because they can verify layout and interaction rather than just asserting that the code compiles.
Backend engineering is less visual but often more consequential. Agents can scaffold endpoints, write database migrations, and generate tests, but the risk of subtle data handling bugs is higher. A migration that drops a column without a backup is not a mistake you want an agent making unsupervised. Permission management, transaction boundaries, and idempotency are areas where human review is not optional.
DevOps and platform engineering are seeing a different pattern. Agents are useful for writing infrastructure as code, diagnosing deployment failures, and updating configuration. But the blast radius of a bad change is large. The service management principles described in ITIL 5, including the four dimensions of service management, remain relevant because agents do not remove the need for change control, incident management, and continuous improvement.
Testing and maintenance may be the quietest but most durable wins. Agents are good at writing tests for existing code, identifying untested branches, and updating tests after a refactor. They are also useful for dependency upgrades, where the agent can read changelogs, update manifests, run the test suite, and report breaking changes. That work is tedious for humans and well suited to a machine that does not get bored.
Security risks, hallucinations, and the limits of trust
Agents introduce a new class of risk because they can take actions. A hallucinated suggestion in a chat window is annoying. A hallucinated package name that an agent installs from a public registry is a supply chain vulnerability. Dependency confusion attacks, typosquatting, and malicious packages are real threats, and an agent that installs dependencies without verification widens the attack surface.
Permission management is the first line of defence. Agents that access repositories, cloud accounts, and databases should operate with the minimum privileges required for the task. The network security controls discussed in UTM firewall deployments are relevant because agent execution environments are network endpoints, and they should be treated as such. Sandboxing, egress filtering, and audit logging are not optional in production settings.
Data privacy is another concern. An agent that reads a repository may encounter secrets, customer data, or internal documentation. Whether that data is sent to a model provider depends on the tool and the configuration. Enterprise buyers should insist on zero-data-retention options, clear data processing agreements, and the ability to exclude sensitive repositories. The privacy implications of IP address exposure are a useful reminder that network metadata can reveal more than intended, and agent telemetry deserves the same scrutiny.
Authentication is a recurring weak point. Agents that act on behalf of a developer need credentials, and those credentials must be scoped, rotated, and revocable. The shift towards passkey-based authentication without passwords is relevant because agents should not be storing long-lived secrets in plaintext configuration files. Short-lived tokens, workload identity, and hardware-backed credentials are better patterns.
A practical rule: give an agent the same access you would give a new contractor on their first day. Enough to be useful, not enough to cause irreversible damage. Review the diff, not just the test result.
Costs, productivity, and team structure
The productivity conversation is messy because the metrics are messy. Measuring lines of code per hour is meaningless when an agent can generate a thousand lines of plausible but wrong code. Measuring pull requests merged is better, but still noisy. The more useful question is whether the agent reduces the time between a well-defined problem and a reviewed, tested, deployable change.
Costs are similarly nuanced. Subscription prices are visible, but the hidden costs include review time, security review, and the cognitive load of supervising multiple agents. A team that saves four hours of typing but spends three hours reviewing agent-generated diffs has not gained much. The gains come when the agent handles work that humans find genuinely tedious: boilerplate, test scaffolding, dependency updates, and repetitive refactors.
Team structures are already shifting. Some organisations are creating platform teams that maintain agent configurations, prompt libraries, and review standards. Others are embedding agent specialists into product teams. The skills needed for AI project management, including evaluation, risk assessment, and workflow design, are becoming relevant to engineering managers who never expected to manage non-human contributors.
The broader business context matters too. AI adoption is not limited to software teams. Organisations are applying AI to paid search management now that Google Ads runs more on AI, to content operations and SEO planning for independent brands, and to AI visibility and search discoverability. Software teams are part of a wider shift in how digital work is planned, executed, and measured.
Even industries far from software are feeling the pull. Exhibition stand design in Hannover now involves AI-assisted visualisation and project planning. Indian entrepreneurs navigating GST registration and business loans are encountering AI-driven advisory tools. Automotive accessories are being shaped by futuristic technology, including AI-assisted design and testing. The common thread is not the specific industry. It is the shift from manual execution to supervised automation.
Where current agents still struggle
Context windows are larger than they used to be, but they are still finite. A large monorepo can exceed what an agent can hold in working memory, and context compaction can lose important details. Agents are also poor at architectural reasoning that spans multiple services, teams, and time horizons. They can optimise a function but struggle to decide whether the function should exist at all.
Debugging remains difficult because the root cause is often outside the code the agent is looking at. A failing test may be caused by a configuration change, a network issue, or a data problem in a system the agent cannot access. Agents are good at following a stack trace. They are less good at questioning whether the stack trace is pointing at the real problem.
Autonomous decisions are unreliable in proportion to their scope. An agent that refactors a single component with good test coverage is reasonably trustworthy. An agent that redesigns a database schema without understanding the downstream reporting queries is dangerous. The reputational and business risks that arise when a CEO’s personal profile becomes a liability have a parallel in engineering: a single unreviewed agent-generated change can become a public incident.
| Task | Agent reliability | Human oversight required | Realistic example |
|---|---|---|---|
| Boilerplate generation | High | Low: spot-check conventions | Scaffolding a CRUD endpoint with existing patterns |
| Test writing | High | Medium: review assertions and fixtures | Adding integration tests for validation and auth failures |
| Bug fixing with clear reproduction | Moderate | High: verify root cause and side effects | Fixing a token expiry calculation in an auth service |
| Legacy refactoring | Moderate | High: preserve hidden contracts | Splitting a monolithic React component without breaking analytics |
| Dependency upgrades | Moderate | High: read changelogs and test migration paths | Upgrading a major framework version across a monorepo |
| Architecture decisions | Low | Very high: human judgement and domain context | Choosing between event-driven and request-response integration |
| Production incident response | Low | Very high: live systems and incomplete information | Diagnosing a cascading failure under time pressure |
Table 3: Reliability is task-dependent. The same agent that excels at test scaffolding may be unsafe when given architectural authority.
How developers should adapt their skills
The developers who benefit most from agentic coding are not the ones who type the fastest. They are the ones who can define a problem precisely, evaluate a plan, review a diff, and recognise when a plausible solution is actually wrong. Those skills were always valuable, but they were often hidden behind the act of writing code.
Three capabilities deserve deliberate practice. First, specification writing: the ability to describe constraints, acceptance criteria, and non-goals in a way that an agent can act on. Second, code review at speed: reading a diff for semantic correctness rather than style, and spotting the one line that changes behaviour in a subtle way. Third, verification design: knowing which tests and checks would actually catch a regression, and which ones merely create the appearance of safety.
Developers should also learn how to constrain agents. A prompt that says “make this better” invites chaos. A prompt that says “preserve the public API, do not add dependencies, and run the existing test suite” gives the agent a boundary to work within. That is not a soft skill. It is a form of engineering judgement expressed in language.
The next generation of software engineering
The most likely future is not a world without programmers. It is a world where programming is more supervisory, more verification-heavy, and more focused on system design than on syntax. Agents will continue to improve at the mechanical parts of software development: writing tests, updating dependencies, migrating APIs, and fixing well-understood bugs. The human role will concentrate around ambiguity, architecture, risk, and the judgement calls that cannot be reduced to a prompt.
The tools will keep shifting. Some agentic IDEs will consolidate. Some terminal agents will become platforms. Cloud development environments will make autonomous execution more practical. The creative AI tools that generate video and visual content will continue to influence how developers think about multimodal models, while e-commerce teams preparing WordPress sites for peak traffic events such as Black Friday will benefit from agents that can audit performance, test checkout flows, and update content at scale. The AI search agencies emerging in New South Wales and elsewhere hint at a broader shift: software is increasingly written to be understood by machines as well as humans.
The developers who thrive will be those who treat agents as capable but fallible collaborators. They will give them clear goals, bounded permissions, and meaningful validation. They will review the diff, not just the demo. They will understand that the future of programming is not about removing the programmer. It is about changing what the programmer is for.
Use the key points in this guide to understand the topic and make more informed decisions.
This guide is researched and edited using relevant documentation, reliable sources and publicly available information.
Was this guide helpful?
Your feedback helps us improve future guides.