diff --git a/.claude/skills/replay-eval/scripts/test_run_replay.py b/.claude/skills/replay-eval/scripts/test_run_replay.py index 003cdeb..c79b1d3 100644 --- a/.claude/skills/replay-eval/scripts/test_run_replay.py +++ b/.claude/skills/replay-eval/scripts/test_run_replay.py @@ -4,6 +4,7 @@ from __future__ import annotations import json +import os import pathlib import sys import tempfile @@ -87,6 +88,34 @@ class ReplayRunTest(unittest.TestCase): self.assertNotIn('"prompt":', report) self.assertNotIn('"payload":', report) + def test_execute_uses_external_planner_and_validates_each_candidate(self): + candidate = { + "targetChapter": 489, + "chapterGoal": "机制 smoke", + "keyEvents": [], + "entities": [], + "foreshadowing": [], + "stateChanges": [], + "hook": "下一步", + "unknowns": [], + "assumptions": [], + } + with tempfile.TemporaryDirectory() as directory: + fake = pathlib.Path(directory) / "fake-planner.py" + fake.write_text( + "#!/usr/bin/env python3\n" + "import json\n" + f"print(json.dumps({{'result': json.dumps({candidate!r}, ensure_ascii=False)}}))\n", + encoding="utf-8", + ) + os.chmod(fake, 0o755) + output_dir = pathlib.Path(directory) / "run" + result = run_replay(config(), output_dir, mode="execute", planner_bin=str(fake)) + self.assertTrue(result["ok"]) + self.assertEqual(result["status"], "completed") + self.assertEqual(set(result["results"]), {"outline_only", "outline_plus_cards", "outline_plus_placebo_cards"}) + self.assertTrue(list(output_dir.glob("candidate_*.json"))) + if __name__ == "__main__": unittest.main()