
One AI Can Write the App. It Still Won't Ship.
Building real applications with AI changed my view fast. One strong model can generate a lot of code, but dependable delivery still needs structured disagreement, explicit review roles, and human oversight.
On this page
I have now built more than ten complete applications with AI doing most of the heavy lifting. Not toy demos. Real applications. The kind you actually want to use in daily life, not just record in a screenshot and post online.
Some of them were productivity tools for my own work. Some were financial tools to manage my portfolio, personal expenses, and investment planning. Some were hobby tools for astrophotography, where timing, precision, device coordination, and plain old physics do not care how confident your AI sounds. Some were automation tools for reporting and repetitive work. And on the professional side, I also work around AI-driven systems in automotive environments where reliability is not a decorative feature. It is the product.
After enough repetitions, I reached the same conclusion every time.
You cannot depend on one AI model to take you from idea to production-quality application.
That sentence annoys people because it sounds less exciting than the current sales pitch. Everyone wants the story where one model takes a prompt, builds the system, writes the code, fixes the bugs, polishes the UX, runs the tests, and hands you something ready to ship. I wanted that too. I tried to make it true. I used the best models I could get my hands on. Claude. ChatGPT. Gemini. Codex. Even GLM. Different strengths, different personalities, same failure pattern.
The dangerous part is the confidence
The dangerous part is not that they make mistakes. Engineers make mistakes too.
The dangerous part is the confidence.
An AI will generate in ten minutes what used to take a team days or weeks to draft. Architecture, data models, UI structure, services, tests, refactors, documentation. It does all of this at a speed that overloads your judgment. You do not have time to inspect every line with the same care you would apply to a human engineer whose work arrived gradually. So you start trusting the momentum. You start trusting the volume. You start trusting the tone.
That is usually where the trouble starts.
The output looks complete long before the system is actually correct.
This is not just my own frustration talking. OpenAI explicitly says hallucinations remain a fundamental challenge for large language models, and recent research has shown that models often fail to reliably correct their own reasoning without external feedback. A 2024 survey on automated correction makes the same point from another angle: practical correction systems usually need feedback from outside the model, not just the model talking to itself. OpenAI
Self-review is usually style review
That matches what I saw over and over again.
If a model designs something in a flawed way, then reviews its own design, it usually does not perform a real review. It performs a style-preserving edit. It moves furniture around inside the same wrong house. You may get cleaner naming, better comments, maybe a slightly improved function boundary, but the deeper mistake often survives because the model is still trapped inside its own framing.
I learned this the expensive way, in tokens, time, and false confidence.
My actual workflow became absurdly manual.
I would start with one model and brainstorm hard. Push it. Challenge it. Iterate three or four times. Get the architecture, the implementation plan, the data flow, the edge cases, the UX approach, the testing plan. Then I would take that entire output and dump it into another model and say: review this properly.
And then the second model would tear it apart.
Not because it was smarter in every way. Because it was different.
Different blind spots. Different instincts. Different defaults. Different areas of suspicion.
So I would take that criticism back to the first model and ask, in plain human frustration: how did you miss all of this after telling me this was solid? Then it would apologize, rewrite, and "fix" the design. Then I would carry that back to the second model. And the second model would find a new layer of problems. Then sometimes I would bring in a third model, and suddenly both of the earlier ones looked shaky.
I went through this loop more than eighteen times on one product.
That is when I stopped thinking about prompting as the main problem and started thinking about orchestration.
Production work needs structured disagreement
The real issue is not that models are useless. The real issue is that production work needs structured disagreement.
If you use one model from start to finish, you get speed, but you also get correlated error. The planner and the reviewer are basically the same mind wearing different hats. That is a bad setup if you care about architecture quality, failure handling, product logic, or long-term maintainability.
What worked better for me was assigning roles across models.
One model explores. One challenges the assumptions. One focuses on implementation. One hunts for edge cases. One acts like a brutal reviewer. One thinks like QA. One thinks like a user. One thinks like an operations engineer who will be paged at 3 a.m.
Once I started doing that, the quality went up. Not because any single AI became trustworthy, but because trust moved from the model to the process.
That distinction matters.
Benchmarks do not close the delivery gap
Benchmarks are getting better, and that is useful. SWE-bench Verified, for example, is a human-validated subset of 500 real software issues used to evaluate coding systems, and it explicitly includes everything from simple agent loops to review-oriented systems. That is a step in the right direction. But even a better benchmark does not remove the gap between solving a repository task and shipping a dependable product that deals with ugly data, changing requirements, weak assumptions, and real users. SWE-bench Verified
That gap is where most of the pain lives.
In real applications, the hardest failures are rarely the glamorous ones. They are not "the model forgot semicolon number 84." They are structural. Wrong abstraction boundaries. Wrong recovery logic. Wrong assumptions about state. Wrong interpretation of business rules. Wrong treatment of missing data. Wrong trade-off between responsiveness and correctness. Wrong confidence in a generated test suite that only validates the happy path.
This is why "just break the task into smaller tasks" is not enough. Yes, decomposition helps. Yes, planning helps. Yes, smaller tasks reduce context overload. But if the review loop is weak, then all you are doing is breaking a large hallucination into smaller, better-formatted hallucinations.
Reliability is an engineering problem
Even vendor guidance now frames reliability as an engineering problem, not a prompt trick. OpenAI's accuracy guide says optimizing LLM systems is hard and pushes an iterative cycle of evaluation, diagnosis, context optimization, RAG, fine-tuning, and re-evaluation. That is a very different message from the fantasy that one good prompt solves everything. OpenAI Developers
My current view is simple.
AI is already good enough to build serious applications.
It is not yet good enough to be left alone while doing it.
For the next couple of years at least, the human role is not disappearing from serious software work. It is changing. Less manual typing. More system design. More review strategy. More validation. More orchestration. More forcing the right kinds of disagreement before bad decisions harden into code.
That is also why I am now interested in building tooling around this idea.
Not another chatbot wrapper. Not another "type one sentence and get an app" toy.
I mean a real working environment where multiple AIs can operate as a team with explicit roles: architect, reviewer, implementer, tester, product critic, maybe even program manager. A place where disagreement is not noise. It is part of the design. A place where the output of one model becomes structured evidence for the next. A place where the goal is not maximum token velocity, but dependable delivery.
Because that is the lesson these projects kept teaching me.
What I trust now
The future is not one super-model doing everything perfectly.
The future, at least from where I am standing, is controlled orchestration: multiple strong models, different strengths, explicit roles, hard review gates, measurable checks, and a human in the loop who knows that confidence is not the same thing as correctness.
That is the difference between an AI demo and an AI product.
And if you have been building real things with these tools, you probably know exactly what I mean. The first wow moment comes fast. The second phase is frustration. The third phase is where the real work starts: designing a process that makes the models useful without letting them quietly fool you.
That is the phase I care about now.
Not how to make AI produce more code.
How to make it produce work you can actually trust.
Hussam Ahmed
Building large-scale systems by day, exploring the universe by night.
Keep reading
Claude Code Dynamic Workflows: A Practical Guide to the New Orchestration Feature
A practical guide to Claude Code dynamic workflows: what the new feature does, when to use it, how to trigger it, and how to design workflows that split, verify, loop, and synthesize real engineering work.
Read articleThis Loop Keeps Finding Bugs My AI Swears Don’t Exist
Fresh sessions turned out to be a better reviewer than another round in the same chat. A small planner-reviewer-fixer loop cut my AI design blind spots faster than better prompting ever did.
Read articleFeatured project
See the Map Knowledge Graph reason about a live driving scene.
An interactive simulator with scenario switching, graph traversal, and step-by-step decision playback.
Follow new posts
I share build logs on AI systems, execution, and astrophotography as they ship — no schedule, only substance.