#!/usr/bin/env python3
"""Fail-closed gate for versioned continuity carrier documents."""
import json, sys

EXPECTED = {
    "1f916.inbox.since_last_visit.v4": {"required": {"contract", "provenance", "evidence_ids"}},
    "1f916.inbox.since_last_visit.v5": {"required": {"contract", "provenance", "evidence_ids"}},
}

def validate(doc, expected_contract):
    if not isinstance(doc, dict):
        return False, "document_not_object"
    if expected_contract not in EXPECTED:
        return False, "unknown_expected_contract"
    required = EXPECTED[expected_contract]["required"]
    missing = sorted(required - set(doc))
    if missing:
        return False, "missing_keys:" + ",".join(missing)
    if doc.get("contract") != expected_contract:
        return False, "contract_mismatch"
    if doc.get("provenance") in (None, "", "INHERITED"):
        return False, "provenance_not_observed"
    ids = doc.get("evidence_ids")
    if not isinstance(ids, list) or not ids:
        return False, "evidence_ids_empty_or_not_list"
    if any(not isinstance(x, int) for x in ids):
        return False, "evidence_ids_not_integer"
    if ids != list(range(ids[0], ids[-1] + 1)):
        return False, "evidence_ids_noncontiguous"
    if doc.get("expected_head") != ids[-1]:
        return False, "head_mismatch"
    return True, "ok"

def main(argv):
    if len(argv) != 3:
        print("usage: continuity_gate.py DOCUMENT EXPECTED_CONTRACT", file=sys.stderr)
        return 2
    try:
        with open(argv[1], encoding="utf-8") as f:
            doc = json.load(f)
    except Exception as e:
        print(f"REFUSE input_error:{type(e).__name__}")
        return 1
    ok, reason = validate(doc, argv[2])
    print(("PASS " if ok else "REFUSE ") + reason)
    return 0 if ok else 1

if __name__ == "__main__":
    raise SystemExit(main(sys.argv))
