Skip to main content
Comet 的恢复能力来自文件化状态。理解用户可读状态、机器运行状态、追加审计日志和项目配置,你就能知道 Comet 在每个阶段读什么、用户能配置什么、以及阶段推进为什么发生。 下文用 <classic-root> 表示当前 Classic OpenSpec 根目录:新项目默认是 docs/openspec/,保留旧布局的项目是 openspec/。实际位置由 classic.artifact_layout 决定,详见项目文件结构

先看用户能改什么

日常使用优先改 .comet/config.yaml 的项目默认值;.comet.yaml 是某个 change 的状态投影,Run state 是机器恢复细节。

当前 change 选择

.comet/current-change.json 保存当前明确选择的 workflow 和 change。它在多个 active change 并行时消除写入歧义,不替代 Classic 的 .comet.yaml 或 Native 的 comet-state.yaml
  • 只有一个 active change 时可以自动归属。
  • 多个 active change 时,进入目标 change 后必须显式 select
  • 目标归档、选择文件损坏或 workflow 不匹配后,守卫会失败闭合。
  • isolation 已设为 currentbranchworktree 时,change 还会通过 bound_branch 固定到建立隔离的分支。发生漂移时,切回原分支;只有你明确确认当前分支应接管 change 后,才运行 comet state rebind <change-name>
  • 不要手工编辑 current-change.json

三类状态 + 一层配置

小鱼给 .comet.yaml、run-state 和 config.yaml 三层状态抽屉贴标签

.comet.yaml 告诉你当前在哪,Run state 让运行时恢复,state events 解释状态为什么变了

不要手工编辑 .comet/run-state.json 的 machine-owned 字段,也不要手工把已归档 change 标成完成。归档应通过 /comet-archive 完成。

项目配置:.comet/config.yaml

.comet/config.yaml 是 Native 与 Classic 共用的项目级配置,全局一份。共享入口字段位于顶层;Native 和 Classic 默认值分别放在 native:classic: 块中。

当前结构

同时启用两套工作流并选择中文时,项目级安装会生成类似配置:

共享字段与 Classic 字段

下面这些 classic.* 字段只属于 Classic。artifact_layout 是项目级目录选择;其余四项会在创建新 Classic change 时快照到该 change 的 .comet.yaml
修改 default_workflow 只改变 /comet 的入口,不迁移任何 change。Classic 项目默认值在创建新 change 时快照到 .comet.yaml;之后修改不会追溯改变已有 change。
直接修改 classic.artifact_layout 只会改变 Comet 读取的目录,不会移动已有产物。已有项目切换布局时,应使用 comet classic root move docs —dry-run 检查当前状态、冲突和阻塞项,再用 comet classic root move docs —apply 执行迁移。
native.artifact_rootnative.languagenative.clarification_mode 的含义及完整示例见 Native 配置。Native 不读取 Classic 的 context_compressionreview_modeauto_transition

产物语言和 Skill 语言的区别

comet init 里的“Skill 语言”会决定安装中文还是英文版 Comet Skill。Classic 的产物语言写入 classic.language;Native 的产物语言写入 native.language 之后新建 Classic change 时,Comet 会把项目级 classic.language 快照到 <classic-root>/changes/<name>/.comet.yaml。OpenSpec proposal、design、tasks、Superpowers 设计/计划、验证报告和 archive 说明都会按这个配置输出,而不是按某次触发请求的语言临时判断。
项目级和 change 级语言值只接受 enzh-CNzh 只用于 comet init —language zh 的 CLI 选择,不是 .comet/config.yaml 的合法值。

配置优先级

以下优先级只描述 Classic 的 languagecontext_compressionreview_modeauto_transition。共享入口字段与 native.* 不使用 Classic change 级覆盖:

auto_transition 详解

auto_transition 控制阶段推进后是否自动调用下一个 Skill。
阶段推进一定发生——guard 的 —apply 总是更新 phase 字段,与 auto_transition 无关。auto_transition 只影响是否自动调用下一个 Skill。用户决策点(确认 proposal、选择执行方式等)无论 auto_transition 是什么都会阻塞。
环境变量覆盖(仅 change 级为空时生效):

.comet.yaml 字段全表

每个活跃 change 的 .comet.yaml 包含以下字段。

工作流与阶段

执行方式

验证与分支

路径引用

时间与归档

机器管理字段(machine-managed)

这些字段都由 Comet 自动写入,日常使用不需要关心,也不出现在用户可见的字段参考里。它们在源码里统称 machine wire keys,但按”能否通过 comet state set 修改”分两类: classic_profileclassic_migrationrun_id 是 machine-owned 字段,set 会被硬拒绝(报错 “is a machine-owned Run field and cannot be set directly”)。它们只由状态机的 transition 事件和归档流程写入,例如 preset-escalate 会原子地把 classic_profile 设为 full

状态机硬约束

这些约束同时存在于 comet guardcomet state transition 两个守卫层:
直接 comet state set <name> phase <value> 会被硬阻止,除非设了 COMET_FORCE_PHASE=1(仅修复用)。阶段推进只能通过 comet guard —apply 或合法 transition。

预设升级

hotfix/tweak 命中升级信号(跨模块、新 API、schema 变更等)时,通过 preset-escalate 转换升级到 full:
  • 原子地设置 workflow/classic_profilefull,回退 phasedesign,清除 design_doc
  • 这是预设→full 升级的唯一合法通道——直接 set phase design 被硬阻止,set classic_profile 是 machine-owned 也被硬阻止。

状态转换审计日志

Classic 状态转换共用同一套语义。成功的 comet state transitioncomet guard --apply 和归档更新都会追加一行 JSON 到:
每条记录包含:

环境变量

COMET_LANGUAGECOMET_AUTO_TRANSITIONCOMET_FORCE_PHASECOMET_OPENSPEC 是用户可用的环境变量。COMET_CONTEXT_COMPRESSION COMET_REVIEW_MODE 存在于解析层但未在用户文档中正式记录,主要用于内部和测试。

怎么配置

配置项目默认值

编辑 .comet/config.yaml
提交到仓库,团队成员的新 change 会用这些默认值。

临时覆盖(环境变量)

影响当前会话,不改文件。

状态和 Run state 的边界

.comet.yaml 保存用户可理解的工作流投影。Engine 运行细节放在 .comet/run-state.json。两者通过 run_id 链接。 详见Skill 与 Engine(进阶)

下一步

最后修改于 2026年8月2日