from pathlib import Path
import json,ast
R=Path(__file__).resolve().parent
cases=json.loads((R/'fixtures/cases.json').read_text(encoding='utf-8'))['cases']
assert len(cases)==8
required={'uid','sequence_expected','sequence_current','instant_expected','instant_current','version_required','version_current','approval_bound','rights_open','handoff_ack','edge_type','edge_resolved'}
for c in cases:
    assert required.issubset(c),(c['id'],sorted(required-set(c)))
    assert c['edge_type'] in {'HARD','RECOMMENDED'}
    assert c['instant_expected'].endswith('Z') and c['instant_current'].endswith('Z')
text=(R/'starter.py').read_text(encoding='utf-8')
tree=ast.parse(text)
assert any(isinstance(n,ast.FunctionDef) and n.name=='evaluate_campaign' for n in tree.body)
forbidden=['oracle'+'_expected','internal'+'_verification','answer'+'_key']
assert not any(x in text.lower() for x in forbidden)
print('PASS 8/8 learner fixture structural checks')
