循环系统架构师
将重复性任务转化为可观察的控制系统,使其能够执行、证明结果、从中断中恢复,并在不重写自身目标的前提下持续改进。
选择模式
- 审计(Audit):检查现有工作流,报告缺失或开环的部分。除非被要求,否则不要编辑。
- 设计(Design):生成契约、状态模式、角色图、评估标准和运行时设计。
- 落地(Operationalize):实现控制器、适配器、持久化、证据和单命令运行路径。
- 演化(Evolve):分析已完成运行,验证提议的循环/知识/技能改进,并决定采纳或拒绝。
当用户要求“构建”或“让它跑起来”时,应包含落地模式。仅一份 Markdown 计划不算可运行的循环。
从现实出发
- 读取仓库说明以及用户置于范围内的制品。
- 检查实际的工具、入口点、状态文件、测试、调度器、智能体 CLI 和脏工作区。
- 将当前权威输入与参考材料分离。不要使用模型记忆来填补空白。
- 分类循环类型:
- 终端型(Terminal):具有可演示终点的单一目标。
- 周期型(Recurring):每次运行终止,但监控/服务持续运行直到退役。
- 在更改任何内容之前,说明哪些存在,哪些缺失,哪些只是声称存在的。
如需完整审计,请阅读 audit-rubric.md。
要求闭环控制
识别并连接以下所有要素:
- 目标与所有者;
- 完成条件或每次运行的成功条件;
- 权威来源边界与出处;
- 触发器与低成本预检;
- 传感器与采集的信号;
- 比较器、窗口与阈值/规则;
- 控制器与有限决策空间;
- 执行器与将新结果返回传感器的路径;
- 持久化状态、游标、事件日志与证据存储;
- 编排器、执行器与独立验证者的职责;
- 开放能力/技能发现与候选技能创建;
- 权限边界与受保护字段;
- 验收评估与所需证据;
- 重试、超时、退避、故障分类与回滚;
- 幂等性、去重、并发锁与副作用扼流点;
- Token、成本、轮次与挂钟时间预算;
- 可观察性、告警与无操作成功状态;
- 直接替换被取代的活跃真理;
- 经验蒸馏与受控提升;
- 停止、暂停、终止与退役条件。
缺少传感器到执行器的反馈意味着开环。缺少持久化状态意味着重复的提示词。缺少验证者证据意味着自我声称的完成。缺少控制器/触发器意味着需要人工操作的程序。
最小化配置
并非每个循环都需要全部 20 项要素。对于单操作员、cron 级别的循环——一个用户、一台机器、低爆炸半径、无共享副作用——一份包含以下八项的契约就已足够:
- 目标与所有者;
- 成功条件(完成或每次运行);
- 触发器与低成本预检;
- 执行器及其副作用路径;
- 持久化状态与游标;
- 副作用路径上的幂等性/去重;
- 可观察性:何处查看上次结果与下一步操作;
- 退役条件。
明确声明省略项而非留空:设置 learning.enabled: false 和 capabilities.discovery: "none" 并附带 reason 字段。linter 接受这两种设置。参见循环契约最小示例获取通过的最小契约。当循环获得共享副作用、第二个操作员、外部租户或任何形式的自我修改时,升级到完整契约。
生成循环包
根据仓库调整名称,但保留一份规范化的机器可读契约和一条状态记录。循环包、状态和证据存放于用户项目中,绝不放在本技能包内部。默认包结构如下:
loop/
├── LOOP-CONTRACT.md 人类可读的操作契约
├── loop.contract.json 机器可读的规范化契约
├── RUN-STATE.json 当前运行、游标、尝试次数、下一步机器操作
├── events/ 仅追加的运行事件或等效的事件存储
├── evidence/ 验证者可读的收据
├── evals/ 确定性和语义化验收检查
├── knowledge/ 类型化的已提升知识,而非原始日志
├── candidates/ 未提升的经验与技能变更
└── scripts/run-loop 单命令控制器或项目原生等效物
字段契约请参考 loop-contract.md。复制 loop.contract.template.json,填写所有占位符,然后运行:
python3 scripts/loop_lint.py /path/to/loop.contract.json
当项目未引入 linter 时,使用本技能内部的副本。如果无法写入磁盘,则将契约和控制器以可复制的文本形式输出,并说明在循环可运行之前还需将哪些内容放置到磁盘上。
构建控制器,而非仅构建指令
每次调用控制器必须推进循环,而无需用户在不同智能体间复制粘贴:
- 获取并发锁并派生幂等性 key;
- 加载并 lint 契约和状态;
- 验证冻结源的哈希值或当前源权限;
- 运行低成本触发器/预检,当无工作时记录无操作成功;
- 解析所需能力;
- 为编排器/执行器创建最小上下文数据包;
- 在可能发生变更时,在隔离工作区中执行;
- 捕获输出、成本、工具调用、差异和证据;
- 运行独立验证者,该验证者不得认证其自身的写入;
- 失败时,分类并路由有限修复、重试、回滚或停止;
- 通过时,原子化地提升结果并更新当前状态;
- 追加不可变事件/收据;
- 仅当蒸馏触发器满足时才调用蒸馏;
- 释放锁并暴露下一个机器可执行的操作。
最小化验证者独立性,按引擎分类:
- Claude Code(或任何支持子智能体的运行时):以全新上下文的子智能体运行验证者,仅接收契约、验收检查和证据路径——不包括执行器的对话。
- 无子智能体机制:将验证者作为独立进程或独立调用运行,从磁盘重新读取证据并针对验收检查返回判定。
- 两者皆不可用:在同一上下文中检查自身工作属于自我审查——是表现,而非验证。在审计中说明这一点,而非将其标记为验证者。
触发器、状态转换、模式检查、权限、重试、哈希和提升优先使用确定性代码。将判断、规划、诊断及无法机械决策的内容留给 LLM。
无需静态白名单即可发现或创建技能
使用受控执行下的开放发现:
- 从任务推导能力契约:输入、输出、副作用、证据、风险。
- 按元数据和契约匹配搜索已安装技能和项目能力。
- 检查来源和依赖;不要将内嵌的项目身份视为真理。
- 在沙箱中运行候选技能并进行能力特定的评估。
- 若无一匹配,则在隔离环境中创建候选技能,附带其自身的示例和评估。
- 仅当通过安全、隐私、功能和回归检查后,才提升某个版本。
- 默认本地注册。外部发布遵循所属环境的单独策略。
开放发现并不意味着开放权限。指令、数据范围、副作用策略和运行时权限仍然约束每个技能。
将经验蒸馏为可用知识
切勿将不断增长的日志喂给每个智能体。保持原始证据、情节摘要、候选经验、规范化知识、过程性技能和评估的分离。
运行提升路径:
trace + outcome
→ normalized episode
→ candidate lesson
→ deduplicate and conflict-check
→ replay against prior runs and counterexamples
→ shadow or canary
→ promote a version
→ monitor the next runs
→ keep or rollback
触发蒸馏的条件包括:重复失败、重复手动工作、漂移、成本回归、有意义的结果证据或配置的样本量——而不仅仅是时间流逝。在设计或更改学习层之前,请阅读 distillation.md。如果安装了专门的蒸馏技能(例如 experience-pack),则让该技能自身拥有蒸馏工作流所有权;本技能设计的是调用它的循环。
演化过程可以在授权范围内改进 SOP、触发器、上下文打包、脚本、技能、检索和操作阈值。但不得静默重写目标、源边界、租户/隐私边界、权限模型或定义成功的评估标准。
干净地替换活跃真理
对于任何已接受的更新:
- 计算跨契约、状态模式、代码、测试、文档、视图和技能的变更影响图;
- 声明
REPLACES、REMOVES和KEEPS; - 更新所有依赖项;
- 从活跃检索中移除被取代的措辞和值;
- 运行矛盾/陈旧值扫描;
- 运行受影响的快乐路径和失败路径评估;
- 运行零上下文探针,必须恰好恢复一个当前答案;
- 原子化提升;仅在版本控制/事件历史中保留先前版本,而非活跃上下文。
校准自主性
- 当确定性检查且独立验证通过时,自动执行可逆的、有边界的操作。
- 对于高风险自动化操作,使用金丝雀、阴影、双重验证和回滚。
- 仅在以下情况下才请求用户停止:缺少权限、需要改变目标的决策、或操作实质上不可逆且未提前授权。
- 切勿让常规的人工审批成为声称自主的循环中隐藏的执行器。
验证完成
在满足以下所有条件之前,不得将循环视为可运行:
- 一条命令或配置好的事件即可推进循环,无需人工传递提示词;
- 中断恢复从持久化状态继续,无需重做已接受的工作;
- 重复触发器不能产生重复副作用;
- 验证者失败会导致有限修复或干净停止;
- 成功路径和失败关闭路径均有证据;
- 无工作的运行能成功且低成本地终止;
- 当前状态、上次结果、成本、未关闭的故障和下一步操作均可观察;
- 至少一个演化候选已被回放并正确提升或拒绝(在最小配置下,若
learning.enabled: false可豁免); - 零上下文智能体能仅凭活跃文件解释当前契约和下一步操作。
分别报告:哪些已实现,哪些已实践,哪些因缺少实时传感器而处于休眠状态,以及哪些仍需要用户的权限。