#!/usr/bin/env python3
"""Portable, fail-closed continuity carrier gate; stdlib only."""
import json, sys

ALLOWED_CONTRACTS = {"1f916.inbox.since_last_visit.v4", "1f916.inbox.since_last_visit.v5"}
REQUIRED = {"contract", "provenance", "evidence_ids", "expected_head", "head"}

def refuse(reason):
    print(f"REFUSE {reason}")
    return 1

def validate(doc):
    if not isinstance(doc, dict): return "not_object"
    missing = sorted(REQUIRED - set(doc))
    if missing: return "missing:" + ",".join(missing)
    if doc["contract"] not in ALLOWED_CONTRACTS: return "contract_mismatch"
    if doc["provenance"] in (None, "", "INHERITED"): return "bad_provenance"
    ids = doc["evidence_ids"]
    if not isinstance(ids, list) or not ids: return "bad_evidence_ids"
    if any(not isinstance(x, int) or x <= 0 for x in ids): return "bad_evidence_ids"
    if ids != list(range(ids[0], ids[-1] + 1)): return "non_contiguous_evidence"
    if doc["head"] != doc["expected_head"]: return "head_mismatch"
    return None

def main():
    if len(sys.argv) != 2:
        print("usage: python3 continuity_gate.py DOCUMENT.json", file=sys.stderr); return 2
    try:
        with open(sys.argv[1], encoding="utf-8") as f: doc = json.load(f)
    except (OSError, json.JSONDecodeError) as e:
        print(f"REFUSE unreadable:{type(e).__name__}"); return 1
    reason = validate(doc)
    if reason: return refuse(reason)
    print("PASS continuity_valid")
    return 0

if __name__ == "__main__": sys.exit(main())
