Skip to content

fix(explore): 探索中途挂掉,已采到的屏不再全丢 - #2

Merged
zyonlab merged 1 commit into
opt/tier4from
fix/exploration-partial-progress
Sep 14, 2026
Merged

zyonlab merged 1 commit into
opt/tier4from
fix/exploration-partial-progress

Conversation

@zyonlab

@zyonlab zyonlab commented Sep 14, 2026

Copy link
Copy Markdown
Owner

问题

九个节点里只有探索是「中途挂 = 全丢」,而它同时是最长的一个——这次的材料 187,669 字,跑满 20 屏要几十分钟加一次钱包会话。

整份结果只在函数返回时才组装、才落账本,所以第 18 屏崩掉,前 17 屏花掉的十几次模型调用全部作废,resume 从第 1 屏重来。2026-09-12 还因为收尾时 runner 被心跳看门狗 SIGKILL,一晚上丢过四次完整探索——那几次探索其实全跑完了

改了什么

探索器每采到一屏落一次半成品snapshotPartial)。只落材料不落状态图:graph 要循环跑完才建得出来,而材料就是钱花在的地方。先写临时文件再 rename——崩在写一半上留下半个 JSON 比没有更糟。跑完了删掉半成品,否则下一次失败会捡到上一次的材料。

服务端在失败路径上捡回来:有材料就带着已采到的屏继续走,没有才如实抛原来的错,并落一条 report/exploration-partial 说清楚停在第几屏、为什么停。

落点用同一个函数算(partialObservationPath),两侧共用——两处各写一遍模板字符串是个会悄悄错开的接缝:改了目录名,写和读都不会报错,只是永远捡不到,而「捡不到」和「本来就没有」长得一样。

这不是断点续跑

不会从第 18 屏接着探。那要动 interactive.ts 的状态机,而且探索有随机性,「接着走」的语义得先定义清楚。这个 PR 保证的只是已经花掉的钱不白花。

顺带:workflowCheckpoint 漏了两个节点

原来:["instructions", "stories", "cases", "gate", "finalize"]

sourcemodules 不在里面——一次在 modules 上失败的运行,next 指向 stories,resume 把模块节点整个跳过去,而下游所有单元都按模块树切。

第一版我写成「没 done 就回到它」,run-routes 那条测试当场红了:宿主注册的运行材料在注册时就交了,根本没有 source 节点,那样会把每个宿主运行送回一个它从来没有过的节点。改成「走过、而且没走完才回到它」,必经节点仍按原判据。

检查

🤖 Generated with Claude Code

九个节点里只有探索是「中途挂 = 全丢」的,而它同时是最长的一个:这次的材料
187,669 字,跑满 20 屏要几十分钟加一次钱包会话。整份结果只在函数返回时才组装、
才交给服务端落账本,所以第 18 屏上崩掉,前 17 屏花掉的十几次模型调用全部作废,
resume 从第 1 屏重来。2026-09-12 还因为收尾时 runner 被心跳看门狗 SIGKILL,
一晚上丢过四次完整探索——那次探索其实全跑完了。

**探索器每采到一屏落一次半成品**(`snapshotPartial`),只落材料不落状态图:
`graph` 要循环跑完才建得出来,而材料就是钱花在的地方。写法是先写临时文件再 rename,
崩在写一半上会留下半个 JSON,那比没有更糟。跑完了就把半成品删掉——留着它,
下一次失败会捡到上一次的材料。

**服务端在失败路径上把它捡回来**:有材料就带着已采到的屏继续走,没有才如实抛原来的错,
并落一条 `report/exploration-partial` 说清楚停在第几屏、为什么停。
材料里也写着「这份只到第 N 屏」——下游读到的是一份 17 屏的材料,不是 20 屏的。

这**不是**断点续跑:不会从第 18 屏接着探(那要动 `interactive.ts` 的状态机,
而且探索有随机性,「接着走」的语义得先定义清楚)。它保证的只是已经花掉的钱不白花。

落点用同一个函数算(`partialObservationPath`),两侧共用。这是个典型的会悄悄错开的
接缝:两处各写一遍模板字符串,哪天改了目录名,写的一侧和读的一侧都不会报错——
只是永远捡不到东西,而「捡不到」和「本来就没有」长得一模一样。

顺带修 `workflowCheckpoint` 漏掉的两个节点。原来的清单是
`["instructions","stories","cases","gate","finalize"]`,`source` 与 `modules` 不在里面:
一次在 modules 上失败的运行,`next` 会指向 `stories`——resume 把模块节点整个跳过去,
而下游所有单元都按模块树切。

但这两个是**有条件的**:宿主注册的运行材料在注册时就交了,根本没有 source 节点。
第一版我写成「没 done 就回到它」,`run-routes` 那条测试当场红了——它会把每个宿主运行
送回一个它从来没有过的节点。改成「走过、而且没走完才回到它」,必经节点仍按原判据。

测试 +7(431)。`pnpm check:drift` 在这条分支上是红的,红的是 PR #1 要修的那 4 处
宿主 plugin 副本——这条分支基于 opt/tier4,还带着过期的副本,不在这里顺手修。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@zyonlab
zyonlab merged commit 149b96a into opt/tier4 Sep 14, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants