AskUserQuestion: payloads containing German typographic quotes (U+201E/U+201C) deterministically fail with "questions expected as array but provided as string"
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_URLproxy (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.