fix: 断点丢失时 goal-resume 拒绝成 failed,阻断自动恢复空转

2026-10-29 长任务实弹:Docker goal 断点续跑在 host-state 里找
不到任务时抛 KeyError,worker 把无结论异常退出判 interrupted,
自动恢复再排队、再 KeyError,12 秒一轮空转 49 次(人工暂停
拦下,第 50 次人工续跑又烧掉),文件 32 章原样未动。
修法:host.py goal-resume 先查任务在不在 state 里,不在就打印
拒绝行、正常退出;sandbox 三处解析(本地、Docker resume、
Docker 断点)见拒绝行即判 failed 终态,不进自动恢复循环。
单测:host 缺任务拒绝不炸 + 三处解析拒绝判 failed。
This commit is contained in:
host committed 2026-10-29 14:14:13 +08:00
1 parent e48b756f96
commit a5f2e4e091
4 files changed
+138 -3

No files matched your search

+31
View File
@@ -391,6 +391,37 @@ class TestGoalExecutors(unittest.TestCase):
self.assertEqual(result["status"], "interrupted")
self.assertIn("boom", result["goal_error"])
def test_goal_resume_refusal_is_failed_not_interrupted(self):
# 断点丢失拒绝(2026-10-29 实弹):host-state 里没有任务时
# goal-resume 只打印拒绝行、正常退出;三处解析(本地、
# Docker goal_resume_task、Docker 断点)都必须判 failed
# 终态,绝不能判 interrupted——否则自动恢复 12 秒一轮
# 空转到 50 次上限。
refusal = ("goal-resume 拒绝:host-state 里没有该任务 t1,"
"断点已丢失,不能续跑\n")
fake = SimpleNamespace(returncode=0, stdout=refusal, stderr="")
result = LocalExecutor("/fake/host.py",
runner=lambda cmd: fake
)._goal_result_from_runner("t1", fake)
self.assertEqual(result["status"], "failed")
self.assertIn("goal-resume 拒绝", result["goal_error"])
def fake_runner(cmd, timeout=None, env=None):
return SimpleNamespace(returncode=0, stdout=refusal,
stderr="")
with mock.patch("sandbox.shutil.which",
return_value="/usr/bin/docker"):
executor = DockerExecutor(
"/fake/host.py", runner=fake_runner,
env={"XCM_API_KEY": "placeholder-not-a-real-key"})
for method in ("goal_resume_task",
"goal_resume_breakpoint_task"):
result = getattr(executor, method)(
{"id": "t1", "prompt": "do it"})
self.assertEqual(result["status"], "failed")
self.assertIn("goal-resume 拒绝", result["goal_error"])
def test_local_goal_task_already_exists_names_retry(self):
def fake(cmd):
return SimpleNamespace(