中文
A personal field report · November 2026

Kurt's Bitter Lesson

Two beautiful visions for working with AI models, a day of architecture and patches, and the one question a small model could not answer: who are you talking to?

Kurt × Claude (Opus / Haiku) × DeepSeek (Flash / Pro) · data as of 2026-11-12

Abstract. I wanted two things from AI-assisted engineering. An Economy mode: when my Claude quota runs low, the work keeps going on a cheap model and Claude costs almost nothing. A Stable Engineering mode: the strong model (Claude Opus) spends itself only on judgment — specs and final review — while a cheap model (DeepSeek) does the labor. We designed a layered architecture for both, tested every piece, and found problems everywhere. Each problem got a new mechanism; each mechanism got a patch. Within one day the dispatch rule went through six versions; about 36 mechanisms came and went, with up to 22 alive at once. What finally broke it was simple: the small model at the front door (Claude Haiku) could not tell whether I was talking to it or wanted my words passed on to Opus — and no rule could fix that, because deciding is exactly what it was forbidden to do. We tore the architecture down. What is left is a few lines of rules, one script and three mechanisms.

The core idea: don't over-think the architecture. With strong models it quite likely gets in the way, and a process design, however sensible on paper, is quite likely untested speculation.

1Two beautiful visions

I do engineering in the Claude Code desktop app. Opus is excellent but quota-limited. DeepSeek offers an Anthropic-compatible API, so the very same Claude Code command line can run on DeepSeek at almost no cost to my Claude quota. Haiku is cheap and fast. That suggests two modes.

Vision 1

Economy mode

  • Triggered automatically when quota is high (≥80% of the 5-hour window or ≥70% of the week).
  • Haiku sits in the main chat: it only talks to me, asks questions, relays.
  • DeepSeek Pro acts as the supervisor: breaks down tasks, writes specs.
  • DeepSeek Flash executes; another Flash reviews.
  • Opus is never called.
“When I'm low on quota, nothing stops — and Claude costs close to zero.”
Vision 2

Stable Engineering mode

  • The default when quota is fine.
  • Opus is called briefly, only for judgment: write the spec, do the final review.
  • Opus doesn't even read the codebase — Flash writes a summary for it.
  • DeepSeek Flash does all execution and first-pass review.
  • A script gate decides when work is “done”.
“Opus only spends on judgment.” Estimated saving: 80–90% of Claude quota versus doing everything in Opus. (Never measured.)

Both visions share an assumption that felt obviously right: if we draw the right boxes and arrows, we can route each kind of work to the cheapest model that can handle it. The rest of this report is what happened to that assumption.

2The architecture

The design (“V2”) borrowed from two respectable sources: DeepSeek Harness's super-agent pattern (a light router in front, strong workers behind, async events, a watchdog) and Anthropic's orchestrator–worker pattern (a strong model supervises big tasks). Click a layer to see what each mode put there — and what became of it.

LayerEconomyStable
Figure 1. The V2 layers and the seven dispatch / communication components bolted around them. Everything here was reasoned out on paper before any of it ran on a real task.

On top of the layers sat the mode switch itself: read the quota with a tool that only reports whole percentages, pick a tier, allow manual overrides with an expiry date, and print the current tier on the first line of every plan — enforced by a hook that would reject a plan whose first line didn't match the format.

3Testing it

To the design's credit, we tested. Seven experiments (T0–T6) in a day. Every number below comes from that day's logs, ledgers and data tables.

3.1 The pieces work (T0–T3)

TestQuestionResult
T0Can a DeepSeek agent spawn its own subagents?Pass
T1Can a hook stop the main chat from editing files itself (a “structural router”)?Pass
T2Do the ledger and the completion gate work?Pass
T3Can a hook push a subagent back until it finishes?Pass
Table 1. All four mechanisms worked in isolation. This is the trap: every piece being feasible made the whole feel validated.

3.2 Stable mode, end to end (T4)

One real task (finalization logic in a task queue), two routes. A: DeepSeek Pro writes the spec. B: Opus writes the spec from a Flash summary. Both: Flash executes, Flash reviews, Opus does the final review. Five hidden acceptance tests were written separately.

Figure 2. Every step of T4 (hover for details). Both routes were sent back by the Opus final review, while the hidden tests scored 5/5 on every version. The pipeline's many layers produced green tests; the one strong reviewer reading freely found the bugs. Route A took 1,118 s and $2.89 of DeepSeek; route B 689 s and $1.43. The Claude quota meter only shows whole percentages and did not move during either Opus call, so the promised 80–90% saving could not be measured at all.

3.3 Flash is fine for execution (T5)

FlashProScaffold false alarm
Figure 3. 3 small tasks × 2 models × 2 runs: 12/12 passed. Flash averaged 19 s, Pro 55 s. The one failure was the gate's own configuration, not the model. A rare clean result — and one that argued for removing a layer (Pro), not adding one.

3.4 Who should do the thinking? (T6)

Planning and “grilling” (interviewing me about requirements) ran in the main chat — which in Economy mode is Haiku, so design judgment got weaker exactly where it mattered. The fix was another layer: Haiku relays, while an Opus subagent or DeepSeek asks the questions.

Figure 4. DeepSeek read “ask at most 4 questions” as “always ask 4” and was still asking in round 6. Haiku, relaying, miswrote one question's title. And the subject being designed in this test was itself more architecture: a hook to verify the quota line at the top of each plan, with a 13-item test list. The two designs were never scored.

4Patch on patch

Each test exposed a problem. Each problem was answered the same way: with a new mechanism. Step through the patch log.

Figure 5. Problem (left) → patch (right). Notice how often the patch is a new rule about the model's behavior, and how often the next problem is caused by the previous patch.

How the mechanisms piled up

Pick a version. Struck-through items have been removed; outlined items are new in that version; a red mark means the mechanism was never tested on a real task or never shipped.

Figure 6. Mechanisms alive in each version of the dispatch rule, compiled from the archived rule files and design notes. The count is approximate — what counts as one “mechanism” is a judgment call — but the shape is not.

5Who are you talking to?

By v0.5 the main chat was reduced to a pure relay. Its whole job: pass my words to a freshly spawned Opus supervisor, pass the supervisor's answer back, and never think for itself. Any engineering or project request — even just a question — had to be forwarded. No exceptions for “small things” (an earlier exception had let Haiku quietly do work itself).

It failed for a reason that sounds trivial and turned out to be fatal. Try being the relay. Each message below is one I might send; two are real messages I sent to a Haiku session.

Figure 7. There is no correct column. Every message can be read both ways.

The rule said “don't judge”, but “should I forward this?” is a judgment — and the rule handed it to the weakest model in the system. A hook can stop a model from doing something (T1 proved that); it cannot stop a model from failing to forward, or from losing meaning while compressing. Nor did the relay save anything: every fresh supervisor re-read the context, and when the main chat was already Opus, spawning an Opus supervisor was pure duplication. After using it, my verdict was blunt: Haiku was not good enough for this job. But a stronger relay would only have hidden the flaw: the architecture had made the front door the router of intent, and intent is the hardest thing in the whole conversation.

6Tearing it down

v1.0 tried one more time with less: tier by whichever model the main chat is running; Haiku only has to sort messages into three bins (change code / ask about the project / chat); a script writes the task card, runs a gate, and stops after three rounds. It had 30 unit tests, all green.

Figure 8. v1.0's first real job — add a sub function. The card-writing model copied a test command that needs tests/__init__.py; the same card forbade adding __init__.py. Round 1: acceptance failed. Round 2: the file was added, acceptance passed, the gate flagged it as out of scope. Round 3: stalled, killed by hand. Two checks contradicted each other, and no executor, however capable, could satisfy both.

That was the end of the architecture. v2.0 deleted the gate, the acceptance commands, the rework rounds, the card writer, the ledger, the templates, the tests and the relay layer. The same task then took 7 turns and 11 seconds.

Economy: promisedEconomy: now
Main chatHaiku relays to a DeepSeek Pro supervisorHaiku chats; for engineering it copies my words verbatim into one command and relays the reply unchanged
ChecksGate + Flash review + Pro final reviewNone — I read the result
Stable: promisedStable: now
OpusShort calls for spec and review; never reads codeWorks directly; hands off to DeepSeek whatever it can; reads the diff itself
ExecutionFlash, inside a gated, sandboxed pipelineFlash, with its full toolset and one 80-turn cap
Saving80–90% (estimated)Unknown (the meter can't show it)
Table 2. Both visions survived — as intentions, not as architecture. The whole rule now fits on one screen, plus one ~90-line script.
Figure 9. Size of the rule directory per version (from archived copies). v0.4.1's archive kept only the main rule file, so its real size was larger. The current version is 14% of the peak.

A last irony. The script that survived still launched DeepSeek with a --bare “isolation” flag, which silently strips the agent down to three tools and takes away its ability to spawn subagents. T0 had already discovered this, and it had been written into two notes. Nobody re-read them; the limitation was recorded as a fact about DeepSeek. It was fixed only after I asked why. Even the simplification inherited a piece of the old architecture that was getting in the model's way.

7The lesson

Don't over-think the architecture. It quite likely gets in a strong model's way — and the process you designed is quite likely speculation nobody has tested.

Rich Sutton's The Bitter Lesson observes that, in the long run, general methods that leverage computation beat methods that encode human knowledge by hand. This was a one-day, one-person miniature of the same thing.

Claim 1

Architecture gets in the model's way

  • Opus wrote specs from a Flash summary instead of the code: the design fed the strongest model the weakest model's view.
  • Two checks (gate and acceptance command) contradicted each other; no executor could pass both.
  • The relay layer turned Haiku into a router of intent — the one job it couldn't do.
  • An “isolation” flag quietly removed the agent's ability to organize its own work.
  • What caught bugs was the opposite of structure: one strong model reading the diff freely.
Claim 2

Process design is often untested speculation

  • The 80% / 70% thresholds were chosen, never validated.
  • The 80–90% saving was an estimate the meter could never confirm.
  • The gate's real catch rate was never measured before it was deleted.
  • The router hook, watchdog, loop mode, tier override and plan-header hook were designed and never shipped.
  • 30 unit tests proved the machinery ran, not that it helped; the first real job failed.

What to do instead

  1. Start with the simplest thing: give a capable model the task and its full toolset.
  2. Put the few hard limits in a script (a turn cap), not in rules the model must remember.
  3. Run a real job before adding anything. Add a mechanism only after a real failure it would have prevented — and measure it.
  4. Keep one independent review by a strong model. Leave the rest out until the data asks for it.
  5. Don't make a weak model decide what the user means.

Limitations