Last updated: 2026-06-28
- Work in
C:\Users\zerop\Development\opencode-source. - Treat sibling
C:\Users\zerop\Development\OpenGoalas retired workspace context unless a task explicitly asks for historical comparison. - Production readiness means the operator-facing Desktop GUI, AutoGoal runtime, docs, and release proof line up in the real monorepo.
None currently recorded.
- 2026-06-28: Session route sync failure visibility is closed.
DirectoryDataProviderno longer swallows everysync.session.sync(id)failure before the session page can surface the failed load; route sync, session-page sync, and titlebar tab metadata sync now sharesyncSessionOrIgnoreNotFound(...), where only a404missing-session response is treated as benign. Non-404 route/session failures propagate, while the titlebar fallback stays clickable and labeled but logs the metadata-sync failure for diagnosis. Verified with focused session-sync/titlebar/session helper tests (41 pass, 0 fail), a targeted silent-catch scan over app session/control surfaces,packages/apptypecheck, the fullpackages/appunit suite (791 pass, 0 fail),OPENCODE_CHANNEL=prod packages/appproduction build, andOPENCODE_CHANNEL=prod packages/desktopWindows package rebuild. Fresh installer SHA256:43197020664D678B284210C1343FBFBAB055AF22F163383D4C73E859EEF0E955. - 2026-06-28: Production-channel Home project-list persistence is closed. The prod build defaults to the legacy Home path, which previously rendered only
sync.data.project.slice(0, 5)from backend-discovered recent projects; explicitly opened local folders could be persisted but invisible, and the visible set changed with backend recency. LegacyHome now renders the same persisted opened-project plus backend metadata merge used by the redesigned Home path, with no five-item cap and with local-only folders visible before discovery metadata exists. Verified with focused Home/layout tests (58 pass, 0 fail),packages/apptypecheck, the fullpackages/appunit suite (788 pass, 0 fail),OPENCODE_CHANNEL=prod packages/appproduction build, andOPENCODE_CHANNEL=prod packages/desktopWindows package rebuild. Fresh installer SHA256:68BBEA66943399BBA2AD5D6B5743B263B776DEAFAA147D75A581612EE417517F. Packaged prod smoke launchedpackages/desktop/dist/win-unpacked/OpenCode.exewith isolated onboarding state, debug port9360, and sidecar port53160; seeded seven local-only folders inopencode.global.datand reloaded Home. The real Electron renderer loadedoc://renderer/index.html, showed all seven seeded project names, and preserved all seven persisted project rows; the owned process was stopped and both ports were closed. - 2026-06-28: GoalPanel control hint copy is closed. The visible GoalPanel hint no longer presents chat slash commands as the primary control path; locale bundles now match the Desktop GUI contract by telling operators to open a session for panel controls, with slash commands only as an alternate path. The i18n parity suite rejects a return to
Control from chat:for this GoalPanel hint. Verified with focused i18n parity (5 pass, 0 fail), the fullpackages/appunit suite (787 pass, 0 fail),packages/apptypecheck, andpackages/appproduction build. - 2026-06-28: GoalPanel corrupt-state recovery copy is closed. The corrupt goal-state panel already exposes an in-panel
Reset and re-readcontrol; locale hints no longer tell operators to leave the panel and run/goal clearin chat. The i18n parity suite now rejects stale corrupt-state recovery hints that point at chat commands instead of the wired panel control. Verified with focused i18n parity (4 pass, 0 fail), the fullpackages/appunit suite (786 pass, 0 fail),packages/apptypecheck, andpackages/appproduction build. - 2026-06-28: GoalPanel command argument quoting fidelity is closed. GoalPanel Start, Steer, and Handoff no longer preserve bridge stability by deleting operator-entered double quotes; the UI now sends deterministic
goal_controlarguments throughgoalControlQuotedArg(...), and the AutoGoal bridgesplitGoalCommand(...)decodes escaped quotes and backslashes inside quoted spans. Verified with the fullpackages/appunit suite (785 pass, 0 fail),packages/autogoal npm test(1427 pass, 0 fail, including typecheck/build),packages/apptypecheck,packages/appproduction build, andpackages/desktopWindows package rebuild. Fresh installer SHA256:6FD5BE532C49580AAFDEC7BA151E730F738C0A150CA6F19221F818ADC3D762D5. Packaged startup smoke launchedpackages/desktop/dist/win-unpacked/OpenCode Dev.exewith isolated onboarding state, debug port9355, and sidecar port53155; the packaged renderer loadedoc://renderer/index.htmlwith titleOpenCode, then the owned PID and both ports were stopped and the isolated temp profile was removed. - 2026-06-28: Home
Open Goalowner-session routing is closed. Active and paused goals loaded from.opencode/.goal-state.jsonnow preserve a route-safemetadata.sessionId, and the HomeOpen Goalaction first opens the exact loaded owner session, then direct-routes to that owner session when it is outside the limited recent-session list, and only falls back to directory project selection when no trustworthy session id exists. Verified with focused Home tests (36 pass, 0 fail),packages/apptypecheck,packages/appproduction build, the full app unit suite (784 pass, 0 fail), andpackages/desktopWindows package rebuild. Fresh installer SHA256:80FC38B440A628C534DEEDBAD91336782F1032BDF8A52BCD4DD57D71D2A38554. Packaged startup smoke launchedpackages/desktop/dist/win-unpacked/OpenCode Dev.exewith isolated onboarding state, debug port9354, and sidecar port53154; the packaged renderer loadedoc://renderer/index.htmlwith titleOpenCode, then the owned PID and both ports were stopped. - 2026-06-28: GoalPanel history
Reuse goalprompt admission is closed. Reusing an archived run no longer only writes a fresh active goal state; the handler now follows the guarded Start flow, admits the model turn after the deterministicset ...command, and pauses the reused goal if prompt delivery fails instead of leaving a false active run. Verified with focusedgoal-paneltests (149 pass, 0 fail),packages/apptypecheck,packages/appproduction build, the full app unit suite (783 pass, 0 fail), andpackages/desktopWindows package rebuild. Fresh installer SHA256:173F0AB33C199F5916130FEAA984991D124A2C21F62B3D2F1981CFD0635ACB3E. Post-build packaged startup smoke launchedpackages/desktop/dist/win-unpacked/OpenCode Dev.exewith isolated onboarding state, debug port9353, and sidecar port53153; the packaged renderer loadedoc://renderer/index.htmlwith titleOpenCode, then the owned PID and ports were stopped. - 2026-06-28: Titlebar session-tab metadata fallback is closed. Session tabs no longer render as a mostly blank strip when session metadata sync fails or the session record is not cached; the tab body remains clickable, keeps the close affordance, shows the project avatar fallback, and displays a stable session title/session-id/
Sessionfallback throughtitlebarSessionTabTitle(...). Verified with focusedtitlebar-pureandtitlebarsuites,packages/apptypecheck,packages/appproduction build, the full app unit suite (782 pass, 0 fail), andpackages/desktopWindows package rebuild. Fresh installer SHA256:905F200D95047DBAE63C1B1334DDC8246E1EAEBBDF1E1AA84F11D4E4DD9326B5. Post-push packaged startup smoke launchedpackages/desktop/dist/win-unpacked/OpenCode Dev.exewith isolated onboarding state, debug port9352, and sidecar port53152; the packaged renderer loadedoc://renderer/index.htmlwith titleOpenCode, then the owned PID and ports were stopped. - 2026-06-28: Windows Desktop package was rebuilt after the abort-control renderer fixes.
bun run package:wininpackages/desktopcompleted, cleaned staledist, rebuiltdist/win-unpacked, generatedopencode-desktop-win-x64.exe, and generated the blockmap. Fresh installer SHA256:60E3592EC8722330BF242D60A41D80AEF20B6273CE5F2292A920095076FA28D5. - 2026-06-28: Session abort-control sweep is closed. PromptInput Stop, session revert/restore, and command-palette Undo now share
abortWorkingSessionTurn(...)instead of swallowingsession.abortfailures. Abort failure blocks the follow-on history mutation, preserves/rolls back local UI state through the existing handlers, and surfaces the backend error. A focused scan now leaves no silentsession.abort(...).catch(() => {})in the app session/control surfaces; the remaining silent catch is titlebar session-label sync fallback, not an abort control. Verified with focused helper/prompt tests,packages/apptypecheck,packages/appproduction build, and the full app unit suite (780 pass, 0 fail). - 2026-06-28: PromptInput composer Stop/abort failure visibility is closed. The normal chat composer no longer clears local todo/followup stopped UI state before the server-side
session.abortrequest succeeds, and failed aborts now show a visibleFailed to stop sessiontoast with the backend error while leaving the UI state intact. Local queued prompt cancellation remains immediate. Verified with focusedpackages/app/src/components/prompt-input/submit.test.ts, i18n parity,packages/apptypecheck,packages/appproduction build, and the full app unit suite (777 pass, 0 fail). - 2026-06-28: GoalPanel Action Editor saved runtime-pin status is closed. The editor now keeps saved agent/model/skill pins without making unavailable pins look active:
runtimePinAvailability(...)flags saved pins missing from the current runtime lists, agent/model selects expose warning titles, and the routing panel rendersgoal-action-editor-runtime-pin-statuswith localized status copy inen,zh, andzht. Removed the excluded diagnosticpackages/app/src/pages/session/__batch4-probe.tsartifact from app source. Verified with focusedgoal-panel-pureandgoal-panelsuites,packages/apptypecheck, fullpackages/appproduction build, and the full app unit suite (775 pass, 0 fail). - 2026-06-28: Packaged Windows Home project-list persistence smoke is closed. Rebuilt
packages/desktopwithbun run package:win; fresh installer SHA256:646AC6DC37FD2B0C8E2FE7B9892A87E0662F981C2408A98F48AF3E53A1FA522C. Launcheddist/win-unpacked/OpenCode Dev.exewithOPENCODE_TEST_ONBOARDING=1, debug port9346, and sidecar port53146; seeded two disposable local-only folders under.hermes/runtime-logs/packaged-project-list-smoke-{a,b}-20260628-114837through the packaged Electronopencode.global.datserverstore; reloaded Home, waited through a server-sync grace period, and reloaded Home again. The packaged DOM kept bothhome-project-rowentries visible after each pass, and the persisted store still contained both local folders. Backend discovery added the currentopencode-sourceproject on the second reload, but it did not prune the local-only rows. Stopped the owned packaged process and confirmed both debug and sidecar ports closed. - 2026-06-28: Home project-list local-folder pruning is closed. The Desktop app no longer treats the backend
/projecttable as deletion authority for operator-opened local projects; explicitly added folders remain visible even before backend metadata/discovery has created a project row, and backend metadata is merged later when available. Covered bypackages/app/src/context/layout.test.ts, fullpackages/apptypecheck, full app unit suite, and app production build. - 2026-06-28: Packaged Windows handoff/receive smoke is closed on a disposable workspace. Launched
dist/win-unpacked/OpenCode Dev.exewithOPENCODE_TEST_ONBOARDING=1, debug port9345, and sidecar port53145; created disposable sessionses_0f2e26d21ffeK6pS7Zf2HvU1H7under.hermes/runtime-logs/packaged-handoff-smoke-project; seeded active goalPackaged handoff smoke goal; opened the project through the packaged app's external-link confirmation dialog; clicked Handoff, enteredhandoff note from packaged smoke, and verified.goal-handoff.jsoncontained the active state, note, and session id; cleared the live goal through Stop plus Confirm stop and verified the panel enteredclaimmode; clicked Claim in new session and verified.goal-handoff.jsonwas consumed,.goal-state.jsonreturned toactive, and the packaged renderer showed a fresh-session structured handoff prompt containing the repository, goal id, verification command, operator note, and read-state instructions. Stopped the owned packaged process and confirmed both debug and sidecar ports closed. - 2026-06-28: Packaged Windows operator smoke is closed on a disposable workspace. Launched
dist/win-unpacked/OpenCode Dev.exewithOPENCODE_TEST_ONBOARDING=1, debug port9344, and sidecar port53144; created disposable sessionses_0f2e947cdffeCYBHo7jW5TEha0under.hermes/runtime-logs/packaged-operator-smoke-project; seeded an active smoke goal through/experimental/goal/control/goal_control; opened the project through the packaged app's external-link confirmation dialog; verified GoalPanel rendered enabled Pause/Stop controls; clicked Pause and observed.goal-state.jsontransition topaused; clicked Stop plus Confirm stop and observed.goal-state.jsontransition tocleared. Stopped the owned packaged process and confirmed both debug and sidecar ports closed. - 2026-06-28: Windows packaging output is now clean-build deterministic.
packages/desktoppackage scripts runscripts/clean-dist.tsbeforeelectron-builder, removing stale generated release metadata such as an olddist/latest.ymlbefore a new installer is produced. Rebuiltbun run package:winafter the fix; the freshdistcontains the rebuilt installer, blockmap, builder debug file, and unpacked app only. New installer SHA256:ABD364554CE88CD61DB4C8F3831619A5F9CC580E0297AB3DAD8F7940B5680572. - 2026-06-28: Final real Desktop/Electron proof is closed.
bun run typecheck && bun run buildpassed inpackages/desktop;bun run previewlaunched the actual Electron app, started the sidecar, exposed DevTools on127.0.0.1:9222, and loadedoc://renderer/index.htmlwith titleOpenCode. Live DOM inspection proved the Project Window andopencode-sourcesession surface rendered, including the Goal tab withgoal-chain-builder,goal-status-card,goal-history-panel, method library controls, and action controls. I did not rewrite the live workspace into an active chain just to force Pause/Resume in the GUI; those sequencing paths are covered by the focused GoalPanel and AutoGoal tests listed below. - 2026-06-28: Docs/spec reconciliation is closed. Historical work orders now point at the current
docs/SPEC.md/docs/gui-integration.mdcontracts instead of a missingARCHITECTURE.md, the GUI integration contract now describes the unified monorepo Desktop file-read plusgoal_controlbridge path, andgoal_get_stateserver/tool prose no longer tells Desktop consumers to poll the tool path.node --test test/docs-drift.test.mjs test/server-dials.test.mjspassed. - 2026-06-28: Chain-runner Stop/Pause late-continuation race is closed.
deliverContinuation(...)now rechecks the active goal after successful prompt admission, treats active-goal id/status drift asstale-suppressed, avoids poisoning idempotency on stale success, and calls a stale-delivery abort hook. Chain-advance and nudge automation both wire that hook to best-effortsession.abort(...). - 2026-06-28: GoalPanel start/resume/restart/steer prompt admission is now guarded outside the automated continuation dispatcher. GUI prompts capture a refreshed active goal id plus a local control epoch; if Stop/Pause/Fresh or another control wins while
session.promptis in flight, late prompt admission is aborted and no fallback pause is issued. - 2026-06-28: Desktop bridge live-chain removal now matches the canonical runner invariant. Bridge
chain removecan remove only pending future steps from a live chain; completed/current live steps are rejected without rewriting chain history or active goal metadata. - 2026-06-28: Desktop shell hardening was verified current. External link entry points gate through HTTPS-only URL validation, sidecar
postMessagestartup waits for listener/timeout wiring, updater subscriptions replace the prior renderer listener, and focused Desktop typecheck/build/tests passed with existing warnings only. - 2026-06-28: GoalPanel terminal chain rows no longer route through the live pending-row removal action. Terminal-history rows now emit an explicit terminal cleanup action, and stale clicks dismiss the terminal affordance if a live goal appears between render and click.
- 2026-06-28: Plugin/server
/goal chain skipnow uses atomic chain advancement through the async command dispatcher path, keeping.goal-chain.jsonand goal-state metadata sequenced together for GUI, tool, and hook execution. - 2026-06-28: CLI/watch and related operator surfaces were verified to display chain progress as one-based while preserving zero-based runtime metadata. Covered by watch, control-center, render pane, goal blocks, and sidebar suites.
- 2026-06-28: Bridge
GoalControlState.metadatanow declares runtime chain metadata throughstepMarkerAt, aligning generated public types with canonicalGoalState.metadataand marker-cutoff continuation behavior. - 2026-06-28: CLI
/goal chain skipparity closed. Standalone CLI normal-command execution now awaitsdispatchGoalCommandStructuredAsync(...), so CLIchain skipshares the atomic chain advancement path used by plugin/server tools and hooks. - 2026-06-28: Chain-control corrupt-state results now preserve typed primitive failure reasons through the command envelope. Corrupt chain/current-state failures from skip/reset/add/move/remove now surface as
corrupt-stateinstead ofno-goalor generic invalid values. - 2026-06-28: Plugin/server and CLI chain mutations now serialize every mutating
chainsubcommand through the async structured dispatcher lock boundary, not onlychain skip. - 2026-06-28: The Desktop HTTP bridge entry point
runGoalControlStateFile(...)now runs under the shared runtime state lock, covering Stop/Clear plus chain start/add/move/remove controls on the primary/experimental/goal/controlroute. - 2026-06-28: AutoGoal runtime non-chain corrupt-state shim sweep is closed.
transitionGoal(...)andrestartGoal(...)now return the exact state they wrote,server.tsno longer imports or calls the null-collapsingreadGoalState(...)shim, command clear/resume use primitive-returned state, and auto-loop/session-error fresh checks use tri-state readers when a live disk read is required.
- A broad
home.tsx/titlebar.tsxpure-function refactor is overkill for go-live unless a real behavior defect appears. - String-match tests can be replaced opportunistically, but they are not the production-readiness center unless they mask a live runtime defect.
- UI polish punch-list items are audit/proof work unless Electron testing shows actual workflow breakage.
- The retired
OpenGoalpath is workspace noise, not a product defect, as long as all active changes land inopencode-source.
- Do not expand to broader monorepo audit findings without a fresh product-facing defect.
- Commit/release packaging can proceed once the dirty-tree scope is reviewed.