from pathlib import Path
import json, ast
P=Path(__file__).resolve().parent
cases=json.loads((P/'fixtures/cases.json').read_text(encoding='utf-8'))['cases']
assert len(cases)==8 and len({c['id'] for c in cases})==8
ast.parse((P/'starter.py').read_text(encoding='utf-8'))
required=['cli_command','effect_class','state_change','normal_admin_path','normal_scope_allowed','break_glass_eligible','required_actor','local_authn_state','local_authz_state','command_scope','break_glass_active','break_glass_scopes','expires_at','now','revoked','confirmation_state','audit_event_id','post_event_review','identity_provider_available','transfer']
for c in cases:
    for k in required: assert k in c,(c['id'],k)
assert any(c['id']=='case_08' and c['transfer'] and c['identity_provider_available'] and c['post_event_review'] for c in cases)
assert any(c['break_glass_active'] and c['state_change'] for c in cases)
print('PASS learner structural checks: 8 synthetic cases, transfer closure present, starter parses, no hidden labels required')
