The demo worked. The engineering problem began afterward.
The new internal approval tool looks finished. A customer requests access, the screen turns green, and the generated tests pass. Two independent coding runs agree on the implementation. The team has a persuasive demo and a growing temptation to cancel the SaaS subscription.
Now open an old account. Its approval flag is true, but the approval was later revoked. The new tool treats the flag as a current entitlement. It did exactly what the brief and its generated fixtures implied. The brief omitted the part of the business that mattered.
This is a synthetic case, not a reported customer incident or a measured failure of a named model. I use it because the hard engineering question starts when the first version appears to work: who can explain, change, operate, and eventually retire the system? A model can write a great deal of code. Agreement between model runs can surface disagreements and sharpen a design. Neither can recover an unstated historical rule or take ownership of a service after the original conversation is gone.
The surface can be right while the product is wrong
Imagine a small company replaces a maintained approval and scheduling service. The old systems have several kinds of evidence: a current approval, a later revocation, an ambiguous legacy Boolean, a missing approver, and a customer-specific exception. A screen that says Active compresses those histories into one word. The operator needs to know which event made it active, under which policy, at what effective time, and whether a later event cancelled it.
I would make the migration contract explicit before asking an agent to implement the UI:
| Historical record | Permitted new state | Evidence required |
|---|---|---|
| Valid approval, no later revocation | Active, subject to current policy | Approver identity, policy version, effective time |
| Approval followed by revocation | Inactive | Ordered event history and revocation scope |
Legacy approved=true with no provenance |
Unknown, held for review | Owner-labeled migration decision |
| Missing approver or policy version | Unknown, held for review | Authoritative source or named owner |
| Customer-specific exception | Whatever the governing exception says | Current exception record, scope and expiry |
Those rows are proposed rules for this fixture. A real product owner must label its actual policy; the table cannot be copied into a real business and called correct. The useful technique is to hold out records that the build prompt did not mention. If a candidate implementation grants access from an ambiguous flag, a protected acceptance check must fail even if the generated UI and its self-written tests are green. GitHub's agent application card explicitly warns that generated code may look valid while failing the intended semantics. That documentation supports the need for independent review and testing; it does not measure this fictional company.
An engineer needs a causal model, not only a codebase
Suppose a customer has an approval badge but no access. A new agent session offers three plausible fixes: rerun the notification job, set the entitlement manually, or repair the policy evaluator. A person who cannot trace the path from request to decision to effect cannot choose responsibly. A successful edit to a plausible file may hide the real failure, or create a second one.
The operating record should let a new maintainer answer four questions in order:
- Intent: What was requested, by whom, under which policy and customer scope?
- Decision: Which rule evaluated the request, with which source data and version?
- Effect: Which entitlement, notification, export or schedule change was attempted and accepted?
- Readback: What does the authority for each consequential state say now?
These are different records with different owners. A screenshot is not an entitlement readback. A model's explanation is not a durable event log. An API receipt does not prove that the customer can use the product. If an effect is uncertain, keep it UNKNOWN and route it to a named owner rather than generating another action from a guessed state.
This is also why “we saved the agent's memory” is an incomplete answer. A note saying “customer approved” needs source identity, version, effective time, exception, expiry and supersession. When a later revocation arrives, the system must invalidate or revalidate the old note. Keep design rationale, action journal and customer-state truth separate. A handoff summary can explain what the last operator believed; it cannot replace a current query of protected records.
The second change reveals the architecture
The first generation was fast. The business now adds a temporary approval mode. In one implementation, the rule lives behind a coherent decision service with a versioned contract. In another, copies of the same conditional appear in the web controller, a nightly job, CSV export and notification worker. Both could have passed the first demo. The second change reveals the difference.
The cost is rarely “a developer hand-recodes everything.” In an agentic team it is repeated prompting, tracing affected paths, rerunning tests, checking the deployed effect, and asking what adjacent behavior was missed. Measure the accepted second change: affected contracts, file spread, reviewer cycles, regression failures, production readbacks and owner time. Do not invent a ratio from a synthetic story. Maintainability sensors for coding agents discusses ways to notice change spread and other maintainability signals; those are engineering indicators to test locally, not universal proof that a particular agent harmed this codebase.
The useful harness has an independent failure path. Give the worker a task and a worktree, but keep owner-labeled approval cases and policy invariants outside its editable working view. Run the same cases after a second change. Mutate the code deliberately so a revoked approval grants access; the suite must go red. Re-run the deployed readback for the actual customer outcome. If tests remain green after the mutation, the team has a vacuous gate, however impressive the demo looked.
The real bill includes diverted attention
Giving every employee a coding agent can turn every ordinary SaaS friction point into a small internal product. A salesperson starts a scheduler. Operations builds a reporting portal. Someone else creates a miniature CRM. The first drafts are cheap, so the company accumulates tools that each need access control, backups, support, integrations, migration and an owner when the original builder leaves.
I would compare two complete options for the same business outcome:
| Cost or capability | Maintained tool | Internal build |
|---|---|---|
| License or hosting | Subscription and usage | Compute, storage, service dependencies |
| Implementation | Configuration and integration | Design, acceptance rules, implementation |
| Ongoing changes | Vendor roadmap and integration work | Owner time, tests, deploys, incidents |
| Security and recovery | Vendor commitments to verify | Team-operated access, backup, restore, response |
| Exit | Export and migration effort | Data portability and shutdown plan |
| Opportunity cost | Time spent adapting the tool | Time diverted from the employee's actual role |
A license is not automatically cheaper, and internal code is not automatically waste. A custom build can be right when the workflow is differentiating, the vendor cannot meet a material need, and the organization can fund durable ownership. The trap is comparing the monthly invoice with only the first AI-generated draft. Include the salesperson's missed selling time and the engineer's future investigation time. Use observed owner hours and actual vendor terms; this fixture supplies no price claim.
The 2025 DORA research describes AI as amplifying existing organizational strengths and weaknesses. It is a reason to examine the team's review, feedback and operating system, not a number that can be applied to this case. Code generation may accelerate a good engineering process. It can also accelerate the creation of half-owned commitments.
Optimize the customer path, not the attractive metric
Six months later someone asks the agent to speed up approvals. It reduces endpoint latency in a synthetic benchmark. But the customer waits on a manual exception queue fed by stale records. The endpoint is faster; the outcome is unchanged.
Before choosing an optimization, trace request latency, queue age, exception classes, owner interventions, failed notifications and the final customer result. Ask which boundary controls the end-to-end time. Require a human-readable causal account of the state machine. A model can propose options and implement the chosen change, but the owner must define the outcome and the independent readback that will tell the team whether it improved.
The same rule applies to expansion. If the team cannot explain what makes an approval valid or how to repair a failed entitlement, it does not yet know how to safely add another customer cohort. Scale multiplies unresolved semantics.
Make the build, buy or stop decision explicit
After the demo, I would ask for a one-page decision with five sections:
- Differentiation: Which capability is specific enough to this company to justify ownership?
- Correctness evidence: What owner-labeled historical cases and deployed readbacks were passed? What remains unknown?
- Changeability: Can a new maintainer add the next mode without rediscovering rules across the codebase?
- Operations: Who handles failures, policy changes, access, backup, restore and customer communication?
- Exit: How will data be exported or migrated, and when will the team reconsider the decision?
There are three defensible outcomes. Build when differentiation and evidence justify a named team. Buy when the maintained commodity solves the problem at lower total owner cost. Stop when neither option earns the business outcome yet. Unknown records or costs should remain visible as UNKNOWN; a polished model debate must not quietly turn them into a green light.
This is the steadfast lesson: use agents to accelerate implementation, then judge the product by the next change and the next incident. Ship the internal system only when an accountable owner can explain its state, test its historical edge cases, operate its recovery path and exit it. Otherwise the impressive demo is a prototype, not an engineering result.
A bounded experiment before a stronger claim
The Week 14 MIT companion contains the synthetic approval-workflow fixture and its readbacks. The fixture covers owner-labeled history, policy versions, context handoff, a deliberately defective migration and an owner-time worksheet; no live customer system is implied.
I would run ten probes: a valid historical approval; a later revocation; an ambiguous legacy flag; a missing policy version; a changed requirement after the demo; resume from a thin prose summary; resume from a versioned decision record; a stale handoff; a second-change effort comparison; and a full owner-time comparison against a maintained tool. For each, log the invariant, input, expected state, observed state, intervention and operator time. A passing local fixture proves only that the fixture's code handled those cases. A claim about a real product would need an authorized staging target and its own evidence.
The NIST AI Risk Management Framework calls for defined human roles, monitoring and regular evaluation across the system lifecycle. My practical version is simpler: name the owner, preserve the decision record, and keep the independent test and recovery path alive after the original model session has disappeared.
The field kit
The companion folder for this week holds runnable examples, decision records, evidence and limits. The repository release log is updated after each article's live readback.