def trace(rows):
    if any(row["unit"] != "s" for row in rows) or any(a["output"] != b["input"] for a, b in zip(rows, rows[1:])):
        raise ValueError("incompatible stack boundary")
    duration = sum(row["duration"] for row in rows)
    success = 1.0
    for row in rows:
        success *= 1 - row["failure"]
    return duration, 1 - success, max(rows, key=lambda row:row["duration"])["stage"]
rows = [
 {"stage":"compile","input":"program","output":"job","duration":.04,"failure":.001,"unit":"s","source":"synthetic"},
 {"stage":"queue","input":"job","output":"scheduled","duration":.20,"failure":.002,"unit":"s","source":"synthetic"},
 {"stage":"control","input":"scheduled","output":"samples","duration":.006,"failure":.003,"unit":"s","source":"synthetic"},
 {"stage":"readout","input":"samples","output":"bits","duration":.003,"failure":.004,"unit":"s","source":"synthetic"},
 {"stage":"decode","input":"bits","output":"estimate","duration":.004,"failure":.001,"unit":"s","source":"synthetic"},
]
baseline = trace(rows)
counterfactual = trace([{**row, "duration":.02} if row["stage"] == "queue" else row for row in rows])
try:
    trace([rows[0], {**rows[1], "input":"pulse"}])
    raise AssertionError("bad boundary accepted")
except ValueError:
    rejected = True
assert abs(baseline[0] - .253) < 1e-12 and baseline[2] == "queue"
assert counterfactual[0] < baseline[0] and 0 < baseline[1] < .02 and rejected
print(f"PASS: 54 stack evidence total={baseline[0]:.3f}s failure={baseline[1]:.6f} faster_queue={counterfactual[0]:.3f}s")
