Dashboard › opencode › Distillation
bb0968f6-b189-4d3b-90e2-08198a09fa18["lore_tm_v1_ZdIX62s7ESGtIdMTBvISoEsl4Bkb_rgXv9dS6PamN08","lore_tm_v1_gXAiD0kb-dCg2PaKZ0kwKrjyoadJ83LqGsYe-FaSxpY"]
Date: Sep 15, 2026
/home/byk/Code/opencode/packages/core/src/session/message-updater.ts:230-294 showed "session.next.step.interrupted" completes the owned assistant message with finish = "error" and event.data.error; pending/running tools are completed at the event timestamp and converted to SessionMessage.ToolStateError with message "Tool execution interrupted", preserving input and preserving structured/content only for previously running tools."session.next.step.recovered" in /home/byk/Code/opencode/packages/core/src/session/message-updater.ts:251-294 does nothing for phase "continue". For phase "unknown" it uses "Provider Step outcome unknown after server restart"; otherwise it uses "Session execution interrupted by server restart"."session.next.step.recovered" lacks assistantMessageID, it appends a SessionMessage.Synthetic whose ID is message(event.data.executionID); otherwise it completes the owned assistant as an error, appends AssistantText with ID recovery:${event.data.executionID}, and changes pending/running tools to errors with "Tool execution outcome unknown after server restart".PromptAdmitted in /home/byk/Code/opencode/packages/schema/src/session-event.ts:94-98 uses PromptFields without recording requestExecution; /home/byk/Code/opencode/packages/core/src/session/input.ts:61-72 stores wake_pending=true only through a local commit hook; /home/byk/Code/opencode/packages/core/src/event.ts:122-124 says commit hooks are neither serialized nor replayed; /home/byk/Code/opencode/packages/core/src/session/projector.ts:371-381 therefore reconstructs admitted prompts without execution intent; /home/byk/Code/opencode/packages/core/src/session/input.ts:143-153 inserts the replayed input without wake_pending, causing the default false from /home/byk/Code/opencode/packages/core/src/session/sql.ts:153; and /home/byk/Code/opencode/packages/core/src/session/recovery.ts:263-272 redrives only rows whose wake_pending is still true.PromptAdmitted and wake_pending=true commit atomically; 3. the advisory wake is lost before promotion; 4. projection is rebuilt from durable events; 5. replay reconstructs the unpromoted input with wake_pending=false because the durable event cannot distinguish default execution from resume:false; 6. ordinary recovery never selects it; 7. the durable prompt never runs unless another explicit action wakes that Session./home/byk/Code/opencode/packages/core/test/session-projector.test.ts:610-649 covers live ordinary redrive without replay; /home/byk/Code/opencode/packages/core/test/session-prompt.test.ts:314-337 covers live exact-retry upgrade; and /home/byk/Code/opencode/packages/core/test/session-runner.test.ts:643-658 covers replay of an already-settled recovery continuation rather than an unpromoted ordinary prompt retaining durable wake intent./home/byk/Code/opencode/packages/core/src/session/runner/llm.ts:400-430 durably records phase continue, /home/byk/Code/opencode/packages/core/src/session/recovery.ts:93-113 handles it, and /home/byk/Code/opencode/packages/core/test/session-runner.test.ts:1942-2000 reaches the crash window after Step.Ended./home/byk/Code/opencode/packages/core/src/session/compaction.ts:233-245 and /home/byk/Code/opencode/packages/core/src/session/runner/llm.ts:261-272 commit phase continue with Compaction.Ended; /home/byk/Code/opencode/packages/core/test/session-runner.test.ts:1511-1560 reaches the post-commit crash window./home/byk/Code/opencode/packages/core/src/session/input.ts:159-229, with coverage in /home/byk/Code/opencode/packages/core/test/session-projector.test.ts:149-217./home/byk/Code/opencode/packages/core/src/session/runner/llm.ts:377-383 and /home/byk/Code/opencode/packages/core/src/session/runner/publish-llm-event.ts:240-255 atomically publish Step.Interrupted and clear the exact live claim; /home/byk/Code/opencode/packages/core/test/session-runner.test.ts:3235-3287 includes step-finish, confirms claim removal, and verifies recovery does not restart the execution./home/byk/Code/opencode/packages/core/src/session/input.ts:54-58; /home/byk/Code/opencode/packages/core/test/session-prompt.test.ts:365-403 checks rejection of a conflicting resume:true retry and the subsequent recovery scan./home/byk/Code/opencode/packages/core/src/session/recovery.ts:143-260; batch progress is tested at /home/byk/Code/opencode/packages/core/test/session-projector.test.ts:493-557./home/byk/Code/opencode/packages/core/src/session/recovery.ts:85-100 and /home/byk/Code/opencode/packages/core/src/session/recovery.ts:176-250./home/byk/Code/opencode/packages/core/src/session/execution/local.ts:48-63; /home/byk/Code/opencode/packages/core/test/session-runner.test.ts:598-660 proves unrelated queued input remains pending./home/byk/Code/opencode/packages/core/src/session/execution/claim.ts:25-66, /home/byk/Code/opencode/packages/core/src/session/execution/local.ts:28-97, and /home/byk/Code/opencode/packages/core/src/session/recovery.ts:34-83./home/byk/Code/opencode/packages/core/src/database/migration.gen.ts:43-46; /home/byk/Code/opencode/packages/core/src/database/migration/20260915193000_session-recovery-fencing.ts:8-52 conditionally adds wake_pending and creates the final tables, while /home/byk/Code/opencode/packages/core/src/database/schema.gen.ts:157-210 matches the final schema shape.SessionRecovery reconcile it, installs a successor claim, and then resumes the stale runner across provider dispatch, tool execution, publication, promotion, and Context Epoch mutation in one scenario. /home/byk/Code/opencode/packages/core/test/session-projector.test.ts:1102-1175 tests the core fence with a synthetic side effect, while runner tests directly replace ownership at individual boundaries.