FA-65236 / Epidemic compartment models / Open access
SIR with Erlang-distributed infectious period: seeding stage · case 01
Seeds recover almost immediately.
ROOT CAUSE
Index cases are placed in the final stage.
VERIFIED REPAIR
Restore the seeding stage rule: `stages[0] = float(i0)`.
Unsuccessful approach: Spreading seeds across stages shortens their remaining infectious time.
Case contract
Infectious period split into k sequential stages each left at rate k*gamma; seeds start in stage 1; all stages transmit; Euler with dt=0.1 (10 substeps/day); return [total I at day ends including day 0 rounded 3, R rounded 3], None for k<1.
Why this case matters
Compartmental epidemic calculations drive outbreak forecasts, vaccine targets and hospital planning; a single wrong flow, rate conversion or boundary silently changes every downstream number.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(beta, gamma, k, pop, i0, days):
if k < 1:
return None
stages = [0.0] * k
stages[-1] = float(i0)
s = float(pop - i0)
r = 0.0
dt = 0.1
series = [round(sum(stages), 3)]
for _ in range(days):
for _ in range(10):
i = sum(stages)
inf = beta * s * i / pop * dt
flows = [k * gamma * x * dt for x in stages]
s -= inf
stages[0] += inf - flows[0]
for j in range(1, k):
stages[j] += flows[j - 1] - flows[j]
r += flows[-1]
series.append(round(sum(stages), 3))
return [series, round(r, 3)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: three stages',
(0.5, 0.2, 3, 1000, 10, 6),
[[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589]),
('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: many stages', (0.6, 0.3, 5, 800, 20, 4), [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142]),
('regression: no transmission',
(0.0, 0.5, 2, 100, 10, 5),
[[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('regression: two stages slow',
(0.3, 0.1, 2, 2000, 30, 7),
[[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058]),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0])],
[('regression: three stages',
(0.5, 0.2, 3, 1000, 10, 6),
[[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589]),
('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: no transmission',
(0.0, 0.5, 2, 100, 10, 5),
[[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('regression: two stages slow',
(0.3, 0.1, 2, 2000, 30, 7),
[[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058]),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0]),
('regression: four stages fast recovery',
(0.9, 0.5, 4, 300, 6, 5),
[[6.0, 12.89, 21.627, 33.085, 46.281, 57.492], 51.385])],
[('regression: three stages',
(0.5, 0.2, 3, 1000, 10, 6),
[[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589]),
('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: many stages', (0.6, 0.3, 5, 800, 20, 4), [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142]),
('regression: no transmission',
(0.0, 0.5, 2, 100, 10, 5),
[[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0]),
('regression: four stages fast recovery',
(0.9, 0.5, 4, 300, 6, 5),
[[6.0, 12.89, 21.627, 33.085, 46.281, 57.492], 51.385])],
[('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: many stages', (0.6, 0.3, 5, 800, 20, 4), [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142]),
('regression: no transmission',
(0.0, 0.5, 2, 100, 10, 5),
[[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('regression: two stages slow',
(0.3, 0.1, 2, 2000, 30, 7),
[[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058]),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0]),
('regression: four stages fast recovery',
(0.9, 0.5, 4, 300, 6, 5),
[[6.0, 12.89, 21.627, 33.085, 46.281, 57.492], 51.385])],
[('regression: three stages',
(0.5, 0.2, 3, 1000, 10, 6),
[[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589]),
('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: many stages', (0.6, 0.3, 5, 800, 20, 4), [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('regression: two stages slow',
(0.3, 0.1, 2, 2000, 30, 7),
[[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058]),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0]),
('regression: four stages fast recovery',
(0.9, 0.5, 4, 300, 6, 5),
[[6.0, 12.89, 21.627, 33.085, 46.281, 57.492], 51.385])]]
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: three stages | [[10.0, 10.248, 13.049, 18.199, 25.976, 37.069, 52.463], 20.846] | [[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589] | Failed |
| control: single stage equals SIR | [[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032] | [[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032] | Passed |
| regression: many stages | [[20.0, 12.676, 17.052, 25.478, 37.114], 28.461] | [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142] | Failed |
| regression: no transmission | [[10.0, 3.487, 1.216, 0.424, 0.148, 0.052], 9.948] | [[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662] | Failed |
| control: invalid k | None | None | Passed |
| regression: two stages slow | [[30.0, 33.769, 39.592, 47.628, 58.147, 71.521, 88.209, 108.735], 36.784] | [[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058] | Failed |
| control: boundary zero days | [[5.0], 0.0] | [[5.0], 0.0] | Passed |
SHA-256 / 290e457e1947c6793a7f7f0bb4d97430e277d94526185c9b683fffd8e8e675f8
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(beta, gamma, k, pop, i0, days):
if k < 1:
return None
stages = [0.0] * k
stages = [float(i0) / k] * k
s = float(pop - i0)
r = 0.0
dt = 0.1
series = [round(sum(stages), 3)]
for _ in range(days):
for _ in range(10):
i = sum(stages)
inf = beta * s * i / pop * dt
flows = [k * gamma * x * dt for x in stages]
s -= inf
stages[0] += inf - flows[0]
for j in range(1, k):
stages[j] += flows[j - 1] - flows[j]
r += flows[-1]
series.append(round(sum(stages), 3))
return [series, round(r, 3)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: three stages',
(0.5, 0.2, 3, 1000, 10, 6),
[[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589]),
('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: many stages', (0.6, 0.3, 5, 800, 20, 4), [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142]),
('regression: no transmission',
(0.0, 0.5, 2, 100, 10, 5),
[[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('regression: two stages slow',
(0.3, 0.1, 2, 2000, 30, 7),
[[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058]),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0])],
[('regression: three stages',
(0.5, 0.2, 3, 1000, 10, 6),
[[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589]),
('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: no transmission',
(0.0, 0.5, 2, 100, 10, 5),
[[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('regression: two stages slow',
(0.3, 0.1, 2, 2000, 30, 7),
[[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058]),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0]),
('regression: four stages fast recovery',
(0.9, 0.5, 4, 300, 6, 5),
[[6.0, 12.89, 21.627, 33.085, 46.281, 57.492], 51.385])],
[('regression: three stages',
(0.5, 0.2, 3, 1000, 10, 6),
[[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589]),
('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: many stages', (0.6, 0.3, 5, 800, 20, 4), [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142]),
('regression: no transmission',
(0.0, 0.5, 2, 100, 10, 5),
[[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0]),
('regression: four stages fast recovery',
(0.9, 0.5, 4, 300, 6, 5),
[[6.0, 12.89, 21.627, 33.085, 46.281, 57.492], 51.385])],
[('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: many stages', (0.6, 0.3, 5, 800, 20, 4), [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142]),
('regression: no transmission',
(0.0, 0.5, 2, 100, 10, 5),
[[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('regression: two stages slow',
(0.3, 0.1, 2, 2000, 30, 7),
[[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058]),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0]),
('regression: four stages fast recovery',
(0.9, 0.5, 4, 300, 6, 5),
[[6.0, 12.89, 21.627, 33.085, 46.281, 57.492], 51.385])],
[('regression: three stages',
(0.5, 0.2, 3, 1000, 10, 6),
[[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589]),
('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: many stages', (0.6, 0.3, 5, 800, 20, 4), [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('regression: two stages slow',
(0.3, 0.1, 2, 2000, 30, 7),
[[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058]),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0]),
('regression: four stages fast recovery',
(0.9, 0.5, 4, 300, 6, 5),
[[6.0, 12.89, 21.627, 33.085, 46.281, 57.492], 51.385])]]
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: three stages | [[10.0, 13.673, 19.336, 27.655, 39.493, 55.93, 78.149], 23.865] | [[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589] | Failed |
| control: single stage equals SIR | [[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032] | [[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032] | Passed |
| regression: many stages | [[20.0, 27.334, 39.271, 56.589, 79.557], 33.109] | [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142] | Failed |
| regression: no transmission | [[10.0, 5.424, 2.567, 1.13, 0.476, 0.195], 9.805] | [[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662] | Failed |
| control: invalid k | None | None | Passed |
| regression: two stages slow | [[30.0, 36.657, 45.261, 56.165, 69.803, 86.683, 107.374, 132.48], 33.427] | [[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058] | Failed |
| control: boundary zero days | [[5.0], 0.0] | [[5.0], 0.0] | Passed |
SHA-256 / 9d9e18a63e3a5c3d43ce59fb3c7ba76481a2e41ce3e078dd3a1a5ebded196703
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(beta, gamma, k, pop, i0, days):
if k < 1:
return None
stages = [0.0] * k
stages[0] = float(i0)
s = float(pop - i0)
r = 0.0
dt = 0.1
series = [round(sum(stages), 3)]
for _ in range(days):
for _ in range(10):
i = sum(stages)
inf = beta * s * i / pop * dt
flows = [k * gamma * x * dt for x in stages]
s -= inf
stages[0] += inf - flows[0]
for j in range(1, k):
stages[j] += flows[j - 1] - flows[j]
r += flows[-1]
series.append(round(sum(stages), 3))
return [series, round(r, 3)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: three stages',
(0.5, 0.2, 3, 1000, 10, 6),
[[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589]),
('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: many stages', (0.6, 0.3, 5, 800, 20, 4), [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142]),
('regression: no transmission',
(0.0, 0.5, 2, 100, 10, 5),
[[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('regression: two stages slow',
(0.3, 0.1, 2, 2000, 30, 7),
[[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058]),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0])],
[('regression: three stages',
(0.5, 0.2, 3, 1000, 10, 6),
[[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589]),
('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: no transmission',
(0.0, 0.5, 2, 100, 10, 5),
[[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('regression: two stages slow',
(0.3, 0.1, 2, 2000, 30, 7),
[[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058]),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0]),
('regression: four stages fast recovery',
(0.9, 0.5, 4, 300, 6, 5),
[[6.0, 12.89, 21.627, 33.085, 46.281, 57.492], 51.385])],
[('regression: three stages',
(0.5, 0.2, 3, 1000, 10, 6),
[[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589]),
('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: many stages', (0.6, 0.3, 5, 800, 20, 4), [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142]),
('regression: no transmission',
(0.0, 0.5, 2, 100, 10, 5),
[[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0]),
('regression: four stages fast recovery',
(0.9, 0.5, 4, 300, 6, 5),
[[6.0, 12.89, 21.627, 33.085, 46.281, 57.492], 51.385])],
[('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: many stages', (0.6, 0.3, 5, 800, 20, 4), [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142]),
('regression: no transmission',
(0.0, 0.5, 2, 100, 10, 5),
[[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('regression: two stages slow',
(0.3, 0.1, 2, 2000, 30, 7),
[[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058]),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0]),
('regression: four stages fast recovery',
(0.9, 0.5, 4, 300, 6, 5),
[[6.0, 12.89, 21.627, 33.085, 46.281, 57.492], 51.385])],
[('regression: three stages',
(0.5, 0.2, 3, 1000, 10, 6),
[[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589]),
('control: single stage equals SIR',
(0.4, 0.25, 1, 500, 5, 5),
[[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032]),
('regression: many stages', (0.6, 0.3, 5, 800, 20, 4), [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142]),
('control: invalid k', (0.5, 0.2, 0, 100, 5, 3), None),
('regression: two stages slow',
(0.3, 0.1, 2, 2000, 30, 7),
[[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058]),
('control: boundary zero days', (0.5, 0.2, 3, 100, 5, 0), [[5.0], 0.0]),
('regression: four stages fast recovery',
(0.9, 0.5, 4, 300, 6, 5),
[[6.0, 12.89, 21.627, 33.085, 46.281, 57.492], 51.385])]]
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: three stages | [[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589] | [[10.0, 15.964, 24.203, 35.419, 50.774, 71.593, 99.086], 25.589] | Passed |
| control: single stage equals SIR | [[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032] | [[5.0, 5.776, 6.66, 7.664, 8.798, 10.074], 9.032] | Passed |
| regression: many stages | [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142] | [[20.0, 34.937, 55.691, 80.709, 110.985], 33.142] | Passed |
| regression: no transmission | [[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662] | [[10.0, 7.361, 3.917, 1.837, 0.805, 0.338], 9.662] | Passed |
| control: invalid k | None | None | Passed |
| regression: two stages slow | [[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058] | [[30.0, 39.545, 50.929, 64.696, 81.433, 101.776, 126.384, 155.912], 30.058] | Passed |
| control: boundary zero days | [[5.0], 0.0] | [[5.0], 0.0] | Passed |
SHA-256 / 147f167b1673c9402d4dd9a045605c63c60b05540ca136797ab231ba52f3d3c5
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:32.028923+00:00.
Case digest / 94ff66aff55d6280375abdb5116534ee7e85013307dbb138e911aa7a028f5274