For much of our first year with AI, our engineers got faster and our delivery didn’t.
We bought the tools. Engineers built their own setups. We wrote skills for tasks we thought we could automate. But features still got held up by unclear requirements, repeated discussions and code waiting for review. Generating code faster hadn’t removed those delays.
We’ve been using AI agents across our projects at Radency for about two years, inside everyday delivery on client software. The meaningful improvements came in the second year, when we changed what we agreed before implementation, which instructions agents followed, and what reviewers had to decide.
Examples from our projects
A repeatedly postponed custom form builder
A pull request was ready for release in 2.5 weeks
What the result covers: time to a release-ready pull request, not production deployment
A layout change requested after a demo
The new UI was implemented by the next day
What the result covers: a change to the presentation layer; the underlying models and API were already in place
Getting there involved failed experiments, substantial preparation and a review process we had to rethink once AI started producing more code.
01 Before the code
A feature we postponed for a year, built in 2.5 weeks
A custom form builder had been pushed back release after release. When we approached it with the revised workflow, it took 2.5 weeks to have a pull request ready for release.
Previously, a feature began with a short user story: a description and acceptance criteria. The product manager couldn’t see all the implications for the existing platform, so details emerged during implementation. Developers asked questions, requirements changed, and the team went through another round of discussion.
We moved more of that thinking ahead of implementation:
We configured an AI prototyping tool to follow our UI guidelines, giving the product manager something to examine before the requirements were finalized. The team reviewed the prototype together, asked questions and captured the discussion.
The developer then combined the design, meeting notes and references to the existing codebase into an implementation plan or architecture decision record (ADR). That went back to the product manager to finalize the requirements.
Only then did the agent produce the first implementation, with the developer reviewing and adjusting the algorithm.
The agent also had shared instructions describing the project’s recurring code patterns, conventions and architecture. These were saved as project skills: reference material explaining how an implementation should fit the system.
By the time code was being generated, more of the questions that used to interrupt development had already been discussed.
02 After the demo
A layout change the client asked for, live the next day
On one project, the client saw the application and realized the layout didn’t match what end users expected. A single grid needed to become a continuous feed of entities.
The models and API were already in place, so the change could stay in the presentation layer. The team had implemented the new layout by the following day.
Previously, feedback meant collecting notes, holding planning meetings, creating and assigning tasks, then preparing another demo.
Now each feature has a consistent set of working assets: the task description, prototype and implementation plan. Feedback updates that plan. With the existing context available, the agent can draft the implementation from the meeting recording.
We also cleared the CI/CD path so changes could reach staging automatically. The developer reviews the code; the product manager checks the application.
Before
Feedback collected as notes
Planning meetings to agree the change
Tasks created and assigned
Now
Task description, prototype and plan kept for each feature
Feedback updates the implementation plan
Agent drafts the change from the meeting recording
Changes reach staging automatically through CI/CD
Scope of the example
The scope is important here. This was a contained UI change, with no need to alter the underlying models or API. The example shows how quickly a team can implement feedback when the affected parts of the system are clear.
03 The review queue
Pull requests sat for days, now they merge the same day
Writing code faster created another problem. More pull requests arrived, and review became the slow part.
Some sat for days under long comment threads. The same arguments kept returning: where a file belonged, which service should own a responsibility, why existing code had been duplicated.
Each engineer’s agent had a slightly different understanding of the project. Reviewers were spending time correcting those differences after the code had already been written.
We made two changes.
First, we described the rules around each service and committed them alongside the code, so everyone’s agent could work from the same reference.
Second, before starting a feature, two or three people discussed the approach and recorded their decisions in an ADR. The agent then worked from that agreement.
The change that mattered
The technical discussion still happened. It happened before implementation.
Before
Pull requests waited for days under long comment threads
The same arguments kept returning: file placement, service ownership, duplicated code
Each engineer’s agent understood the project differently
Reviewers corrected the differences after the code was written
After
Rules for each service committed alongside the code
Two or three people agree the approach and record it in an ADR
Every agent works from the same reference and agreement
Pull requests usually merge the same day
Move the design discussion earlier
Earlier
Short user story
Produce implementation
Debate approach in review
Correct the code
Revised
Agree on the approach
Record the ADR
Generate implementation
Review against the agreement
Marked stages are where the design decisions get made.
Simplified sequence of decisions and work. This is not a measured timeline.
The ADR was the change that made the biggest difference to review time. Reviewers could assess a change against an agreed approach without reopening the design discussion in every pull request.
Pull requests that used to wait for days now usually merge the same day.
Senior engineers still have to exercise judgment. Agreeing on the approach earlier gives them less reason to revisit the same decisions after implementation.
04 Integration and migration
Integration and migration
Shared project instructions also helped when we needed to bring functionality into an existing system.
From our early work with Cursor, we had seen agents make better decisions when they had relevant code to work from. Starting from an empty project was harder: a generated application could look convincing while its structure needed substantial rework.
We invested in describing the destination. Dozens of project skills documented what different parts of our architecture should look like. With that shared configuration in place, bootstrapping a working module took one to two hours.
Integrating existing functionality
When we needed to bring pages from a React application into our system, the inexpensive option was to embed them in an iframe.
Instead, the agent created a new module from our architecture description, then extracted the business logic from the React pages and moved it into that module.
The migration took two hours, followed by two to three hours of testing and checking that nothing had been missed. We ended up with a module built on our own architecture.
Migration: moving the business logic into our module.
Testing & checks: checking the result and what might be missing.
Scope of the timing
There isn’t a clean before-and-after timing comparison for this case. What changed was the option we could reasonably choose: we could integrate the functionality properly instead of embedding the pages and living with that compromise.
Changing an application’s framework
We used a similar approach to move an application from Flask to FastAPI while preserving its structure.
We described the target architecture, identified the places where application logic depended on Flask, and recorded those dependencies in a Markdown checklist. The agent worked through that checklist over multiple iterations. Existing API tests let us check that the migrated endpoints behaved like the originals.
The whole migration took under two days. It wasn’t an especially complex application, and the tests were essential to validating the change.
Both examples depended on making the destination explicit and checking the result. The reported implementation times only make sense alongside that preparation and validation.
05 How we would start now
How we would start now
Getting to these changes took longer than it needed to. We spent time building elaborate setups before fixing the inputs they depended on.
This is the sequence we now follow with client teams.
Step 1: Watch the work before changing it
In the first week, we sit in on stand-ups, look at the tools engineers use and read how they ask agents for help.
We establish a baseline before offering advice, so there is something to assess the changes against.
A useful baseline should also show where features wait, what gets reworked, and how long review, testing and release take.
Step 2: Make the task clear before adding automation
The first working sessions focus on prompts: how engineers frame a task, what context they provide and how they assess the response.
We take 30–50 real prompts from the baseline and work through them with the team. A recurring problem is that a prompt describes an ambition at length without pointing to anything in the project that should guide the implementation.
A useful implementation prompt gives the agent a specific change and references to follow. One example from this work:
Implementation prompt
from a client project
Add a "Site lists" filter to the SearchForm (@components/search-form/SearchFormQB.tsx), next to the Search area selector. It already exists in the Advanced Query Builder (@pages/site-search/SiteSearchFilterBuilder.tsx), so reuse the SiteListsSelect component from there. It should be a label plus that select.
The useful ingredients are what to change, where to change it and which existing component to reuse. There is much less left for the agent to guess.
On one team, handwritten code dropped to roughly half of what shipped, after we worked on prompting and before we configured anything else. That told us the agent was taking on more of the implementation; delivery still needed separate assessment.
What didn’t work
We learned the importance of this order through a failed attempt. We had built roughly twenty task-automation skills for end-to-end tests, code review, database migrations and other scenarios.
They didn’t become part of the team’s regular workflow. Correcting their output cost more time than they saved, because the prompts feeding them were still inadequate.
These were different from the project instructions described earlier. They tried to automate activities; project instructions explain how the system is designed and how a change should fit into it.
Step 3: Give the team a shared setup and an agreed reference
We’ve seen engineers build personal setups with skills, MCP servers and plugins their teammates didn’t know about. Their individual metrics looked good, while delivery still dragged as the differences surfaced in review.
Our shared setup starts with project context: what the repository contains, how it is organized and where things live. Shared skills sit in the repository too. MCP connections give the agent access to GitHub, the task manager and documentation.
Personal setups
Skills, MCP servers and plugins teammates didn’t know about
Individual metrics looked good
Delivery dragged as the differences surfaced in review
Shared setup
Project context: what the repository contains and where things live
Shared skills kept in the repository
MCP access to GitHub, the task manager and documentation
Standards and conventions the team owns
We then document the standards, conventions and responsibilities within the project. Across 10–15 microservices, that takes a serious investment of engineering time.
The team has to own those rules. AI-generated instructions need careful review, and concise, agreed guidance has worked better for us than large volumes of generated text. Keeping this material in the repository also makes it easier to move the setup between agents as tools change.
For a team starting out, a practical approach is to choose a recurring type of work or a bounded part of the codebase. Document the rules and examples needed for that work, assign someone to maintain them, and decide how they will be updated as the system changes. That gives the team a manageable starting point and makes the maintenance responsibility explicit.
Step 4: Change what reaches the agent before implementation
For features with a user interface, we use a prototype to surface questions before requirements are finalized. For backend work, the engineer prepares an implementation plan or ADR for review.
By the time implementation starts, the agent has:
- A description of the feature design.
- Functional and non-functional requirements.
- Files that help it navigate the project.
- MCP access to the relevant tools and documentation.
Architecture and data modeling remain the team’s responsibility. Our attempts to hand those decisions to the agent produced designs that needed correction, even with the most capable models we used.
The engineer also decides how much work to delegate at once. On a new project or module, we’ve found it useful to give the agent high-level requirements and let it work through the details. Inside a live system, smaller tasks give us more control over changes where a wrong assumption is more costly.
06 Where the delay went
Review got faster, QA became the constraint
Once review improved, QA started struggling with the number of features arriving in each release.
On modernization work, implementation could take hours while testing and adjustments still took days. Validating a new API could take days to a week.
More generated code gave us more to review. Faster review gave QA more to test.
Where a feature waits
Year one
Requirements
Plan or prototype
Implementation
Review
QA
Release
Now
Requirements
Plan or prototype
Implementation
Review
QA
Release
Marked stages are where features spent the most time waiting.
Faster implementation didn’t shorten the path on its own. It moved the queue further along it.
We haven’t reached a point where every part of delivery speeds up together. Each improvement changes the workload somewhere else.
That is why we keep looking at the whole path from requirements to production. The amount of code an agent writes describes one part of it.
To assess what AI adoption has done for your roadmap, follow a feature from its initial requirements through to production, including the waiting, rework, review and testing along the way.
07 Over to you
Walk one late feature back through its stages
You can use the same perspective to examine your own delivery process.
Choose a recent feature that took longer than expected and walk through it with the people who built, reviewed and tested it.
Five questions to take to your team
Separate time spent doing the work from time spent waiting for a decision, review, test or release.
02
What became clear too late?
Identify requirements or dependencies discovered after implementation had started.
03
Which decisions came back in review?
Look for disagreements that could have been resolved before the code was written.
04
What did the agent know?
Check whether it had the relevant project rules, existing examples and agreed implementation approach.
05
What happened after the first implementation?
Include rework, testing and release in the assessment.
Choose a recurring source of delay to address first. Then follow the next comparable piece of work through the same stages, including review and QA.
This gives you a concrete way to examine whether a change helps the team deliver, and where further work is needed.