Glossary

Every term the course names, in two plain sentences, in the course's own words.

Each entry says which lesson earns the term. The lessons never use a name before you have built the thing it names, so if a definition here reads as abstract, that lesson is where it turns concrete. Where Tau, the reference implementation, has its own name for the same thing, the entry gives it, with a link to the exact lines at the commit this course is pinned to.

Three entries are the invariants the whole course hangs on: I1, I2 and I3. A sentence marked [general] describes how model providers usually behave; it is not something your code, or Tau's, guarantees.

A

aborted
The stop reason of a reply that ended because someone pressed Stop. After a cancel, your loop writes one in-band assistant message carrying it at the top of the next turn and ends the run, so no paid request follows a Stop.
Earned in lesson 15, The stop button that does not stop. In Tau: the value is part of StopReason (src/tau_agent/messages.py:154).
adapter
The one part of the program that knows a vendor: two pure translations, one from your messages into the vendor's JSON and one from the vendor's stream back into a single assistant message. The object that owns the socket is built from those two and offers the same acomplete(system, messages, tools, signal) as the fake model, which is why no line of the harness changes.
Earned in lesson 16, Capstone: out of the browser. In Tau: the ModelProvider protocol (src/tau_agent/provider.py:19-37); each vendor has an adapter in tau_ai.
agent
A model call inside a while loop that runs the tools the model asks for and sends the results back. The model steers; the loop only turns.
Earned in lesson 03, Turn the crank.
agent loop
The loop in run_agent: call the model, run the tool calls in its reply, append the results, call again. It continues if and only if the reply contains tool calls, and it keeps no state of its own: the caller's list is the product.
Earned in lesson 03, Turn the crank. In Tau: run_agent_loop, which continues on the presence of calls (src/tau_agent/loop.py:153-156).
append-only
Lines are added to the end of the session log and never edited or removed. A crash can then damage at most the last line, and everything before it is still exactly what happened.
Earned in lesson 11, Pull the plug. In Tau: JsonlSessionStorage.append (src/tau_agent/session/storage.py:52-60).
await
Shareable waiting: while one piece of code waits on the model or a tool, other code, such as a Stop button's handler, gets to run. A plain generator gives the floor away between events and never inside one, which is why lesson 15 needs it.
Earned in lesson 15, The stop button that does not stop. In Tau: the loop is async from the start (src/tau_agent/loop.py:52); until lesson 15, read its async for as for.

C

call id
The id on a tool call, repeated as tool_call_id on the result that answers it. It is how the model tells which result belongs to which call when one reply asks for several.
Earned in lesson 02, Words are not deeds. In Tau: ToolResultMessage.tool_call_id (src/tau_agent/messages.py:210-218).
cancellation token
A small object with cancel() and is_cancelled(), made fresh for every run and handed to the model call and to every tool as signal. Cancelling only sets a flag; nothing stops until slow code looks at it.
Earned in lesson 15, The stop button that does not stop. In Tau: SimpleCancellationToken (src/tau_agent/harness.py:51-59), one per run (src/tau_agent/harness.py:165-166).
colour rule
A function is async if and only if it waits, directly or through something it calls, on the model or a tool. It is the one rule that turns the lesson 14 file into the lesson 15 file without changing its design.
Earned in lesson 15, The stop button that does not stop.
compaction
What happens when the transcript nears the context window: the old messages are summarised, the recent ones are kept word for word, and one entry recording the summary and the id of the first kept message is appended to the log. Nothing is deleted; replay now reads the log as summary, then kept tail, then later messages.
Earned in lesson 12, The wall. In Tau: CompactionEntry (src/tau_agent/session/entries.py:72-85) and the replay rule in _apply_compaction (src/tau_agent/session/memory.py:151-197).
consumer
Whatever code iterates a run's events: a renderer's loop, a test, a web handler. It sets the pace, because the loop is suspended while the consumer handles an event, and it can walk away by closing the run.
Earned in lesson 07, Show your work.
content block
One item in an assistant message's content list: {"type": "text", ...} or {"type": "toolCall", ...}. The list is ordered, so prose and calls stay in the order the model wrote them.
First met in lesson 01; earned in lesson 02, Words are not deeds. In Tau: TextContent and ToolCall (src/tau_agent/messages.py:96-122); Tau also has thinking and image blocks.
context file
A file of standing project instructions, AGENTS.md, collected from the top of the workspace down to the working directory and placed in the system prompt with its path. Whoever wrote that file is writing part of your system prompt.
Earned in lesson 13, The briefing. In Tau: _context_file_candidates (src/tau_coding/context.py:44-95).
context window
The most tokens a model accepts in one request. [general] Past it a provider answers with an error such as prompt is too long instead of a reply; the lab's model has a window of 2,000 tokens so that you can hit the wall quickly.
Earned in lesson 12, The wall. In Tau: defaults in context_window.py (src/tau_coding/context_window.py:17-24).
cooperative cancellation
Stopping a run by asking: cancel() sets the token, and each slow piece (the top of a turn, the tool boundary, the bash tool's poll loop) checks it and stops itself. It leaves a valid record, and it cannot stop code that never looks.
Earned in lesson 15, The stop button that does not stop. In Tau: the loop's check before each tool (src/tau_agent/loop.py:304-306).
cut point
The index at which compaction splits the log's rows into those to summarise and those to keep. It snaps forward to a turn boundary, a user message, so the kept tail never opens on a tool result whose call was summarised away.
Earned in lesson 12, The wall. In Tau: _first_recent_context_index (src/tau_coding/session.py:3977-4011).

D

dangling call
A tool call in the record with no result after it, left behind when a run was closed or killed mid-tool. Sent as it stands, it makes a provider reject every later request, so one bad pair can brick a whole session.
Earned in lesson 10, The poisoned transcript.
delta
A fragment of a reply as it streams in: a few characters of text, or a piece of the JSON string that will become a tool call's arguments. Text deltas may be shown at once; argument deltas may only be collected, and are parsed once, when the block ends.
Earned in lesson 16, Capstone: out of the browser. In Tau: MessageUpdateEvent (src/tau_agent/events.py:39-45).
deny-list
A check that blocks calls matching known-bad patterns, as deny_destructive refuses rm -rf. It is a speed bump, not a sandbox: rm -fr build walks straight past it.
Earned in lesson 14, The veto. In Tau: the example permission gate is a deny-list too (examples/extensions/permission_gate.py:26-45).

E

entry
One line of the session log: a JSON object with an id and a type. Lesson 11 has one type, message; lesson 12 adds compaction.
Earned in lesson 11, Pull the plug. In Tau: MessageEntry and nine more entry types (src/tau_agent/session/entries.py:35).
error as observation
A tool failure is not raised at the programmer; it is returned to the model as a tool result with is_error=True and a text written to help it recover. The reader who can fix the mistake is the model, so the error message is a prompt.
Earned in lesson 04, Tell the model what went wrong. In Tau: an unknown tool becomes a result the model reads (src/tau_agent/loop.py:308-311).
eval
Running one fixed task several times against a real model and counting the successes, then changing one thing and counting again. Tests against a fake prove that the harness keeps its contract; only an eval says whether the agent is any good.
Earned in lesson 16, Capstone: out of the browser.
event
A plain dict with a type, yielded by the loop to say what just happened: agent_start, turn_start, message_end, tool_execution_start, tool_execution_end, turn_end, agent_end. Events come in balanced pairs on every exit path and carry data only; how they look is a frontend's business.
Earned in lesson 07, Show your work. In Tau: typed event models with the same type strings (src/tau_agent/events.py:15-87).

F

fail closed
When the check guarding a tool crashes, the call is blocked. A check that raised has not said yes.
Earned in lesson 14, The veto. In Tau: a crashing hook blocks the tool (src/tau_coding/extensions/runtime.py:1049-1059).
fake model
A stand-in for the model that replies from a script, so every run is instant, free and repeatable. It keeps the same contract as a real provider, which is why a harness built against it runs unchanged against the real thing; it tests the harness, never the model.
Earned in lesson 01, The function that forgets. In Tau: FakeProvider (src/tau_ai/fake.py:13-41).
follow-up
A user message queued for the moment the run would otherwise end ("when you're done, run the tests"). The loop asks for one only when a reply holds no tool calls and no steering is waiting, and takes one at a time.
Earned in lesson 09, But I had something to say. In Tau: AgentHarness.follow_up (src/tau_agent/harness.py:121-145), pulled where the run would end (src/tau_agent/loop.py:176-180).
frontend
Code that turns a run's events into something for a reader: a live terminal display, one final answer, JSON lines. It is a fold over the events, render(event) for each and then finish(), and the loop never learns it exists.
Earned in lesson 07, Show your work. In Tau: the EventRenderer protocol (src/tau_coding/rendering/base.py:20-27).

G

generator
A Python function containing yield: calling it runs nothing, each next() runs it to the next yield, and close() runs its finally. It is what lets the loop hand over one event and wait until the consumer asks for the next.
Earned in lesson 07, Show your work.
guard
A wrapper around a tool, under the same name and schema, whose execute first asks a check whether the call may run. A refusal is raised inside the wrapper, so the tool boundary turns it into the call's one error result, and the loop never learns a guard exists.
Earned in lesson 14, The veto. In Tau: extensions wrap the tool's executor the same way (src/tau_coding/extensions/runtime.py:994-1042).
guideline
A sentence of advice carried by a tool, such as Use read to examine files instead of cat or sed. A schema can say what a tool takes; only words can say when to use it, so the advice lives on the tool and reaches the prompt only while that tool is enabled.
Earned in lesson 13, The briefing. In Tau: AgentTool.prompt_guidelines (src/tau_agent/tools.py:85-86).

H

hard cancel
The backstop for a tool that ignores its token: task.cancel() raises CancelledError inside the await the tool is stuck in. It must pass through the tool boundary and the guard untouched, which is why the boundary catches Exception and nothing wider.
Earned in lesson 15, The stop button that does not stop. In Tau: _run_tool re-raises it explicitly (src/tau_agent/loop.py:358-359).
harness
Loosely, everything you build around the model in this course; the file is harness.py. Precisely, from lesson 8, the Harness object: it owns the one transcript and the settings that stay the same from run to run, and lets one run at a time write to it.
First met in lesson 01; earned in lesson 08, Who holds the list?. In Tau: AgentHarness (src/tau_agent/harness.py:62-77).

I

I1: the only memory
The first of the course's three invariants: the transcript is the only memory, and all of it is re-read and re-paid on every call. Whatever the model should know on the next turn has to be in the list, and whatever is in the list costs tokens again.
Earned in lesson 06, The firehose. Planted in lesson 1; used again in lessons 12 and 13.
I2: one call, one result
The second invariant: one call in, exactly one result out, right after it. Every tool call in the transcript is followed by exactly one tool result carrying its id, whether the tool worked, failed, was blocked or was cancelled.
Earned in lesson 04, Tell the model what went wrong. Half-built in lesson 2; probed in lessons 5, 8, 9, 10, 12, 14 and 15. In Tau: repair_tool_history states it in one line (src/tau_agent/tool_history.py:40-47).
I3: the record is not the view
The third invariant: the record is not the view. Keep everything that happened; compute, for every request, what you send.
Earned in lesson 10, The poisoned transcript. Planted in lesson 5; used again in lessons 11 and 12. In Tau: _provider_context (src/tau_agent/loop.py:185-201).
idempotent
Doing it twice gives what doing it once gives: repair(repair(x)) == repair(x), and a valid history comes back unchanged. That is what makes it free to repair before every request instead of once at load.
Earned in lesson 10, The poisoned transcript.
in-band error
A stop or a provider failure written into the transcript as an assistant message, with empty content, stop_reason "error" and the reason in error_message, instead of being raised. Every exit then leaves a transcript you could send again.
Earned in lesson 05, Knowing when to stop. In Tau: _error_message (src/tau_agent/loop.py:370-376).
is_error
The flag on a tool result that says the tool could not do its job: an unknown tool, bad arguments, an exception and, in later lessons, a blocked or a cancelled call. Bad news is not an error: a test run that exits with code 1 did its job, and comes back as an ordinary result ending Command exited with code 1.
Earned in lesson 04, Tell the model what went wrong. In Tau: ToolResultMessage.is_error (src/tau_agent/messages.py:210-218).

J

JSON Lines
A text file holding one JSON object per line. Appending a line never touches the earlier ones, and a torn last line is easy to detect and to name by its number.
Earned in lesson 11, Pull the plug. In Tau: a bad line is a loud, numbered error (src/tau_agent/session/jsonl.py:44-50).

M

max_turns
A cap on the number of model calls in one run, checked at the top of a turn: before the call, never after it. When it is reached the loop appends an in-band error, Agent stopped after max_turns=N, and ends the run with every call answered.
Earned in lesson 05, Knowing when to stop. In Tau: the same check in the same place (src/tau_agent/loop.py:112-120); no cap by default (src/tau_agent/harness.py:44).
message
One dict in the transcript, tagged with the role that spoke. A user message holds a string; an assistant message holds a list of content blocks, a stop reason and its usage; lesson 2 adds a third shape for tool results.
Earned in lesson 01, The function that forgets. In Tau: the AgentMessage union (src/tau_agent/messages.py:275-284).
mutate, then announce
The loop's one ordering rule: append a message to the record first, and only then yield the event that announces it, with no yield between a tool returning and its result being recorded. A consumer who stops listening at any moment has therefore never seen something the record lacks.
Earned in lesson 07, Show your work. In Tau: Tau's order differs: an assistant's message_end is yielded before the message is appended (src/tau_agent/loop.py:122-147).

O

orphan result
A tool result whose call is nowhere in the transcript. Repair drops it instead of inventing the call: nobody knows the arguments, and an invented call is a lie the model would reason from.
Earned in lesson 10, The poisoned transcript.
output budget
The cap on what one tool result may bring back: 2,000 lines or 50,000 bytes in your harness. It exists because whatever a tool returns is re-read and re-paid on every later turn.
Earned in lesson 06, The firehose. In Tau: 2,000 lines or 50 KB (src/tau_coding/tools.py:41-42).

P

persona
A scripted model step that reacts to each request by one simple rule, printed beside the cell that uses it: forgetful, stuck, pager, summariser, gullible. Because the rule is on the page, every reveal follows from text you can read.
Earned in lesson 01, The function that forgets.
prompt cache
[general] A provider can bill the unchanged prefix of a request at a lower rate, reported in usage as cache_read. One changed byte near the top, such as a timestamp with seconds, ends the match, so the system prompt is kept byte-stable and the date goes last.
Earned in lesson 13, The briefing. In Tau: cache breakpoints on tools, system prompt and recent request tails (src/tau_ai/anthropic.py:59-67).
prompt injection
Text inside something the agent reads (a file, a web page, a tool result) that is written as an instruction and gets obeyed as one. It works because instructions and data travel on one channel, so no sentence in the system prompt reliably prevents it; the rules that matter are enforced in code, at the tool boundary.
Earned in lesson 14, The veto.
provider
The service that runs a model behind an HTTP API. [general] The API is stateless: it is sent the whole conversation with every request and keeps nothing between them.
Earned in lesson 01, The function that forgets. In Tau: the ModelProvider protocol (src/tau_agent/provider.py:19-37).

R

raw arguments
What the adapter passes on when a tool call's collected argument text is not valid JSON: {"_raw_arguments": text} in place of an exception. The tool's own str_arg check then rejects it, and the model reads the error and corrects itself.
Earned in lesson 16, Capstone: out of the browser. In Tau: the same fallback (src/tau_ai/anthropic.py:413-422).
record
The list of everything that happened, in order, including failed replies and calls nobody answered. It is appended to and never rewritten to look better.
First met in lesson 05; earned in lesson 10, The poisoned transcript. In Tau: AgentHarness keeps it as _messages and hands out snapshots (src/tau_agent/harness.py:79-81).
repair
repair_tool_history: a pure function that returns a copy of the transcript in which every tool call is followed at once by exactly one result. A recorded result is moved into place, a duplicate or an orphan is dropped, a call with no result gets a synthetic one; it is applied to the view on every request and never written back into the record.
Earned in lesson 10, The poisoned transcript. In Tau: a function of the same name (src/tau_agent/tool_history.py:40-47), applied on every request (src/tau_agent/loop.py:201). Tau also appends the synthetic results to its record (src/tau_agent/harness.py:239-259); lesson 10 says why the course does not.
replay
Computing the current transcript by reading the log from its first line: the state is a fold over entries and is never itself saved. Resuming a session is Harness(..., messages=log.replay()) and nothing more.
Earned in lesson 11, Pull the plug. In Tau: SessionState (src/tau_agent/session/memory.py:22-30).
role
The tag on a message that says who spoke: user, assistant and, from lesson 2, toolResult. Underneath, the model receives one sequence of text; roles exist so that nobody can forge who said what.
Earned in lesson 01, The function that forgets. In Tau: the message union is discriminated on role (src/tau_agent/messages.py:275-284); Tau has seven roles.
run
Everything that happens from one prompt until the loop stops: one turn or many. From lesson 7 a run is a generator of events, and it is either driven to its end or explicitly closed, never abandoned.
Earned in lesson 03, Turn the crank.
run guard
The check in Harness.prompt that refuses a second run while one is going on: RuntimeError, already running. prompt is a plain def, so the refusal lands on the caller's line and not at the first next().
Earned in lesson 08, Who holds the list?. In Tau: _ensure_not_running (src/tau_agent/harness.py:213-217).

S

sandbox
Confinement enforced from outside the agent's code, such as a container or a restricted account, that limits what a command can touch whatever the command says. Your tools have none; a guard is policy at the door, not a sandbox.
Earned in lesson 14, The veto. In Tau: no confinement either: a path argument may be absolute or start with ~ (src/tau_coding/tools.py:1036-1041).
scripted model
lab.ScriptedModel, the course's fake model: a list of steps, each a fixed reply or a function of the request. It is strict: sent an invalid transcript, it answers with a 400-style error reply, as a real API would, and never raises.
Earned in lesson 01, The function that forgets. In Tau: FakeProvider (src/tau_ai/fake.py:13-41).
session log
SessionLog: the session on disk, one JSON line per entry — a message as it completes, and from lesson 12 a compaction. The log is the truth; the transcript is what you get when you read it back.
Earned in lesson 11, Pull the plug. In Tau: JsonlSessionStorage (src/tau_agent/session/storage.py:38).
shell (lab)
lab.Shell: a simulator, not a shell, and the page says so. It answers the handful of commands the lessons need with scripted output and exit codes, because no real process can run in the browser.
Earned in lesson 04, Tell the model what went wrong.
skill
A file of instructions for one kind of task, kept on disk. Only an index (name, description, path) goes into the system prompt, and the model loads a body with the read tool when a task matches, so thirty skills cost a few lines per request instead of their full text.
Earned in lesson 13, The briefing. In Tau: the index (src/tau_coding/system_prompt.py:315-352), shown only when read is enabled (src/tau_coding/system_prompt.py:138-139).
SSE
Server-sent events: the line-based text format in which a provider streams a reply over HTTP. [general] parse_sse reads its data: lines and turns them into deltas and exactly one terminal event.
Earned in lesson 16, Capstone: out of the browser. In Tau: _parse_sse_line (src/tau_ai/anthropic.py:702-707).
stateless
Keeping nothing between calls. model.complete answers from the text of the request it was just sent, and from nothing else.
Earned in lesson 01, The function that forgets.
steering
A user message queued to land as soon as it safely can ("actually, use spaces"): once the current turn's whole batch of tool calls has been answered, before the next model call. It does not abort the tool that is running, and a steer sent while idle goes in with the next prompt.
Earned in lesson 09, But I had something to say. In Tau: AgentHarness.steer (src/tau_agent/harness.py:121-126), pulled after the turn (src/tau_agent/loop.py:174).
stop reason
The label on a reply that says why the model stopped: stop, length, toolUse, and two you meet later, error and aborted. The loop does not use it to decide whether to go on: content beats label, so tool calls in a reply are run whatever the label says.
Earned in lesson 03, Turn the crank. In Tau: StopReason (src/tau_agent/messages.py:154).
subagent
This harness used as a tool: the tool's execute runs a fresh Harness to its end and returns the child's final text as the call's one result. The child's transcript never enters the parent's.
Earned in Checkpoint D, after lesson 16, Capstone: out of the browser.
subscriber
A function registered with Harness.subscribe that hears every event of every run, after the record has changed and before the run's consumer is handed the event. Persistence is a subscriber, so the log is the same whichever frontend consumed the run.
Earned in lesson 11, Pull the plug. In Tau: AgentHarness.subscribe (src/tau_agent/harness.py:108-115); persistence subscribes (src/tau_coding/session.py:3472-3489).
synthetic result
The tool result that repair supplies for a call that has none: is_error=True and the text Tool call interrupted: no result was recorded. ... It says only what is honestly known, and tells the model to check before repeating the call.
Earned in lesson 10, The poisoned transcript. In Tau: its text is Tool call interrupted by user (src/tau_agent/tool_history.py:16); the course's claims only what is known.
system prompt
The standing instructions sent with every request, as an argument separate from the messages. From lesson 13 it is build output: a pure function of the enabled tools, the project's context files and a skills index, with the date and the working directory last.
First met in lesson 01; earned in lesson 13, The briefing. In Tau: build_system_prompt (src/tau_coding/system_prompt.py:73-78).

T

terminal event
The one event that ends a streamed reply, done or error, carrying the whole assistant message. parse_sse guarantees exactly one: a stream that simply stops yields an error that keeps the partial content.
Earned in lesson 16, Capstone: out of the browser. In Tau: synthesised when the vendor never sends one (src/tau_ai/stream.py:225-232).
token
The unit a model reads, writes and bills in: a word, or a piece of one. The lab counts four characters as one token; real tokenizers differ, and none of the course's arithmetic depends on the difference.
Earned in lesson 01, The function that forgets. In Tau: the same estimate where no tokenizer is at hand (src/tau_coding/context_window.py:17).
tool
Three things advertised to the model, a name, a description and a parameter schema, plus one function, execute, that only your code ever runs. The model never sees the function; it can only ask.
Earned in lesson 02, Words are not deeds. In Tau: AgentTool (src/tau_agent/tools.py:76-105).
tool boundary
run_tool, the one place that runs a tool and turns any failure into a result: tools just raise, and a single try / except Exception converts. One call in, exactly one result out, on every path.
Earned in lesson 04, Tell the model what went wrong. In Tau: _run_tool (src/tau_agent/loop.py:343-363).
tool call
A content block of type toolCall in an assistant message: an id, a tool name and an arguments dict. It is a specially shaped piece of the reply, a request and no more; nothing happens until your code runs it.
Earned in lesson 02, Words are not deeds. In Tau: ToolCall (src/tau_agent/messages.py:115-122); the list of calls is derived, never stored (src/tau_agent/messages.py:205-207).
tool result
A message with role toolResult that carries a tool's output back to the model, tied to its call by tool_call_id. It goes right after the assistant message that asked: one per call, in call order.
Earned in lesson 02, Words are not deeds. In Tau: ToolResultMessage (src/tau_agent/messages.py:210-218).
tool spec
What the model is told about a tool: its name, its description and its parameters, and nothing else. tool_specs(tools) builds the list, and it is sent, and paid for, with every request.
Earned in lesson 02, Words are not deeds. In Tau: only these three leave the process (src/tau_ai/anthropic.py:687-699).
transcript
The ordered list of role-tagged messages that your code owns and sends in full with every call. It is the only memory the model has.
Earned in lesson 01, The function that forgets. In Tau: messages: list[AgentMessage], owned by the caller and appended to in place (src/tau_agent/loop.py:52-60).
truncation
Cutting a tool's output down to the budget: whole lines only, measured in UTF-8 bytes, keeping the head of a file and the tail of command output, where the verdict comes last. It is never silent.
Earned in lesson 06, The firehose. In Tau: truncate_head (src/tau_coding/tools.py:817-857) and truncate_tail (src/tau_coding/tools.py:860-904).
truncation notice
The last line of a truncated result, which tells the model what it is not seeing and what to do next: [Showing lines 1-20 of 50. Use offset=21 to continue.] Without it the model concludes, with confidence, that what it was not shown does not exist.
Earned in lesson 06, The firehose. In Tau: the same wording (src/tau_coding/tools.py:332-355).
turn
One pass of the loop: one model call, then the tool calls its reply asked for, each with its result. From lesson 7 a turn is bracketed by turn_start and turn_end, and a user message may enter only at the top of one.
Earned in lesson 03, Turn the crank. In Tau: TurnStartEvent and TurnEndEvent (src/tau_agent/events.py:24-31).

U

usage
The token counts a reply carries: input, output and cache_read. The lab's bill meter adds them up, which is how the cost of resending the transcript becomes something you can watch.
Earned in lesson 01, The function that forgets. In Tau: Usage (src/tau_agent/messages.py:46-56).

V

valid transcript
A transcript in a shape a provider accepts. [general] Real APIs reject a malformed one with an HTTP 400 instead of a reply; the lab's strict model does the same, and lab.validate lists what is wrong.
Earned in lesson 01, The function that forgets.
view
What the model is actually sent: context_for_model(messages), computed afresh from the record for every request. It leaves out empty failed replies and, from lesson 10, repairs the pairing of calls and results; the record itself is never changed.
First met in lesson 05; earned in lesson 10, The poisoned transcript. In Tau: _provider_context (src/tau_agent/loop.py:185-201).

W

wire format
A vendor's own JSON for a request, as opposed to your neutral message dicts. to_anthropic is a pure translation from one to the other; on that wire a tool result travels as a tool_result block inside a user message.
Earned in lesson 16, Capstone: out of the browser. In Tau: the same translation (src/tau_ai/anthropic.py:652-672).
workspace (lab)
lab.Workspace: the in-memory file system that the course's tools read and write. It keeps a log of every read and write, so a test, or you, can ask what really happened.
Earned in lesson 02, Words are not deeds.

Terms by lesson

The same entries in the order the course earns them. A lesson never uses one of these names above the point where you have built the thing it names.

  1. 01 The function that forgetsfake model, message, persona, provider, role, scripted model, stateless, token, transcript, usage, valid transcript
  2. 02 Words are not deedscall id, content block, tool, tool call, tool result, tool spec, workspace (lab)
  3. 03 Turn the crankagent, agent loop, run, stop reason, turn
  4. 04 Tell the model what went wrongerror as observation, I2: one call, one result, is_error, shell (lab), tool boundary
  5. 05 Knowing when to stopin-band error, max_turns
  6. 06 The firehoseI1: the only memory, output budget, truncation, truncation notice
  7. 07 Show your workconsumer, event, frontend, generator, mutate, then announce
  8. 08 Who holds the list?harness, run guard
  9. 09 But I had something to sayfollow-up, steering
  10. 10 The poisoned transcriptdangling call, I3: the record is not the view, idempotent, orphan result, record, repair, synthetic result, view
  11. 11 Pull the plugappend-only, entry, JSON Lines, replay, session log, subscriber
  12. 12 The wallcompaction, context window, cut point
  13. 13 The briefingcontext file, guideline, prompt cache, skill, system prompt
  14. 14 The vetodeny-list, fail closed, guard, prompt injection, sandbox
  15. 15 The stop button that does not stopaborted, await, cancellation token, colour rule, cooperative cancellation, hard cancel
  16. 16 Capstone: out of the browseradapter, delta, eval, raw arguments, SSE, subagent, terminal event, wire format