<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已设为current、branch或worktree时,change 还会通过bound_branch固定到建立隔离的分支。发生漂移时,切回原分支;只有你明确确认当前分支应接管 change 后,才运行comet state rebind <change-name>。- 不要手工编辑
current-change.json。
三类状态 + 一层配置

.comet.yaml 告诉你当前在哪,Run state 让运行时恢复,state events 解释状态为什么变了
项目配置:.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。native.artifact_root、native.language 和 native.clarification_mode 的含义及完整示例见 Native 配置。Native 不读取 Classic 的 context_compression、review_mode 或 auto_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 说明都会按这个配置输出,而不是按某次触发请求的语言临时判断。
配置优先级
以下优先级只描述 Classic 的language、context_compression、review_mode 和 auto_transition。共享入口字段与 native.* 不使用 Classic change 级覆盖:
auto_transition 详解
auto_transition 控制阶段推进后是否自动调用下一个 Skill。
环境变量覆盖(仅 change 级为空时生效):
.comet.yaml 字段全表
每个活跃 change 的.comet.yaml 包含以下字段。
工作流与阶段
执行方式
验证与分支
路径引用
时间与归档
机器管理字段(machine-managed)
这些字段都由 Comet 自动写入,日常使用不需要关心,也不出现在用户可见的字段参考里。它们在源码里统称 machine wire keys,但按”能否通过comet state set 修改”分两类:
classic_profile、classic_migration、run_id 是 machine-owned 字段,set 会被硬拒绝(报错 “is a machine-owned Run field and cannot be set directly”)。它们只由状态机的 transition 事件和归档流程写入,例如 preset-escalate 会原子地把 classic_profile 设为 full。
状态机硬约束
这些约束同时存在于comet guard 和 comet 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_profile为full,回退phase到design,清除design_doc。 - 这是预设→full 升级的唯一合法通道——直接
set phase design被硬阻止,set classic_profile是 machine-owned 也被硬阻止。
状态转换审计日志
Classic 状态转换共用同一套语义。成功的comet state transition、comet guard --apply 和归档更新都会追加一行 JSON 到:
环境变量
COMET_LANGUAGE、COMET_AUTO_TRANSITION、COMET_FORCE_PHASE、
COMET_OPENSPEC 是用户可用的环境变量。COMET_CONTEXT_COMPRESSION 和
COMET_REVIEW_MODE 存在于解析层但未在用户文档中正式记录,主要用于内部和测试。怎么配置
配置项目默认值
编辑.comet/config.yaml:
临时覆盖(环境变量)
状态和 Run state 的边界
.comet.yaml 保存用户可理解的工作流投影。Engine 运行细节放在 .comet/run-state.json。两者通过 run_id 链接。
详见Skill 与 Engine(进阶)。
下一步
- 上下文压缩机制 — context_compression 的 off/beta 模式详解
- 代码审查机制 — review_mode 的 off/standard/thorough 详解
- Skill 与 Engine(进阶) — Run state 和 Engine 运行语义
- 工作流概念 — 五阶段如何使用这些状态字段

