Plan 系统
wesgine Plan 状态机:线性清单、步骤管理、完成收口与中断处理。
设计范式
Claude Code 范式:LLM 驱动线性清单。
- 执行顺序 = 数组顺序
- 无
depends_on、无HasCycle、无DepsReady - 引擎不隐式推进(auto-advance 已删除)
Plan 工具 API
创建
plan(action=create, steps=[...])
更新步骤
plan(action=update, task_id=<index>, status=done|in_progress|skipped)
完成
plan(action=complete)
PlanStatus 枚举
四值枚举替代双 bool(Completed + Interrupted):
| 状态 | 含义 |
|---|---|
planning | 初始/规划中 |
active | 执行中 |
completed | 模型声明完成 |
terminated | 异常终止 |
TerminationReason
| 原因 | 触发 |
|---|---|
run_interrupted | Run 异常终止(非 end_turn) |
nudge_exhausted | Plan-pending nudge 耗尽 |
validation_failed | 验证失败 |
迁移函数
| 函数 | 用途 |
|---|---|
ApplyCompletion | 模型 plan(complete) 时调用 |
ApplyTermination | 异常终止时调用 |
terminated → completed 是合法 resume 迁移。
completed → terminated 非法。
步骤完成与实质化(INV-PE-15)
done 与工作发生过同构。
session ledger
PlanStep.Substantiated ∪ PlanWorkThisTurn
盖章对象
execute 开始时给全部 open(pending + in_progress) 步骤盖章。
引擎无法把 grep 归属到某一步,禁止 first-pending-only。
记账可以是下一轮
先做完多步 read/grep/exec,下一轮 plan-only 批补标 done——合法。
Plan-Pending Nudge
Run 即将 end_turn 但 Plan 仍有 pending 步骤时触发。
上限
严格 3 次(maxPlanPendingNudges)。
耗尽后 Run 正常终止,步骤留在 pending。
Completed Plan 跳过 Nudge
!IsTerminal() 有意跳过 completed 计划。
complete 收口
plan(action=complete) 收口剩余 open 步骤为 done。
Composer PlanTracker 数的是步骤分数,completed + pending 会显示 3/5。
异常终止(INV-PE-13)
非 end_turn 终止 + pending 步骤 → EventPlanInterrupted。
11 种非 end_turn 终止原因:
- budget_exhausted
- cycle_detected
- quality_revision_limit
- context_cancelled
- cognitive_error
- execute_error
- panic_stop
- ...
持久化
Plan 是 SessionState 的子字段(INV-CTX-46)。
随 CognitiveSettlement 一同持久化。
Frontmatter
status: active
termination_detail:
reason: nudge_exhausted
Plan 工具分类
Plan 在 toolCategoryMap 内置分类为 categoryExploration。
探索预算 + 进度减半。
应用层不得重复声明 ExtraCategories / progressAwareTools。
补标(INV-PE-14)
PlanCompleted 状态允许步骤终态补标(done/skipped,幂等)。
PlanTerminated 保持锁定。
相关文档
- Run 生命周期 →
run-lifecycle.md - TaskMemory →
task-memory.md - 认知结算 →
cognitive-settlement.md