iomgaa 956d98652d fix(tools): 修掉两个假阳性与一个改得动的内部状态,按两轮独立评审
代码审查(新鲜上下文,只给 diff 与验收标准)报了五条影响正确性的,逐条核实全部成立:

1. spec_for() 交出去的 parameters 就是注册表内部那份真字典。docstring 承诺的快照只挡住了
   「调用方改自己那份」,没挡住「从注册表取出来往里伸一层改」——而后者一下同时改掉模型
   看见的 schema 和校验用的 schema。改成逐层冻成只读视图,schema_for_model 出口再化回
   普通字典与列表。
2. {type: integer} 拒掉 3.0。JSON Schema draft-06 起小数部分为零的浮点数是合法整数,
   模型写 1e2 时 json.loads 给的就是 float。这是我自己在注释里点名最怕的那种假阳性。
3. additionalProperties: false 撞上 patternProperties 时拒掉一切匹配 pattern 的键。
   那些正是这份 schema 专门要收的键,模型改名也绕不过去。patternProperties 在场就跳过。
4. 工具名不校验类型、纯空白名放行。名字要落进发给模型的 schema,不是字符串会让整个请求
   被网关拒掉,报错指向请求体不指向注册表。
5. _by_name 是可变 dict,两条查询路径能被就地改到分岔。换成只读视图。

不可哈希那条不修,改在 docstring 里写明(参数 schema 是映射,注册表放不进 set)。
scope.md 的行号引用换成条目名——行号是最容易漂的一种参数,插一行就静默指错。

0008 按一轮硕士生冷读重写:字段位置那段原来自相矛盾(一边说位置是公共承诺、插在中间会
静默改掉后面字段的含义,一边就插在中间,且没讨论追加在末尾这个同一判据下的显然选项),
改成追加在末尾并说明规则;补上四个名字的就地解释(重放策略、两条完成通路、动作结果五个
字段、restrict_to);决策四那张表原来只有三列却被正文说成填五个字段,恒定的两个单列出来
并各自给了理由;补上 validate 不通过为什么算未执行、executor() 为什么全查、为什么必须是
具体类而不是闭包、异常栈去哪了。
2026-08-10 00:57:36 -04:00

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.mdresearch-wiki/README.md(文档体系)
  • ② 需求对齐 —— 从 dissect 的 harness/agent/ 与 GovDoc-SaaS 的 packages/docagent-core/ 提取真实需求,产出 research-wiki/migrations/ 下两份迁移文档(删除清单 + 组件映射 + 验收口径), 并检查 CHSAnalyzer 的 agent 方案落在边界内还是边界外。这一阶段的产物决定库的边界, 所以它排在架构前面:边界画错,后面每一份架构文档都要重写
  • ③ 架构 —— research-wiki/explanation/architecture.mdpyproject.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    # pyteste2e 默认不跑,它打真实网关要花钱)
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,那里是协作规则的唯一来源。

S
Description
实验室共用的 Agent 执行内核:一次运行的预算、停止语义、取消、逐步轨迹与 Skill 注入
Readme 1 MiB
v1.0.3 Latest
2026-08-30 02:20:51 +08:00
Languages
Python 99.3%
Shell 0.6%