Source: scripts/audit_optimization_bounds.py · Plain text

scripts/audit_optimization_bounds.py

"""Independent post-run budget/bounds audit; saved artifacts only, no model execution."""

import argparse
import csv
import hashlib
import json
from collections import defaultdict
from pathlib import Path

import numpy as np
import torch
from PIL import Image

from mcss.dynamic.types import hash_scene_state, hash_value
from mcss.geometry import transform_cameras
from mcss.mechanism_pilot.small_training import sha, write_json
from mcss.mechanism_pilot.statistics import measurement_metrics
from mcss.types import Cameras

METRICS = (
    "rgb_mse",
    "rgb_ssim",
    "depth_absrel",
    "depth_rmse",
    "depth_delta1",
    "opacity",
    "coverage",
)
PHASES = ("context", "oracle", "secondary")


def read(path):
    return json.loads(Path(path).read_text())


def assert_hashes(mapping):
    for path, value in mapping.items():
        assert sha(Path(path)) == value, f"Frozen hash changed: {path}"


def independent_plateau(checks, trace, budget):
    window = [r for r in checks if 0.9 * budget <= r["step"] <= budget]
    gradients = [
        float(r["gradient_norm_before_clip"])
        for r in trace
        if 0.9 * budget <= int(r["step"]) <= budget
    ]
    assert len(window) >= 2 and len(gradients) >= 4
    objective_change = (window[0]["context_objective"] - window[-1]["context_objective"]) / max(
        abs(window[0]["context_objective"]), 1e-8
    )
    half = len(gradients) // 2
    before, after = float(np.median(gradients[:half])), float(np.median(gradients[half:]))
    gradient_change = abs(after - before) / max(abs(before), 1e-8)
    return {
        "relative_objective_improvement": objective_change,
        "relative_gradient_median_abs_change": gradient_change,
        "plateau": abs(objective_change) <= 0.001 and gradient_change <= 0.10,
        "n_trace_gradients": len(gradients),
        "checkpoint_steps": [r["step"] for r in window],
    }


def run(root):
    root = Path(root)
    destination = root / "audit/postrun_validation.json"
    if destination.exists():
        raise FileExistsError(destination)
    config, plan, manifest, prereg = (
        read(root / f"{name}.json")
        for name in ("config", "state_plan", "scene_manifest", "preregistration")
    )
    for name, digest in prereg["locked_file_sha256"].items():
        assert sha(root / name) == digest
    assert_hashes(config["source_sha256"])
    assert config["state_plan_sha256"] == sha(root / "state_plan.json")
    assert config["scene_manifest_sha256"] == sha(root / "scene_manifest.json")
    records = {r["scene_id"]: r for r in manifest["scenes"]}
    holdout = set(manifest["FINAL_HOLDOUT_PROHIBITED"])
    assert len(records) == 17 and len(holdout) == 12 and not set(records) & holdout
    assert all(r["cohort_role"] == "CAPACITY_DEV_EXPOSED" for r in records.values())
    chains, states = plan["chains"], plan["states"]
    aggregate_path = root / "raw/trajectory_summaries.json"
    if aggregate_path.exists():
        aggregate = read(aggregate_path)
        assert set(aggregate) == {c["key"] for c in chains}
        assert all(aggregate[c["key"]]["spec"] == c for c in chains)

    assert len(chains) == 153 and len(states) == 782
    assert len({c["key"] for c in chains}) == 153 and len({s["key"] for s in states}) == 782
    assert config["primary"] == {
        "track": "RGBD",
        "bounds_mode": "FROZEN_GT_FREE_BOUNDS",
        "budget": 10000,
        "selection": "FIXED_BUDGET",
    }
    budget_lock = read(root / "optimization_budget_lock.json")
    assert budget_lock["budgets"] == [1000, 3000, 10000]
    assert budget_lock["optimizer_loss_unchanged"] == config["optimization"]
    for phase in PHASES:
        complete = read(root / f"{phase}_optimization_complete.json")
        assert complete["status"] == "PASS" and complete["phase"] == phase
        assert complete["chains"] == sum(c["phase"] == phase for c in chains)
        assert complete["states"] == sum(s["phase"] == phase for s in states)
        assert complete["all_budgets_complete_before_query_evaluation"]
        assert not complete["final_holdout_touched"] and not complete["dynamic_ttt_run"]
        assert_hashes(complete["input_hashes"])
        result = read(root / "raw" / f"{phase}_evaluation_integrity.json")
        assert result["status"] == "PASS" and result["all_states_immutable"]
        assert result["all_frozen_inputs_unchanged"] and not result["final_holdout_touched"]
        assert not result["new_carrier_trained"] and not result["dynamic_ttt_run"]
    prior_seal = read(root / "audit/previous_experiment_seal.json")
    for path, item in prior_seal["files"].items():
        assert Path(path).stat().st_size == item["bytes"] and sha(Path(path)) == item["sha256"]
    old_checkpoint = Path(
        "outputs/EXP-3D-20260927-centered-training-1000a-600b-v1/training/phase_b_final.pt"
    )
    assert sha(old_checkpoint) == prior_seal["checkpoint_sha256"]
    bounds = read(root / "bounds_lock.json")
    old_bounds = read("outputs/EXP-3D-DIRECT-STATE-CAPACITY-V1/predeclared_geometry_bounds.json")
    assert len(bounds["bounds"]) == 34 and not bounds["current_scene_depth_used"]
    assert not bounds["query_camera_or_GT_used"] and bounds["all34_previous_alternatives_bit_exact"]
    assert bounds["prior_sha256"] == sha(root / "train_depth_prior.json")
    assert bounds["contract_sha256"] == sha(root / "bounds_contract.json")
    assert bounds["scene_manifest_sha256"] == sha(root / "scene_manifest.json")
    for key, value in bounds["bounds"].items():
        assert value["FROZEN_GT_FREE_BOUNDS"] == old_bounds["bounds"][key]["bounds"]
        assert value["CURRENT_BOUNDS"] == [[-6.0, -4.0, -6.0], [6.0, 4.0, 6.0]]
    selected_checks, plateau_checks, state_hashes, chain_locks = [], [], {}, {}
    for chain in chains:
        key, sid, phase = chain["key"], chain["scene_id"], chain["phase"]
        assert sid in records and sid not in holdout
        assert chain["grid"] == 16 and chain["samples"] == 64
        assert (
            chain["track"]
            == {"context": "RGBD", "oracle": "QUERY_ORACLE", "secondary": "RGB_ONLY"}[phase]
        )
        assert chain["budgets"] == ([10000] if phase == "secondary" else [1000, 3000, 10000])
        if phase == "secondary":
            assert chain["bounds_mode"] == config["primary"]["bounds_mode"]
        geometry_key = f"{sid}/{'A' if chain['role'] == 'joint_query' else chain['role']}"
        assert chain["bounds"] == bounds["bounds"][geometry_key][chain["bounds_mode"]]
        directory = root / chain["optimization_path"]
        completion, locked, summary, checkpoints = (
            read(directory / name)
            for name in (
                "completion.json",
                "lock.json",
                "trajectory_summary.json",
                "full_objective_checkpoints.json",
            )
        )
        assert completion["chain_key"] == key and completion["phase"] == phase
        assert completion["plan_sha256"] == sha(root / "state_plan.json")
        assert completion["config_sha256"] == sha(root / "config.json")
        assert completion["source_hashes"] == config["source_sha256"]
        assert not completion["query_selection"] and not completion["final_holdout_touched"]
        assert locked["config"] == config["optimization"] and locked["budgets"] == chain["budgets"]
        assert locked["grid"] == 16 and locked["samples"] == 64
        assert np.allclose(locked["bounds"], chain["bounds"], atol=1e-6, rtol=1e-6)
        seed = 20260927 + int(
            hashlib.sha256(f"{sid}|{chain['role']}|{chain['track']}".encode()).hexdigest()[:8], 16
        )
        assert locked["seed"] == seed
        assert locked["secondary_sanity"] == (phase == "secondary")
        assert locked["objective_threshold"] == 0.001 and locked["gradient_threshold"] == 0.10
        assert not locked["engineering_fixture"] and locked["single_shared_trajectory"]
        query_ids = records[sid]["roles"]["primary_query"]
        context_ids = records[sid]["roles"][
            "context_a" if chain["role"] in ("A", "joint_query") else "context_b"
        ]
        supervised_ids = query_ids if phase == "oracle" else context_ids
        assert locked["supervision_frame_ids"] == supervised_ids
        assert locked["has_depth"] == (phase != "secondary")
        for event in read(directory / "access.json"):
            assert event["scene_id"] == sid and sid not in holdout
            if phase == "oracle":
                if event["frame_id"] in query_ids:
                    assert event["purpose"] == "DIAGNOSTIC_QUERY_SUPERVISED_ORACLE_NOT_CONTEXT_ONLY"
                else:
                    assert event["frame_id"] == records[sid]["roles"]["context_a"][0]
                    assert (
                        event["purpose"] == "CONTEXT_ONLY_RGB_ONLY"
                        and "depth" not in event["channels"]
                    )
            else:
                assert event["frame_id"] in context_ids and event["frame_id"] not in query_ids
                assert event["purpose"] == f"CONTEXT_ONLY_{chain['track']}"
                if phase == "secondary":
                    assert "depth" not in event["channels"]
        assert summary["status"] == "PASS" and summary["steps_completed"] == 10000
        assert summary["full_objective_checkpoints"] == checkpoints
        assert [c["step"] for c in checkpoints] == list(range(0, 10001, 100))
        with (directory / "optimization_trace.csv").open() as handle:
            trace = list(csv.DictReader(handle))
        assert [int(r["step"]) for r in trace] == [1] + list(range(10, 10001, 10))
        assert len(summary["trace"]) == len(trace)
        for raw, saved in zip(trace, summary["trace"], strict=True):
            for field, value in saved.items():
                assert raw[field] == ("" if value is None else str(value))
        chain_specs = [s for s in states if s["chain_key"] == key]
        assert set(completion["states"]) == {s["key"] for s in chain_specs}
        assert {(s["budget"], s["selection"]) for s in chain_specs} == {
            (b, selection)
            for b in chain["budgets"]
            for selection in ("FIXED_BUDGET", "CONTEXT_SELECTED")
        }
        for budget in chain["budgets"]:
            diagnostic = independent_plateau(checkpoints, trace, budget)
            plateau_checks.append({"chain_key": key, "budget": budget, **diagnostic})
            for selection in ("FIXED_BUDGET", "CONTEXT_SELECTED"):
                spec = next(
                    s for s in chain_specs if s["budget"] == budget and s["selection"] == selection
                )
                for field in (
                    "scene_id",
                    "phase",
                    "role",
                    "track",
                    "grid",
                    "samples",
                    "bounds_mode",
                    "bounds",
                ):
                    assert spec[field] == chain[field]
                state_path = root / spec["state_path"]
                record = read(root / spec["optimization_path"] / "summary.json")
                hashes = completion["states"][spec["key"]]
                assert sha(state_path) == hashes["state_file_sha256"] == record["state_file_sha256"]
                assert (
                    sha(root / spec["optimization_path"] / "summary.json")
                    == hashes["summary_sha256"]
                )
                eligible = [c for c in checkpoints if c["step"] <= budget]
                selected = (
                    next(c for c in eligible if c["step"] == budget)
                    if selection == "FIXED_BUDGET"
                    else min(eligible, key=lambda c: (c["context_objective"], c["step"]))
                )
                assert record["selected_step"] == selected["step"]
                assert record["selected_full_objective"] == selected["context_objective"]
                assert record["selected_context_metrics"] == selected
                assert record["shared_supervision_frame_ids"] == supervised_ids
                assert record["budget"] == budget and record["rule"] == selection
                for field, value in diagnostic.items():
                    assert record["plateau_diagnostic"][field] == value
                state = torch.load(state_path, map_location="cpu", weights_only=False)
                assert state.density_logits.shape == (1, 1, 16, 16, 16) and state.features is None
                assert torch.equal(
                    state.bounds, torch.tensor(chain["bounds"], dtype=torch.float32)[None]
                )
                assert hash_scene_state(state) == record["state_hash"] == hashes["state_hash"]
                if selection == "FIXED_BUDGET":
                    snapshot = torch.load(
                        directory / "snapshots" / f"step_{budget}.pt",
                        map_location="cpu",
                        weights_only=False,
                    )
                    assert hash_scene_state(snapshot) == record["state_hash"]
                state_hashes[spec["key"]] = record["state_hash"]
                selected_checks.append(
                    {"key": spec["key"], "budget": budget, "selected_step": selected["step"]}
                )
        for step in (0, 100, 300):
            assert (directory / "snapshots" / f"step_{step}.pt").is_file()
        chain_locks[key] = locked
    for sid in records:
        for phase in ("context", "oracle"):
            # A/B roles may differ for joint CURRENT oracle; optimizer/loss still identical.
            selected = [c for c in chains if c["scene_id"] == sid and c["phase"] == phase]
            assert all(chain_locks[c["key"]]["config"] == config["optimization"] for c in selected)
    primary = read(root / "primary_analysis_complete.json")
    assert primary["status"] == "PASS" and primary["secondary_not_used"]
    assert primary["meaning"] == "PREDECLARED_PRIMARY_NOT_QUERY_MINIMUM"
    assert not any("secondary" in p for p in primary["inputs_sha256"])
    assert_hashes(primary["inputs_sha256"])
    secondary = read(root / "secondary_analysis/secondary_decision_audit.json")
    decision = read(root / "optimization_sufficiency.json")["primary"]
    secondary_decision = read(root / "secondary_analysis/optimization_sufficiency.json")["primary"]
    decision_hash = hashlib.sha256(
        json.dumps(decision, sort_keys=True, separators=(",", ":")).encode()
    ).hexdigest()
    assert decision == secondary_decision == primary["primary_decision"]
    assert (
        decision_hash == primary["primary_decision_sha256"] == secondary["primary_decision_sha256"]
    )
    assert secondary["status"] == "PASS" and secondary["primary_bits_exactly_unchanged"]
    analysis_lock_path = root / "audit/analysis_source_lock.json"
    analysis_lock = read(analysis_lock_path)
    assert analysis_lock["status"] == "PASS"
    assert_hashes(analysis_lock["source_sha256"])
    assert analysis_lock["decision_rules_sha256"] == sha(root / "decision_rules.json")
    assert analysis_lock_path.stat().st_mtime_ns <= min(
        (root / "raw" / f"{phase}_evaluation_lock.json").stat().st_mtime_ns for phase in PHASES
    )

    # Filesystem mtimes are auxiliary chronology evidence, not tamper-proof authorization.
    assert (root / "raw/context_evaluation_integrity.json").stat().st_mtime_ns <= min(
        (root / c["optimization_path"] / "lock.json").stat().st_mtime_ns
        for c in chains
        if c["phase"] == "oracle"
    )
    assert (root / "primary_analysis_complete.json").stat().st_mtime_ns <= min(
        (root / c["optimization_path"] / "lock.json").stat().st_mtime_ns
        for c in chains
        if c["phase"] == "secondary"
    )
    truth_cache, audit_access, phase_reports = {}, [], {}
    for phase in PHASES:
        specs = [s for s in states if s["phase"] == phase]
        events = read(root / "raw" / f"{phase}_seal_events.json")
        assert all(e["event"] == "seal" for e in events[: len(specs)])
        assert {e["state_id"] for e in events[: len(specs)]} == {s["key"] for s in specs}
        assert all(
            e["event"] == "query_camera_GT" and e["scene_id"] not in holdout
            for e in events[len(specs) :]
        )
        for event in events[: len(specs)]:
            assert event["state_hash"] == state_hashes[event["state_id"]]
        eval_lock = read(root / "raw" / f"{phase}_evaluation_lock.json")
        for field in ("input_sha256", "optimizer_source_sha256", "evaluator_source_sha256"):
            assert_hashes(eval_lock[field])
        assert (
            max(
                (root / c["optimization_path"] / "completion.json").stat().st_mtime_ns
                for c in chains
                if c["phase"] == phase
            )
            <= (root / "raw" / f"{phase}_evaluation_lock.json").stat().st_mtime_ns
        )
        for event in read(root / "raw" / f"{phase}_GT_access.json"):
            assert event["scene_id"] in records and event["scene_id"] not in holdout
            assert event["purpose"] in (
                "HASH_INPUT_AFTER_ALL_STATES_SEALED",
                "POST_SEAL_CONTEXT_EVALUATION_NOT_OPTIMIZER",
                "SEALED_QUERY_EVALUATION",
            )
        rows = read(root / "raw" / f"{phase}_results.json")
        assert len({(r["key"], r["query_id"], r["method"]) for r in rows}) == len(rows)
        grouped = defaultdict(list)
        errors, exact = dict.fromkeys(METRICS, 0.0), dict.fromkeys(METRICS, 0)
        spec_by_key = {spec["key"]: spec for spec in specs}
        for row in rows:
            spec = spec_by_key[row["key"]]
            assert all(row.get(k) == v for k, v in spec.items()), "Raw row differs from state plan"
            sid, fid = row["scene_id"], row["query_id"]
            assert sid in records and sid not in holdout
            assert fid in records[sid]["roles"]["primary_query"]
            grouped[row["key"], fid].append(row)
            frame = next(f for f in records[sid]["frames"] if f["frame_id"] == fid)
            anchor = next(
                f
                for f in records[sid]["frames"]
                if f["frame_id"] == records[sid]["roles"]["context_a"][0]
            )
            # Reproduce camera arithmetic on the evaluator device; no renderer/model call.
            device = "cuda" if torch.cuda.is_available() else "cpu"
            camera = Cameras(
                torch.tensor(frame["intrinsics"], dtype=torch.float32, device=device)[None, None],
                torch.tensor(frame["c2w"], dtype=torch.float32, device=device)[None, None],
                tuple(manifest["image_size"]),
            )
            inverse = torch.linalg.inv(
                torch.tensor(anchor["c2w"], dtype=torch.float32, device=device)
            )
            assert hash_value(transform_cameras(camera, inverse)) == row["query_camera_hash"]

            if row["method"] == "direct":
                assert row["used_state_hash"] == state_hashes[row["key"]]
            else:
                assert row["method"] == "wrong_scene" and row["donor_scene_id"] != sid
                donor = next(
                    s
                    for s in specs
                    if s["scene_id"] == row["donor_scene_id"]
                    and all(
                        s[k] == row[k]
                        for k in ("role", "track", "bounds_mode", "budget", "selection")
                    )
                )
                assert row["used_state_hash"] == state_hashes[donor["key"]]
            if (sid, fid) not in truth_cache:
                frame = next(f for f in records[sid]["frames"] if f["frame_id"] == fid)
                paths = [
                    Path(frame[k]) if Path(frame[k]).is_absolute() else root / frame[k]
                    for k in ("rgb", "depth")
                ]
                assert not any(s in str(p) for s in holdout for p in paths)
                with Image.open(paths[0]) as im:
                    rgb = np.asarray(im.convert("RGB"), dtype=np.float32) / 255
                truth_cache[sid, fid] = rgb, np.load(paths[1]).squeeze()
                audit_access.append(
                    {
                        "scene_id": sid,
                        "query_id": fid,
                        "purpose": "POSTRUN_SAVED_NPZ_RECOMPUTATION",
                        "rgb_path": str(paths[0]),
                        "depth_path": str(paths[1]),
                        "final_holdout": False,
                    }
                )
            rgb, depth = truth_cache[sid, fid]
            with np.load(root / row["prediction_path"]) as pred:
                reconstructed = {
                    "rgb": torch.from_numpy(pred["rgb"])[None, None],
                    "depth": torch.from_numpy(pred["depth"])[None, None, None],
                    "visibility": torch.from_numpy(pred["opacity"])[None, None, None],
                }
                assert hash_value(reconstructed) == row["prediction_hash"]
                calculated = measurement_metrics(
                    pred["rgb"], rgb, pred["depth"], depth, pred["opacity"]
                )
            for metric in METRICS:
                difference = abs(calculated[metric] - row[metric])
                errors[metric] = max(errors[metric], difference)
                exact[metric] += calculated[metric] == row[metric]
                assert np.isclose(calculated[metric], row[metric], atol=1e-6, rtol=1e-5)
        for spec in specs:
            seen = []
            for fid in records[spec["scene_id"]]["roles"]["primary_query"]:
                group = grouped[spec["key"], fid]
                assert {r["method"] for r in group} == (
                    {"direct"} if phase == "oracle" else {"direct", "wrong_scene"}
                )
                assert len({r["query_camera_hash"] for r in group}) == 1
                seen.extend(r["used_state_hash"] for r in group if r["method"] == "direct")
            assert len(set(seen)) == 1
        context = read(root / "raw" / f"{phase}_context_results.json")
        for row in context:
            assert all(row.get(k) == v for k, v in spec_by_key[row["key"]].items())
        if phase == "oracle":
            assert not context
        else:
            assert len(context) == len(specs) * 3
            for row in context:
                role = "context_a" if row["role"] == "A" else "context_b"
                assert row["frame_id"] in records[row["scene_id"]]["roles"][role]
        phase_reports[phase] = {
            "states": len(specs),
            "query_rows": len(rows),
            "context_rows": len(context),
            "metric_max_absolute_error": errors,
            "metric_exact_row_counts": exact,
            "all_states_shared_across_queries": True,
            "all_query_GT_after_complete_seal": True,
            "wrong_scene_camera_preserved": True,
        }
    assert_hashes(config["source_sha256"])
    report = {
        "status": "PASS",
        "chain_count": len(chains),
        "state_count": len(states),
        "old_artifact_count_unchanged": len(prior_seal["files"]),
        "all34_old_gtfree_bounds_exact": True,
        "all_sources_inputs_preregistration_unchanged": True,
        "all_optimizers_loss_seeds_budget_ids_match": True,
        "fixed_and_context_selected_checkpoints_correct": True,
        "plateau_independently_recomputed": True,
        "secondary_cannot_change_primary": True,
        "primary_configuration": config["primary"],
        "phase_chronology_auxiliary": (
            "mtime checks PASS; OS timestamps are mutable, not tamper-proof"
        ),
        "selected_checkpoint_checks": selected_checks,
        "plateau_checks": plateau_checks,
        "phases": phase_reports,
        "raw_statistics_audit": "SEPARATE_ANALYSIS_AGENT",
        "final_holdout_touched": False,
        "new_carrier_trained": False,
        "dynamic_ttt_run": False,
        "metric_tolerance": {"atol": 1e-6, "rtol": 1e-5},
        "audit_script_sha256": sha(Path(__file__)),
    }
    write_json(root / "audit/postrun_GT_access.json", audit_access)
    write_json(destination, report)
    return {"status": "PASS", "chains": len(chains), "states": len(states), "phases": phase_reports}


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--root", required=True)
    args = parser.parse_args()
    print(json.dumps(run(args.root), indent=2))