0011 最要紧的一条是文档和代码对不上:Codex 那轮把坏行判据从「第一条解不开的行」改成了「有没有 被换行终结」,文档还停在旧规则上。改完顺带答掉冷读问的「末尾连着两条坏行算什么」——按新规则 第一条终结过的坏行就已经报错了。 三处确定性矛盾全部成立:标题写「fsync 在三处,其余三处不做」而正文写「那两次」、表格里 fsync=否 只有两行(改成按「一步之内四次写」重排,并把「处」的单位说清);「五个记录类」里没有「动作 结果」(它是逐步结果那条记录的一个字段,不是第六个记录类,表格行名会误导);「每步四次写」与 表格看着像五次(同一根因)。另外契约套件的状态从「24 条全跳过」改成不给会过期的数字,并把 skip 与 xfail 分开说——它们是「还没有实现」与「没有机器兜底」两回事。 还补了:一节名词解释(前缀持久性、耐久屏障、恢复判定、⑥ 都是首次出现即使用);「取消能穿过去」 那段原本自相矛盾(说线程会把写做完,又说没写完的是尾行);文件的字面约定(UTF-8、\n 结尾、 非 ASCII 不转义、目录不存在时创建)——这些恰恰是外部读取方必须知道的,而文档反复强调那份日志 要能离开这个库读懂;为什么保留键叫 record 而不是加下划线前缀;为什么用 to_thread;独占创建 只挡住一种撞车(两个进程同时续跑挡不住,登记为已知缺口);以及运行开始那次 fsync 真正的理由 是目录项而不是「读不出配置」。 最实的一条留到最后:那五维里的题目很可能带中文或空格,过不了运行标识的字符判据,而同一份 文档又规定不做转义。现在写明编码方式归下游自己选(要单射),并说清库为什么不替它选——库一旦 选了,文件名就不再等于运行标识,而它按标识去目录里找文件的用法就断了。migrations/dissect.md 同步登记。 0012:把 parent_card_id 这个笔误改成 parent_call_id(冷读的人不知道哪个对,只能问「card 是 什么」,正好把它顶出来);「每个源报四样」实际枚举了五样;补一节名词解释(scope、源、恒定采样 参数、推理开关全是首次出现即使用);补上本库这一侧的接缝签名与 ModelCall 的五个字段,并说明 中间那三个为什么一个都不往下传;补上非文本块报错、拼接不加分隔符的代价、1.1.1 那个 bug 到底 是什么、空串调用标识是防御而不是常规路径、以及为什么超时与重试次数不算模型身份。
PolyLoop
实验室共用的 Agent 执行内核。治理单位是一次运行:围绕一个目标的有界多轮 「模型决策 → 动作 → 观察」循环,含预算、停止语义、取消、逐步轨迹与 Skill 注入。
它和 PolyGateway 是叠起来的两层。PolyGateway 治理一次模型调用(多源、限流、重试、熔断、 缓存、遥测),PolyLoop 治理一次运行,并用 PolyGateway 的顶层公共 API 拿模型。 任务编排、批量调度、评分、检索、Skill 的生成与进化都留在下游项目。
⚠️ 项目还没有可用的功能(2026-08-07 起)
src/polyloop/ 下是十个模块的空骨架——目录和依赖契约先于代码存在,模块里一个类一个函数都
还没有。下面的阶段清单是唯一的进度权威。
消费者与验收标准
| 项目 | 现状 | 本库对它的验收标准 |
|---|---|---|
| dissect | 已有跑着的 harness/agent/(loop / context / memory / parser) |
能把那套循环搬到本库上,dissect 原有测试全绿。 一手需求证据最强 |
| GovDoc-SaaS | 已有 packages/docagent-core/(第一次抽库尝试,含 agent / workflow / retrieval / taskrun) |
能替代掉 docagent-core/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 契约。 架构文档先于代码存在,此期间它是一份规格而不是描述,文档开头须写明这一点 - ④ 测试框架 —— unit / integration / e2e / contract 四层骨架(划分判据是「依赖什么」,
见 CLAUDE.md §1.9),以及
tests/contract/那套公共行为一致性用例的形状 - ⑤ 实现 —— 分块落地,每块必须有对应层级的测试接住,守着它的 import-linter 契约在同一个提交里加上
- ⑥ 迁移验收 —— 真的把 dissect 与 GovDoc-SaaS 迁过来,以两边测试全绿为准
本地检查
make check # ruff format --check + ruff check + lint-imports
make test # pytest(e2e 默认不跑,它打真实网关要花钱)
make ci # 上面两条
仓库还没有 remote,所以没有 CI workflow。make ci 就是当前的全部机器闸,和 PolyGateway
一样。等仓库推上去之后按 research-wiki/guides/ 补 workflow(那份也还没写)。
文档质量不走机器检查,走 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,那里是协作规则的唯一来源。