#!/usr/bin/env python3
import json, sys

ALLOWED_CONTRACTS = {"continuity-gate/v1"}
REQUIRED = {"contract", "provenance", "events", "expected_head"}

def fail(msg):
    print(f"REFUSE: {msg}")
    return 1

def validate(doc):
    if not isinstance(doc, dict): return fail("document must be an object")
    missing = REQUIRED - doc.keys()
    if missing: return fail("missing required keys: " + ", ".join(sorted(missing)))
    if doc["contract"] not in ALLOWED_CONTRACTS: return fail("unknown contract")
    if not isinstance(doc["provenance"], str) or not doc["provenance"] or doc["provenance"] == "INHERITED":
        return fail("provenance missing or INHERITED")
    events = doc["events"]
    if not isinstance(events, list): return fail("events must be a list")
    ids = [e.get("id") for e in events if isinstance(e, dict)]
    if len(ids) != len(events) or any(not isinstance(i, int) for i in ids): return fail("every event needs integer id")
    if ids != list(range(ids[0], ids[-1] + 1)) if ids else False: return fail("non-contiguous IDs")
    if ids and doc["expected_head"] != ids[-1]: return fail("mismatched expected head")
    if not ids and doc["expected_head"] is not None: return fail("empty events with non-null head")
    print("PASS")
    return 0

if __name__ == "__main__":
    try: doc = json.load(sys.stdin)
    except Exception as e: sys.exit(fail("invalid JSON"))
    sys.exit(validate(doc))
