Dashboard › opencode › Distillation
6b50d03f-eb60-442c-be8b-30b2a4bdbb9f["lore_tm_v1_J62n1bG7oFVDRcnZZM_l0EYPgENCZcb7LDf_hc2vXGc","lore_tm_v1_ZxUtnJbw8xLX4XLZERfZD-XYGhDw1lWBRvhaEl24Bw4","lore_tm_v1_CP7jq2Jg2OggXC3xf8biKcSWzI8TjbcXSr-zX0wATbc","lore_tm_v1_poPHu16gjHYQPqw59E8T8EBxY61NmJMyb1M0DCSXbY8","lore_tm_v1_gYHaHnCTz8e55rMab1-BI2UaaEOzkyL6MiL1p7iUK4Q","lore_tm_v1_173wv057fi333nrXYSGwd5vE1aW00oxQ61IclTWopJs","lore_tm_v1_ZX1TdZmTYNlQzjznel0F9dZWTBwFLZbwSg1dx5E9s2Q","lore_tm_v1_qQaz1bLuWi2U15j_rU0SXYyUPR_W0PVaqhBEz4RisvA","lore_tm_v1_ZT10qrAgolI-rNeah7Ml_E5rRYt0tUECmwbQpbcrj3Q","lore_tm_v1_iddLv8gsULmRe4JSQUnr-hgCfE_GGbOzuS3tf66zUAE","lore_tm_v1_FQkBfCkbZTlfI7FRMimZBIOpMg3iJLehLk0-eVJXH_E","lore_tm_v1_BiNGe53kGprNVmr3SEgPNzky7DJroAZKVWDE8Mc9Hso","lore_tm_v1_af4CH_8BZWSQaCeUTFMNeW8jyX5rYw2_Y4oG7MoicaQ","lore_tm_v1_M2fwn6dyv40elYBvijBfAZ8s5hWZHcb-GR2SFD3jIv0","lore_tm_v1_TK2toYoGqlI9NOzDDg0G-3vfHeCQSeEmGep88f44FNA","lore_tm_v1_VfElNAROQeoLA2vYBwXYbPt7ZlpYXylYhlS2g12SqJ8","lore_tm_v1_f-E5rp9OmvAFU_cQAAp_LNmuH5orp2HgpbHpjEutVpE","lore_tm_v1_1uHL3ftdoKAh-Nw7QfI7La-ZZb7pgEum9dxhGgu9NKU","lore_tm_v1_otZPmUeFu-b_ta3anF30SDbczyPyizrxoHBFhAVoZhI","lore_tm_v1__khCcd0Qb5rLlH5zzUiL-uvANcLwa2YGbuRMsLnKdi0"]
Date: Sep 17, 2026
packages/core/src/session/execution/local.ts:179 waited for the durable phase update before coordinator.interrupt(...) at lines 180-197; a wake during that gap set pendingWake=true in packages/core/src/session/run-coordinator.ts:87-92, but interruption then unconditionally cleared it at lines 108-109, preventing the successor at lines 117-123. A concurrent explicit resume could also join the not-yet-stopping entry and receive its interrupted result instead of retrying. Review verdict: DO-NOT-MERGE.cancelling write, issue a wake while the coordinator entry is still running, release cancellation setup, and require exactly one successor to run after cleanup.SessionRunCoordinator: mark the entry stopping first, preserve any already coalesced wake, run a new pre-interrupt effect that durably writes cancelling, then interrupt the owner and perform cleanup. This also causes concurrent run() calls to wait and retry rather than join the soon-to-be-interrupted owner.packages/core/src/session/run-coordinator.ts and packages/core/src/session/execution/local.ts.stopping. The fail-closed path was implemented in packages/core/src/session/run-coordinator.ts, with tests added in packages/core/test/session-run-coordinator.test.ts.tsgo --noEmit succeeded; one targeted test run reported 4 pass, 15 filtered out, 0 fail, 9 expect() calls across 1 file in 243.00ms; another reported 4 pass, 9 filtered out, 0 fail, 12 expect() calls across 1 file in 771.00ms.packages/core/src/session/execution/local.ts:40-73: the execution claim commits before registration in activeClaims, while cleanup only wraps the later race at lines 90-125. An interrupt during commit-to-registration can take the fallback at lines 217-223, leaving a durable ready claim with no owner or heartbeat, blocking successors until lease expiry and potentially causing false recovery. Required fix: make acquisition, registration, and cleanup ownership one uninterruptible handoff and add a deterministic commit/registration-boundary regression.packages/core/src/session/recovery.ts:72-79.packages/core/src/session/recovery.ts:547-552 and packages/core/src/session/sql.ts:253.packages/core/src/session/recovery.ts:169-177 becomes a defect, while the outer handler at lines 316-323 only logs it and leaves recovery_error unset. With oldest-100 scanning, a 30-second lease, and 10-second repeats, 300 older corrupt rows can continually recycle and starve later valid claims. Required fix: quarantine the exact live claim under its execution and owner fence.DO-NOT-MERGE.interrupts active execution and clears its pending wake in packages/core/test/session-run-coordinator.test.ts:218 contradicted the corrected invariant. Planned change: a wake registered before or during interruption must survive, and the test should assert exactly one successor rather than runs=1 with no active successor.