Back to blog

Blog

Three mental barriers that limit the potential of coding agents

Productivity with coding agents depends not only on their speed, but on our ability to delegate larger blocks of work with better instructions, tests, and evidence.

Published
  • AI
  • Agents
  • Productivity
A professional observing as a coding agent connects tasks, tests, and evidence into a complete workflow

AI is not always the bottleneck.

Quite often, we are. We still work with coding agents as if they were simple assistants that require constant supervision. We ask for a small change, watch every step, check the result immediately, and intervene again.

The agent may move faster, but our process still has the same constraint: our attention.

Over time, I have identified three mental barriers that have significantly changed the way I work once I started breaking them down. They all share the same idea: intervene less during execution and evaluate the result more effectively.

1. Stop reviewing every line of code

At first, I constantly reviewed what the agent generated. I followed changes almost in real time, opened every file, and tried to understand every decision before allowing it to continue.

It looked like a responsible way to work. In practice, I had made myself part of the execution loop. The agent could not finish a task without requiring my continuous attention.

Now I try to define the feature clearly, explain the constraints, and let the agent complete the work. I ask it to run the tests, resolve the errors it finds, and review its own changes before presenting the result.

Only then do I review it.

The change is not about trusting without judgment. It is about changing when I intervene: moving from supervising every action to evaluating a completed block of work.

This also changes the focus of the review. Instead of asking whether I would have written every line in exactly the same way, I can focus on more important questions:

  • Does the solution meet the objective?
  • Does it fit the project's architecture?
  • Does it introduce unnecessary risk or complexity?
  • Is it adequately covered by tests?
  • Will the result be easy to maintain?

Review is still essential. Doing it continuously is not.

2. Stop testing every small iteration

I also used to open the browser after almost every change. We modified a component, and I tested it. We adjusted a flow, and I walked through it again. An error appeared, and I returned to the agent to request a fix.

Each check looked small, but it created an interruption, a loss of context, and another restart. The cost was not only the time involved. It was the repeated fragmentation of my attention.

Now I try to make validation part of the assignment itself.

If the agent can run the application, it can also navigate it, walk through the affected flow, inspect states, read logs, and detect visible errors. It can run automated tests and provide screenshots, videos, or any other evidence showing what it validated.

I perform functional validation when there is actually something complete to validate.

Evidence is what allows us to expand autonomy without turning the process into a black box. I do not need to watch everything if I can clearly verify:

  • what changed;
  • which tests ran;
  • which journeys were validated;
  • what the visual result looks like;
  • and which limitations or questions remain open.

Delegating the initial verification does not remove human responsibility. It prevents that responsibility from becoming micromanagement.

3. Stop waiting for the perfect plan

Often, the blockage is not development but deciding what to do.

Before starting, we want to understand every implication, find the ideal architecture, and eliminate every uncertainty. That analysis can be valuable, but at some point it stops reducing risk and starts delaying learning. Besides, the hard part of a product continues after the first version works.

When that paralysis appears, I use AI to structure my thinking. I ask it to question me until it has enough context, then propose several approaches with their benefits, risks, and trade-offs.

That does not mean handing over the decision. It means using AI to explore the problem space faster.

A good agent can help us uncover requirements we did not express, challenge assumptions, compare alternatives, and turn a vague idea into an executable first plan. It can also build a small version that lets us learn before committing to a more ambitious solution.

AI does not replace thinking. But it can help us move past a blockage and accelerate that thinking dramatically.

From lines to features, and from features to flows

These three barriers reflect an evolution in the size of what we delegate.

First, I reviewed lines of code.

Then I started reviewing complete features.

Now I try to delegate broader flows, modules, or problems: not just implementing a screen, but walking through the entire process; not just fixing an error, but reproducing it, finding its cause, solving it, and providing evidence that it is gone.

Each step reduces the number of times I need to intervene. It also makes clear context and a shared definition of done more important.

The unit of delegation grows when the control mechanisms grow with it.

Autonomy needs an infrastructure of trust

Granting autonomy does not mean writing a longer prompt and hoping for the best. Delegating larger blocks requires boundaries and quality signals.

In my experience, four elements matter especially:

1. Clear instructions. The objective, scope, constraints, and acceptance criteria need to be sufficiently defined. 2. Useful tests. Tests let the agent detect regressions and iterate without depending on a human check at every step. 3. Verifiable evidence. Screenshots, videos, logs, and test results make the final state visible without forcing us to reconstruct the whole process. 4. Appropriate checkpoints. Some decisions are easy to reverse; others affect architecture, data, or users. Autonomy should match the level of risk.

These mechanisms do more than control the agent. They also improve the way a team defines and validates work.

Intervening less does not mean disappearing

The goal is not to remove the person from the process. It is to reserve their attention for the moments where it creates the most value.

We remain responsible for defining the problem, providing context that does not exist in the repository, choosing between meaningful alternatives, and deciding whether the result solves a real need. We should also intervene when a decision has consequences that are hard to reverse or when the evidence is insufficient.

The difference is that every routine step does not need to become a manual approval gate.

An agent should be able to advance autonomously while the work remains within clear boundaries. Our involvement should concentrate on decisions, risks, and evaluation of the result, not on accompanying every command.

Trust is built by expanding the margin

Productivity does not increase only because AI writes code faster. It increases when we can give it more autonomy, supported by better instructions, tests, and evidence.

That trust does not appear all at once.

It is built by starting with constrained tasks, checking the quality of the results, and gradually widening the margin of autonomy. Along the way, we also learn which context the agent needs, where it tends to make mistakes, and when our involvement is genuinely useful.

Perhaps the most valuable question is not how to make AI write code even faster, but this one:

What would need to change in the way we work before we could delegate the next complete block?

The answer often reveals that the next bottleneck is not the model. It is our instructions, our tests, our validation mechanisms, or our willingness to stop supervising every step.

Have a project in mind?

Let’s turn your idea into a product that works

If this article connects with a challenge you are facing, tell me about the context. I’ll reply with a clear first assessment and sensible next steps.

Tell me about your project