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 登记两条:运行标识要带齐现在文件名里那五维,以及这份意图日志和它那份 逐步轨迹是两样东西不要混。
This commit is contained in:
@@ -164,6 +164,16 @@ dissect 有一档实验要在同一时刻用不同的注入内容跑同一批题
|
||||
|
||||
## 缺口登记
|
||||
|
||||
**运行标识要带齐现在文件名里那五维,否则会重演一次静默覆盖。** 现在的轨迹文件名是
|
||||
`r{轮次}__{阶段}__{题目}__s{种子}__a{尝试}.jsonl`,`_trajectory_path` 的 docstring 记着一个
|
||||
踩过的坑:阶段那一维原先漏了,导致同一次 run 先跑 train 再跑 gate 时后者静默覆盖前者。
|
||||
PolyLoop 的日志按运行标识分文件(`../design/0011-jsonl-run-store.md` 决策一),所以那五维要
|
||||
拼进运行标识;少一维的表现不再是覆盖,而是「日志里有别人的记录」,恢复会判成日志损坏。
|
||||
|
||||
**这条日志和 `Rollout.to_jsonl` 那份轨迹是两样东西,不要混。** 前者是意图日志,记的是「准备
|
||||
做什么、做完了没有」,为的是崩了能续;后者是产物,记的是逐步轨迹,给反思模型读。前者由库写,
|
||||
后者迁移后由 dissect 自己从 `RunResult.steps` 重组(见下一条)。
|
||||
|
||||
**轨迹文件的格式是反思模型的唯一输入界面,迁移后要由 dissect 自己重组。**
|
||||
`Rollout.to_jsonl` 现在把项目 metadata 头和逐步轨迹写在同一个文件里,第一行是头、后面每行
|
||||
一步。PolyLoop 只返回运行标识和步序列,所以 dissect 要自己把两者拼回那个格式,而且格式
|
||||
|
||||
Reference in New Issue
Block a user