{"abstract":"Oscillatory systems report too much amplification and are flagged unstable early.","category":"Physics integrator stability","checks":8,"contract":"solve(k, m, c, dt): classify explicit Euler on x'=v, v'=(-k*x-c*v)/m. Eigenvalues are the roots of s^2+(c/m)s+k/m; amplification is max |1+dt*lambda|. Return [\"marginal\" if |amp-1|<=1e-9, else \"stable\" if amp<1, else \"unstable\", amp rounded to 6].","contract_signature":"k, m, c, dt","evaluation_group":"w2-physics_integrator_stability-explicit-euler-stability","failed_approach":"Moving the halving to the real part instead leaves the damping rate wrong.","family":"w2-physics_integrator_stability-explicit-euler-stability-complex-root-imaginary-part","id":"FA-86916","implementations":{"attempt":{"sha256":"0073a40991c281594fb0dd2dd0575c2b656c34f2c260fdb824d3b71f98a6f5d3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(k, m, c, dt):\n    a = c / m\n    b = k / m\n    disc = a * a - 4 * b\n    if disc >= 0:\n        r = math.sqrt(disc)\n        lams = [complex((-a + r) / 2, 0), complex((-a - r) / 2, 0)]\n    else:\n        r = math.sqrt(-disc)\n        lams = [complex(-a, r / 2), complex(-a, -r / 2)]\n    amp = max(abs(1 + dt * lam) for lam in lams)\n    if abs(amp - 1) <= 1e-9:\n        label = 'marginal'\n    elif amp < 1:\n        label = 'stable'\n    else:\n        label = 'unstable'\n    return [label, round(amp, 6)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[0.0, 1.0, 2.0008, 1.0], ['unstable', 1.0008]], [[33.665, 3.374, 3.698, 0.05], ['stable', 0.984958]], [[17.863, 3.409, 0.738, 0.4], ['unstable', 1.323555]], [[15.545, 2.583, 6.586, 1.0], ['unstable', 2.11387]], [[46.563, 1.397, 1.187, 0.01], ['stable', 0.997415]], [[39.672, 0.379, 2.933, 1.0], ['unstable', 9.896296]], [[0.0, 3.87, 4.121, 1.0], ['marginal', 1.0]], [[0.0, 1.0, 1.0, 0.5], ['marginal', 1.0]]], [[[23.283, 2.64, 7.844, 0.1], ['stable', 0.889422]], [[24.43, 0.273, 3.575, 0.1], ['stable', 0.76508]], [[0.0, 1.0, 2.0008, 1.0], ['unstable', 1.0008]], [[0.0, 1.0, 1.0, 0.5], ['marginal', 1.0]], [[8.452, 3.883, 5.856, 0.4], ['stable', 0.863147]], [[47.405, 3.962, 4.696, 0.05], ['stable', 0.985215]], [[0.0, 3.884, 4.78, 0.2], ['marginal', 1.0]], [[56.015, 2.524, 6.052, 1.0], ['unstable', 4.560172]]], [[[15.636, 2.616, 6.979, 0.8], ['unstable', 1.640448]], [[0.0, 1.0, 2.0008, 1.0], ['unstable', 1.0008]], [[8.52, 3.836, 5.13, 0.4], ['stable', 0.90578]], [[29.423, 0.607, 3.273, 0.1], ['stable', 0.972378]], [[0.0, 3.996, 2.36, 1.0], ['marginal', 1.0]], [[0.0, 1.0, 1.0, 0.5], ['marginal', 1.0]], [[18.776, 1.514, 0.866, 0.01], ['stable', 0.997758]], [[17.34, 2.005, 4.299, 0.01], ['stable', 0.989658]]], [[[9.079, 3.699, 5.728, 0.05], ['stable', 0.963696]], [[15.373, 0.488, 0.687, 0.8], ['unstable', 4.476057]], [[0.0, 0.88, 2.713, 0.01], ['marginal', 1.0]], [[29.305, 3.778, 6.728, 0.2], ['stable', 0.976782]], [[41.131, 0.314, 6.187, 0.4], ['unstable', 3.751925]], [[3.996, 2.055, 0.915, 0.05], ['stable', 0.991261]], [[0.0, 1.0, 1.0, 0.5], ['marginal', 1.0]], [[0.0, 1.0, 2.0008, 1.0], ['unstable', 1.0008]]], [[[49.306, 2.663, 2.331, 0.2], ['unstable', 1.251216]], [[58.722, 3.822, 5.191, 0.8], ['unstable', 3.121945]], [[0.0, 1.0, 1.0, 0.5], ['marginal', 1.0]], [[0.0, 1.689, 5.168, 0.01], ['marginal', 1.0]], [[39.004, 1.806, 2.569, 0.01], ['stable', 0.993949]], [[0.0, 1.0, 2.0008, 1.0], ['unstable', 1.0008]], [[36.246, 3.029, 2.637, 0.2], ['unstable', 1.142163]], [[13.954, 1.677, 2.862, 1.0], ['unstable', 2.759383]]]]\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":"b309332c62cdeb96d263ec73559eda598bb19ad9b6dc16db4856fdcfe10f9fcc","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(k, m, c, dt):\n    a = c / m\n    b = k / m\n    disc = a * a - 4 * b\n    if disc >= 0:\n        r = math.sqrt(disc)\n        lams = [complex((-a + r) / 2, 0), complex((-a - r) / 2, 0)]\n    else:\n        r = math.sqrt(-disc)\n        lams = [complex(-a / 2, r), complex(-a / 2, -r)]\n    amp = max(abs(1 + dt * lam) for lam in lams)\n    if abs(amp - 1) <= 1e-9:\n        label = 'marginal'\n    elif amp < 1:\n        label = 'stable'\n    else:\n        label = 'unstable'\n    return [label, round(amp, 6)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[0.0, 1.0, 2.0008, 1.0], ['unstable', 1.0008]], [[33.665, 3.374, 3.698, 0.05], ['stable', 0.984958]], [[17.863, 3.409, 0.738, 0.4], ['unstable', 1.323555]], [[15.545, 2.583, 6.586, 1.0], ['unstable', 2.11387]], [[46.563, 1.397, 1.187, 0.01], ['stable', 0.997415]], [[39.672, 0.379, 2.933, 1.0], ['unstable', 9.896296]], [[0.0, 3.87, 4.121, 1.0], ['marginal', 1.0]], [[0.0, 1.0, 1.0, 0.5], ['marginal', 1.0]]], [[[23.283, 2.64, 7.844, 0.1], ['stable', 0.889422]], [[24.43, 0.273, 3.575, 0.1], ['stable', 0.76508]], [[0.0, 1.0, 2.0008, 1.0], ['unstable', 1.0008]], [[0.0, 1.0, 1.0, 0.5], ['marginal', 1.0]], [[8.452, 3.883, 5.856, 0.4], ['stable', 0.863147]], [[47.405, 3.962, 4.696, 0.05], ['stable', 0.985215]], [[0.0, 3.884, 4.78, 0.2], ['marginal', 1.0]], [[56.015, 2.524, 6.052, 1.0], ['unstable', 4.560172]]], [[[15.636, 2.616, 6.979, 0.8], ['unstable', 1.640448]], [[0.0, 1.0, 2.0008, 1.0], ['unstable', 1.0008]], [[8.52, 3.836, 5.13, 0.4], ['stable', 0.90578]], [[29.423, 0.607, 3.273, 0.1], ['stable', 0.972378]], [[0.0, 3.996, 2.36, 1.0], ['marginal', 1.0]], [[0.0, 1.0, 1.0, 0.5], ['marginal', 1.0]], [[18.776, 1.514, 0.866, 0.01], ['stable', 0.997758]], [[17.34, 2.005, 4.299, 0.01], ['stable', 0.989658]]], [[[9.079, 3.699, 5.728, 0.05], ['stable', 0.963696]], [[15.373, 0.488, 0.687, 0.8], ['unstable', 4.476057]], [[0.0, 0.88, 2.713, 0.01], ['marginal', 1.0]], [[29.305, 3.778, 6.728, 0.2], ['stable', 0.976782]], [[41.131, 0.314, 6.187, 0.4], ['unstable', 3.751925]], [[3.996, 2.055, 0.915, 0.05], ['stable', 0.991261]], [[0.0, 1.0, 1.0, 0.5], ['marginal', 1.0]], [[0.0, 1.0, 2.0008, 1.0], ['unstable', 1.0008]]], [[[49.306, 2.663, 2.331, 0.2], ['unstable', 1.251216]], [[58.722, 3.822, 5.191, 0.8], ['unstable', 3.121945]], [[0.0, 1.0, 1.0, 0.5], ['marginal', 1.0]], [[0.0, 1.689, 5.168, 0.01], ['marginal', 1.0]], [[39.004, 1.806, 2.569, 0.01], ['stable', 0.993949]], [[0.0, 1.0, 2.0008, 1.0], ['unstable', 1.0008]], [[36.246, 3.029, 2.637, 0.2], ['unstable', 1.142163]], [[13.954, 1.677, 2.862, 1.0], ['unstable', 2.759383]]]]\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-explicit-euler-stability-complex-root-imaginary-part","generated_at":"2026-09-29T14:50:53.992108+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 complex branch forgets to halve sqrt(-disc).","sha256":"dea23e9e6aac68597ecced9247ff0bf986b677797f7a6780e53523b70c0869b6","title":"Underdamped eigenvalues use twice the imaginary part · 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.343,"exit_code":1,"observations":[{"actual":["unstable",1.0008],"check":"case 0","expected":["unstable",1.0008],"passed":true},{"actual":["stable",0.957911],"check":"case 1","expected":["stable",0.984958],"passed":false},{"actual":["unstable",1.292605],"check":"case 2","expected":["unstable",1.323555],"passed":false},{"actual":["unstable",2.606648],"check":"case 3","expected":["unstable",2.11387],"passed":false},{"actual":["stable",0.993174],"check":"case 4","expected":["stable",0.997415],"passed":false},{"actual":["unstable",11.623876],"check":"case 5","expected":["unstable",9.896296],"passed":false},{"actual":["marginal",1.0],"check":"case 6","expected":["marginal",1.0],"passed":true},{"actual":["marginal",1.0],"check":"case 7","expected":["marginal",1.0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"case 0\", \"actual\": [\"unstable\", 1.0008], \"expected\": [\"unstable\", 1.0008], \"passed\": true}, {\"check\": \"case 1\", \"actual\": [\"stable\", 0.957911], \"expected\": [\"stable\", 0.984958], \"passed\": false}, {\"check\": \"case 2\", \"actual\": [\"unstable\", 1.292605], \"expected\": [\"unstable\", 1.323555], \"passed\": false}, {\"check\": \"case 3\", \"actual\": [\"unstable\", 2.606648], \"expected\": [\"unstable\", 2.11387], \"passed\": false}, {\"check\": \"case 4\", \"actual\": [\"stable\", 0.993174], \"expected\": [\"stable\", 0.997415], \"passed\": false}, {\"check\": \"case 5\", \"actual\": [\"unstable\", 11.623876], \"expected\": [\"unstable\", 9.896296], \"passed\": false}, {\"check\": \"case 6\", \"actual\": [\"marginal\", 1.0], \"expected\": [\"marginal\", 1.0], \"passed\": true}, {\"check\": \"case 7\", \"actual\": [\"marginal\", 1.0], \"expected\": [\"marginal\", 1.0], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.043,"exit_code":1,"observations":[{"actual":["unstable",1.0008],"check":"case 0","expected":["unstable",1.0008],"passed":true},{"actual":["unstable",1.021139],"check":"case 1","expected":["stable",0.984958],"passed":false},{"actual":["unstable",2.064304],"check":"case 2","expected":["unstable",1.323555],"passed":false},{"actual":["unstable",4.200848],"check":"case 3","expected":["unstable",2.11387],"passed":false},{"actual":["unstable",1.002388],"check":"case 4","expected":["stable",0.997415],"passed":false},{"actual":["unstable",19.158456],"check":"case 5","expected":["unstable",9.896296],"passed":false},{"actual":["marginal",1.0],"check":"case 6","expected":["marginal",1.0],"passed":true},{"actual":["marginal",1.0],"check":"case 7","expected":["marginal",1.0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"case 0\", \"actual\": [\"unstable\", 1.0008], \"expected\": [\"unstable\", 1.0008], \"passed\": true}, {\"check\": \"case 1\", \"actual\": [\"unstable\", 1.021139], \"expected\": [\"stable\", 0.984958], \"passed\": false}, {\"check\": \"case 2\", \"actual\": [\"unstable\", 2.064304], \"expected\": [\"unstable\", 1.323555], \"passed\": false}, {\"check\": \"case 3\", \"actual\": [\"unstable\", 4.200848], \"expected\": [\"unstable\", 2.11387], \"passed\": false}, {\"check\": \"case 4\", \"actual\": [\"unstable\", 1.002388], \"expected\": [\"stable\", 0.997415], \"passed\": false}, {\"check\": \"case 5\", \"actual\": [\"unstable\", 19.158456], \"expected\": [\"unstable\", 9.896296], \"passed\": false}, {\"check\": \"case 6\", \"actual\": [\"marginal\", 1.0], \"expected\": [\"marginal\", 1.0], \"passed\": true}, {\"check\": \"case 7\", \"actual\": [\"marginal\", 1.0], \"expected\": [\"marginal\", 1.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."}}