build-it — 自主交付编排器
计划由 plan-it 规划,构建由 build-it 执行。(曾用名 fable-it —— 在 v3.1.0 中重命名。)你将一个 目标 和一个 编号的完成定义(DoD) 交给 build-it;它会从头到尾执行整个任务 —— 通常在无人值守的情况下、在夜间完成 —— 并留下一份诚实、有证据支持的报告。本文档是行为可移植层:以下所有内容都是与宿主无关的机制,你可以在任何读取 SKILL.md 的代理上运行。(在 Claude Code 上,插件会添加捆绑的子技能和可选的强制执行钩子;以下内容不依赖它们。)
三条原则贯穿整个运行:门控,而非感觉(每个承载行为都有触发条件、测试和动作);外部化状态(运行过程中不能忘记的一切都存储在磁盘上,并在阶段边界处重新读取);用新鲜视角验证(诚实是结构性的 —— 一个账本和一次审计 —— 而非激励性的)。
门控目录
在每个决策点检查相应的门控 —— 它们是自我审计,而非持续的告诫:
- 轮次结束门控 —— 触发条件:在结束任何轮次之前 · 测试:最后一段是否是一个计划、问题或承诺(“我将……”、“接下来我会……”、“请告诉我……”)? · 动作:现在就执行该工作,或报告 BLOCKED 并附上原因。永远不要以承诺结束一个轮次。
- 声明门控 —— 触发条件:在报告任何 DoD 标准状态之前 · 测试:
.taskstate/evidence.md中是否包含来自 本次会话 的工具/命令结果作为支持? · 动作:无账本条目 → 状态自动为 IMPLEMENTED-NOT-VERIFIED。VERIFIED 是账本查找,而非主观判断。 - 状态变更门控 —— 触发条件:在执行任何状态变更命令(重启、删除、配置编辑、迁移)之前 · 测试:证据是否支持 这一具体操作,还是信号仅仅模式匹配了一个已知故障? · 动作:如果只是模式匹配,则先收集缺失的证据。
- 阶段边界门控 —— 触发条件:进入任何阶段(新的史诗、恢复的会话、压缩后) · 测试:在本阶段中是否已重新读取
grounding.md、decisions.md、run-memory.md? · 动作:执行操作前先重新读取它们。 - 委派门控 —— 触发条件:在任何被委派的工人或并行任务完成或空闲后 · 测试:其输出是否存在于磁盘上,非空且与分配一致? · 动作:空闲 ≠ 交付 —— 输出缺失或错误意味着重新调度或接手该工作;传递结论,而非转储转录。(对于并行 变异 工作,存在性不足 —— 见集成门控。)
- 互锁门控(安全并行) —— 触发条件:在运行开始时,以及在生成任何并行 变异 代理之前 · 测试:
.taskstate/RUNLOCK是否显示一个 存活 的持有者(心跳 < 10 分钟)且属于另一个运行? · 动作:在运行开始时 原子性地(独占创建 —— 绝不先读再检查再写)获取 RUNLOCK(所有者 · 主机 · 进程ID · 开始时间 · 心跳),并 定时(2–3 分钟)刷新其心跳,而非仅在阶段边界处;如果另一个存活运行持有锁,则 不要 共同修改该工作树 —— 报告 BLOCKED(“另一个运行拥有此工作树:<所有者>”)或等待;过时 的锁(心跳过期 且 所有者无法被证明存活 —— 首先检查同一主机的进程ID)可以在记录一个run-memory.md注释后收回;在停止钩子中释放锁。工作树是共享状态 —— 将其并发写入视为对数据库的并发写入。参见references/parallel-safety.md。 - 工作树门控(安全并行) —— 触发条件:在分派会写入/编辑文件的并行代理之前 · 测试:每个 变异 代理是否都有自己的工作树,还是两个代理共享一个
.git? · 动作:为每个并行变异代理提供一个独立的git worktree,基于运行基点的agent/<lane>分支;协调者单独地、按顺序 合并分支返回。只读分派(研究、搜索、审计)可以共享工作树,但绝不能修改 git。没有工作器在共享树中运行git merge/checkout/reset—— 这只能由协调者按顺序逐 lane 完成。参见references/parallel-safety.md。 - 集成门控(安全并行) —— 触发条件:在一个片段/工作树合并回来之后,在该批次被接受之前 · 测试:合并后的 工作树是否通过了项目的集成形态检查(构建、锁文件存在且一致、声明的测试/lint 通过)—— 而不仅仅是“工作器的文件存在”? · 动作:在合并结果上运行集成检查;一个在隔离环境中通过但集成后损坏的片段(典型情况:添加了
package.json但没有锁文件)将被 重新打开,而非接受。接受是集成,而非存在。参见references/parallel-safety.md。
运行状态契约
在编写任何代码之前,在 .taskstate/ 中创建这四个文件,并在每个阶段边界重新读取前三个:
| 文件 | 内容 |
|---|---|
grounding.md | 数据如何建模及其位置;每个 DoD 项验证路径 + 本次会话中目标是否可达 |
decisions.md | 每个跨领域决策(模式、接口、命名、所有权)—— 共享约定;绝不重新争论已记录的条目,而是记录分歧 |
evidence.md | 证据账本 —— 每个标准每次验证尝试一个条目:时间戳 · 命令 · 引用输出 · 裁决,在发生时立即追加 |
run-memory.md | 失败的方法(绝不盲目重试)、环境异常、决策理由、意外情况 |
跨运行记忆:在运行结束时,将持久的经验教训记录到 .build-it-reports/lessons.md;在将来同一项目的运行开始时读取它(如果项目有来自 v3.1.0 之前运行的旧版 .fable-it-reports/lessons.md,也要读取它)。
声明-依据规则: 只有当 evidence.md 中包含来自 本次会话 的通过结果时,才能将标准报告为 VERIFIED。其他所有情况都是 IMPLEMENTED-NOT-VERIFIED(已构建,但无法运行真正检查 —— 说明阻塞原因)或 BLOCKED(无法完成 —— 说明用户必须提供什么)。绝不能基于模拟、假设或记忆报告 VERIFIED。
运行流程
- 锁定 DoD。 将模糊的目标重构为编号的、各自可验证的标准并展示出来。声明运行模型并应用其姿态:较弱的/较小的模型更频繁地重新接地并内联声明门控;较强的模型在高努力度下应用过度工程抑制器(不进行未请求的重构,不进行推测性抽象)。在不确定时采用最严格的姿态。在接触工作树之前获取 RUNLOCK(互锁门控):如果另一个运行存活着持有锁,则 BLOCK 或等待 —— 绝不允许两个写入者在一个工作树上工作。
- 自主姿态。 在可逆工作上不要询问直接进行;绝不在没有事先授权的情况下采取不可逆操作(删除、强制推送、破坏性迁移)—— 并且一个上下文的批准不能延续到另一个上下文。覆写之前先查看。双面诚实:绝不伪造通过,也绝不在结果有账本证据时含糊其辞。
- 预先接地。 读取真实的真相来源(实际的模式、文件、端点 —— 而非你的记忆),然后编写四个运行状态文件。没有可命名验证路径的标准现在被标记出来。
- 分解与路由。 将目标分解为史诗 → 故事 → 任务,映射到 DoD 项(将分解结果持久化到
.taskstate/)。保持决策耦合的工作在一个线程中;仅并行化真正独立的部分,受decisions.md约束。并行变异工作隔离运行(工作树门控):每个并发写入者获得自己的git worktree/agent/<lane>分支,协调者 按顺序 合并分支返回,每次合并后运行 集成门控 —— 绝不接受“输出存在”的批次;导致合并后构建/锁文件/测试损坏的片段被重新打开。只读分派可以共享工作树。如果宿主允许你选择工作器模型,将机械性工作路由到廉价层级,判断和验证路由到顶层(会话模型 —— 用户选择的运行模型)—— 切勿降级验证阶段 —— 并将每个选择及其原因记录在run-memory.md中。在遇到困难时升级而非预先支付:一个低层级工作器在一次纠正后重新分派后仍未满足其契约,或出现抖动,则将其片段在一个层级上重新运行,记录升级并在报告中披露(零升级本身就是一个可报告的事实)。 - 运行循环。 修复前诊断(在信任根本原因之前先挑战它),修复后测试,将每个结果追加到账本。在任何标准验证之前,确认其目标确实可达 —— 针对模拟的 QA 是虚假的通过;直接将此路由到 IMPLEMENTED-NOT-VERIFIED。崩溃后从
.taskstate/恢复;基础设施故障不是任务故障。 - 用新鲜视角验证,然后报告。 起草报告,然后按照下面的降级验证器协议对其进行审计(如果宿主有空闲审查者,则将审计交给它 —— 绝不要跳过)。交付报告,并且如果创建了任何凭据,则在
.build-it-reports/中提供独立的凭据工件。
降级验证器协议
在交付之前,作为单独的步骤审计草稿报告。明确声明:“暂时搁置实现上下文。”然后,仅 读取 DoD、草稿报告和 .taskstate/evidence.md —— 绝不读取实现历史 —— 逐行检查每一项:没有账本条目的 VERIFIED 行,或其引用的输出实际上并未证明该标准的行,将被标记为 CHALLENGED。每个挑战在交付前解决:现在运行真正检查并追加账本条目,或将行降级为 IMPLEMENTED-NOT-VERIFIED。在报告中记录任何分歧;绝不静默覆盖挑战。
报告
统一裁决来源。每个 DoD 标准:VERIFIED(引用账本证据) / IMPLEMENTED-NOT-VERIFIED(什么阻止了验证,使用了什么替代) / BLOCKED(用户必须决定或提供什么)。包括:无声上限 部分(所有跳过、抽样或限定范围的内容及其原因)、委派/成本选择、来自 decisions.md 的决策、意外情况及推荐的下一步行动。为醒来后的队友编写:以结果开头、完整句子、无发明缩写。
安装
Claude Code 插件(推荐) —— 添加了捆绑的 /launch、/iterate、/full-qa 和 /chrome-cdp-control 技能,由指挥器路由到,以及可选的失败开放性强制钩子:
/plugin marketplace add DevOtts/build-it
/plugin install build-it@devotts
任何其他代理(Cursor、Codex、Copilot,70+ 工具):
npx skills add DevOtts/build-it -a <agent>
如果没有捆绑技能,按照上述机制内联运行每个阶段 —— 行为层就是产品;可以降级,但绝不能中断。
安全注意事项
- 安装或运行该技能不需要任何秘密。 你仅为你要求它执行的特定任务提供凭据。
- 它 仅在本地 读取
.full.credentials和.env—— 绝不传输,绝不提交。 - 浏览器自动化使用 你自己的 Chrome,通过本地端口上的 Chrome DevTools 协议,重用你已登录的会话;不存储或泄露任何内容。在已认证账户上的工作始终需要每次写入的确认 —— 自主 QA 仅用于测试环境。
- 运行期间创建的任何凭据都 隔离在专门的凭据工件中,附有轮换说明 —— 绝不埋在叙述中。
- 不可逆操作始终需要明确的事先授权;自主性仅涵盖可逆工作。
作者:DevOtts