Before AI Writes the Code, Someone Must Design the Thinking
Hatched by mike liao
Aug 16, 2026
11 min read
2 views
91%
What if the most important part of building with artificial intelligence happens before a single line of code is written?
A capable coding model can produce thousands of lines in minutes. Yet that speed creates a dangerous illusion: the bottleneck appears to be implementation, when the real bottleneck is deciding what should be implemented, in what order, under which assumptions, and with which tests for failure.
This is not merely a software lesson. It is a general law of intelligent action. Execution magnifies the quality of the structure it receives. A bad plan executed quickly becomes a larger, more expensive mistake. A good plan gives even an imperfect executor a reasonable chance of success.
The connection between cognitive bias and modern AI workflows is therefore deeper than it first appears. The same psychological tendencies that cause people to leap toward premature decisions, obey authority, overweight vivid evidence, and rationalize incentives can also infect the systems they build with AI. The solution is not simply to find a smarter model. It is to create a deliberate separation between planning and execution, then use that separation to expose hidden assumptions before they become expensive outputs.
The central question is not, “How do I get an AI to do more?” It is, “What must be made explicit before action begins?”
The hidden bottleneck is not intelligence, but specification
Imagine asking a developer to build “a simple customer dashboard.” A competent developer may immediately create a page with charts, filters, authentication, and an export button. The result could look polished and still be fundamentally wrong.
What counts as a customer? Which data is authoritative? Should a user see real time figures or yesterday’s figures? What happens when a customer has no activity? Are permissions assigned by account, team, or individual? What does “export” mean when the data contains private information? None of these questions is primarily about coding. They are questions of architecture, meaning the structure of the problem and the relationships among its parts.
A coding model is often excellent at converting a sufficiently clear design into implementation. It is much less reliable when it must infer the design while also writing the implementation. That is because ambiguity compounds. One uncertain assumption in a database schema influences the API. The API influences the interface. The interface influences tests. By the time the error is visible, it has become distributed across the entire system.
This is the software version of a familiar human failure. People often want closure quickly. Uncertainty feels uncomfortable, so they convert an open question into a confident decision. Once the decision is made, consistency bias encourages them to defend it. If they have already invested time or reputation, loss aversion makes changing course feel like admitting defeat.
AI can accelerate this entire sequence. It can transform an unexamined assumption into a working feature before the human has noticed that an assumption was made.
The practical response is to introduce two distinct roles:
- The architect clarifies the objective, decomposes the system, identifies dependencies, and states what could go wrong.
- The developer translates that design into code, tests, interfaces, and documentation.
These roles do not need to be played by different people. They do not even need to be played by different models. What matters is that the cognitive jobs are separated. Planning should not be smuggled into implementation as a series of invisible guesses.
Why separation improves judgment
The architect and developer distinction works because it creates friction at exactly the point where human and machine reasoning are most vulnerable: the transition from intention to action.
A useful design document forces several kinds of hidden thinking into the open.
First, it reveals incentives. Every system rewards some behavior and penalizes another. A social platform that rewards engagement may encourage outrage. A sales dashboard that rewards the number of calls may produce low quality calls. A project management tool that celebrates tickets closed may motivate people to split work into trivial tickets.
Software is never just a collection of functions. It is an incentive environment. Before asking an AI to implement a feature, ask: “What behavior will this make easier, more visible, more profitable, or more socially rewarded?” The answer may reveal a risk that no amount of code review can fix.
Second, it confronts denial. A plan can include a section titled “What we may be pretending is true.” Perhaps the data is incomplete. Perhaps users will not behave as expected. Perhaps the performance target assumes a traffic level that has never been measured. Perhaps the team wants a particular technology because it is fashionable, not because it fits the problem.
This is not pessimism. It is an attempt to make reality cheaper to face. The cost of discovering a false assumption in a design document is low. The cost of discovering it after deployment can include corrupted data, unhappy customers, and months of rework.
Third, it separates evidence from vividness. People overweight what is available and memorable. A recent customer complaint may dominate planning even if it is statistically unusual. A dramatic production outage may lead to an elaborate safeguard for a low probability event, while a boring but common failure remains untreated.
An architect should therefore distinguish among:
- What is frequently observed
- What is merely memorable
- What is theoretically possible
- What is consequential enough to deserve protection
This simple classification prevents a single vivid anecdote from becoming the entire product strategy.
Fourth, it exposes authority effects. A system design often inherits assumptions from a senior executive, a popular framework, or a confident consultant. Because the recommendation comes from an authority, people may skip the question of whether it is appropriate here.
A design document can neutralize this tendency by requiring reasons, alternatives, and failure conditions. Instead of writing, “Use technology X because leadership prefers it,” write, “Technology X is chosen because it satisfies these requirements. We will reconsider it if these conditions appear.” Authority can still inform a decision, but it cannot substitute for one.
The plan is an interface between minds
The deepest value of an architectural document is not that it instructs the coding model. It is that it creates a shared interface between different kinds of reasoning.
Humans are generally better at context, priorities, ambiguity, and recognizing when a goal is morally or strategically confused. Models are often better at producing variations, recalling patterns, filling in boilerplate, and maintaining consistency across large amounts of implementation detail. Neither capability is sufficient by itself.
The architect role converts human intention into a form that an executor can reliably use. This is similar to a compiler interface. A programmer may think in terms of a business objective, while a machine needs explicit data structures, inputs, outputs, constraints, and error states. The plan is the translation layer.
But translation can also distort. A vague plan does not become precise merely because it is written down. “Make the application scalable” is not an architecture. “Support ten thousand simultaneous users while keeping the ninety fifth percentile response time below three hundred milliseconds for these endpoints” is closer to one.
A strong plan has at least five properties:
- It defines the outcome. What does success look like from the user’s perspective?
- It names the boundaries. What is included, excluded, or deferred?
- It maps dependencies. Which decisions constrain later decisions?
- It specifies failure. What can break, how will we detect it, and what happens next?
- It states uncertainty. Which parts are facts, estimates, guesses, or open questions?
The fifth property is especially important. Uncertainty that is labeled can be managed. Uncertainty that is hidden gets converted into accidental design.
The danger of a perfect plan
There is a trap here. Once planning becomes a separate phase, teams may start worshipping documents instead of learning from reality. The urge for closure can appear in architectural form: a beautiful specification that creates the feeling of certainty without earning it.
A plan is not a prediction of the future. It is a testable model of the future. Its quality depends not on how complete it sounds, but on how effectively it guides learning.
For example, suppose a team designs a recommendation engine. The plan may include an elaborate ranking algorithm, a feature store, and a monitoring system. Before implementing all of it, the team could identify the most fragile assumption: that users want personalized recommendations more than they want chronological updates. A small experiment might test that assumption in a week.
This is where the architecture and developer roles should become cyclical rather than linear. The architect proposes a model. The developer builds the smallest useful test. Evidence returns to the architect. The design changes. Implementation proceeds with better information.
The distinction is not “think first, then never rethink.” It is “make thinking visible, then let evidence revise it.”
This also protects against the gambling trap. Variable rewards can make a workflow addictive: a model occasionally produces an astonishing result, so the user keeps prompting, tweaking, and accepting outputs in search of another lucky hit. The process feels productive because it contains intermittent reinforcement, even when it lacks a clear objective.
A disciplined workflow replaces luck with evaluation. Every major generation should have a known purpose, a criterion for acceptance, and a reason to continue or stop. The goal is not to maximize the number of surprising outputs. It is to maximize the amount of validated progress.
A practical protocol for AI assisted work
The following protocol can be used for software, research, writing, analysis, or strategic decisions.
1. Write the decision before requesting the output
State the result you need, not merely the artifact you want. “Produce a report” is weak. “Determine whether this process should be automated, using cost, risk, and expected time savings” is stronger.
Then list the decision’s constraints. Time, budget, safety, legal exposure, quality standards, and reversibility all matter. An irreversible decision deserves more scrutiny than a disposable prototype.
2. Ask for an architecture, not an answer
Request a structured plan that includes assumptions, alternatives, dependencies, edge cases, tests, and open questions. Ask the planning system to identify where the request is underspecified.
A useful prompt might be:
Design a solution for this objective. Separate confirmed facts from assumptions. Identify the three decisions most likely to cause rework. Propose alternatives, failure modes, validation tests, and a staged implementation plan. Do not write the final code yet.
The instruction not to write code is valuable because it prevents premature execution from hiding unresolved design choices.
3. Attack the plan before approving it
Use a second pass to search for bias and incentive problems. Ask:
- Which assumption is most convenient rather than most supported?
- What evidence would disconfirm this plan?
- Who benefits if this design succeeds, and who bears the cost if it fails?
- Which vivid example may be distorting our priorities?
- What would a hostile reviewer criticize?
- What happens under stress, misuse, unusual scale, or missing data?
The purpose is not to manufacture endless objections. It is to make the important risks legible while changes are still cheap.
4. Give the implementation model a bounded contract
Once the architecture is credible, pass it to the developer model with explicit boundaries. Include the interfaces, acceptance tests, naming conventions, dependencies, and prohibited assumptions. Ask it to flag contradictions rather than silently resolving them.
This changes the model’s task from “invent a system” to “implement a reviewed design.” That is a narrower and more auditable problem.
5. Review outputs against the design, not against excitement
A fluent response can trigger the halo effect. Because the code looks elegant, the reasoning behind it may receive undeserved approval. Review should therefore compare the implementation with the original requirements and tests.
Does it solve the stated problem? Does it preserve the constraints? Does it handle the listed failure modes? Did it introduce a new incentive that encourages undesirable behavior? Is an apparently clever abstraction simply making the system harder to understand?
The best output is not the one that sounds most intelligent. It is the one that survives contact with the acceptance criteria.
Key Takeaways
- Separate architecture from execution. Make one phase clarify goals, assumptions, dependencies, and failure modes before another phase produces the final artifact.
- Treat every system as an incentive machine. Ask what behaviors your design rewards, measures, hides, or makes costly.
- Label uncertainty explicitly. Distinguish facts, estimates, guesses, and open questions so that hidden assumptions do not become accidental requirements.
- Use adversarial review before implementation. Search for denial, authority effects, vividness bias, premature closure, and conflicts of interest while revision is still inexpensive.
- Make plans testable, not ornamental. A design is valuable when it tells you what to build, what to measure, and what evidence would make you change course.
The most important shift is conceptual. Artificial intelligence does not eliminate the need for judgment. It increases the consequences of judgment that has not been examined.
A weak operator asks a model for an answer and then evaluates how impressive the answer sounds. A stronger operator asks for a structure, tests the structure, and only then requests execution. The difference is not prompt cleverness. It is the creation of a cognitive checkpoint between desire and action.
Intelligence is not only the ability to generate an answer. It is the ability to design the conditions under which an answer can be trusted.
As machines become faster at implementation, the scarce human skill will move upward. We will spend less time expressing decisions in code and more time deciding which decisions deserve to exist. The future advantage will belong not simply to people who can use powerful models, but to people who can build architectures that keep those models from amplifying confusion.
The first question before any serious AI workflow should therefore be disarmingly simple: What would have to be clear before speed becomes an advantage?
Sources
Hatch New Ideas with Glasp AI 🐣
Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)
Start Hatching 🐣