{"abstract":"Frames slightly longer than the 0.05 limit run one oversized substep and lose stability margin.","category":"Physics integrator stability","checks":8,"contract":"solve(x0, v0, k, m, c, dt, steps): damped spring a=(-k*x-c*v)/m integrated with semi-implicit Euler (velocity first, then position with the new velocity). Each frame of length dt is split into ceil(dt/0.05) equal substeps (at least one). Return [x, v] rounded to 6 decimals after steps frames.","contract_signature":"x0, v0, k, m, c, dt, steps","evaluation_group":"w2-physics_integrator_stability-substep-symplectic-euler","failed_approach":"round() still produces too few substeps for ratios with fractional part below one half.","family":"w2-physics_integrator_stability-substep-symplectic-euler-substep-count-rounding","id":"FA-86856","implementations":{"attempt":{"sha256":"805db227b27e1f40d8d05ad23f35adace55d0b2c0e784d02825faf2dddd30f21","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x0, v0, k, m, c, dt, steps):\n    n_sub = max(1, round(dt / 0.05))\n    h = dt / n_sub\n    x, v = x0, v0\n    for _ in range(steps):\n        for _ in range(n_sub):\n            a = (-k * x - c * v) / m\n            v = v + a * h\n            x = x + v * h\n    return [round(x, 6), round(v, 6)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[-1.539, -1.291, 32.554, 2.072, 1.066, 0.07, 3], [-1.199771, 3.497044]], [[-1.603, 0.842, 17.725, 1.501, 1.753, 0.13, 8], [0.763682, -1.657161]], [[-0.104, -1.626, 5.159, 2.304, 0.637, 0.2, 0], [-0.104, -1.626]], [[1.295, 1.487, 26.631, 0.848, 0.944, 0.07, 2], [1.013808, -3.889523]], [[0.428, -0.176, 18.564, 2.203, 1.454, 0.07, 2], [0.36285, -0.625106]], [[1.083, 0.787, 2.365, 2.971, 0.937, 0.13, 0], [1.083, 0.787]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[0.0, 1.0, 4.0, 2.0, 0.5, 0.1, 3], [0.278786, 0.856518]]], [[[-1.643, 1.58, 13.795, 1.143, 0.679, 0.13, 8], [0.915666, -2.988323]], [[0.0, 1.0, 4.0, 2.0, 0.5, 0.1, 3], [0.278786, 0.856518]], [[1.925, -0.173, 39.051, 1.209, 0.422, 0.01, 5], [1.824415, -3.211948]], [[1.023, -1.573, 6.771, 1.338, 0.17, 0.07, 1], [0.895005, -1.909789]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[0.394, -0.949, 26.39, 2.243, 1.907, 0.13, 4], [-0.264175, -0.874209]], [[-0.479, 1.886, 38.122, 2.825, 1.885, 0.07, 7], [0.501848, 1.056904]], [[0.193, -0.706, 30.766, 2.826, 1.227, 0.07, 7], [-0.197706, -0.539247]]], [[[0.0, 1.0, 4.0, 2.0, 0.5, 0.1, 3], [0.278786, 0.856518]], [[0.236, -1.957, 4.07, 0.843, 0.292, 0.07, 2], [-0.039504, -1.950963]], [[1.111, 1.678, 35.58, 2.166, 0.299, 0.13, 8], [-0.758409, 2.897396]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[0.784, -0.426, 6.875, 0.731, 0.044, 0.1, 14], [-0.132405, 2.308875]], [[1.207, 0.351, 14.617, 2.861, 0.895, 0.07, 6], [0.802339, -1.906391]], [[1.233, -0.932, 9.854, 1.176, 1.509, 0.07, 12], [-0.56207, -0.986805]], [[-0.948, -1.497, 32.937, 1.389, 1.23, 0.07, 1], [-0.965534, 0.162831]]], [[[1.142, -1.241, 14.348, 1.124, 0.842, 0.07, 7], [-0.412514, -3.148043]], [[1.948, 0.758, 13.319, 0.711, 1.638, 0.04, 18], [-0.799165, -0.570716]], [[0.0, 1.0, 4.0, 2.0, 0.5, 0.1, 3], [0.278786, 0.856518]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[-1.413, 0.664, 29.552, 2.975, 1.21, 0.13, 8], [1.104015, -1.060714]], [[-0.582, -1.279, 4.833, 1.259, 1.426, 0.07, 3], [-0.756223, -0.513119]], [[0.76, 1.611, 15.529, 0.686, 0.511, 0.07, 14], [-0.242783, 2.493606]], [[0.603, 1.49, 19.896, 2.846, 1.502, 0.13, 17], [0.167924, 1.139939]]], [[[0.0, 1.0, 4.0, 2.0, 0.5, 0.1, 3], [0.278786, 0.856518]], [[-1.52, 1.198, 3.369, 2.689, 0.928, 0.07, 7], [-0.783494, 1.684604]], [[-0.056, -1.079, 26.249, 1.108, 0.441, 0.07, 8], [-0.030782, 0.966174]], [[-0.776, -0.717, 22.209, 2.822, 1.702, 0.02, 2], [-0.796827, -0.455152]], [[1.804, -0.317, 3.677, 1.295, 1.017, 0.07, 2], [1.702225, -0.959409]], [[-0.899, -1.934, 21.325, 1.527, 1.945, 0.13, 14], [-0.325493, 0.039791]], [[1.555, 1.049, 16.793, 1.993, 1.386, 0.13, 19], [0.552851, -1.240845]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]]]]\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":"66d22848d800ca0f4b8736baf3cb7c6cd40041ebf0e6d6817490bf4b94330cd7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x0, v0, k, m, c, dt, steps):\n    n_sub = max(1, int(dt / 0.05))\n    h = dt / n_sub\n    x, v = x0, v0\n    for _ in range(steps):\n        for _ in range(n_sub):\n            a = (-k * x - c * v) / m\n            v = v + a * h\n            x = x + v * h\n    return [round(x, 6), round(v, 6)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[-1.539, -1.291, 32.554, 2.072, 1.066, 0.07, 3], [-1.199771, 3.497044]], [[-1.603, 0.842, 17.725, 1.501, 1.753, 0.13, 8], [0.763682, -1.657161]], [[-0.104, -1.626, 5.159, 2.304, 0.637, 0.2, 0], [-0.104, -1.626]], [[1.295, 1.487, 26.631, 0.848, 0.944, 0.07, 2], [1.013808, -3.889523]], [[0.428, -0.176, 18.564, 2.203, 1.454, 0.07, 2], [0.36285, -0.625106]], [[1.083, 0.787, 2.365, 2.971, 0.937, 0.13, 0], [1.083, 0.787]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[0.0, 1.0, 4.0, 2.0, 0.5, 0.1, 3], [0.278786, 0.856518]]], [[[-1.643, 1.58, 13.795, 1.143, 0.679, 0.13, 8], [0.915666, -2.988323]], [[0.0, 1.0, 4.0, 2.0, 0.5, 0.1, 3], [0.278786, 0.856518]], [[1.925, -0.173, 39.051, 1.209, 0.422, 0.01, 5], [1.824415, -3.211948]], [[1.023, -1.573, 6.771, 1.338, 0.17, 0.07, 1], [0.895005, -1.909789]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[0.394, -0.949, 26.39, 2.243, 1.907, 0.13, 4], [-0.264175, -0.874209]], [[-0.479, 1.886, 38.122, 2.825, 1.885, 0.07, 7], [0.501848, 1.056904]], [[0.193, -0.706, 30.766, 2.826, 1.227, 0.07, 7], [-0.197706, -0.539247]]], [[[0.0, 1.0, 4.0, 2.0, 0.5, 0.1, 3], [0.278786, 0.856518]], [[0.236, -1.957, 4.07, 0.843, 0.292, 0.07, 2], [-0.039504, -1.950963]], [[1.111, 1.678, 35.58, 2.166, 0.299, 0.13, 8], [-0.758409, 2.897396]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[0.784, -0.426, 6.875, 0.731, 0.044, 0.1, 14], [-0.132405, 2.308875]], [[1.207, 0.351, 14.617, 2.861, 0.895, 0.07, 6], [0.802339, -1.906391]], [[1.233, -0.932, 9.854, 1.176, 1.509, 0.07, 12], [-0.56207, -0.986805]], [[-0.948, -1.497, 32.937, 1.389, 1.23, 0.07, 1], [-0.965534, 0.162831]]], [[[1.142, -1.241, 14.348, 1.124, 0.842, 0.07, 7], [-0.412514, -3.148043]], [[1.948, 0.758, 13.319, 0.711, 1.638, 0.04, 18], [-0.799165, -0.570716]], [[0.0, 1.0, 4.0, 2.0, 0.5, 0.1, 3], [0.278786, 0.856518]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[-1.413, 0.664, 29.552, 2.975, 1.21, 0.13, 8], [1.104015, -1.060714]], [[-0.582, -1.279, 4.833, 1.259, 1.426, 0.07, 3], [-0.756223, -0.513119]], [[0.76, 1.611, 15.529, 0.686, 0.511, 0.07, 14], [-0.242783, 2.493606]], [[0.603, 1.49, 19.896, 2.846, 1.502, 0.13, 17], [0.167924, 1.139939]]], [[[0.0, 1.0, 4.0, 2.0, 0.5, 0.1, 3], [0.278786, 0.856518]], [[-1.52, 1.198, 3.369, 2.689, 0.928, 0.07, 7], [-0.783494, 1.684604]], [[-0.056, -1.079, 26.249, 1.108, 0.441, 0.07, 8], [-0.030782, 0.966174]], [[-0.776, -0.717, 22.209, 2.822, 1.702, 0.02, 2], [-0.796827, -0.455152]], [[1.804, -0.317, 3.677, 1.295, 1.017, 0.07, 2], [1.702225, -0.959409]], [[-0.899, -1.934, 21.325, 1.527, 1.945, 0.13, 14], [-0.325493, 0.039791]], [[1.555, 1.049, 16.793, 1.993, 1.386, 0.13, 19], [0.552851, -1.240845]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]]]]\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-substep-symplectic-euler-substep-count-rounding","generated_at":"2026-09-29T14:50:53.448230+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":"The substep count uses int(dt/0.05), flooring 0.07 to one substep of 0.07.","sha256":"c516ca7042e12a73fabd3bcb34d0f63329cae0ab04391d98a2ccf4eb3f2aa550","title":"Substep count truncates the frame to cell size ratio · 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":40.324,"exit_code":1,"observations":[{"actual":[-1.115495,3.511956],"check":"case 0","expected":[-1.199771,3.497044],"passed":false},{"actual":[0.763682,-1.657161],"check":"case 1","expected":[0.763682,-1.657161],"passed":true},{"actual":[-0.104,-1.626],"check":"case 2","expected":[-0.104,-1.626],"passed":true},{"actual":[0.913071,-3.980432],"check":"case 3","expected":[1.013808,-3.889523],"passed":false},{"actual":[0.354055,-0.636021],"check":"case 4","expected":[0.36285,-0.625106],"passed":false},{"actual":[1.083,0.787],"check":"case 5","expected":[1.083,0.787],"passed":true},{"actual":[1.0,0.0],"check":"case 6","expected":[1.0,0.0],"passed":true},{"actual":[0.278786,0.856518],"check":"case 7","expected":[0.278786,0.856518],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"case 0\", \"actual\": [-1.115495, 3.511956], \"expected\": [-1.199771, 3.497044], \"passed\": false}, {\"check\": \"case 1\", \"actual\": [0.763682, -1.657161], \"expected\": [0.763682, -1.657161], \"passed\": true}, {\"check\": \"case 2\", \"actual\": [-0.104, -1.626], \"expected\": [-0.104, -1.626], \"passed\": true}, {\"check\": \"case 3\", \"actual\": [0.913071, -3.980432], \"expected\": [1.013808, -3.889523], \"passed\": false}, {\"check\": \"case 4\", \"actual\": [0.354055, -0.636021], \"expected\": [0.36285, -0.625106], \"passed\": false}, {\"check\": \"case 5\", \"actual\": [1.083, 0.787], \"expected\": [1.083, 0.787], \"passed\": true}, {\"check\": \"case 6\", \"actual\": [1.0, 0.0], \"expected\": [1.0, 0.0], \"passed\": true}, {\"check\": \"case 7\", \"actual\": [0.278786, 0.856518], \"expected\": [0.278786, 0.856518], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.747,"exit_code":1,"observations":[{"actual":[-1.115495,3.511956],"check":"case 0","expected":[-1.199771,3.497044],"passed":false},{"actual":[0.732855,-1.734106],"check":"case 1","expected":[0.763682,-1.657161],"passed":false},{"actual":[-0.104,-1.626],"check":"case 2","expected":[-0.104,-1.626],"passed":true},{"actual":[0.913071,-3.980432],"check":"case 3","expected":[1.013808,-3.889523],"passed":false},{"actual":[0.354055,-0.636021],"check":"case 4","expected":[0.36285,-0.625106],"passed":false},{"actual":[1.083,0.787],"check":"case 5","expected":[1.083,0.787],"passed":true},{"actual":[1.0,0.0],"check":"case 6","expected":[1.0,0.0],"passed":true},{"actual":[0.278786,0.856518],"check":"case 7","expected":[0.278786,0.856518],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"case 0\", \"actual\": [-1.115495, 3.511956], \"expected\": [-1.199771, 3.497044], \"passed\": false}, {\"check\": \"case 1\", \"actual\": [0.732855, -1.734106], \"expected\": [0.763682, -1.657161], \"passed\": false}, {\"check\": \"case 2\", \"actual\": [-0.104, -1.626], \"expected\": [-0.104, -1.626], \"passed\": true}, {\"check\": \"case 3\", \"actual\": [0.913071, -3.980432], \"expected\": [1.013808, -3.889523], \"passed\": false}, {\"check\": \"case 4\", \"actual\": [0.354055, -0.636021], \"expected\": [0.36285, -0.625106], \"passed\": false}, {\"check\": \"case 5\", \"actual\": [1.083, 0.787], \"expected\": [1.083, 0.787], \"passed\": true}, {\"check\": \"case 6\", \"actual\": [1.0, 0.0], \"expected\": [1.0, 0.0], \"passed\": true}, {\"check\": \"case 7\", \"actual\": [0.278786, 0.856518], \"expected\": [0.278786, 0.856518], \"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."}}