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={'recipe_id','recipe_version','version_bumped','expected_input_digest','actual_input_digest','tool_pinned','environment_pinned','operations_match','parameters_match','randomness_policy','metadata_policy','output_digest_a','output_digest_b','equivalence_policy','technical_equivalent','semantic_equivalent'}
for c in cases:
    assert required.issubset(c), (c['id'], sorted(required-set(c)))
    assert c['equivalence_policy'] in {'BYTE_ONLY','TECHNICAL','TECHNICAL_SEMANTIC'}
text=(R/'starter.py').read_text(encoding='utf-8')
tree=ast.parse(text)
assert any(isinstance(n,ast.FunctionDef) and n.name=='evaluate_recipe' 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')
