Dashboard › opencode › Distillation
f4dfe607-bcfe-4a78-9176-c74791d47cb0["lore_tm_v1_-6WpLKbknDCqynSVqezzlrQFZsWlg60vdmqYkrDqxJQ","lore_tm_v1_qPin4GJ8u9plglrjlfkadVz7hQnGYp2O_TqQHZIBCEE","lore_tm_v1_7vsxv4Wz9417N3A_KQ0YRIkUSwbEp4etb_B9Dqjfafc","lore_tm_v1_mtq6nIc2um4gT6x9aHKVdFgSsZcA5v68CDT3vZAnUGo","lore_tm_v1_dwLcRV7ZEpcdJmnLxcCO8h6G4bHNvNf12k_anBVSqmU","lore_tm_v1_CV7Yu8bK-anTz-xUe-DfHwgTiSsjv3Gl2W5obdD2itU","lore_tm_v1__jHijFEh63gt0jJ770Im0w1PRCU1JO6bYmah8zP8NGY","lore_tm_v1_bBSChqCnEskVzQ7dV9AmOthLyuGCOO2udioUafQ0ImQ","lore_tm_v1_DNmZYN5c2PTlSTXw4p331MrgDtpQa1H7JhtCZRpdx9I","lore_tm_v1_gpZP8Btd72RPGPmy5zs--VNmOnGs-Q6mzuBsRN5_vtg","lore_tm_v1_-Bv7aFgXXG6rVeq80Kpzp8Wb0PyZzG-xeR2E_prOmDo","lore_tm_v1_hSZ9TYm8RJw1ISnE05mcwTatXQIK1rlpD90mr3rguEA","lore_tm_v1_fzXIgcDbjxp404Cg2GV5JlvTp3Y1G7HZLt7T5LGS4LU","lore_tm_v1_VI6shpstS_xqnMNoJDnc6SbgeOsuOeHV5yy8uq4mWFA","lore_tm_v1_TyXfK22oBQU-LoxdKUs1sYPNcM2qOfURGgtFxZEQM5Q","lore_tm_v1_UX3OxrVjM4fyhqHI12Q2Di5YufkppHUeL1E2uEtCEDs","lore_tm_v1_gbJNtNEIjIxuScNc98K6QArykwKF2PAMnPZY6ymFzAc","lore_tm_v1_PNNjKdTmJBRLEE3bxCC3GqjWma1E-hC166wz7UsWKW0"]
Date: Sep 17, 2026
Step.Failed projector “never settles pending or running tools” at packages/core/src/session/message-updater.ts:225-230. A provider error can publish Step.Failed while a local tool remains active, after which packages/core/src/session/runner/llm.ts:399-405 waits for that tool; if interrupted, joined finalizers let settleCancellation see a completed assistant, transition the claim to cancelled, and clear ownership at packages/core/src/session/execution/local.ts:146-149, potentially leaving a durable tool permanently running with no recovery row.packages/core/test/session-runner.test.ts:3952-3997 follows the failed-Step cancellation path but checks only Step and claim rows, not tool state; required fix was to reconcile unresolved tools after all finalizers join and before clearing the claim, even when the Step is already failed.packages/core/test/session-runner.test.ts:3906-3949 installed a trigger for session.next.tool.failed.1 at lines 3921-3927, but coordinator cleanup publishes Step.Interrupted at packages/core/src/session/execution/local.ts:151-163; therefore the trigger never fired.session.next.step.interrupted.1 and prove that the claim remains cancelling, no successor starts, and no partial Step/tool settlement commits.d0c78e881892d4f894fab7f6be00643c133ca21f9d2c88ae0d5ff31215393021, but the final check found aa98d64abb3bf6ac0ef88a940f9c41c6eb14ffeab3c3a7846921ba01ef46643d at /home/byk/Code/opencode/packages/opencode/dist/server/opencode-server; artifact approval was therefore impossible because the reviewed binary was no longer the immutable supplied artifact.HEAD ab9408c81cc9916177641ae8e9f08624fc27b5b9, patch SHA-256 24352107c74d8245fcba7f8571ba0be4b7fc514e6c73cfbf0498f0c25f29f9ba, exactly 34 patch sections and 34 changed paths, matching preimage/postimage blobs, successful reverse applicability and cached forward applicability, no staged changes, and successful git diff --check.cancelling via transaction rollback; expired cancelled claims clear while expired cancelling claims quarantine; direct SessionRunner interruption remains unknown; ownership checks immediately precede both snapshot captures; explicit resume persists execution intent before advisory execution; recovery scans have matching indexes; and current client, legacy SDK, OpenAPI, migration, and generated schema surfaces include the new contracts.DO-NOT-MERGE.in_progress), 2. “Make interruption publication-failure regression reach real event” (pending), 3. “Run full package validation and isolated artifact restart smoke” (pending), and 4. “Freeze revised candidate and obtain independent correctness and security approval” (pending).Tool.Failed for every unresolved tool, retain phase cancelling through intermediate events, atomically set cancelled with the final tool event, then clear the claim. For an already completed failed assistant, preserve its original error and emit no duplicate Step terminal event.packages/core/src/session/execution/local.ts was updated twice to implement completed-cancellation tool reconciliation.session.next.step.interrupted.1, the event coordinator cleanup actually publishes for an incomplete assistant. The intended fail-closed contract became: interrupt fails, claim remains cancelling, tool remains running, and no successor can acquire ownership.Step.Failed regression to require the active tool to become a durable error before the execution claim is removed.packages/core/test/session-runner.test.ts was updated with both revised cancellation regressions.tsgo --noEmit and two filtered tests from packages/core/test/session-runner.test.ts. One test passed and one failed after 10 assertions: the publication-defect path correctly reached the intended event and left the claim in phase cancelling, but Bun’s toMatchObject comparison treated expected finish: undefined as mismatching an actually absent finish property.toMatchObject assertion with explicit absence-of-finish and running-tool checks.2 pass, 108 filtered out, 0 fail, and 13 expect() calls across one file in 1485.00ms; tsgo --noEmit also passed.254 pass, 0 fail, and 779 expect() calls across 8 files in 21.42s.