Skip to content

fix(agent-sessions): decode tool-error payloads the way the session page does - #1148

Merged
JeremyFunk merged 3 commits into
mainfrom
fix/agent-tools-error-arguments-parity
Sep 30, 2026
Merged

JeremyFunk merged 3 commits into
mainfrom
fix/agent-tools-error-arguments-parity

Conversation

@JeremyFunk

@JeremyFunk JeremyFunk commented Sep 29, 2026 •

Copy link
Copy Markdown
Collaborator

Based on main, no migration

Based on main (#1143 landed as 3688ee9); rebased so only this PR's commits remain. It adds no migration and no SQL rule. It changes only the TS read path.

Rebase notes: the new decodeGenAi keeps #1143's stamped-agent override (maple_ai.agent.name), so mapAiSpan behaves as it does on main. The payload read's key list now includes #1143's maple_ai.agent.name key, and the SQL baseline was regenerated for it.

Bug #44

The tool-errors views (the web tool-errors modal and MCP get_agent_tool_error) read gen_ai.tool.call.arguments / gen_ai.tool.call.result raw in SQL. The session page decodes the same span through the vendor integration, so the two disagreed:

  • An OpenInference tool with the GenAI dual-write showed the tool's parameter schema as its arguments (EU update_seat, session verify-oa-py-nofix1-1; LlamaIndex verify-li-sem1-1). The session page shows input.value.
  • An OpenInference tool without the dual-write showed empty arguments (verify-li-sem0-1).
  • LangChain ToolMessage results were not unwrapped.

Change

  • aiToolErrorPayloadsQuery returns the span's attribute map, projected with the same mapFilter the session span read uses (aiSpanAttributes, extracted from ai-sessions.ts).
  • mapAiSpan's decode is split out into decodeGenAi. The new aiToolCallPayload(attributes) returns the decoded toolCallArguments / toolCallResult.
  • aiToolErrorPayload(row) re-serialises the payload, truncates it to AI_TOOL_ERROR_PAYLOAD_MAX codepoints and reports its size in UTF-8 bytes. SQL used to do this with leftUTF8 / length. readAiToolErrorSamples maps rows through it. The response shape is unchanged.
  • The read cuts each returned attribute value to AI_TOOL_ERROR_ATTRIBUTE_MAX (16384 chars, 4x the display cut) in SQL and returns cutAttributeBytes, the byte length of each value it cut, so a sample costs kilobytes and the reported size stays exact. A cut JSON value decodes as its raw text.

Tests

  • vitest, one file at a time, on the branch rebased onto main: query-engine-integrations ai-tools, ai-integrations, ai-sessions, ai-span-columns, and the catalog SQL baseline (regenerated); MCP agent-tools.test.ts; API ai-sessions.http.test.ts. tsc --noEmit in packages/query-engine-integrations.
  • ai-tools.test.ts: fixtures from the EU spans (openai_agents_sdk schema vs real args, LlamaIndex with and without the dual-write), the ToolMessage unwrap, codepoint truncation and byte size, a value cut by the read (raw text, true size), and the schema swap when both copies are cut.
  • ClickHouse e2e ai-tools.clickhouse.e2e.test.ts: tools-flaky-2 is seeded as an OpenInference dual-write span and still reads {"retries":1}. This passed before the rebase. It was not rerun on main (no Docker on this pass).

Summary by CodeRabbit

  • New Features

    • AI session summaries and trace details now use consistent gateway-stamped classifications, token usage, costs, and tool-call metadata across supported integrations.
    • Tool error samples now show decoded arguments and results, with long payloads truncated for display while retaining their original byte counts.
    • Tool calls paused for approval are identified separately from completed or failed calls.
  • Bug Fixes

    • Improved prompt-cache reporting and AI error fingerprinting for newly ingested spans.
    • Existing local stores migrate to the updated schema while retaining previously stored telemetry.

@coderabbitai

coderabbitai Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Warning

Review limit reached

Next included review available in 25 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 4 included reviews currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 5098a2c6-e036-4273-9c33-823aa22d00a8

📥 Commits

Reviewing files that changed from the base of the PR and between b671525 and 7525624.

📒 Files selected for processing (10)
  • apps/ai/src/mcp/tools/__tests__/agent-tools.test.ts
  • apps/api/src/routes/internal/ai-sessions.http.test.ts
  • packages/backend/src/services/ai-sessions/ai-session-reads.ts
  • packages/backend/src/services/warehouse/ai-tools.clickhouse.e2e.test.ts
  • packages/query-engine-integrations/src/__sql_baseline__/integrations.sql
  • packages/query-engine-integrations/src/ai/ai-integrations.ts
  • packages/query-engine-integrations/src/ai/ai-sessions.ts
  • packages/query-engine-integrations/src/ai/ai-tools.test.ts
  • packages/query-engine-integrations/src/ai/ai-tools.ts
  • packages/query-engine-integrations/src/ai/index.ts
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@maple-review-bot

maple-review-bot Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Maple review

Confidence 4/5 · likely safe to merge
The read now decodes and re-serialises payloads, so a span's JSON whitespace, key order and integers above 2^53 no longer appear as the span carried them; ai-tools.test.ts pins the new text.
quality 100/100 · no findings · tests covered · risk medium · 1/1 new units observable

The tool-error payload read stops picking the arguments/result out of the span's attributes in SQL and instead returns the same filtered attribute map the session span read uses, decoded through the vendor integration in TypeScript. The modal, the MCP tool and the session page now show one tool span the same way; the change is contained and tested.

  • aiToolErrorPayloadsQuery returns the span's filtered attribute map instead of SQL-truncated payload fields
  • aiToolCallPayload decodes arguments and results through the vendor integration, like the session page
  • aiToolErrorPayload re-serialises, truncates by codepoint and reports UTF-8 bytes in TypeScript
  • aiSpanAttributes moves out of mapAiSpan's projection and is shared by both span reads
What was checked
  • The projected key list covers what the new decode reads: input.value, tool.parameters, openinference.span.kind and the llm.*_messages. family (ai-integrations.ts:282-301)
  • Both views share decodeGenAi, so modal and session page cannot drift (ai-integrations.ts:350-391)
  • Full payload egress stays bounded by the page's (TraceId, SpanId) tuple and its own extent (ai-tools.ts:967-987)
Observability coverage: 1 of 1 changes observable
Change Kind Observable Evidence
aiToolsErrorPayloads warehouse read database query yes runs through warehouse.compiledQuery(..., { context: "aiToolsErrorPayloads" }) at packages/backend/src/services/ai-sessions/ai-session-reads.ts:743

d95d0db · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple to ask about one.

@JeremyFunk
JeremyFunk force-pushed the fix/agent-tools-error-arguments-parity branch from 620d24b to 9c28a72 Compare September 29, 2026 18:27
@maple-review-bot

maple-review-bot Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Note

A newer push replaced 620d24b before its review finished. The latest commit is reviewed in a new comment.

@maple-review-bot

maple-review-bot Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Maple review

Confidence 4/5 · likely safe to merge
The read hands back a filtered attribute map and decodes it with the same integration the session page uses, so both views select the same keys and the vendor stamp; the only change since the last rev…
quality 100/100 · no findings · tests covered · risk medium

The tool-error payload read now returns the span's filtered attribute map and decodes toolCallArguments/toolCallResult through the vendor integration, re-serialising and truncating by codepoint in TypeScript instead of SQL. Response shape is unchanged and the change is safe to merge.

  • aiToolErrorPayloadsQuery selects aiSpanAttributes($.SpanAttributes) instead of coalesced SQL payloads
  • aiSpanAttributes extracted from ai-sessions.ts and reused by both reads
  • aiToolCallPayload decodes a span's tool payload via its vendor integration
  • aiToolErrorPayload truncates by codepoint and reports UTF-8 byte sizes
What was checked
  • leftUTF8, aiFieldSourceKeys and spanField have no remaining use in ai-tools.ts (grep at head)
  • Every key the OpenInference refine reads is in aiSpanAttributeKeys (ai-integrations.ts:282), including input.value and maple_ai.vendor.id
  • No caller passes ctx.row into a refine hook, so dropping it from AiRefineContext and the ai-span-columns test is consistent

9c28a72 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple to ask about one.

@maple-review-bot

maple-review-bot Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Maple review

Confidence 3/5 · needs attention
Most of the branch was not reached: four of five delegated file groups exhausted their budget, so the Rust ingest (facts.rs, usage.rs), the ClickHouse migration 0035 and the CLI schema bump are un…
quality 90/100 · 1 warning · tests partial · risk medium

Warning

This review ended early; what follows is what it established.

The tool-errors read now projects the span's attribute map through aiSpanAttributes and decodes it in TypeScript via aiToolCallPayload, so the modal, the MCP tool and the session page agree on which attribute holds a tool's arguments and result. Logic and truncation are correct; the one regression is the unbounded payload egress from ClickHouse.

  • aiToolErrorPayloadsQuery projects aiSpanAttributes instead of SQL-truncated arguments/result
  • aiToolCallPayload(attributes) returns the decoded arguments and result
  • aiToolErrorPayload(row) re-serialises, truncates by codepoint and counts UTF-8 bytes
  • decodeGenAi split out of mapAiSpan; AiRefineContext.row dropped

Findings

Warning · F1 · aiToolErrorPayloadsQuery ships each sampled span's full uncapped payload map

performance · packages/query-engine-integrations/src/ai/ai-tools.ts:973

The SQL no longer computes leftUTF8(args, AI_TOOL_ERROR_PAYLOAD_MAX)/length; the projection returns the whole filtered attribute map, and aiSpanAttributes deliberately keeps input.value/output.value, which hold the untruncated tool arguments and result. For up to AI_TOOL_ERROR_OCCURRENCES_LIMIT (and 100 via MCP samples_limit) rows, ClickHouse now egresses payloads the session read's own comment calls megabyte-scale, and aiToolErrorPayload keeps the full string in memory only to cut it to 4000 characters (path:1015). A tool that returned a file or query result makes the tool-errors view pull megabytes per sample where it used to transfer at most AI_TOOL_ERROR_PAYLOAD_MAX characters per field.

Bound the read in SQL as before — compute the byte totals with `length(...)` on the source attribute and return a byte-capped copy of `input.value`/`output.value` alongside the map — so `aiToolErrorPayload` decodes from a bounded string instead of materialising the whole payload.
What was checked
  • truncatePayload cuts via Array.from, so a multi-byte codepoint is never split (ai-tools.ts:1007)
  • utf8.encode(args).length still reports the pre-truncation size, matching the *Bytes contract
  • The payloads query keeps $.OrgId.eq(param.string("orgId")) and the timestamp bounds (ai-tools.ts:976)
Files not reviewed (39)

The review ended before it read these diffs, so nothing above vouches for them.

  • apps/cli/src/server/local-schema-history.ts
  • apps/cli/src/server/local-schema-version.ts
  • apps/cli/src/server/local-store-migrations/steps.ts
  • apps/cli/src/server/schema-identity.ts
  • apps/cli/src/server/schema/local-inserts.json
  • apps/cli/src/server/schema/local-schema-v26.sql
  • apps/cli/src/server/schema/local-schema.sql
  • apps/cli/test/local-store-migrations.test.ts
  • apps/cli/test/native-local-store-migration.sh
  • apps/ingest/benches/ai_session_bench.rs
  • apps/ingest/src/ai_session.rs
  • apps/ingest/src/ai_session/claude_code.rs
  • apps/ingest/src/ai_session/facts.rs
  • apps/ingest/src/ai_session/usage.rs
  • apps/ingest/src/clickhouse_insert_mappings.rs
  • apps/ingest/src/telemetry.rs
  • apps/web/src/components/agent-sessions/session-detail/span-expansion.tsx
  • packages/agent-sessions/src/session-checks.test.ts
  • packages/agent-sessions/src/session-checks.ts
  • packages/agent-sessions/src/session-summary.test.ts
  • packages/agent-sessions/src/session-summary.ts
  • packages/agent-sessions/src/session-turns.test.ts
  • packages/agent-sessions/src/session-turns.ts
  • packages/backend/src/services/warehouse/ai-trace-index-materialization.clickhouse.e2e.test.ts
  • packages/backend/src/services/warehouse/warehouse-catalog.ts
  • packages/domain/src/clickhouse/migrations/0035_ai_trace_index_gateway_stamps.ts
  • packages/domain/src/clickhouse/migrations/index.test.ts
  • packages/domain/src/clickhouse/migrations/index.ts
  • packages/domain/src/gen-ai.test.ts
  • packages/domain/src/gen-ai.ts
  • and 9 more
Copy all findings (1)
Findings from an automated review of commit 0e3e0ceea5ed1636fe8f478f7753b82b1c1423d6. Verify each one against the current code before changing anything, fix only those that still apply, and keep each fix to the lines it names.

---

F1 · Warning · performance · packages/query-engine-integrations/src/ai/ai-tools.ts:973
`aiToolErrorPayloadsQuery` ships each sampled span's full uncapped payload map
The SQL no longer computes `leftUTF8(args, AI_TOOL_ERROR_PAYLOAD_MAX)`/`length`; the projection returns the whole filtered attribute map, and `aiSpanAttributes` deliberately keeps `input.value`/`output.value`, which hold the untruncated tool arguments and result. For up to `AI_TOOL_ERROR_OCCURRENCES_LIMIT` (and 100 via MCP `samples_limit`) rows, ClickHouse now egresses payloads the session read's own comment calls megabyte-scale, and `aiToolErrorPayload` keeps the full string in memory only to cut it to 4000 characters (`path:1015`). A tool that returned a file or query result makes the tool-errors view pull megabytes per sample where it used to transfer at most `AI_TOOL_ERROR_PAYLOAD_MAX` characters per field.
Suggested fix: Bound the read in SQL as before — compute the byte totals with `length(...)` on the source attribute and return a byte-capped copy of `input.value`/`output.value` alongside the map — so `aiToolErrorPayload` decodes from a bounded string instead of materialising the whole payload.

0e3e0ce · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple to ask about one.

@JeremyFunk
JeremyFunk changed the base branch from main to feat/ingest-usage-buckets September 29, 2026 21:42

@maple-review-bot maple-review-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 inline note from Maple's review. The score and summary are in the review comment above.

traceId: $.TraceId,
spanId: $.SpanId,
statusCode: $.StatusCode,
spanAttributes: aiSpanAttributes($.SpanAttributes),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

aiToolErrorPayloadsQuery ships each sampled span's full uncapped payload map

F1 · Warning · performance

The SQL no longer computes leftUTF8(args, AI_TOOL_ERROR_PAYLOAD_MAX)/length; the projection returns the whole filtered attribute map, and aiSpanAttributes deliberately keeps input.value/output.value, which hold the untruncated tool arguments and result. For up to AI_TOOL_ERROR_OCCURRENCES_LIMIT (and 100 via MCP samples_limit) rows, ClickHouse now egresses payloads the session read's own comment calls megabyte-scale, and aiToolErrorPayload keeps the full string in memory only to cut it to 4000 characters (path:1015). A tool that returned a file or query result makes the tool-errors view pull megabytes per sample where it used to transfer at most AI_TOOL_ERROR_PAYLOAD_MAX characters per field.

Bound the read in SQL as before — compute the byte totals with `length(...)` on the source attribute and return a byte-capped copy of `input.value`/`output.value` alongside the map — so `aiToolErrorPayload` decodes from a bounded string instead of materialising the whole payload.
Prompt for an AI agent
In `packages/query-engine-integrations/src/ai/ai-tools.ts:973`: `aiToolErrorPayloadsQuery` ships each sampled span's full uncapped payload map.

The SQL no longer computes `leftUTF8(args, AI_TOOL_ERROR_PAYLOAD_MAX)`/`length`; the projection returns the whole filtered attribute map, and `aiSpanAttributes` deliberately keeps `input.value`/`output.value`, which hold the untruncated tool arguments and result. For up to `AI_TOOL_ERROR_OCCURRENCES_LIMIT` (and 100 via MCP `samples_limit`) rows, ClickHouse now egresses payloads the session read's own comment calls megabyte-scale, and `aiToolErrorPayload` keeps the full string in memory only to cut it to 4000 characters (`path:1015`). A tool that returned a file or query result makes the tool-errors view pull megabytes per sample where it used to transfer at most `AI_TOOL_ERROR_PAYLOAD_MAX` characters per field.

Suggested fix: Bound the read in SQL as before — compute the byte totals with `length(...)` on the source attribute and return a byte-capped copy of `input.value`/`output.value` alongside the map — so `aiToolErrorPayload` decodes from a bounded string instead of materialising the whole payload.

Verify the problem exists at that location before changing it, and keep the fix to those lines.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 7525624: the read cuts every returned attribute value to AI_TOOL_ERROR_ATTRIBUTE_MAX (16384 chars, 4x the display cut so a payload the modal can show whole still parses) with mapApply(... leftUTF8 ...), and returns cutAttributeBytes, the length() of each value it cut, so the reported size stays exact. A cut JSON value decodes as its raw text and is cut again for display; the schema swap still matches because both copies are cut to the same prefix. Tests cover both.

Base automatically changed from feat/ingest-usage-buckets to main September 30, 2026 00:07
…age does

The tool-errors samples (web modal, get_agent_tool_error) read
gen_ai.tool.call.arguments raw in SQL, so an OpenInference tool whose GenAI
dual-write copied its parameter schema there showed the schema, and a tool
without the dual-write showed nothing. The payload read now returns the span's
projected attributes and runs them through the same integration decode as the
session page (schema swapped for input.value, LangChain ToolMessage unwrapped),
then truncates and sizes the result in TypeScript.
@JeremyFunk
JeremyFunk force-pushed the fix/agent-tools-error-arguments-parity branch from 0e3e0ce to 52ee022 Compare September 30, 2026 00:21
@maple-review-bot

maple-review-bot Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Maple review

🟡 Confidence 3/5 · needs attention
Parity claims are checked against the vendor refine hooks and covered by the new unit, MCP and API tests; the open F1 payload-shipping issue is untouched, which decides the verdict.
quality 90/100 · 1 warning · tests covered · risk medium

The tool-error payload read now returns the span's filtered attribute map and decodes it through the vendor integration (aiToolCallPayload) instead of coalescing raw gen_ai.* keys in SQL, so the modal and the session page agree. The decode parity holds; the still-open F1 (untruncated payloads leaving ClickHouse) is not addressed.

  • aiToolErrorPayloadsQuery projects aiSpanAttributes($.SpanAttributes) instead of SQL-truncated payload strings
  • decodeGenAi split out of mapAiSpan; aiToolCallPayload(attributes) exposes the decoded tool payloads
  • aiToolErrorPayload re-serialises, truncates by codepoint and byte-counts in TypeScript; readAiToolErrorSamples maps rows through it

Still open from earlier reviews

What was checked
  • No refine hook read the removed AiRefineContext.row (grep ctx.row in packages/query-engine-integrations/src)
  • Payload truncation survives Unicode: Array.from(...).slice(0, MAX) counts codepoints, TextEncoder reports the untruncated byte size
  • Only readAiToolErrorSamples and two tests consume aiToolErrorPayloadsRowSchema; both were updated to the attribute-map row

52ee022 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

…-arguments-parity

# Conflicts:
#	packages/query-engine-integrations/src/ai/ai-tools.ts
@maple-review-bot

maple-review-bot Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Maple review

🟡 Confidence 3/5 · needs attention
The decode swap itself is sound; the still-open payload-size finding is the one thing that needs a decision before merge.
quality 90/100 · 1 warning · tests covered · risk medium

Moves the tool-error payload decode out of SQL into the same TypeScript path the session page uses, so the modal shows a tool's real arguments; truncation and byte sizes move into aiToolErrorPayload. The decode is correct and tested; the earlier payload-size finding is unchanged.

  • aiToolErrorPayloadsQuery now returns the span's filtered attribute map
  • decodeGenAi is extracted and aiToolCallPayload exposes the decoded tool payload
  • aiToolErrorPayload re-serialises, cuts to 4000 codepoints, reports UTF-8 bytes
  • readAiToolErrorSamples maps rows through it; the response shape is unchanged

Still open from earlier reviews

What was checked
  • aiSpanAttributes is shared by the session and payload reads, so both filter the same keys (ai-sessions.ts:1368)
  • Dropping row from AiRefineContext is safe: every refine reads ctx.attributes/ctx.read only (ai-vendors.ts:125)
  • Non-JSON payload text and ToolMessage results survive decoding (ai-integrations.ts:119, :127)

de6292f · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@maple-review-bot

maple-review-bot Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Maple review

🟡 Confidence 3/5 · needs attention
The query-engine source diffs were read at the head rather than as diffs, so only their final state was verified; the three test files I read as diffs are consistent with it.
quality 90/100 · 1 warning · tests covered · risk medium · 1/1 new units observable

Warning

This review ended early; what follows is what it established.

The tool-error payload path now hands back the span's attribute map (cut, with the true sizes of the values cut) and decodes arguments/result in TypeScript through aiToolCallPayload, instead of projecting a fixed pair of attribute keys in SQL — so the modal and MCP tool read a tool span the way the session page does. The read stays org-scoped and bounded by the page's own extent, and the three test files were updated to the new row shape.

  • aiToolErrorPayloadsQuery returns spanAttributes plus cutAttributeBytes instead of arguments/result
  • aiToolErrorPayload decodes the payload with aiToolCallPayload and truncates it by codepoint
  • The payload read is bound by the page's own first and last timestamps, not the caller's window

Still open from earlier reviews

What was checked
  • Read stays org-scoped: $.OrgId.eq(param.string("orgId")) and a (TraceId, SpanId) tuple IN, no subquery (ai-tools.ts:1017)
  • aiToolErrorPayloadSlice takes min/max of the page's own timestamps, so the extent never widens (ai-tools.ts:1085)
  • truncatePayload cuts with Array.from, so a cut never splits a codepoint (ai-tools.ts:1049)
Observability coverage: 1 of 1 changes observable
Change Kind Observable Evidence
aiToolErrorPayloadsQuery — the second warehouse read of the error-samples modal database read yes runs through warehouse.compiledQuery with profile "list" and context "aiToolsErrorPayloads" (ai-session-reads.ts:740-751)

7525624 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@JeremyFunk
JeremyFunk merged commit 671e80a into main Sep 30, 2026
16 checks passed
@JeremyFunk
JeremyFunk deleted the fix/agent-tools-error-arguments-parity branch September 30, 2026 00:44
JeremyFunk added a commit that referenced this pull request Sep 30, 2026
…1171)

#1148's second commit added cutAttributeBytes to the payload row schema; the http test's mock row lacked it, so decode failed and the route returned 500.
JeremyFunk added a commit that referenced this pull request Sep 30, 2026
…teBytes (#1172)

Same gap as #1171 in apps/ai: #1148 made cutAttributeBytes a required column of the payload row; the fixture lacked it, so every get_agent_tool_error test failed row decode.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant