长任务 P0 三件:断点进库、错误分类+熔断、Run/Step 时间线

断点进库:task_checkpoints 表(PG 新库 + 老库幂等补表 + 迁移清单
对齐);worker 在 goal 任务执行期间每 30 秒把磁盘 host-state 断点
镜像进库,终局再补一次;断点续跑认领前,若 host-state 条目丢失
但库里有断点,先按库断点重建最小条目再跑,库里也没有断点时不
造假、走原有拒绝路径。

错误分类+熔断:sandbox 四处解析加永久错误分支(KeyError、配置
缺失等无结论异常退出判 failed 死信,不再判 interrupted;host 已
明言 interrupted 的不受影响,未知错误不分类);worker 自动恢复
加退避(10 秒起指数退避、封顶 300 秒)与无进展熔断(库断点轮次
连续 3 次不变即标 auto_resume_stalled 等人工)。

时间线:task_steps 表 + host 每轮写 host-steps 步骤文件 + worker
导入;GET /tasks/{id}/timeline 一次返回 steps 与 checkpoints;
认领、暂停、自动恢复、终局都记步骤。旧任务返回空数组,不编造。

单测:cloud/tests/test_p0_three.py 14 项(分类、熔断、镜像重建、
步骤导入去重、timeline 接口)。
This commit is contained in:
host committed 2026-10-29 15:13:01 +08:00
1 parent d56bd3a99e
commit 585242fc8f
7 files changed
+982 -3

No files matched your search

+26
View File
@@ -805,6 +805,32 @@ POSTGRES_SCHEMA = (
"action TEXT, "
"detail TEXT, "
"created_at DOUBLE PRECISION)",
# P0 三件:断点与步骤事实源(PG 新库一次建齐;老库走
# server/worker 的 ensure 幂等补表,不丢数据)。
# task_checkpoints:每轮断点快照(worker 镜像线程 + 终局
# 导入写),(task_id, round_no) 唯一;断点丢失时可据此
# 重建 host-state 续跑,不再只信容器里的 host-state.json。
"CREATE TABLE IF NOT EXISTS task_checkpoints("
"task_id TEXT, "
"round_no INTEGER, "
"thread_id TEXT, "
"goal_status TEXT, "
"state_sha TEXT, "
"verify_out TEXT, "
"created_at DOUBLE PRECISION, "
"PRIMARY KEY(task_id, round_no))",
# task_steps:Run/Step 时间线(worker 侧 claim/resume/final
# + host 每轮 round + 镜像导入),timeline 接口直读此表。
"CREATE TABLE IF NOT EXISTS task_steps("
"id TEXT PRIMARY KEY, "
"task_id TEXT, "
"step_no INTEGER, "
"kind TEXT, "
"summary TEXT, "
"state_sha TEXT, "
"created_at DOUBLE PRECISION)",
"CREATE INDEX IF NOT EXISTS idx_task_steps_task"
" ON task_steps(task_id, step_no)",
"CREATE TABLE IF NOT EXISTS projects("
"id TEXT PRIMARY KEY, "
"name TEXT, "