{"abstract":"Populations exactly at the threshold are counted as quasi-extinct.","category":"Ecological population dynamics","checks":7,"contract":"Geometric mean growth exp(mean ln lambda) determines trend (declining <1, stable ==1, growing >1); arithmetic mean reported alongside; trajectory multiplies N by each lambda; quasi-extinction time is the first 1-based year with N < threshold or None; return [geo, arith, trajectory, hit, trend]; None for empty, non-positive lambdas or N0<=0.","evaluation_group":"w2-ecopop-stochastic-growth","failed_approach":"Rounding abundance to whole animals hides fractional dips below the threshold.","family":"w2-ecopop-stochastic-growth-quasi-extinction-comparison","id":"FA-65681","implementations":{"attempt":{"sha256":"4dff83e4118c546cd4b2a4323b2bf070384781b509ad17f855c58411fcf21276","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(lambdas, n0, threshold):\n    if not lambdas or min(lambdas) <= 0 or n0 <= 0:\n        return None\n    logs = [math.log(x) for x in lambdas]\n    geo = math.exp(sum(logs) / len(logs))\n    arith = sum(lambdas) / len(lambdas)\n    n = float(n0)\n    traj = []\n    hit = None\n    for t, lam in enumerate(lambdas, start=1):\n        n *= lam\n        traj.append(round(n, 4))\n        if hit is None and round(n) < threshold:\n            hit = t\n    trend = 'declining' if geo < 1 else ('stable' if geo == 1 else 'growing')\n    return [round(geo, 6), round(arith, 6), traj, hit, trend]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control: boom and bust',\n   ([1.5, 0.5, 1.5, 0.5], 100, 20),\n   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),\n  ('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: balanced doubling halving', ([2.0, 0.5], 100, 10), [1.0, 1.25, [200.0, 100.0], None, 'stable']),\n  ('control: steady growth',\n   ([1.1, 1.2, 1.05], 50, 10),\n   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),\n  ('control: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),\n  ('control: dip and recovery',\n   ([0.4, 0.8, 3.0, 2.0], 100, 50),\n   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining'])],\n [('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: steady growth',\n   ([1.1, 1.2, 1.05], 50, 10),\n   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),\n  ('control: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),\n  ('control: dip and recovery',\n   ([0.4, 0.8, 3.0, 2.0], 100, 50),\n   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),\n  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),\n  ('control: first year crash',\n   ([0.1, 1.5, 1.5], 100, 20),\n   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining']),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining'])],\n [('control: boom and bust',\n   ([1.5, 0.5, 1.5, 0.5], 100, 20),\n   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),\n  ('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),\n  ('control: first year crash',\n   ([0.1, 1.5, 1.5], 100, 20),\n   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining']),\n  ('control: high variance decline',\n   ([3.0, 0.3, 3.0, 0.3], 100, 5),\n   [0.948683, 1.65, [300.0, 90.0, 270.0, 81.0], None, 'declining']),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining']),\n  ('control: slow decline',\n   ([0.95, 1.02, 0.9, 1.05, 0.93], 80, 60),\n   [0.968384, 0.97, [76.0, 77.52, 69.768, 73.2564, 68.1285], None, 'declining'])],\n [('control: boom and bust',\n   ([1.5, 0.5, 1.5, 0.5], 100, 20),\n   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),\n  ('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: balanced doubling halving', ([2.0, 0.5], 100, 10), [1.0, 1.25, [200.0, 100.0], None, 'stable']),\n  ('control: steady growth',\n   ([1.1, 1.2, 1.05], 50, 10),\n   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),\n  ('control: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining']),\n  ('control: slow decline',\n   ([0.95, 1.02, 0.9, 1.05, 0.93], 80, 60),\n   [0.968384, 0.97, [76.0, 77.52, 69.768, 73.2564, 68.1285], None, 'declining'])],\n [('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: balanced doubling halving', ([2.0, 0.5], 100, 10), [1.0, 1.25, [200.0, 100.0], None, 'stable']),\n  ('control: steady growth',\n   ([1.1, 1.2, 1.05], 50, 10),\n   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),\n  ('control: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),\n  ('control: dip and recovery',\n   ([0.4, 0.8, 3.0, 2.0], 100, 50),\n   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),\n  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining'])]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, 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":"bd56a69902acc7c93bbc2005efcbe72a11a209b04f8f1dedfa91eeb07d0ccdcb","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(lambdas, n0, threshold):\n    if not lambdas or min(lambdas) <= 0 or n0 <= 0:\n        return None\n    logs = [math.log(x) for x in lambdas]\n    geo = math.exp(sum(logs) / len(logs))\n    arith = sum(lambdas) / len(lambdas)\n    n = float(n0)\n    traj = []\n    hit = None\n    for t, lam in enumerate(lambdas, start=1):\n        n *= lam\n        traj.append(round(n, 4))\n        if hit is None and n <= threshold:\n            hit = t\n    trend = 'declining' if geo < 1 else ('stable' if geo == 1 else 'growing')\n    return [round(geo, 6), round(arith, 6), traj, hit, trend]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control: boom and bust',\n   ([1.5, 0.5, 1.5, 0.5], 100, 20),\n   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),\n  ('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: balanced doubling halving', ([2.0, 0.5], 100, 10), [1.0, 1.25, [200.0, 100.0], None, 'stable']),\n  ('control: steady growth',\n   ([1.1, 1.2, 1.05], 50, 10),\n   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),\n  ('control: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),\n  ('control: dip and recovery',\n   ([0.4, 0.8, 3.0, 2.0], 100, 50),\n   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining'])],\n [('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: steady growth',\n   ([1.1, 1.2, 1.05], 50, 10),\n   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),\n  ('control: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),\n  ('control: dip and recovery',\n   ([0.4, 0.8, 3.0, 2.0], 100, 50),\n   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),\n  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),\n  ('control: first year crash',\n   ([0.1, 1.5, 1.5], 100, 20),\n   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining']),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining'])],\n [('control: boom and bust',\n   ([1.5, 0.5, 1.5, 0.5], 100, 20),\n   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),\n  ('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),\n  ('control: first year crash',\n   ([0.1, 1.5, 1.5], 100, 20),\n   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining']),\n  ('control: high variance decline',\n   ([3.0, 0.3, 3.0, 0.3], 100, 5),\n   [0.948683, 1.65, [300.0, 90.0, 270.0, 81.0], None, 'declining']),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining']),\n  ('control: slow decline',\n   ([0.95, 1.02, 0.9, 1.05, 0.93], 80, 60),\n   [0.968384, 0.97, [76.0, 77.52, 69.768, 73.2564, 68.1285], None, 'declining'])],\n [('control: boom and bust',\n   ([1.5, 0.5, 1.5, 0.5], 100, 20),\n   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),\n  ('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: balanced doubling halving', ([2.0, 0.5], 100, 10), [1.0, 1.25, [200.0, 100.0], None, 'stable']),\n  ('control: steady growth',\n   ([1.1, 1.2, 1.05], 50, 10),\n   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),\n  ('control: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining']),\n  ('control: slow decline',\n   ([0.95, 1.02, 0.9, 1.05, 0.93], 80, 60),\n   [0.968384, 0.97, [76.0, 77.52, 69.768, 73.2564, 68.1285], None, 'declining'])],\n [('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: balanced doubling halving', ([2.0, 0.5], 100, 10), [1.0, 1.25, [200.0, 100.0], None, 'stable']),\n  ('control: steady growth',\n   ([1.1, 1.2, 1.05], 50, 10),\n   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),\n  ('control: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),\n  ('control: dip and recovery',\n   ([0.4, 0.8, 3.0, 2.0], 100, 50),\n   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),\n  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining'])]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, 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"},"fixed":{"sha256":"17756f051464e225f5a86d0d2b9703584c07f5cd8fdab5339fe6234e2c4ecf3e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(lambdas, n0, threshold):\n    if not lambdas or min(lambdas) <= 0 or n0 <= 0:\n        return None\n    logs = [math.log(x) for x in lambdas]\n    geo = math.exp(sum(logs) / len(logs))\n    arith = sum(lambdas) / len(lambdas)\n    n = float(n0)\n    traj = []\n    hit = None\n    for t, lam in enumerate(lambdas, start=1):\n        n *= lam\n        traj.append(round(n, 4))\n        if hit is None and n < threshold:\n            hit = t\n    trend = 'declining' if geo < 1 else ('stable' if geo == 1 else 'growing')\n    return [round(geo, 6), round(arith, 6), traj, hit, trend]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control: boom and bust',\n   ([1.5, 0.5, 1.5, 0.5], 100, 20),\n   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),\n  ('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: balanced doubling halving', ([2.0, 0.5], 100, 10), [1.0, 1.25, [200.0, 100.0], None, 'stable']),\n  ('control: steady growth',\n   ([1.1, 1.2, 1.05], 50, 10),\n   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),\n  ('control: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),\n  ('control: dip and recovery',\n   ([0.4, 0.8, 3.0, 2.0], 100, 50),\n   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining'])],\n [('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: steady growth',\n   ([1.1, 1.2, 1.05], 50, 10),\n   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),\n  ('control: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),\n  ('control: dip and recovery',\n   ([0.4, 0.8, 3.0, 2.0], 100, 50),\n   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),\n  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),\n  ('control: first year crash',\n   ([0.1, 1.5, 1.5], 100, 20),\n   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining']),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining'])],\n [('control: boom and bust',\n   ([1.5, 0.5, 1.5, 0.5], 100, 20),\n   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),\n  ('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),\n  ('control: first year crash',\n   ([0.1, 1.5, 1.5], 100, 20),\n   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining']),\n  ('control: high variance decline',\n   ([3.0, 0.3, 3.0, 0.3], 100, 5),\n   [0.948683, 1.65, [300.0, 90.0, 270.0, 81.0], None, 'declining']),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining']),\n  ('control: slow decline',\n   ([0.95, 1.02, 0.9, 1.05, 0.93], 80, 60),\n   [0.968384, 0.97, [76.0, 77.52, 69.768, 73.2564, 68.1285], None, 'declining'])],\n [('control: boom and bust',\n   ([1.5, 0.5, 1.5, 0.5], 100, 20),\n   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),\n  ('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: balanced doubling halving', ([2.0, 0.5], 100, 10), [1.0, 1.25, [200.0, 100.0], None, 'stable']),\n  ('control: steady growth',\n   ([1.1, 1.2, 1.05], 50, 10),\n   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),\n  ('control: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining']),\n  ('control: slow decline',\n   ([0.95, 1.02, 0.9, 1.05, 0.93], 80, 60),\n   [0.968384, 0.97, [76.0, 77.52, 69.768, 73.2564, 68.1285], None, 'declining'])],\n [('regression: exact halving to threshold',\n   ([0.5, 1.0, 2.0], 100, 50),\n   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),\n  ('control: balanced doubling halving', ([2.0, 0.5], 100, 10), [1.0, 1.25, [200.0, 100.0], None, 'stable']),\n  ('control: steady growth',\n   ([1.1, 1.2, 1.05], 50, 10),\n   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),\n  ('control: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),\n  ('control: dip and recovery',\n   ([0.4, 0.8, 3.0, 2.0], 100, 50),\n   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),\n  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),\n  ('regression: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining'])]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, 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":"Deterministic bounded teaching model with a stipulated contract; not a validated scientific or public-health modelling library. 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-ecopop-stochastic-growth-quasi-extinction-comparison","generated_at":"2026-09-29T14:47:36.112860+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Population projections set harvest quotas, conservation status and pest-control timing; a wrong update order, boundary or rate conversion silently changes management advice.","repair":"Restore the quasi-extinction comparison rule: `n < threshold`.","root_cause":"The threshold comparison includes equality.","sha256":"c812b1854b13d30d029f1352d1d52c4e953524bd1ebe708a2b99eb84713bf386","title":"Stochastic growth rate and quasi-extinction: quasi-extinction comparison · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.026,"exit_code":1,"observations":[{"actual":[0.866025,1.0,[150.0,75.0,112.5,56.25],null,"declining"],"check":"control: boom and bust","expected":[0.866025,1.0,[150.0,75.0,112.5,56.25],null,"declining"],"passed":true},{"actual":[1.0,1.166667,[50.0,50.0,100.0],null,"stable"],"check":"regression: exact halving to threshold","expected":[1.0,1.166667,[50.0,50.0,100.0],null,"stable"],"passed":true},{"actual":[1.0,1.25,[200.0,100.0],null,"stable"],"check":"control: balanced doubling halving","expected":[1.0,1.25,[200.0,100.0],null,"stable"],"passed":true},{"actual":[1.114947,1.116667,[55.0,66.0,69.3],null,"growing"],"check":"control: steady growth","expected":[1.114947,1.116667,[55.0,66.0,69.3],null,"growing"],"passed":true},{"actual":[1.0,1.0,[30.0,30.0,30.0],null,"stable"],"check":"control: constant","expected":[1.0,1.0,[30.0,30.0,30.0],null,"stable"],"passed":true},{"actual":[1.177132,1.55,[40.0,32.0,96.0,192.0],1,"growing"],"check":"control: dip and recovery","expected":[1.177132,1.55,[40.0,32.0,96.0,192.0],1,"growing"],"passed":true},{"actual":[0.771492,0.848,[49.6,59.52],null,"declining"],"check":"regression: fractional dip","expected":[0.771492,0.848,[49.6,59.52],1,"declining"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control: boom and bust\", \"actual\": [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], null, \"declining\"], \"expected\": [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], null, \"declining\"], \"passed\": true}, {\"check\": \"regression: exact halving to threshold\", \"actual\": [1.0, 1.166667, [50.0, 50.0, 100.0], null, \"stable\"], \"expected\": [1.0, 1.166667, [50.0, 50.0, 100.0], null, \"stable\"], \"passed\": true}, {\"check\": \"control: balanced doubling halving\", \"actual\": [1.0, 1.25, [200.0, 100.0], null, \"stable\"], \"expected\": [1.0, 1.25, [200.0, 100.0], null, \"stable\"], \"passed\": true}, {\"check\": \"control: steady growth\", \"actual\": [1.114947, 1.116667, [55.0, 66.0, 69.3], null, \"growing\"], \"expected\": [1.114947, 1.116667, [55.0, 66.0, 69.3], null, \"growing\"], \"passed\": true}, {\"check\": \"control: constant\", \"actual\": [1.0, 1.0, [30.0, 30.0, 30.0], null, \"stable\"], \"expected\": [1.0, 1.0, [30.0, 30.0, 30.0], null, \"stable\"], \"passed\": true}, {\"check\": \"control: dip and recovery\", \"actual\": [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, \"growing\"], \"expected\": [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, \"growing\"], \"passed\": true}, {\"check\": \"regression: fractional dip\", \"actual\": [0.771492, 0.848, [49.6, 59.52], null, \"declining\"], \"expected\": [0.771492, 0.848, [49.6, 59.52], 1, \"declining\"], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.778,"exit_code":1,"observations":[{"actual":[0.866025,1.0,[150.0,75.0,112.5,56.25],null,"declining"],"check":"control: boom and bust","expected":[0.866025,1.0,[150.0,75.0,112.5,56.25],null,"declining"],"passed":true},{"actual":[1.0,1.166667,[50.0,50.0,100.0],1,"stable"],"check":"regression: exact halving to threshold","expected":[1.0,1.166667,[50.0,50.0,100.0],null,"stable"],"passed":false},{"actual":[1.0,1.25,[200.0,100.0],null,"stable"],"check":"control: balanced doubling halving","expected":[1.0,1.25,[200.0,100.0],null,"stable"],"passed":true},{"actual":[1.114947,1.116667,[55.0,66.0,69.3],null,"growing"],"check":"control: steady growth","expected":[1.114947,1.116667,[55.0,66.0,69.3],null,"growing"],"passed":true},{"actual":[1.0,1.0,[30.0,30.0,30.0],null,"stable"],"check":"control: constant","expected":[1.0,1.0,[30.0,30.0,30.0],null,"stable"],"passed":true},{"actual":[1.177132,1.55,[40.0,32.0,96.0,192.0],1,"growing"],"check":"control: dip and recovery","expected":[1.177132,1.55,[40.0,32.0,96.0,192.0],1,"growing"],"passed":true},{"actual":[0.771492,0.848,[49.6,59.52],1,"declining"],"check":"regression: fractional dip","expected":[0.771492,0.848,[49.6,59.52],1,"declining"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control: boom and bust\", \"actual\": [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], null, \"declining\"], \"expected\": [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], null, \"declining\"], \"passed\": true}, {\"check\": \"regression: exact halving to threshold\", \"actual\": [1.0, 1.166667, [50.0, 50.0, 100.0], 1, \"stable\"], \"expected\": [1.0, 1.166667, [50.0, 50.0, 100.0], null, \"stable\"], \"passed\": false}, {\"check\": \"control: balanced doubling halving\", \"actual\": [1.0, 1.25, [200.0, 100.0], null, \"stable\"], \"expected\": [1.0, 1.25, [200.0, 100.0], null, \"stable\"], \"passed\": true}, {\"check\": \"control: steady growth\", \"actual\": [1.114947, 1.116667, [55.0, 66.0, 69.3], null, \"growing\"], \"expected\": [1.114947, 1.116667, [55.0, 66.0, 69.3], null, \"growing\"], \"passed\": true}, {\"check\": \"control: constant\", \"actual\": [1.0, 1.0, [30.0, 30.0, 30.0], null, \"stable\"], \"expected\": [1.0, 1.0, [30.0, 30.0, 30.0], null, \"stable\"], \"passed\": true}, {\"check\": \"control: dip and recovery\", \"actual\": [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, \"growing\"], \"expected\": [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, \"growing\"], \"passed\": true}, {\"check\": \"regression: fractional dip\", \"actual\": [0.771492, 0.848, [49.6, 59.52], 1, \"declining\"], \"expected\": [0.771492, 0.848, [49.6, 59.52], 1, \"declining\"], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.259,"exit_code":0,"observations":[{"actual":[0.866025,1.0,[150.0,75.0,112.5,56.25],null,"declining"],"check":"control: boom and bust","expected":[0.866025,1.0,[150.0,75.0,112.5,56.25],null,"declining"],"passed":true},{"actual":[1.0,1.166667,[50.0,50.0,100.0],null,"stable"],"check":"regression: exact halving to threshold","expected":[1.0,1.166667,[50.0,50.0,100.0],null,"stable"],"passed":true},{"actual":[1.0,1.25,[200.0,100.0],null,"stable"],"check":"control: balanced doubling halving","expected":[1.0,1.25,[200.0,100.0],null,"stable"],"passed":true},{"actual":[1.114947,1.116667,[55.0,66.0,69.3],null,"growing"],"check":"control: steady growth","expected":[1.114947,1.116667,[55.0,66.0,69.3],null,"growing"],"passed":true},{"actual":[1.0,1.0,[30.0,30.0,30.0],null,"stable"],"check":"control: constant","expected":[1.0,1.0,[30.0,30.0,30.0],null,"stable"],"passed":true},{"actual":[1.177132,1.55,[40.0,32.0,96.0,192.0],1,"growing"],"check":"control: dip and recovery","expected":[1.177132,1.55,[40.0,32.0,96.0,192.0],1,"growing"],"passed":true},{"actual":[0.771492,0.848,[49.6,59.52],1,"declining"],"check":"regression: fractional dip","expected":[0.771492,0.848,[49.6,59.52],1,"declining"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control: boom and bust\", \"actual\": [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], null, \"declining\"], \"expected\": [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], null, \"declining\"], \"passed\": true}, {\"check\": \"regression: exact halving to threshold\", \"actual\": [1.0, 1.166667, [50.0, 50.0, 100.0], null, \"stable\"], \"expected\": [1.0, 1.166667, [50.0, 50.0, 100.0], null, \"stable\"], \"passed\": true}, {\"check\": \"control: balanced doubling halving\", \"actual\": [1.0, 1.25, [200.0, 100.0], null, \"stable\"], \"expected\": [1.0, 1.25, [200.0, 100.0], null, \"stable\"], \"passed\": true}, {\"check\": \"control: steady growth\", \"actual\": [1.114947, 1.116667, [55.0, 66.0, 69.3], null, \"growing\"], \"expected\": [1.114947, 1.116667, [55.0, 66.0, 69.3], null, \"growing\"], \"passed\": true}, {\"check\": \"control: constant\", \"actual\": [1.0, 1.0, [30.0, 30.0, 30.0], null, \"stable\"], \"expected\": [1.0, 1.0, [30.0, 30.0, 30.0], null, \"stable\"], \"passed\": true}, {\"check\": \"control: dip and recovery\", \"actual\": [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, \"growing\"], \"expected\": [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, \"growing\"], \"passed\": true}, {\"check\": \"regression: fractional dip\", \"actual\": [0.771492, 0.848, [49.6, 59.52], 1, \"declining\"], \"expected\": [0.771492, 0.848, [49.6, 59.52], 1, \"declining\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}