Dashboard › opencode › Distillation
e5d20977-7ea0-41a8-a436-b19c704c6d16["lore_tm_v1_zw4wN5DMeeocz_XPVmBtekFG87HGrdS5pvS_MLxmoZc","lore_tm_v1_4S4s8f5xyzQCzvlKlb4hUXzpGZmfUrvNsB5btqzVUXQ","lore_tm_v1_Eor23uk4gTAm6Pm2Its2NlBpWFvgSC3U3sQqQ4KEczs","lore_tm_v1_QaDFy9JNLOEp_Eubj1SHSWkh5zH9zzcF46M25kFoDdQ","lore_tm_v1_I5C1-LKzU7Jt5IgQO_BRiRct2RZCLnD1yBsXZvmBFbU","lore_tm_v1_10yO2-ccfv6r7U_sEzbopmsuwnPKeS9DI6_Ym4PI2uE","lore_tm_v1_BT7xD3PLTlUWKuy7oCglpkrjVZ98WkXDub34EZhFTvQ","lore_tm_v1_e40iDqBslASbsUm4wKUT3BnX8-dCNAoefstoOsikV2c","lore_tm_v1_wIcLKClVM1HVTBfcA9vNRLk5Pm-pNXBzqRRmONOaH0s","lore_tm_v1_q0J4ztWiD09IRhhUHsdfUplulwQ0Qo8qe3pGXpzXBsk","lore_tm_v1_jjBuCnOB9Z4MlUQ1utTLME_1q14xvTI9sW5TAXDc_o8","lore_tm_v1_g8mhe4kR9RktLi6t1EwpFi8RWh1emIEX5xBtT-IEpZ4","lore_tm_v1_iqs7_j_1HvvaExNhzXqZ0k45F0L9mduepXmQTiIB4AQ","lore_tm_v1_On5V-G0by26hcOzSA1v3xFwIkA8_T070EPUGOz9q88c"]
Date: Sep 17, 2026
/tmp/opencode/session-recovery-v22-review; prohibited editing, running tests/builds/services, mutating VCS/index/refs, and using recall.ab9408c81cc9916177641ae8e9f08624fc27b5b9; patch /tmp/opencode/session-recovery-final-v22.patch with SHA-256 5af96209cef23e735f09dbf2f4b2f5b0f51b208ece9e5b325e4e217b46003643; SEA /home/byk/Code/opencode/packages/opencode/dist/server/opencode-server with SHA-256 10a3698a5e3b009f811a1b27eefab9e1083b560e24efee5f537f003d7edd7384; exactly 34 changed paths.file:line and severity MUST-FIX or CONCERN, and the final response to end exactly MERGE or DO-NOT-MERGE.Step.Failed with unresolved local tools must preserve the provider failure; durable unknown-tool outcomes must publish only after tool/finalizer join; the last tool must atomically set cancelled; the exact claim must be cleared; duplicate Step.Interrupted/recovery must not be emitted.Step.Interrupted publication failure must roll back tool settlement and cancellation transition, leave the exact claim in cancelling, and block a successor.f14a9b18-8207-487e-a3d3-227e629ba9ad.433468 bytes, mtime 1789636732; SEA metadata: 157879104 bytes, mtime 1789636682.ab9408c81cc9916177641ae8e9f08624fc27b5b9, another observed commit/ref 2e9407768d1401a25b69febb36657638a779053a, and merge-base/ancestor check result ancestor_exit=0.apply_cached_exit=0, reverse_worktree_exit=0, diff_check_exit=0, and exactly 34 paths.packages/client/src/generated/types.ts, packages/core/schema.json, packages/core/src/database/migration.gen.ts, packages/core/src/database/migration/20260914170650_session-recovery.ts, packages/core/src/database/schema.gen.ts, packages/core/src/session.ts, packages/core/src/session/compaction.ts, packages/core/src/session/context-epoch.ts, packages/core/src/session/execution/local.ts, packages/core/src/session/input.ts, packages/core/src/session/message-updater.ts, packages/core/src/session/projector.ts, packages/core/src/session/recovery.ts, packages/core/src/session/run-coordinator.ts, packages/core/src/session/runner/index.ts, packages/core/src/session/runner/llm.ts, packages/core/src/session/runner/publish-llm-event.ts, packages/core/src/session/sql.ts, packages/core/test/database-migration.test.ts, packages/core/test/session-execution-local.test.ts, packages/core/test/session-projector.test.ts, packages/core/test/session-prompt.test.ts, packages/core/test/session-run-coordinator.test.ts, packages/core/test/session-runner-recorded.test.ts, packages/core/test/session-runner-tool-events.test.ts, packages/core/test/session-runner.test.ts, packages/opencode/src/server/routes/instance/httpapi/server.ts, packages/schema/src/session-event.ts, packages/schema/test/event-manifest.test.ts, packages/sdk/js/src/v2/gen/types.gen.ts, packages/sdk/openapi.json, packages/server/src/routes.ts, packages/core/src/session/execution/claim.ts, and packages/core/src/session/recovery-id.ts./tmp/opencode/session-recovery-v22-review/AGENTS.md, packages/opencode/AGENTS.md, packages/schema/AGENTS.md, and packages/opencode/src/server/routes/instance/httpapi/AGENTS.md, alongside package-specific AGENTS files under packages/app, packages/ui, packages/session-ui, packages/effect-drizzle-sqlite, packages/llm, packages/codemode, packages/stats, packages/desktop, packages/core/src/tool, and opencode test/session subtrees.bun typecheck from package directories such as packages/opencode; never run tsc directly.sdk-next composes Client, Core, and Server.import { foo as bar } and renamed imports such as resolve as pathResolve.import * as Foo and import type * as Foo; namespace-style usage should import a module’s own exported namespace by name, such as import { Project } from "@opencode-ai/core/project" and then use Project.ID.HttpApi, run bun run generate from packages/client; do not directly edit src/generated or src/generated-effect. Legacy JavaScript SDK regeneration uses ./packages/sdk/js/script/build.ts.do-not-run-tests-from-root; they must run from package directories such as packages/opencode.dev; local main may not exist, so use dev or origin/dev for diffs; branch names use at most three hyphen-separated words and no slash/type prefix.try/catch and any; prefer Bun APIs, inferred types, functional array methods, const, ternaries/early returns, and no unnecessary else or destructuring.Effect.gen, Effect.fn/Effect.fnUntraced, Effect.callback, and Effect.void; Effect.fork and Effect.forkDaemon do not exist in Effect v4 beta, so use Effect.forkIn(scope).export namespace Foo; use flat top-level exports plus a self-reexport such as export * as Foo from "./foo" or export * as Foo from "." in an index.ts. Multi-sibling directories should not add barrel index.ts files.SessionExecution is process-global and Session-ID based; SessionRunner, model resolution, tool registry, permissions, and filesystem are Location-scoped; preserve one explicit llm.stream(request) call per provider turn; do not bridge through legacy SessionPrompt.loop(...).queue input stays pending until the Session would otherwise idle; promoting new user input resets the selected agent’s provider-turn allowance, with a steer batch resetting it once.@opencode-ai/schema owns browser-safe wire/storage contracts, not runtime behavior or services; dependency direction is @opencode-ai/schema <- @opencode-ai/protocol <- @opencode-ai/server; current contracts are unversioned and legacy contracts use V1, not permanent V2 naming.current, shared transitional, or V1-only; V1 emission alone does not justify Protocol/SDK Next inclusion; message.updated and message.part.* remain out of current Protocol/SDK Next absent a documented current-client need; preserve one canonical event definition.optional(...) helper; current public contracts avoid Schema.Any, using Schema.Json for JSON-serializable values and Schema.Unknown for opaque values; public identifiers/brands must be stable and unique.HttpApiBuilder.group(...); raw declared routes use handleRaw(...); raw HttpRouter.use(...) is reserved for routes outside the declared API; stable services/layers must not be rebuilt with Effect.provide(SomeLayer) inside request handlers.6086 insertions(+), 386 deletions(-); largest changes included packages/core/test/session-projector.test.ts (2925 added lines), packages/core/test/session-runner.test.ts (1290 added lines), packages/core/src/session/input.ts (422 added lines), and packages/core/src/session/runner/llm.ts (393 added lines).1538 insertions(+), 92 deletions(-): packages/client/src/generated/types.ts, packages/core/schema.json, packages/core/src/database/migration.gen.ts, packages/core/src/database/schema.gen.ts, packages/sdk/js/src/v2/gen/types.gen.ts, and packages/sdk/openapi.json.packages/core/src/session/execution/claim.ts defines SessionExecutionClaim with Claim { sessionID, executionID, ownerID }, a Lost error, and exact-claim lease-fenced operations update, renew, settleCancellation, clear, and transaction; claim matching requires session ID, execution ID, owner ID, and expires_at > now.packages/core/src/session/execution/claim.ts, update(...) only permits phase: "cancelled" from "cancelling"; "cancelling" cannot overwrite "cancelled"; other updates cannot operate in "cancelling" or "cancelled". settleCancellation(...) likewise requires phase "cancelling", and clear(...) deletes only the exact unexpired claim.packages/core/src/session/execution/claim.ts documents wall-clock leases: SESSION_EXECUTION_LEASE_MS must exceed maximum deployment clock skew plus one renewal interval; execution IDs fence a node immediately after takeover, and expired claims cannot renew themselves.packages/core/src/session/recovery-id.ts defines deterministic recovery IDs: message(executionID, assistantMessageID?) returns the supplied assistant message ID or SessionMessage.ID.make(\msg_recovery_${executionID}`); continuation(executionID)returnsSessionMessage.ID.make(`msg_recovery_continue_${executionID}`)`.