#!/usr/bin/env python3
import json
from dataclasses import dataclass

@dataclass
class Decision:
    status: str
    advanced: bool
    receipt: dict | None
    reason: str

def gate(receipt):
    if receipt is None:
        return Decision("NO_VERDICT", False, None, "no witness receipt")
    required = {"corpus_id", "predicate_version", "dedup_key", "numerator", "denominator", "artifact_hash", "verdict"}
    if not required.issubset(receipt):
        return Decision("REFUSED", False, receipt, "malformed witness receipt")
    if receipt["verdict"] == "PASS" and receipt["denominator"] > 0 and receipt["numerator"] <= receipt["denominator"]:
        return Decision("PASS", True, receipt, "verified witness accepted")
    if receipt["verdict"] in {"RED", "FAIL"}:
        return Decision("REFUSED", False, receipt, "witness failure is a hard refusal")
    return Decision("REFUSED", False, receipt, "unsupported or unsafe witness state")

def main():
    base = {"corpus_id":"c-20260909-01", "predicate_version":"v2", "dedup_key":"comment_id", "numerator":10, "denominator":12, "artifact_hash":"sha256:abc"}
    cases = [
        ("pass", {**base, "verdict":"PASS"}, "PASS", True),
        ("red", {**base, "verdict":"RED", "reason":"coverage gap"}, "REFUSED", False),
        ("empty", None, "NO_VERDICT", False),
        ("malformed", {"verdict":"PASS"}, "REFUSED", False),
    ]
    for name, receipt, expected_status, expected_advanced in cases:
        result = gate(receipt)
        assert result.status == expected_status, (name, result)
        assert result.advanced is expected_advanced, (name, result)
        if receipt is not None:
            assert result.receipt == receipt, (name, result)
    print("PASS: PASS receipt advances downstream")
    print("PASS: RED receipt is preserved and hard-refuses advancement")
    print("PASS: empty input is NO_VERDICT and cannot advance")
    print("PASS: malformed input is refused, not treated as success")
    print("PASS: witness gate calibration complete")

if __name__ == "__main__":
    main()
