{"abstract":"Moving to a bigger pan shrinks the recipe.","category":"Recipe scaling and nutrition","checks":8,"contract":"Pans: [\"round\", diameter], [\"square\", side], [\"rect\", w, l] in inches; other -> \"error: pan\". If scale_to_fill, return factor round(area_new/area_old, 2), same minutes, warning None. Otherwise the same batter goes into the new pan: depth ratio = area_old/area_new, minutes = bake_min*(1+(ratio-1)/2) rounded half-up to a multiple of 5, factor 1.0, warning \"overflow risk\" when ratio > 1.5 else None.","contract_signature":"old_pan, new_pan, bake_min, scale_to_fill","evaluation_group":"w2-recipe_scaling_and_nutrition-pan-substitution","failed_approach":"Always dividing larger by smaller never scales a recipe down for a smaller pan.","family":"w2-recipe_scaling_and_nutrition-pan-substitution-fill-factor-direction","id":"FA-97036","implementations":{"attempt":{"sha256":"bf1d4466b9d5a221874d84b65cef0bb850610d4f3eb55a3a101761141cbbffa3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(old_pan, new_pan, bake_min, scale_to_fill):\n    def area(p):\n        if p[0] == 'round':\n            return math.pi * (p[1] / 2) ** 2\n        if p[0] == 'square':\n            return p[1] * p[1]\n        if p[0] == 'rect':\n            return p[1] * p[2]\n        return None\n    a0, a1 = area(old_pan), area(new_pan)\n    if not a0 or not a1:\n        return 'error: pan'\n    if scale_to_fill:\n        return {'factor': round(max(a0, a1) / min(a0, a1), 2), 'minutes': bake_min, 'warning': None}\n    depth = a0 / a1\n    minutes = 5 * math.floor(bake_min * (1 + (depth - 1) / 2) / 5 + 0.5)\n    return {'factor': 1.0, 'minutes': minutes, 'warning': 'overflow risk' if depth > 1.5 else None}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['same pan', [['square', 8], ['square', 8], 30, False], {'factor': 1.0, 'minutes': 30, 'warning': None}],\n  ['ratio exactly 1.5', [['square', 12], ['rect', 8, 12], 30, False],\n   {'factor': 1.0, 'minutes': 40, 'warning': None}],\n  ['round to square fill', [['round', 9], ['square', 9], 30, True],\n   {'factor': 1.27, 'minutes': 30, 'warning': None}],\n  ['regression: fill factor direction', [['rect', 9, 15], ['square', 6], 35, True],\n   {'factor': 0.27, 'minutes': 35, 'warning': None}],\n  ['repair check: fill factor direction', [['rect', 8, 13], ['square', 6], 20, True],\n   {'factor': 0.35, 'minutes': 20, 'warning': None}],\n  ['generated control 1', [['rect', 9, 13], ['rect', 8, 13], 20, False],\n   {'factor': 1.0, 'minutes': 20, 'warning': None}],\n  ['generated control 2', [['rect', 11, 13], ['rect', 9, 15], 25, False],\n   {'factor': 1.0, 'minutes': 25, 'warning': None}],\n  ['generated control 3', [['square', 8], ['square', 12], 30, False],\n   {'factor': 1.0, 'minutes': 20, 'warning': None}]],\n [['ratio exactly 1.5', [['square', 12], ['rect', 8, 12], 30, False],\n   {'factor': 1.0, 'minutes': 40, 'warning': None}],\n  ['round to square fill', [['round', 9], ['square', 9], 30, True],\n   {'factor': 1.27, 'minutes': 30, 'warning': None}],\n  ['bad pan', [['bundt', 10], ['square', 8], 30, True], 'error: pan'],\n  ['regression: fill factor direction', [['square', 6], ['rect', 11, 13], 35, True],\n   {'factor': 3.97, 'minutes': 35, 'warning': None}],\n  ['repair check: fill factor direction', [['rect', 11, 15], ['square', 6], 25, True],\n   {'factor': 0.22, 'minutes': 25, 'warning': None}],\n  ['generated control 1', [['rect', 9, 12], ['rect', 11, 13], 45, False],\n   {'factor': 1.0, 'minutes': 40, 'warning': None}],\n  ['generated control 2', [['rect', 9, 13], ['rect', 8, 15], 30, False],\n   {'factor': 1.0, 'minutes': 30, 'warning': None}],\n  ['generated control 3', [['rect', 9, 12], ['round', 6], 35, False],\n   {'factor': 1.0, 'minutes': 85, 'warning': 'overflow risk'}]],\n [['round to square fill', [['round', 9], ['square', 9], 30, True],\n   {'factor': 1.27, 'minutes': 30, 'warning': None}],\n  ['bad pan', [['bundt', 10], ['square', 8], 30, True], 'error: pan'],\n  ['same pan', [['square', 8], ['square', 8], 30, False], {'factor': 1.0, 'minutes': 30, 'warning': None}],\n  ['regression: fill factor direction', [['round', 12], ['rect', 11, 15], 20, True],\n   {'factor': 1.46, 'minutes': 20, 'warning': None}],\n  ['repair check: fill factor direction', [['square', 9], ['square', 8], 25, True],\n   {'factor': 0.79, 'minutes': 25, 'warning': None}],\n  ['generated control 1', [['square', 12], ['square', 6], 45, False],\n   {'factor': 1.0, 'minutes': 115, 'warning': 'overflow risk'}],\n  ['generated control 2', [['square', 8], ['square', 6], 35, False],\n   {'factor': 1.0, 'minutes': 50, 'warning': 'overflow risk'}],\n  ['generated control 3', [['rect', 11, 15], ['round', 8], 35, False],\n   {'factor': 1.0, 'minutes': 75, 'warning': 'overflow risk'}]],\n [['bad pan', [['bundt', 10], ['square', 8], 30, True], 'error: pan'],\n  ['same pan', [['square', 8], ['square', 8], 30, False], {'factor': 1.0, 'minutes': 30, 'warning': None}],\n  ['ratio exactly 1.5', [['square', 12], ['rect', 8, 12], 30, False],\n   {'factor': 1.0, 'minutes': 40, 'warning': None}],\n  ['regression: fill factor direction', [['rect', 11, 13], ['round', 12], 25, True],\n   {'factor': 0.79, 'minutes': 25, 'warning': None}],\n  ['repair check: fill factor direction', [['square', 8], ['round', 6], 20, True],\n   {'factor': 0.44, 'minutes': 20, 'warning': None}],\n  ['generated control 1', [['round', 12], ['rect', 9, 13], 35, False],\n   {'factor': 1.0, 'minutes': 35, 'warning': None}],\n  ['generated control 2', [['rect', 8, 15], ['round', 12], 20, False],\n   {'factor': 1.0, 'minutes': 20, 'warning': None}],\n  ['generated control 3', [['square', 8], ['round', 9], 35, False],\n   {'factor': 1.0, 'minutes': 35, 'warning': None}]],\n [['same pan', [['square', 8], ['square', 8], 30, False], {'factor': 1.0, 'minutes': 30, 'warning': None}],\n  ['ratio exactly 1.5', [['square', 12], ['rect', 8, 12], 30, False],\n   {'factor': 1.0, 'minutes': 40, 'warning': None}],\n  ['round to square fill', [['round', 9], ['square', 9], 30, True],\n   {'factor': 1.27, 'minutes': 30, 'warning': None}],\n  ['regression: fill factor direction', [['square', 8], ['rect', 9, 12], 30, True],\n   {'factor': 1.69, 'minutes': 30, 'warning': None}],\n  ['repair check: fill factor direction', [['round', 8], ['square', 6], 35, True],\n   {'factor': 0.72, 'minutes': 35, 'warning': None}],\n  ['generated control 1', [['square', 6], ['rect', 8, 12], 20, True],\n   {'factor': 2.67, 'minutes': 20, 'warning': None}],\n  ['generated control 2', [['rect', 8, 12], ['rect', 11, 13], 35, True],\n   {'factor': 1.49, 'minutes': 35, 'warning': None}],\n  ['generated control 3', [['rect', 9, 12], ['round', 6], 45, False],\n   {'factor': 1.0, 'minutes': 110, 'warning': 'overflow risk'}]]]\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":"ee8d18f39b2ada717f8da1e87a49cc70c28b303d5049969c976ae2672524b1fd","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(old_pan, new_pan, bake_min, scale_to_fill):\n    def area(p):\n        if p[0] == 'round':\n            return math.pi * (p[1] / 2) ** 2\n        if p[0] == 'square':\n            return p[1] * p[1]\n        if p[0] == 'rect':\n            return p[1] * p[2]\n        return None\n    a0, a1 = area(old_pan), area(new_pan)\n    if not a0 or not a1:\n        return 'error: pan'\n    if scale_to_fill:\n        return {'factor': round(a0 / a1, 2), 'minutes': bake_min, 'warning': None}\n    depth = a0 / a1\n    minutes = 5 * math.floor(bake_min * (1 + (depth - 1) / 2) / 5 + 0.5)\n    return {'factor': 1.0, 'minutes': minutes, 'warning': 'overflow risk' if depth > 1.5 else None}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['same pan', [['square', 8], ['square', 8], 30, False], {'factor': 1.0, 'minutes': 30, 'warning': None}],\n  ['ratio exactly 1.5', [['square', 12], ['rect', 8, 12], 30, False],\n   {'factor': 1.0, 'minutes': 40, 'warning': None}],\n  ['round to square fill', [['round', 9], ['square', 9], 30, True],\n   {'factor': 1.27, 'minutes': 30, 'warning': None}],\n  ['regression: fill factor direction', [['rect', 9, 15], ['square', 6], 35, True],\n   {'factor': 0.27, 'minutes': 35, 'warning': None}],\n  ['repair check: fill factor direction', [['rect', 8, 13], ['square', 6], 20, True],\n   {'factor': 0.35, 'minutes': 20, 'warning': None}],\n  ['generated control 1', [['rect', 9, 13], ['rect', 8, 13], 20, False],\n   {'factor': 1.0, 'minutes': 20, 'warning': None}],\n  ['generated control 2', [['rect', 11, 13], ['rect', 9, 15], 25, False],\n   {'factor': 1.0, 'minutes': 25, 'warning': None}],\n  ['generated control 3', [['square', 8], ['square', 12], 30, False],\n   {'factor': 1.0, 'minutes': 20, 'warning': None}]],\n [['ratio exactly 1.5', [['square', 12], ['rect', 8, 12], 30, False],\n   {'factor': 1.0, 'minutes': 40, 'warning': None}],\n  ['round to square fill', [['round', 9], ['square', 9], 30, True],\n   {'factor': 1.27, 'minutes': 30, 'warning': None}],\n  ['bad pan', [['bundt', 10], ['square', 8], 30, True], 'error: pan'],\n  ['regression: fill factor direction', [['square', 6], ['rect', 11, 13], 35, True],\n   {'factor': 3.97, 'minutes': 35, 'warning': None}],\n  ['repair check: fill factor direction', [['rect', 11, 15], ['square', 6], 25, True],\n   {'factor': 0.22, 'minutes': 25, 'warning': None}],\n  ['generated control 1', [['rect', 9, 12], ['rect', 11, 13], 45, False],\n   {'factor': 1.0, 'minutes': 40, 'warning': None}],\n  ['generated control 2', [['rect', 9, 13], ['rect', 8, 15], 30, False],\n   {'factor': 1.0, 'minutes': 30, 'warning': None}],\n  ['generated control 3', [['rect', 9, 12], ['round', 6], 35, False],\n   {'factor': 1.0, 'minutes': 85, 'warning': 'overflow risk'}]],\n [['round to square fill', [['round', 9], ['square', 9], 30, True],\n   {'factor': 1.27, 'minutes': 30, 'warning': None}],\n  ['bad pan', [['bundt', 10], ['square', 8], 30, True], 'error: pan'],\n  ['same pan', [['square', 8], ['square', 8], 30, False], {'factor': 1.0, 'minutes': 30, 'warning': None}],\n  ['regression: fill factor direction', [['round', 12], ['rect', 11, 15], 20, True],\n   {'factor': 1.46, 'minutes': 20, 'warning': None}],\n  ['repair check: fill factor direction', [['square', 9], ['square', 8], 25, True],\n   {'factor': 0.79, 'minutes': 25, 'warning': None}],\n  ['generated control 1', [['square', 12], ['square', 6], 45, False],\n   {'factor': 1.0, 'minutes': 115, 'warning': 'overflow risk'}],\n  ['generated control 2', [['square', 8], ['square', 6], 35, False],\n   {'factor': 1.0, 'minutes': 50, 'warning': 'overflow risk'}],\n  ['generated control 3', [['rect', 11, 15], ['round', 8], 35, False],\n   {'factor': 1.0, 'minutes': 75, 'warning': 'overflow risk'}]],\n [['bad pan', [['bundt', 10], ['square', 8], 30, True], 'error: pan'],\n  ['same pan', [['square', 8], ['square', 8], 30, False], {'factor': 1.0, 'minutes': 30, 'warning': None}],\n  ['ratio exactly 1.5', [['square', 12], ['rect', 8, 12], 30, False],\n   {'factor': 1.0, 'minutes': 40, 'warning': None}],\n  ['regression: fill factor direction', [['rect', 11, 13], ['round', 12], 25, True],\n   {'factor': 0.79, 'minutes': 25, 'warning': None}],\n  ['repair check: fill factor direction', [['square', 8], ['round', 6], 20, True],\n   {'factor': 0.44, 'minutes': 20, 'warning': None}],\n  ['generated control 1', [['round', 12], ['rect', 9, 13], 35, False],\n   {'factor': 1.0, 'minutes': 35, 'warning': None}],\n  ['generated control 2', [['rect', 8, 15], ['round', 12], 20, False],\n   {'factor': 1.0, 'minutes': 20, 'warning': None}],\n  ['generated control 3', [['square', 8], ['round', 9], 35, False],\n   {'factor': 1.0, 'minutes': 35, 'warning': None}]],\n [['same pan', [['square', 8], ['square', 8], 30, False], {'factor': 1.0, 'minutes': 30, 'warning': None}],\n  ['ratio exactly 1.5', [['square', 12], ['rect', 8, 12], 30, False],\n   {'factor': 1.0, 'minutes': 40, 'warning': None}],\n  ['round to square fill', [['round', 9], ['square', 9], 30, True],\n   {'factor': 1.27, 'minutes': 30, 'warning': None}],\n  ['regression: fill factor direction', [['square', 8], ['rect', 9, 12], 30, True],\n   {'factor': 1.69, 'minutes': 30, 'warning': None}],\n  ['repair check: fill factor direction', [['round', 8], ['square', 6], 35, True],\n   {'factor': 0.72, 'minutes': 35, 'warning': None}],\n  ['generated control 1', [['square', 6], ['rect', 8, 12], 20, True],\n   {'factor': 2.67, 'minutes': 20, 'warning': None}],\n  ['generated control 2', [['rect', 8, 12], ['rect', 11, 13], 35, True],\n   {'factor': 1.49, 'minutes': 35, 'warning': None}],\n  ['generated control 3', [['rect', 9, 12], ['round', 6], 45, False],\n   {'factor': 1.0, 'minutes': 110, 'warning': 'overflow risk'}]]]\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-recipe_scaling_and_nutrition-pan-substitution-fill-factor-direction","generated_at":"2026-09-29T14:52:28.238309+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Bakers swap pan shapes and must scale the batter or adjust bake time for batter depth.","root_cause":"The fill factor divides old area by new area.","sha256":"acd5a4d140c5cba8c9981dd497ad985fc2a5a41a6789ba646b47e1b4a26b383c","title":"Baking pan substitution: fill factor direction · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":43.467,"exit_code":1,"observations":[{"actual":{"factor":1.0,"minutes":30,"warning":null},"check":"same pan","expected":{"factor":1.0,"minutes":30,"warning":null},"passed":true},{"actual":{"factor":1.0,"minutes":40,"warning":null},"check":"ratio exactly 1.5","expected":{"factor":1.0,"minutes":40,"warning":null},"passed":true},{"actual":{"factor":1.27,"minutes":30,"warning":null},"check":"round to square fill","expected":{"factor":1.27,"minutes":30,"warning":null},"passed":true},{"actual":{"factor":3.75,"minutes":35,"warning":null},"check":"regression: fill factor direction","expected":{"factor":0.27,"minutes":35,"warning":null},"passed":false},{"actual":{"factor":2.89,"minutes":20,"warning":null},"check":"repair check: fill factor direction","expected":{"factor":0.35,"minutes":20,"warning":null},"passed":false},{"actual":{"factor":1.0,"minutes":20,"warning":null},"check":"generated control 1","expected":{"factor":1.0,"minutes":20,"warning":null},"passed":true},{"actual":{"factor":1.0,"minutes":25,"warning":null},"check":"generated control 2","expected":{"factor":1.0,"minutes":25,"warning":null},"passed":true},{"actual":{"factor":1.0,"minutes":20,"warning":null},"check":"generated control 3","expected":{"factor":1.0,"minutes":20,"warning":null},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"same pan\", \"actual\": {\"factor\": 1.0, \"minutes\": 30, \"warning\": null}, \"expected\": {\"factor\": 1.0, \"minutes\": 30, \"warning\": null}, \"passed\": true}, {\"check\": \"ratio exactly 1.5\", \"actual\": {\"factor\": 1.0, \"minutes\": 40, \"warning\": null}, \"expected\": {\"factor\": 1.0, \"minutes\": 40, \"warning\": null}, \"passed\": true}, {\"check\": \"round to square fill\", \"actual\": {\"factor\": 1.27, \"minutes\": 30, \"warning\": null}, \"expected\": {\"factor\": 1.27, \"minutes\": 30, \"warning\": null}, \"passed\": true}, {\"check\": \"regression: fill factor direction\", \"actual\": {\"factor\": 3.75, \"minutes\": 35, \"warning\": null}, \"expected\": {\"factor\": 0.27, \"minutes\": 35, \"warning\": null}, \"passed\": false}, {\"check\": \"repair check: fill factor direction\", \"actual\": {\"factor\": 2.89, \"minutes\": 20, \"warning\": null}, \"expected\": {\"factor\": 0.35, \"minutes\": 20, \"warning\": null}, \"passed\": false}, {\"check\": \"generated control 1\", \"actual\": {\"factor\": 1.0, \"minutes\": 20, \"warning\": null}, \"expected\": {\"factor\": 1.0, \"minutes\": 20, \"warning\": null}, \"passed\": true}, {\"check\": \"generated control 2\", \"actual\": {\"factor\": 1.0, \"minutes\": 25, \"warning\": null}, \"expected\": {\"factor\": 1.0, \"minutes\": 25, \"warning\": null}, \"passed\": true}, {\"check\": \"generated control 3\", \"actual\": {\"factor\": 1.0, \"minutes\": 20, \"warning\": null}, \"expected\": {\"factor\": 1.0, \"minutes\": 20, \"warning\": null}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.14,"exit_code":1,"observations":[{"actual":{"factor":1.0,"minutes":30,"warning":null},"check":"same pan","expected":{"factor":1.0,"minutes":30,"warning":null},"passed":true},{"actual":{"factor":1.0,"minutes":40,"warning":null},"check":"ratio exactly 1.5","expected":{"factor":1.0,"minutes":40,"warning":null},"passed":true},{"actual":{"factor":0.79,"minutes":30,"warning":null},"check":"round to square fill","expected":{"factor":1.27,"minutes":30,"warning":null},"passed":false},{"actual":{"factor":3.75,"minutes":35,"warning":null},"check":"regression: fill factor direction","expected":{"factor":0.27,"minutes":35,"warning":null},"passed":false},{"actual":{"factor":2.89,"minutes":20,"warning":null},"check":"repair check: fill factor direction","expected":{"factor":0.35,"minutes":20,"warning":null},"passed":false},{"actual":{"factor":1.0,"minutes":20,"warning":null},"check":"generated control 1","expected":{"factor":1.0,"minutes":20,"warning":null},"passed":true},{"actual":{"factor":1.0,"minutes":25,"warning":null},"check":"generated control 2","expected":{"factor":1.0,"minutes":25,"warning":null},"passed":true},{"actual":{"factor":1.0,"minutes":20,"warning":null},"check":"generated control 3","expected":{"factor":1.0,"minutes":20,"warning":null},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"same pan\", \"actual\": {\"factor\": 1.0, \"minutes\": 30, \"warning\": null}, \"expected\": {\"factor\": 1.0, \"minutes\": 30, \"warning\": null}, \"passed\": true}, {\"check\": \"ratio exactly 1.5\", \"actual\": {\"factor\": 1.0, \"minutes\": 40, \"warning\": null}, \"expected\": {\"factor\": 1.0, \"minutes\": 40, \"warning\": null}, \"passed\": true}, {\"check\": \"round to square fill\", \"actual\": {\"factor\": 0.79, \"minutes\": 30, \"warning\": null}, \"expected\": {\"factor\": 1.27, \"minutes\": 30, \"warning\": null}, \"passed\": false}, {\"check\": \"regression: fill factor direction\", \"actual\": {\"factor\": 3.75, \"minutes\": 35, \"warning\": null}, \"expected\": {\"factor\": 0.27, \"minutes\": 35, \"warning\": null}, \"passed\": false}, {\"check\": \"repair check: fill factor direction\", \"actual\": {\"factor\": 2.89, \"minutes\": 20, \"warning\": null}, \"expected\": {\"factor\": 0.35, \"minutes\": 20, \"warning\": null}, \"passed\": false}, {\"check\": \"generated control 1\", \"actual\": {\"factor\": 1.0, \"minutes\": 20, \"warning\": null}, \"expected\": {\"factor\": 1.0, \"minutes\": 20, \"warning\": null}, \"passed\": true}, {\"check\": \"generated control 2\", \"actual\": {\"factor\": 1.0, \"minutes\": 25, \"warning\": null}, \"expected\": {\"factor\": 1.0, \"minutes\": 25, \"warning\": null}, \"passed\": true}, {\"check\": \"generated control 3\", \"actual\": {\"factor\": 1.0, \"minutes\": 20, \"warning\": null}, \"expected\": {\"factor\": 1.0, \"minutes\": 20, \"warning\": null}, \"passed\": true}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}