Module 3 · Planning, Context & Multi-agent Systems · scripted

Lifetimes: What the Conversation Should Carry

35 minoutcomes: context-engineering

The path

To engineer extraneous load, we first need a way to see it. Start with a picture of what a task actually is. An agent's task is a path through decision points: at each node, the loop stands still, the whole conversation is presented, and one choice is made — the next step.

A task is a path through decisions

And at each node, the question that defines this whole lesson: what does the conversation need to contain — for this choice?

Information is born, and information dies

Every piece of context has a history along the path. It is born at some node — a result arrives, a decision gets made — and it dies at the last node whose choice depends on it. Chart the expense task, with a bar for each item's life:

The lifetime chart

node:A B C D E F
the goal + rules████████████████████████████████████
34 raw receipts███████████
statement rows██████████
mismatch details███████
resolutions (7)█████████████████
policy verdicts██████████
draft text█████████
read the chart:
"34 raw receipts" is BORN at A and DIES at C — after the
mismatches are resolved, no later choice ever looks at a
raw receipt again.
"the goal" lives the whole path.
everything past the right end of its bar is CARGO:
carried, re-read, re-billed — informing nothing.

This gives extraneous load its exact definition — sharper than "too much stuff":

The definition

EXTRANEOUS LOAD = anything on the wall past the end of its bar.

Not wrong information. Not useless information.
Information whose last decision is BEHIND it —
still being re-read, every iteration, by a reader
who cannot know it's dead.

The default: everything lives forever

Now the uncomfortable fact about the medium. A conversation, left alone, has one policy for every word ever said: visible to every later decision, forever. The receipts stay after C. The dead-end attempts stay. The 187 pages stay. The conversation is a room where nothing is ever taken off the table.

And it's worse than storage, because of who reads it. Recall the plays: the model is an actor, trained on documents where what is present matters. Everything on stage is a promise. A prop on the table in act one tells the actor it will be needed; a dead result left on the wall isn't ignored — it is interpreted, held as possibly-relevant, woven into reasoning it should never touch. The venue disaster from the previous lesson is exactly this: nine pages of props, two lines of play.

The medium vs. the task

The TASK gives each piece of information a natural lifetime:
born at a node, dead after its last use.

The CONVERSATION gives every piece the same lifetime: forever.

Managing extraneous load = closing the gap between the two.

Carry · Fork · File

Closing that gap is a discipline of three verbs, and you already own the machinery for all of them:

The three verbs

CARRYwhat is still alive — the goal, live results, standing rules. This EARNS the wall.
FORKwhat lives and dies together — a run of nodes whose bars begin and end inside the run. Give it its own conversation; take back one line.
FILEeverything else — behind an address. Not deleted: dormant. Alive somewhere, on nobody's wall.

The interesting verb is fork, and the chart tells you exactly where it applies. Look back at the expense chart: nodes B–C are a segment where "statement rows" and "mismatch details" are born and die entirely inside — only "resolutions" escapes. That shape is the signature of a forkable segment:

The forkability test

A segment can become its own conversation when the cut is thin:

  · the brief going IN is small and bounded
  · the result coming OUT is small and composable
  · no other bar crosses the boundary

Information that lives together and dies together
belongs in a conversation together.
Example 1 · The fork, performed
user

Reconcile the Molde trip expenses and report anything over policy. Tools: start_conversation(template, task), read_result(conversation), policy and reporting tools.

assistant
⟨tool_use⟩
start_conversation(template = "reconciler",
  task = "Match these 34 receipts to this card statement.
  Resolve mismatches. Return: matched list + unresolved items
  with one-line reasons. Receipts: [...] Statement: [...]")
user
⟨tool_result⟩
Started: c-317.
assistant
⟨tool_use⟩
read_result(conversation = "c-317")
user
⟨tool_result⟩
Ended. Result: 31 matched. 3 unresolved: r-12 (no matching
charge), r-19 (amount differs by 112 kr), r-27 (duplicate?).
assistant
⟨tool_use⟩
check_policy(expenses = "matched-31 + r-19")
NoteThe matching segment ran on its own wall: 34 receipts, the statement, every comparison — born there, died there. What came back across the cut is four lines, and every one of them is load-bearing for the next decision. The parent's chart never grew the receipt bars at all. This is the firebreak and the handoff, now chosen by reading a chart instead of by instinct.

Every lifetime is a bet

Now the honest part — the part that makes this engineering rather than bookkeeping. The chart looks authoritative, but the path is discovered as it is walked: tasks branch, tools surprise, the 1% case arrives. You draw the bars in advance; the world draws them in ink. Two failures follow, and you've already asked about both:

Example 2 · The bet that fails — and costs a lookup
user

Wait — r-19's difference of 112 kr: the department head is asking if that was a currency conversion issue. What was the original receipt currency?

assistant

That detail lived in the reconciliation — which ended. Its conversation was archived; I'll ask it.

assistant
⟨tool_use⟩
ask_history(conversation = "c-317", question = "Receipt r-19:
original currency, amount, and the matched charge's amount?")
user
⟨tool_result⟩
r-19: 890 NOK receipt; matched charge 1,002 NOK (foreign
transaction fee applied by card issuer, noted at step 11).
assistant

It wasn't a conversion error — the card issuer added a foreign transaction fee: receipt 890 NOK, charged 1,002 NOK.

NoteThe cut said "four lines will be enough." The future disagreed — and the failure cost one lookup, because the fork was filed, not destroyed. This is the rule from compaction, revealed as the general law of every cut: imperfect scoping plus a reachable archive beats perfect scoping, which does not exist.

The bet principle

Every lifetime is a guess about the future.
So never delete a scope — FILE it behind an address.

A right guess costs nothing.
A wrong guess costs a lookup.
Only an unfiled scope turns a wrong guess into a loss.

Building roads you can reason about

One question remains, and it closes the loop back to everything we learned about tools. If the path is discovered as it's walked — if the graph is probabilistic — how can we draw bars in advance at all? Because the graph is not lawless: the agent can only walk roads the tool language builds. Compare:

Two tool sets, two kinds of graph

OPEN LANGUAGESTRUCTURED LANGUAGE
execute_code(script)collect(trip) → receipts-id match(receipts-id, statement)
any path is possible;→ matches-id
lifetimes unknowable incheck_policy(matches-id)
advance — analysis can→ verdicts-id
only happen after the factreport(verdicts-id)
results chain by ID; eachstage consumes the last. The paths through this language form a SHAPE — and the bars can be drawn before any conversation runs.

Look at what the structured language did: closure — each result naming the next tool's input — didn't just help the agent chain moves. It made the pathways enumerable, and enumerable pathways have knowable lifetimes: receipts-id visibly dies when match consumes it. The IDs are doing double duty, too — passing a name across the wall instead of the thing it names, so the bulky object never occupies the conversation at all.

The road-network principle

You cannot know the path the agent will take.
You CAN build the road network it must take it on.

Tool design (the verbs, closure, results-as-grammar) shapes
the space of possible trajectories — and a well-shaped space
is one whose lifetimes can be reasoned about in advance.
An old thread, come full circle: the language was always
the design surface.
Reading the bars
  • Draw the lifetime chart for Example 1a's venue disaster from the previous lesson. Which bars ended long before the booking decision — and what was the longest-dead item still on the wall when the wrong call was made?
  • The forkability test has three conditions. Which failure mode does each one protect against? Find the condition that Example 2 shows can be relaxed — and say what makes relaxing it safe.
Your turn

Take a real transcript — one of yours from the hands-on sessions, or one we provide. (1) List every piece of information that entered the conversation, and mark where each was born and last used: draw the chart. (2) Compute the waste: for the last five iterations, what fraction of the wall was past its bar? (3) Box the one segment the chart says to fork; write its brief and its return contract. (4) Name the bet most likely to fail — and the ask_history call that repairs it when it does.