Skip to content

调整 Plan/Build Todo 语义 #659

@Yumiue

Description

@Yumiue

current

计划模式会写todo,但是转化为build模式后,todo清空使得用户感知不明显todo作用,且按照市面普遍,计划模式是不会写todo的

Summary

将当前行为改为:plan 模式只负责研究、澄清和输出可读计划草案,不创建或维护执行态 session.Todosbuild 模式在真正开始执行复杂任务时才通过 todo_write 生成和推进 todo。这样更接近主流 coding agent:计划是交互/审批产物,todo 是执行进度状态。

Key Changes

  • 移除 plan 模式对 todo_write 的可见性和执行许可:只保留只读工具与 ask_user
  • 修改 plan prompt:不再要求 plan_spec.todos 非空,不再要求 summary_candidate.active_todo_ids,计划输出聚焦 goal / steps / constraints / open_questions
  • 修改 runtime plan 落库逻辑:PlanSpec.Todos 不再自动灌入 session.Todos;旧 plan revision 替换时也不再通过 plan-owned todo 做取消/继承。
  • 保留 build bootstrap:当 build 模式没有 active todos 时,由现有 todoBootstrapRequiredReminder 引导模型在执行前用 todo_write action=plan/add 创建当前 run 的执行 todo。
  • 更新 plan/build 文档与测试预期,明确 CurrentPlan 是计划上下文,Todo State 是 build 执行状态,两者不再在 plan 模式自动绑定。

Implementation Notes

  • 重点修改 internal/tools/mode_filter.go,从 read-only 可见工具和 read-only write 例外中移除 ToolNameTodoWrite
  • 重点修改 internal/promptasset/templates/context/plan_mode_plan.mdinternal/promptasset/templates/core/capabilities_plan.mdinternal/runtime/todo_bootstrap.go 中 plan bootstrap 文案。
  • 重点修改 internal/session/plan.gointernal/runtime/planning.go:允许 PlanSpec.Todos 为空,并停止 applyCurrentPlanRevisionsession.Todos 补写 plan todo。
  • 被触碰的乱码中文注释/提示文案按 UTF-8 无 BOM 修复,避免继续提交 mojibake。

Test Plan

  • 更新并新增 internal/tools 测试:plan/read-only 模式下 todo_write 不可见且执行会被阻断,ask_user 仍可用。
  • 更新 internal/runtime plan 模式测试:输出 plan JSON 后只持久化 CurrentPlan,不新增 session.Todos
  • 更新 build 模式测试:无 plan/无 todo 时仍触发 build todo bootstrap;有 CurrentPlan 但无 todo 时,build 仍应创建当前 run todo。
  • 更新 internal/context / internal/promptasset 测试:plan prompt 不再包含强制 plan_spec.todos must be non-emptysummary_candidate.active_todo_ids 等要求。
  • 运行 go test ./...,必要时补充覆盖 plan/build 切换、旧会话迁移、plan revision 替换不污染 todo 的回归场景。

Assumptions

  • 采用“Build 写 Todo”语义:plan 模式不写执行态 todo。
  • 暂不删除 PlanSpec.Todos 字段,以降低迁移风险;字段可兼容旧数据,但新 prompt 和 runtime 不再依赖它。
  • CurrentPlan 仍可在 build 模式作为上下文指导执行,但是否拆成 todo 由 build 阶段模型通过 todo_write 明确完成。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions