Source: tests/test_certificate_audit.py · Plain text

tests/test_certificate_audit.py

from pathlib import Path

from mcss.certificate_audit import (
    AuditDecisionThresholds,
    decide_audit,
    render_markdown_report,
    select_frozen_windows,
)


def test_hash_window_selection_is_deterministic_and_scene_balanced() -> None:
    entries = [(f"scene_{scene}", start) for scene in range(8) for start in range(6)]

    first = select_frozen_windows(entries, count=16, seed=17)
    second = select_frozen_windows(list(reversed(entries)), count=16, seed=17)

    assert first == second
    assert len(first) == 16
    assert len({scene for scene, _ in first}) >= 4


def test_decision_requires_every_frozen_primary_gate() -> None:
    thresholds = AuditDecisionThresholds()
    passing = {
        "window_count": 32,
        "certified_coverage_macro": 0.20,
        "nonzero_window_fraction": 0.90,
        "geometry_error_median_m": 0.10,
        "geometry_error_p90_m": 0.30,
        "matched_confidence_median_error_m": 0.20,
        "permutation_max_point_delta_m": 0.0,
        "shuffled_median_error_m": 1.0,
        "risk_error_spearman": 0.3,
    }

    assert decide_audit(passing, thresholds)["status"] == "GO_TO_STATE_INTEGRATION"
    failures = {
        "certified_coverage_macro": 0.10,
        "nonzero_window_fraction": 0.50,
        "geometry_error_median_m": 0.30,
        "geometry_error_p90_m": 0.60,
        "matched_confidence_median_error_m": 0.05,
        "permutation_max_point_delta_m": 0.01,
        "shuffled_median_error_m": 0.11,
        "risk_error_spearman": -0.1,
    }
    for key, value in failures.items():
        failing = dict(passing)
        failing[key] = value
        assert decide_audit(failing, thresholds)["status"] == "STOP_CERTIFICATE_FRONTEND"


def test_markdown_report_discloses_nonformal_research_and_council_status(tmp_path: Path) -> None:
    report = render_markdown_report(
        {"status": "INCONCLUSIVE", "gates": {}},
        {"window_count": 1},
        config_path=tmp_path / "audit.yaml",
        artifact_paths=[],
        started_at="2026-08-12T00:00:00+08:00",
        finished_at="2026-08-12T00:01:00+08:00",
    )

    assert "Council not convened" in report
    assert "not invoked" in report
    assert "INCONCLUSIVE" in report
    assert "未写入项目或全局记忆" in report