wiretruth

Does the telemetry an LLM instrumentation library reports match what the provider actually sent? Each cell replays one provider response through one library and checks every reported value against the wire.

wiretruth 0.1.0 · latest versions · 2026-10-11T13:06:29+00:00 · Python 3.12 · semantic-conventions-genai 6fd0d763 · source

Pages: pinned versions · latest releases. A fix that ships upstream turns its cell green on the latest-releases page first.

pass every graded value matches the wiremissing the span ended without a value the wire carriedwrong a reported value does not match the wirelost the span never ended, so no backend ever receives itbroken the application saw something different from an uninstrumented runinconclusive the harness could not run the cell; no verdict on the library
Scenarioopeninferenceopenllmetryotel-officialcontrol-faultycontrol-honest
anthropic/async-basic
One call (async)
passpasspasspasspass
anthropic/async-stream
Stream read to the end (async)
passwrongpasspasspass
anthropic/async-stream-dropped
Connection drops mid-stream (async)
passmissingpasswrongpass
anthropic/async-stream-early-exit
App closes the stream after two events (async)
lostlostpasslostpass
anthropic/async-stream-error-event
Overloaded error event mid-stream (async)
passmissingpasswrongpass
anthropic/basic
One call
passpasspasspasspass
anthropic/cache-hit
Prompt cache read and write
passpasspasswrongpass
anthropic/rate-limited
HTTP 429
passpasspasswrongpass
anthropic/stream
Stream read to the end
passwrongpasspasspass
anthropic/stream-cache-cumulative
Cache counts repeated in message_delta
passwrongpasswrongpass
anthropic/stream-cache-hit
Prompt cache read and write, streamed
passwrongpasswrongpass
anthropic/stream-dropped
Connection drops mid-stream
passlostpasswrongpass
anthropic/stream-early-exit
App closes the stream after two events
lostlostpasslostpass
anthropic/stream-early-exit-with
App leaves the stream after two events with a with block
passlostpasslostpass
anthropic/stream-error-event
Overloaded error event mid-stream
passlostpasswrongpass
anthropic/tool-call
Two parallel tool uses
passpasspasspasspass
openai/async-basic
One call (async)
passpasspasspasspass
openai/async-stream
Stream read to the end (async)
passpasspasspasspass
openai/async-stream-dropped
Connection drops mid-stream (async)
passwrongpasswrongpass
openai/async-stream-early-exit
App closes the stream after two chunks (async)
lostpasspasslostpass
openai/basic
One call
passpasspasspasspass
openai/cache-hit
Prompt cache hit
passpasspasspasspass
openai/rate-limited
HTTP 429
passpasspasswrongpass
openai/reasoning
Reasoning tokens
passpasspasspasspass
openai/stream
Stream read to the end
passpasspasspasspass
openai/stream-cache-hit
Prompt cache hit, streamed
passpasspasspasspass
openai/stream-dropped
Connection drops mid-stream
passwrongpasswrongpass
openai/stream-early-exit
App closes the stream after two chunks
lostpasspasslostpass
openai/stream-early-exit-with
App leaves the stream after two chunks with a with block
lostpasspasslostpass
openai/stream-no-usage
Stream without include_usage
passpasspasswrongpass
openai/tool-call
Two parallel tool calls
passpasspasspasspass

The controls run the suite's own reference instrumentation. control-honest has to pass every check, and control-faulty has to fail exactly its planted faults. If either moves, the suite is wrong, not a library.

Findings

Every finding cites the rule it applies. To dispute one, open an issue: a disputed finding is marked as such in known_issues.toml.

lost openinference · anthropic/async-stream-early-exit · span.ended
Note
never ended: messages.create
Upstream
reported
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
lost openinference · anthropic/stream-early-exit · span.ended
Note
never ended: messages.create
Upstream
reported
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
lost openinference · openai/async-stream-early-exit · span.ended
Note
never ended: ChatCompletion
Upstream
reported Fix proposed in https://github.com/Arize-ai/openinference/pull/3796.
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
lost openinference · openai/stream-early-exit · span.ended
Note
never ended: ChatCompletion
Upstream
reported Fix proposed in https://github.com/Arize-ai/openinference/pull/3796.
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
lost openinference · openai/stream-early-exit-with · span.ended
Note
never ended: ChatCompletion
Upstream
reported Fix proposed in https://github.com/Arize-ai/openinference/pull/3796.
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
wrong openllmetry · anthropic/async-stream · output_tokens
Expected
419
Reported
420
Read from
gen_ai.usage.output_tokens
Upstream
reported message_delta carries the cumulative output count, and the wrapper adds it to message_start's placeholder of 1.
Rule
Output tokens, with reasoning tokens included.
missing openllmetry · anthropic/async-stream-dropped · error.type
Rule
`error.type` is conditionally required if the operation ended in an error. Any low-cardinality identifier is allowed, so only its presence is graded.
lost openllmetry · anthropic/async-stream-early-exit · span.ended
Note
never ended: anthropic.chat
Upstream
reported Fix proposed in https://github.com/traceloop/openllmetry/pull/4539.
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
missing openllmetry · anthropic/async-stream-error-event · error.type
Rule
`error.type` is conditionally required if the operation ended in an error. Any low-cardinality identifier is allowed, so only its presence is graded.
wrong openllmetry · anthropic/stream · output_tokens
Expected
419
Reported
420
Read from
gen_ai.usage.output_tokens
Upstream
reported message_delta carries the cumulative output count, and the wrapper adds it to message_start's placeholder of 1.
Rule
Output tokens, with reasoning tokens included.
wrong openllmetry · anthropic/stream-cache-cumulative · output_tokens
Expected
467
Reported
468
Read from
gen_ai.usage.output_tokens
Upstream
reported message_delta carries the cumulative output count, and the wrapper adds it to message_start's placeholder of 1.
Rule
Output tokens, with reasoning tokens included.
wrong openllmetry · anthropic/stream-cache-hit · output_tokens
Expected
511
Reported
512
Read from
gen_ai.usage.output_tokens
Upstream
reported message_delta carries the cumulative output count, and the wrapper adds it to message_start's placeholder of 1.
Rule
Output tokens, with reasoning tokens included.
lost openllmetry · anthropic/stream-dropped · span.ended
Note
never ended: anthropic.chat
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
lost openllmetry · anthropic/stream-early-exit · span.ended
Note
never ended: anthropic.chat
Upstream
reported Fix proposed in https://github.com/traceloop/openllmetry/pull/4539.
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
lost openllmetry · anthropic/stream-early-exit-with · span.ended
Note
never ended: anthropic.chat
Upstream
reported Fix proposed in https://github.com/traceloop/openllmetry/pull/4539.
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
lost openllmetry · anthropic/stream-error-event · span.ended
Note
never ended: anthropic.chat
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
wrong openllmetry · openai/async-stream-dropped · error.status
Expected
ERROR
Reported
['OK']
Upstream
reported _ensure_cleanup() sets OK and ends the span before the ERROR status is set, so ERROR is dropped.
Rule
Span status SHOULD follow Recording Errors: an operation that ended in an error sets the status to Error.
missing openllmetry · openai/async-stream-dropped · error.type
Rule
`error.type` is conditionally required if the operation ended in an error. Any low-cardinality identifier is allowed, so only its presence is graded.
wrong openllmetry · openai/stream-dropped · error.status
Expected
ERROR
Reported
['OK']
Upstream
reported _ensure_cleanup() sets OK and ends the span before the ERROR status is set, so ERROR is dropped.
Rule
Span status SHOULD follow Recording Errors: an operation that ended in an error sets the status to Error.
missing openllmetry · openai/stream-dropped · error.type
Rule
`error.type` is conditionally required if the operation ended in an error. Any low-cardinality identifier is allowed, so only its presence is graded.
wrong control-faulty · anthropic/async-stream-dropped · error.status
Expected
ERROR
Reported
['UNSET']
Rule
Span status SHOULD follow Recording Errors: an operation that ended in an error sets the status to Error.
missing control-faulty · anthropic/async-stream-dropped · error.type
Rule
`error.type` is conditionally required if the operation ended in an error. Any low-cardinality identifier is allowed, so only its presence is graded.
lost control-faulty · anthropic/async-stream-early-exit · span.ended
Note
never ended: chat claude-sonnet-5-5
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
wrong control-faulty · anthropic/async-stream-error-event · error.status
Expected
ERROR
Reported
['UNSET']
Rule
Span status SHOULD follow Recording Errors: an operation that ended in an error sets the status to Error.
missing control-faulty · anthropic/async-stream-error-event · error.type
Rule
`error.type` is conditionally required if the operation ended in an error. Any low-cardinality identifier is allowed, so only its presence is graded.
wrong control-faulty · anthropic/cache-hit · input_tokens
Expected
5802
Reported
1187
Read from
gen_ai.usage.input_tokens
Note
cache reads and writes left out
Rule
Input tokens SHOULD include all types of input tokens, including cached tokens. For Anthropic, whose `input_tokens` excludes them, cache reads and cache writes MUST be added. OpenInference states the same rule for `llm.token_count.prompt`.
wrong control-faulty · anthropic/rate-limited · error.status
Expected
ERROR
Reported
['UNSET']
Rule
Span status SHOULD follow Recording Errors: an operation that ended in an error sets the status to Error.
missing control-faulty · anthropic/rate-limited · error.type
Rule
`error.type` is conditionally required if the operation ended in an error. Any low-cardinality identifier is allowed, so only its presence is graded.
wrong control-faulty · anthropic/stream-cache-cumulative · input_tokens
Expected
5673
Reported
1279
Read from
gen_ai.usage.input_tokens
Note
cache reads and writes left out
Rule
Input tokens SHOULD include all types of input tokens, including cached tokens. For Anthropic, whose `input_tokens` excludes them, cache reads and cache writes MUST be added. OpenInference states the same rule for `llm.token_count.prompt`.
wrong control-faulty · anthropic/stream-cache-hit · input_tokens
Expected
8424
Reported
1543
Read from
gen_ai.usage.input_tokens
Note
cache reads and writes left out
Rule
Input tokens SHOULD include all types of input tokens, including cached tokens. For Anthropic, whose `input_tokens` excludes them, cache reads and cache writes MUST be added. OpenInference states the same rule for `llm.token_count.prompt`.
wrong control-faulty · anthropic/stream-dropped · error.status
Expected
ERROR
Reported
['UNSET']
Rule
Span status SHOULD follow Recording Errors: an operation that ended in an error sets the status to Error.
missing control-faulty · anthropic/stream-dropped · error.type
Rule
`error.type` is conditionally required if the operation ended in an error. Any low-cardinality identifier is allowed, so only its presence is graded.
lost control-faulty · anthropic/stream-early-exit · span.ended
Note
never ended: chat claude-sonnet-5-5
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
lost control-faulty · anthropic/stream-early-exit-with · span.ended
Note
never ended: chat claude-sonnet-5-5
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
wrong control-faulty · anthropic/stream-error-event · error.status
Expected
ERROR
Reported
['UNSET']
Rule
Span status SHOULD follow Recording Errors: an operation that ended in an error sets the status to Error.
missing control-faulty · anthropic/stream-error-event · error.type
Rule
`error.type` is conditionally required if the operation ended in an error. Any low-cardinality identifier is allowed, so only its presence is graded.
wrong control-faulty · openai/async-stream-dropped · error.status
Expected
ERROR
Reported
['UNSET']
Rule
Span status SHOULD follow Recording Errors: an operation that ended in an error sets the status to Error.
missing control-faulty · openai/async-stream-dropped · error.type
Rule
`error.type` is conditionally required if the operation ended in an error. Any low-cardinality identifier is allowed, so only its presence is graded.
lost control-faulty · openai/async-stream-early-exit · span.ended
Note
never ended: chat gpt-5-mini
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
wrong control-faulty · openai/rate-limited · error.status
Expected
ERROR
Reported
['UNSET']
Rule
Span status SHOULD follow Recording Errors: an operation that ended in an error sets the status to Error.
missing control-faulty · openai/rate-limited · error.type
Rule
`error.type` is conditionally required if the operation ended in an error. Any low-cardinality identifier is allowed, so only its presence is graded.
wrong control-faulty · openai/stream-dropped · error.status
Expected
ERROR
Reported
['UNSET']
Rule
Span status SHOULD follow Recording Errors: an operation that ended in an error sets the status to Error.
missing control-faulty · openai/stream-dropped · error.type
Rule
`error.type` is conditionally required if the operation ended in an error. Any low-cardinality identifier is allowed, so only its presence is graded.
lost control-faulty · openai/stream-early-exit · span.ended
Note
never ended: chat gpt-5-mini
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
lost control-faulty · openai/stream-early-exit-with · span.ended
Note
never ended: chat gpt-5-mini
Rule
GenAI spans SHOULD end when the response is fully received or the operation is terminated due to an error or cancellation.
wrong control-faulty · openai/stream-no-usage · output_tokens
Reported
7
Read from
gen_ai.usage.output_tokens
Note
estimated: the stream carried no usage
Rule
Output tokens, with reasoning tokens included.

Subjects and versions