{"abstract":"In \"v a k domě\" only the first preposition stays bound.","category":"Typography line breaking","checks":8,"contract":"Input [words, width]. A single-letter preposition/conjunction (a i o u v z k s w, any case) is bound to the following word, chaining; a number (digits with optional . or , decimal) is bound to a following unit (kg km cm mm % pt px). Bound groups are unbreakable; greedy fill of groups with unit spaces; an overwide group is set alone. Return lines.","evaluation_group":"w2-typography-line-breaking-nonbreaking-bindings","failed_approach":"Refusing to bind the final word of the paragraph leaves trailing singles unbound.","family":"w2-typography-line-breaking-nonbreaking-bindings-binding-chain","id":"FA-80271","implementations":{"attempt":{"sha256":"05725c68696b19f1e4b42a0ca24adabc068a75222f9d8fc68251bc26a2a01c68","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    words, width = x\n    SINGLE = {'a', 'i', 'o', 'u', 'v', 'z', 'k', 's', 'w'}\n    UNITS = {'kg', 'km', 'cm', 'mm', '%', 'pt', 'px'}\n    groups = []\n    k = 0\n    while k < len(words):\n        grp = [words[k]]\n        while True:\n            last = grp[-1]\n            nxt = k + len(grp)\n            if nxt >= len(words) - 1:\n                break\n            number = last.replace('.', '').replace(',', '').isdigit()\n            if last.lower() in SINGLE or (number and words[nxt] in UNITS):\n                grp.append(words[nxt])\n            else:\n                break\n        groups.append(' '.join(grp))\n        k += len(grp)\n    lines, cur = [], ''\n    for g in groups:\n        cand = g if not cur else cur + ' ' + g\n        if len(cand) <= width or not cur:\n            cur = cand\n        else:\n            lines.append(cur)\n            cur = g\n    if cur:\n        lines.append(cur)\n    return lines\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('chained singles', [['text', 'v', 'a', 'k', 'domě'], 10], ['text', 'v a k domě']), ('regression: binding chain', [['km', 'z', 'sazba', 'k', 'Praze', 's', 'V', 'k', 'text'], 15], ['km z sazba', 'k Praze', 's V k text']), ('partial-repair probe', [['10', 'i', 'a', 'pt', '10', 'domě', 'o', 'a', 'cm', 'a', 'sazba'], 9], ['10 i a pt', '10 domě', 'o a cm', 'a sazba']), ('regression: binding chain', [['text', 'kg', 'o', 'i', 'pt', 'i', 'a', 'o', 'V', 'řádek'], 9], ['text kg', 'o i pt', 'i a o V řádek']), ('decimal comma with unit', [['sazba', '1,5', 'cm', 'text'], 9], ['sazba', '1,5 cm', 'text']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('control layout', [['i', 'V', 'V', 'z', 'a', 'v'], 11], ['i V V z a v']), ('control layout', [['domě', 'k', 'a', 'a', 'pt', 'a', 'V', '10', 'pt'], 16], ['domě k a a pt', 'a V 10 pt'])], [('regression: binding chain', [['z', 'k', '2.5', 'i', 'V', 'o', 'i', 'z', 'z'], 10], ['z k 2.5', 'i V o i z z']), ('regression: binding chain', [['Praze', 'k', 'z', 'kg', 'a', 'i', 'a', 'text', 'cm', 'v'], 11], ['Praze', 'k z kg', 'a i a text', 'cm v']), ('regression: binding chain', [['2.5', '2.5', 'kg', 'z', 'a', 'pt', 'řádek', 'i', 'Praze', 'domě', 'V', 'v'], 14], ['2.5 2.5 kg', 'z a pt řádek', 'i Praze domě', 'V v']), ('regression: binding chain', [['2.5', 'k', 'cm', 's', 'V', 'cm', 's', 'pt', 's', 'Praze'], 14], ['2.5 k cm', 's V cm s pt', 's Praze']), ('chained singles', [['text', 'v', 'a', 'k', 'domě'], 10], ['text', 'v a k domě']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('control layout', [['v', 'pt', 'pt', 'domě', 'sazba', 'o', '1,5', 'sazba', '10', '1,5'], 7], ['v pt pt', 'domě', 'sazba', 'o 1,5', 'sazba', '10 1,5']), ('control layout', [['kg', 'cm', 'o', 'kg', 'cm', 'domě', 'domě'], 12], ['kg cm o kg', 'cm domě domě'])], [('regression: binding chain', [['pt', 'cm', 'a', '2.5', 'i', 'domě', 'text', 's', 'o', 'o'], 8], ['pt cm', 'a 2.5', 'i domě', 'text', 's o o']), ('regression: binding chain', [['s', 'o', 'V', 'i', 'domě', 's', 'domě', 'pt', 'a', '1,5', 'o'], 9], ['s o V i domě', 's domě pt', 'a 1,5 o']), ('partial-repair probe', [['kg', 'v', 'km', 'V', 'cm', '10', 'text', 'a', 'kg'], 8], ['kg v km', 'V cm 10', 'text', 'a kg']), ('partial-repair probe', [['řádek', '2.5', '10', 'i', 'i', 'km', 'i', 'k'], 8], ['řádek', '2.5 10', 'i i km', 'i k']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('chained singles', [['text', 'v', 'a', 'k', 'domě'], 10], ['text', 'v a k domě']), ('control layout', [['k', 'V', 'z', 'km', '1,5', '1,5', 'V', 'o', 's'], 12], ['k V z km 1,5', '1,5 V o s']), ('control layout', [['o', 'km', 'cm', '2.5'], 6], ['o km', 'cm 2.5'])], [('regression: binding chain', [['km', 'V', '10', 'km', '2.5', 'V'], 6], ['km', 'V 10 km', '2.5 V']), ('regression: binding chain', [['pt', 'k', '1,5', 'cm', 'k', 'i', 'a', 'v', 's', '10', 'cm', '10'], 13], ['pt k 1,5 cm', 'k i a v s 10 cm', '10']), ('regression: binding chain', [['Praze', 'i', 'o', 'domě'], 7], ['Praze', 'i o domě']), ('partial-repair probe', [['a', 'text', 'kg', 'o', 'sazba', 'v', 'km', 's', 'text'], 14], ['a text kg', 'o sazba v km', 's text']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('decimal comma with unit', [['sazba', '1,5', 'cm', 'text'], 9], ['sazba', '1,5 cm', 'text']), ('control layout', [['V', 'Praze', 'kg', 'pt', 'km', 's', 'pt'], 8], ['V Praze', 'kg pt km', 's pt']), ('control layout', [['řádek', 'z', '10', 'i', 'o', '1,5'], 13], ['řádek z 10', 'i o 1,5'])], [('regression: binding chain', [['i', 'z', 'Praze', 'z', 'řádek', '10'], 8], ['i z Praze', 'z řádek', '10']), ('regression: binding chain', [['text', 'V', 'řádek', 'v', 'sazba', 's', 's', 'a', 'o', '10'], 14], ['text V řádek', 'v sazba', 's s a o 10']), ('chained singles', [['text', 'v', 'a', 'k', 'domě'], 10], ['text', 'v a k domě']), ('regression: binding chain', [['o', 'pt', 'domě', 's', 'a', 'text'], 6], ['o pt', 'domě', 's a text']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('decimal comma with unit', [['sazba', '1,5', 'cm', 'text'], 9], ['sazba', '1,5 cm', 'text']), ('control layout', [['V', 'km', '2.5', 'Praze', '10', 'k'], 9], ['V km 2.5', 'Praze 10', 'k']), ('control layout', [['km', 'o', 'cm', 'km', 'sazba', 'k'], 7], ['km o cm', 'km', 'sazba k'])]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(args), expected)\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":"cf7439fdb288332537d55078616cfd2a796825522e150d144ac8cd386112dc1f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    words, width = x\n    SINGLE = {'a', 'i', 'o', 'u', 'v', 'z', 'k', 's', 'w'}\n    UNITS = {'kg', 'km', 'cm', 'mm', '%', 'pt', 'px'}\n    groups = []\n    k = 0\n    while k < len(words):\n        grp = [words[k]]\n        while True:\n            last = grp[-1]\n            nxt = k + len(grp)\n            if nxt >= len(words):\n                break\n            number = last.replace('.', '').replace(',', '').isdigit()\n            if last.lower() in SINGLE or (number and words[nxt] in UNITS):\n                grp.append(words[nxt])\n                break\n            else:\n                break\n        groups.append(' '.join(grp))\n        k += len(grp)\n    lines, cur = [], ''\n    for g in groups:\n        cand = g if not cur else cur + ' ' + g\n        if len(cand) <= width or not cur:\n            cur = cand\n        else:\n            lines.append(cur)\n            cur = g\n    if cur:\n        lines.append(cur)\n    return lines\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('chained singles', [['text', 'v', 'a', 'k', 'domě'], 10], ['text', 'v a k domě']), ('regression: binding chain', [['km', 'z', 'sazba', 'k', 'Praze', 's', 'V', 'k', 'text'], 15], ['km z sazba', 'k Praze', 's V k text']), ('partial-repair probe', [['10', 'i', 'a', 'pt', '10', 'domě', 'o', 'a', 'cm', 'a', 'sazba'], 9], ['10 i a pt', '10 domě', 'o a cm', 'a sazba']), ('regression: binding chain', [['text', 'kg', 'o', 'i', 'pt', 'i', 'a', 'o', 'V', 'řádek'], 9], ['text kg', 'o i pt', 'i a o V řádek']), ('decimal comma with unit', [['sazba', '1,5', 'cm', 'text'], 9], ['sazba', '1,5 cm', 'text']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('control layout', [['i', 'V', 'V', 'z', 'a', 'v'], 11], ['i V V z a v']), ('control layout', [['domě', 'k', 'a', 'a', 'pt', 'a', 'V', '10', 'pt'], 16], ['domě k a a pt', 'a V 10 pt'])], [('regression: binding chain', [['z', 'k', '2.5', 'i', 'V', 'o', 'i', 'z', 'z'], 10], ['z k 2.5', 'i V o i z z']), ('regression: binding chain', [['Praze', 'k', 'z', 'kg', 'a', 'i', 'a', 'text', 'cm', 'v'], 11], ['Praze', 'k z kg', 'a i a text', 'cm v']), ('regression: binding chain', [['2.5', '2.5', 'kg', 'z', 'a', 'pt', 'řádek', 'i', 'Praze', 'domě', 'V', 'v'], 14], ['2.5 2.5 kg', 'z a pt řádek', 'i Praze domě', 'V v']), ('regression: binding chain', [['2.5', 'k', 'cm', 's', 'V', 'cm', 's', 'pt', 's', 'Praze'], 14], ['2.5 k cm', 's V cm s pt', 's Praze']), ('chained singles', [['text', 'v', 'a', 'k', 'domě'], 10], ['text', 'v a k domě']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('control layout', [['v', 'pt', 'pt', 'domě', 'sazba', 'o', '1,5', 'sazba', '10', '1,5'], 7], ['v pt pt', 'domě', 'sazba', 'o 1,5', 'sazba', '10 1,5']), ('control layout', [['kg', 'cm', 'o', 'kg', 'cm', 'domě', 'domě'], 12], ['kg cm o kg', 'cm domě domě'])], [('regression: binding chain', [['pt', 'cm', 'a', '2.5', 'i', 'domě', 'text', 's', 'o', 'o'], 8], ['pt cm', 'a 2.5', 'i domě', 'text', 's o o']), ('regression: binding chain', [['s', 'o', 'V', 'i', 'domě', 's', 'domě', 'pt', 'a', '1,5', 'o'], 9], ['s o V i domě', 's domě pt', 'a 1,5 o']), ('partial-repair probe', [['kg', 'v', 'km', 'V', 'cm', '10', 'text', 'a', 'kg'], 8], ['kg v km', 'V cm 10', 'text', 'a kg']), ('partial-repair probe', [['řádek', '2.5', '10', 'i', 'i', 'km', 'i', 'k'], 8], ['řádek', '2.5 10', 'i i km', 'i k']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('chained singles', [['text', 'v', 'a', 'k', 'domě'], 10], ['text', 'v a k domě']), ('control layout', [['k', 'V', 'z', 'km', '1,5', '1,5', 'V', 'o', 's'], 12], ['k V z km 1,5', '1,5 V o s']), ('control layout', [['o', 'km', 'cm', '2.5'], 6], ['o km', 'cm 2.5'])], [('regression: binding chain', [['km', 'V', '10', 'km', '2.5', 'V'], 6], ['km', 'V 10 km', '2.5 V']), ('regression: binding chain', [['pt', 'k', '1,5', 'cm', 'k', 'i', 'a', 'v', 's', '10', 'cm', '10'], 13], ['pt k 1,5 cm', 'k i a v s 10 cm', '10']), ('regression: binding chain', [['Praze', 'i', 'o', 'domě'], 7], ['Praze', 'i o domě']), ('partial-repair probe', [['a', 'text', 'kg', 'o', 'sazba', 'v', 'km', 's', 'text'], 14], ['a text kg', 'o sazba v km', 's text']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('decimal comma with unit', [['sazba', '1,5', 'cm', 'text'], 9], ['sazba', '1,5 cm', 'text']), ('control layout', [['V', 'Praze', 'kg', 'pt', 'km', 's', 'pt'], 8], ['V Praze', 'kg pt km', 's pt']), ('control layout', [['řádek', 'z', '10', 'i', 'o', '1,5'], 13], ['řádek z 10', 'i o 1,5'])], [('regression: binding chain', [['i', 'z', 'Praze', 'z', 'řádek', '10'], 8], ['i z Praze', 'z řádek', '10']), ('regression: binding chain', [['text', 'V', 'řádek', 'v', 'sazba', 's', 's', 'a', 'o', '10'], 14], ['text V řádek', 'v sazba', 's s a o 10']), ('chained singles', [['text', 'v', 'a', 'k', 'domě'], 10], ['text', 'v a k domě']), ('regression: binding chain', [['o', 'pt', 'domě', 's', 'a', 'text'], 6], ['o pt', 'domě', 's a text']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('decimal comma with unit', [['sazba', '1,5', 'cm', 'text'], 9], ['sazba', '1,5 cm', 'text']), ('control layout', [['V', 'km', '2.5', 'Praze', '10', 'k'], 9], ['V km 2.5', 'Praze 10', 'k']), ('control layout', [['km', 'o', 'cm', 'km', 'sazba', 'k'], 7], ['km o cm', 'km', 'sazba k'])]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(args), expected)\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":"c023a8ad705c824ac573f83c0d5eb8bad811f818722e0556c3cd83918bef04f7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    words, width = x\n    SINGLE = {'a', 'i', 'o', 'u', 'v', 'z', 'k', 's', 'w'}\n    UNITS = {'kg', 'km', 'cm', 'mm', '%', 'pt', 'px'}\n    groups = []\n    k = 0\n    while k < len(words):\n        grp = [words[k]]\n        while True:\n            last = grp[-1]\n            nxt = k + len(grp)\n            if nxt >= len(words):\n                break\n            number = last.replace('.', '').replace(',', '').isdigit()\n            if last.lower() in SINGLE or (number and words[nxt] in UNITS):\n                grp.append(words[nxt])\n            else:\n                break\n        groups.append(' '.join(grp))\n        k += len(grp)\n    lines, cur = [], ''\n    for g in groups:\n        cand = g if not cur else cur + ' ' + g\n        if len(cand) <= width or not cur:\n            cur = cand\n        else:\n            lines.append(cur)\n            cur = g\n    if cur:\n        lines.append(cur)\n    return lines\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('chained singles', [['text', 'v', 'a', 'k', 'domě'], 10], ['text', 'v a k domě']), ('regression: binding chain', [['km', 'z', 'sazba', 'k', 'Praze', 's', 'V', 'k', 'text'], 15], ['km z sazba', 'k Praze', 's V k text']), ('partial-repair probe', [['10', 'i', 'a', 'pt', '10', 'domě', 'o', 'a', 'cm', 'a', 'sazba'], 9], ['10 i a pt', '10 domě', 'o a cm', 'a sazba']), ('regression: binding chain', [['text', 'kg', 'o', 'i', 'pt', 'i', 'a', 'o', 'V', 'řádek'], 9], ['text kg', 'o i pt', 'i a o V řádek']), ('decimal comma with unit', [['sazba', '1,5', 'cm', 'text'], 9], ['sazba', '1,5 cm', 'text']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('control layout', [['i', 'V', 'V', 'z', 'a', 'v'], 11], ['i V V z a v']), ('control layout', [['domě', 'k', 'a', 'a', 'pt', 'a', 'V', '10', 'pt'], 16], ['domě k a a pt', 'a V 10 pt'])], [('regression: binding chain', [['z', 'k', '2.5', 'i', 'V', 'o', 'i', 'z', 'z'], 10], ['z k 2.5', 'i V o i z z']), ('regression: binding chain', [['Praze', 'k', 'z', 'kg', 'a', 'i', 'a', 'text', 'cm', 'v'], 11], ['Praze', 'k z kg', 'a i a text', 'cm v']), ('regression: binding chain', [['2.5', '2.5', 'kg', 'z', 'a', 'pt', 'řádek', 'i', 'Praze', 'domě', 'V', 'v'], 14], ['2.5 2.5 kg', 'z a pt řádek', 'i Praze domě', 'V v']), ('regression: binding chain', [['2.5', 'k', 'cm', 's', 'V', 'cm', 's', 'pt', 's', 'Praze'], 14], ['2.5 k cm', 's V cm s pt', 's Praze']), ('chained singles', [['text', 'v', 'a', 'k', 'domě'], 10], ['text', 'v a k domě']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('control layout', [['v', 'pt', 'pt', 'domě', 'sazba', 'o', '1,5', 'sazba', '10', '1,5'], 7], ['v pt pt', 'domě', 'sazba', 'o 1,5', 'sazba', '10 1,5']), ('control layout', [['kg', 'cm', 'o', 'kg', 'cm', 'domě', 'domě'], 12], ['kg cm o kg', 'cm domě domě'])], [('regression: binding chain', [['pt', 'cm', 'a', '2.5', 'i', 'domě', 'text', 's', 'o', 'o'], 8], ['pt cm', 'a 2.5', 'i domě', 'text', 's o o']), ('regression: binding chain', [['s', 'o', 'V', 'i', 'domě', 's', 'domě', 'pt', 'a', '1,5', 'o'], 9], ['s o V i domě', 's domě pt', 'a 1,5 o']), ('partial-repair probe', [['kg', 'v', 'km', 'V', 'cm', '10', 'text', 'a', 'kg'], 8], ['kg v km', 'V cm 10', 'text', 'a kg']), ('partial-repair probe', [['řádek', '2.5', '10', 'i', 'i', 'km', 'i', 'k'], 8], ['řádek', '2.5 10', 'i i km', 'i k']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('chained singles', [['text', 'v', 'a', 'k', 'domě'], 10], ['text', 'v a k domě']), ('control layout', [['k', 'V', 'z', 'km', '1,5', '1,5', 'V', 'o', 's'], 12], ['k V z km 1,5', '1,5 V o s']), ('control layout', [['o', 'km', 'cm', '2.5'], 6], ['o km', 'cm 2.5'])], [('regression: binding chain', [['km', 'V', '10', 'km', '2.5', 'V'], 6], ['km', 'V 10 km', '2.5 V']), ('regression: binding chain', [['pt', 'k', '1,5', 'cm', 'k', 'i', 'a', 'v', 's', '10', 'cm', '10'], 13], ['pt k 1,5 cm', 'k i a v s 10 cm', '10']), ('regression: binding chain', [['Praze', 'i', 'o', 'domě'], 7], ['Praze', 'i o domě']), ('partial-repair probe', [['a', 'text', 'kg', 'o', 'sazba', 'v', 'km', 's', 'text'], 14], ['a text kg', 'o sazba v km', 's text']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('decimal comma with unit', [['sazba', '1,5', 'cm', 'text'], 9], ['sazba', '1,5 cm', 'text']), ('control layout', [['V', 'Praze', 'kg', 'pt', 'km', 's', 'pt'], 8], ['V Praze', 'kg pt km', 's pt']), ('control layout', [['řádek', 'z', '10', 'i', 'o', '1,5'], 13], ['řádek z 10', 'i o 1,5'])], [('regression: binding chain', [['i', 'z', 'Praze', 'z', 'řádek', '10'], 8], ['i z Praze', 'z řádek', '10']), ('regression: binding chain', [['text', 'V', 'řádek', 'v', 'sazba', 's', 's', 'a', 'o', '10'], 14], ['text V řádek', 'v sazba', 's s a o 10']), ('chained singles', [['text', 'v', 'a', 'k', 'domě'], 10], ['text', 'v a k domě']), ('regression: binding chain', [['o', 'pt', 'domě', 's', 'a', 'text'], 6], ['o pt', 'domě', 's a text']), ('sentence-initial V binds', [['V', 'Praze', 'text', 'sazba'], 8], ['V Praze', 'text', 'sazba']), ('decimal comma with unit', [['sazba', '1,5', 'cm', 'text'], 9], ['sazba', '1,5 cm', 'text']), ('control layout', [['V', 'km', '2.5', 'Praze', '10', 'k'], 9], ['V km 2.5', 'Praze 10', 'k']), ('control layout', [['km', 'o', 'cm', 'km', 'sazba', 'k'], 7], ['km o cm', 'km', 'sazba k'])]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(args), expected)\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":"A deterministic toy typesetting model with integer widths and a stipulated rule set; it does not claim conformance to any engine. 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":"w2-typography-line-breaking-nonbreaking-bindings-binding-chain","generated_at":"2026-09-29T14:49:52.245464+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Line breaking decides where paragraphs wrap on screen and in print; a wrong decision point shifts every following line.","repair":"Keep extending the group while its last word requires binding.","root_cause":"After one binding the group is closed instead of re-checking the newly added word.","sha256":"9f475968932c3ca0040666214c46527f3a61bebf85e48347e0c6b657cb3effd1","title":"Single-letter and unit bindings: binding chain · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.181,"exit_code":1,"observations":[{"actual":["text v a k","domě"],"check":"chained singles","expected":["text","v a k domě"],"passed":false},{"actual":["km z sazba","k Praze s V k","text"],"check":"regression: binding chain","expected":["km z sazba","k Praze","s V k text"],"passed":false},{"actual":["10 i a pt","10 domě","o a cm a","sazba"],"check":"partial-repair probe","expected":["10 i a pt","10 domě","o a cm","a sazba"],"passed":false},{"actual":["text kg","o i pt","i a o V","řádek"],"check":"regression: binding chain","expected":["text kg","o i pt","i a o V řádek"],"passed":false},{"actual":["sazba","1,5 cm","text"],"check":"decimal comma with unit","expected":["sazba","1,5 cm","text"],"passed":true},{"actual":["V Praze","text","sazba"],"check":"sentence-initial V binds","expected":["V Praze","text","sazba"],"passed":true},{"actual":["i V V z a v"],"check":"control layout","expected":["i V V z a v"],"passed":true},{"actual":["domě k a a pt","a V 10 pt"],"check":"control layout","expected":["domě k a a pt","a V 10 pt"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"chained singles\", \"actual\": [\"text v a k\", \"domě\"], \"expected\": [\"text\", \"v a k domě\"], \"passed\": false}, {\"check\": \"regression: binding chain\", \"actual\": [\"km z sazba\", \"k Praze s V k\", \"text\"], \"expected\": [\"km z sazba\", \"k Praze\", \"s V k text\"], \"passed\": false}, {\"check\": \"partial-repair probe\", \"actual\": [\"10 i a pt\", \"10 domě\", \"o a cm a\", \"sazba\"], \"expected\": [\"10 i a pt\", \"10 domě\", \"o a cm\", \"a sazba\"], \"passed\": false}, {\"check\": \"regression: binding chain\", \"actual\": [\"text kg\", \"o i pt\", \"i a o V\", \"řádek\"], \"expected\": [\"text kg\", \"o i pt\", \"i a o V řádek\"], \"passed\": false}, {\"check\": \"decimal comma with unit\", \"actual\": [\"sazba\", \"1,5 cm\", \"text\"], \"expected\": [\"sazba\", \"1,5 cm\", \"text\"], \"passed\": true}, {\"check\": \"sentence-initial V binds\", \"actual\": [\"V Praze\", \"text\", \"sazba\"], \"expected\": [\"V Praze\", \"text\", \"sazba\"], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [\"i V V z a v\"], \"expected\": [\"i V V z a v\"], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [\"domě k a a pt\", \"a V 10 pt\"], \"expected\": [\"domě k a a pt\", \"a V 10 pt\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.942,"exit_code":1,"observations":[{"actual":["text v a","k domě"],"check":"chained singles","expected":["text","v a k domě"],"passed":false},{"actual":["km z sazba","k Praze s V","k text"],"check":"regression: binding chain","expected":["km z sazba","k Praze","s V k text"],"passed":false},{"actual":["10 i a pt","10 domě","o a cm","a sazba"],"check":"partial-repair probe","expected":["10 i a pt","10 domě","o a cm","a sazba"],"passed":true},{"actual":["text kg","o i pt","i a o V","řádek"],"check":"regression: binding chain","expected":["text kg","o i pt","i a o V řádek"],"passed":false},{"actual":["sazba","1,5 cm","text"],"check":"decimal comma with unit","expected":["sazba","1,5 cm","text"],"passed":true},{"actual":["V Praze","text","sazba"],"check":"sentence-initial V binds","expected":["V Praze","text","sazba"],"passed":true},{"actual":["i V V z a v"],"check":"control layout","expected":["i V V z a v"],"passed":true},{"actual":["domě k a a pt","a V 10 pt"],"check":"control layout","expected":["domě k a a pt","a V 10 pt"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"chained singles\", \"actual\": [\"text v a\", \"k domě\"], \"expected\": [\"text\", \"v a k domě\"], \"passed\": false}, {\"check\": \"regression: binding chain\", \"actual\": [\"km z sazba\", \"k Praze s V\", \"k text\"], \"expected\": [\"km z sazba\", \"k Praze\", \"s V k text\"], \"passed\": false}, {\"check\": \"partial-repair probe\", \"actual\": [\"10 i a pt\", \"10 domě\", \"o a cm\", \"a sazba\"], \"expected\": [\"10 i a pt\", \"10 domě\", \"o a cm\", \"a sazba\"], \"passed\": true}, {\"check\": \"regression: binding chain\", \"actual\": [\"text kg\", \"o i pt\", \"i a o V\", \"řádek\"], \"expected\": [\"text kg\", \"o i pt\", \"i a o V řádek\"], \"passed\": false}, {\"check\": \"decimal comma with unit\", \"actual\": [\"sazba\", \"1,5 cm\", \"text\"], \"expected\": [\"sazba\", \"1,5 cm\", \"text\"], \"passed\": true}, {\"check\": \"sentence-initial V binds\", \"actual\": [\"V Praze\", \"text\", \"sazba\"], \"expected\": [\"V Praze\", \"text\", \"sazba\"], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [\"i V V z a v\"], \"expected\": [\"i V V z a v\"], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [\"domě k a a pt\", \"a V 10 pt\"], \"expected\": [\"domě k a a pt\", \"a V 10 pt\"], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.262,"exit_code":0,"observations":[{"actual":["text","v a k domě"],"check":"chained singles","expected":["text","v a k domě"],"passed":true},{"actual":["km z sazba","k Praze","s V k text"],"check":"regression: binding chain","expected":["km z sazba","k Praze","s V k text"],"passed":true},{"actual":["10 i a pt","10 domě","o a cm","a sazba"],"check":"partial-repair probe","expected":["10 i a pt","10 domě","o a cm","a sazba"],"passed":true},{"actual":["text kg","o i pt","i a o V řádek"],"check":"regression: binding chain","expected":["text kg","o i pt","i a o V řádek"],"passed":true},{"actual":["sazba","1,5 cm","text"],"check":"decimal comma with unit","expected":["sazba","1,5 cm","text"],"passed":true},{"actual":["V Praze","text","sazba"],"check":"sentence-initial V binds","expected":["V Praze","text","sazba"],"passed":true},{"actual":["i V V z a v"],"check":"control layout","expected":["i V V z a v"],"passed":true},{"actual":["domě k a a pt","a V 10 pt"],"check":"control layout","expected":["domě k a a pt","a V 10 pt"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"chained singles\", \"actual\": [\"text\", \"v a k domě\"], \"expected\": [\"text\", \"v a k domě\"], \"passed\": true}, {\"check\": \"regression: binding chain\", \"actual\": [\"km z sazba\", \"k Praze\", \"s V k text\"], \"expected\": [\"km z sazba\", \"k Praze\", \"s V k text\"], \"passed\": true}, {\"check\": \"partial-repair probe\", \"actual\": [\"10 i a pt\", \"10 domě\", \"o a cm\", \"a sazba\"], \"expected\": [\"10 i a pt\", \"10 domě\", \"o a cm\", \"a sazba\"], \"passed\": true}, {\"check\": \"regression: binding chain\", \"actual\": [\"text kg\", \"o i pt\", \"i a o V řádek\"], \"expected\": [\"text kg\", \"o i pt\", \"i a o V řádek\"], \"passed\": true}, {\"check\": \"decimal comma with unit\", \"actual\": [\"sazba\", \"1,5 cm\", \"text\"], \"expected\": [\"sazba\", \"1,5 cm\", \"text\"], \"passed\": true}, {\"check\": \"sentence-initial V binds\", \"actual\": [\"V Praze\", \"text\", \"sazba\"], \"expected\": [\"V Praze\", \"text\", \"sazba\"], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [\"i V V z a v\"], \"expected\": [\"i V V z a v\"], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [\"domě k a a pt\", \"a V 10 pt\"], \"expected\": [\"domě k a a pt\", \"a V 10 pt\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}