Conclusion first: your JSON will diff clean on the first day of the migration, and the server-sent stream underneath it will still hand you truncated answers, half-assembled tool calls, and a finish_reason that never fires. Transport is the layer that fails quietly, because nothing raises and nothing looks wrong until an agent loop calls a function with {} as its arguments. This entry in the migration diary is about that layer: recording real streams as byte fixtures, reducing every prov...