{"abstract":"Text fragments produce excess spaces or lose intentional nonbreaking characters.","category":"Accessibility interaction semantics","checks":6,"contract":"Join text fragments with one ASCII space, collapse runs of ASCII space, tab, CR, LF, form feed and vertical tab to one space, and trim those ASCII characters at either end. Preserve nonbreaking spaces and other Unicode characters exactly.","evaluation_group":"model-1d8da3e17c51165f","failed_approach":"Using split() collapses Unicode nonbreaking spaces that this contract preserves.","family":"z-accessibility-name-whitespace","id":"FA-11406","implementations":{"attempt":{"sha256":"848f992232e38345386435d616ea8909c7afd606a9cbad73f82751ef4eba31b8","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(parts):\n    return ' '.join(' '.join(parts).split())\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('ASCII line boundaries', solve(['  Item\\n',str(N)+'\\t name  ']), 'Item '+str(N)+' name')\ncheck('nonbreaking space preserved', solve(['A\\u00a0'+str(N)]), 'A\\u00a0'+str(N))\ncheck('nonbreaking edge preserved', solve(['\\u00a0'+str(N)+'\\u00a0']), '\\u00a0'+str(N)+'\\u00a0')\ncheck('empty fragments', solve(['',str(N),'']), str(N))\ncheck('all whitespace', solve([' \\r\\n','\\f\\v']), '')\ncheck('empty list', solve([]), '')\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"acaf874ae8153a719babefaaa19837944908ca5b0c4f913e80c92fc5276d8eea","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(parts):\n    return ' '.join(parts)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('ASCII line boundaries', solve(['  Item\\n',str(N)+'\\t name  ']), 'Item '+str(N)+' name')\ncheck('nonbreaking space preserved', solve(['A\\u00a0'+str(N)]), 'A\\u00a0'+str(N))\ncheck('nonbreaking edge preserved', solve(['\\u00a0'+str(N)+'\\u00a0']), '\\u00a0'+str(N)+'\\u00a0')\ncheck('empty fragments', solve(['',str(N),'']), str(N))\ncheck('all whitespace', solve([' \\r\\n','\\f\\v']), '')\ncheck('empty list', solve([]), '')\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"da9540c9e8172826f9fc121e691eded5310cb181f142379de13da908b7e8af77","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(parts):\n    text = ' '.join(parts)\n    result = []\n    pending = False\n    for char in text:\n        if char in ' \\t\\r\\n\\f\\v':\n            pending = bool(result)\n        else:\n            if pending: result.append(' ')\n            result.append(char)\n            pending = False\n    return ''.join(result)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('ASCII line boundaries', solve(['  Item\\n',str(N)+'\\t name  ']), 'Item '+str(N)+' name')\ncheck('nonbreaking space preserved', solve(['A\\u00a0'+str(N)]), 'A\\u00a0'+str(N))\ncheck('nonbreaking edge preserved', solve(['\\u00a0'+str(N)+'\\u00a0']), '\\u00a0'+str(N)+'\\u00a0')\ncheck('empty fragments', solve(['',str(N),'']), str(N))\ncheck('all whitespace', solve([' \\r\\n','\\f\\v']), '')\ncheck('empty list', solve([]), '')\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":" This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"z-accessibility-name-whitespace","generated_at":"2026-09-29T14:38:47.656540+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"A controlled offline accessibility-data model. It isolates the stated contract; it does not simulate browser accessibility APIs or claim full ARIA conformance.","repair":"Collapse only ASCII whitespace runs after joining fragments, preserving all other characters.","root_cause":"Text is joined without applying the model’s ASCII whitespace normalization.","sha256":"5875f3d5f028f28094f06bccc4d675bca572a709884783bfd05cb45dfdbf475a","title":"Name flattening leaves line breaks as spoken separators · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.485,"exit_code":1,"observations":[{"actual":"Item 1 name","check":"ASCII line boundaries","expected":"Item 1 name","passed":true},{"actual":"A 1","check":"nonbreaking space preserved","expected":"A 1","passed":false},{"actual":"1","check":"nonbreaking edge preserved","expected":" 1 ","passed":false},{"actual":"1","check":"empty fragments","expected":"1","passed":true},{"actual":"","check":"all whitespace","expected":"","passed":true},{"actual":"","check":"empty list","expected":"","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"ASCII line boundaries\", \"actual\": \"Item 1 name\", \"expected\": \"Item 1 name\", \"passed\": true}, {\"check\": \"nonbreaking space preserved\", \"actual\": \"A 1\", \"expected\": \"A 1\", \"passed\": false}, {\"check\": \"nonbreaking edge preserved\", \"actual\": \"1\", \"expected\": \" 1 \", \"passed\": false}, {\"check\": \"empty fragments\", \"actual\": \"1\", \"expected\": \"1\", \"passed\": true}, {\"check\": \"all whitespace\", \"actual\": \"\", \"expected\": \"\", \"passed\": true}, {\"check\": \"empty list\", \"actual\": \"\", \"expected\": \"\", \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.878,"exit_code":1,"observations":[{"actual":"  Item\n 1\t name  ","check":"ASCII line boundaries","expected":"Item 1 name","passed":false},{"actual":"A 1","check":"nonbreaking space preserved","expected":"A 1","passed":true},{"actual":" 1 ","check":"nonbreaking edge preserved","expected":" 1 ","passed":true},{"actual":" 1 ","check":"empty fragments","expected":"1","passed":false},{"actual":" \r\n \f\u000b","check":"all whitespace","expected":"","passed":false},{"actual":"","check":"empty list","expected":"","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"ASCII line boundaries\", \"actual\": \"  Item\\n 1\\t name  \", \"expected\": \"Item 1 name\", \"passed\": false}, {\"check\": \"nonbreaking space preserved\", \"actual\": \"A 1\", \"expected\": \"A 1\", \"passed\": true}, {\"check\": \"nonbreaking edge preserved\", \"actual\": \" 1 \", \"expected\": \" 1 \", \"passed\": true}, {\"check\": \"empty fragments\", \"actual\": \" 1 \", \"expected\": \"1\", \"passed\": false}, {\"check\": \"all whitespace\", \"actual\": \" \\r\\n \\f\\u000b\", \"expected\": \"\", \"passed\": false}, {\"check\": \"empty list\", \"actual\": \"\", \"expected\": \"\", \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.197,"exit_code":0,"observations":[{"actual":"Item 1 name","check":"ASCII line boundaries","expected":"Item 1 name","passed":true},{"actual":"A 1","check":"nonbreaking space preserved","expected":"A 1","passed":true},{"actual":" 1 ","check":"nonbreaking edge preserved","expected":" 1 ","passed":true},{"actual":"1","check":"empty fragments","expected":"1","passed":true},{"actual":"","check":"all whitespace","expected":"","passed":true},{"actual":"","check":"empty list","expected":"","passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"ASCII line boundaries\", \"actual\": \"Item 1 name\", \"expected\": \"Item 1 name\", \"passed\": true}, {\"check\": \"nonbreaking space preserved\", \"actual\": \"A 1\", \"expected\": \"A 1\", \"passed\": true}, {\"check\": \"nonbreaking edge preserved\", \"actual\": \" 1 \", \"expected\": \" 1 \", \"passed\": true}, {\"check\": \"empty fragments\", \"actual\": \"1\", \"expected\": \"1\", \"passed\": true}, {\"check\": \"all whitespace\", \"actual\": \"\", \"expected\": \"\", \"passed\": true}, {\"check\": \"empty list\", \"actual\": \"\", \"expected\": \"\", \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}