"""cheap_gates.py — 便宜档九门收口的同步包装(供 Service 续修 check 闭包经 to_thread 调用)。 归并后便宜档收敛判据从「check+build 绿」升为「九门绿」:RepairMiddleware 的 check 闭包在 finish 点 把工程收口跑一遍九门(stage→smoke→play(undriven)),经 worker.gate_judge.judge_cheap_verdict 归一。 本模块只做「同步 pipeline + 端口透传」,不做判据归一(那在 gate_judge,与 tier2 并列)。 端口由调用方按 session 派生传入(决策③ 并发避撞);shell-out/subprocess 阻塞,故封在同步函数里给 to_thread 跑。 """ import cheap_run def run_cheap_gates(game_id: str, port: int, cdp_port: int) -> dict: """同步跑便宜档九门收口 stage→smoke→play(undriven),返回九门 verdict({pass, guards})或 {}(未跑出)。 任一段失败(stage 打包不出 / play 没产 verdict)→ 返 {}(judge_cheap_verdict 判未过、feedback 落 harness 说明, 不伪造门绿)。端口按 session 派生传入,避免并发多局撞固定 4320/9222(决策③)。 """ st = cheap_run.stage(game_id) if not st["ok"]: print(f"[cheap-gates] game={game_id} stage 失败(判未过):{st['output'][:300]}", flush=True) return {} # smoke 作 boot 预检(早捕装载失败,诊断更清);其 _forensicsView state 曾供 ensure_play_spec 推断驱动器, # W-AXIS-V2 波2 拆 tap-targets 驱动器后不再消费——便宜档验收权威改四门投影(A/B/C/D)∧ 测试 agent 真玩, # 九门以 undriven 硬集(A/B/C/D + F/G/I)跑,floor 投影只取 A/B/C/D。ensure_play_spec 不再调。 cheap_run.smoke(game_id, port=port, cdp_port=cdp_port) # 红线③(封陈旧 verdict 假绿,镜像 tier2 run.py:866):起 play 前清残留 verdict,保证 judge 拿到的恒是本次真门产出。 # serve-and-play.sh 早退路径(chrome/serve/cdp 未就绪)+ 超时都不写新 verdict 也不删旧的,不清则 play 读回上一局绿 verdict → 假绿放行。 (cheap_run.wg1_game_dir(game_id) / "evidence" / "verdict.json").unlink(missing_ok=True) pr = cheap_run.play(game_id, port=port, cdp_port=cdp_port) return pr.get("verdict") or {}