import json, hashlib, subprocess, sys
from pathlib import Path

def digest(r):
    x={k:v for k,v in r.items() if k!='self_hash'}
    return hashlib.sha256(json.dumps(x,sort_keys=True,separators=(',',':')).encode()).hexdigest()
def make(rows):
    prev='0'*64; out=[]
    for r in rows:
        r=dict(r); r['prev_hash']=prev; r['self_hash']=digest(r); prev=r['self_hash']; out.append(r)
    return out
def write(name, rows):
    Path(name).write_text('\n'.join(json.dumps(r,sort_keys=True) for r in rows)+'\n')
base=[{'schema':'continuity.v1','kind':'FACT','value':'project=resume-validator','provenance':{'source':'terry','observed_at':'2026-09-08T00:00:00Z'}},{'schema':'continuity.v1','kind':'OBLIGATION','value':'next=run consumer replay','provenance':{'source':'terry','observed_at':'2026-09-08T00:00:01Z'}}]
valid=make(base)
bad_inh=[dict(base[0],kind='FACT',inherited_from='agent-a'),base[1]]
bad_prov=[dict(base[0],provenance=None),base[1]]
for n,rows in [('valid.jsonl',valid),('inherited_fact.jsonl',make(bad_inh)),('missing_provenance.jsonl',make(bad_prov))]: write(n,rows)

def validate(path):
    rows=[json.loads(x) for x in Path(path).read_text().splitlines()]; gates=[]; prev='0'*64
    for r in rows:
        if r.get('self_hash')!=digest(r): gates.append('HASH_SELF')
        if r.get('prev_hash')!=prev: gates.append('HASH_CHAIN')
        if not r.get('provenance'): gates.append('PROVENANCE_REQUIRED')
        if r.get('kind')=='FACT' and r.get('inherited_from'): gates.append('INHERITED_NOT_FACT')
        prev=r.get('self_hash')
    return sorted(set(gates))
def resume(path):
    gates=validate(path)
    if gates: return {'status':'REFUSED','gates':gates}
    rows=[json.loads(x) for x in Path(path).read_text().splitlines()]
    obligations=[r['value'] for r in rows if r['kind']=='OBLIGATION']
    return {'status':'RESUMED','next_steps':obligations,'facts':[r['value'] for r in rows if r['kind']=='FACT']}
expected={'valid.jsonl':{'status':'RESUMED','next_steps':['next=run consumer replay'],'facts':['project=resume-validator']},'inherited_fact.jsonl':{'status':'REFUSED','gates':['INHERITED_NOT_FACT']},'missing_provenance.jsonl':{'status':'REFUSED','gates':['PROVENANCE_REQUIRED']}}
for n,e in expected.items():
    got=resume(n); assert got==e,(n,got,e)
print(json.dumps({'ok':True,'cases':{n:resume(n) for n in expected}},sort_keys=True))
