<!-- Generated by scripts/regen_teaching_chapters.py; do not edit this template. -->
# Teaching ladder progress worksheet

[← Teaching ladder](./)

This is a generated **blank template**. Copy it to a personal notes location before
checking boxes; regeneration restores this file to its blank state. Keep commands,
record names, measurements, and explanations in your copy—not credentials, raw audio,
or sensitive transcript text.

A chapter is complete only when every box on its card is checked and its self-check
score reaches N/N. Retry only missed answers; preserve wrong predictions because they
are evidence to explain, not history to rewrite. Chapters 2-15 begin with a
two-chapter-lag recall. At each phase boundary, pass all four integration criteria at
4/4 before starting the next chapter card.

## Chapter 0 — Hello, Audio

[Narrative](./00-hello-audio/) · [Exercises](./00-hello-audio/EXERCISES.md)

- [ ] **Predict:** Which rates belong to the wire, pipeline/provider input, provider defaults, and
  WebRTC media boundaries?
- [ ] **Prepare:** from the repository root, run `uv sync --extra local --group dev`.
- [ ] **Run:** `uv run python docs/teaching/00-hello-audio/format_boundaries.py`.
- [ ] **Find:** wire, provider-input, pipeline, config-default, and media roles use different
  rates.
- [ ] **Reflect:** If any rate surprised you, name the boundary and the conversion its neighbor
  requires.
- [ ] **Practice:** complete [the chapter exercises](./00-hello-audio/EXERCISES.md) and keep an
  attempt record for every task.
- [ ] **Retrieve:** pass all 3 numbered questions in [the closed-book
  self-check](./00-hello-audio/EXERCISES.md#self-check); record 3/3 with one attempt-evidence
  citation per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 0 --jobs 4 --show-evidence` and explain any mismatch.

## Chapter 1 — Echo

[Narrative](./01-echo/) · [Exercises](./01-echo/EXERCISES.md)

- [ ] **Predict:** How many chunks will be accepted or rejected, and does matching `TransportLike`
  imply full `Transport` conformance?
- [ ] **Prepare:** from the repository root, run `uv sync --extra local --group dev`.
- [ ] **Run:** `uv run python docs/teaching/01-echo/transport_contract_probe.py`.
- [ ] **Find:** two chunks are accepted, one is rejected, and `version_info()` changes full
  conformance.
- [ ] **Reflect:** Explain why structural compatibility can pass while full runtime conformance
  fails.
- [ ] **Practice:** complete [the chapter exercises](./01-echo/EXERCISES.md) and keep an attempt
  record for every task.
- [ ] **Retrieve:** pass all 3 numbered questions in [the closed-book
  self-check](./01-echo/EXERCISES.md#self-check); record 3/3 with one attempt-evidence citation per
  answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 1 --jobs 4 --show-evidence` and explain any mismatch.

## Chapter 2 — Transcribe

[Narrative](./02-transcribe/) · [Exercises](./02-transcribe/EXERCISES.md)

- [ ] **Recall earlier:** before the narrative, retrieve Chapter 0 — Hello, Audio in [Recall before
  reading](./02-transcribe/#recall-before-reading); keep the first answer and its evidence-backed
  repair.
- [ ] **Predict:** When a partial revises `fifteen` to `fifty`, which effects may happen before
  `FINAL`, and which must wait?
- [ ] **Prepare:** from the repository root, run `uv sync --extra quickstart --group dev`.
- [ ] **Run:** `uv run python docs/teaching/02-transcribe/partial_policy_probe.py`.
- [ ] **Find:** revised partials cancel speculation; only the final `fifty` commits the safe
  action.
- [ ] **Reflect:** Identify the irreversible side effect that would be wrong if it fired on a
  revised partial.
- [ ] **Practice:** complete [the chapter exercises](./02-transcribe/EXERCISES.md) and keep an
  attempt record for every task.
- [ ] **Retrieve:** pass all 6 numbered questions in [the closed-book
  self-check](./02-transcribe/EXERCISES.md#self-check); record 6/6 with one attempt-evidence
  citation per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 2 --jobs 4 --show-evidence` and explain any mismatch.

## Chapter 3 — Parrot, the Naive Way

[Narrative](./03-parrot-naive/) · [Exercises](./03-parrot-naive/EXERCISES.md)

- [ ] **Recall earlier:** before the narrative, retrieve Chapter 1 — Echo in [Recall before
  reading](./03-parrot-naive/#recall-before-reading); keep the first answer and its evidence-backed
  repair.
- [ ] **Predict:** Can either a 500 ms or 2,000 ms silence timeout avoid both false splits and
  added commit latency?
- [ ] **Prepare:** from the repository root, run `uv sync --extra quickstart --group dev`.
- [ ] **Run:** `uv run python docs/teaching/03-parrot-naive/timeout_policy_probe.py`.
- [ ] **Find:** 500 ms fires 45 ms before the next word; 2,000 ms adds a 2,005 ms commit wait.
- [ ] **Reflect:** State which timeout failure you would accept for a target conversation and why.
- [ ] **Practice:** complete [the chapter exercises](./03-parrot-naive/EXERCISES.md) and keep an
  attempt record for every task.
- [ ] **Retrieve:** pass all 5 numbered questions in [the closed-book
  self-check](./03-parrot-naive/EXERCISES.md#self-check); record 5/5 with one attempt-evidence
  citation per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 3 --jobs 4 --show-evidence` and explain any mismatch.

## Chapter 4 — VAD + Pre-roll

[Narrative](./04-vad-preroll/) · [Exercises](./04-vad-preroll/EXERCISES.md)

- [ ] **Recall earlier:** before the narrative, retrieve Chapter 2 — Transcribe in [Recall before
  reading](./04-vad-preroll/#recall-before-reading); keep the first answer and its evidence-backed
  repair.
- [ ] **Predict:** Which frames disappear when pre-roll is disabled, and does the trigger frame
  itself remain?
- [ ] **Prepare:** from the repository root, run `uv sync --extra quickstart --group dev`.
- [ ] **Run:** `uv run python docs/teaching/04-vad-preroll/preroll_probe.py`.
- [ ] **Find:** pre-roll restores both cached frames before trigger/live; disabling it starts at
  trigger.
- [ ] **Reflect:** Use the frame order to explain which part of an utterance pre-roll protects.
- [ ] **Practice:** complete [the chapter exercises](./04-vad-preroll/EXERCISES.md) and keep an
  attempt record for every task.
- [ ] **Retrieve:** pass all 3 numbered questions in [the closed-book
  self-check](./04-vad-preroll/EXERCISES.md#self-check); record 3/3 with one attempt-evidence
  citation per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 4 --jobs 4 --show-evidence` and explain any mismatch.

## Chapter 5 — The Blocking Agent

[Narrative](./05-blocking-agent/) · [Exercises](./05-blocking-agent/EXERCISES.md)

- [ ] **Recall earlier:** before the narrative, retrieve Chapter 3 — Parrot, the Naive Way in
  [Recall before reading](./05-blocking-agent/#recall-before-reading); keep the first answer and
  its evidence-backed repair.
- [ ] **Predict:** Which sub-gap dominates first-audio latency, and does full TTS enqueue define
  when the user first hears audio?
- [ ] **Prepare:** from the repository root, run `uv sync --extra quickstart --group dev`.
- [ ] **Run:** `uv run python docs/teaching/05-blocking-agent/gap_decomposition_probe.py`.
- [ ] **Find:** 1,200 ms agent plus 450 ms TTS equals 1,650 ms total; full enqueue takes 800 ms.
- [ ] **Reflect:** Point to the milestone that defines first audio and explain why full enqueue is
  not it.
- [ ] **Practice:** complete [the chapter exercises](./05-blocking-agent/EXERCISES.md) and keep an
  attempt record for every task.
- [ ] **Retrieve:** pass all 3 numbered questions in [the closed-book
  self-check](./05-blocking-agent/EXERCISES.md#self-check); record 3/3 with one attempt-evidence
  citation per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 5 --jobs 4 --show-evidence` and explain any mismatch.

## Chapter 6 — Streaming Agent + Sentence TTS

[Narrative](./06-streaming-agent/) · [Exercises](./06-streaming-agent/EXERCISES.md)

- [ ] **Recall earlier:** before the narrative, retrieve Chapter 4 — VAD + Pre-roll in [Recall
  before reading](./06-streaming-agent/#recall-before-reading); keep the first answer and its
  evidence-backed repair.
- [ ] **Predict:** Do per-sentence acceptance counts stay independent, and do they add up to the
  turn totals?
- [ ] **Prepare:** from the repository root, run `uv sync --extra quickstart --group dev`.
- [ ] **Run:** `uv run python docs/teaching/06-streaming-agent/tts_delivery_probe.py`.
- [ ] **Find:** sentence delivery rows preserve acceptance separately and roll up to one matching
  turn.
- [ ] **Reflect:** Trace one sentence row into the turn totals and explain what a rejected chunk
  changes.
- [ ] **Practice:** complete [the chapter exercises](./06-streaming-agent/EXERCISES.md) and keep an
  attempt record for every task.
- [ ] **Retrieve:** pass all 5 numbered questions in [the closed-book
  self-check](./06-streaming-agent/EXERCISES.md#self-check); record 5/5 with one attempt-evidence
  citation per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 6 --jobs 4 --show-evidence` and explain any mismatch.

## Chapter 7 — Tools, Mid-stream

[Narrative](./07-tools/) · [Exercises](./07-tools/EXERCISES.md)

- [ ] **Recall earlier:** before the narrative, retrieve Chapter 5 — The Blocking Agent in [Recall
  before reading](./07-tools/#recall-before-reading); keep the first answer and its evidence-backed
  repair.
- [ ] **Predict:** Does a fast tool need filler; when slow filler is rejected, which audio becomes
  first?
- [ ] **Prepare:** from the repository root, run `uv sync --extra quickstart --group dev`.
- [ ] **Run:** `uv run python docs/teaching/07-tools/filler_delivery_probe.py`.
- [ ] **Find:** fast tools skip filler; rejected filler has zero accepted chunks and reply audio
  comes first.
- [ ] **Reflect:** Explain why filler production alone cannot establish what the caller heard
  first.
- [ ] **Practice:** complete [the chapter exercises](./07-tools/EXERCISES.md) and keep an attempt
  record for every task.
- [ ] **Retrieve:** pass all 3 numbered questions in [the closed-book
  self-check](./07-tools/EXERCISES.md#self-check); record 3/3 with one attempt-evidence citation
  per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 7 --jobs 4 --show-evidence` and explain any mismatch.

## Chapter 8 — Smart-turn

[Narrative](./08-smart-turn/) · [Exercises](./08-smart-turn/EXERCISES.md)

- [ ] **Recall earlier:** before the narrative, retrieve Chapter 6 — Streaming Agent + Sentence TTS
  in [Recall before reading](./08-smart-turn/#recall-before-reading); keep the first answer and its
  evidence-backed repair.
- [ ] **Predict:** How do 200 ms early silence, 40 ms inference, and 800 ms fallback compare with
  the 800 ms VAD baseline?
- [ ] **Prepare:** from the repository root, run `uv sync --extra quickstart --group dev`.
- [ ] **Run:** `uv run python docs/teaching/08-smart-turn/endpoint_wait_probe.py`.
- [ ] **Find:** smart accept takes 240 ms, VAD 800 ms, and fallback 1,040 ms from three components.
- [ ] **Reflect:** Name the component each path adds or skips and which path wins against the
  baseline.
- [ ] **Practice:** complete [the chapter exercises](./08-smart-turn/EXERCISES.md) and keep an
  attempt record for every task.
- [ ] **Retrieve:** pass all 5 numbered questions in [the closed-book
  self-check](./08-smart-turn/EXERCISES.md#self-check); record 5/5 with one attempt-evidence
  citation per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 8 --jobs 4 --show-evidence` and explain any mismatch.

## Chapter 9 — Interruption / Barge-in

[Narrative](./09-interruption/) · [Exercises](./09-interruption/EXERCISES.md)

- [ ] **Recall earlier:** before the narrative, retrieve Chapter 7 — Tools, Mid-stream in [Recall
  before reading](./09-interruption/#recall-before-reading); keep the first answer and its
  evidence-backed repair.
- [ ] **Predict:** Does the triggering speech event belong to the interrupted turn, and what must
  finish before the next STT stream?
- [ ] **Prepare:** from the repository root, run `uv sync --extra quickstart --group dev`.
- [ ] **Run:** `uv run python docs/teaching/09-interruption/barge_in_turn_probe.py`.
- [ ] **Find:** triggering speech remains unconsumed while bot cancellation precedes the next STT
  stream.
- [ ] **Reflect:** Use the event order to explain how the next utterance survives interruption
  cleanup.
- [ ] **Practice:** complete [the chapter exercises](./09-interruption/EXERCISES.md) and keep an
  attempt record for every task.
- [ ] **Retrieve:** pass all 5 numbered questions in [the closed-book
  self-check](./09-interruption/EXERCISES.md#self-check); record 5/5 with one attempt-evidence
  citation per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 9 --jobs 4 --show-evidence` and explain any mismatch.

## Build phase review

Without notes, draw one turn from raw input format through STT partial/final, endpointing,
agent/TTS, transport acceptance, and barge-in cancellation.

Score the result against all four criteria below. Mark each criterion **pass** or
**retry** in your progress record; advance only at 4/4 and redo only missed criteria.

- [ ] **Coverage:** the drawing includes every stage from input format through interruption.
- [ ] **Causality:** it marks which observations may revise, which actions commit, and why
  cancellation ordering preserves the next utterance.
- [ ] **Evidence:** it cites attempt evidence for format, partial/final policy, first audio, and
  interruption ordering.
- [ ] **Limits:** it states one caller-heard claim that transport acceptance still cannot prove.

## Chapter 10 — Cleaning the Signal

[Narrative](./10-cleaning-signal/) · [Exercises](./10-cleaning-signal/EXERCISES.md)

- [ ] **Recall earlier:** before the narrative, retrieve Chapter 8 — Smart-turn in [Recall before
  reading](./10-cleaning-signal/#recall-before-reading); keep the first answer and its
  evidence-backed repair.
- [ ] **Predict:** What changes with aligned AEC reference audio, and what should fail when
  reference audio is missing or short?
- [ ] **Prepare:** from the repository root, run `uv sync --extra quickstart --group dev`.
- [ ] **Run:** `uv run python docs/teaching/10-cleaning-signal/replay_metrics_probe.py`.
- [ ] **Find:** aligned reference audio changes RMS by -12.041 dB; missing or short references
  fail.
- [ ] **Reflect:** Tie each failure to the missing replay input and explain what aligned reference
  changes.
- [ ] **Practice:** complete [the chapter exercises](./10-cleaning-signal/EXERCISES.md) and keep an
  attempt record for every task.
- [ ] **Retrieve:** pass all 4 numbered questions in [the closed-book
  self-check](./10-cleaning-signal/EXERCISES.md#self-check); record 4/4 with one attempt-evidence
  citation per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 10 --jobs 4 --show-evidence` and explain any mismatch.

## Chapter 11 — The Journal as Mental Model

[Narrative](./11-journal/) · [Exercises](./11-journal/EXERCISES.md)

- [ ] **Recall earlier:** before the narrative, retrieve Chapter 9 — Interruption / Barge-in in
  [Recall before reading](./11-journal/#recall-before-reading); keep the first answer and its
  evidence-backed repair.
- [ ] **Predict:** How can marginal query counts distinguish an empty filter intersection from a
  misspelled turn?
- [ ] **Prepare:** from the repository root, run `uv sync --extra quickstart --group dev`.
- [ ] **Run:** `uv run python docs/teaching/11-journal/query_coverage_probe.py`.
- [ ] **Find:** a zero-result intersection has marginal matches, while a misspelled turn has none.
- [ ] **Reflect:** Use the marginal counts to decide whether to loosen a filter or fix an
  identifier.
- [ ] **Practice:** complete [the chapter exercises](./11-journal/EXERCISES.md) and keep an attempt
  record for every task.
- [ ] **Retrieve:** pass all 6 numbered questions in [the closed-book
  self-check](./11-journal/EXERCISES.md#self-check); record 6/6 with one attempt-evidence citation
  per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 11 --jobs 4 --show-evidence` and explain any mismatch.

## Chapter 12 — Evals + the Latency Budget

[Narrative](./12-evals-and-latency/) · [Exercises](./12-evals-and-latency/EXERCISES.md)

- [ ] **Recall earlier:** before the narrative, retrieve Chapter 10 — Cleaning the Signal in
  [Recall before reading](./12-evals-and-latency/#recall-before-reading); keep the first answer and
  its evidence-backed repair.
- [ ] **Predict:** Which bundle controls P95, and how far should P95 move when that bundle is
  removed?
- [ ] **Prepare:** from the repository root, run `uv sync --extra quickstart --group dev`.
- [ ] **Run:** `uv run python docs/teaching/12-evals-and-latency/p95_sensitivity_probe.py`.
- [ ] **Find:** removing `turn_02_slow_agent.bundle` alone drops P95 by 1,260 ms.
- [ ] **Reflect:** Explain why one slow bundle controls a small-sample percentile and what not to
  generalize.
- [ ] **Practice:** complete [the chapter exercises](./12-evals-and-latency/EXERCISES.md) and keep
  an attempt record for every task.
- [ ] **Retrieve:** pass all 5 numbered questions in [the closed-book
  self-check](./12-evals-and-latency/EXERCISES.md#self-check); record 5/5 with one attempt-evidence
  citation per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 12 --jobs 4 --show-evidence` and explain any mismatch.

## Operate phase review

Given an unfamiliar bad call, write the diagnostic order before proposing a fix.

Score the result against all four criteria below. Mark each criterion **pass** or
**retry** in your progress record; advance only at 4/4 and redo only missed criteria.

- [ ] **Coverage:** the order covers NR/AEC, journal queries, and latency/eval coverage.
- [ ] **Causality:** it explains why each check precedes the proposed fix and names the strongest
  supported cause.
- [ ] **Evidence:** it cites one bundle or probe result that identifies the bottleneck.
- [ ] **Limits:** it names missing evidence and the metric that would catch a regression.

## Chapter 13 — Swap Providers AND Transports

[Narrative](./13-swap-providers-and-transports/) · [Exercises](./13-swap-providers-and-transports/EXERCISES.md)

- [ ] **Recall earlier:** before the narrative, retrieve Chapter 11 — The Journal as Mental Model
  in [Recall before reading](./13-swap-providers-and-transports/#recall-before-reading); keep the
  first answer and its evidence-backed repair.
- [ ] **Predict:** How many cells result from two provider mixes × three transports, and which
  values stay fixed along each axis?
- [ ] **Prepare:** from the repository root, run `uv sync --extra quickstart --group dev`.
- [ ] **Run:** `uv run python docs/teaching/13-swap-providers-and-transports/matrix_probe.py`.
- [ ] **Find:** two provider mixes cross three transport configs into six cells without changing
  axes.
- [ ] **Reflect:** Pick one row and column; name what changes on each axis and what must remain
  constant.
- [ ] **Practice:** complete [the chapter
  exercises](./13-swap-providers-and-transports/EXERCISES.md) and keep an attempt record for every
  task.
- [ ] **Retrieve:** pass all 4 numbered questions in [the closed-book
  self-check](./13-swap-providers-and-transports/EXERCISES.md#self-check); record 4/4 with one
  attempt-evidence citation per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 13 --jobs 4 --show-evidence` and explain any mismatch.

## Chapter 14 — Bring your own agent

[Narrative](./14-bring-your-own-agent/) · [Exercises](./14-bring-your-own-agent/EXERCISES.md)

- [ ] **Recall earlier:** before the narrative, retrieve Chapter 12 — Evals + the Latency Budget in
  [Recall before reading](./14-bring-your-own-agent/#recall-before-reading); keep the first answer
  and its evidence-backed repair.
- [ ] **Predict:** Can a plain workflow yield both reply text and a session action, and which
  bridge mode should it report?
- [ ] **Prepare:** from the repository root, run `uv sync --extra quickstart --group dev`.
- [ ] **Run:** `uv run python docs/teaching/14-bring-your-own-agent/workflow_state_probe.py`.
- [ ] **Find:** `MyWorkflow` yields a reply plus `EndCallAction`; the bridge reports deep mode.
- [ ] **Reflect:** Trace the workflow yield into both reply and action without framework-specific
  state.
- [ ] **Practice:** complete [the chapter exercises](./14-bring-your-own-agent/EXERCISES.md) and
  keep an attempt record for every task.
- [ ] **Retrieve:** pass all 5 numbered questions in [the closed-book
  self-check](./14-bring-your-own-agent/EXERCISES.md#self-check); record 5/5 with one
  attempt-evidence citation per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 14 --jobs 4 --show-evidence` and explain any mismatch.

## Generalise phase review

Design one provider × transport × agent comparison that changes one axis at a time while preserving
the session and bridge contracts.

Score the result against all four criteria below. Mark each criterion **pass** or
**retry** in your progress record; advance only at 4/4 and redo only missed criteria.

- [ ] **Coverage:** the design names the config or bridge boundary for every axis.
- [ ] **Causality:** it explains what changes on the selected axis and how the other axes stay
  controlled.
- [ ] **Evidence:** it names one invariant event/state shape and the measurement that decides the
  tradeoff.
- [ ] **Limits:** it states one comparison claim that the selected measurement cannot support.

## Chapter 15 — Operate in production

[Narrative](./15-operate-in-production/) · [Exercises](./15-operate-in-production/EXERCISES.md)

- [ ] **Recall earlier:** before the narrative, retrieve Chapter 13 — Swap Providers AND Transports
  in [Recall before reading](./15-operate-in-production/#recall-before-reading); keep the first
  answer and its evidence-backed repair.
- [ ] **Predict:** Which failures release manager slots, and does one stop failure prevent the peer
  stop?
- [ ] **Prepare:** from the repository root, run `uv sync --extra quickstart --group dev`.
- [ ] **Run:** `uv run python docs/teaching/15-operate-in-production/manager_probe.py`.
- [ ] **Find:** failed starts release slots; stop-all records one error and still attempts both
  sessions.
- [ ] **Reflect:** Explain which rollback invariant prevents one failed session from blocking
  another.
- [ ] **Practice:** complete [the chapter exercises](./15-operate-in-production/EXERCISES.md) and
  keep an attempt record for every task.
- [ ] **Retrieve:** pass all 3 numbered questions in [the closed-book
  self-check](./15-operate-in-production/EXERCISES.md#self-check); record 3/3 with one
  attempt-evidence citation per answer.
- [ ] **Replay:** run `uv run python docs/teaching/offline_spine.py --run --through 15 --jobs 4 --show-evidence` and explain any mismatch.

## Ship phase review and finish the ladder

Run `uv run python docs/teaching/offline_spine.py --run --jobs 4 --show-evidence`. Then, without
notes, explain the path from raw PCM through a multi-session production service, including
ownership, start rollback, shutdown, and postmortem evidence.

Score the result against all four criteria below. Mark each criterion **pass** or
**retry** in your progress record; advance only at 4/4 and redo only missed criteria.

- [ ] **Coverage:** the explanation connects raw audio, turn processing, and multi-session
  operation.
- [ ] **Causality:** it explains how ownership, start rollback, and shutdown protect peer sessions.
- [ ] **Evidence:** all 16 offline checkpoints pass and it cites the result that changed the
  learner's model most.
- [ ] **Limits:** it states one production claim the postmortem evidence cannot prove and the next
  measurement needed.
