LEARN · PHASE 14 · LESSON 92

Most Agent Calls Are Decisions, Not Generation

After this lesson you can count the calls in your loop that never needed a

Type
Learn
Prerequisites
Phase 03, Lesson 25 (Decision Models Beat Generation on Cost); Phase 04, Lesson 31
Time
~30 minutes

Learning Objectives

  • Classify each model call in a loop as a decision or a generation
  • Count how many of a real run's calls are decisions
  • Name the closed set of options a decision call chooses from
  • Estimate what share of spend is decision-shaped

The Problem

A triage workflow sent every input to a frontier model with this prompt: "Decide which of these five pipelines this belongs to. Answer with the number only."

Each call generated one token and stopped. Each call also paid frontier generation prices to pick a number from 1 to 5. Over a week, 80% of the bill was those one-token answers. The work that actually changed the data — the transformation at the end — was the other 20%.

The pain is this: most of a loop's calls are questions with a handful of legal answers, paid for as if each one needed an essay.


The Concept

Ground first. From Lesson 25, a decision model answers a closed question — pick from a small set, yes/no, a short label — cheaply and fast. A large language model generates: the output can be any string of any length.

Every call in a loop is one or the other. Sort them:

CallKindWhy
"Summarize this issue"GenerationOutput length and content vary
"Which of these 6 tools applies?"DecisionOutput is one of 6
"Classify: bug / feature / question"DecisionOutput is one of 3
"Write the fix"GenerationOpen-ended
"Is this test passing? yes/no"DecisionOutput is one of 2
"Extract the version number"DecisionOutput is from a narrow shape
flowchart LR
    T["turn state"] --> C{"what does this call<br/>actually produce?"}
    C -- "one of a small set" --> D["decision<br/>cheap tier wins"]
    C -- "any string" --> G["generation<br/>frontier tier earns its price"]
Mermaid source — renders as a diagram where mermaid.js is available

The test is mechanical. Ask: can I write the legal answers as a list?

The reframe: If you can write the legal answers as a list, the call is a

decision, and generation prices are the wrong meter.

Yes → decision. "Any string" → generation. There is no third category worth carrying.

A useful consequence: decision counts are usually much higher than generation counts. A loop generates a handful of times and decides dozens of times. That ratio is where the money hides.


Build It

  1. Pick a real run with at least ten model calls — a workflow from Phase 12, a Claude Code session, or the annotated run from Lesson 91.
  2. For each call, write the question the model was actually asked and the set of legal outputs you would accept.
  3. Label it D (decision) or G (generation).
  4. Tally the two counts and, if you have token numbers, the share of cost each side represents.
  5. Highlight every D call that ran on your most expensive model.

Step 5 is the finding. It names the mismatch you can fix.


Use It

Command / conceptWhen you reach for it
The "list the answers" testWhen you're unsure whether a call is a decision
Decision vs generationWhen you're choosing a model tier for a call
Closed setWhen you write the prompt for a decision — name the legal outputs
Decision share of spendWhen you want to know where the bill actually goes
The D-on-frontier flagWhen you're about to optimize: it is almost always the first fix

Exercises

  1. Take a prompt of your own and reduce it to its legal outputs. If you can't, it is a generation call. ✅ You pass when you either list the outputs or write "any string — this is generation."
  1. Re-run your tally and report the decision share as a fraction of calls and, separately, as a fraction of cost. ✅ You pass when the two fractions are both stated, even if you have to estimate tokens.
  1. Find one decision call whose answer is a single token and whose model is the priciest tier. ✅ You pass when you can name the call and the tier, or state that none exists in your run.

Key Terms

TermWhat people sayWhat it actually means
decision call"a small model call"a call whose output is one of a small, known set
generation call"the real work"a call whose output can be any string of any length
closed set"the options"the finite list of legal answers a decision may return
triage"sorting the input"a decision call that routes work to the right path
one-token essay"cheap prompt"a decision paid for at generation prices because it ran on the wrong tier

What this lesson skipped

Which decision model to use and how to place it (Lesson 93), how to gate on confidence (Lesson 94), and the full cost math (the module). Model aliases and tiers come from Phase 03; teach sonnet and opus, never hardcoded versions. Pricing drifts — check current numbers before quoting them.

Check yourself

4 questions. Answer before you reveal — recognising the right option is not the same as being able to produce it.

  1. Which of these prompts is a decision call?

    1. Summarize this issue in three sentences
    2. Classify this issue as bug, feature, or question
    3. Write a fix for this issue
    4. Explain how this codebase works
    Show answer

    B. Classify this issue as bug, feature, or question

    Classification has a closed set of three legal answers, so it is a decision. The others produce open-ended text whose length and content vary, which is generation. 'Write a fix' is tempting because it is short work, but 'short' and 'closed set' are different things.

  2. A prompt asks for 'yes/no, plus a one-line reason.' How do you classify it?

    1. Decision, because yes/no is a closed set
    2. Generation, because the reason section is open-ended — ask for the label only to make it a decision
    3. Neither; it is invalid
    4. It depends only on the model size
    Show answer

    B. Generation, because the reason section is open-ended — ask for the label only to make it a decision

    The free-text reason reopens the output, so the call generates as well as decides. Split it: ask for the label as a decision, and log the reason separately if you need it. The tempting answer stops at 'yes/no' and misses that one open-ended field undoes the closed set.

  3. A loop spends 80% of its budget on decision calls run through a frontier model. What is the best first move?

    1. Reduce the context window
    2. Route the decision calls to a cheaper decision model or tier
    3. Ask the model for shorter answers
    4. Turn on prompt caching
    Show answer

    B. Route the decision calls to a cheaper decision model or tier

    The problem is a mismatch between the task (pick from a list) and the meter (frontier generation). Moving the decisions to a cheaper tier attacks the mismatch. 'Shorter answers' is tempting but only trims output tokens while you still pay frontier input and overhead on a closed question.

  4. Which call is NOT a good candidate to move to a cheaper decision tier?

    1. Pick which of five tools to call next
    2. Score this paragraph's relevance from 0 to 3
    3. Write the user-facing changelog for this release
    4. Answer whether this build log contains an error
    Show answer

    C. Write the user-facing changelog for this release

    A changelog is open-ended prose — the output can be any string — so it is generation and needs the stronger model. The other three all have closed output sets (a tool, a score, a yes/no) and are safe to move down. The tempting trap is that a changelog entry can be short, but shortness is not a closed set.