covtoken / tests /test_label_leak.py
Chucks90's picture
covtoken: label-free lesion-subspace token economy (reframed) + gated eval + paper draft
3510f1d verified
Raw
History Blame Contribute Delete
2.13 kB
"""CI gate: a lesion label/mask must NEVER be accessible during subspace construction.
This test must FAIL the build if any label read can occur inside
`subspace_construction_guard()` (IMPLEMENTATION_SPEC §5, CLAUDE.md). It exercises the
runtime guard directly and also simulates a subspace `fit` that wrongly tries to read a
label, asserting the guard stops it.
"""
import sys
from pathlib import Path
import pytest
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from data.leak_guard import ( # noqa: E402
LabelLeakError,
assert_label_free,
subspace_construction_guard,
)
from data.masks import label_from_manifest_record # noqa: E402
_REC = {
"slice_id": "s0",
"has_nodule": True,
"nodule_pixel_area": 42.0,
"nodule_diameter_mm": 8.1,
"label": "tumor",
}
def test_label_read_allowed_outside_construction():
# EVAL paths (outside subspace construction) may read labels freely.
lab = label_from_manifest_record(_REC)
assert lab.has_nodule is True
assert lab.label == "tumor"
def test_label_read_blocked_during_construction():
with subspace_construction_guard():
with pytest.raises(LabelLeakError):
label_from_manifest_record(_REC)
def test_raw_guard_raises_inside_construction():
with subspace_construction_guard():
with pytest.raises(LabelLeakError):
assert_label_free("lesion mask")
def test_guard_is_reentrant_and_restores():
with subspace_construction_guard():
with subspace_construction_guard():
with pytest.raises(LabelLeakError):
assert_label_free()
# outside again: no raise
assert_label_free()
def test_simulated_subspace_fit_with_leak_fails():
"""A subspace fit() that illegally reads a label must blow up via the guard."""
def bad_fit(token_bank, record):
with subspace_construction_guard():
# ILLEGAL: peeking at the lesion label to shape the subspace.
_ = label_from_manifest_record(record)
return token_bank.mean()
with pytest.raises(LabelLeakError):
bad_fit([1.0, 2.0], _REC)