English | 简体中文
给自主运行的 AI 代理一套可审计的持续推进循环:八步协议、状态机、八道一致性门、 候选—裁决—合并流、定义行守卫与快照、一轮一条命令。自带 toy 命题域最小参考实现, 已端到端跑通 R1:八门 ALL GREEN。
它解决的是长跑代理的三类真实失效:
| 失效 | 症状 | loop-kit 的对策 |
|---|---|---|
| 失忆 / 凭印象续写 | 代理"醒来"后不看状态文件就接着干,越跑越漂 | 状态机四件套 + loop/status.py 一键恢复上下文(协议第 1 步机制化) |
| 不可审计 | "我做完了"无法验证;结论没有产物支撑 | 判定只认产物与退出码;八道门收口,全绿才允许递增轮次 |
| 空转伪装成推进 | 每轮看起来在跑,实际什么也没被分开 | close.json 强制校验:负对照非空、发现必须带产物路径、禁止残留占位 |
出处:机制条款不是风格偏好,全部来自一个跑了 250 轮的自主科研循环(aiFEP) 期间的真实事故(第 71–93 起教训)——每一条都曾产出一个错误结论。本仓库把其中 与领域无关的部分剥离成通用骨架;领域对象(正文/条目/实验/审计器)通过
domain/插槽接入。
| 路径 | 是什么 |
|---|---|
control/agent_protocol.md |
在架协议(八步 / 收敛 / 数字 / 环境 / §11 自我改进)——只有人类能改 |
control/state/ |
状态机:current.json 焦点与队列、rounds.jsonl 台账(唯一时间线源)、track.md 推进日志、agenda.md 五要件议程、protocol_state.json 基线指纹 |
control/scripts/ |
控制面工具:协议门 protocol_check.py(K 臂 + --seal/试加载)、protocol_selfref_scan.py、gen_resolution.py(裁决拟稿) |
control/protocol_candidates/ |
协议改进候选(_template.md,格式纪律见同目录 README) |
gates/ |
gates.json 门清单 + run_gates.py 一把梭(新增领域门 = 改清单,不动脚本) |
loop/ |
收口链:round.sh(一轮一条命令)、speclib.py(close.json 骨架/校验)、rclose.py(落卷+四同步)、count_guard.py(定义行守卫 + 快照,配置见 gates/guard.json) |
loop/status.py |
上下文一键恢复:一屏给出 轮次/焦点/下一任务/队列余项/开放异常/负结果/近期产物/seal 状态/待裁决候选 + 下一轮该敲的那条命令。--json 机器可读,--pending 只打印待裁决数 |
loop/new_round.py |
一轮骨架:python loop/new_round.py <R> → 生成 logs/r<R>_run.py。结构给全、内容留空,未填就跑必定判负 |
loop/domain_add.py |
换领域脚手架:复制 sample 结构 + 注册两个 json;默认不动配置,--activate 才切换并备份 |
domain/ |
领域接入位(契约见 domain/README.md);sample/ = toy 参考实现 |
handover/ |
新实例交接/自举模板(复制为 HANDOVER.md 填空) |
logs/ |
每轮 .out / close.json / 快照 / protocol_trials/ |
cd loop-kit
export PYTHONIOENCODING=utf-8 # Windows 中文环境建议
# export PY=<python 绝对路径> # 依赖特殊时才需要;协议门用 sys.executable
# 0) 上下文恢复(代理每轮开工前先跑这条;一屏给出状态 + 下一轮该敲的命令)
python loop/status.py
# 1) 协议基线初始化(人类动作,一次)
PROTOCOL_HUMAN=1 python control/scripts/protocol_check.py --seal
# 2) 生成/拼装 + 八门自检(应全绿)
python gates/run_gates.py --install
python gates/run_gates.py --tag init --expect 0,0,0,0,0,0,0,0
# 2.5) 新轮次骨架(结构已给,内容自填;未填就跑必定判负)
python loop/new_round.py 2 # → logs/r2_run.py,照打印的清单填 9 项
# 3) 一轮一条命令(seal 预检 → 实验 → 落卷 → 守卫 → 拼装 → 八门 → 门后补记 → 快照 → 待裁决时出拟稿)
bash loop/round.sh 2 r2 logs/r2_run.py # 你的下一轮R1 就是这么收口的(bash loop/round.sh 1 r1 logs/r1_run.py)。
round.sh开局会检查协议是否已盖章:未盖章直接中止并打印--seal命令,不让代理白跑一整轮。 收口全绿后若存在未裁决的协议候选,会自动重生成裁决拟稿(control/state/resolution_draft.md)。
| 门 | 管什么 |
|---|---|
claims |
条目定义行与 curate 一致;台账声称的产物真实存在(可验性审计) |
probes |
每条门的负对照必须真的会响(漏咬 = 门失效) |
evidence |
每条 evidence 必须在正文逐字命中 |
registry |
登记表 round-trip:registry.json ↔ curate ↔ 正文附录逐格一致 |
build |
单体/登记表与应然逐字节一致(手改生成物立即红) |
protocol |
协议纪律:候选状态机、基线指纹、试加载授权、门读数回填 |
pcheck |
协议门自身的 selftest(审计者也要被审计) |
selfref |
协议内部引用完整性(断引用 = 0 才放行) |
结构(一条命令):
python loop/domain_add.py <name> --word 定理 --numbers 一,二,三 # 只搭目录,不动配置
python loop/domain_add.py <name> --word 定理 --numbers 一,二,三 --activate # 同时切换两个 json(自动备份)默认不激活,保护正在跑通的当前域;--activate 会把 gates.json 的路径与 guard.json 的
dir/word/numbers/holes 切到新域,并备份为 *.bak_domain_<name>。
内容(这才是真工作;脚手架一律留空,现在跑门会红——故意的):
domain/<name>/body/00_head.md:__待命名__→ 真条目名,__待填__→ 真证据锚。domain/<name>/items_curate.json:items填真条目(status取值见同文件status_vocab)。domain/<name>/gates/*.py:五件套按需领域化(尤其 claims 的状态词表与产物可验性)。word/numbers有变 ⇒ 重跑domain_add.py并加--activate。
自举:照 handover/HANDOVER_template.md(--seal → run_gates.py --install + --expect 0×8 → 开第一轮)。
把「正文/条目/实验/审计」想成插槽:机制不关心里面装的是什么命题。
- 自动化结构,绝不自动化内容。骨架/脚手架只预置键位、留空内容且刻意留成会判负的形状; 预填"看起来合理"的 negative/judge 会让空转伪装成推进,直接腐蚀质量门。
- 判定只认产物与退出码;每个声称配一台会判负的仪器;负对照必须站得住。
- 协议本身也在此循环内被审计(§11):改进写候选、人类裁决合并、
--seal认基线; 常驻授权只授「试」不授「合」。--seal与候选 status 只有人类能动——这是信任锚点,不做自动化。 - 正文分卷是源、单体是生成物;编辑事故由 定义行守卫 + 快照 + 行号锚 三道兜底。
- 机制条款来自真实事故,不是风格偏好;详见
control/agent_protocol.md各节。
- toy 域 3 条命题(命题一 成立 / 二、三 思辨存量);台账 1 行;R1 八门 ALL GREEN;
裁决拟稿可随时
python control/scripts/gen_resolution.py重生成(当前无待处理候选)。 - 数字唯一源 =
control/state/rounds.jsonl+control/state/current.json。