Dashboard › opencode › Distillation
8e3b0c08-81a5-4dbf-ad08-4fa5d28305f0["lore_tm_v1_TDUPe4xWs1EUaLud7x1-wCPoeNggoa5gcYFuSYUYCf0","lore_tm_v1_6oUxciWyOHwui3ipuqmN9W36baS-pBCgNnrt7NtfNw4","lore_tm_v1_-fCA5ASdXCWUVbYOlqGU5TPtq4QvbzdPcPP47lGcczc","lore_tm_v1_EbbrRZGHkSCIilijzX811T83eFgDTfkMF3o1hf6RrEs","lore_tm_v1_WrhPH4Cev_iVP8qnCtNssMsou5oWJP_xqaClWLVRuE4","lore_tm_v1_8SKMi4ts5imOVc8Un9eWGfy2vh-DgAjgIp3NbJyb1WY","lore_tm_v1_SDQ9qCs_Jsy44ZAxZmjktU_iieCdgzX98VGKEy-YqKU","lore_tm_v1_hP8naaRpOLSSZ2bf042aaB_nLsKMG_RVSXalr9lrnqI","lore_tm_v1_WqU-xNJQkUSWFzZebYN58ai8MjASV8J8SuHPjPTH0aE","lore_tm_v1_dwz6Fu7jTmap3GNg5q4X6zsmGoZXK4BVxfutDQPvdIc","lore_tm_v1_MgoAQkqrRIpWwyJGafNFl5bWzLh7x4Q2qH7cm7aQE3s","lore_tm_v1_ReU665Go_WI0SdkrIf1yOZL69Rq44xJKrX5EuBAVh7s","lore_tm_v1_n7nd1QKmqC2ajUmTwTLVLSnF4KW0gl_rjAEJJ7yErxY","lore_tm_v1_0GQpqiyvT9MW4WtfqJWnbWBLq-JieiPwDpv9s8SZVLs","lore_tm_v1_GhCVUI-KcetnWVgW1gBpZVkC4z2iLx18LwZe9mHLJSc","lore_tm_v1_jyUtqvd8BXTiEiumkntpEzkK2f7oZcjuLItvZCk7zV4","lore_tm_v1_IDRkJnIQ7j5WfZEdXug-YWsSsFot0_4oGSWferH4nCI","lore_tm_v1_dISURdcQFKlOg6_gg95DWN4RPLjNpilPNPA1dmK5rcU","lore_tm_v1_P8cwVUB1Q6enpBMedP_cjUpGEfaU8VeltDxaqJ-IE7M","lore_tm_v1_bGLS-kdxUv1VYmVX5fyWWQJsf3zW-RdfaP4-RldRdWs","lore_tm_v1_WxxpmjhP8I1104diGGTPKLPkh0WA6AWgPFlfoP_kGWI","lore_tm_v1_ymGL6k_Qlfb5cuN3t33X6okRiSuUfHKrCSujPncS8iY","lore_tm_v1_TXcbCjytKr301qdCvq4e15geegmESwzWefm5U97YQZs","lore_tm_v1_d0MuONn8biIBRRADHgnzsF9jX-1euISP2pOHW95bDZM","lore_tm_v1_S9RfYY4Lza46gAndsxxXoVM1MUAEAXAPF1RF0rRQZG8","lore_tm_v1_ugUWpe6KyTfPNobua3UCEB6vNNttftZyGnyoKt92bC8","lore_tm_v1_O-E0jfBtBNiqxuuPxolyHOD9pS5Vmr6Jb9BtDJB21WI"]
Date: Sep 17, 2026
ab9408c81cc9916177641ae8e9f08624fc27b5b9, patch SHA-256 0eb85245c71fb55fa2a8e169a1cd1de5579059d77aaca30b6ac254482e255a2e, SEA SHA-256 308e9e562a3473b66bac430166db9d6cdd29f5f071d5695c1c35f28b99f26bf4, exactly 34 paths, matching base/postimage blobs, and successful reverse-apply validation; all 34 paths were inspected read-only.failAssistant in packages/core/src/session/runner/publish-llm-event.ts:222-240 set assistantFailed only after events.publish(...) returned, while packages/core/src/event.ts:237-363,379-390 durably committed Step.Failed before interruptible notification completed. Cancellation during that notification could leave durable Step.Failed with assistantFailed=false, causing packages/core/src/session/runner/llm.ts:429-443 to publish duplicate Step.Interrupted.Step.Failed commit and publish() return; terminal-state selection must use state established at the durable commit boundary. Existing regression at packages/core/test/session-runner.test.ts:3965-3976 only polled for the committed event and did not hold publication in that window. Verdict: DO-NOT-MERGE.packages/core/src/session/execution/claim.ts:27-109.assistantFailed decision with durable projected terminal state after interruption, plus a deterministic publication-notification gate.packages/core/src/session/message-updater.ts:23-35 establishes that a newer turn supersedes stale incomplete rows and must “never resume an older assistant projection”; getCurrentAssistant() selects only the latest assistant and returns it only when incomplete.session_message already stores terminal assistant state in the same event transaction. The chosen fix makes cancellation, after tool reconciliation, read the claimed assistant projection and settle ownership directly if any terminal Step has committed; this covers Step.Failed, Step.Ended, or Step.Interrupted committed before notification interruption. The lagging in-memory flag was removed from cancellation decisions in packages/core/src/session/runner/llm.ts and packages/core/src/session/runner/publish-llm-event.ts.tsgo --noEmit in src/session/runner/llm.ts:452: SessionMessageData lacked property type (TS2339), assistant was possibly undefined (TS18048), and the union’s time could lack completed (TS2339). The query’s union narrowing was then corrected in packages/core/src/session/runner/llm.ts.ab9408c81cc9916177641ae8e9f08624fc27b5b9, patch SHA-256 0eb85245c71fb55fa2a8e169a1cd1de5579059d77aaca30b6ac254482e255a2e, SEA SHA-256 308e9e562a3473b66bac430166db9d6cdd29f5f071d5695c1c35f28b99f26bf4, exactly 34 paths, matching blobs and all hunks, while excluding unrelated .lore.md, AGENTS.md, and perf.data* worktree changes. It performed no mutations, tests, builds, or service operations.Step.Failed commits; 3. publication blocks or is interrupted during notification; 4. assistantFailed=true never executes; 5. tool reconciliation completes; 6. cancellation sees false and publishes Step.Interrupted. It required a listener blocked after observing Step.Failed, followed by interruption and assertions of exactly one Step.Failed, no Step.Interrupted, no claim, and no recovery. Verdict: DO-NOT-MERGE.10 seconds forever; counters reach Number.MAX_SAFE_INTEGER then rotate to 1; each pass can schedule up to 100 recovery wakes plus 100 ordinary wakes without global concurrency control or backoff. It classified this as operational rather than an authorization bypass.packages/core/test/session-runner.test.ts:805 asserts the invariant never starts a local tool after ownership changes; it transfers SessionExecutionTable ownership when SessionEvent.Tool.Called is observed, then verifies executions remains empty and no Tool Success or Tool Failed event is emitted.packages/core/test/session-runner.test.ts was revised to use EventV2.listen, whose callback executes after the durable event transaction commits but before publish() returns. The callback blocks notification for Step.Failed; interruption occurs at that exact boundary; the test proves cancellation consults durable assistant completion, emits no second terminal event, removes the exact claim, and leaves no SessionRecoveryTable row.tsgo --noEmit succeeded; targeted run had 3 pass, 106 filtered out, 0 fail, and 14 expect() calls across one file in 2.47s.229 pass, 0 fail, and 685 expect() calls across 7 files in 18.70s.