In this post we will review how I use an AI coding agent to get at least 10 times more development work done. The largest improvement comes from combining small tasks, reusable agent skills, and continuous review.
A feature rarely ends with writing a function. There are callers to update, configuration to connect, tests to adjust, deployment files to check, and sometimes a user interface to change. All these steps take time. An agent that can work inside the repository can handle much of this work while I concentrate on the decisions.
Looking back at my last two weeks of development and agent conversations, the interesting part is the variety: investigating failures, understanding unfamiliar code, comparing performance options, updating interfaces, checking deployments, and improving tests. Some conversations start with a stack trace. Others start with a selected function and a short question. The agent is part of the daily engineering work.
For my daily work, I estimate the improvement at at least 10x compared with doing the implementation manually. This is my experience, rather than a controlled benchmark. Counting commits or generated lines would not prove it. The useful result is how much working, reviewed functionality I can complete.
Delegate a Complete Task
With an agent I can delegate a complete, limited task:
"Find how this value reaches the response. Add the new field using the existing pattern, update the relevant callers, and verify the affected behavior."
The agent can search the repository, inspect the code, edit multiple files, and use tools to check its work. I review the result and decide what comes next.
This removes many small interruptions. I spend less time navigating between files and more time thinking about what the application should do.
Start with the Problem
The most expensive mistake is implementing the wrong solution quickly.
One recent investigation started with a service that kept restarting. I asked the agent to inspect the running instance and its memory usage. Then we examined the expensive components, considered alternatives, and worked through the implications before changing the code.
At one point, lazy loading looked like a possible improvement. I asked the agent to check how the loaded data was actually used. If the application eventually reads all the fields anyway, lazy loading may add complexity without removing the expensive work.
We chose a smaller change: process database rows individually instead of holding all the raw rows alongside the decoded objects. Then I asked for tracking so we could understand the remaining cost.
Even there, I challenged the proposed design. Could the existing tracking format hold the information? Did we really need another structure? Would the interface still display it correctly?
These questions are part of the work. The agent makes it much faster to investigate the answers and implement the decision.
I often start with a simple boundary:
"Check only. Do not change anything."
Once I understand the findings, I give the next instruction. This is particularly useful when investigating a running environment or code I do not yet know well.
Stop Repeating the Coding Guidelines
In my earlier post, GO Coding Guideline as Agent Skill, I explained how I converted my coding standards into a reusable skill:
GO Coding Guideline as Agent Skill
Before creating it, I kept asking for the same corrections: follow the naming conventions, reuse existing utilities, simplify the design, use the correct logging, and put the tests in the expected location.
Now these instructions live under .agents/skills/go-guidelines/.
The skill first tells the agent to inspect neighboring code. It then points to separate reference files for style, functions and types, design, errors and logging, runtime safety, and tests. The agent reads the relevant references for the task.
This is useful because the standards include much more than formatting. They cover ownership of state, error handling, configurable limits, lock cleanup, and avoiding secrets in responses or logs.
A skill does not guarantee correct code. However it reduces the amount of repeated explanation and makes the first implementation much closer to what I expect.
I've also added skills for other repeated parts of the workflow.
A Code Review Skill
The code-review skill defines how to review a named branch, from preparing the working tree to producing actionable comments.
It requires a clean working tree and updated branches before reviewing the changes against the development branch. It applies the coding guidelines, checks nearby conventions, and looks for unnecessary complexity.
One particularly useful instruction is checking everything in memory that can grow: caches, collections, buffers, queues, payloads, and concurrent work.
Notice that creating a map with an initial capacity does not limit its growth. A cache with an expiration time can also grow too large if new entries arrive faster than old entries expire. The review should check the actual limits and what happens when they are reached.
The output is deliberately short. Each finding identifies the problem, location, impact, and a concrete fix. If there are no findings, the skill does not create a report file. It also returns to the development branch when finished.
In this workflow, the review skill does not run tests; CI/CD handles them. Implementation checks are a separate part of the task. Keeping this explicit avoids confusing a code review with evidence that the application passed its tests.
A Skill for New Source Files
The add-new-source-files skill handles a small but annoying detail: new source and test files must be staged before the task is finished.
It tells the agent to stage only the source and test files it created, exclude temporary artifacts and unrelated changes, and verify the staged file list. It does not commit unless requested.
Why create a skill for something so simple?
Because a repeated omission is still expensive. A change can look complete in the editor while a required new file is missing from the staged changes. A short instruction makes this part of finishing the task.
A Cloud Credentials Skill
The use-aws-credentials skill records where the agent should load temporary cloud credentials before using the CLI or SDK. It also includes instructions to make the target context and namespace explicit for the relevant infrastructure commands.
The skill points to a local credentials file rather than embedding credential values in its instructions. This saves me from explaining the local setup in every session.
Notice that knowing how to load credentials does not establish that an infrastructure change is appropriate. I still need to understand the target environment and the operation being performed.
The broader idea is simple: write down recurring setup once, then reuse it.
Give the Agent Behavior, Not Just a Feature Name
A useful prompt describes what the user should experience and which behavior must stay consistent.
For example, when asking for multiple views of a graph, the important details include whether each view has its own selected series, whether zoom is shared, and which views can be removed. "Add another graph" leaves all these decisions to the agent.
I give those rules, let the agent implement them, then refine the interaction. Sometimes the next instruction is simply to reuse the existing controls. I do not need a new design language for one feature.
The same applies to backend work. Initializing a component without required data and failing to refresh an already working component are different situations. I ask about both paths. A retry mechanism is only useful if its behavior is correct in each one.
Use the Agent to Build the Comparison
Another useful pattern is asking the agent to create the experiment that will help me decide.
In one conversation, the question was whether an existing cache still justified its complexity. Removing it immediately would have been guessing. We worked on a comparison with a switch that preserved the current default behavior, configurable cases, and a result summary.
I kept asking practical questions: Is there enough coverage to decide? Where does the evidence come from? Can the test use the existing APIs and reduce manual setup? What does a matching result actually mean?
The agent can handle the code needed to make that comparison possible. I still need to decide whether the cases represent real usage and whether the evidence supports removing the cache. Creating a comparison is not the same as proving an optimization worked.
Verify the Running Application
A test passing locally is useful, but sometimes my next question is:
"Is it working inside the running container?"
A dependency change can affect the build, the image, startup, memory usage, and concurrency. I use the agent to check these connections instead of stopping at the updated function.
For a performance-sensitive component, I may ask it to compare alternatives, broaden the sample set, check short and long inputs, and examine behavior with multiple requests. If a test fails after the change, I ask which input failed and what happens next in the application.
A wrong intermediate result matters because of the behavior it triggers downstream. Finding that connection is more useful than changing an assertion until the test passes.
Make Tests Represent Real Behavior
I also use the agent to improve what the tests actually prove.
In one task, I asked for a black-box test that sends several realistic events through the application and examines the exported result. Rather than inventing a convenient input, I asked the agent to use a representative event from local diagnostics as an embedded test resource.
This helps exercise the mapping and processing together. It can expose assumptions that a test of one helper function would miss. Any captured input should be checked and stripped of sensitive values before it becomes a fixture.
For configured limits, I ask for an explicit scenario that reaches the limit and checks what happens next. For a bug, I ask why the existing test did not catch it. Passing tests are more useful when I understand which behavior they cover.
Use the Agent for the Work Around the Code
Development also includes explaining what happened and what someone should do next.
I use the agent to connect interface fields to the data the code actually reads, summarize an authentication failure, and prepare an explanation of the next diagnostic steps. It can turn a long investigation into a short answer grounded in the implementation.
I review these explanations just as I review code. The useful result is an accurate description with clear next steps. Collecting the relevant facts is often the slowest part, and the agent can help with that too.
Keep the Design Simple
Some of my most useful follow-up instructions are short:
"Can we reuse this?"
"This looks duplicated."
"What happens if there is no cached data?"
"KISS. What do you recommend?"
An agent can generate more code very quickly. I want it to help me maintain less code where possible. I also ask it to reuse existing libraries, keep configuration together, and avoid unrelated edits.
When the task grows, these small corrections keep it focused. They also explain why technical experience still matters: I need to recognize when a suggested solution creates more problems than it solves.
Continue in a New Chat Without Starting Over
Long investigations can accumulate many decisions. Before starting a new chat, I ask for a text summary with the information needed to continue.
The useful summary includes the objective, findings, decisions, changes, verification, and remaining questions. It should distinguish code that was edited from code that was actually deployed, and measured results from estimates.
This saves me from explaining the whole investigation again. It also gives the next conversation a clear starting point.
My Daily Agent Workflow
For most development tasks I use the following sequence:
- Point to the relevant code, log, screenshot, or running environment.
- Ask for an investigation when the cause or design is unclear.
- Choose a small implementation step and state the required behavior.
- Let the agent update the related code and configuration using the repository skills.
- Inspect the changes, question the edge cases, and request relevant verification.
- Continue with the next step or save a summary for a new chat.
I use the agent for explanations too. Understanding an unfamiliar subsystem, tracing a configuration value, or finding why a test missed a bug can save as much time as generating code.
"Done" needs evidence appropriate to the task. That might be a passing test, a benchmark comparison, or a verified interaction. If a check could not run, I want that stated clearly.
Where the 10x Gain Comes From
The gain adds up across the entire task.
The agent searches for the existing implementation, follows the pattern across multiple files, updates callers and test support, and handles repetitive edits. The skills reduce repeated instructions and correction rounds. Small tasks keep review manageable.
The savings extend beyond implementation. The same conversation can move from a failure log to the relevant code, from a proposed change to its build implications, and from a test result to the next investigation. I spend less time collecting and moving the information needed for each step.
There is still work for me: deciding whether a cache belongs in the design, whether a new dependency is justified, whether a resource limit is sufficient, and whether the result actually solves the problem.
I discussed the risks in AI Agents Coding Bad Practices:
AI Agents Coding Bad Practices
An agent can make a wrong decision and then create more code to support it. Reviewing small changes helps me catch this before a simple task becomes a complicated subsystem.
Getting Started
Start with one repeated task you understand well. Give the agent a clear expected result and an existing example to follow. Review the changes.
When you find yourself requesting the same correction repeatedly, add it to a focused skill under .agents/skills/. Include when it applies, the steps to follow, and what a completed result looks like.
Then use the saved time to tackle the next task.
My experience is that an AI coding agent becomes far more useful when the repository contains the knowledge needed to work in it. With clear tasks, practical skills, and an experienced engineer reviewing the decisions, I can complete at least 10x more work in my daily development.

