隔离与成果交回
当链显式开启隔离(isolate: true——注意这不是默认值,省略时链会直接在当前目录跑)时,CC Run chain 不会在你的当前工作目录里直接动手,而是创建一个临时工作区,所有 segment 在里面操作,等一切完成后才决定是否把成果交回给你。
为什么要隔离
这是从一次事故中学到的教训。
旧版实现在"清理"阶段无条件删除了临时产物。一条链跑了三段,审查段判定 needs-work,但清理逻辑不管判定——直接把所有中间文件清掉了。用户想对照 findings 手动修复时,文件已经没了。
结论:绝不静默销毁成果。隔离的目的是安全——隔离区可回滚、可丢弃、但绝不偷偷删除。
两种隔离模式
| 场景 | 隔离方式 | 原理 |
|---|---|---|
| Git 仓库 | 临时 worktree | 基于当前分支创建临时分支,在其中工作,每段结束自动 commit |
| 非 Git 目录 | copydir 快照 | 复制整个工作目录到临时路径,在副本中操作 |
Git worktree 是首选方案:创建快、不重复拷贝文件、可以随时切回去看原始状态、变更可追溯(每段一个 commit)。
三种终态
chain 跑完后,引擎自动(不再问你)按「最后一次审查的 verdict」决定临时工作区的归宿,规则 fail-closed——只有明确通过才合并:
| 终态 | 触发条件 | 动作 |
|---|---|---|
| 完成且通过 | 审查段 verdict = pass | 合并回当前分支 → 删除临时分支 |
| needs-work | 审查段 verdict = needs-work | 保留成果 → 打印取回路径 |
| 判定缺失 | 审查段没写出 / 写错 verdict | 保留成果 → 打印取回路径(不确定不放行) |
| 无审查段 | 链里没有任何 review: true 段 | 没有质量闸,合并回当前分支 |
| 错误 / 退出 | 运行中异常或用户中途 q 退出 | 保留成果 → 打印取回路径 |
铁律
只有「明确 pass」或「整条链没有审查段」会触发合并。其余所有路径——needs-work、判定缺失、错误、退出——一律保留成果、打印取回路径。成果绝不静默消失。所以:想让审查真正起到拦截作用,就别忘了放一个 review: true 段。
worktree 的局限
Git worktree 只覆盖 Git 已跟踪的文件。以下内容不在隔离范围内:
.gitignore中的文件(如node_modules、构建产物)- 未跟踪的新文件(
git status --untracked)
如果你的链需要严格的完整文件隔离,考虑在非 Git 场景下使用 copydir 模式,或手动确保关键文件已被 Git 跟踪。
交回流程(Git worktree 场景)
chain 跑完 → verdict = pass(或链中无审查段)
→ 引擎自动将临时分支 merge 回当前分支(先 --ff-only,失败再普通 merge)
→ 删除临时 worktree + 临时分支
→ 输出 merge summary如果 verdict = needs-work(或判定缺失 / 出错 / 退出):
chain 跑完 → 未通过
→ 移除临时 worktree 目录(注意:临时目录会被删,但提交都在分支上,不丢)
→ 打印类似:
"审查判定 needs-work,成果未自动合入,保留在
分支 ccr-chain/plan-impl-review-1718000000
(git merge ccr-chain/plan-impl-review-1718000000 取回 /
不要可 git branch -D ccr-chain/plan-impl-review-1718000000)"成果保留在那条临时分支上(分支名带时间戳)。你切回原分支检查,满意了用 git merge <分支名> 取回,不要就 git branch -D <分支名> 删掉。
worktree 与 copydir 的取回差异
上面是 git worktree 场景——临时工作目录会被移除,成果以提交形式留在临时分支上。copydir(非 git 目录)场景则相反:临时目录本身被保留,路径直接打印给你,去那个目录里取文件即可。
下一步
→ 安全