Source: scripts/audit_opportunity_probe.py · Plain text

scripts/audit_opportunity_probe.py

"""Independently verify raw coverage, locked decisions, media isolation and regeneration."""

from __future__ import annotations

import json
from pathlib import Path

import numpy as np

from mcss.vision_probe.opportunity_analysis import analyze
from mcss.vision_probe.opportunity_runner import (
    CONFIG,
    DATA,
    REPORT,
    TRAJECTORIES,
    WORK,
    load_rows,
    read_json,
    sha,
    verify_lock,
    write_json,
)
from mcss.vision_probe.opportunity_selectors import select_candidates


def main():
    verify_lock()
    rows = load_rows(REPORT / "raw_results.jsonl")
    splits = read_json(REPORT / "split_manifest.json")
    artifact = read_json(REPORT / "selectors.json")
    checks = {}
    expected = {
        (size, split, name, slot, tuple(t))
        for size in CONFIG["resolutions"]
        for split in ("discovery", "validation")
        for name in splits[split]
        for slot in (1, 2)
        for t in TRAJECTORIES
    }
    actual = [
        (r["resolution"], r["split"], r["sequence"], r["target_slot"], tuple(r["trajectory"]))
        for r in rows
    ]
    checks["exact_raw_coverage"] = len(actual) == len(set(actual)) and set(actual) == expected
    checks["selector_training_identity"] = artifact["fit_split"] == "discovery" and set(
        artifact["training_sequences"]
    ) == set(splits["discovery"])
    checks["all_numeric_metrics_finite"] = all(
        np.isfinite(r[k]) for r in rows for k in ("J", "F", "JF", "token_iou")
    )
    checks["off_has_zero_write"] = all(
        all(a["norm"] == 0 for a in r["rank_audit"])
        for r in rows
        if r["trajectory"] == ["OFF", "OFF"]
    )
    valid_decisions = {
        (r["resolution"], r["sequence"], r["target_slot"]): r
        for r in load_rows(REPORT / "validation_decisions.jsonl")
    }
    checks["decisions_match_locked_inference"] = True
    checks["decisions_committed_before_target_gt"] = True
    for size in CONFIG["resolutions"]:
        for split in ("discovery", "validation"):
            for name in splits[split]:
                for slot in (1, 2):
                    pair = [
                        r
                        for r in rows
                        if (r["resolution"], r["split"], r["sequence"], r["target_slot"])
                        == (size, split, name, slot)
                    ]
                    if len(pair) != 16:
                        checks["decisions_match_locked_inference"] = False
                        continue
                    choice = select_candidates(
                        [r["visible"] for r in pair],
                        [r["trajectory"] for r in pair],
                        artifact["by_resolution"][str(size)],
                    )
                    for method, index in choice.items():
                        selected = [
                            i for i, r in enumerate(pair) if method in r["selected_methods"]
                        ]
                        checks["decisions_match_locked_inference"] &= selected == [index]
                    if split == "validation":
                        decision = valid_decisions.get((size, name, slot), {})
                        checks["decisions_committed_before_target_gt"] &= (
                            decision.get("before_target_gt") is True
                            and decision.get("choices") == choice
                        )
    seen = {}
    for row in rows:
        if row["sequence"] not in splits[row["split"]]:
            raise ValueError("Unauthorized input identity")
        for role in ("source", "target"):
            stem = Path(row[f"{role}_frame"]).stem
            seen[DATA / "JPEGImages/480p" / row["sequence"] / row[f"{role}_frame"]] = row[
                f"{role}_image_sha256"
            ]
            seen[DATA / "Annotations/480p" / row["sequence"] / (stem + ".png")] = row[
                f"{role}_mask_sha256"
            ]
    checks["input_hashes_match"] = all(sha(path) == value for path, value in seen.items())
    forbidden = set(splits["reserve"]) | set(splits["official_val_sealed"])
    events = []
    for stage in ("discovery", "validation"):
        events += read_json(REPORT / f"access_audit_{stage}.json")
    paths = [e["path"] for e in events if "path" in e]
    checks["no_sealed_media_access"] = all(
        len(Path(p).parts) >= 3 and Path(p).parts[2] not in forbidden for p in paths
    )
    checks["audited_media_access_present"] = bool(paths)
    checks["raw_hash_matches_validation_completion"] = (
        sha(REPORT / "raw_results.jsonl")
        == read_json(REPORT / "validation_complete.json")["raw_sha256"]
    )
    test = read_json(REPORT / "tests.json")
    checks["full_test_suite_passed"] = test["exit_code"] == 0
    regen = WORK / "independent_regeneration"
    analyze(REPORT / "raw_results.jsonl", regen, CONFIG, artifact)
    outputs = [
        "per_pair_results.csv",
        "per_sequence_results.csv",
        "oracle_analysis.json",
        "selector_analysis.json",
        "robustness_analysis.json",
        "bootstrap_results.json",
        "signal_analysis.json",
        "rank_analysis.json",
        "signal_scatter.csv",
        "visible_features.csv",
    ]
    checks["all_analyses_exactly_reproduced"] = all(
        sha(REPORT / name) == sha(regen / name) for name in outputs
    )
    result = {
        "FINAL_INTEGRITY": "PASS" if all(checks.values()) else "FAIL",
        "checks": checks,
        "raw_rows": len(rows),
        "validation_pairs": len(valid_decisions),
        "verified_input_files": len(seen),
        "validation_gt_used_for_selection": False,
        "davis_official_val_touched": False,
        "reserve_touched": False,
        "raw_sha256": sha(REPORT / "raw_results.jsonl"),
        "analysis_sha256": {name: sha(REPORT / name) for name in outputs},
    }
    write_json(REPORT / "integrity.json", result)
    print(json.dumps(result, indent=2))
    if not all(checks.values()):
        raise SystemExit(1)


if __name__ == "__main__":
    main()