Skip to main content
open 阶段会把你的想法变成一个可执行的 change:探索需求、澄清范围、创建 proposal/design/tasks,并初始化 Comet 状态。你会经历一段引导式对话。Comet 会反复提问,确认理解一致后再写文档。
正常使用时只要运行 /comet。 项目配置为 Classic 后,请求会转发到 /comet-classic,再根据文件状态判断当前阶段并调用 /comet-open。 本文介绍的是内部阶段 Skill。只有你想手动控制 阶段时,才需要直接输入。详见 本阶段如何触发

本阶段如何触发

/comet-open 通常由 /comet 进入 Classic 后自动路由。内部 /comet-classic 会读取 active change 列表与文件状态,整理路由上下文,再由运行时评分决定路由到哪个阶段。

默认:用 /comet 自动识别

/comet-classic 每次调用都重新读取文件状态(不依赖对话历史),按以下条件路由到 open 阶段: 输入 /comet 并描述想做什么即可。配置选择 Classic 后,内部 /comet-classic 会判断是否需要新建 change,并在 open 完成后自动衔接 design。详见自动推进机制

手动:什么时候才需要直接 /comet-open

  • 关闭了自动衔接(auto_transition: false)时,/comet-classic 推进完一个阶段会停下。你需要手动调用下一个阶段 Skill。
  • 只想单独跑 open 阶段(调试、或在阶段之间插入人工审核)。
正常使用统一入口 /comet;只有手动控制阶段时才直接调用阶段命令。

创建 Change 时选择工作区

创建 Classic change 时,Comet 会在生成 OpenSpec 产物和状态文件之前确认工作区:
  • current:在当前分支串行工作;
  • branch:创建独立分支,但仍使用当前目录;
  • worktree:创建或复用独立 worktree,适合并行工作或当前目录已有改动。
如果已有登记且分支匹配的 worktree,Comet 会直接复用。分支仍存在但 worktree 缺失时,会在恢复过程中重建。你按 /comet 的提示选择即可,不要手工复制 change 目录。

你会经历什么

open 阶段通过多轮对话 + 多个停顿点逐步生成文档。全程用你触发工作流时用的语言提问和产出文档。

小鱼把模糊想法经过澄清和确认整理成 proposal、design 和 tasks 三份文档

open 阶段把模糊想法过滤成三份可执行的 OpenSpec 产物

第一步:探索想法与澄清需求

Comet 加载 openspec-explore围绕你的想法持续提问,直到能整理出一份完整的澄清摘要。它不会把一次问答当成“够了”。会一直问到这五个部分都清楚:

停顿点 2:PRD 拆分预检查(条件触发)

如果你的输入是一个大型 PRD、路线图或完整产品计划,或者澄清摘要里出现了多个独立能力,Comet 会在这里暂停,给你一份候选拆分清单(每个拆分项含建议名称、目标范围、非目标、依赖顺序、核心验收场景),然后让你三选一:
拆分后 Comet 不会自动推进任何单个 change 到 design。它会暂停问你想先做哪一个,只推进你选的那个,其余保持活跃,之后用 /comet 恢复。

停顿点 3:工作区决策

创建产物和 .comet.yaml 之前,Comet 让你确定工作区隔离方式(这一步不能推迟到 build): 选择结果写入 isolation,实际目录的当前分支记录为 bound_branch,后续入口检查会阻止意外切换分支。hotfix/tweak 预设默认 current 需求澄清和命名是非阻塞的:范围和命名都明确时,Comet 从需求推导唯一的 kebab-case 英文名(如 refine-requirements-doc)并直接展示;只有存在会改变范围或 change 身份的互斥选择、或名字与已有 change 冲突时才单独询问。确认前不会创建 proposal/design/tasks,也不会用 openspec-propose 一次性生成。

第二步:创建 change 结构

加载 openspec-new-change。完整工作流默认不加载 openspec-propose(一次性生成全部),只有你明确要求时才允许。Comet 用标准产物循环逐个生成 proposal → design → tasks:
  1. 刷新状态:openspec status --change "<name>" --json
  2. 获取指令:openspec instructions proposal|design|tasks --change "<name>" --json
  3. 读取 dependencies、遵循 templateinstruction、应用 context/rules 约束(不复制到文档内容里)、写入 resolvedOutputPath
  4. 每个 artifact 后再刷新状态确认
如果 openspec instructions 失败、返回无效 JSON、或没提供可用的 resolvedOutputPath,Comet 会立即停止并报告 OpenSpec 错误, 不会回退成硬编码文档结构——那会绕过项目规则。change 名必须是你确认过的 kebab-case 名,Comet 不会自作主张扩大或缩小范围。

第三步:入口状态验证 + 内容完整性检查

然后逐个确认三个文件存在且非空:proposal(背景/目标/范围)、design(架构决策/选型/数据流)、tasks(任务描述)。任何一个缺失或为空,Comet 都不会继续,而是回到创建步骤。

停顿点 4:审视三个文档并确认

Comet 把三个文档的摘要摆给你看(proposal 的背景目标范围、design 的架构决策选型、tasks 的任务数和关键任务),然后让你二选一

退出:推进到下一阶段

--apply 是必须的——没有它 .comet.yaml 会停在 phase: open,下一阶段的入口检查会失败。full workflow 推进到 phase: design;hotfix/tweak 直接跳到 phase: build(跳过 design)。

调用的 skill

完整工作流默认不加载 openspec-propose (一次性生成全部产物)。只有用户明确要求时才允许。

产物

下图用 <classic-root> 表示当前 Classic OpenSpec 根目录:新项目默认是 docs/openspec/,保留旧布局的项目是 openspec/。实际位置由 .comet/config.yaml 中的 classic.artifact_layout 决定。
<classic-root>/changes/<name>/
.openspec.yaml
.comet.yaml
proposal.md
design.md
tasks.md
初始化 Comet 状态:

幂等性:可以安全重复

open 阶段所有操作都可以安全重复执行。如果 .comet.yaml 已经在 phase: open 且三个产物都已存在,Comet 会跳过已完成步骤,从第一个缺失的步骤继续。这让你在中断后重新调用 /comet 也不会搞乱状态。

停顿点一览

open 阶段有 3 个停顿点(全局编号 2-4,整个五阶段工作流共 10 个,见五阶段停顿点和用户选择点): 需求澄清和命名默认非阻塞:范围和命名都明确时直接继续,Comet 从需求推导唯一的 kebab-case 英文名并直接展示;只有存在会改变范围或 change 身份的互斥选择时才单独询问。 所有停顿点都遵循决策点协议——Comet 不能用推荐规则、默认值或”用户应该会同意”来代替你的明确选择。

常见问题

不要用 /opsx:new 绕过。它只创建 OpenSpec artifacts,不会创建 .comet.yaml,change 会落在 Comet 状态机之外。重新运行 /comet;配置进入 Classic 后会通过 /comet-open 补齐状态。
必须是 kebab-case 英文(小写字母、数字、连字符)。中文或非合规名称会被转换成 kebab-case;只有一个名字时直接使用并展示,存在多个候选或与已有 change 冲突时才报告让你选择。
Comet 会立即停止 artifact 创建并报告 OpenSpec 错误,不会回退为硬编码文档结构。检查 OpenSpec CLI 是否正常、template/instruction/dependencies 是否满足。
不一定。拆分预检查会给你三选一(拆分 / 保持一个 / 调整方案),你可以选择保持为一个 change,但要把不拆的原因记进文档。

下一步

最后修改于 2026年9月4日