iomgaa
|
c4e5732587
|
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)。
|
2026-08-27 03:59:39 -04:00 |
|
iomgaa
|
71e7762814
|
docs(migrations): 撤掉一张空头支票——那个「不提供恢复的内存实现」不存在
0003 的否决方案那一节定过要给一个明确命名的、不提供恢复的存储实现,好让「我不要恢复」
成为一次看得见的选择。那个实现至今没写,polyloop.stores 里只有 JsonlRunStore,而
dissect 那份迁移文档一直在叫人去装配它。
调研 dissect 迁移面时撞出来的。对 dissect 不构成阻塞(它本来就要恢复能力),但一份指着
不存在的类的迁移指引,读的人会先怀疑自己装错了包。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-08-11 00:46:01 -04:00 |
|
iomgaa
|
95898bccf3
|
docs: 事件集落地后回写 GovDoc 缺口清单与阶段清单
「审计出口与事件流的关系」那条缺口转到已回答:审计由意图日志承担,出口要包在存储接缝上
而不是接在事件出口上;三类事件里 phase_recovery 那一类在界外。新登记一条缺口:工具单独的
耗时拿不到,本库只有整步墙钟,迁过去口径会变。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-08-10 22:57:09 -04:00 |
|
iomgaa
|
4f3f43d218
|
docs(design): 按两轮硕士生冷读改 0011 与 0012
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 到底
是什么、空串调用标识是防御而不是常规路径、以及为什么超时与重试次数不算模型身份。
|
2026-08-10 04:06:16 -04:00 |
|
iomgaa
|
6af289d283
|
feat(stores): 落成逐行追加的日志存储,契约套件第一次真的在跑
design 0011(待确认)定了六条:一次运行一个文件且文件名就是运行标识(不转义不哈希,按标识
去目录里找文件是最自然的用法;标识必须是安全文件名,否则 ../ 会把文件写到目录外面);一行
一条记录加一个 record 类型标签(serialization 编出来的载荷没有元信息键,标签是存储这层加的,
record 从此是保留键);第一条解不开的行就是日志结尾、它后面还有内容就是损坏;fsync 只在
运行开始、两条意图、运行结束四处(其余两处靠前缀持久性兜);写入走 to_thread;运行开始记录
用 O_EXCL 兜住跨进程撞车。
契约套件里那条 test_step_without_an_action_is_still_recorded 转成真断言——它标着 xfail 的
理由是「StepCompleted.result_id 在 0006 里是必填字符串」,而 0006 决策七早就把它改成可为空
并加了不变量。xfail 8→7,跳过 24→14。
原子写「一起不可见」那一半按契约套件的点名在这一层补上了:给实现留一个可注入的故障点
(一个可替换的「把这些字节写进去」),测试把它换成写一半就抛异常,断言那条记录整条不可见。
前缀持久性仍然验不了(掉电才看得出来),继续登记为已知缺口。
调研三条实据写进了 0011:两个下游 fsync 全仓零处(一个的 SQLite 还开着 synchronous=NORMAL),
所以这条比它们都严、代价是每步两次 fsync;一个下游的轨迹检查器同样是「碰到第一条坏行就放弃
整个文件」;另一个下游踩过「文件名少一维导致两个阶段静默互相覆盖」,O_EXCL 把那类静默覆盖
变成显式失败。这几条我自己逐条核过——那份调研的 subagent 承认它编过一句「我抽查过了」。
migrations/dissect.md 登记两条:运行标识要带齐现在文件名里那五维,以及这份意图日志和它那份
逐步轨迹是两样东西不要混。
|
2026-08-10 03:38:31 -04:00 |
|
iomgaa
|
2367d3afbc
|
feat(_assembly): 落成段序与注入槽;design 0010 删掉工具段模板
0010 取代 0006 决策三里 tool_section_template 那一行。三条理由:两个真实消费者都是项目侧
自己把工具清单拼进上下文的(一个塞在 run 级模板里伪装成示例演示的一次执行输出,另一个的
render_tool_docs 全仓零生产调用方);留着它的话迁移的人会去填,填完提示词里有两份工具清单,
而那个下游的验收标准是轨迹逐字段可比、变了还不报错;参考框架 pi 的内核同样不渲染,它的应用层
虽有 Available tools 段,但每行来自与 description 分开的 promptSnippet 字段——说明就算要渲染,
那段文字也不该是从校验用的 schema 生成的。四者同源不受影响,schema_for_model() 还在。
段序照唯一跑通了的下游:run 级片段 → 注入槽 → 目标级片段 → 逐步的模型输出/观察交替,
按变化频率从低到高排(供应商按前缀缓存计费)。库不合成任何 system 消息——有一个下游全程
没有 system 消息,加一条它的提示词会凭空多出一段。
注入槽每条一条 USER 消息、正文原样、不加任何分隔符(分隔符是渲染格式,归项目侧),通道按
名字排序(映射的迭代顺序取决于调用方怎么构造,用集合建出来的每进程都不同)。空注入等同有
测试守着。观察模板必须含占位符,缺了就报错——不校验的话每一步的观察会整个消失,而模型收到
的是一段看起来完全正常的固定文本。规模度量逐块问,认不得的块类型直接失败而不是当成 0。
零业务假设扫描第三次抓到我自己(模块 docstring 里写了「实验因子」),已改成中性说法。
migrations/govdoc-saas.md 登记了「模型原生工具调用没有路」这个缺口。
|
2026-08-10 02:48:56 -04:00 |
|
iomgaa
|
f8e02290f4
|
docs(design): 落成 0006 与 0007,公共 API 的名字、签名与接缝行为
0006 定「叫什么、什么形状」:五个接缝的 Protocol 名与签名、公共类型的英文名与
字段清单、类型分到 types / ports / tools 三个模块的判据。
0007 定「同一个签名下什么算对」:三个动作状态的触发条件、动作被拒绝时观察由库
合成而不取执行器那段、解释器不许抛异常、read_log 读不存在的运行返回空日志。
两份拆开是因为后者的权威处按 §0 是 tests/contract/,design doc 只记当初为什么这么定。
这两份改动了 0003 四处,全部在文首登记:记录集合是六种东西不是五类;
参数视图是方法不是字段;预算是四项不是两个计数;ports 装「Protocol 与它们的
入参/返回结构体」那半句写不出来——照它写 types 会反向依赖 ports。
四处全是「把字段类型逐个写出来」这个动作本身逼出来的,纯读文档看不见。
四轮评审:两轮硕士生冷读报了约 45 条,两轮 Codex 对抗审查报了 13 条,
逐条核实后基本全部成立并修完。最后一轮是唯一一次契约测试与文档互相抓到对方的错——
文档改了方法名测试没跟,测试把 dissect 的动作语言写死成输入会误杀 GovDoc 的实现。
结论回写 architecture.md:第七节补类型归属判据,第八节改 ports 那一行,
第九节补五个 Protocol 的英文名,第十四节把「英文名还没定」那条缺口换成指向;
决策索引加两行。字段表刻意不回写——按 §0 那是代码的权威。
CLAUDE.md 与 README.md 开头的「一次 Agent Session」是术语漂移,改成「一次运行」。
CLAUDE.md §7 加两条工作方式:能压成一段结论的活尽量交给 subagent、
委托出去的活交证据不交判断;以及持续往下做,只在人类门和真判断不了的岔路停。
§8 那句「讲完停下来等回应」与后者打架,收窄到只管说话方式。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-08-09 23:56:38 -04:00 |
|
iomgaa
|
766f7a0290
|
docs(design): 落成 0005,修订存储接缝的原子写与步记录三处
第二轮 Codex 对抗审查报的五条全部核实成立,0003/0004 已冻结,修订新写一份。
五条都不改任何决策的结论,改的是结论到形状之间那一段的落实。
决策一:步记录加一个布尔的完成信号列。0004 决策二承诺靠它区分两条完成通路,
而决策四的字段表里没有这个字段。它自己就够区分,不必查注册表——
事后分析手上常常只有轨迹文件。
决策二:存储接缝六个方法重切一刀,把「按预分配 ID 写一条结果」拆成
「写模型调用结果」与「写动作结果与步记录」。原子性从散文变成签名里不可表达其他形态。
决策三:观察那一列的口径改成「回填进历史的那段文本」,不加字段。
dissect 的 render_messages 把 step.observation 原样套模板发出,
raw_output 也是解析器截断后的版本——两侧同构,都是一段文本加一个数字。
决策四:作废 0004 词表里「一个可能取不到的完成信号」,那是上一轮 fatal bug 的原话。
决策五:存储接缝加前缀持久性。少了它,一次明明成功的模型调用会被恢复
记成「状态未知」,而它成功的证据就在同一份日志里。
结论已回写 architecture.md 第九节与决策索引;migrations/dissect.md 需求七
补上「分开记的是文本加数字,不是两段文本」,堵掉这次审查里出现过的误读。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-08-09 12:02:38 -04:00 |
|
iomgaa
|
4f8812fa82
|
docs(design): 落成边界、续跑、公共 API 形状与停止语义四份决策
第 ② 阶段需求对齐与第 ③ 阶段架构的产出,代码尚未开始。
design/0001 定边界判据:三道测试(时机 / 信息 / 性质)全过才在界内,
外加「只认接缝、不认接缝后面是什么」与不夺走下游实验因子的排除条款。
design/0002 定步级续跑:不承诺原子性,承诺绝不静默丢失与不替工具猜幂等性;
先写意图再执行、结果 ID 预分配、重放策略由工具声明且默认绝不重放。
design/0003 定公共 API 形状:单一入口两个动词、五个接缝、三个伪接缝的排除理由、
分层与九条依赖规则。design/0004 定停止判定顺序、十个停止原因取值与步记录字段表。
0003 与 0004 需过 CLAUDE.md §2 人类门,已由项目负责人确认,状态转为已接受。
explanation/scope.md 与 explanation/architecture.md 是这四份决策的常青回写,
分层与模块边界的权威在 architecture.md,将来由 import-linter 契约机器断言。
migrations/ 下 dissect 是唯一的硬迁移验收,govdoc-saas 只做设计级对齐。
三道闸都过了:14 agent 对抗辩论定骨架,两轮硕士生阅读报的 30 余条已修完,
Codex 对抗审查抓出的两条致命问题(提交型完成被误判成环境故障、
崩溃恢复漏一个状态)已修,修完的形状还没送 Codex 复审。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-08-09 10:48:33 -04:00 |
|
iomgaa
|
a2e94318b9
|
chore(repo): 建仓,落成协作规范与文档骨架
协作方式以 CHSAnalyzer 为蓝本,按「库」这个身份改写:
- CLAUDE.md §0 的权威表换成公共 API 契约、公共类型、下游迁移三条主线,
数据库 schema / HTTP 契约 / alembic 迁移在本项目不存在,整体删去。
- §1 新增四条库特有的硬约束:字段只增不删不改名、持久化 schema 走显式版本、
不反向 import 下游、发布必须走完整流程(PolyGateway 有两个版本只 bump
没上传,registry 长期停在旧版且无人发现)。
- §3 的四类 Codex 对抗审查按同一判据重定:公共签名、停止判定与预算结算、
取消传播与 Session 隔离、schema 演进。共同点是错了不会当场炸。
- research-wiki 在常青层加第四类 migrations/,因为本项目的核心验收标准就是
能否搬回 dissect、能否替代 GovDoc-SaaS 的 docagent-core/,塞进 guides/
会让它看起来像可选工序。
reference/ 不入库:五个仓库各带一个 .git、合计约 96MB,提交进来会变成一堆
不可用的嵌套仓库。它也不是任何事实的权威,agent-core.md 同理。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-08-07 07:02:09 -04:00 |
|