Analysis
Is your AI-built app ready for real users?
A working demo is a start. Follow one booking journey through account permissions, interrupted requests, and recovery to decide what your first users can trust.
By Adi

The demo works. You can sign in, add a record, and watch it appear exactly where you expected. After the effort of getting that far, sharing the link feels like the obvious next step.
Then someone asks a small question: “Can I try it with my own account?”
That changes what you need to know. So far, you have watched the app work for someone who knows how it was built, which buttons to press, and which rough edges to avoid. Another person brings none of that knowledge. They may refresh halfway through, open an old link, or assume that a confirmation means something has actually happened.
Before releasing an AI-built app to real users, seek evidence that its essential journey works, permissions hold, failures offer an honest next step, and someone can detect and repair problems. These are starting checks. The release decision must also cover requirements specific to the data, actions, and people involved.
For a solo builder or small team, this does not require solving every future engineering problem. It requires being clear about what you are asking people to trust today.
Watch someone use it without your help#
Consider a fictional pottery studio with an app for booking workshops.
The first version looks convincing. A visitor chooses a Saturday class, enters their details, and sees a confirmation. The organizer can see the booking. There is a real achievement here: a complete idea has become something another person can use.
Before adding a waitlist, discount codes, or a more impressive homepage, ask someone to make a booking with invented details in a test environment. Give them the goal and watch quietly.
Can they find the class? Is the date unambiguous? Does the form explain an error without losing everything they entered? Can they finish on their phone, or using only a keyboard? After they return to the app, is the booking still there?
Inspect the saved record as well as the screen. A reassuring message is easy to display; the useful question is whether the intended booking exists with the right class and status.
This exercise checks more than whether a button works. It exposes the explanations you have been supplying in your head. If a person needs you beside them to understand whether they have a place, the app still has work to do.
Use a second account, then test what it must not see#
A working sign-in screen can create more confidence than it deserves.
Signing in establishes identity. Authorization determines what that identity may do. OWASP's authorization guidance makes that distinction and recommends checking permissions on each request, including access to individual records.
For the workshop app, create two ordinary test accounts and one organizer account. Use invented names and contact details. Account A should see its own booking. Account B should not gain access to A's details by opening A's booking link. Neither ordinary account should acquire the organizer's powers simply because an administration button has been hidden.
Ask the person reviewing the implementation to check the underlying requests too. A screen can conceal data while the system still sends it to the browser.
These are useful checks, not a complete security assessment. Before accepting private information or exposing sensitive actions, have someone with relevant security experience examine the actual access rules and data flows. Give that reviewer a concrete question: “Show what prevents one attendee from reading or cancelling another attendee's booking.”
AI can help trace those rules and propose tests. Its review is still evidence to examine. GitHub's responsible-use documentation warns that its coding and review agents can miss problems or suggest incorrect changes, and calls for human review and testing. The same checks matter for human-written code; AI assistance does not change what the attendee needs.
You do not have to personally become an expert in every layer. You do need to know where your confidence comes from and when it depends on someone else's expertise.
Illustrative workshop app
Signed in. Allowed in?
In this fictional workshop, account A owns booking 104. An authorized organizer can manage it. Account B can sign in, but must not read the booking. The server checks permission for this record request; hiding an interface control is insufficient.
Signed-in identity
Account B
Signing in identifies the account. The record still needs an access check.
Server decision
Request not sent
The server checks this account's permission for this booking.
Account A owns the booking. The organizer has explicit permission. Account B has neither.
View complete static diagram

Make the app explain an uncertain outcome#
Now change one condition. The booking reaches the server, but the response never reaches the visitor's phone.
The visitor sees a spinner. They wait, tap again, then refresh. From their side, these are reasonable attempts to finish. From the system's side, they may be several requests to make a booking.
This is why “show an error if something fails” is an incomplete requirement. The app may know that it lost a connection without knowing whether the booking succeeded.
AWS's guidance on safe retries describes this problem: a missing response can leave a caller uncertain whether an operation happened, while repeating the request can create an unwanted extra effect. One established approach is idempotency: arranging for a repeated attempt at the same operation to avoid producing that extra effect.
For the studio, the product decision is understandable without the terminology. One booking attempt should not become two bookings because the phone lost its connection. The visitor also needs a way to find the outcome, such as checking their bookings or using a reference that the support person can look up.
The implementation needs careful review: it must distinguish another attempt at the same booking from a genuinely new booking. Disabling the button while it spins is a useful interface detail, but it cannot settle what happened on the server.
There is another handoff to check. A booking might be saved even though its confirmation email fails. In that case, the person has a place and the notification needs attention. Recreating the booking to get another email would solve the wrong problem.
A useful failure message gives the reader a safe next action. “We couldn't confirm the result. Check your bookings before trying again” is more honest than declaring that nothing happened when the system does not know. The exact wording must match a status-checking path that actually works.
Illustrative workshop app
The booking exists. The reply disappears.
The fictional visitor sends one request. The server saves booking 104, but the reply is lost. The phone cannot confirm the outcome. A status lookup finds the original booking: one record still exists. Confirmation-email delivery remains unconfirmed and needs separate attention.
Ready to book
Visitor's phone
Ready
This is what the visitor knows, not the full server state.
Server record
0 bookings
Nothing has been saved yet.
Confirmation email
Not queued
There is no saved booking to notify the visitor about.
The visitor starts one booking attempt.
View complete static diagram

Ask for evidence that could disagree with the AI#
Suppose the agent reports that every test passed. Keep that result. Then ask what those tests were capable of finding.
A test can check that submitting the form produces a confirmation. If the same mistaken assumption shaped both the implementation and the test, both may agree while the visitor's problem remains unresolved. A passing check means more when someone has challenged its expected outcome.
For the workshop app, a focused release rehearsal could cover:
- An ordinary booking: follow it from the visitor's screen to the saved record and organizer's view.
- Another person's record: verify that an ordinary account cannot read or cancel it through either the interface or a direct request.
- An interrupted response: establish what was saved, what another attempt does, and how the visitor discovers the result.
- A failed notification: check that the booking remains correct and the organizer can identify the delivery problem.
Write the expected results before the agent implements the change. Ask a reviewer who did not make the implementation decisions to challenge them. For important boundaries, that reviewer needs relevant expertise; merely switching to another model does not establish correctness.
Run these exercises in an authorized test environment with invented data and controlled failures. Record which version was checked and any material differences from the intended live setup. A test using a pretend email service tells you something different from a successful delivery through the configured provider.
There will be other requirements for a real booking service, including capacity, cancellations, accessibility, and abuse controls. This rehearsal is a starting point for one journey, not a certificate that the whole app is safe to launch.
Rehearse the morning after a bad update#
Imagine a later update puts some bookings in the wrong class. The team restores the previous application version. The screen works again.
What happens to the bookings already changed?
Restoring application code does not, by itself, reverse changes in a separate database or recall an email already delivered. Recovery must account for those effects. AWS's rollback-safety guidance (PDF) also describes the compatibility problem: earlier software must still be able to work with state written by a newer version if rollback is to succeed.
For a small pilot, the recovery plan can be short, but it should answer real questions. How will the organizer notice incorrect bookings? Can new bookings be paused? Who identifies affected records, decides which class each person belongs in, and contacts them? How will a correction avoid damaging valid bookings made later?
A backup may help, but restoring an old snapshot can also remove legitimate work done since that snapshot. Have the recovery approach reviewed and rehearsed on test data. Do not discover its consequences during an incident.
Useful monitoring follows the user journey. An available homepage tells you little about whether bookings are being saved or confirmation messages are getting through. Record enough operational evidence to investigate those steps without copying private form contents or credentials into logs. Route actionable failures to a person who is actually available to respond.
For the builder, this changes the meaning of “done.” The release includes the way somebody will operate it after the coding session ends.
Illustrative workshop app
Undo the code. Then check the consequences.
In this fictional example, a faulty version 2 update moves a Saturday booking to Sunday. Rolling back to version 1 leaves the saved booking on Sunday. A separate, targeted repair restores Saturday. The attendee still needs a correction message; repairing the record does not contact them.
Application code
Version 1
The code version and the booking record are separate state.
Saved booking
Saturday · correct class
This record changes only when an action writes to it.
The starting record is correct. Apply the fictional faulty update to see what recovery must address.
View complete static diagram

Reduce what the first release is allowed to do#
There is a reasonable objection here: if a small project needs all this attention, when does anyone get to launch?
The answer often lies in reducing the first release's scope.
If automatic booking confirmation is not yet dependable, the studio could begin with a request form that clearly says a place is pending organizer approval. That changes the service being offered. It is only a useful compromise if requests are stored privately, one person owns the approval queue, attendees know when to expect an answer, and the studio caps demand at what it can handle.
Manual review also has failure modes. An unmonitored inbox simply moves the uncertainty to another place. The smaller release needs evidence too.
Likewise, inviting a few people can limit the number affected by a defect, but it does not make a known access-control problem acceptable. Google SRE's canary-release guidance supports limiting exposure and watching the result as part of release management. The useful principle for a small team is to expand only when the evidence supports the next step.
A private prototype with invented data, an invitation-only pilot, and a public service taking bookings are different commitments. Name which one you are making. When a critical question has no answer, change the scope, obtain the missing review, or delay that capability.
Before you share the link#
Choose the main thing a visitor must be able to accomplish. In a test environment, have another person attempt it without coaching, using an ordinary account. Then interrupt one handoff and inspect both the saved result and what the person is told.
Keep a short record of the version tested, the observed outcome, the unanswered questions, and who owns the next decision. If the work exposes a missing requirement, use the AI coding specification guide to give the agent a bounded change with clear acceptance evidence.
The pottery studio does not need a remarkable technology stack to run its first pilot. It needs the attendee and the organizer to agree about whether a place is booked, and a practical way to resolve the situation when they do not.
That is a useful place to spend the next hour of development.
Sources#
- OWASP, Authorization Cheat Sheet.
- GitHub, Application card: GitHub Copilot Agents.
- Malcolm Featonby, AWS Builders' Library, Making retries safe with idempotent APIs.
- Sandeep Pokkunuri, AWS Builders' Library, Ensuring rollback safety during deployments (PDF).
- Google SRE Workbook, Canarying releases.
Sources checked on 19 September 2026. The workshop and its failure scenarios are illustrative; they are not measured product results.
Further viewing#
JavaScript Mastery, AI Can Build Your App. It Can't Engineer It. (9 Skills), discusses engineering workflows for AI-assisted development. Its workflow discussion is useful context; the video also promotes the creator's course. Adi has no commercial relationship with JavaScript Mastery.
Reader briefing
Keep the useful part of the internet close
The Adithhya Brief will turn worthwhile ideas into a concise note with a practical next step.
This opens a feedback email; it does not subscribe you. No recurring marketing is sent today. Do not include sensitive personal information.
Found an error or have better evidence? Send a correction. Material updates are reviewed and reflected transparently.
Continue reading
Related signals

How to Scale a Web App Without Overengineering It
Scale a web app by measuring the real constraint, making the smallest useful change, and recording the new guarantee and failure mode that change introduces.
Read story
How to Write a Clear Specification for an AI Coding Agent
An AI coding spec is a plain-English plan for what the agent should change, what it must not touch, how success is checked, and when a person steps in.
Read story
What Are AI Evals? How to Test AI Against Real Work
AI evals are repeatable tests of whether a specific AI system can handle realistic cases, respect important boundaries, and keep working after it changes.
Read story