{"abstract":"After a few frames the budget is exhausted permanently and physics stops.","category":"Physics integrator stability","checks":8,"contract":"solve(frames, dt, max_frame, max_steps): game loop accumulator. Each frame delta is clamped to max_frame and added; run steps while acc >= dt up to max_steps; if a full dt still remains, whole multiples of dt are dropped (spiral-of-death guard). Return [steps per frame, acc/dt after last frame, dropped time].","contract_signature":"frames, dt, max_frame, max_steps","evaluation_group":"w2-physics_integrator_stability-fixed-step-accumulator","failed_approach":"Reporting per-frame differences of a global counter still exhausts the budget across frames.","family":"w2-physics_integrator_stability-fixed-step-accumulator-per-frame-budget-reset","id":"FA-86986","implementations":{"attempt":{"sha256":"6abe02d92a0161ccea4039a8ae4176bac89ef77d4c2f37c65f854bfcfde6867f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(frames, dt, max_frame, max_steps):\n    acc = 0.0\n    dropped = 0.0\n    steps = []\n    n = 0\n    for delta in frames:\n        acc += min(delta, max_frame)\n        while acc >= dt and n < max_steps:\n            acc -= dt\n            n += 1\n        if acc >= dt:\n            keep = acc % dt\n            dropped += acc - keep\n            acc = keep\n        steps.append(n - sum(steps))\n    return [steps, acc / dt, dropped]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[[0.25, 0.25, 0.125, 0.0], 0.03125, 0.125, 2], [[2, 2, 2, 0], 0.0, 0.1875]], [[[0.046875, 0.046875, 0.046875], 0.03125, 0.25, 1], [[1, 1, 1], 0.5, 0.03125]], [[[0.046875, 0.125, 0.0625, 0.0, 0.03125, 0.046875], 0.03125, 0.25, 5], [[1, 4, 2, 0, 1, 2], 0.0, 0.0]], [[[0.625, 0.046875, 0.625], 0.015625, 0.125, 1], [[1, 1, 1], 0.0, 0.25]], [[[0.015625], 0.015625, 0.25, 2], [[1], 0.0, 0.0]], [[[0.0625, 0.046875, 0.015625, 0.125], 0.0625, 0.125, 5], [[1, 0, 1, 2], 0.0, 0.0]], [[[0.0], 0.015625, 0.25, 2], [[0], 0.0, 0.0]], [[[0.0625], 0.03125, 0.25, 3], [[2], 0.0, 0.0]]], [[[[0.015625], 0.015625, 0.25, 2], [[1], 0.0, 0.0]], [[[0.015625, 0.0625, 0.015625, 0.046875, 0.015625, 0.03125], 0.015625, 0.25, 3], [[1, 3, 1, 3, 1, 2], 0.0, 0.015625]], [[[0.0, 0.25], 0.03125, 0.25, 5], [[0, 5], 0.0, 0.09375]], [[[0.0625, 0.03125, 0.015625], 0.0625, 0.25, 3], [[1, 0, 0], 0.75, 0.0]], [[[0.046875, 0.03125, 0.078125, 0.125], 0.03125, 0.125, 4], [[1, 1, 3, 4], 0.0, 0.0]], [[[0.0625, 0.125, 0.015625, 0.125], 0.03125, 0.25, 2], [[2, 2, 0, 2], 0.5, 0.125]], [[[0.078125, 0.125], 0.0625, 0.125, 1], [[1, 1], 0.25, 0.0625]], [[[0.0], 0.015625, 0.25, 2], [[0], 0.0, 0.0]]], [[[[0.0], 0.015625, 0.25, 2], [[0], 0.0, 0.0]], [[[0.015625], 0.015625, 0.25, 2], [[1], 0.0, 0.0]], [[[0.015625, 0.015625, 0.625, 0.078125], 0.03125, 0.125, 4], [[0, 1, 4, 2], 0.5, 0.0]], [[[0.046875, 0.125, 0.0, 0.0], 0.03125, 0.125, 5], [[1, 4, 0, 0], 0.5, 0.0]], [[[0.125, 0.625], 0.015625, 0.25, 5], [[5, 5], 0.0, 0.21875]], [[[0.625, 0.03125, 0.25, 0.625], 0.015625, 0.25, 3], [[3, 2, 3, 3], 0.0, 0.609375]], [[[0.25], 0.0625, 0.25, 4], [[4], 0.0, 0.0]], [[[0.625, 0.0625], 0.015625, 0.25, 2], [[2, 2], 0.0, 0.25]]], [[[[0.078125, 0.125, 0.25, 0.015625, 0.03125, 0.078125], 0.015625, 0.125, 5], [[5, 5, 5, 1, 2, 5], 0.0, 0.09375]], [[[0.078125, 0.015625, 0.046875], 0.015625, 0.25, 2], [[2, 1, 2], 0.0, 0.0625]], [[[0.0], 0.015625, 0.25, 2], [[0], 0.0, 0.0]], [[[0.015625], 0.015625, 0.25, 2], [[1], 0.0, 0.0]], [[[0.015625], 0.015625, 0.25, 5], [[1], 0.0, 0.0]], [[[0.625, 0.125, 0.125], 0.0625, 0.25, 1], [[1, 1, 1], 0.0, 0.3125]], [[[0.03125, 0.25, 0.125, 0.625, 0.125, 0.078125], 0.03125, 0.25, 4], [[1, 4, 4, 4, 4, 2], 0.5, 0.25]], [[[0.078125, 0.078125, 0.625, 0.078125], 0.015625, 0.125, 2], [[2, 2, 2, 2], 0.0, 0.234375]]], [[[[0.078125, 0.015625], 0.015625, 0.125, 5], [[5, 1], 0.0, 0.0]], [[[0.046875, 0.625, 0.0, 0.625, 0.25], 0.015625, 0.25, 4], [[3, 4, 0, 4, 4], 0.0, 0.5625]], [[[0.0], 0.015625, 0.25, 2], [[0], 0.0, 0.0]], [[[0.015625], 0.015625, 0.25, 2], [[1], 0.0, 0.0]], [[[0.0, 0.125, 0.25, 0.25], 0.03125, 0.125, 5], [[0, 4, 4, 4], 0.0, 0.0]], [[[0.015625], 0.0625, 0.25, 3], [[0], 0.25, 0.0]], [[[0.125, 0.625, 0.0, 0.25], 0.0625, 0.125, 4], [[2, 2, 0, 2], 0.0, 0.0]], [[[0.03125, 0.125, 0.03125], 0.03125, 0.125, 3], [[1, 3, 1], 0.0, 0.03125]]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"case %d\" % i, 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":"b68b5a2029455c70b7b46a4f77971c244feb50de9601bb78fb58e04bc43cfd91","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(frames, dt, max_frame, max_steps):\n    acc = 0.0\n    dropped = 0.0\n    steps = []\n    n = 0\n    for delta in frames:\n        acc += min(delta, max_frame)\n        while acc >= dt and n < max_steps:\n            acc -= dt\n            n += 1\n        if acc >= dt:\n            keep = acc % dt\n            dropped += acc - keep\n            acc = keep\n        steps.append(n)\n    return [steps, acc / dt, dropped]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[[0.25, 0.25, 0.125, 0.0], 0.03125, 0.125, 2], [[2, 2, 2, 0], 0.0, 0.1875]], [[[0.046875, 0.046875, 0.046875], 0.03125, 0.25, 1], [[1, 1, 1], 0.5, 0.03125]], [[[0.046875, 0.125, 0.0625, 0.0, 0.03125, 0.046875], 0.03125, 0.25, 5], [[1, 4, 2, 0, 1, 2], 0.0, 0.0]], [[[0.625, 0.046875, 0.625], 0.015625, 0.125, 1], [[1, 1, 1], 0.0, 0.25]], [[[0.015625], 0.015625, 0.25, 2], [[1], 0.0, 0.0]], [[[0.0625, 0.046875, 0.015625, 0.125], 0.0625, 0.125, 5], [[1, 0, 1, 2], 0.0, 0.0]], [[[0.0], 0.015625, 0.25, 2], [[0], 0.0, 0.0]], [[[0.0625], 0.03125, 0.25, 3], [[2], 0.0, 0.0]]], [[[[0.015625], 0.015625, 0.25, 2], [[1], 0.0, 0.0]], [[[0.015625, 0.0625, 0.015625, 0.046875, 0.015625, 0.03125], 0.015625, 0.25, 3], [[1, 3, 1, 3, 1, 2], 0.0, 0.015625]], [[[0.0, 0.25], 0.03125, 0.25, 5], [[0, 5], 0.0, 0.09375]], [[[0.0625, 0.03125, 0.015625], 0.0625, 0.25, 3], [[1, 0, 0], 0.75, 0.0]], [[[0.046875, 0.03125, 0.078125, 0.125], 0.03125, 0.125, 4], [[1, 1, 3, 4], 0.0, 0.0]], [[[0.0625, 0.125, 0.015625, 0.125], 0.03125, 0.25, 2], [[2, 2, 0, 2], 0.5, 0.125]], [[[0.078125, 0.125], 0.0625, 0.125, 1], [[1, 1], 0.25, 0.0625]], [[[0.0], 0.015625, 0.25, 2], [[0], 0.0, 0.0]]], [[[[0.0], 0.015625, 0.25, 2], [[0], 0.0, 0.0]], [[[0.015625], 0.015625, 0.25, 2], [[1], 0.0, 0.0]], [[[0.015625, 0.015625, 0.625, 0.078125], 0.03125, 0.125, 4], [[0, 1, 4, 2], 0.5, 0.0]], [[[0.046875, 0.125, 0.0, 0.0], 0.03125, 0.125, 5], [[1, 4, 0, 0], 0.5, 0.0]], [[[0.125, 0.625], 0.015625, 0.25, 5], [[5, 5], 0.0, 0.21875]], [[[0.625, 0.03125, 0.25, 0.625], 0.015625, 0.25, 3], [[3, 2, 3, 3], 0.0, 0.609375]], [[[0.25], 0.0625, 0.25, 4], [[4], 0.0, 0.0]], [[[0.625, 0.0625], 0.015625, 0.25, 2], [[2, 2], 0.0, 0.25]]], [[[[0.078125, 0.125, 0.25, 0.015625, 0.03125, 0.078125], 0.015625, 0.125, 5], [[5, 5, 5, 1, 2, 5], 0.0, 0.09375]], [[[0.078125, 0.015625, 0.046875], 0.015625, 0.25, 2], [[2, 1, 2], 0.0, 0.0625]], [[[0.0], 0.015625, 0.25, 2], [[0], 0.0, 0.0]], [[[0.015625], 0.015625, 0.25, 2], [[1], 0.0, 0.0]], [[[0.015625], 0.015625, 0.25, 5], [[1], 0.0, 0.0]], [[[0.625, 0.125, 0.125], 0.0625, 0.25, 1], [[1, 1, 1], 0.0, 0.3125]], [[[0.03125, 0.25, 0.125, 0.625, 0.125, 0.078125], 0.03125, 0.25, 4], [[1, 4, 4, 4, 4, 2], 0.5, 0.25]], [[[0.078125, 0.078125, 0.625, 0.078125], 0.015625, 0.125, 2], [[2, 2, 2, 2], 0.0, 0.234375]]], [[[[0.078125, 0.015625], 0.015625, 0.125, 5], [[5, 1], 0.0, 0.0]], [[[0.046875, 0.625, 0.0, 0.625, 0.25], 0.015625, 0.25, 4], [[3, 4, 0, 4, 4], 0.0, 0.5625]], [[[0.0], 0.015625, 0.25, 2], [[0], 0.0, 0.0]], [[[0.015625], 0.015625, 0.25, 2], [[1], 0.0, 0.0]], [[[0.0, 0.125, 0.25, 0.25], 0.03125, 0.125, 5], [[0, 4, 4, 4], 0.0, 0.0]], [[[0.015625], 0.0625, 0.25, 3], [[0], 0.25, 0.0]], [[[0.125, 0.625, 0.0, 0.25], 0.0625, 0.125, 4], [[2, 2, 0, 2], 0.0, 0.0]], [[[0.03125, 0.125, 0.03125], 0.03125, 0.125, 3], [[1, 3, 1], 0.0, 0.03125]]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"case %d\" % i, 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 bounded teaching model with stipulated toy conventions and rounded float output; not a production physics engine or a proof of numerical stability. 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-physics_integrator_stability-fixed-step-accumulator-per-frame-budget-reset","generated_at":"2026-09-29T14:50:54.629047+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Game and robotics physics loops depend on integrator update order, step control and stabilization terms; a wrong decision point turns a stable simulation into drifting or exploding motion.","root_cause":"n is initialised once before the frame loop.","sha256":"fac647258a30b16fd48824cd2e805943af4e3a2df8977e377e1db4d4699594e0","title":"Step budget counter is not reset each frame · 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":39.209,"exit_code":1,"observations":[{"actual":[[2,0,0,0],0.0,0.3125],"check":"case 0","expected":[[2,2,2,0],0.0,0.1875],"passed":false},{"actual":[[1,0,0],0.5,0.09375],"check":"case 1","expected":[[1,1,1],0.5,0.03125],"passed":false},{"actual":[[1,4,0,0,0,0],0.0,0.15625],"check":"case 2","expected":[[1,4,2,0,1,2],0.0,0.0],"passed":false},{"actual":[[1,0,0],0.0,0.28125],"check":"case 3","expected":[[1,1,1],0.0,0.25],"passed":false},{"actual":[[1],0.0,0.0],"check":"case 4","expected":[[1],0.0,0.0],"passed":true},{"actual":[[1,0,1,2],0.0,0.0],"check":"case 5","expected":[[1,0,1,2],0.0,0.0],"passed":true},{"actual":[[0],0.0,0.0],"check":"case 6","expected":[[0],0.0,0.0],"passed":true},{"actual":[[2],0.0,0.0],"check":"case 7","expected":[[2],0.0,0.0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"case 0\", \"actual\": [[2, 0, 0, 0], 0.0, 0.3125], \"expected\": [[2, 2, 2, 0], 0.0, 0.1875], \"passed\": false}, {\"check\": \"case 1\", \"actual\": [[1, 0, 0], 0.5, 0.09375], \"expected\": [[1, 1, 1], 0.5, 0.03125], \"passed\": false}, {\"check\": \"case 2\", \"actual\": [[1, 4, 0, 0, 0, 0], 0.0, 0.15625], \"expected\": [[1, 4, 2, 0, 1, 2], 0.0, 0.0], \"passed\": false}, {\"check\": \"case 3\", \"actual\": [[1, 0, 0], 0.0, 0.28125], \"expected\": [[1, 1, 1], 0.0, 0.25], \"passed\": false}, {\"check\": \"case 4\", \"actual\": [[1], 0.0, 0.0], \"expected\": [[1], 0.0, 0.0], \"passed\": true}, {\"check\": \"case 5\", \"actual\": [[1, 0, 1, 2], 0.0, 0.0], \"expected\": [[1, 0, 1, 2], 0.0, 0.0], \"passed\": true}, {\"check\": \"case 6\", \"actual\": [[0], 0.0, 0.0], \"expected\": [[0], 0.0, 0.0], \"passed\": true}, {\"check\": \"case 7\", \"actual\": [[2], 0.0, 0.0], \"expected\": [[2], 0.0, 0.0], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.196,"exit_code":1,"observations":[{"actual":[[2,2,2,2],0.0,0.3125],"check":"case 0","expected":[[2,2,2,0],0.0,0.1875],"passed":false},{"actual":[[1,1,1],0.5,0.09375],"check":"case 1","expected":[[1,1,1],0.5,0.03125],"passed":false},{"actual":[[1,5,5,5,5,5],0.0,0.15625],"check":"case 2","expected":[[1,4,2,0,1,2],0.0,0.0],"passed":false},{"actual":[[1,1,1],0.0,0.28125],"check":"case 3","expected":[[1,1,1],0.0,0.25],"passed":false},{"actual":[[1],0.0,0.0],"check":"case 4","expected":[[1],0.0,0.0],"passed":true},{"actual":[[1,1,2,4],0.0,0.0],"check":"case 5","expected":[[1,0,1,2],0.0,0.0],"passed":false},{"actual":[[0],0.0,0.0],"check":"case 6","expected":[[0],0.0,0.0],"passed":true},{"actual":[[2],0.0,0.0],"check":"case 7","expected":[[2],0.0,0.0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"case 0\", \"actual\": [[2, 2, 2, 2], 0.0, 0.3125], \"expected\": [[2, 2, 2, 0], 0.0, 0.1875], \"passed\": false}, {\"check\": \"case 1\", \"actual\": [[1, 1, 1], 0.5, 0.09375], \"expected\": [[1, 1, 1], 0.5, 0.03125], \"passed\": false}, {\"check\": \"case 2\", \"actual\": [[1, 5, 5, 5, 5, 5], 0.0, 0.15625], \"expected\": [[1, 4, 2, 0, 1, 2], 0.0, 0.0], \"passed\": false}, {\"check\": \"case 3\", \"actual\": [[1, 1, 1], 0.0, 0.28125], \"expected\": [[1, 1, 1], 0.0, 0.25], \"passed\": false}, {\"check\": \"case 4\", \"actual\": [[1], 0.0, 0.0], \"expected\": [[1], 0.0, 0.0], \"passed\": true}, {\"check\": \"case 5\", \"actual\": [[1, 1, 2, 4], 0.0, 0.0], \"expected\": [[1, 0, 1, 2], 0.0, 0.0], \"passed\": false}, {\"check\": \"case 6\", \"actual\": [[0], 0.0, 0.0], \"expected\": [[0], 0.0, 0.0], \"passed\": true}, {\"check\": \"case 7\", \"actual\": [[2], 0.0, 0.0], \"expected\": [[2], 0.0, 0.0], \"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."}}