{"version":"2.1.238","anchor":"malformed-sdk-input-frames-are-repaired-or-dropped-instead-o","canonical_anchor":"malformed-sdk-input-frames-are-repaired-or-dropped-instead-o","heading":"Malformed SDK input frames are repaired or dropped instead of erroring, on remote transports","tier":"notice","area":"Elsewhere","scope":null,"heads_up":null,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.238\/e\/malformed-sdk-input-frames-are-repaired-or-dropped-instead-o","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.238","markdown":"### Malformed SDK input frames are repaired or dropped instead of erroring, on remote transports\n\nOdd or damaged input frames on remote connections are now fixed up or quietly dropped instead of erroring out.\n\n**What**\n\nOn a remote transport, a streaming input frame whose message role is not `user` no longer produces a parse error: a user message wrapped one level deep is unwrapped and used, and anything else is dropped and retired. A `control_request` missing its request object or with a non-string subtype is dropped too. Local transports keep the old error behaviour.\n\n**Details**\n\n- New telemetry `tengu_sdk_malformed_input` carries `message_type`, `reason`, `transport` and `outcome`, where outcome is one of dropped, unwrap_refused, repair_disabled or repaired.\n- `CLAUDE_CODE_DISABLE_NESTED_USER_REPAIR` turns the unwrap off; it is a boolean env var and is unset by default, so repair is on wherever the remote path runs, and disabling it reports `repair_disabled`.\n\n**Evidence**\n\n`Repaired a nested user message (one level)`, `Dropping control_request: missing request object or non-string subtype`\n\n- Area: Elsewhere\n- Names: `CLAUDE_CODE_DISABLE_NESTED_USER_REPAIR`\n- Tier: You'll notice\n- Useful: 2\/5\n- Signal: 2\/5"}