Decision Tier

Architecture The core pattern

The cascade

Put each kind of decision in the cheapest tier that can make it correctly. Let each tier pass up what it can't handle. Then, every time an expensive tier resolves something, make a change in a cheaper tier so it never has to again.

What each tier does

TierOwnsNever does
GuardsSafety reflexes in the fastest loop: pause when a health metric drops below its floor, stop a job when its supply runs out, stop at target countsDecide anything. They act and log
CodeAnything computable: extracting state, listing legal options, planning from data, verifying outcomes, policies with a right answerGuess at judgment calls
Decision modelPriorities among options and worth-it calls, phrased narrowly and scored per option; code combines scores with explicit weightsPlan a chain, do arithmetic, audit its own options
LLMAudits plans as well as doubt; writes milestones and playbook (the context the decision model judges against); turns each escalation into a lower-tier changeSit in the hot path for routine decisions
HumanPreferences, rulings, approvals, environment failures automation can't reachGet asked what a rule could answer

Every escalation ends with a lower-tier change

This is what makes a cascade get cheaper over time instead of just routing. When the LLM resolves an escalation, the resolution is a change that stops the same escalation from recurring:

EscalationPush-downEffect
Selling items made only for practice (doubt 0.74)Playbook: "items made only for practice are surplus"Next time 0.35
Retiring an obsolete supply tier (novelty 0.71)Playbook: "older tiers are surplus once the better one is in use and the standing goal names it"Retiring older equipment next time: novelty 0.35, no escalation
Doubt 0.63 on the same safe pick, three timesPlaybook safety condition0.51, then 0.46
A plan that relied on a rare outcome (doubt 0.84)Code: plans never rely on rare outcomesNext pick 0.41 doubt, no escalation

Concrete milestones are a strong lever too. Against a paragraph-long goal, the decision model's picks scored 0.3–0.5. Along a named milestone's chain of steps, they scored 0.85–0.96.

Promote questions to code when the answer is computable

Decision model for judgments without a computable answer. Code the moment a question has one, or the model's error has a fixed sign.

Code policies ended up running roughly a fifth of ticks.

What the decision model can't see: planner gaps

The biggest single lesson from the fourth session: most bad plans reached the LLM with the decision model at low doubt (0.27–0.35). It judges the options it is given. When the planner offers only bad options, it confidently picks the best bad one. Each of these was fixed in code:

So the LLM tier has to audit the plans, not only the doubt scores. Each finding goes into the planner as a rule, with a comment naming the case that motivated it.

Rules interact; state invariants per goal

LLM wakes are the scarce resource

In a long-running loop the expensive thing is the LLM waking up, not the decision model or wall time. Each "do a small thing, then stop" cycle costs a tick and a wake. What reduced wakes:

Safety goes in the fastest tier, and it needs its own audit

A 1-second in-page guard tops up reserves when a health metric drops below its floor, stops a job when its supply runs out, and stops production at target counts. Before it existed, the health metric fell from 102 to 6 between two LLM wakes. But the guard drew only from the current reserve slot; with that slot empty it did nothing, and in that environment hitting zero destroyed equipment in use. The fix: switch to the next stocked slot, and stop the job only when every slot is empty. Prevention belongs in the planner: load enough reserves before a long job.

Guards must also fail closed by construction. A guard that crashes, times out or can't reach its judge should stop the action or ask a person, never quietly let it through. Some hook systems skip a failed hook by default, so check what yours does. Claude Code mods are one: the sister site Hook Chain verified on 2.1.296 that a guard hook that throws, or runs past its 10-second budget, is skipped and the tool runs anyway, unless the guard registers a .catch that denies. Calling a decision model from a hook has its own seam: time spent waiting on the HTTP call doesn't count against that budget and the request has no timeout field, so race it against a timer and fail closed. Hook Chain's tested cascade guard does exactly that: a regex fast path, remembered human rulings, a decision model with a separate doubt check and a watch band, then a person.

What a cascade saves

Run the numbers on the cost calculator. With 70% of decisions handled by code, 25% by a decision model alone, 4.5% by an LLM and 0.5% by a person, a cascade costs well under half of sending everything to the LLM, even though both still pay for the same deep reads and the same people. And the push-down loop moves the mix toward code every week.

Next: Novelty and doubt, the two signals that decide what leaves the decision tier.