{ "version": 1, "slug": "vllm-streaming-tool-call-parser-corruption-2026", "evidence_class": "private_local_fixture_check", "what_this_is": "A client-side, pure-stdlib check of the published gate against hand-written OpenAI-compatible streaming deltas. No vLLM package, model weights, GPU, tokenizer or vendor endpoint is involved. This record does not measure vLLM or any hosted API.", "run": { "command": "/home/ubuntu/blog-automation/.venv/bin/python toolcall_gate.py --selftest", "cwd": "research/evidence/vllm-streaming-tool-call-parser-corruption-2026", "started_at_utc": "2026-10-28T12:07:37.837575+00:00", "ended_at_utc": "2026-10-28T12:07:37.911143+00:00", "exit_code": 0, "stdout": "{\n \"cases\": [\n {\n \"case\": \"clean_stream_split_at_every_byte_offset\",\n \"offsets\": 760,\n \"failures\": 0,\n \"detected\": true\n },\n {\n \"case\": \"merged_calls\",\n \"detected\": true,\n \"codes\": [\n \"ARGUMENTS_NOT_JSON\",\n \"CALL_COUNT_MISMATCH\"\n ],\n \"call_count\": 1\n },\n {\n \"case\": \"truncated_arguments\",\n \"detected\": true,\n \"codes\": [\n \"ARGUMENTS_NOT_JSON\"\n ],\n \"call_count\": 2\n },\n {\n \"case\": \"retyped_arguments\",\n \"detected\": true,\n \"codes\": [\n \"TYPE_MISMATCH\"\n ],\n \"call_count\": 2\n },\n {\n \"case\": \"dropped_non_string_arguments\",\n \"detected\": true,\n \"codes\": [\n \"MISSING_REQUIRED\"\n ],\n \"call_count\": 2\n }\n ],\n \"failures\": [],\n \"summary\": {\n \"cases\": 5,\n \"failed\": 0\n }\n}\n", "stderr": "", "python": "3.12.13", "platform": "Linux-6.17.0-1019-oracle-aarch64-with-glibc2.39" }, "inputs": { "toolcall_gate.py": "37f15a2846fc20ab05f1e4931af0ed489cf29fc72fcac9939bc31dc8d480247e", "fixtures/sse_parallel_toolcalls.json": "394222291fe501026cf5de245d0391f51e58b00ae1fedadfefb31efe400f5025", "fixtures/tool_schema.json": "e19f1adea05231ee8bb707a4eec642e3ef5ea1d3c76af601b9201bf512049716" }, "method": [ "A 5-event fixture stream carrying two parallel tool calls is serialised as OpenAI SSE frames and split into two byte chunks at every offset from 0 to the full length (760 splits); each split is reassembled and validated.", "Four constructed corruptions are derived from the same stream: two calls merged into one delta with concatenated argument text; arguments cut mid-string; integer, boolean and array values re-encoded as strings; and all non-string arguments dropped.", "The expected outcome is zero rejections for every clean split and at least one specific issue code for every corruption." ], "interpretation": "The gate is demonstrated to be boundary-safe and to catch the four constructed corruption classes in this fixture. vLLM parser behaviour itself was not exercised; the reports in the article remain third-party claims.", "not_claimed": [ "no vLLM import or reproduction", "no model output was sampled", "no timing, throughput or accuracy number" ] }