"""EL01 lab test for step 9: three knob experiments, each predicted before it was run and explained after."""importcsvimportunittestfrom_implimportREPO,artifactPATH=artifact("tinker.csv",REPO/"logs"/"tinker.csv")classStep9Tinker(unittest.TestCase):deftest_three_explained_experiments(self):ifnotPATH.exists():self.fail(f"no tinker log yet ({PATH}); run `python -m hwe tinker KEY=VALUE --predict \"...\"`")withopen(PATH,newline="",encoding="utf-8")asf:rows=list(csv.DictReader(f))complete=[rforrinrowsifr.get("prediction","").strip()andr.get("explanation","").strip()]self.assertGreaterEqual(len(complete),3,"need three entries with both a prediction and an explanation")forrincomplete:self.assertTrue(r.get("result","").strip(),f"entry {r.get('id')}: the result column is empty; ""log entries come from `python -m hwe tinker`, not by hand")knobs={r["change"].split("=")[0]forrincomplete}self.assertGreaterEqual(len(knobs),3,"turn three different knobs")if__name__=="__main__":unittest.main()