aditya.build
Get in touch

← All questions

Q. Why does my AI product not feel as smart as Claude?

The Harness Is Where Your Taste Goes

The same model feels smart in Claude Code and flat behind a raw API. The difference is a stack of product decisions. Most of them, lately, are yours.

Part 2 of 3 9 min read 2026-07-11
A worker opens a trapdoor and descends into dense machinery beneath a platform, reaching toward a glowing green control wheel.
Nine parts, one dial. Someone's hand has to be on it.

Agent = Model + Harness

The Illusion

You have watched Claude Code run for twenty minutes and never lose the thread.

A tool call fails; it reads the error, tries another way, keeps going. Then you wire the same model up behind a raw API key and it goes flat. It forgets what you told it. It gives up the moment something breaks.

Same model. Same weights.

One feels like a colleague. The other, a clever intern with amnesia.

Part 1 made the argument and named the skill: harness engineering. You came here for the vocabulary. This is the machine, opened.

Just an Engine

First, kill the myth: the magic is not a better prompt, and it is not a better eval suite.

When Claude Code's client source leaked this spring, the striking thing wasn't any secret instruction. It was that the core instructions are task-agnostic. Nothing about your repo, your bug, your workflow is hardcoded anywhere. The specificity arrives at runtime: your project's rules, the available tools, the relevant files, assembled fresh around the model on every turn.

The right mental model: the harness leaves the model exactly one job. Judgment. Everything else, everything, is environment. How it behaves each time it wakes up is a function of the environment it wakes up in.

Build it a jail, you get a prisoner.

Put a Ferrari engine in a Polo, you get a Polo.

The model supplies judgment. The harness decides what it gets to judge, what it may touch, and when it must stop.

Harness engineering is environment design. And environment design is product design one layer down. That's why this layer is where your taste goes now.

The Same Three Layers

In Part 1 we split the harness into three layers to show what the labs were eating. Same tree, redrawn under a harness you build yourself. Every box comes back.

⤢ click to enlarge INSTRUCTION EXECUTION MEMORY System prompt assembled at runtime Skills what it knows of you Hooks policy lives in code Permissions what needs a human The loop when is it done Tools what it can touch Sub-agents which work forks off Context window what makes the cut Memory what survives MODEL the engine beneath all three · sealed · theirs
The same three layers from Part 1, opened up. Nine parts. In your harness, every one of them is yours.

Each part is not a component. It's a place where a decision lives. The loop holds “when is it done and how many retries is that worth.” Permissions hold “what needs a human.” Memory holds “what survives the session.” Read the diagram as nine addresses, not nine features. Taste, down here, is having an opinion about what belongs at each address.

And Part 1's five questions? They each have an address now:

The question from Part 1
Where it lives
Strict flow, or back-and-forth that ends in a plan?
The loop, and the conversation wrapped around it
Defined enough to chain deterministically?
The loop and tools: it's the dial at zero (next section)
Which reasoning tier per step, at what cost?
The loop and sub-agents
Raw memory, abstraction, or pre-processed layer?
Context window and memory
What context upfront, so users aren't interrogated?
Skills and the system prompt

Watch It Run

Now watch the anatomy in motion. One ordinary, ambiguous ask: “make the checkout tests pass.” First the shape of the run, then the beats.

⤢ click to enlarge system prompt orders at runtime context 4 files of 400 clarify? asks the user THE LOOP fail? run again MODEL reasons · decides the ask tools edit · test memory tomorrow: resumes sub-agents forks a scout hooks policy scan needs a human? permissions a diff not a push
Everything feeds the model; the model decides; the rules stand between its decisions and your user. The list below names who decided each beat.
system promptBefore reading a line of code, it assembles its orders at runtime: core instructions plus your repo's CLAUDE.md.
contextIt greps, opens four files, ignores the other four hundred.
the loopIt could ask “which tests?” There's a tool for exactly that. It judges the ambiguity answerable and proceeds.
sub-agentsIt forks an explore agent to chase the failing trace while the main thread plans.
toolsFix, run tests, read the failure, try another way.
hooksA pre-action hook scans every command against policy before it runs.
permissionsIt stops before git push and shows a diff instead of a changed repo.
memoryKill the terminal. Tomorrow it resumes where it died, instead of restarting from zero.

Nine parts, one ambiguous sentence, and you felt none of it. That's the tell of a great harness: the decisions disappear into smoothness. And every one of them was tuned for exactly one user: an engineer, at a terminal, watching.

The Dial

Here's what the anatomy hides, and the reason this piece exists. All nine parts implement one tradeoff: how much does the model decide, and how much does the code.

Turn it toward the model: it handles ambiguity, feels smart, surprises you, costs more, and is harder to predict. Turn it toward the code: reliable, cheap, testable, rigid. At the far end of rigid you've built Part 1's wizard. At the far end of smart you've built something you can't put in front of a customer.

⤢ click to enlarge CODE DECIDES reliable · cheap · rigid MODEL DECIDES flexible · costly · feels smart Approving a git push Compacting the context Retrying a failure Choosing a tool Planning the approach
Five steps from one product, each dial at its own position, as reconstructed from a community port. Smartness is the allocation.

That corrects how everyone talks about this: smartness is not a level. It's an allocation. Nobody sets one dial for the whole product; a good harness sets it per step. Claude Code is ruthlessly deterministic about permissions and completely judgmental about planning. That non-uniformity is the craft.

And these settings aren't vibes in someone's head. They're numbers in a file. One open-source reimplementation of Claude Code carries the loop's knobs as a frozen config: max_turns: 8, compact_after_turns: 12, structured_retry_limit: 2. Those are the port's choices, not verified Anthropic defaults; the distinction doesn't weaken the point.

Someone typed 8.

Someone priced another failed retry at exactly two.

Those are product decisions. In most companies, they ship without a PM in the room.

Your Blanks

Now swap the user: yours is a sales lead in a browser, a support agent mid-ticket, an ops manager on a phone. Every setting resets:

Claude Code's setting
Your blank
Stops when the tests pass
What is “done” for your agent’s run? Who judges a partial result?
Asks the engineer before git push
Your user won't review diffs. Where does your agent stop for a human?
Compacts a growing session; the engineer sees what it lost
Your user can't. Which part of their context must never be summarized away?
Resumes tomorrow's session where it died
Does a failed run resume for your user, or silently start over?
Spends frontier reasoning by default; an engineer's hour justifies it
Which steps of your workflow earn frontier reasoning, and which get the cheap model?

These blanks are Part 1's micro-decisions, now with names and addresses. Nine parts, a dial position each, times every step of your workflow. That's the honest size of the job, and odds are nobody on your team owns the whole of it.

Now You Can See It

You have the map. You have the dial. Here's what you still don't have: answers. Nobody, including the people who built Claude Code, can set a dial from a chair. They set theirs by watching it run and revising until the decisions disappeared into smoothness. The honest answer to “how much judgment should this step get?” is still “I'd have to see it run.”

So build the disposable version. It is the exact right thing for a PM to prototype. Not for production; if it gets there, great, but that was never the point. You prototype to find the answers that were always supposed to be part of your job. You know what to watch for now: the step where it over-asks and a user would quit. The step where it burns frontier reasoning on boilerplate. The turn where compaction eats the sentence your buyer paid for.

One discipline while you do it: don't grade the output. Watch the trace.

  • Where did it ask when it should have acted, or act when it should have asked?
  • Which context changed the answer?
  • Which failure could have recovered?
  • Which step deserved a cheaper model, or a better one?
  • What did the user have to repeat?
  • What was correct but lost during repair?

A screen prototype reveals the interface.

The trace reveals the actual agent.

The way in isn't a menu. It's a ladder:

  1. Get a baseline Perform the task with Claude itself, headless: no interface, no build, just the job chained through local skills. Work the output until it's genuinely good. Worst case, you now own a benchmark to beat, which is more than most AI roadmaps are built on.
  2. Find the gaps Read the trace against the nine parts. Where would a sub-agent save tokens? What data sitting in your platform would sharpen the output? Which workflow steps could be inferred instead of asked for? Some parts won't apply, and ruling one out is also setting a dial.
  3. Swap in the real pieces Replace the stand-ins one dial at a time, as far as your proficiency takes you: an MCP server here, real data there. Log as you go; the log is the spec writing itself.
  4. Prototype on real data End at something you can put in front of a customer, running on their actual data. If the build outgrows you, this is where you bring in a developer, the pairing we'd recommend. And the rule stands: the decisions are the deliverable, not the code.

Figma reactions are worth nothing for an AI product.

A trace on real data is the only demo that counts.

Or watch a live example. Part 3 is Yukta, start to finish: the first flow, the failures, the dial changes, and the requirements that fell out of it.

The dial is being set on your product today.

By a framework default. By a developer choosing the fastest path. By a model provider's generic assumptions.

Sources The Claude Code source leak (InfoQ, heise) · The config quote (an open-source reimplementation of Claude Code) · Claude Code architecture, current behaviour (sub-agents, hooks, memory, settings and permissions) · openclaw (Repo) · Series carry-over (Part 1)