from pathlib import Path
import json
R=Path(__file__).resolve().parent
cases=json.loads((R/'fixtures/cases.json').read_text(encoding='utf-8'))['cases']
assert len(cases)==8
required={'id','ring','environment','intended_target','observed_target','desired_artifact','observed_artifact','deployment_evidence','desired_activation','observed_activation','desired_cohort','observed_cohort','health_status','health_evidence','approval_required','approval_state','approval_evidence','rollback_trigger_met','transfer'}
assert all(required <= set(c) for c in cases)
assert any(c['observed_artifact']==c['desired_artifact'] and c['observed_activation']!=c['desired_activation'] for c in cases)
assert any(c['observed_artifact']!=c['desired_artifact'] for c in cases)
assert any(c['approval_state']=='APPROVED' and c['health_status']=='FAIL' for c in cases)
assert any(c['observed_target']!=c['intended_target'] for c in cases)
assert any(c['desired_activation']=='PARTIAL' and c['observed_cohort']!=c['desired_cohort'] for c in cases)
assert any(c['health_status']=='UNKNOWN' and not c['health_evidence'] for c in cases)
assert any(c['transfer'] and c['ring']=='edge-wave' for c in cases)
print('PASS: 8 synthetic release-ring fixtures are structurally valid; implement analyze_ring(case) in starter.py')
