Tool result handling, verified

What reached the model when each client called a fixture tool: 1063 probe records across 17 clients, generated from data/verified/ by scripts/build-cards.js. Each cell is one run of the live probe (probe/) against the instrumented fixture server with the model mocked, so the verdict is read off the request the client sent to the model, not inferred from source. Rerun the probe to change a cell.

[…] content reached the model · {…} structuredContent reached it · […]{…} both · ⟨…⟩ the whole CallToolResult (or a wrapper around it) · "…" a placeholder or error text and no fixture payload · ≡ the mirror fixture, text and JSON identical, with the count · ×n the payload arrived n times · +_meta the result _meta reached the model · ∅ tool hidden from the model · ↛ offered but never called · ✗ called but no result reached the model · blank: not run.

Columns are the probe scenarios (probe/registry/scenarios.json); drop the tools.result. prefix. Rows are client version, config and run (transport, and era policy when not both). The At column is the protocol revision seen on the wire.

Client Config Run At summary_and_data mirror structured_only sc_empty with_image audience_user is_error schema_match schema_mismatch app_only large no_content_key empty_object sc_string sc_null with_meta meta_only
Google ADK (Python) 2.14.0 default http 2025-11-25 ⟨…⟩ ⟨…⟩×2 ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ "…" ⟨…⟩ ⟨…⟩ "…" "…" "…" ⟨…⟩ ⟨…⟩+_meta ⟨…⟩+_meta
Google ADK (Python) 2.14.0 default stdio 2025-11-25 ⟨…⟩ ⟨…⟩×2 ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ "…" ⟨…⟩ ⟨…⟩ "…" "…" "…" ⟨…⟩ ⟨…⟩+_meta ⟨…⟩+_meta
Google ADK (Python) 2.14.0 anthropic stdio 2025-11-25 […] ≡ ⟨…⟩ […] […] […] […] […] "…" […] […] "…" "…" "…" […] […] […]
Google ADK (Python) 2.14.0 modern stdio 2026-07-28 ⟨…⟩ ⟨…⟩×2 ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ "…" ⟨…⟩ ⟨…⟩ "…" "…" ⟨…⟩ ⟨…⟩ ⟨…⟩+_meta ⟨…⟩+_meta
Google ADK (Python) 2.14.0 strict-errors stdio 2025-11-25 ⟨…⟩ ⟨…⟩×2 ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ✗ ⟨…⟩ ⟨…⟩ ✗ ✗ ✗ ⟨…⟩ ⟨…⟩+_meta ⟨…⟩+_meta
Microsoft Agent Framework 1.25.0 default http 2026-07-28 {…} ≡ {…} "…" {…} {…} "…" {…} "…" {…} {…} "…" "…" {…} […] {…} […]
Microsoft Agent Framework 1.25.0 default stdio 2026-07-28 {…} ≡ {…} "…" {…} {…} "…" {…} "…" {…} {…} "…" "…" {…} […] {…} […]
Microsoft Agent Framework 1.25.0 anthropic stdio 2026-07-28 {…} ≡ {…} "…" {…} {…} "…" {…} "…" {…} {…} "…" "…" {…} […] {…} […]
Microsoft Agent Framework 1.25.0 both stdio 2026-07-28 […]{…} ≡×2 {…} […] […]{…} […]{…} "…" […]{…} "…" […]{…} […]{…} "…" "…" […]{…} […] […]{…} […]
Microsoft Agent Framework 1.25.0 content-first stdio 2026-07-28 […] ≡ {…} […] […] […] "…" […] "…" […] […] "…" "…" […] […] […] […]
Microsoft Agent Framework 1.25.0 content-only stdio 2026-07-28 […] ≡ "…" […] […] […] "…" […] "…" […] […] "…" "…" […] […] […] […]
Microsoft Agent Framework 1.25.0 responses stdio 2026-07-28 {…} ≡ {…} "…" {…} {…} "…" {…} "…" {…} {…} "…" "…" {…} […] {…} […]
Microsoft Agent Framework 1.25.0 structured-only stdio 2026-07-28 {…} ≡ {…} "…" {…} {…} "…" {…} "…" {…} {…} "…" "…" {…} "…" {…} "…"
Cline 3.0.74 default http 2025-11-25 ⟨…⟩ ⟨…⟩×2 ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ "…" ↛ […] ⟨…⟩ ⟨…⟩ "…" "…" ⟨…⟩+_meta ⟨…⟩+_meta
Cline 3.0.74 default stdio 2024-11-05 ⟨…⟩ ⟨…⟩×2 ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ↛ […] ⟨…⟩ "…" ⟨…⟩ ⟨…⟩ ⟨…⟩+_meta ⟨…⟩+_meta
Codex CLI 0.169.0-alpha.3 default http 2025-06-18 {…} ≡ {…}
Codex CLI 0.169.0-alpha.3 default stdio 2025-06-18 {…} ≡ {…} "…" {…} {…} {…} {…} {…} ∅ {…} {…} "…" {…} […] {…} […]
Codex CLI 0.169.0-alpha.3 mcp-2026-07-28 http 2026-07-28 {…} {…} […]
Codex CLI 0.169.0-alpha.3 mcp-2026-07-28 stdio 2025-06-18 {…} ≡ {…} "…" {…} {…} {…} {…} {…} ∅ {…} {…} "…" {…} […]
crewAI 1.15.37 default http 2025-11-25 […] ≡ {…} […] […] […] […] […] "…" […] […] "…" "…" "…" […] […] […]
crewAI 1.15.37 default stdio 2025-11-25 […] ≡ {…} […] […] […] […] […] "…" […] […] "…" "…" "…" […] […] […]
crewAI 1.15.37 crewai-tools stdio 2025-11-25 […] ≡ "…" […] […] […] […] […] "…" […] […] "…" "…" "…" […] […] […]
deepagents 0.7.34+code-0.2.5 default http 2025-11-25 […] ≡ "…" […] […] […] […] […] ✗ […] […] ✗ ✗ ✗ […] […] […]
deepagents 0.7.34+code-0.2.5 default stdio 2025-11-25 […] ≡ "…" […] […] […] […] […] ✗ […] […] ✗ ✗ ✗ […] […] […]
deepagents 0.7.34+code-0.2.5 hooks stdio 2025-11-25 […]{…} ≡×2 {…} […] […]{…} […]{…} […] […]{…} ✗ […]{…} […]{…} ✗ ✗ ✗ […] […]{…} […]
deepagents 0.7.34+code-0.2.5 interpreter stdio 2025-11-25 […] ≡ "…" […] […] […] […] […] ∅ […] […] ∅ ∅ ∅ […] […] […]
eve 1.0.0-rc.6 default http 2026-07-28 {…} ≡ {…} "…" […] {…} […] {…} {…} {…} {…} {…} "…" {…} "…" {…} […]
eve 1.0.0-rc.6 no-discovery http 2025-11-25 {…} ≡ {…} "…" […] {…} […] {…} {…} {…} {…} {…} "…" {…} "…" {…} […]
fast-agent 0.10.53 default http 2026-07-28 {…} ≡ {…} "…" {…} {…} {…} {…} "…" ∅ {…} "…" "…" {…} […] {…} […]
fast-agent 0.10.53 default stdio 2026-07-28 {…} ≡ {…} "…" {…} {…} {…} {…} "…" ∅ {…} "…" "…" {…} […] {…} […]
fast-agent 0.10.53 anthropic stdio 2026-07-28 {…} ≡ {…} "…" {…} {…} {…} {…} "…" ∅ {…} "…" "…" {…} […] {…} […]
fast-agent 0.10.53 legacy stdio 2025-11-25 {…} ≡ {…} "…" {…} {…} {…} {…} "…" ∅ {…} "…" "…" "…" […] {…} […]
fast-agent 0.10.53 modern stdio 2026-07-28 {…} ≡ {…} "…" {…} {…} {…} {…} "…" ∅ {…} "…" "…" {…} […] {…} […]
fx (native engine) 0.0.16 default stdio 2026-07-28 ⟨…⟩ ⟨…⟩×2 ⟨…⟩ ⟨…⟩ […]{…} ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ "…" "…" ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩
goose 1.58.0 default http 2026-07-28 […] ≡ "…"
goose 1.58.0 default stdio 2026-07-28 […] ≡ "…" […] […] […] […] […] […] ∅ […] "…" "…" […] […] […] […]
goose 1.58.0 anthropic stdio 2026-07-28 […] ≡ "…" […] […] […] […] […] […] ∅ […] "…" "…" […] […] […] […]
goose 1.58.0 code-mode stdio 2026-07-28 ∅ ∅
Hermes Agent 0.23.0+689.ga9ff979 default http 2025-11-25 […]{…} ≡ {…} […] […]{…} […]{…} […] […]{…} "…" […]{…} […] "…" "…" "…" […] […]{…}+_meta […]+_meta
Hermes Agent 0.23.0+689.ga9ff979 default stdio 2025-11-25 […]{…} ≡ {…} […] […]{…} […]{…} […] […]{…} "…" […]{…} […] "…" "…" "…" […] […]{…}+_meta […]+_meta
Hermes Agent 0.23.0+689.ga9ff979 legacy stdio 2025-11-25 […]{…} ≡ {…} […] […]{…} […]{…} […] […]{…} "…" […]{…} […] "…" "…" "…" […] […]{…}+_meta […]+_meta
Hermes Agent 0.23.0+689.ga9ff979 stateless stdio 2026-07-28 […]{…} ≡ {…} […] […]{…} […]{…} […] […]{…} "…" […]{…} […] "…" "…" […] […] […]{…}+_meta […]+_meta
Hermes Agent 0.23.0+689.ga9ff979 tool-search-off stdio 2025-11-25 […]{…} ≡ {…} […] […]{…} […]{…} […] […]{…} "…" […]{…} […] "…" "…" "…" […] […]{…}+_meta […]+_meta
libfx (fx JavaScript adapter) 0.0.0-eab1401 default stdio 2025-11-25 […]{…} ≡ {…} […] […]{…} […]{…} […]{…} […]{…} "…" […]{…} "…" {…} "…" "…" "…" […]{…} […]
Mastra mcp-2.9.0-alpha.1+core-1.83.0-alpha.1 default http 2026-07-28 {…} ≡ {…}
Mastra mcp-2.9.0-alpha.1+core-1.83.0-alpha.1 default stdio 2026-07-28 {…} ≡ {…} "…" {…} {…} […] […] "…" ∅ {…} "…" "…" {…} "…" {…} ⟨…⟩+_meta
Mastra mcp-2.9.0-alpha.1+core-1.83.0-alpha.1 legacy stdio 2025-11-25 {…} ≡ {…} {…} ⟨…⟩+_meta
Mastra mcp-2.9.0-alpha.1+core-1.83.0-alpha.1 return-errors stdio 2026-07-28 {…} ⟨…⟩ {…} ⟨…⟩+_meta
opencode 0.0.0-a98e3fa, 2.2.6 default http 2025-11-25 {…} / {…} ≡ / ≡ {…} / {…} "…" / "…" {…} / {…} {…} / {…} […] / […] {…} / {…} {…} / "…" {…} / {…} {…} / {…} {…} / {…} "…" / "…" "…" / "…" "…" / "…" {…} / {…} […] / […]
opencode 0.0.0-a98e3fa, 2.2.6 default stdio 2025-11-25 {…} / {…} ≡ / ≡ {…} / {…} "…" / "…" {…} / {…} {…} / {…} […] / […] {…} / {…} {…} / "…" {…} / {…} {…} / {…} {…} / {…} "…" / "…" "…" / "…" "…" / "…" {…} / {…} […] / […]
opencode 0.0.0-a98e3fa, 2.2.6 codemode-off stdio 2025-11-25 […] / […] ≡ / ≡ {…} / {…} […] / […] […] / […] […] / […] ⟨…⟩ / ⟨…⟩ […] / […] […] / "…" […] / […] […] / […] {…} / {…} "…" / "…" "…" / "…" "…" / "…" […] / […] […] / […]
opencode 0.0.0-a98e3fa, 2.2.6 execute-denied stdio 2025-11-25 […] / […] ≡ / ≡ {…} / {…} […] / […] […] / […] […] / […] ⟨…⟩ / ⟨…⟩ […] / […] […] / "…" […] / […] […] / […] {…} / {…} "…" / "…" "…" / "…" "…" / "…" […] / […] […] / […]
opencode 0.0.0-a98e3fa, 2.2.6 protocol-2026-07-28 stdio 2026-07-28 […] / […] ≡ / ≡ {…} / {…} […] / […] […] / […] […] / […] ⟨…⟩ / ⟨…⟩ […] / […] […] / "…" […] / […] […] / […] "…" / "…" "…" / "…" […] / […] […] / […] […] / […] […] / […]
pi 1.5.0 default http 2025-11-25 […] ≡ {…} […] […] […] […] […] […] […] […] {…} "…" […] […] […] […]
pi 1.5.0 default stdio 2025-11-25 […] ≡ {…} […] […] […] […] […] […] […] […] {…} "…" […] […] […] […]
pi 1.5.0 anthropic stdio 2025-11-25 […] ≡ {…} […] […] […] […] […] […] […] […] {…} "…" […] […] […] […]
pi 1.5.0 codemode stdio 2025-11-25 ⟨…⟩ ⟨…⟩×2 ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ […] ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩
pi 1.5.0 deferred stdio 2025-11-25 […] ≡ {…} […] […] […] […] […] […] […] […] {…} "…" […] […] […] […]
Strands Agents 1.64.0+mcp-2.3.0 default http 2026-07-28 […] ≡ "…" […] […] […] […] […] "…" […] […] "…" "…" […] […] […] […]
Strands Agents 1.64.0+mcp-2.3.0 default stdio 2026-07-28 […] ≡ "…" […] […] […] […] […] "…" […] […] "…" "…" […] […] […] […]
Strands Agents 1.64.0+mcp-2.3.0 anthropic stdio 2026-07-28 […] ≡ "…" […] […] […] […] […] "…" […] […] "…" "…" […] […] […] […]
Strands Agents 1.64.0+mcp-2.3.0 responses stdio 2026-07-28 […] ≡ "…" […] […] […] […] […] "…" […] […] "…" "…" […] […] […] […]
ts-sdk-client 2.4.0 auto stdio 2025-11-25 ⟨…⟩ ⟨…⟩×2 ⟨…⟩ ⟨…⟩+_meta ⟨…⟩+_meta
ts-sdk-client 2.4.0 legacy stdio 2025-11-25 ⟨…⟩ ⟨…⟩×2 ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ✗ ⟨…⟩ ⟨…⟩ ⟨…⟩ ⟨…⟩ ✗ ✗ ⟨…⟩+_meta ⟨…⟩+_meta

Scenarios

Scenario Capability Question
summary_and_data tools.result.structuredContent Both fields present and different: which one does the model read?
mirror tools.result.structuredContent Text mirrors the JSON exactly: once, twice, or deduplicated?
structured_only tools.result.structuredContent content is empty: does the data reach the model, or a placeholder?
sc_empty tools.result.structuredContent structuredContent is {}: treated as present or absent?
with_image tools.result.media Does an image block change which field wins, and does the image survive?
audience_user tools.result.audience Does a block with audience [user] reach the model?
is_error tools.result.isError On isError, which field carries the error text the model sees?
schema_match tools.result.outputSchema With a declared outputSchema that matches, which field reaches the model?
schema_mismatch tools.result.outputSchema With a declared outputSchema that does not match, what does the model see?
app_only apps.visibility Is a tool with _meta.ui.visibility [app] offered to the model?
large tools.result.content Over 64 KiB: what is dropped, truncated, or reordered?
no_content_key tools.result.content No content key at all: parse failure, empty, or the data?
empty_object tools.result.content An empty result object: parse failure, empty, or placeholder?
sc_string tools.result.structuredContent A non-object structuredContent (legal since 2026-07-28): same path as an object?
sc_null tools.result.structuredContent structuredContent null: absent or present?
with_meta tools.result._meta Result-level _meta next to both payload fields: does it reach the model, and does its presence change which field wins?
meta_only tools.result._meta Result-level _meta with content only: does _meta alone switch the client to an envelope or another path?

Every record

The full verdict line per run, with a link to the record and its captures, one page per client.