FAILURE MAP
← Case archive

FA-65691 / Ecological population dynamics / Open access

Stochastic growth rate and quasi-extinction: stable equality · case 01

A population whose long-run growth is exactly one is called growing.

Verified by executionVariant 1 · 7 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The stable branch is missing.

VERIFIED REPAIR

Restore the stable equality rule: `('stable' if geo == 1 else 'growing')`.

Unsuccessful approach: Testing the arithmetic mean labels balanced fluctuations growing.

Case 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.

Why this case matters

Population projections set harvest quotas, conservation status and pest-control timing; a wrong update order, boundary or rate conversion silently changes management advice.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(lambdas, n0, threshold):
    if not lambdas or min(lambdas) <= 0 or n0 <= 0:
        return None
    logs = [math.log(x) for x in lambdas]
    geo = math.exp(sum(logs) / len(logs))
    arith = sum(lambdas) / len(lambdas)
    n = float(n0)
    traj = []
    hit = None
    for t, lam in enumerate(lambdas, start=1):
        n *= lam
        traj.append(round(n, 4))
        if hit is None and n < threshold:
            hit = t
    trend = 'declining' if geo < 1 else 'growing'
    return [round(geo, 6), round(arith, 6), traj, hit, trend]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('control: boom and bust',
   ([1.5, 0.5, 1.5, 0.5], 100, 20),
   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),
  ('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('regression: balanced doubling halving',
   ([2.0, 0.5], 100, 10),
   [1.0, 1.25, [200.0, 100.0], None, 'stable']),
  ('control: steady growth',
   ([1.1, 1.2, 1.05], 50, 10),
   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),
  ('regression: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),
  ('control: dip and recovery',
   ([0.4, 0.8, 3.0, 2.0], 100, 50),
   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),
  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None)],
 [('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('control: steady growth',
   ([1.1, 1.2, 1.05], 50, 10),
   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),
  ('regression: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),
  ('control: dip and recovery',
   ([0.4, 0.8, 3.0, 2.0], 100, 50),
   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),
  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),
  ('control: first year crash',
   ([0.1, 1.5, 1.5], 100, 20),
   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining']),
  ('control: high variance decline',
   ([3.0, 0.3, 3.0, 0.3], 100, 5),
   [0.948683, 1.65, [300.0, 90.0, 270.0, 81.0], None, 'declining'])],
 [('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('regression: balanced doubling halving',
   ([2.0, 0.5], 100, 10),
   [1.0, 1.25, [200.0, 100.0], None, 'stable']),
  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),
  ('control: first year crash',
   ([0.1, 1.5, 1.5], 100, 20),
   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining']),
  ('control: high variance decline',
   ([3.0, 0.3, 3.0, 0.3], 100, 5),
   [0.948683, 1.65, [300.0, 90.0, 270.0, 81.0], None, 'declining']),
  ('control: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining']),
  ('control: slow decline',
   ([0.95, 1.02, 0.9, 1.05, 0.93], 80, 60),
   [0.968384, 0.97, [76.0, 77.52, 69.768, 73.2564, 68.1285], None, 'declining'])],
 [('control: boom and bust',
   ([1.5, 0.5, 1.5, 0.5], 100, 20),
   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),
  ('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('regression: balanced doubling halving',
   ([2.0, 0.5], 100, 10),
   [1.0, 1.25, [200.0, 100.0], None, 'stable']),
  ('control: steady growth',
   ([1.1, 1.2, 1.05], 50, 10),
   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),
  ('regression: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),
  ('control: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining']),
  ('control: slow decline',
   ([0.95, 1.02, 0.9, 1.05, 0.93], 80, 60),
   [0.968384, 0.97, [76.0, 77.52, 69.768, 73.2564, 68.1285], None, 'declining'])],
 [('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('regression: balanced doubling halving',
   ([2.0, 0.5], 100, 10),
   [1.0, 1.25, [200.0, 100.0], None, 'stable']),
  ('control: steady growth',
   ([1.1, 1.2, 1.05], 50, 10),
   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),
  ('regression: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),
  ('control: dip and recovery',
   ([0.4, 0.8, 3.0, 2.0], 100, 50),
   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),
  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),
  ('control: first year crash',
   ([0.1, 1.5, 1.5], 100, 20),
   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining'])]]
for label, args, expected in fixtures[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
control: boom and bust[0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining'][0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']Passed
regression: exact halving to threshold[1.0, 1.166667, [50.0, 50.0, 100.0], None, 'growing'][1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']Failed
regression: balanced doubling halving[1.0, 1.25, [200.0, 100.0], None, 'growing'][1.0, 1.25, [200.0, 100.0], None, 'stable']Failed
control: steady growth[1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing'][1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']Passed
regression: constant[1.0, 1.0, [30.0, 30.0, 30.0], None, 'growing'][1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']Failed
control: dip and recovery[1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing'][1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']Passed
control: invalid zero lambdaNoneNonePassed

SHA-256 / 287103df4a166e18b4940399084362001dce8d85174bb39210826aea54c76ba3

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(lambdas, n0, threshold):
    if not lambdas or min(lambdas) <= 0 or n0 <= 0:
        return None
    logs = [math.log(x) for x in lambdas]
    geo = math.exp(sum(logs) / len(logs))
    arith = sum(lambdas) / len(lambdas)
    n = float(n0)
    traj = []
    hit = None
    for t, lam in enumerate(lambdas, start=1):
        n *= lam
        traj.append(round(n, 4))
        if hit is None and n < threshold:
            hit = t
    trend = 'declining' if geo < 1 else ('stable' if arith == 1 else 'growing')
    return [round(geo, 6), round(arith, 6), traj, hit, trend]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('control: boom and bust',
   ([1.5, 0.5, 1.5, 0.5], 100, 20),
   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),
  ('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('regression: balanced doubling halving',
   ([2.0, 0.5], 100, 10),
   [1.0, 1.25, [200.0, 100.0], None, 'stable']),
  ('control: steady growth',
   ([1.1, 1.2, 1.05], 50, 10),
   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),
  ('regression: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),
  ('control: dip and recovery',
   ([0.4, 0.8, 3.0, 2.0], 100, 50),
   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),
  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None)],
 [('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('control: steady growth',
   ([1.1, 1.2, 1.05], 50, 10),
   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),
  ('regression: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),
  ('control: dip and recovery',
   ([0.4, 0.8, 3.0, 2.0], 100, 50),
   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),
  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),
  ('control: first year crash',
   ([0.1, 1.5, 1.5], 100, 20),
   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining']),
  ('control: high variance decline',
   ([3.0, 0.3, 3.0, 0.3], 100, 5),
   [0.948683, 1.65, [300.0, 90.0, 270.0, 81.0], None, 'declining'])],
 [('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('regression: balanced doubling halving',
   ([2.0, 0.5], 100, 10),
   [1.0, 1.25, [200.0, 100.0], None, 'stable']),
  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),
  ('control: first year crash',
   ([0.1, 1.5, 1.5], 100, 20),
   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining']),
  ('control: high variance decline',
   ([3.0, 0.3, 3.0, 0.3], 100, 5),
   [0.948683, 1.65, [300.0, 90.0, 270.0, 81.0], None, 'declining']),
  ('control: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining']),
  ('control: slow decline',
   ([0.95, 1.02, 0.9, 1.05, 0.93], 80, 60),
   [0.968384, 0.97, [76.0, 77.52, 69.768, 73.2564, 68.1285], None, 'declining'])],
 [('control: boom and bust',
   ([1.5, 0.5, 1.5, 0.5], 100, 20),
   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),
  ('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('regression: balanced doubling halving',
   ([2.0, 0.5], 100, 10),
   [1.0, 1.25, [200.0, 100.0], None, 'stable']),
  ('control: steady growth',
   ([1.1, 1.2, 1.05], 50, 10),
   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),
  ('regression: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),
  ('control: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining']),
  ('control: slow decline',
   ([0.95, 1.02, 0.9, 1.05, 0.93], 80, 60),
   [0.968384, 0.97, [76.0, 77.52, 69.768, 73.2564, 68.1285], None, 'declining'])],
 [('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('regression: balanced doubling halving',
   ([2.0, 0.5], 100, 10),
   [1.0, 1.25, [200.0, 100.0], None, 'stable']),
  ('control: steady growth',
   ([1.1, 1.2, 1.05], 50, 10),
   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),
  ('regression: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),
  ('control: dip and recovery',
   ([0.4, 0.8, 3.0, 2.0], 100, 50),
   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),
  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),
  ('control: first year crash',
   ([0.1, 1.5, 1.5], 100, 20),
   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining'])]]
for label, args, expected in fixtures[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
control: boom and bust[0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining'][0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']Passed
regression: exact halving to threshold[1.0, 1.166667, [50.0, 50.0, 100.0], None, 'growing'][1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']Failed
regression: balanced doubling halving[1.0, 1.25, [200.0, 100.0], None, 'growing'][1.0, 1.25, [200.0, 100.0], None, 'stable']Failed
control: steady growth[1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing'][1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']Passed
regression: constant[1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable'][1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']Passed
control: dip and recovery[1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing'][1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']Passed
control: invalid zero lambdaNoneNonePassed

SHA-256 / 438057db6113cdf156ad5782e385bb5c5b16da9c88a173b6a01e09486bc4db70

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(lambdas, n0, threshold):
    if not lambdas or min(lambdas) <= 0 or n0 <= 0:
        return None
    logs = [math.log(x) for x in lambdas]
    geo = math.exp(sum(logs) / len(logs))
    arith = sum(lambdas) / len(lambdas)
    n = float(n0)
    traj = []
    hit = None
    for t, lam in enumerate(lambdas, start=1):
        n *= lam
        traj.append(round(n, 4))
        if hit is None and n < threshold:
            hit = t
    trend = 'declining' if geo < 1 else ('stable' if geo == 1 else 'growing')
    return [round(geo, 6), round(arith, 6), traj, hit, trend]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('control: boom and bust',
   ([1.5, 0.5, 1.5, 0.5], 100, 20),
   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),
  ('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('regression: balanced doubling halving',
   ([2.0, 0.5], 100, 10),
   [1.0, 1.25, [200.0, 100.0], None, 'stable']),
  ('control: steady growth',
   ([1.1, 1.2, 1.05], 50, 10),
   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),
  ('regression: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),
  ('control: dip and recovery',
   ([0.4, 0.8, 3.0, 2.0], 100, 50),
   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),
  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None)],
 [('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('control: steady growth',
   ([1.1, 1.2, 1.05], 50, 10),
   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),
  ('regression: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),
  ('control: dip and recovery',
   ([0.4, 0.8, 3.0, 2.0], 100, 50),
   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),
  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),
  ('control: first year crash',
   ([0.1, 1.5, 1.5], 100, 20),
   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining']),
  ('control: high variance decline',
   ([3.0, 0.3, 3.0, 0.3], 100, 5),
   [0.948683, 1.65, [300.0, 90.0, 270.0, 81.0], None, 'declining'])],
 [('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('regression: balanced doubling halving',
   ([2.0, 0.5], 100, 10),
   [1.0, 1.25, [200.0, 100.0], None, 'stable']),
  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),
  ('control: first year crash',
   ([0.1, 1.5, 1.5], 100, 20),
   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining']),
  ('control: high variance decline',
   ([3.0, 0.3, 3.0, 0.3], 100, 5),
   [0.948683, 1.65, [300.0, 90.0, 270.0, 81.0], None, 'declining']),
  ('control: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining']),
  ('control: slow decline',
   ([0.95, 1.02, 0.9, 1.05, 0.93], 80, 60),
   [0.968384, 0.97, [76.0, 77.52, 69.768, 73.2564, 68.1285], None, 'declining'])],
 [('control: boom and bust',
   ([1.5, 0.5, 1.5, 0.5], 100, 20),
   [0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']),
  ('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('regression: balanced doubling halving',
   ([2.0, 0.5], 100, 10),
   [1.0, 1.25, [200.0, 100.0], None, 'stable']),
  ('control: steady growth',
   ([1.1, 1.2, 1.05], 50, 10),
   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),
  ('regression: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),
  ('control: fractional dip', ([0.496, 1.2], 100, 50), [0.771492, 0.848, [49.6, 59.52], 1, 'declining']),
  ('control: slow decline',
   ([0.95, 1.02, 0.9, 1.05, 0.93], 80, 60),
   [0.968384, 0.97, [76.0, 77.52, 69.768, 73.2564, 68.1285], None, 'declining'])],
 [('regression: exact halving to threshold',
   ([0.5, 1.0, 2.0], 100, 50),
   [1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']),
  ('regression: balanced doubling halving',
   ([2.0, 0.5], 100, 10),
   [1.0, 1.25, [200.0, 100.0], None, 'stable']),
  ('control: steady growth',
   ([1.1, 1.2, 1.05], 50, 10),
   [1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']),
  ('regression: constant', ([1.0, 1.0, 1.0], 30, 5), [1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']),
  ('control: dip and recovery',
   ([0.4, 0.8, 3.0, 2.0], 100, 50),
   [1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']),
  ('control: invalid zero lambda', ([1.0, 0.0], 10, 1), None),
  ('control: first year crash',
   ([0.1, 1.5, 1.5], 100, 20),
   [0.60822, 1.033333, [10.0, 15.0, 22.5], 1, 'declining'])]]
for label, args, expected in fixtures[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
control: boom and bust[0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining'][0.866025, 1.0, [150.0, 75.0, 112.5, 56.25], None, 'declining']Passed
regression: exact halving to threshold[1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable'][1.0, 1.166667, [50.0, 50.0, 100.0], None, 'stable']Passed
regression: balanced doubling halving[1.0, 1.25, [200.0, 100.0], None, 'stable'][1.0, 1.25, [200.0, 100.0], None, 'stable']Passed
control: steady growth[1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing'][1.114947, 1.116667, [55.0, 66.0, 69.3], None, 'growing']Passed
regression: constant[1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable'][1.0, 1.0, [30.0, 30.0, 30.0], None, 'stable']Passed
control: dip and recovery[1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing'][1.177132, 1.55, [40.0, 32.0, 96.0, 192.0], 1, 'growing']Passed
control: invalid zero lambdaNoneNonePassed

SHA-256 / 99f8a06f3ee5e175ee54030082aa43e00df20d678844b1d1bc85e7ada8a25bc8

Verification & scope

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.

Observations recorded using Python 3.12.14 at 2026-09-29T14:47:36.473523+00:00.

Case digest / e9e194c45ea10ac47543f819e33e0e0e95eb04388d6a9b01c89700f23882c3b2