{"id": "m300-0001", "category": "fenced", "variant": "code fence wrapper", "input": "Thought: the user wants structured output.\nAction:\n```json\n{\n  \"goal\": \"triage inbox\",\n  \"steps\": [\n    {\n      \"n\": 1,\n      \"action\": \"read\"\n    },\n    {\n      \"n\": 2,\n      \"action\": \"match\"\n    },\n    {\n      \"n\": 3,\n      \"action\": \"write\"\n    }\n  ],\n  \"done\": false\n}```", "expected_kind": "value", "rationale": "The payload is intact; only the markdown fence has to be stripped. A parser that fails here fails on the single most common wrapper there is.", "expected": {"goal": "triage inbox", "steps": [{"n": 1, "action": "read"}, {"n": 2, "action": "match"}, {"n": 3, "action": "write"}], "done": false}, "source": "https://toolkitlabs.org/malformed300/"}
{"id": "m300-0026", "category": "prose_wrapped", "variant": "chat prose around the object", "input": "Here you go:\n{\"company\": \"Acme Robotics\", \"amount_eur\": 1250, \"line_items\": [{\"sku\": \"SKU-6795\", \"qty\": 4}]}\n\nI hope that helps!", "expected_kind": "value", "rationale": "One complete JSON value sits inside conversational text. The boundary is unambiguous because there is exactly one balanced top-level value.", "expected": {"company": "Acme Robotics", "amount_eur": 1250, "line_items": [{"sku": "SKU-6795", "qty": 4}]}, "source": "https://toolkitlabs.org/malformed300/"}
{"id": "m300-0051", "category": "trailing_comma", "variant": "commas before a closing bracket", "input": "```json\n{\"tool_calls\": [{\"name\": \"lookup_user\", \"args\": {\"user_id\": 2738},}, {\"name\": \"fetch_orders\", \"args\": {\"limit\": 18, \"status\": \"open\"}},],}\n```", "expected_kind": "value", "rationale": "Trailing commas are legal in JavaScript and in Python literals, so models emit them constantly. Nothing is lost, so refusing here is a false refusal.", "expected": {"tool_calls": [{"name": "lookup_user", "args": {"user_id": 2738}}, {"name": "fetch_orders", "args": {"limit": 18, "status": "open"}}]}, "source": "https://toolkitlabs.org/malformed300/"}
{"id": "m300-0076", "category": "single_quotes", "variant": "python-style quoting", "input": "Sure! Here is the JSON you asked for:\n\n{'label': 'billing', 'confidence': 0.91, 'needs_human': false, 'escalated_to': 'tier_two'}", "expected_kind": "value", "rationale": "The output is a Python repr, not JSON. No string in this case contains an apostrophe, so the mapping back to double quotes is unambiguous.", "expected": {"label": "billing", "confidence": 0.91, "needs_human": false, "escalated_to": "tier_two"}, "source": "https://toolkitlabs.org/malformed300/"}
{"id": "m300-0101", "category": "unquoted_keys", "variant": "javascript object literal", "input": "{city: \"Tallinn\", population: 741717, coastal: false}", "expected_kind": "value", "rationale": "Bare identifier keys. Every key here is identifier-safe, so quoting them restores valid JSON without a judgement call.", "expected": {"city": "Tallinn", "population": 741717, "coastal": false}, "source": "https://toolkitlabs.org/malformed300/"}
{"id": "m300-0126", "category": "py_literals", "variant": "True/False/None/undefined", "input": "```python\n{\"label\": \"outage\", \"confidence\": 0.5, \"needs_human\": False, \"escalated_to\": undefined}\n```", "expected_kind": "value", "rationale": "True->true, False->false, None and undefined->null. NaN and Infinity are deliberately absent from this suite: they have no JSON equivalent, so any expected value for them would be an opinion.", "expected": {"label": "outage", "confidence": 0.5, "needs_human": false, "escalated_to": null}, "source": "https://toolkitlabs.org/malformed300/"}
{"id": "m300-0151", "category": "comments", "variant": "// and /* */ inside the object", "input": "```json\n{\n  /* nullable */\n  \"tool_name\": \"query_db\",\n  /* computed */\n  \"arguments\": {\n    \"query\": \"wind speed in Oslo\",\n    \"max_results\": 16\n  },\n  \"call_id\": \"call_157748\"\n}\n```", "expected_kind": "value", "rationale": "Comments are not JSON but carry no data the caller asked for; stripping them loses nothing. The trap is a // sequence appearing inside a string value.", "expected": {"tool_name": "query_db", "arguments": {"query": "wind speed in Oslo", "max_results": 16}, "call_id": "call_157748"}, "source": "https://toolkitlabs.org/malformed300/"}
{"id": "m300-0176", "category": "raw_control", "variant": "literal newline or tab inside a string", "input": "```json\n{\"goal\": \"reconcile invoices\nsecond line\", \"steps\": [{\"n\": 1, \"action\": \"read\"}, {\"n\": 2, \"action\": \"match\"}, {\"n\": 3, \"action\": \"write\"}], \"done\": false}\n```", "expected_kind": "value", "rationale": "A literal control character inside a string is illegal JSON. The recovered value must contain the escaped form, so no character is silently dropped.", "expected": {"goal": "reconcile invoices\nsecond line", "steps": [{"n": 1, "action": "read"}, {"n": 2, "action": "match"}, {"n": 3, "action": "write"}], "done": false}, "source": "https://toolkitlabs.org/malformed300/"}
{"id": "m300-0201", "category": "brackets", "variant": "closing bracket dropped", "input": "Here you go:\n{\"result\": {\"records\": [{\"id\": 127, \"meta\": {\"source\": \"crm\", \"verified\": false}}], \"page\": {\"index\": 1, \"has_more\": false}}, \"elapsed_ms\": 354", "expected_kind": "value", "rationale": "Every key/value pair was written; only structure punctuation is wrong (closing bracket dropped). The data is fully present, so the correct answer is the whole object.", "expected": {"result": {"records": [{"id": 127, "meta": {"source": "crm", "verified": false}}], "page": {"index": 1, "has_more": false}}, "elapsed_ms": 354}, "source": "https://toolkitlabs.org/malformed300/"}
{"id": "m300-0226", "category": "truncated", "variant": "output cut mid-structure", "input": "```json\n{\"goal\":\"triage inbox\",\"steps\":[{\"n\":1,\"action\":\"read\"},{\"n\"", "expected_kind": "value", "rationale": "The generation stopped mid-way. Ground truth is every pair that was fully written, containers closed, incomplete tail dropped -- nothing invented.", "expected": {"goal": "triage inbox", "steps": [{"n": 1, "action": "read"}]}, "source": "https://toolkitlabs.org/malformed300/"}
{"id": "m300-0251", "category": "wrappers", "variant": "XML-ish tag wrapper from a prompt that asked for delimiters", "input": "<json>\n{\"goal\": \"triage inbox\", \"steps\": [{\"n\": 1, \"action\": \"read\"}, {\"n\": 2, \"action\": \"match\"}, {\"n\": 3, \"action\": \"write\"}], \"done\": false}\n</json>", "expected_kind": "value", "rationale": "The payload is complete and correct; only XML-ish tag wrapper from a prompt that asked for delimiters stands in the way.", "expected": {"goal": "triage inbox", "steps": [{"n": 1, "action": "read"}, {"n": 2, "action": "match"}, {"n": 3, "action": "write"}], "done": false}, "source": "https://toolkitlabs.org/malformed300/"}
{"id": "m300-0276", "category": "unrecoverable", "variant": "prose refusal with no JSON anywhere", "input": "I am sorry, but I do not have enough information to produce that object.", "expected_kind": "unrecoverable", "rationale": "There is no object here at all. A parser that returns {} has invented a result the model never produced.", "source": "https://toolkitlabs.org/malformed300/"}
