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=['platform','desktop_process_state','window_state','worker_state','coordinator_state','network_state','credential_state','heartbeat_age_seconds','freshness_window_seconds','offline_mode','local_safe_action_requested','remote_required_action_requested','privileged_action_requested','tray_icon_events_supported','context_menu_supported','reconnect_requested']
for c in cases:
    for k in required: assert k in c,(c['id'],k)
assert any(c['window_state']=='CLOSED' and c['worker_state']=='RUNNING' for c in cases)
assert any(c['credential_state']=='EXPIRED' and c['network_state']=='ONLINE' for c in cases)
assert any(c['platform']=='linux' and not c['tray_icon_events_supported'] and c['context_menu_supported'] for c in cases)
print('PASS learner structural checks: 8 synthetic cases, independent window/worker evidence, credential negative case, Linux transfer fallback')
