Plan 状态枚举与迁移

wesgine 使用 PlanStatus 枚举替代双 bool(Completed + Interrupted),消除非法状态组合。


状态枚举

状态含义
planning初始态,计划正在构建
active计划已创建,步骤执行中
completed模型声明完成
terminated异常终止

迁移函数

ApplyCompletion

模型调用 plan(action=complete) 时触发:

planning → completed ✓
active → completed ✓
terminated → completed ✗ (非法)
completed → completed ✓ (幂等)

完成时收口剩余 open 步骤为 done。

ApplyTermination

Run 异常终止时触发:

planning → terminated ✓
active → terminated ✓
completed → terminated ✗ (非法,完成的计划不能被终止)
terminated → terminated ✓ (幂等)

携带 TerminationReason:

Reason触发条件
run_interruptedRun 被中断(用户/budget/cycle)
nudge_exhaustedPlan-pending nudge 3 次耗尽
validation_failed验证失败

终态判定

IsTerminal() 返回 true:

终态的 Plan:


终结收口点

三处收口,全部改调迁移函数:

位置动作
control.go nudge 耗尽ApplyTermination(nudge_exhausted)
loop.go runEndApplyTermination(run_interrupted)
builtin/plan.go planCompleteApplyCompletion()

持久化

Plan 状态通过 frontmatter 持久化到 artifact:

---
status: active
termination_reason: ""
termination_detail: ""
---
# Plan: 重构数据库

## Steps
...

旧格式兼容

PlanStatusFromArtifact 是全函数:


水合语义

Store 保留 terminated(resume-then-complete 合法):

仅 completed 排除再进入。


事件映射

迁移事件
→ completedEventPlanComplete
→ terminatedEventPlanInterrupted
nudge 耗尽EventPlanNudge(提醒非错误)

事件名与载荷未变,前端零改动。


步骤状态

步骤状态含义
pending等待执行
in_progress执行中
done已完成
skipped已跳过

完成收口

ApplyCompletion 时将所有 open(pending + in_progress)步骤收口为 done。

实质化(INV-PE-15)

步骤标记 done 需要"工作发生过":


相关文档