STEP 1592 — PlanRunner v0.3
目的
藤本さん directive「counter fix + MCP migration auto + Bluesky v0.3 (pause/resume/kickoff/complete/create/save/drop) 順」 arc 3/3。 STEP 1534 v0.2 で除外していた Msg type を Rei semantics 明確化して追加。
追加 7 Msg type
| Bluesky | Rei v0.3 | Rei semantics |
|---|---|---|
pause | pause | plan を human review 点で一時停止 (resume signal 待ち、 optional timeout) |
resume | resume | 外部から runner.resume(label) で pause 解除。 symbolic yield も可 (no-op、 trace 記録用) |
kickoff | kickoff | 長時間 async task を fire (token 即返却、 task は background で走る) |
complete | complete | kickoff の token で await + 結果回収 (optional timeout) |
create | create | run-scoped ephemeral data 格納 (in-memory Map) |
save | save | data を user-supplied persistFn で永続化 (file I/O は user code に委譲) |
drop | drop | run-scoped data 削除 (existed flag 返却) |
Runner API
const runner = new PlanRunnerV03(options);
// pause / resume control
runner.resume('gate') // → boolean (found & resumed)
runner.cancelPause('gate', msg) // → boolean (found & rejected)
runner.pending() // → string[] (active pause labels)
// kickoff / complete introspection
runner.activeTasks() // → number (in-flight tokens)
// create / save / drop store
runner.storeKeys() // → string[]
runner.storeGet(key) // → unknown
Example: full realistic sequence
function* plan(): PlanV03 {
yield openRunMsg('sess-1'); // v0.2
yield subscribeMsg('__run__.closed', (e) => log(e)); // v0.2
yield createMsg('config', { threshold: 0.95 }); // v0.3 create
const k = yield kickoffMsg('long-analysis', async () => { // v0.3 kickoff
return await runHeavyAnalysis();
});
yield pauseMsg('gate', 'wait for user approval'); // v0.3 pause
// ... external: runner.resume('gate')
if (k.kind === 'kicked_off') {
const done = yield completeMsg(k.token); // v0.3 complete
}
yield saveMsg('config', (k, v) => fs.writeFileSync(...)); // v0.3 save
yield dropMsg('config'); // v0.3 drop
yield closeRunMsg('sess-1', 'success'); // v0.2
}
累計 Msg type 18 (v0.1 + v0.2 + v0.3)
| Version | Msg type | 数 |
|---|---|---|
| v0.1 (STEP 1579) | call / check / dry_run_hint / wait / checkpoint | 5 |
| v0.2 (STEP 1534) | open_run / close_run / subscribe / monitor / stage / unstage | 6 |
| v0.3 (STEP 1592 本 page) | pause / resume / kickoff / complete / create / save / drop | 7 |
| Total | 18 |
Bluesky RunEngine の 15+ Msg type から Rei semantics 明確化できたもの全て取り込み完了。
Backward compat 完全
- v0.1 (
plan-runner-msg.ts) 不変 — STEP 1579 test 48/48 継続 PASS - v0.2 (
plan-runner-msg-v02.ts) 不変 — STEP 1534 test 47/47 継続 PASS - v0.3 は新 file (
plan-runner-msg-v03.ts) + PlanRunnerV03 class として opt-in - PlanRunnerV03 は内部で PlanRunnerV02 を委譲 (v0.1/v0.2 Msg を delegate 処理)
Test — 53/53 PASS + regression 130/130 clean
- Msg constructors (7 新 v0.3 type)
- v0.1/v0.2 backward compat via v0.3 runner (checkpoint/openRun/call/closeRun 4 Msg delegate)
- pause + resume flow (external resume unblocks)
- pause timeout throws
- kickoff + complete round-trip (async task fire-and-await)
- complete timeout throws
- create + storeGet + drop (in-memory store)
- save invokes persistFn with correct args
- save without create throws
- dryRun skips persistFn + kickoff fn but records trace
- summarizeTraceV03 counts new v0.3 Msgs
- Full realistic sequence (9 Msg: open + subscribe + create + kickoff + pause + complete + save + drop + close)
Honest scope
- v0.3 の pause/resume は single-runner scope (multi-runner coordination は別 STEP)
- kickoff/complete の cancellation (abort mid-flight) は timeout 経由のみ、 explicit cancel API は v0.4 candidate
- create/save/drop の store は in-memory single-run。 cross-run persistence は persistFn callback で user code に委譲 (Rei は data 層 unopinionated)
- Save の persistFn は 実 I/O 実装が user 責任 (writeFile / DB insert 等)。 Rei stack が benchtop ledger と 統合するのは 別 STEP
- pause / kickoff は async (Promise) 依存 = 純同期 plan では意味なし。 async plan runner 前提