FA-65391 / Ecological population dynamics / Open access
Beverton-Holt recruitment convergence: first-hit latch · case 01
Convergence year is the last year inside the band instead of the first.
ROOT CAUSE
The hit year is overwritten every year the stock remains inside the band.
VERIFIED REPAIR
Restore the first-hit latch rule: `if hit is None and abs(n - eq) <= band:`.
Unsuccessful approach: Ignoring year 1 misses stocks that converge immediately.
Case contract
N[t+1] = r0*N/(1+(r0-1)*N/K); equilibrium K if r0>1 else 0; band = 0.01*K; hit = first year (0 = start) with |N-eq|<=band, else None; return [trajectory rounded 4, equilibrium, hit]; None for invalid inputs.
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(n0, r0, k, years):
if k <= 0 or r0 <= 0 or n0 < 0:
return None
eq = float(k) if r0 > 1 else 0.0
band = 0.01 * k
n = float(n0)
traj = []
hit = 0 if abs(n - eq) <= band else None
for year in range(1, years + 1):
n = r0 * n / (1 + (r0 - 1) * n / k)
traj.append(round(n, 4))
if abs(n - eq) <= band:
hit = year
return [traj, eq, hit]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: herring recruitment',
(50, 3.0, 1000, 10),
[[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783],
1000.0,
7]),
('control: slow approach',
(10, 1.5, 500, 12),
[[14.8515,
21.9512,
32.2196,
46.8208,
67.09,
94.3079,
129.2706,
171.709,
219.8186,
270.309,
319.1849,
362.9343],
500.0,
None]),
('regression: start at capacity', (1000, 2.0, 1000, 4), [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 0]),
('regression: start within band', (995, 2.0, 1000, 3), [[997.4937, 998.7453, 999.3723], 1000.0, 0]),
('control: replacement r0 one', (200, 1.0, 1000, 4), [[200.0, 200.0, 200.0, 200.0], 0.0, None]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1])],
[('regression: start within band', (995, 2.0, 1000, 3), [[997.4937, 998.7453, 999.3723], 1000.0, 0]),
('control: replacement r0 one', (200, 1.0, 1000, 4), [[200.0, 200.0, 200.0, 200.0], 0.0, None]),
('regression: declining r0 half',
(400, 0.5, 1000, 8),
[[250.0, 142.8571, 76.9231, 40.0, 20.4082, 10.3093, 5.1813, 2.5974], 0.0, 7]),
('regression: above capacity',
(3000, 2.5, 1000, 6),
[[1363.6364, 1119.403, 1044.5682, 1017.363, 1006.8736, 1002.7381], 1000.0, 5]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('control: never reaches band', (1, 1.2, 10000, 5), [[1.2, 1.4399, 1.7279, 2.0734, 2.4879], 10000.0, None]),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1])],
[('regression: herring recruitment',
(50, 3.0, 1000, 10),
[[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783],
1000.0,
7]),
('control: slow approach',
(10, 1.5, 500, 12),
[[14.8515,
21.9512,
32.2196,
46.8208,
67.09,
94.3079,
129.2706,
171.709,
219.8186,
270.309,
319.1849,
362.9343],
500.0,
None]),
('regression: above capacity',
(3000, 2.5, 1000, 6),
[[1363.6364, 1119.403, 1044.5682, 1017.363, 1006.8736, 1002.7381], 1000.0, 5]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('control: never reaches band', (1, 1.2, 10000, 5), [[1.2, 1.4399, 1.7279, 2.0734, 2.4879], 10000.0, None]),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1]),
('regression: small capacity',
(2, 4.0, 20, 6),
[[6.1538, 12.8, 17.5342, 19.3208, 19.8258, 19.9562], 20.0, 5])],
[('regression: herring recruitment',
(50, 3.0, 1000, 10),
[[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783],
1000.0,
7]),
('control: slow approach',
(10, 1.5, 500, 12),
[[14.8515,
21.9512,
32.2196,
46.8208,
67.09,
94.3079,
129.2706,
171.709,
219.8186,
270.309,
319.1849,
362.9343],
500.0,
None]),
('regression: start at capacity', (1000, 2.0, 1000, 4), [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 0]),
('control: replacement r0 one', (200, 1.0, 1000, 4), [[200.0, 200.0, 200.0, 200.0], 0.0, None]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1]),
('regression: small capacity',
(2, 4.0, 20, 6),
[[6.1538, 12.8, 17.5342, 19.3208, 19.8258, 19.9562], 20.0, 5])],
[('control: slow approach',
(10, 1.5, 500, 12),
[[14.8515,
21.9512,
32.2196,
46.8208,
67.09,
94.3079,
129.2706,
171.709,
219.8186,
270.309,
319.1849,
362.9343],
500.0,
None]),
('regression: start at capacity', (1000, 2.0, 1000, 4), [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 0]),
('regression: start within band', (995, 2.0, 1000, 3), [[997.4937, 998.7453, 999.3723], 1000.0, 0]),
('control: replacement r0 one', (200, 1.0, 1000, 4), [[200.0, 200.0, 200.0, 200.0], 0.0, None]),
('regression: declining r0 half',
(400, 0.5, 1000, 8),
[[250.0, 142.8571, 76.9231, 40.0, 20.4082, 10.3093, 5.1813, 2.5974], 0.0, 7]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1])]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: herring recruitment | [[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783], 1000.0, 10] | [[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783], 1000.0, 7] | Failed |
| control: slow approach | [[14.8515, 21.9512, 32.2196, 46.8208, 67.09, 94.3079, 129.2706, 171.709, 219.8186, 270.309, 319.1849, 362.9343], 500.0, None] | [[14.8515, 21.9512, 32.2196, 46.8208, 67.09, 94.3079, 129.2706, 171.709, 219.8186, 270.309, 319.1849, 362.9343], 500.0, None] | Passed |
| regression: start at capacity | [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 4] | [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 0] | Failed |
| regression: start within band | [[997.4937, 998.7453, 999.3723], 1000.0, 3] | [[997.4937, 998.7453, 999.3723], 1000.0, 0] | Failed |
| control: replacement r0 one | [[200.0, 200.0, 200.0, 200.0], 0.0, None] | [[200.0, 200.0, 200.0, 200.0], 0.0, None] | Passed |
| control: invalid r0 | None | None | Passed |
| regression: one year from band | [[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 4] | [[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1] | Failed |
SHA-256 / 342a2a1ab9fa740bc0526c7f8acbaa539ab2afbe912a2a617738ad913e59dcdf
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(n0, r0, k, years):
if k <= 0 or r0 <= 0 or n0 < 0:
return None
eq = float(k) if r0 > 1 else 0.0
band = 0.01 * k
n = float(n0)
traj = []
hit = 0 if abs(n - eq) <= band else None
for year in range(1, years + 1):
n = r0 * n / (1 + (r0 - 1) * n / k)
traj.append(round(n, 4))
if hit is None and abs(n - eq) <= band and year > 1:
hit = year
return [traj, eq, hit]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: herring recruitment',
(50, 3.0, 1000, 10),
[[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783],
1000.0,
7]),
('control: slow approach',
(10, 1.5, 500, 12),
[[14.8515,
21.9512,
32.2196,
46.8208,
67.09,
94.3079,
129.2706,
171.709,
219.8186,
270.309,
319.1849,
362.9343],
500.0,
None]),
('regression: start at capacity', (1000, 2.0, 1000, 4), [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 0]),
('regression: start within band', (995, 2.0, 1000, 3), [[997.4937, 998.7453, 999.3723], 1000.0, 0]),
('control: replacement r0 one', (200, 1.0, 1000, 4), [[200.0, 200.0, 200.0, 200.0], 0.0, None]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1])],
[('regression: start within band', (995, 2.0, 1000, 3), [[997.4937, 998.7453, 999.3723], 1000.0, 0]),
('control: replacement r0 one', (200, 1.0, 1000, 4), [[200.0, 200.0, 200.0, 200.0], 0.0, None]),
('regression: declining r0 half',
(400, 0.5, 1000, 8),
[[250.0, 142.8571, 76.9231, 40.0, 20.4082, 10.3093, 5.1813, 2.5974], 0.0, 7]),
('regression: above capacity',
(3000, 2.5, 1000, 6),
[[1363.6364, 1119.403, 1044.5682, 1017.363, 1006.8736, 1002.7381], 1000.0, 5]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('control: never reaches band', (1, 1.2, 10000, 5), [[1.2, 1.4399, 1.7279, 2.0734, 2.4879], 10000.0, None]),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1])],
[('regression: herring recruitment',
(50, 3.0, 1000, 10),
[[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783],
1000.0,
7]),
('control: slow approach',
(10, 1.5, 500, 12),
[[14.8515,
21.9512,
32.2196,
46.8208,
67.09,
94.3079,
129.2706,
171.709,
219.8186,
270.309,
319.1849,
362.9343],
500.0,
None]),
('regression: above capacity',
(3000, 2.5, 1000, 6),
[[1363.6364, 1119.403, 1044.5682, 1017.363, 1006.8736, 1002.7381], 1000.0, 5]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('control: never reaches band', (1, 1.2, 10000, 5), [[1.2, 1.4399, 1.7279, 2.0734, 2.4879], 10000.0, None]),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1]),
('regression: small capacity',
(2, 4.0, 20, 6),
[[6.1538, 12.8, 17.5342, 19.3208, 19.8258, 19.9562], 20.0, 5])],
[('regression: herring recruitment',
(50, 3.0, 1000, 10),
[[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783],
1000.0,
7]),
('control: slow approach',
(10, 1.5, 500, 12),
[[14.8515,
21.9512,
32.2196,
46.8208,
67.09,
94.3079,
129.2706,
171.709,
219.8186,
270.309,
319.1849,
362.9343],
500.0,
None]),
('regression: start at capacity', (1000, 2.0, 1000, 4), [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 0]),
('control: replacement r0 one', (200, 1.0, 1000, 4), [[200.0, 200.0, 200.0, 200.0], 0.0, None]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1]),
('regression: small capacity',
(2, 4.0, 20, 6),
[[6.1538, 12.8, 17.5342, 19.3208, 19.8258, 19.9562], 20.0, 5])],
[('control: slow approach',
(10, 1.5, 500, 12),
[[14.8515,
21.9512,
32.2196,
46.8208,
67.09,
94.3079,
129.2706,
171.709,
219.8186,
270.309,
319.1849,
362.9343],
500.0,
None]),
('regression: start at capacity', (1000, 2.0, 1000, 4), [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 0]),
('regression: start within band', (995, 2.0, 1000, 3), [[997.4937, 998.7453, 999.3723], 1000.0, 0]),
('control: replacement r0 one', (200, 1.0, 1000, 4), [[200.0, 200.0, 200.0, 200.0], 0.0, None]),
('regression: declining r0 half',
(400, 0.5, 1000, 8),
[[250.0, 142.8571, 76.9231, 40.0, 20.4082, 10.3093, 5.1813, 2.5974], 0.0, 7]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1])]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: herring recruitment | [[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783], 1000.0, 7] | [[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783], 1000.0, 7] | Passed |
| control: slow approach | [[14.8515, 21.9512, 32.2196, 46.8208, 67.09, 94.3079, 129.2706, 171.709, 219.8186, 270.309, 319.1849, 362.9343], 500.0, None] | [[14.8515, 21.9512, 32.2196, 46.8208, 67.09, 94.3079, 129.2706, 171.709, 219.8186, 270.309, 319.1849, 362.9343], 500.0, None] | Passed |
| regression: start at capacity | [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 0] | [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 0] | Passed |
| regression: start within band | [[997.4937, 998.7453, 999.3723], 1000.0, 0] | [[997.4937, 998.7453, 999.3723], 1000.0, 0] | Passed |
| control: replacement r0 one | [[200.0, 200.0, 200.0, 200.0], 0.0, None] | [[200.0, 200.0, 200.0, 200.0], 0.0, None] | Passed |
| control: invalid r0 | None | None | Passed |
| regression: one year from band | [[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 2] | [[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1] | Failed |
SHA-256 / a5afa9985543d82b7f55606591bcb9d76a88e6c5ab35da50b5e078cd97d517b7
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(n0, r0, k, years):
if k <= 0 or r0 <= 0 or n0 < 0:
return None
eq = float(k) if r0 > 1 else 0.0
band = 0.01 * k
n = float(n0)
traj = []
hit = 0 if abs(n - eq) <= band else None
for year in range(1, years + 1):
n = r0 * n / (1 + (r0 - 1) * n / k)
traj.append(round(n, 4))
if hit is None and abs(n - eq) <= band:
hit = year
return [traj, eq, hit]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: herring recruitment',
(50, 3.0, 1000, 10),
[[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783],
1000.0,
7]),
('control: slow approach',
(10, 1.5, 500, 12),
[[14.8515,
21.9512,
32.2196,
46.8208,
67.09,
94.3079,
129.2706,
171.709,
219.8186,
270.309,
319.1849,
362.9343],
500.0,
None]),
('regression: start at capacity', (1000, 2.0, 1000, 4), [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 0]),
('regression: start within band', (995, 2.0, 1000, 3), [[997.4937, 998.7453, 999.3723], 1000.0, 0]),
('control: replacement r0 one', (200, 1.0, 1000, 4), [[200.0, 200.0, 200.0, 200.0], 0.0, None]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1])],
[('regression: start within band', (995, 2.0, 1000, 3), [[997.4937, 998.7453, 999.3723], 1000.0, 0]),
('control: replacement r0 one', (200, 1.0, 1000, 4), [[200.0, 200.0, 200.0, 200.0], 0.0, None]),
('regression: declining r0 half',
(400, 0.5, 1000, 8),
[[250.0, 142.8571, 76.9231, 40.0, 20.4082, 10.3093, 5.1813, 2.5974], 0.0, 7]),
('regression: above capacity',
(3000, 2.5, 1000, 6),
[[1363.6364, 1119.403, 1044.5682, 1017.363, 1006.8736, 1002.7381], 1000.0, 5]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('control: never reaches band', (1, 1.2, 10000, 5), [[1.2, 1.4399, 1.7279, 2.0734, 2.4879], 10000.0, None]),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1])],
[('regression: herring recruitment',
(50, 3.0, 1000, 10),
[[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783],
1000.0,
7]),
('control: slow approach',
(10, 1.5, 500, 12),
[[14.8515,
21.9512,
32.2196,
46.8208,
67.09,
94.3079,
129.2706,
171.709,
219.8186,
270.309,
319.1849,
362.9343],
500.0,
None]),
('regression: above capacity',
(3000, 2.5, 1000, 6),
[[1363.6364, 1119.403, 1044.5682, 1017.363, 1006.8736, 1002.7381], 1000.0, 5]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('control: never reaches band', (1, 1.2, 10000, 5), [[1.2, 1.4399, 1.7279, 2.0734, 2.4879], 10000.0, None]),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1]),
('regression: small capacity',
(2, 4.0, 20, 6),
[[6.1538, 12.8, 17.5342, 19.3208, 19.8258, 19.9562], 20.0, 5])],
[('regression: herring recruitment',
(50, 3.0, 1000, 10),
[[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783],
1000.0,
7]),
('control: slow approach',
(10, 1.5, 500, 12),
[[14.8515,
21.9512,
32.2196,
46.8208,
67.09,
94.3079,
129.2706,
171.709,
219.8186,
270.309,
319.1849,
362.9343],
500.0,
None]),
('regression: start at capacity', (1000, 2.0, 1000, 4), [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 0]),
('control: replacement r0 one', (200, 1.0, 1000, 4), [[200.0, 200.0, 200.0, 200.0], 0.0, None]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1]),
('regression: small capacity',
(2, 4.0, 20, 6),
[[6.1538, 12.8, 17.5342, 19.3208, 19.8258, 19.9562], 20.0, 5])],
[('control: slow approach',
(10, 1.5, 500, 12),
[[14.8515,
21.9512,
32.2196,
46.8208,
67.09,
94.3079,
129.2706,
171.709,
219.8186,
270.309,
319.1849,
362.9343],
500.0,
None]),
('regression: start at capacity', (1000, 2.0, 1000, 4), [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 0]),
('regression: start within band', (995, 2.0, 1000, 3), [[997.4937, 998.7453, 999.3723], 1000.0, 0]),
('control: replacement r0 one', (200, 1.0, 1000, 4), [[200.0, 200.0, 200.0, 200.0], 0.0, None]),
('regression: declining r0 half',
(400, 0.5, 1000, 8),
[[250.0, 142.8571, 76.9231, 40.0, 20.4082, 10.3093, 5.1813, 2.5974], 0.0, 7]),
('control: invalid r0', (100, 0.0, 1000, 5), None),
('regression: one year from band',
(985, 2.0, 1000, 4),
[[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1])]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: herring recruitment | [[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783], 1000.0, 7] | [[136.3636, 321.4286, 586.9565, 810.0, 927.4809, 974.5989, 991.3871, 997.1125, 999.0356, 999.6783], 1000.0, 7] | Passed |
| control: slow approach | [[14.8515, 21.9512, 32.2196, 46.8208, 67.09, 94.3079, 129.2706, 171.709, 219.8186, 270.309, 319.1849, 362.9343], 500.0, None] | [[14.8515, 21.9512, 32.2196, 46.8208, 67.09, 94.3079, 129.2706, 171.709, 219.8186, 270.309, 319.1849, 362.9343], 500.0, None] | Passed |
| regression: start at capacity | [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 0] | [[1000.0, 1000.0, 1000.0, 1000.0], 1000.0, 0] | Passed |
| regression: start within band | [[997.4937, 998.7453, 999.3723], 1000.0, 0] | [[997.4937, 998.7453, 999.3723], 1000.0, 0] | Passed |
| control: replacement r0 one | [[200.0, 200.0, 200.0, 200.0], 0.0, None] | [[200.0, 200.0, 200.0, 200.0], 0.0, None] | Passed |
| control: invalid r0 | None | None | Passed |
| regression: one year from band | [[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1] | [[992.4433, 996.2073, 998.1001, 999.0491], 1000.0, 1] | Passed |
SHA-256 / fecf9ba31578ce23f8eddf2bd0d8850f1670670dccb0a46acadc936ad35b1b6d
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:33.396929+00:00.
Case digest / c2859d7305616724bd3e69fe224a91e424192626d543e53da71ab6c16ca4742d