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={'variant_node_id','asset_digest','parent_variant_id','edge_type','transform_recipe_ref','branch_id','edge_target_exists','ingredient_bound','orphan','selection_state','editor_history_present','filename','unexpected_sibling_inheritance'}
for c in cases:
    assert required.issubset(c), (c['id'], sorted(required-set(c)))
    assert c['edge_type'] in {'derivedFrom','componentOf','inputTo'}
text=(R/'starter.py').read_text(encoding='utf-8')
tree=ast.parse(text)
assert any(isinstance(n,ast.FunctionDef) and n.name=='evaluate_variant' 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')
