{"abstract":"The error estimate refers to Heun but the state follows Euler, so accuracy is worse than tol suggests.","category":"Physics integrator stability","checks":8,"contract":"solve(y0, lam, s, t_end, dt0, tol): integrate y'=-lam*y+s to t_end with the embedded Euler/Heun pair. err=|y_heun-y_euler|/max(1,|y|) at the step start. Accept if err<=tol (propagate Heun); grow h by min(2, 0.9*(tol/err)^(1/2)) (2 when err=0); on reject shrink by max(0.2, 0.9*(tol/err)^(1/2)). Steps are clipped to t_end; at most 500 attempts. Return [y, accepted, rejected, last h] rounded.","contract_signature":"y0, lam, s, t_end, dt0, tol","evaluation_group":"w2-physics_integrator_stability-adaptive-heun-euler","failed_approach":"Averaging the two solutions is a different, unestimated scheme.","family":"w2-physics_integrator_stability-adaptive-heun-euler-propagated-solution","id":"FA-87041","implementations":{"attempt":{"sha256":"2e08b63a983ab5785cbedea4ab7a718e7d4570c675fdb9a43e036728fd6de399","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(y0, lam, s, t_end, dt0, tol):\n    def f(y):\n        return -lam * y + s\n    t, y, h = 0.0, y0, dt0\n    acc = rej = 0\n    while t < t_end - 1e-12 and acc + rej < 500:\n        h = min(h, t_end - t)\n        k1 = f(y)\n        k2 = f(y + h * k1)\n        y_low = y + h * k1\n        y_high = y + h / 2 * (k1 + k2)\n        err = abs(y_high - y_low) / max(1.0, abs(y))\n        if err <= tol:\n            t += h\n            y = (y_low + y_high) / 2\n            acc += 1\n            grow = 2.0 if err == 0 else min(2.0, 0.9 * (tol / err) ** 0.5)\n            h = h * grow\n        else:\n            rej += 1\n            h = h * max(0.2, 0.9 * (tol / err) ** 0.5)\n    return [round(y, 6), acc, rej, round(h, 6)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[1.277, 4.761, -1.617, 0.5, 0.1, 0.0001], [-0.190065, 140, 3, 0.006855]], [[1.689, 0.0, 0.476, 0.5, 0.3, 0.001], [1.927, 2, 0, 0.4]], [[-2.45, 3.377, -1.852, 2.0, 0.05, 0.01], [-0.552205, 23, 1, 0.101538]], [[2.009, 1.907, -1.617, 0.5, 0.3, 0.01], [0.255071, 10, 1, 0.029016]], [[-0.514, 2.551, -1.015, 1.0, 0.05, 0.01], [-0.408549, 7, 0, 0.073483]], [[1.301, 0.0, 1.346, 0.5, 0.1, 0.0001], [1.974, 3, 0, 0.4]], [[-0.603, 0.0, 1.691, 2.0, 0.1, 0.0001], [2.779, 5, 0, 1.0]], [[-0.952, 1.695, -1.777, 2.0, 0.3, 0.01], [-1.043824, 6, 1, 0.806875]]], [[[-0.876, 0.0, -0.17, 0.5, 0.05, 0.0001], [-0.961, 4, 0, 0.3]], [[-1.169, 4.728, 0.065, 1.0, 0.3, 0.0001], [0.003263, 158, 3, 0.025334]], [[0.997, 1.294, 1.309, 1.0, 0.7, 0.01], [1.006534, 2, 0, 0.6]], [[-2.941, 2.957, -1.527, 1.0, 0.05, 0.01], [-0.64488, 17, 0, 0.107018]], [[-0.207, 3.318, -0.298, 1.0, 0.05, 0.001], [-0.094257, 16, 1, 0.151659]], [[-2.326, 4.308, 0.769, 2.0, 0.7, 0.0001], [0.178032, 236, 4, 0.069889]], [[-2.2, 0.0, -0.933, 1.0, 0.3, 0.001], [-3.133, 3, 0, 0.2]], [[2.431, 0.0, 0.71, 1.0, 0.1, 0.01], [3.141, 4, 0, 0.6]]], [[[-2.618, 0.0, -1.013, 1.0, 0.1, 0.001], [-3.631, 4, 0, 0.6]], [[0.01, 4.331, -0.279, 1.5, 0.1, 0.0001], [-0.064291, 46, 2, 0.145024]], [[0.299, 2.489, -1.677, 0.5, 0.3, 0.001], [-0.393348, 24, 2, 0.029906]], [[1.267, 2.693, -0.039, 0.5, 0.7, 0.0001], [0.318914, 87, 3, 0.008112]], [[0.28, 0.0, -0.418, 0.5, 0.3, 0.01], [0.071, 2, 0, 0.4]], [[-2.605, 4.58, 1.505, 0.5, 0.1, 0.01], [0.029147, 18, 1, 0.021233]], [[-1.057, 1.633, -1.528, 1.5, 0.3, 0.0001], [-0.946197, 41, 2, 0.02163]], [[-2.296, 0.0, -1.609, 1.5, 0.3, 0.001], [-4.7095, 3, 0, 1.2]]], [[[0.741, 0.0, 1.287, 1.5, 0.1, 0.001], [2.6715, 4, 0, 1.6]], [[-1.416, 3.263, -0.863, 0.5, 0.05, 0.0001], [-0.489781, 93, 2, 0.002341]], [[-2.5, 0.0, 0.727, 1.0, 0.05, 0.0001], [-1.773, 5, 0, 0.5]], [[-0.815, 0.978, -0.497, 0.5, 0.3, 0.001], [-0.696428, 7, 1, 0.050506]], [[-2.519, 0.0, 1.258, 2.0, 0.1, 0.01], [-0.003, 5, 0, 1.0]], [[2.242, 1.044, -1.112, 2.0, 0.3, 0.001], [-0.655028, 56, 2, 0.058769]], [[-0.984, 1.04, -1.056, 1.5, 0.1, 0.001], [-1.008638, 7, 0, 0.200496]], [[-1.45, 1.621, 1.381, 1.0, 0.7, 0.001], [0.396634, 43, 3, 0.003956]]], [[[-1.375, 1.447, 0.137, 2.0, 0.7, 0.01], [0.011153, 17, 2, 0.010327]], [[-0.509, 0.0, 1.966, 1.5, 0.3, 0.001], [2.44, 3, 0, 1.2]], [[-1.681, 0.0, -1.23, 0.5, 0.1, 0.0001], [-2.296, 3, 0, 0.4]], [[-0.023, 1.232, 1.762, 1.5, 0.3, 0.001], [1.201016, 38, 2, 0.019925]], [[-2.792, 3.052, 0.797, 2.0, 0.3, 0.001], [0.254108, 79, 2, 0.135662]], [[-0.195, 0.0, -1.909, 2.0, 0.1, 0.001], [-4.013, 5, 0, 1.0]], [[2.86, 0.478, 0.373, 1.0, 0.7, 0.0001], [2.069798, 31, 2, 0.033635]], [[1.902, 0.0, 1.399, 0.5, 0.1, 0.001], [2.6015, 3, 0, 0.4]]]]\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":"75b3b23fd965b5e6cf7283a788341162be9dc19a9ddc2ea44ec2d71af8f9fbc6","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(y0, lam, s, t_end, dt0, tol):\n    def f(y):\n        return -lam * y + s\n    t, y, h = 0.0, y0, dt0\n    acc = rej = 0\n    while t < t_end - 1e-12 and acc + rej < 500:\n        h = min(h, t_end - t)\n        k1 = f(y)\n        k2 = f(y + h * k1)\n        y_low = y + h * k1\n        y_high = y + h / 2 * (k1 + k2)\n        err = abs(y_high - y_low) / max(1.0, abs(y))\n        if err <= tol:\n            t += h\n            y = y_low\n            acc += 1\n            grow = 2.0 if err == 0 else min(2.0, 0.9 * (tol / err) ** 0.5)\n            h = h * grow\n        else:\n            rej += 1\n            h = h * max(0.2, 0.9 * (tol / err) ** 0.5)\n    return [round(y, 6), acc, rej, round(h, 6)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[1.277, 4.761, -1.617, 0.5, 0.1, 0.0001], [-0.190065, 140, 3, 0.006855]], [[1.689, 0.0, 0.476, 0.5, 0.3, 0.001], [1.927, 2, 0, 0.4]], [[-2.45, 3.377, -1.852, 2.0, 0.05, 0.01], [-0.552205, 23, 1, 0.101538]], [[2.009, 1.907, -1.617, 0.5, 0.3, 0.01], [0.255071, 10, 1, 0.029016]], [[-0.514, 2.551, -1.015, 1.0, 0.05, 0.01], [-0.408549, 7, 0, 0.073483]], [[1.301, 0.0, 1.346, 0.5, 0.1, 0.0001], [1.974, 3, 0, 0.4]], [[-0.603, 0.0, 1.691, 2.0, 0.1, 0.0001], [2.779, 5, 0, 1.0]], [[-0.952, 1.695, -1.777, 2.0, 0.3, 0.01], [-1.043824, 6, 1, 0.806875]]], [[[-0.876, 0.0, -0.17, 0.5, 0.05, 0.0001], [-0.961, 4, 0, 0.3]], [[-1.169, 4.728, 0.065, 1.0, 0.3, 0.0001], [0.003263, 158, 3, 0.025334]], [[0.997, 1.294, 1.309, 1.0, 0.7, 0.01], [1.006534, 2, 0, 0.6]], [[-2.941, 2.957, -1.527, 1.0, 0.05, 0.01], [-0.64488, 17, 0, 0.107018]], [[-0.207, 3.318, -0.298, 1.0, 0.05, 0.001], [-0.094257, 16, 1, 0.151659]], [[-2.326, 4.308, 0.769, 2.0, 0.7, 0.0001], [0.178032, 236, 4, 0.069889]], [[-2.2, 0.0, -0.933, 1.0, 0.3, 0.001], [-3.133, 3, 0, 0.2]], [[2.431, 0.0, 0.71, 1.0, 0.1, 0.01], [3.141, 4, 0, 0.6]]], [[[-2.618, 0.0, -1.013, 1.0, 0.1, 0.001], [-3.631, 4, 0, 0.6]], [[0.01, 4.331, -0.279, 1.5, 0.1, 0.0001], [-0.064291, 46, 2, 0.145024]], [[0.299, 2.489, -1.677, 0.5, 0.3, 0.001], [-0.393348, 24, 2, 0.029906]], [[1.267, 2.693, -0.039, 0.5, 0.7, 0.0001], [0.318914, 87, 3, 0.008112]], [[0.28, 0.0, -0.418, 0.5, 0.3, 0.01], [0.071, 2, 0, 0.4]], [[-2.605, 4.58, 1.505, 0.5, 0.1, 0.01], [0.029147, 18, 1, 0.021233]], [[-1.057, 1.633, -1.528, 1.5, 0.3, 0.0001], [-0.946197, 41, 2, 0.02163]], [[-2.296, 0.0, -1.609, 1.5, 0.3, 0.001], [-4.7095, 3, 0, 1.2]]], [[[0.741, 0.0, 1.287, 1.5, 0.1, 0.001], [2.6715, 4, 0, 1.6]], [[-1.416, 3.263, -0.863, 0.5, 0.05, 0.0001], [-0.489781, 93, 2, 0.002341]], [[-2.5, 0.0, 0.727, 1.0, 0.05, 0.0001], [-1.773, 5, 0, 0.5]], [[-0.815, 0.978, -0.497, 0.5, 0.3, 0.001], [-0.696428, 7, 1, 0.050506]], [[-2.519, 0.0, 1.258, 2.0, 0.1, 0.01], [-0.003, 5, 0, 1.0]], [[2.242, 1.044, -1.112, 2.0, 0.3, 0.001], [-0.655028, 56, 2, 0.058769]], [[-0.984, 1.04, -1.056, 1.5, 0.1, 0.001], [-1.008638, 7, 0, 0.200496]], [[-1.45, 1.621, 1.381, 1.0, 0.7, 0.001], [0.396634, 43, 3, 0.003956]]], [[[-1.375, 1.447, 0.137, 2.0, 0.7, 0.01], [0.011153, 17, 2, 0.010327]], [[-0.509, 0.0, 1.966, 1.5, 0.3, 0.001], [2.44, 3, 0, 1.2]], [[-1.681, 0.0, -1.23, 0.5, 0.1, 0.0001], [-2.296, 3, 0, 0.4]], [[-0.023, 1.232, 1.762, 1.5, 0.3, 0.001], [1.201016, 38, 2, 0.019925]], [[-2.792, 3.052, 0.797, 2.0, 0.3, 0.001], [0.254108, 79, 2, 0.135662]], [[-0.195, 0.0, -1.909, 2.0, 0.1, 0.001], [-4.013, 5, 0, 1.0]], [[2.86, 0.478, 0.373, 1.0, 0.7, 0.0001], [2.069798, 31, 2, 0.033635]], [[1.902, 0.0, 1.399, 0.5, 0.1, 0.001], [2.6015, 3, 0, 0.4]]]]\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-adaptive-heun-euler-propagated-solution","generated_at":"2026-09-29T14:50:55.111169+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":"Accepted steps set y = y_low.","sha256":"1d14a6f75a2c0ccea974d69da8efd45d2820a872ac4be6f894e1807145e69a89","title":"Adaptive integrator propagates the low-order Euler solution · 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.108,"exit_code":1,"observations":[{"actual":[-0.191779,140,3,0.003854],"check":"case 0","expected":[-0.190065,140,3,0.006855],"passed":false},{"actual":[1.927,2,0,0.4],"check":"case 1","expected":[1.927,2,0,0.4],"passed":true},{"actual":[-0.549118,22,1,0.164561],"check":"case 2","expected":[-0.552205,23,1,0.101538],"passed":false},{"actual":[0.225905,10,1,0.027216],"check":"case 3","expected":[0.255071,10,1,0.029016],"passed":false},{"actual":[-0.403859,7,0,0.000236],"check":"case 4","expected":[-0.408549,7,0,0.073483],"passed":false},{"actual":[1.974,3,0,0.4],"check":"case 5","expected":[1.974,3,0,0.4],"passed":true},{"actual":[2.779,5,0,1.0],"check":"case 6","expected":[2.779,5,0,1.0],"passed":true},{"actual":[-1.046733,6,1,0.609566],"check":"case 7","expected":[-1.043824,6,1,0.806875],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"case 0\", \"actual\": [-0.191779, 140, 3, 0.003854], \"expected\": [-0.190065, 140, 3, 0.006855], \"passed\": false}, {\"check\": \"case 1\", \"actual\": [1.927, 2, 0, 0.4], \"expected\": [1.927, 2, 0, 0.4], \"passed\": true}, {\"check\": \"case 2\", \"actual\": [-0.549118, 22, 1, 0.164561], \"expected\": [-0.552205, 23, 1, 0.101538], \"passed\": false}, {\"check\": \"case 3\", \"actual\": [0.225905, 10, 1, 0.027216], \"expected\": [0.255071, 10, 1, 0.029016], \"passed\": false}, {\"check\": \"case 4\", \"actual\": [-0.403859, 7, 0, 0.000236], \"expected\": [-0.408549, 7, 0, 0.073483], \"passed\": false}, {\"check\": \"case 5\", \"actual\": [1.974, 3, 0, 0.4], \"expected\": [1.974, 3, 0, 0.4], \"passed\": true}, {\"check\": \"case 6\", \"actual\": [2.779, 5, 0, 1.0], \"expected\": [2.779, 5, 0, 1.0], \"passed\": true}, {\"check\": \"case 7\", \"actual\": [-1.046733, 6, 1, 0.609566], \"expected\": [-1.043824, 6, 1, 0.806875], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.347,"exit_code":1,"observations":[{"actual":[-0.193496,140,3,0.000617],"check":"case 0","expected":[-0.190065,140,3,0.006855],"passed":false},{"actual":[1.927,2,0,0.4],"check":"case 1","expected":[1.927,2,0,0.4],"passed":true},{"actual":[-0.548171,21,1,0.299551],"check":"case 2","expected":[-0.552205,23,1,0.101538],"passed":false},{"actual":[0.197157,10,1,0.024348],"check":"case 3","expected":[0.255071,10,1,0.029016],"passed":false},{"actual":[-0.400745,6,0,0.504839],"check":"case 4","expected":[-0.408549,7,0,0.073483],"passed":false},{"actual":[1.974,3,0,0.4],"check":"case 5","expected":[1.974,3,0,0.4],"passed":true},{"actual":[2.779,5,0,1.0],"check":"case 6","expected":[2.779,5,0,1.0],"passed":true},{"actual":[-1.048489,6,1,0.356455],"check":"case 7","expected":[-1.043824,6,1,0.806875],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"case 0\", \"actual\": [-0.193496, 140, 3, 0.000617], \"expected\": [-0.190065, 140, 3, 0.006855], \"passed\": false}, {\"check\": \"case 1\", \"actual\": [1.927, 2, 0, 0.4], \"expected\": [1.927, 2, 0, 0.4], \"passed\": true}, {\"check\": \"case 2\", \"actual\": [-0.548171, 21, 1, 0.299551], \"expected\": [-0.552205, 23, 1, 0.101538], \"passed\": false}, {\"check\": \"case 3\", \"actual\": [0.197157, 10, 1, 0.024348], \"expected\": [0.255071, 10, 1, 0.029016], \"passed\": false}, {\"check\": \"case 4\", \"actual\": [-0.400745, 6, 0, 0.504839], \"expected\": [-0.408549, 7, 0, 0.073483], \"passed\": false}, {\"check\": \"case 5\", \"actual\": [1.974, 3, 0, 0.4], \"expected\": [1.974, 3, 0, 0.4], \"passed\": true}, {\"check\": \"case 6\", \"actual\": [2.779, 5, 0, 1.0], \"expected\": [2.779, 5, 0, 1.0], \"passed\": true}, {\"check\": \"case 7\", \"actual\": [-1.048489, 6, 1, 0.356455], \"expected\": [-1.043824, 6, 1, 0.806875], \"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."}}