{"abstract":"5.75 mm converts to US 9 instead of US 10.","category":"Knitting and sewing pattern grading","checks":8,"contract":"Table US->mm: 0 2.0, 1 2.25, 2 2.75, 3 3.25, 4 3.5, 5 3.75, 6 4.0, 7 4.5, 8 5.0, 9 5.5, 10 6.0, 10.5 6.5, 11 8.0, 13 9.0, 15 10.0. \"us->mm\": trim, \"10 1/2\" means \"10.5\", exact match or \"error: size\". \"mm->us\": nearest size within 0.5 mm inclusive, ties to the larger mm, else \"error: size\". Other directions -> \"error: direction\".","evaluation_group":"w2-knitting_and_sewing_pattern_grading-needle-sizes","failed_approach":"Comparing US labels as strings ranks \"9\" above \"10\".","family":"w2-knitting_and_sewing_pattern_grading-needle-sizes-tie-break-toward-larger","id":"FA-97741","implementations":{"attempt":{"sha256":"100c799c37e5104ff29ed31ead52709ef1999c0c0b147d9575b1086e7bec3321","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(value, direction):\n    T = [('0', 2.0), ('1', 2.25), ('2', 2.75), ('3', 3.25), ('4', 3.5), ('5', 3.75), ('6', 4.0), ('7', 4.5),\n         ('8', 5.0), ('9', 5.5), ('10', 6.0), ('10.5', 6.5), ('11', 8.0), ('13', 9.0), ('15', 10.0)]\n    if direction == 'us->mm':\n        v = str(value).strip().replace(' 1/2', '.5')\n        for us, mm in T:\n            if us == v:\n                return mm\n        return 'error: size'\n    if direction == 'mm->us':\n        x = Fraction(str(value))\n        best = None\n        for us, mm in T:\n            d = abs(Fraction(str(mm)) - x)\n            if d > Fraction(1, 2):\n                continue\n            if best is None or d < best[0] or (d == best[0] and us > best[1]):\n                best = (d, us, mm)\n        return best[1] if best else 'error: size'\n    return 'error: direction' \ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['US 8', ['8', 'us->mm'], 5.0], ['half size', ['10 1/2', 'us->mm'], 6.5],\n  ['tie between 9 and 10', [5.75, 'mm->us'], '10'],\n  ['regression: tie-break toward larger', [6.25, 'mm->us'], '10.5'],\n  ['generated control 1', [11, 'us->mm'], 8.0], ['generated control 2', [3.3, 'uk'], 'error: direction'],\n  ['generated control 3', ['10.5', 'us->mm'], 6.5],\n  ['generated control 4', [1.5, 'uk'], 'error: direction']],\n [['half size', ['10 1/2', 'us->mm'], 6.5], ['tie between 9 and 10', [5.75, 'mm->us'], '10'],\n  ['edge of tolerance', [1.5, 'mm->us'], '0'],\n  ['regression: tie-break toward larger', [3.625, 'mm->us'], '5'],\n  ['generated control 1', ['0', 'us->mm'], 2.0], ['generated control 2', [3.0, 'mm->us'], '3'],\n  ['generated control 3', [' 7 ', 'us->mm'], 4.5], ['generated control 4', ['8', 'us->mm'], 5.0]],\n [['tie between 9 and 10', [5.75, 'mm->us'], '10'], ['edge of tolerance', [1.5, 'mm->us'], '0'],\n  ['no match', [11.0, 'mm->us'], 'error: size'],\n  ['regression: tie-break toward larger', [6.25, 'mm->us'], '10.5'],\n  ['generated control 1', [7.0, 'mm->us'], '10.5'], ['generated control 2', ['10.5', 'us->mm'], 6.5],\n  ['generated control 3', [7.25, 'mm->us'], 'error: size'],\n  ['generated control 4', ['12', 'us->mm'], 'error: size']],\n [['edge of tolerance', [1.5, 'mm->us'], '0'], ['no match', [11.0, 'mm->us'], 'error: size'],\n  ['US 8', ['8', 'us->mm'], 5.0], ['regression: tie-break toward larger', [4.25, 'mm->us'], '7'],\n  ['repair check: tie-break toward larger', [5.75, 'mm->us'], '10'],\n  ['generated control 1', [7.0, 'mm->us'], '10.5'], ['generated control 2', ['10.5', 'us->mm'], 6.5],\n  ['generated control 3', [1.5, 'uk'], 'error: direction']],\n [['no match', [11.0, 'mm->us'], 'error: size'], ['US 8', ['8', 'us->mm'], 5.0],\n  ['half size', ['10 1/2', 'us->mm'], 6.5], ['regression: tie-break toward larger', [3.625, 'mm->us'], '5'],\n  ['repair check: tie-break toward larger', [5.75, 'mm->us'], '10'],\n  ['generated control 1', ['10.5', 'us->mm'], 6.5], ['generated control 2', ['12', 'us->mm'], 'error: size'],\n  ['generated control 3', [3.3, 'mm->us'], '3']]]\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":"a6fccb6bcc5088459d8ed06ffbedc0a320d37e3e2ecd8f0d3cc274b91e057885","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(value, direction):\n    T = [('0', 2.0), ('1', 2.25), ('2', 2.75), ('3', 3.25), ('4', 3.5), ('5', 3.75), ('6', 4.0), ('7', 4.5),\n         ('8', 5.0), ('9', 5.5), ('10', 6.0), ('10.5', 6.5), ('11', 8.0), ('13', 9.0), ('15', 10.0)]\n    if direction == 'us->mm':\n        v = str(value).strip().replace(' 1/2', '.5')\n        for us, mm in T:\n            if us == v:\n                return mm\n        return 'error: size'\n    if direction == 'mm->us':\n        x = Fraction(str(value))\n        best = None\n        for us, mm in T:\n            d = abs(Fraction(str(mm)) - x)\n            if d > Fraction(1, 2):\n                continue\n            if best is None or d < best[0] or False:\n                best = (d, us, mm)\n        return best[1] if best else 'error: size'\n    return 'error: direction' \ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['US 8', ['8', 'us->mm'], 5.0], ['half size', ['10 1/2', 'us->mm'], 6.5],\n  ['tie between 9 and 10', [5.75, 'mm->us'], '10'],\n  ['regression: tie-break toward larger', [6.25, 'mm->us'], '10.5'],\n  ['generated control 1', [11, 'us->mm'], 8.0], ['generated control 2', [3.3, 'uk'], 'error: direction'],\n  ['generated control 3', ['10.5', 'us->mm'], 6.5],\n  ['generated control 4', [1.5, 'uk'], 'error: direction']],\n [['half size', ['10 1/2', 'us->mm'], 6.5], ['tie between 9 and 10', [5.75, 'mm->us'], '10'],\n  ['edge of tolerance', [1.5, 'mm->us'], '0'],\n  ['regression: tie-break toward larger', [3.625, 'mm->us'], '5'],\n  ['generated control 1', ['0', 'us->mm'], 2.0], ['generated control 2', [3.0, 'mm->us'], '3'],\n  ['generated control 3', [' 7 ', 'us->mm'], 4.5], ['generated control 4', ['8', 'us->mm'], 5.0]],\n [['tie between 9 and 10', [5.75, 'mm->us'], '10'], ['edge of tolerance', [1.5, 'mm->us'], '0'],\n  ['no match', [11.0, 'mm->us'], 'error: size'],\n  ['regression: tie-break toward larger', [6.25, 'mm->us'], '10.5'],\n  ['generated control 1', [7.0, 'mm->us'], '10.5'], ['generated control 2', ['10.5', 'us->mm'], 6.5],\n  ['generated control 3', [7.25, 'mm->us'], 'error: size'],\n  ['generated control 4', ['12', 'us->mm'], 'error: size']],\n [['edge of tolerance', [1.5, 'mm->us'], '0'], ['no match', [11.0, 'mm->us'], 'error: size'],\n  ['US 8', ['8', 'us->mm'], 5.0], ['regression: tie-break toward larger', [4.25, 'mm->us'], '7'],\n  ['repair check: tie-break toward larger', [5.75, 'mm->us'], '10'],\n  ['generated control 1', [7.0, 'mm->us'], '10.5'], ['generated control 2', ['10.5', 'us->mm'], 6.5],\n  ['generated control 3', [1.5, 'uk'], 'error: direction']],\n [['no match', [11.0, 'mm->us'], 'error: size'], ['US 8', ['8', 'us->mm'], 5.0],\n  ['half size', ['10 1/2', 'us->mm'], 6.5], ['regression: tie-break toward larger', [3.625, 'mm->us'], '5'],\n  ['repair check: tie-break toward larger', [5.75, 'mm->us'], '10'],\n  ['generated control 1', ['10.5', 'us->mm'], 6.5], ['generated control 2', ['12', 'us->mm'], 'error: size'],\n  ['generated control 3', [3.3, 'mm->us'], '3']]]\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":"d170f5963493a27c3eda8a5b15371bcd804b9182abe07c8905758dc00d047ca3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(value, direction):\n    T = [('0', 2.0), ('1', 2.25), ('2', 2.75), ('3', 3.25), ('4', 3.5), ('5', 3.75), ('6', 4.0), ('7', 4.5),\n         ('8', 5.0), ('9', 5.5), ('10', 6.0), ('10.5', 6.5), ('11', 8.0), ('13', 9.0), ('15', 10.0)]\n    if direction == 'us->mm':\n        v = str(value).strip().replace(' 1/2', '.5')\n        for us, mm in T:\n            if us == v:\n                return mm\n        return 'error: size'\n    if direction == 'mm->us':\n        x = Fraction(str(value))\n        best = None\n        for us, mm in T:\n            d = abs(Fraction(str(mm)) - x)\n            if d > Fraction(1, 2):\n                continue\n            if best is None or d < best[0] or (d == best[0] and mm > best[2]):\n                best = (d, us, mm)\n        return best[1] if best else 'error: size'\n    return 'error: direction' \ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['US 8', ['8', 'us->mm'], 5.0], ['half size', ['10 1/2', 'us->mm'], 6.5],\n  ['tie between 9 and 10', [5.75, 'mm->us'], '10'],\n  ['regression: tie-break toward larger', [6.25, 'mm->us'], '10.5'],\n  ['generated control 1', [11, 'us->mm'], 8.0], ['generated control 2', [3.3, 'uk'], 'error: direction'],\n  ['generated control 3', ['10.5', 'us->mm'], 6.5],\n  ['generated control 4', [1.5, 'uk'], 'error: direction']],\n [['half size', ['10 1/2', 'us->mm'], 6.5], ['tie between 9 and 10', [5.75, 'mm->us'], '10'],\n  ['edge of tolerance', [1.5, 'mm->us'], '0'],\n  ['regression: tie-break toward larger', [3.625, 'mm->us'], '5'],\n  ['generated control 1', ['0', 'us->mm'], 2.0], ['generated control 2', [3.0, 'mm->us'], '3'],\n  ['generated control 3', [' 7 ', 'us->mm'], 4.5], ['generated control 4', ['8', 'us->mm'], 5.0]],\n [['tie between 9 and 10', [5.75, 'mm->us'], '10'], ['edge of tolerance', [1.5, 'mm->us'], '0'],\n  ['no match', [11.0, 'mm->us'], 'error: size'],\n  ['regression: tie-break toward larger', [6.25, 'mm->us'], '10.5'],\n  ['generated control 1', [7.0, 'mm->us'], '10.5'], ['generated control 2', ['10.5', 'us->mm'], 6.5],\n  ['generated control 3', [7.25, 'mm->us'], 'error: size'],\n  ['generated control 4', ['12', 'us->mm'], 'error: size']],\n [['edge of tolerance', [1.5, 'mm->us'], '0'], ['no match', [11.0, 'mm->us'], 'error: size'],\n  ['US 8', ['8', 'us->mm'], 5.0], ['regression: tie-break toward larger', [4.25, 'mm->us'], '7'],\n  ['repair check: tie-break toward larger', [5.75, 'mm->us'], '10'],\n  ['generated control 1', [7.0, 'mm->us'], '10.5'], ['generated control 2', ['10.5', 'us->mm'], 6.5],\n  ['generated control 3', [1.5, 'uk'], 'error: direction']],\n [['no match', [11.0, 'mm->us'], 'error: size'], ['US 8', ['8', 'us->mm'], 5.0],\n  ['half size', ['10 1/2', 'us->mm'], 6.5], ['regression: tie-break toward larger', [3.625, 'mm->us'], '5'],\n  ['repair check: tie-break toward larger', [5.75, 'mm->us'], '10'],\n  ['generated control 1', ['10.5', 'us->mm'], 6.5], ['generated control 2', ['12', 'us->mm'], 'error: size'],\n  ['generated control 3', [3.3, 'mm->us'], '3']]]\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 contract stated in full here; it is a bounded teaching model, not an authoritative reference or standards implementation. 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-knitting_and_sewing_pattern_grading-needle-sizes-tie-break-toward-larger","generated_at":"2026-09-29T14:52:35.134293+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Patterns list needle sizes in US or metric and knitters convert between them.","repair":"Break ties toward the larger millimetre size.","root_cause":"Equidistant sizes keep the first (smaller) match.","sha256":"04b9ca2afeb904df9b690e1b35d1cfd88e3c15932cb936b5cf505516532893ba","title":"Knitting needle size converter: tie-break toward larger · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.691,"exit_code":1,"observations":[{"actual":5.0,"check":"US 8","expected":5.0,"passed":true},{"actual":6.5,"check":"half size","expected":6.5,"passed":true},{"actual":"9","check":"tie between 9 and 10","expected":"10","passed":false},{"actual":"10.5","check":"regression: tie-break toward larger","expected":"10.5","passed":true},{"actual":8.0,"check":"generated control 1","expected":8.0,"passed":true},{"actual":"error: direction","check":"generated control 2","expected":"error: direction","passed":true},{"actual":6.5,"check":"generated control 3","expected":6.5,"passed":true},{"actual":"error: direction","check":"generated control 4","expected":"error: direction","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"US 8\", \"actual\": 5.0, \"expected\": 5.0, \"passed\": true}, {\"check\": \"half size\", \"actual\": 6.5, \"expected\": 6.5, \"passed\": true}, {\"check\": \"tie between 9 and 10\", \"actual\": \"9\", \"expected\": \"10\", \"passed\": false}, {\"check\": \"regression: tie-break toward larger\", \"actual\": \"10.5\", \"expected\": \"10.5\", \"passed\": true}, {\"check\": \"generated control 1\", \"actual\": 8.0, \"expected\": 8.0, \"passed\": true}, {\"check\": \"generated control 2\", \"actual\": \"error: direction\", \"expected\": \"error: direction\", \"passed\": true}, {\"check\": \"generated control 3\", \"actual\": 6.5, \"expected\": 6.5, \"passed\": true}, {\"check\": \"generated control 4\", \"actual\": \"error: direction\", \"expected\": \"error: direction\", \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.976,"exit_code":1,"observations":[{"actual":5.0,"check":"US 8","expected":5.0,"passed":true},{"actual":6.5,"check":"half size","expected":6.5,"passed":true},{"actual":"9","check":"tie between 9 and 10","expected":"10","passed":false},{"actual":"10","check":"regression: tie-break toward larger","expected":"10.5","passed":false},{"actual":8.0,"check":"generated control 1","expected":8.0,"passed":true},{"actual":"error: direction","check":"generated control 2","expected":"error: direction","passed":true},{"actual":6.5,"check":"generated control 3","expected":6.5,"passed":true},{"actual":"error: direction","check":"generated control 4","expected":"error: direction","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"US 8\", \"actual\": 5.0, \"expected\": 5.0, \"passed\": true}, {\"check\": \"half size\", \"actual\": 6.5, \"expected\": 6.5, \"passed\": true}, {\"check\": \"tie between 9 and 10\", \"actual\": \"9\", \"expected\": \"10\", \"passed\": false}, {\"check\": \"regression: tie-break toward larger\", \"actual\": \"10\", \"expected\": \"10.5\", \"passed\": false}, {\"check\": \"generated control 1\", \"actual\": 8.0, \"expected\": 8.0, \"passed\": true}, {\"check\": \"generated control 2\", \"actual\": \"error: direction\", \"expected\": \"error: direction\", \"passed\": true}, {\"check\": \"generated control 3\", \"actual\": 6.5, \"expected\": 6.5, \"passed\": true}, {\"check\": \"generated control 4\", \"actual\": \"error: direction\", \"expected\": \"error: direction\", \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":46.092,"exit_code":0,"observations":[{"actual":5.0,"check":"US 8","expected":5.0,"passed":true},{"actual":6.5,"check":"half size","expected":6.5,"passed":true},{"actual":"10","check":"tie between 9 and 10","expected":"10","passed":true},{"actual":"10.5","check":"regression: tie-break toward larger","expected":"10.5","passed":true},{"actual":8.0,"check":"generated control 1","expected":8.0,"passed":true},{"actual":"error: direction","check":"generated control 2","expected":"error: direction","passed":true},{"actual":6.5,"check":"generated control 3","expected":6.5,"passed":true},{"actual":"error: direction","check":"generated control 4","expected":"error: direction","passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"US 8\", \"actual\": 5.0, \"expected\": 5.0, \"passed\": true}, {\"check\": \"half size\", \"actual\": 6.5, \"expected\": 6.5, \"passed\": true}, {\"check\": \"tie between 9 and 10\", \"actual\": \"10\", \"expected\": \"10\", \"passed\": true}, {\"check\": \"regression: tie-break toward larger\", \"actual\": \"10.5\", \"expected\": \"10.5\", \"passed\": true}, {\"check\": \"generated control 1\", \"actual\": 8.0, \"expected\": 8.0, \"passed\": true}, {\"check\": \"generated control 2\", \"actual\": \"error: direction\", \"expected\": \"error: direction\", \"passed\": true}, {\"check\": \"generated control 3\", \"actual\": 6.5, \"expected\": 6.5, \"passed\": true}, {\"check\": \"generated control 4\", \"actual\": \"error: direction\", \"expected\": \"error: direction\", \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}