# Task: Fix Makelore updater diagnostics and release checks ## Identity - Task ID: 20260813-makelore-updater-client-7d3a9c - Mode: Feature - Branch: main - Worktree: D:\Datas\OthersProjects\makelore - Base commit: a03043d048826609cb4f8cb7d782bde93e0e77f4 - Owner: codex - Status: Ready for integration ## Scope - Correlate the packaged Windows updater failure with the Works Square stable feed and current platform/architecture resolution. - Normalize the known missing stable-feed failure into a concise actionable renderer-facing message while retaining raw diagnostic logging. - Add focused updater regression coverage without changing download, install, channel, or credential ownership behavior. - Remove the duplicate renderer presentation shown by the installed `v1.0.0` settings screenshot and keep raw stack diagnostics out of the ordinary user surface while retaining them in Main-process logs. ## Intent And Constraints - Electron Main remains the sole owner of update feed selection and electron-updater integration. - A missing stable updater artifact remains an error/release-readiness problem; it must not be mislabeled as "already latest". - Unexpected errors must retain their original messages, and no installer-role or cross-architecture fallback may be introduced. - Production recovery requires a separately published updater artifact; client messaging alone does not repair the update chain. - The currently installed `v1.0.0` is evidence of the old packaged behavior; source changes do not affect it until a new client is built and installed. ## Outcome - Confirmed the packaged Windows client resolves the supported stable target to `https://square.nianxx.cn/api/app-updates/windows/x64` and that its local log contains the reported `latest.yml` `HttpError: 404`. The corresponding public feed currently returns the intentional server-side not-available response. - Added a narrow renderer-facing normalization for missing Works Square stable manifests on both Windows (`latest.yml`) and macOS (`latest-mac.yml`). The concise Chinese message identifies an unpublished platform package and points to retry/website download without misreporting the client as up to date. - Raw errors remain logged, emitted, and rethrown; updater status remains `error`; prerelease OSS feeds and unrelated errors are unchanged. - Confirmed the screenshot's duplicated output came from one Zustand `error` value rendered both in the status row and a second error-details card. The settings page now renders one concise message, hides technical stacks and URLs behind the existing generic failure copy, and keeps the retry action. - De-duplicated the Main-process `error` event plus rejected-promise path by per-invocation check tokens. Concurrent callers sharing one electron-updater error now produce one renderer error status, while raw logging/rethrow and later independent retries remain intact. - Hardened the settings boundary so only concise Chinese user-facing prose is shown directly. Raw English diagnostics, stacks, URLs, paths, error codes and structured payloads fall back to the localized generic failure message. - Confirmed the installed `v1.0.0` `app.asar` predates these source changes. Built an isolated unsigned `v2.0.0` `win-unpacked` artifact under the user's temporary directory without replacing the installed application or the repository's existing `release/` output. - No release was published. Current evidence shows website installer `0.9.2`, installed client `1.0.0`, source version `2.0.0`, and unsigned local Windows artifacts, so production recovery still requires release-owner action. ## Verification - Regression tests were observed red before each Windows/macOS normalization change and green afterward. - `pnpm exec vitest run tests/unit/app-updater.test.ts tests/unit/update-settings.test.tsx tests/unit/update-store.test.ts tests/unit/sidebar-update-button.test.tsx`: initially `30 passed` across four files; the final rerun after review fixes is recorded below. - `pnpm exec eslint electron/main/updater.ts src/components/settings/UpdateSettings.tsx tests/unit/app-updater.test.ts tests/unit/update-settings.test.tsx`: exit `0`, no findings. - `pnpm run typecheck`: exit `0`. - `pnpm run build:vite`: exit `0`; the production Main bundle contains the normalized Chinese message. - Isolated `electron-builder --dir` packaging: exit `0`; extracted `app.asar` reports version `2.0.0`, contains the Main normalization and renderer sanitizer, and no longer contains the `updates.errorDetails` render key. - `pnpm test`: updater-related tests pass, but the full suite remains red with three failures outside the changed updater scope: missing `.opencode/agent` in `youth-plain-language-skill.test.ts`, plus two `opencode-manager.test.ts` timing/generation failures. Focused reruns reproduced the missing-directory failure and one generation failure; no base-commit run was performed, so they are recorded without attributing their origin to this task. - Read-only Authenticode checks report `NotSigned` for the available local Windows artifacts, including the isolated artifact; none were installed or uploaded. - Initial independent read-only review: FAIL with two medium findings covering concurrent duplicate suppression and denylist-only renderer sanitization. Both findings were corrected with focused regression tests before final review. - Final focused rerun after those corrections: 4 files / 37 tests passed; typecheck, scoped ESLint, `build:vite`, `git diff --check`, and `check_doc_drift.py --task-id 20260813-makelore-updater-client-7d3a9c` all passed. - Final independent read-only review: PASS with no remaining implementation, architecture, or test-coverage finding. ## Follow-ups - Align the authoritative release version, generate final signed/notarized platform artifacts, publish them to Works Square as updater-role records, and execute discover/download/restart/install smoke tests from older packages. - Add a release job that publishes signed stable outputs to Works Square rather than only the legacy OSS channel, with inactive-first verification and an explicit activation policy. - Harden the stable Windows signing job by verifying Authenticode status and expected publisher after SignPath. Enabling publisher pinning in new clients requires a staged rollout after the stable feed always serves signed packages. - Repair the missing `.opencode/agent` fixture and independently diagnose the two existing opencode-manager concurrency failures before treating the full test suite as a release gate. ## Promotion Candidates - After live proof, promote the stable-feed error behavior and release pipeline requirements to canonical updater/release documentation; keep the external release gate open until then. - Consider promoting the UI contract that ordinary updater errors are concise, non-duplicated, and free of raw stack/URL details; technical diagnostics stay in Main logs.