Companion to the talk. This is the take-home of the hands-on hour: a single runnable file that wraps a tiny LLM-plus-tool agent in OpenTelemetry spans and prints its trace as a span waterfall. No build, no API key, no network. Open the lab, copy the file, run it, then watch the slow span light up. ASCII-only so it runs on Windows without a UnicodeEncodeError.
A faithful, minimal OpenTelemetry tracer that instruments an LLM-plus-tool agent loop and prints a real span-tree waterfall: trace ids, parent links, GenAI semconv attributes, and a read-out of latency, token cost, and errors. Run it with --slow and watch the bottleneck light up.
Glass box to glass house. One agent calls another over A2A; the caller injects a W3C traceparent, the callee extracts it, and the whole conversation joins into one multi-agent waterfall. Then run --broken and watch context propagation fail.
A live multi-agent trace in the page. Click any span to inspect its OTel attributes, then hit "break propagation" to drop the traceparent and watch the researcher fall out of the trace into an orphan. Same trace lab 02 emits, made clickable.
A laptop with Python 3.10+ (the lab uses the standard library only, so there is nothing to install). An agent you ship, or want to. Curiosity about where its time and tokens actually go.
Lab 01: trace one agent, run --slow, find the bottleneck. Lab 02: join two agents into one trace with a real traceparent, then --broken to see propagation fail. Lab 03: click into that trace and inspect spans. By 10pm your agents are a glass house.
Labs are single-file, no build, view-source friendly. The Python recipes are ASCII-only so they run on Windows without UnicodeEncodeError. Swap in the real OpenTelemetry SDK when you want a live backend.