docs: 回写全仓库对契约套件的指向,以及 README、架构与 CHANGELOG

套件从 tests/contract/ 搬进 polyloop.testing 之后,全仓库 28 处引用要重新指过。修了 12 处,
其余在 design/(只增不改)与 scratch/(由人清理)里。

**CLAUDE.md 改了四处事实**:§0 权威表里行为契约的权威、§0 那句依赖规则的条数、§5 目录树与
模块数、§1.8 那句「谁断言公共 Protocol 的签名」。§1 的其余硬约束与 §2 的人类门一条没动。

**architecture.md**:分层图第 4 层加一格,装配层从三个变四个;代码地图加一行;第十节按代码
逐项重写——那笔「工具段渲染样式」的欠账**没有被数字对上盖掉**,加了 fingerprints 之后请求
的字段数恰好还是十一,而组成已经换过,所以那一节正面写着它仍然欠着;新增第十条依赖规则
(pytest 只在 testing 那个 extra 里,别处 import 它会让下游的生产环境一 import 本库就
ModuleNotFoundError),带静态与运行时两半;删掉「src/ 下一行代码都没有」那段过期状态说明;
决策索引补齐 0008 到 0016,其中四行原描述说的不是那份文档真正定的东西。

**migrations/dissect.md** 那笔「内存实现不存在」的欠账还掉了。

**压测那边**三条测试守的是一条已经撤销的公共契约,改名并写清它们现在守的是场景自己的选择。
AppWorld 那处刻意的偏离(不补三个反引号)留着不恢复——那条路径要模型输出被 stop 序列截断才
触发,而压测不配 stop 序列,恢复的收益不抵重跑一次压测的成本。但注释的理由改对了:它现在是
一笔有出处的欠账,不是一个决定。

CHANGELOG 攒在「未发布」段,版本号不提前写(§1.10)。
This commit is contained in:
2026-08-27 03:59:39 -04:00
parent 1fac387e75
commit c4e5732587
12 changed files with 246 additions and 80 deletions
+9 -5
View File
@@ -173,11 +173,15 @@ class AppWorldParser:
history_text=output,
decision=InvalidDecision(explanation=_FENCE_NOT_ON_ITS_OWN_LINE),
)
# **这里与被复刻的 dissect 实现有一处刻意的不同**:dissect 在这一支给历史文本补回
# 结尾的三反引号(`parser.py:133-136`),让那条 assistant 消息形态完整;我们不补
# 因为公共契约要求 `len(history_text) <= len(reply.content)`
# `tests/contract/test_decision_parser.py:30`),补一个字符就违约。代价可以接受:
# 压测不给模型配 stop 序列,这条路径基本不触发。代码抽取本身照旧兜底
# **这里与被复刻的 dissect 实现有一处不同**:dissect 在这一支给历史文本补回结尾的
# 三反引号(`parser.py:133-136`),让那条 assistant 消息形态完整;这里不补
# 这处不同当初是为了迁就公共契约里一条「history_text 不长于模型原文」的断言,那条
# 断言已经撤销(`polyloop.testing.DecisionParserContract` 里对应那条用例的 docstring
# 写着理由),所以它现在没有存在的必要,是一笔记在案的欠账,不是一条长期决定
# 留着不恢复是因为收益不抵成本:补回去要重跑一次打真实网关的压测,才能继续说
# 2026-08-11 那批轨迹是当前这版场景跑出来的;而这条路径要模型输出被 stop 序列截断
# 才走得到,压测不给模型配 stop 序列。哪天要重跑压测,顺手把它补回来。代码抽取本身
# 照旧兜底。
return ParsedReply(
history_text=output,
decision=Action(text=code, tool_call=None),
+2 -2
View File
@@ -750,8 +750,8 @@ class GovDocParser:
"""
def parse(self, reply: ModelReply) -> ParsedReply:
# 契约要求 `len(history_text) <= len(reply.content)``tests/contract/
# test_decision_parser.py:30`),所以直接用原文,不拼接任何东西
# 压测这一侧的解析器一律只截不补,所以直接用原文,不拼接任何东西。公共契约
# `polyloop.testing.DecisionParserContract`)两种都放行,这条是压测自己的选择
history = reply.content
decision = self._decide(reply.content)
return ParsedReply(history_text=history, decision=decision)