{"abstract":"Frames split into several substeps advance simulated time by a multiple of dt.","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":"Dividing by n_sub+1 leaves the frame short of its duration.","family":"w2-physics_integrator_stability-substep-symplectic-euler-substep-length","id":"FA-86861","implementations":{"attempt":{"sha256":"a5b86410ef018a4cc9205e32ff9a20f8c4620c9767105db44b9d153a85af0512","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, math.ceil(dt / 0.05 - 1e-12))\n    h = dt / (n_sub + 1)\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.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[-1.377, 0.559, 2.87, 2.898, 1.015, 0.2, 0], [-1.377, 0.559]], [[-1.603, 0.842, 17.725, 1.501, 1.753, 0.13, 8], [0.763682, -1.657161]], [[-1.013, 1.855, 30.403, 2.18, 1.879, 0.2, 4], [0.749953, -0.924042]], [[-1.958, -0.179, 8.425, 1.714, 0.601, 0.02, 4], [-1.933886, 0.586176]], [[-1.207, -0.911, 29.131, 2.012, 1.076, 0.13, 7], [0.947903, -0.524986]], [[0.74, 0.59, 14.503, 1.723, 1.698, 0.02, 7], [0.748209, -0.324535]], [[0.428, -0.176, 18.564, 2.203, 1.454, 0.07, 2], [0.36285, -0.625106]]], [[[-1.649, 0.086, 31.392, 1.332, 1.338, 0.01, 4], [-1.607327, 1.603607]], [[-0.452, 1.476, 16.398, 1.596, 0.594, 0.02, 3], [-0.354179, 1.70039]], [[1.977, -1.825, 23.244, 1.921, 0.273, 0.2, 11], [-0.250219, -6.198924]], [[-1.526, 0.873, 6.362, 1.828, 1.137, 0.13, 0], [-1.526, 0.873]], [[1.257, -0.388, 13.634, 2.716, 1.36, 0.1, 12], [-0.866531, -0.655162]], [[-1.424, 1.186, 13.033, 1.768, 1.477, 0.01, 9], [-1.276677, 1.974655]], [[0.797, 1.866, 22.936, 2.437, 1.974, 0.07, 10], [0.09425, -2.420966]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]]], [[[0.634, -1.094, 26.057, 2.654, 0.419, 0.1, 3], [0.061963, -2.252004]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[1.379, 0.616, 8.923, 2.136, 0.586, 0.2, 6], [-0.73245, -1.93096]], [[-1.933, -0.041, 34.51, 1.593, 0.382, 0.04, 7], [-0.371615, 8.446595]], [[1.917, -0.356, 37.204, 0.914, 1.124, 0.05, 1], [1.705218, -4.235646]], [[0.784, -0.426, 6.875, 0.731, 0.044, 0.1, 14], [-0.132405, 2.308875]], [[-1.712, -1.9, 9.139, 0.693, 0.61, 0.05, 13], [0.624756, 4.351887]], [[0.116, -1.998, 11.275, 2.342, 1.481, 0.1, 12], [-0.366142, 1.157058]]], [[[1.974, -1.489, 34.073, 1.218, 1.372, 0.05, 10], [-1.429284, -2.634338]], [[-0.35, 0.424, 29.342, 2.686, 0.717, 0.1, 17], [-0.290817, -0.295428]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[1.909, 0.002, 19.499, 0.727, 0.055, 0.07, 1], [1.723198, -3.518566]], [[-0.232, -0.896, 22.107, 2.288, 0.298, 0.05, 13], [-0.138779, 0.957068]], [[0.365, -1.083, 14.951, 2.014, 1.412, 0.1, 6], [-0.316376, -0.70557]], [[1.14, -1.811, 37.1, 2.271, 0.543, 0.1, 3], [-0.098331, -4.928458]], [[-1.139, -1.668, 38.055, 1.696, 0.596, 0.04, 15], [0.910047, 2.799705]]], [[[0.494, 0.825, 29.084, 1.543, 0.219, 0.13, 11], [0.437707, 0.851286]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[1.873, -0.51, 29.384, 1.99, 0.411, 0.2, 16], [1.352031, 0.801221]], [[-1.86, -0.316, 22.084, 0.67, 1.741, 0.04, 12], [0.841343, 2.344066]], [[1.804, -0.317, 3.677, 1.295, 1.017, 0.07, 2], [1.702225, -0.959409]], [[-0.078, -0.863, 3.994, 2.622, 1.462, 0.1, 0], [-0.078, -0.863]], [[0.36, -1.513, 9.018, 1.848, 0.394, 0.05, 8], [-0.288846, -1.518381]], [[0.336, -1.099, 12.993, 2.616, 1.417, 0.05, 19], [-0.440588, -0.012857]]]]\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":"39bb42b3a14a53abc51b0705e6b631680048fc828e0db06a1f172b55c22f270b","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, math.ceil(dt / 0.05 - 1e-12))\n    h = dt\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.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[-1.377, 0.559, 2.87, 2.898, 1.015, 0.2, 0], [-1.377, 0.559]], [[-1.603, 0.842, 17.725, 1.501, 1.753, 0.13, 8], [0.763682, -1.657161]], [[-1.013, 1.855, 30.403, 2.18, 1.879, 0.2, 4], [0.749953, -0.924042]], [[-1.958, -0.179, 8.425, 1.714, 0.601, 0.02, 4], [-1.933886, 0.586176]], [[-1.207, -0.911, 29.131, 2.012, 1.076, 0.13, 7], [0.947903, -0.524986]], [[0.74, 0.59, 14.503, 1.723, 1.698, 0.02, 7], [0.748209, -0.324535]], [[0.428, -0.176, 18.564, 2.203, 1.454, 0.07, 2], [0.36285, -0.625106]]], [[[-1.649, 0.086, 31.392, 1.332, 1.338, 0.01, 4], [-1.607327, 1.603607]], [[-0.452, 1.476, 16.398, 1.596, 0.594, 0.02, 3], [-0.354179, 1.70039]], [[1.977, -1.825, 23.244, 1.921, 0.273, 0.2, 11], [-0.250219, -6.198924]], [[-1.526, 0.873, 6.362, 1.828, 1.137, 0.13, 0], [-1.526, 0.873]], [[1.257, -0.388, 13.634, 2.716, 1.36, 0.1, 12], [-0.866531, -0.655162]], [[-1.424, 1.186, 13.033, 1.768, 1.477, 0.01, 9], [-1.276677, 1.974655]], [[0.797, 1.866, 22.936, 2.437, 1.974, 0.07, 10], [0.09425, -2.420966]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]]], [[[0.634, -1.094, 26.057, 2.654, 0.419, 0.1, 3], [0.061963, -2.252004]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[1.379, 0.616, 8.923, 2.136, 0.586, 0.2, 6], [-0.73245, -1.93096]], [[-1.933, -0.041, 34.51, 1.593, 0.382, 0.04, 7], [-0.371615, 8.446595]], [[1.917, -0.356, 37.204, 0.914, 1.124, 0.05, 1], [1.705218, -4.235646]], [[0.784, -0.426, 6.875, 0.731, 0.044, 0.1, 14], [-0.132405, 2.308875]], [[-1.712, -1.9, 9.139, 0.693, 0.61, 0.05, 13], [0.624756, 4.351887]], [[0.116, -1.998, 11.275, 2.342, 1.481, 0.1, 12], [-0.366142, 1.157058]]], [[[1.974, -1.489, 34.073, 1.218, 1.372, 0.05, 10], [-1.429284, -2.634338]], [[-0.35, 0.424, 29.342, 2.686, 0.717, 0.1, 17], [-0.290817, -0.295428]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[1.909, 0.002, 19.499, 0.727, 0.055, 0.07, 1], [1.723198, -3.518566]], [[-0.232, -0.896, 22.107, 2.288, 0.298, 0.05, 13], [-0.138779, 0.957068]], [[0.365, -1.083, 14.951, 2.014, 1.412, 0.1, 6], [-0.316376, -0.70557]], [[1.14, -1.811, 37.1, 2.271, 0.543, 0.1, 3], [-0.098331, -4.928458]], [[-1.139, -1.668, 38.055, 1.696, 0.596, 0.04, 15], [0.910047, 2.799705]]], [[[0.494, 0.825, 29.084, 1.543, 0.219, 0.13, 11], [0.437707, 0.851286]], [[1.0, 0.0, 10.0, 1.0, 0.0, 0.05, 0], [1.0, 0.0]], [[1.873, -0.51, 29.384, 1.99, 0.411, 0.2, 16], [1.352031, 0.801221]], [[-1.86, -0.316, 22.084, 0.67, 1.741, 0.04, 12], [0.841343, 2.344066]], [[1.804, -0.317, 3.677, 1.295, 1.017, 0.07, 2], [1.702225, -0.959409]], [[-0.078, -0.863, 3.994, 2.622, 1.462, 0.1, 0], [-0.078, -0.863]], [[0.36, -1.513, 9.018, 1.848, 0.394, 0.05, 8], [-0.288846, -1.518381]], [[0.336, -1.099, 12.993, 2.616, 1.417, 0.05, 19], [-0.440588, -0.012857]]]]\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-length","generated_at":"2026-09-29T14:50:53.461783+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 length h is set to dt instead of dt/n_sub.","sha256":"51f1c9ab6c922173d0a1f6705f09165223eecf0ed09353290298fec2d0aa8d11","title":"Every substep advances by the whole frame length · 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":42.974,"exit_code":1,"observations":[{"actual":[1.0,0.0],"check":"case 0","expected":[1.0,0.0],"passed":true},{"actual":[-1.377,0.559],"check":"case 1","expected":[-1.377,0.559],"passed":true},{"actual":[0.912076,1.122804],"check":"case 2","expected":[0.763682,-1.657161],"passed":false},{"actual":[0.791137,0.902664],"check":"case 3","expected":[0.749953,-0.924042],"passed":false},{"actual":[-1.955505,0.206504],"check":"case 4","expected":[-1.933886,0.586176],"passed":false},{"actual":[0.756622,2.629225],"check":"case 5","expected":[0.947903,-0.524986],"passed":false},{"actual":[0.762399,0.120043],"check":"case 6","expected":[0.748209,-0.324535],"passed":false},{"actual":[0.393175,-0.485882],"check":"case 7","expected":[0.36285,-0.625106],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"case 0\", \"actual\": [1.0, 0.0], \"expected\": [1.0, 0.0], \"passed\": true}, {\"check\": \"case 1\", \"actual\": [-1.377, 0.559], \"expected\": [-1.377, 0.559], \"passed\": true}, {\"check\": \"case 2\", \"actual\": [0.912076, 1.122804], \"expected\": [0.763682, -1.657161], \"passed\": false}, {\"check\": \"case 3\", \"actual\": [0.791137, 0.902664], \"expected\": [0.749953, -0.924042], \"passed\": false}, {\"check\": \"case 4\", \"actual\": [-1.955505, 0.206504], \"expected\": [-1.933886, 0.586176], \"passed\": false}, {\"check\": \"case 5\", \"actual\": [0.756622, 2.629225], \"expected\": [0.947903, -0.524986], \"passed\": false}, {\"check\": \"case 6\", \"actual\": [0.762399, 0.120043], \"expected\": [0.748209, -0.324535], \"passed\": false}, {\"check\": \"case 7\", \"actual\": [0.393175, -0.485882], \"expected\": [0.36285, -0.625106], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.935,"exit_code":1,"observations":[{"actual":[1.0,0.0],"check":"case 0","expected":[1.0,0.0],"passed":true},{"actual":[-1.377,0.559],"check":"case 1","expected":[-1.377,0.559],"passed":true},{"actual":[-0.065958,-0.821698],"check":"case 2","expected":[0.763682,-1.657161],"passed":false},{"actual":[-0.183218,0.621084],"check":"case 3","expected":[0.749953,-0.924042],"passed":false},{"actual":[-1.933886,0.586176],"check":"case 4","expected":[-1.933886,0.586176],"passed":true},{"actual":[0.188727,-1.934185],"check":"case 5","expected":[0.947903,-0.524986],"passed":false},{"actual":[0.748209,-0.324535],"check":"case 6","expected":[0.748209,-0.324535],"passed":true},{"actual":[0.230263,-0.95298],"check":"case 7","expected":[0.36285,-0.625106],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"case 0\", \"actual\": [1.0, 0.0], \"expected\": [1.0, 0.0], \"passed\": true}, {\"check\": \"case 1\", \"actual\": [-1.377, 0.559], \"expected\": [-1.377, 0.559], \"passed\": true}, {\"check\": \"case 2\", \"actual\": [-0.065958, -0.821698], \"expected\": [0.763682, -1.657161], \"passed\": false}, {\"check\": \"case 3\", \"actual\": [-0.183218, 0.621084], \"expected\": [0.749953, -0.924042], \"passed\": false}, {\"check\": \"case 4\", \"actual\": [-1.933886, 0.586176], \"expected\": [-1.933886, 0.586176], \"passed\": true}, {\"check\": \"case 5\", \"actual\": [0.188727, -1.934185], \"expected\": [0.947903, -0.524986], \"passed\": false}, {\"check\": \"case 6\", \"actual\": [0.748209, -0.324535], \"expected\": [0.748209, -0.324535], \"passed\": true}, {\"check\": \"case 7\", \"actual\": [0.230263, -0.95298], \"expected\": [0.36285, -0.625106], \"passed\": false}], \"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."}}