diff --git a/packages/client/ui-conversation/tests/todo-panel.spec.tsx b/packages/client/ui-conversation/tests/todo-panel.spec.tsx
index 761cb4dfd3..d3c5b93ecf 100644
--- a/packages/client/ui-conversation/tests/todo-panel.spec.tsx
+++ b/packages/client/ui-conversation/tests/todo-panel.spec.tsx
@@ -113,6 +113,16 @@ describe('TodoRow', () => {
expect(openDetails).toHaveBeenCalledTimes(1)
})
+ it.each([
+ { label: 'null root', argsRaw: 'null' },
+ { label: 'non-object root', argsRaw: '42' },
+ { label: 'null items', argsRaw: '{"todos":[null]}' },
+ ])('falls back to the generic summary on valid JSON with an invalid shape ($label)', ({ argsRaw }) => {
+ render()
+ // No throw, and the generic others summary carries the raw args verbatim.
+ expect(screen.getByText(`todo_write · ${argsRaw}`)).toBeTruthy()
+ })
+
it('window-truncated result (call head lost) falls back to the callId summary', () => {
render()
expect(screen.getByText('todo_write · c1')).toBeTruthy()