You generated a feature in 20 minutes.
Three days later, it still hasn’t reached production.
The code exists. But the tests are failing, the review is waiting, and someone just noticed that the feature solves the wrong problem.
What actually got faster?
Writing the first version.
That matters. But users don’t use first drafts. They use working software.
Coding Is Only One Part of Shipping
Consider a simple feature: adding a discount code at checkout.
AI can quickly generate the input, validation logic, and API endpoint.
But you still need answers:
- Can customers combine discounts?
- What happens when a code expires during checkout?
- Does the discount apply before or after tax?
- Can someone reuse a single-use code?
A feature can look finished while these questions remain unanswered.
AI can turn assumptions into code faster than you can notice them.
Faster Generation Can Create a Bigger Queue
Imagine a team producing twice as many changes while its review capacity stays the same.
More code arrives. More code waits.
Large changes make this harder. A reviewer must understand the intent, inspect the implementation, and check how it affects the rest of the system.
Generating another feature doesn’t clear that queue.
Sometimes, the most useful next step is helping an existing change reach production.
Passing Tests Doesn’t Mean You Solved the Right Problem
Suppose you ask AI to implement discounts, then ask it to write tests.
It might assume that discounts can be combined—and write tests confirming that behavior.
Everything passes.
The business wanted one discount per order.
The problem is that the implementation and the tests can share the same wrong assumption.
Define the expected behavior before generating either.
Five Ways to Turn Faster Coding Into Faster Delivery
1. Describe “done” before asking for code
“A discount feature” is vague.
“One valid discount per order, with expired codes rejected and the updated total shown before payment” gives you something concrete to verify.
Clear requirements reduce guessing and rework.
2. Ask for smaller changes
Avoid asking an agent to rebuild checkout in one request.
Start with one behavior. Inspect it. Verify it. Then move on.
A smaller change is easier to understand, review, and fix.
3. Review the assumptions first
Before examining every line, ask:
- What decisions did the AI make?
- Which existing behavior changed?
- What happens when something fails?
Finding a wrong assumption early can save more time than polishing the code built around it.
4. Test the awkward cases
The happy path is only the beginning.
Try an expired code, two quick submissions, a failed request, and a customer refreshing during checkout.
Choose tests based on what could hurt the user or the business.
5. Measure delivery, not generated code
Lines of code and completed prompts don’t tell you whether customers received something useful.
Track how long changes take to reach production, how often they need rework, and what breaks after release.
A smaller feature that works is more valuable than a larger feature waiting for approval.
Try This on Your Next Feature
Write three acceptance criteria. Ask AI for the smallest implementation that meets them. Check its assumptions. Test one important failure case.
Then follow the change all the way to production.
AI can shorten the coding step. To shorten delivery, you also need to address whatever keeps the finished code waiting.
Where does your work get stuck most often: requirements, review, testing, or deployment?
Top comments (1)
This is a great follow-up to your "tests pass" post — the discount-code example is the clearest illustration I've seen of the shared-blind-spot problem, because it's not abstract: "combined discounts allowed" is exactly the kind of assumption that feels like an implementation detail right up until it's a business rule someone violated in production.
To answer your question directly: for me it's requirements, by a wide margin — and I don't think that's unique to AI-assisted work, AI just collapsed the step that used to create natural friction (typing slowly gave you time to notice you were guessing). Your "describe done before asking for code" rule is really a forcing function for that friction to happen on purpose instead of by accident.
I've actually started using a tool that treats "describe done" as a structural requirement rather than a habit: speckeep, a spec-driven workflow for coding agents. It forces a spec with explicit acceptance criteria before any code gets written, and every task has to carry a literal Proof: line pointing to a real test before it can be marked done — a CLI gate fails by name if that's missing. It's the same five rules you listed, just enforced by an exit code instead of discipline you have to remember to apply every single time. Your rule #3 (review assumptions before line-by-line review) maps almost exactly onto its plan.md step.
Given this is now your third well-developed post on the same theme (tests-pass, local-decisions-vs-system, and this one), the underlying methodology is solid enough that a few different monetization paths seem realistic, roughly by effort required:
I'd probably start with #1 or #2 since they're nearly zero marginal cost given what you've already written, and treat #3/#4 as things to test once you see which piece of content actually gets people asking follow-up questions.
Great piece — this series is becoming a genuinely useful reference to point people to.