"""Experiment role firewalls, immutable locks, checkpoint restoration and selection.""" import copy from pathlib import Path import pytest import torch from test_geometry_carrier_evaluation import fixture from mcss.dynamic.types import hash_value from mcss.mechanism_pilot.geometry_carrier_experiment import ( SceneData, load_checkpoint, make_carrier, require_fresh_lock, save_checkpoint, select_checkpoint, validate_split, verify_lock, ) from mcss.mechanism_pilot.small_training import sha, write_json def freeze_fixture(root, manifest): write_json(root / "scene_split.json", manifest) write_json(root / "training_contract.json", {"variants": ["C0", "C1"], "seeds": [7]}) write_json( root / "preregistration.json", { "status": "FROZEN_BEFORE_FORMAL_TRAINING", "input_sha256": { str(root / n): sha(root / n) for n in ("scene_split.json", "training_contract.json") }, "source_sha256": {str(Path(__file__).resolve()): sha(Path(__file__))}, }, ) def test_physical_identity_protected_and_exposure_firewall(tmp_path): manifest, _ = fixture(tmp_path) validate_split(manifest) duplicate = copy.deepcopy(manifest) duplicate["scenes"][1]["physical_scene_id"] = duplicate["scenes"][0]["physical_scene_id"] with pytest.raises(PermissionError, match="Duplicate"): validate_split(duplicate) protected = copy.deepcopy(manifest) protected["protected_scene_ids"].append(protected["scenes"][0]["scene_id"]) with pytest.raises(PermissionError, match="Protected"): validate_split(protected) exposed = copy.deepcopy(manifest) exposed["scenes"][0]["split"] = "FRESH_QUALIFICATION" exposed["scenes"][0]["independence_verified"] = True with pytest.raises(PermissionError, match="Exposed/unverified"): validate_split(exposed) def test_dev_target_denied_without_depth_read(tmp_path, monkeypatch): manifest, _ = fixture(tmp_path) data = SceneData(manifest["scenes"][0], manifest, tmp_path, "cpu", []) def denied(*a, **kw): raise AssertionError("DEV target media was read") monkeypatch.setattr(data.media, "read", denied) with pytest.raises(PermissionError, match="DEV/fresh target"): data.target(0) assert all(not hasattr(o, "depth") for o in data.context("A")) fresh = copy.deepcopy(manifest["scenes"][0]) fresh["split"] = "FRESH_QUALIFICATION" with pytest.raises(PermissionError, match="Fresh data"): SceneData(fresh, manifest, tmp_path, "cpu", []) def test_lock_mutation_and_fresh_selection_gate(tmp_path): manifest, _ = fixture(tmp_path) manifest["fresh_status"] = "BLOCKED_INDEPENDENCE_UNRESOLVED" freeze_fixture(tmp_path, manifest) assert verify_lock(tmp_path)[0] == manifest with pytest.raises(PermissionError, match="BLOCKED_INDEPENDENCE"): require_fresh_lock(tmp_path) write_json(tmp_path / "training_contract.json", {"steps": 1}) with pytest.raises(PermissionError, match="Frozen input/source changed"): verify_lock(tmp_path) def test_checkpoint_roundtrip_and_earliest_eligible_independent_selection(tmp_path): torch.set_num_threads(1) model = make_carrier(7, "cpu") digest = save_checkpoint( tmp_path / "model.pt", model, variant="C1", seed=7, step=100, lock_sha256="a" * 64 ) restored, payload = load_checkpoint(tmp_path / "model.pt", "cpu") assert digest == sha(tmp_path / "model.pt") assert hash_value(restored.state_dict()) == hash_value(model.state_dict()) assert payload["test_time_input"] == "RGB+CAMERA" and payload["writer_trained"] is False def candidate(step, score, eligible=True): return { "step": step, "query_absrel": score, "eligible": eligible, "partition": "DEV", "checkpoint": f"model{step}.pt", "checkpoint_sha256": "a" * 64, } selected = select_checkpoint( [candidate(300, 0.1), candidate(100, 0.1 + 1e-9), candidate(50, 0.01, False)] ) assert selected["selected_step"] == 100 assert select_checkpoint([candidate(20, 0.01, False)])["status"] == "NO_ELIGIBLE_CHECKPOINT" with pytest.raises(FileExistsError): save_checkpoint( tmp_path / "model.pt", model, variant="C1", seed=7, step=100, lock_sha256="a" * 64 ) def test_data_tampering_and_fresh_candidate_selection_rejected(tmp_path): from mcss.mechanism_pilot.geometry_carrier_experiment import verify_data data = tmp_path / "synthetic_data.bin" data.write_bytes(b"original") write_json(tmp_path / "preregistration.json", {"data_sha256": {str(data): sha(data)}}) verify_data(tmp_path) data.write_bytes(b"modified") with pytest.raises(PermissionError, match="Locked TRAIN/DEV data changed"): verify_data(tmp_path) with pytest.raises(PermissionError, match="DEV-only provenance"): select_checkpoint( [ { "partition": "FRESH_QUALIFICATION", "eligible": True, "query_absrel": 0.01, "step": 50, "checkpoint": "fresh.pt", "checkpoint_sha256": "a" * 64, } ] ) with pytest.raises(PermissionError, match="DEV-only provenance"): select_checkpoint([{"eligible": True, "query_absrel": 0.01}])