mirror of
https://github.com/rowboatlabs/rowboat.git
synced 2026-07-12 21:02:17 +02:00
advance() resolved the context chain, agent snapshot, live model, and every snapshotted tool before applying ANY input — including cancel, which uses none of them. A permanently broken environment (provider removed from models.json, builtin renamed by an update, context predecessor unreadable) therefore rejected every advance forever: the turn could not be cancelled, stopTurn's fallback failed, and the session rejected sendMessage with TurnNotSettledError permanently — a bricked session with valid bytes on disk. Materialization is now a thunk the invocation awaits only for work that continues the turn: run() short-circuits a cancel input straight to the cancel path (same commit ritual, same synthetic results, byte-identical events for healthy turns), while every other input still materializes first, preserving §15.3's reject-before-touching-the-file ordering. applyInput narrows to non-cancel inputs. Tests: cancel succeeds against a broken tool registry (with the non-cancel input asserted to reject file-unchanged), a broken model registry, and an unreadable context chain; plus a healthy-cancel regression pinning the exact event sequence and outcome. All three broken-environment tests fail against the old code. Design doc §15.3, §18, §22, and §26.5 updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| cli | ||
| docs | ||
| experimental | ||
| python-sdk | ||
| rowboat | ||
| rowboatx | ||
| x | ||