这条路径至今零真实负载,而它和 AppWorld 那路压的东西完全不同:动作是 JSON 工具调用而 不是代码,完成由 agent 自报(带完成标记的提交工具)而不是环境报告,工具集按阶段收窄。 一个任务拆成三次运行(plan / execute / summarize),因为「按次收窄工具集」在这个库里 只能这么表达——治理单位是一次运行,一次运行只有一个工具注册表,阶段之间靠工作区传状态。 语料是真实公文,但先脱敏再用,且原文与脱敏文本都只在内存里,一个字节不落盘、不入库。 机构名、电话、信用代码、邮箱、联系人姓名换成明显是假的稳定假名(同一原名整份文档换成 同一假名,否则模型会以为是不同主体);金额、项目编号、日期原样保留,它们是审核判断的 依据,换掉任务就没得判了。脱敏后必须过一遍独立的检出校验,有残留就拒绝启动——把未脱敏 的第三方真实信息发给外部模型服务是不可逆的,而漏一处的表现是「压测正常跑完」。 实测:主招标文件 17.5 万字符,校验函数对原文报 61 处、对脱敏后放行,六份语料全过, 40 个金额与全部日期无误伤。 write_note 与 submit_finding 声明为绝不重放,每次调用在工作区留一行审计——那份审计是 环境侧的实际执行次数证据,故障注入要验的「绝不重放的动作没有被执行两次」数的就是它。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PolyLoop
实验室共用的 Agent 执行内核。治理单位是一次运行:围绕一个目标的有界多轮 「模型决策 → 动作 → 观察」循环,含预算、停止语义、取消、逐步轨迹与 Skill 注入。
它和 PolyGateway 是叠起来的两层。PolyGateway 治理一次模型调用(多源、限流、重试、熔断、 缓存、遥测),PolyLoop 治理一次运行,并用 PolyGateway 的顶层公共 API 拿模型。 任务编排、批量调度、评分、检索、Skill 的生成与进化都留在下游项目。
安装
发布在实验室自建的 Gitea PyPI registry 上,公网 PyPI 查它是 404,所以装它必须自己带索引地址:
pip install --extra-index-url https://gitea.iomgaa.online/api/packages/iomgaa/pypi/simple/ \
"polyloop==1.0.*"
模型调用要经 PolyGateway,那部分是一个单独的 extra——不用它的人不该被迫装上网关:
pip install --extra-index-url https://gitea.iomgaa.online/api/packages/iomgaa/pypi/simple/ \
"polyloop[gateway]==1.0.*"
写进 requirements.txt 的话,那一行 --extra-index-url 必须排在 polyloop 之前。
这台开发机上的注意事项:它设了 http_proxy 指向一个到不了外面的本地代理,走代理会失败,
装的时候加 NO_PROXY=gitea.iomgaa.online。
现状
十个模块全部落地,四层测试都在跑。还没有任何下游项目真的用过它——这是它现在最大的未验证项, 下面的阶段清单是唯一的进度权威。
消费者与验收标准
| 项目 | 现状 | 本库对它的验收标准 |
|---|---|---|
| dissect | 已有跑着的 harness/agent/(loop / context / memory / parser) |
能把那套循环搬到本库上,dissect 原有测试全绿。 一手需求证据最强 |
| GovDoc-SaaS | 仓库 2026-08-03 起整体重建,实现全部清空,自己的清单停在「构建文档框架」 | 不做迁移验收,做设计级验收:它真实需要的东西逐条能不能被承载,见 research-wiki/migrations/govdoc-saas.md。它将来写 agent 层时是直接长在本库上,不是迁过来 |
| CHSAnalyzer | 还没写到 agent 那一步,只有设计方案 | 远期可以兼容使用。 它的 agent 需求要么本库能满足,要么明确写进「不属于本库」清单并说明为什么 |
三者的证据强度不同,能进本库的语义也就分档:dissect 和 GovDoc-SaaS 的真实代码是一手证据, 两边都需要的机制才有资格做成稳定内核;CHSAnalyzer 只用来检验边界画得对不对,不能凭它的 设计方案单独长出一个组件——一个没有真实调用方的抽象,等到有调用方那天多半是错的。
阶段清单
这份清单是「当前处在哪个阶段」的唯一权威。 CLAUDE.md 不重复这里的内容,只有一条常青规则
(§1.11)要求动手前先看这里——这样阶段推进时不需要改 CLAUDE.md,开发结束后把本节删掉即可,
不会在别处留下过期条文。
- ① 协作规范 —— 见 CLAUDE.md 与 research-wiki/README.md(文档体系)
- ② 需求对齐 —— 从 dissect 的
harness/agent/与 GovDoc-SaaS 的packages/docagent-core/提取真实需求,产出research-wiki/migrations/下两份迁移文档(删除清单 + 组件映射 + 验收口径), 并检查 CHSAnalyzer 的 agent 方案落在边界内还是边界外。这一阶段的产物决定库的边界, 所以它排在架构前面:边界画错,后面每一份架构文档都要重写 - ③ 架构 ——
research-wiki/explanation/architecture.md与pyproject.toml的 import-linter 契约。 架构文档先于代码存在,此期间它是一份规格而不是描述,文档开头须写明这一点 - ④ 测试框架 —— 四层都在跑(划分判据是「依赖什么」,见 CLAUDE.md §1.9)。
e2e 打真实模型网关、会产生真实费用,所以默认不跑:要
POLYLOOP_E2E=1加显式pytest -m e2e,配置见 .env.example。tests/contract/那套公共行为 一致性用例接上了自带的存储实现,解释器与执行器那几条仍等下游把实现接进来 - ⑤ 实现 —— 十个模块全部落地,五个接缝都有调用点。一处已知欠账:
stores只有逐行 追加那一种形态,关系数据库那种由下游自己实现,契约套件是它的准入标准 - ⑥ 验收 —— 两件事。一是自己造负载压:照三个消费者将来的用法造约一百个任务,用真实
数据真的打模型跑完,看这个内核在这个量级上扛不扛得住。这一步之所以必须自己做,是因为
三个消费者一个都还没到能用它的时候,而「从没被任何人用过」是它现在最大的未验证项,
等下游是等不来的。二是把 dissect 的迁移方案交出去:不在 dissect 仓库里写代码,
出一份方案提到它的 issue 上,由那边自己排期。GovDoc-SaaS 那半是设计级验收(理由见上面
那张表),口径在
research-wiki/migrations/govdoc-saas.md
本地检查
make check # ruff format --check + ruff check + lint-imports
make test # pytest(e2e 默认不跑,它打真实网关要花钱)
make ci # 上面两条
还没有 CI workflow,make ci 就是当前的全部机器闸,和 PolyGateway 一样。发布怎么做见
research-wiki/guides/releasing.md。
文档质量不走机器检查,走 CLAUDE.md §3 的「硕士生阅读」评审。
参考资料
reference/ 下的六个仓库与 agent-core.md 都只是参考,不是本项目的设计,也不是任何事实的权威
(理由见 CLAUDE.md §0)。它们只读、不改、不入库。
| 位置 | 是什么 |
|---|---|
reference/agent-core.md |
别人为本项目写的一份架构提案。其中任何一条在被我们自己的 design doc 采纳前都不作数 |
reference/dissect/ |
消费者,已有 ReAct 循环实现 |
reference/GovDoc-SaaS/(background 分支) |
消费者的旧代码,第一次抽库尝试 packages/docagent-core/。它那边的活仓库已经把这份降级成「只作研究输入,不是当前事实来源」 |
reference/GovDoc-Editor/ |
GovDoc-SaaS 重构之前的那一版,今天跑在生产上。需求来源,不是迁移对象 |
reference/CHSAnalyzer/ |
远期消费者;同时是本仓库协作规范的蓝本 |
reference/PolyGateway/ |
本库的依赖,也是「实验室共用库该怎么做」的蓝本 |
reference/pi/ |
外部参考实现 |
其余约定见 CLAUDE.md,那里是协作规则的唯一来源。