### 目标问题(Why) - 当前痛点:继续对话时,如果上一轮已经清空或完成 todo,context builder 会省略 Todo State 区块,模型无法明确区分“没有待办”和“旧待办仍可沿用”,容易在后续推理中继续写入已清空的 todo,形成 todo conflict。 - 触发场景:用户继续已有会话,todo 列表为空或全部处于终态;runtime 进入验证后仍可能回到执行阶段处理补充动作。 ### 设计方案(How) - 核心设计:当 `internal/context` 的 todo source 没有活跃 todo 时,仍输出 `Todo State: None`,把“无活跃 todo”作为显式上下文状态传给模型。 - 关键机制:同时覆盖空列表与全部终态两个边界,避免通过省略区块表达状态;在 `runtime/controlplane` 允许 `verify -> execute` 转换,支持验证阶段发现仍需执行时回到执行态。 - 边界与非目标:本提案不改变 todo 的持久化结构、不新增工具能力、不调整 TUI 展示协议,也不把 todo 状态散落到 UI 层。 ### 落地清单(What) - [x] `internal/context/source_todos.go` 在无活跃 todo 时输出 `Todo State: None` - [x] `internal/context/source_todos_test.go` 覆盖空 todo 与全部终态 todo 的显式输出 - [x] `internal/runtime/controlplane/phase.go` 允许 `RunStateVerify` 回到 `RunStateExecute` - [x] `internal/runtime/controlplane/phase_test.go` 覆盖 `verify -> execute` 合法转换 ### 验收标准(Done) - [x] 空 todo 输入时,context builder 返回单个 `Todo State` 区块且内容为 `None` - [x] 全部终态 todo 输入时,context builder 返回单个 `Todo State` 区块且内容为 `None` - [x] control plane 接受 `verify -> execute` 状态转换 - [x] `go test ./internal/context ./internal/runtime/controlplane` 通过 ### 风险与回滚 - 风险:系统提示中会固定出现 `Todo State: None`,可能略微增加上下文 token;但该状态能消除继续对话时的歧义,收益高于成本。 - 回滚方案:如发现模型对 `None` 语义处理不符合预期,可回滚 context 输出逻辑与 `verify -> execute` 状态转换,恢复为无活跃 todo 时不输出区块。
目标问题(Why)
设计方案(How)
internal/context的 todo source 没有活跃 todo 时,仍输出Todo State: None,把“无活跃 todo”作为显式上下文状态传给模型。runtime/controlplane允许verify -> execute转换,支持验证阶段发现仍需执行时回到执行态。落地清单(What)
internal/context/source_todos.go在无活跃 todo 时输出Todo State: Noneinternal/context/source_todos_test.go覆盖空 todo 与全部终态 todo 的显式输出internal/runtime/controlplane/phase.go允许RunStateVerify回到RunStateExecuteinternal/runtime/controlplane/phase_test.go覆盖verify -> execute合法转换验收标准(Done)
Todo State区块且内容为NoneTodo State区块且内容为Noneverify -> execute状态转换go test ./internal/context ./internal/runtime/controlplane通过风险与回滚
Todo State: None,可能略微增加上下文 token;但该状态能消除继续对话时的歧义,收益高于成本。None语义处理不符合预期,可回滚 context 输出逻辑与verify -> execute状态转换,恢复为无活跃 todo 时不输出区块。