@@ -36,11 +36,12 @@ def state_file(problem_dir: str) -> Path:
3636
3737def infer_state (problem_dir : str ) -> dict [str , Any ]:
3838 root = Path (problem_dir )
39+ solutions_dir = root / "solutions"
3940 return {
4041 "problem_dir" : str (root ),
4142 "created" : root .exists () and (root / "files" ).exists () and (root / "solutions" ).exists (),
42- "sol_built" : ( root / "solutions" / " sol.cpp" ). exists () or any ( root . glob ( "solutions/sol.*" ) ),
43- "brute_built" : ( root / "solutions" / " brute.cpp" ). exists () or any ( root . glob ( "solutions/brute.*" ) ),
43+ "sol_built" : _has_solution ( solutions_dir , " sol" ),
44+ "brute_built" : _has_solution ( solutions_dir , " brute" ),
4445 "validator_ready" : (root / "files" / "val.cpp" ).exists () or any (root .glob ("files/val.*" )),
4546 "validator_accuracy" : None ,
4647 "generator_built" : (root / "files" / "gen.cpp" ).exists () or any (root .glob ("files/gen.*" )),
@@ -54,10 +55,25 @@ def infer_state(problem_dir: str) -> dict[str, Any]:
5455 "validation_passed" : False ,
5556 "tests_generated" : any ((root / "tests" ).glob ("*.in" )) if (root / "tests" ).exists () else False ,
5657 "generated_test_count" : len (list ((root / "tests" ).glob ("*.in" ))) if (root / "tests" ).exists () else 0 ,
58+ "tests_verified" : False ,
5759 "packaged" : (root / "problem.xml" ).exists (),
5860 }
5961
6062
63+ def _has_solution (solutions_dir : Path , prefix : str ) -> bool :
64+ """检查 solutions/ 下是否有指定前缀的解法文件(支持自定义命名)。"""
65+ if not solutions_dir .exists ():
66+ return False
67+ # 精确匹配(如 sol.cpp, brute.cpp)
68+ if (solutions_dir / f"{ prefix } .cpp" ).exists ():
69+ return True
70+ # 前缀匹配(如 brute_force.cpp)
71+ for f in solutions_dir .iterdir ():
72+ if f .is_file () and f .stem .startswith (prefix ) and f .suffix == ".cpp" :
73+ return True
74+ return False
75+
76+
6177def load_state (problem_dir : str ) -> dict [str , Any ]:
6278 path = state_file (problem_dir )
6379 if path .exists ():
@@ -120,7 +136,7 @@ def pre_tool(payload: dict[str, Any]) -> int:
120136 "checker_build" : "必须先通过 stress_test_run(completed_rounds == total_rounds),再构建 checker。" ,
121137 "problem_validate" : "必须先通过 stress_test_run(completed_rounds == total_rounds),再进行验证。" ,
122138 "problem_generate_tests" : "必须先通过 problem_validate(验证通过),才能生成最终测试数据。" ,
123- "problem_pack_polygon" : "必须先生成最终测试数据,并且生成数量 > 0 ,再进行打包。" ,
139+ "problem_pack_polygon" : "必须先生成最终测试数据并通过 problem_verify_tests(passed) ,再进行打包。" ,
124140 }
125141
126142 tool_input = payload .get ("tool_input" , {})
@@ -169,6 +185,7 @@ def pre_tool(payload: dict[str, Any]) -> int:
169185
170186 if short_name == "problem_pack_polygon" and not (
171187 state ["tests_generated" ] and state .get ("generated_test_count" , 0 ) > 0
188+ and state .get ("tests_verified" , False )
172189 ):
173190 deny (reasons ["problem_pack_polygon" ])
174191 return 0
@@ -194,6 +211,12 @@ def post_tool(payload: dict[str, Any]) -> int:
194211 save_state (problem_dir , state )
195212 return 0
196213
214+ if short_name == "problem_verify_tests" and not success :
215+ state = load_state (problem_dir )
216+ state ["tests_verified" ] = False
217+ save_state (problem_dir , state )
218+ return 0
219+
197220 if not success :
198221 return 0
199222
@@ -229,6 +252,9 @@ def post_tool(payload: dict[str, Any]) -> int:
229252 generated_tests = data .get ("generated_tests" , [])
230253 state ["tests_generated" ] = bool (generated_tests )
231254 state ["generated_test_count" ] = len (generated_tests )
255+ state ["tests_verified" ] = False
256+ elif short_name == "problem_verify_tests" :
257+ state ["tests_verified" ] = bool (data .get ("passed" , False ))
232258 elif short_name == "problem_pack_polygon" :
233259 state ["packaged" ] = True
234260
@@ -244,7 +270,8 @@ def session_start() -> int:
244270 "stress_test_run(completed_rounds == total_rounds) -> "
245271 "checker_build if needed (accuracy >= 0.9) -> "
246272 "problem_validate(validation_passed) -> "
247- "problem_generate_tests(generated_test_count > 0) -> problem_pack_polygon. "
273+ "problem_generate_tests(generated_test_count > 0) -> "
274+ "problem_verify_tests(passed) -> problem_pack_polygon. "
248275 "If a hook blocks a step, complete the missing prerequisite instead of retrying blindly."
249276 )
250277 print (
0 commit comments