AskUserQuestion: payloads containing German typographic quotes (U+201E/U+201C) deterministically fail with "questions expected as array but provided as string"

Status Open
Reported on v2.1.222
Maintainer reply None cached
Activity 0 comments · opened Aug 17, 2026
Report written with AI assistance from within the affected session; all observations below were executed and captured live.

Environment

  • Claude Code 2.1.222 (CLI, Linux), model claude-fable-5
  • Requests routed through a self-hosted ANTHROPIC_BASE_URL proxy (better-ccflare). I cannot rule out that the corruption happens in the proxy's SSE stream handling rather than the client — noting it upfront; the failure signature is identical to proxy-less reports of this class (#30955 for TodoWrite).

Symptom

AskUserQuestion calls whose questions payload contains German typographic quotation marks (U+201E / U+201C ) fail deterministically with:

InputValidationError: AskUserQuestion failed due to the following issue:
The parameter `questions` type is expected as `array` but provided as `string`

The same schema without those characters succeeds.

Controlled A/B (single session, 2026-08-17)

  • 5/5 calls WITH „…“ anywhere in question/option texts → InputValidationError (array-as-string)
  • 4/4 calls WITHOUT them (same structure; umlauts and other non-ASCII like ü, ö, , all pass) → box renders, answers returned
  • Interleaved order: fail, fail, pass, pass, pass, fail — rules out session-state drift; a quote-free box succeeded minutes before a with-quotes box failed, and vice versa.
  • Question count irrelevant (1 and 3 questions both reproduce on the quote axis).

Minimal failing repro (passes when „ “ are replaced by ASCII quotes):

[{"question": "Verifikations-Test: Diese Box enthält „typografische Anführungszeichen“ im Text — erscheint sie?", "header": "Quote-Test", "multiSelect": false, "options": [{"label": "Ja, erschienen", "description": "Die Box mit „Gänsefüßchen“ wurde angezeigt."}, {"label": "B", "description": "Testoption ohne Sonderzeichen."}]}]

Suspected mechanism

The validation layer receives the questions parameter as a JSON-encoded string instead of a parsed array — same failure wording as #30955 (TodoWrite) and related to the type-mismatch class in #56170 (AskUserQuestion answers). A plausible path is the tool-call input JSON being re-parsed after a unicode escape lands on a stream-chunk boundary, falling back to the raw string. First observed right after a plan-mode transition, but the A/B above shows the content trigger reproduces far from any mode change.

Impact

Any assistant turn that phrases user-facing questions with German typographic quotes loses the interactive box (and on retry loops, previously entered free-text can be lost per #56170). Workaround: strip U+201E/U+201C from AskUserQuestion payloads.

View original on GitHub ↗