Skip to content

Latest commit

 

History

History
60 lines (49 loc) · 19.3 KB

File metadata and controls

60 lines (49 loc) · 19.3 KB

Production Go-Live Checklist

Last updated: 2026-06-28

Canonical Scope

  • Work in C:\Users\zerop\Development\opencode-source.
  • Treat sibling C:\Users\zerop\Development\OpenGoal as 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.

Go-Live Closeout Defects

None currently recorded.

Recently Closed

  • 2026-06-28: Session route sync failure visibility is closed. DirectoryDataProvider no longer swallows every sync.session.sync(id) failure before the session page can surface the failed load; route sync, session-page sync, and titlebar tab metadata sync now share syncSessionOrIgnoreNotFound(...), where only a 404 missing-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/app typecheck, the full packages/app unit suite (791 pass, 0 fail), OPENCODE_CHANNEL=prod packages/app production build, and OPENCODE_CHANNEL=prod packages/desktop Windows 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/app typecheck, the full packages/app unit suite (788 pass, 0 fail), OPENCODE_CHANNEL=prod packages/app production build, and OPENCODE_CHANNEL=prod packages/desktop Windows package rebuild. Fresh installer SHA256: 68BBEA66943399BBA2AD5D6B5743B263B776DEAFAA147D75A581612EE417517F. Packaged prod smoke launched packages/desktop/dist/win-unpacked/OpenCode.exe with isolated onboarding state, debug port 9360, and sidecar port 53160; seeded seven local-only folders in opencode.global.dat and reloaded Home. The real Electron renderer loaded oc://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 full packages/app unit suite (787 pass, 0 fail), packages/app typecheck, and packages/app production build.
  • 2026-06-28: GoalPanel corrupt-state recovery copy is closed. The corrupt goal-state panel already exposes an in-panel Reset and re-read control; locale hints no longer tell operators to leave the panel and run /goal clear in 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 full packages/app unit suite (786 pass, 0 fail), packages/app typecheck, and packages/app production 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_control arguments through goalControlQuotedArg(...), and the AutoGoal bridge splitGoalCommand(...) decodes escaped quotes and backslashes inside quoted spans. Verified with the full packages/app unit suite (785 pass, 0 fail), packages/autogoal npm test (1427 pass, 0 fail, including typecheck/build), packages/app typecheck, packages/app production build, and packages/desktop Windows package rebuild. Fresh installer SHA256: 6FD5BE532C49580AAFDEC7BA151E730F738C0A150CA6F19221F818ADC3D762D5. Packaged startup smoke launched packages/desktop/dist/win-unpacked/OpenCode Dev.exe with isolated onboarding state, debug port 9355, and sidecar port 53155; the packaged renderer loaded oc://renderer/index.html with title OpenCode, then the owned PID and both ports were stopped and the isolated temp profile was removed.
  • 2026-06-28: Home Open Goal owner-session routing is closed. Active and paused goals loaded from .opencode/.goal-state.json now preserve a route-safe metadata.sessionId, and the Home Open Goal action 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/app typecheck, packages/app production build, the full app unit suite (784 pass, 0 fail), and packages/desktop Windows package rebuild. Fresh installer SHA256: 80FC38B440A628C534DEEDBAD91336782F1032BDF8A52BCD4DD57D71D2A38554. Packaged startup smoke launched packages/desktop/dist/win-unpacked/OpenCode Dev.exe with isolated onboarding state, debug port 9354, and sidecar port 53154; the packaged renderer loaded oc://renderer/index.html with title OpenCode, then the owned PID and both ports were stopped.
  • 2026-06-28: GoalPanel history Reuse goal prompt 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 deterministic set ... command, and pauses the reused goal if prompt delivery fails instead of leaving a false active run. Verified with focused goal-panel tests (149 pass, 0 fail), packages/app typecheck, packages/app production build, the full app unit suite (783 pass, 0 fail), and packages/desktop Windows package rebuild. Fresh installer SHA256: 173F0AB33C199F5916130FEAA984991D124A2C21F62B3D2F1981CFD0635ACB3E. Post-build packaged startup smoke launched packages/desktop/dist/win-unpacked/OpenCode Dev.exe with isolated onboarding state, debug port 9353, and sidecar port 53153; the packaged renderer loaded oc://renderer/index.html with title OpenCode, 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/Session fallback through titlebarSessionTabTitle(...). Verified with focused titlebar-pure and titlebar suites, packages/app typecheck, packages/app production build, the full app unit suite (782 pass, 0 fail), and packages/desktop Windows package rebuild. Fresh installer SHA256: 905F200D95047DBAE63C1B1334DDC8246E1EAEBBDF1E1AA84F11D4E4DD9326B5. Post-push packaged startup smoke launched packages/desktop/dist/win-unpacked/OpenCode Dev.exe with isolated onboarding state, debug port 9352, and sidecar port 53152; the packaged renderer loaded oc://renderer/index.html with title OpenCode, 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:win in packages/desktop completed, cleaned stale dist, rebuilt dist/win-unpacked, generated opencode-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 swallowing session.abort failures. 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 silent session.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/app typecheck, packages/app production 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.abort request succeeds, and failed aborts now show a visible Failed to stop session toast with the backend error while leaving the UI state intact. Local queued prompt cancellation remains immediate. Verified with focused packages/app/src/components/prompt-input/submit.test.ts, i18n parity, packages/app typecheck, packages/app production 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 renders goal-action-editor-runtime-pin-status with localized status copy in en, zh, and zht. Removed the excluded diagnostic packages/app/src/pages/session/__batch4-probe.ts artifact from app source. Verified with focused goal-panel-pure and goal-panel suites, packages/app typecheck, full packages/app production 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/desktop with bun run package:win; fresh installer SHA256: 646AC6DC37FD2B0C8E2FE7B9892A87E0662F981C2408A98F48AF3E53A1FA522C. Launched dist/win-unpacked/OpenCode Dev.exe with OPENCODE_TEST_ONBOARDING=1, debug port 9346, and sidecar port 53146; seeded two disposable local-only folders under .hermes/runtime-logs/packaged-project-list-smoke-{a,b}-20260628-114837 through the packaged Electron opencode.global.dat server store; reloaded Home, waited through a server-sync grace period, and reloaded Home again. The packaged DOM kept both home-project-row entries visible after each pass, and the persisted store still contained both local folders. Backend discovery added the current opencode-source project 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 /project table 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 by packages/app/src/context/layout.test.ts, full packages/app typecheck, 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.exe with OPENCODE_TEST_ONBOARDING=1, debug port 9345, and sidecar port 53145; created disposable session ses_0f2e26d21ffeK6pS7Zf2HvU1H7 under .hermes/runtime-logs/packaged-handoff-smoke-project; seeded active goal Packaged handoff smoke goal; opened the project through the packaged app's external-link confirmation dialog; clicked Handoff, entered handoff note from packaged smoke, and verified .goal-handoff.json contained the active state, note, and session id; cleared the live goal through Stop plus Confirm stop and verified the panel entered claim mode; clicked Claim in new session and verified .goal-handoff.json was consumed, .goal-state.json returned to active, 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.exe with OPENCODE_TEST_ONBOARDING=1, debug port 9344, and sidecar port 53144; created disposable session ses_0f2e947cdffeCYBHo7jW5TEha0 under .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.json transition to paused; clicked Stop plus Confirm stop and observed .goal-state.json transition to cleared. 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/desktop package scripts run scripts/clean-dist.ts before electron-builder, removing stale generated release metadata such as an old dist/latest.yml before a new installer is produced. Rebuilt bun run package:win after the fix; the fresh dist contains 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 build passed in packages/desktop; bun run preview launched the actual Electron app, started the sidecar, exposed DevTools on 127.0.0.1:9222, and loaded oc://renderer/index.html with title OpenCode. Live DOM inspection proved the Project Window and opencode-source session surface rendered, including the Goal tab with goal-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.md contracts instead of a missing ARCHITECTURE.md, the GUI integration contract now describes the unified monorepo Desktop file-read plus goal_control bridge path, and goal_get_state server/tool prose no longer tells Desktop consumers to poll the tool path. node --test test/docs-drift.test.mjs test/server-dials.test.mjs passed.
  • 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 as stale-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-effort session.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.prompt is 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 remove can 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 postMessage startup 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 skip now uses atomic chain advancement through the async command dispatcher path, keeping .goal-chain.json and 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.metadata now declares runtime chain metadata through stepMarkerAt, aligning generated public types with canonical GoalState.metadata and marker-cutoff continuation behavior.
  • 2026-06-28: CLI /goal chain skip parity closed. Standalone CLI normal-command execution now awaits dispatchGoalCommandStructuredAsync(...), so CLI chain skip shares 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-state instead of no-goal or generic invalid values.
  • 2026-06-28: Plugin/server and CLI chain mutations now serialize every mutating chain subcommand through the async structured dispatcher lock boundary, not only chain 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/control route.
  • 2026-06-28: AutoGoal runtime non-chain corrupt-state shim sweep is closed. transitionGoal(...) and restartGoal(...) now return the exact state they wrote, server.ts no longer imports or calls the null-collapsing readGoalState(...) 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.

Not Release Blockers

  • A broad home.tsx / titlebar.tsx pure-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 OpenGoal path is workspace noise, not a product defect, as long as all active changes land in opencode-source.

Closeout Order

  1. Do not expand to broader monorepo audit findings without a fresh product-facing defect.
  2. Commit/release packaging can proceed once the dirty-tree scope is reviewed.