{"abstract":"Exact midpoint values receive even rounding or asymmetric rounding instead of the required away-from-zero result.","category":"Integer arithmetic","checks":9,"contract":"Round numerator/denominator to the nearest integer, with exact ties away from zero. Inputs are integers and denominator must be positive; invalid denominators return None. No decimal parsing or floating-point conversion occurs.","evaluation_group":"model-c7736e0830b8f5c1","failed_approach":"Adding one half before floor fixes positive ties but turns a negative tie toward zero.","family":"num-rational-half-away-quantization","id":"FA-341","implementations":{"attempt":{"sha256":"38dc0407a0c46da9affd3ab399283fc5da2cfefe8761609ad30a7f856f1f816a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nimport math\nN = 1\nobservations = []\ndef solve(numerator, denominator):\n    return math.floor(Fraction(numerator, denominator) + Fraction(1, 2)) if denominator > 0 else None\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('positive half after even integer', solve(4 * N + 1, 2), 2 * N + 1)\ncheck('negative half after even magnitude', solve(-4 * N - 1, 2), -2 * N - 1)\ncheck('just below midpoint', solve(200 * N + 49, 100), 2 * N)\ncheck('just above midpoint', solve(200 * N + 51, 100), 2 * N + 1)\ncheck('negative value below midpoint magnitude', solve(-200 * N - 49, 100), -2 * N)\ncheck('exact negative integer', solve(-N * 7, 7), -N)\ncheck('zero', solve(0, N), 0)\ncheck('zero denominator rejected', solve(N, 0), None)\ncheck('negative denominator rejected', solve(N, -1), None)\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":"9035bd73f15b979682fe58b316db3ded346faf095f3d148eff1adc555d607277","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nimport math\nN = 1\nobservations = []\ndef solve(numerator, denominator):\n    return round(Fraction(numerator, denominator)) if denominator > 0 else None\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('positive half after even integer', solve(4 * N + 1, 2), 2 * N + 1)\ncheck('negative half after even magnitude', solve(-4 * N - 1, 2), -2 * N - 1)\ncheck('just below midpoint', solve(200 * N + 49, 100), 2 * N)\ncheck('just above midpoint', solve(200 * N + 51, 100), 2 * N + 1)\ncheck('negative value below midpoint magnitude', solve(-200 * N - 49, 100), -2 * N)\ncheck('exact negative integer', solve(-N * 7, 7), -N)\ncheck('zero', solve(0, N), 0)\ncheck('zero denominator rejected', solve(N, 0), None)\ncheck('negative denominator rejected', solve(N, -1), None)\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":"4953ff45b056e8da09c2ee3d267e5ee697916f7aa6530504339d804c2858f8c1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nimport math\nN = 1\nobservations = []\ndef solve(numerator, denominator):\n    if denominator <= 0:\n        return None\n    whole, remainder = divmod(abs(numerator), denominator)\n    magnitude = whole + (2 * remainder >= denominator)\n    return -magnitude if numerator < 0 else magnitude\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('positive half after even integer', solve(4 * N + 1, 2), 2 * N + 1)\ncheck('negative half after even magnitude', solve(-4 * N - 1, 2), -2 * N - 1)\ncheck('just below midpoint', solve(200 * N + 49, 100), 2 * N)\ncheck('just above midpoint', solve(200 * N + 51, 100), 2 * N + 1)\ncheck('negative value below midpoint magnitude', solve(-200 * N - 49, 100), -2 * N)\ncheck('exact negative integer', solve(-N * 7, 7), -N)\ncheck('zero', solve(0, N), 0)\ncheck('zero denominator rejected', solve(N, 0), None)\ncheck('negative denominator rejected', solve(N, -1), None)\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":"num-rational-half-away-quantization","generated_at":"2026-09-29T14:36:52.120851+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Quantizers and fixed-point protocols need an explicit signed tie rule. The failure here is a rounding-policy mismatch, separate from binary representation error when parsing decimals.","repair":"Compare twice the absolute remainder with the denominator, then restore the original sign after rounding the magnitude.","root_cause":"A default tie convention or the positive-only floor(x+0.5) identity is used for signed rational values.","sha256":"5ea61b6fc79dcbe340d5720d98a94fdefbf0901f30bacdf1c80de4faeaaef738","title":"A positive-only tie rule rounds negative halves toward zero · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":38.14,"exit_code":1,"observations":[{"actual":3,"check":"positive half after even integer","expected":3,"passed":true},{"actual":-2,"check":"negative half after even magnitude","expected":-3,"passed":false},{"actual":2,"check":"just below midpoint","expected":2,"passed":true},{"actual":3,"check":"just above midpoint","expected":3,"passed":true},{"actual":-2,"check":"negative value below midpoint magnitude","expected":-2,"passed":true},{"actual":-1,"check":"exact negative integer","expected":-1,"passed":true},{"actual":0,"check":"zero","expected":0,"passed":true},{"actual":null,"check":"zero denominator rejected","expected":null,"passed":true},{"actual":null,"check":"negative denominator rejected","expected":null,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"positive half after even integer\", \"actual\": 3, \"expected\": 3, \"passed\": true}, {\"check\": \"negative half after even magnitude\", \"actual\": -2, \"expected\": -3, \"passed\": false}, {\"check\": \"just below midpoint\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"just above midpoint\", \"actual\": 3, \"expected\": 3, \"passed\": true}, {\"check\": \"negative value below midpoint magnitude\", \"actual\": -2, \"expected\": -2, \"passed\": true}, {\"check\": \"exact negative integer\", \"actual\": -1, \"expected\": -1, \"passed\": true}, {\"check\": \"zero\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"zero denominator rejected\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"negative denominator rejected\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.487,"exit_code":1,"observations":[{"actual":2,"check":"positive half after even integer","expected":3,"passed":false},{"actual":-2,"check":"negative half after even magnitude","expected":-3,"passed":false},{"actual":2,"check":"just below midpoint","expected":2,"passed":true},{"actual":3,"check":"just above midpoint","expected":3,"passed":true},{"actual":-2,"check":"negative value below midpoint magnitude","expected":-2,"passed":true},{"actual":-1,"check":"exact negative integer","expected":-1,"passed":true},{"actual":0,"check":"zero","expected":0,"passed":true},{"actual":null,"check":"zero denominator rejected","expected":null,"passed":true},{"actual":null,"check":"negative denominator rejected","expected":null,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"positive half after even integer\", \"actual\": 2, \"expected\": 3, \"passed\": false}, {\"check\": \"negative half after even magnitude\", \"actual\": -2, \"expected\": -3, \"passed\": false}, {\"check\": \"just below midpoint\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"just above midpoint\", \"actual\": 3, \"expected\": 3, \"passed\": true}, {\"check\": \"negative value below midpoint magnitude\", \"actual\": -2, \"expected\": -2, \"passed\": true}, {\"check\": \"exact negative integer\", \"actual\": -1, \"expected\": -1, \"passed\": true}, {\"check\": \"zero\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"zero denominator rejected\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"negative denominator rejected\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.227,"exit_code":0,"observations":[{"actual":3,"check":"positive half after even integer","expected":3,"passed":true},{"actual":-3,"check":"negative half after even magnitude","expected":-3,"passed":true},{"actual":2,"check":"just below midpoint","expected":2,"passed":true},{"actual":3,"check":"just above midpoint","expected":3,"passed":true},{"actual":-2,"check":"negative value below midpoint magnitude","expected":-2,"passed":true},{"actual":-1,"check":"exact negative integer","expected":-1,"passed":true},{"actual":0,"check":"zero","expected":0,"passed":true},{"actual":null,"check":"zero denominator rejected","expected":null,"passed":true},{"actual":null,"check":"negative denominator rejected","expected":null,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"positive half after even integer\", \"actual\": 3, \"expected\": 3, \"passed\": true}, {\"check\": \"negative half after even magnitude\", \"actual\": -3, \"expected\": -3, \"passed\": true}, {\"check\": \"just below midpoint\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"just above midpoint\", \"actual\": 3, \"expected\": 3, \"passed\": true}, {\"check\": \"negative value below midpoint magnitude\", \"actual\": -2, \"expected\": -2, \"passed\": true}, {\"check\": \"exact negative integer\", \"actual\": -1, \"expected\": -1, \"passed\": true}, {\"check\": \"zero\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"zero denominator rejected\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"negative denominator rejected\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}