From ee1deb64cfc67eb60c826fc6f2a69e461b2b2fc1 Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Sat, 19 Sep 2026 08:41:37 +0900 Subject: [PATCH] fix(release): point the download centers at the published installer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The download contract on both the web console and the landing site still advertised 1.2.0, so the install button pointed at D3RO-Voice-Setup-1.2.0-x64.exe, which the feed answers with 404 while 1.3.7 is live. Wire both contract files into version:sync so the installer version and release date follow the version SSOT, and set them to the published 1.3.7. ๐Ÿ’˜ Generated with Crush Assisted-by: Crush:deepseek-v4.1-flash --- apps/web/src/lib/desktop-release.ts | 4 ++-- docs/map/02-infrastructure.md | 1 + docs/map/11-gap-backlog.md | 2 ++ scripts/ci/sync-version.mjs | 22 ++++++++++++++++++++++ site/src/release.ts | 4 ++-- 5 files changed, 29 insertions(+), 4 deletions(-) diff --git a/apps/web/src/lib/desktop-release.ts b/apps/web/src/lib/desktop-release.ts index 27c051b..6a81fb6 100644 --- a/apps/web/src/lib/desktop-release.ts +++ b/apps/web/src/lib/desktop-release.ts @@ -4,10 +4,10 @@ // ์„ค์น˜ ํŒŒ์ผ์€ canonical Forgejo feed์—์„œ๋งŒ ๋ฐฐํฌํ•œ๋‹ค. ์›น/์‚ฌ์ดํŠธ ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ์—๋Š” // ์„ค์น˜ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ `/releases/...` ๋กœ์ปฌ ๊ฒฝ๋กœ๋Š” ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ 404๋‹ค. -export const DESKTOP_VERSION = '1.2.0' +export const DESKTOP_VERSION = '1.3.7' /** ๋ฆด๋ฆฌ์Šค ๊ฒŒ์‹œ์ผ. `release/product-version.json`์˜ releaseDate์™€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. */ -export const DESKTOP_RELEASE_DATE = '2026-09-16' +export const DESKTOP_RELEASE_DATE = '2026-09-19' const FORGEJO_ORIGIN = 'https://git.chanpaca.net' const FORGEJO_OWNER = 'yunchan' diff --git a/docs/map/02-infrastructure.md b/docs/map/02-infrastructure.md index 32507a0..5dd86a5 100644 --- a/docs/map/02-infrastructure.md +++ b/docs/map/02-infrastructure.md @@ -199,6 +199,7 @@ Full detail: [`09-supabase-backend.md`](./09-supabase-backend.md). | `apps/desktop/electron-builder.yml` | appId `com.d3ro.voice`, NSIS x64 (forced code signing), macOS DMG/ZIP arm64, generic Forgejo publish feed, asarUnpack native modules + `@ffmpeg-installer`, extraResources (icons, sounds, sox, **sidecar**, ffmpeg, ollama) | | `apps/desktop/src/main/update-feed.ts` | Auto-update feed SSOT (canonical Forgejo + legacy GitLab mirror, channels) | | `release/update-policy.json` | Update policy SSOT (channels, minimum supported version, forced update, delta/full, staged rollout, kill switch) | +| `apps/web/src/lib/desktop-release.ts`, `site/src/release.ts` | Download-center desktop release contract (installer filename + release date); version and date are kept on the SSOT by `npm run version:sync` (drifted to 1.2.0 once โ€” GAP-REL-08) | | `apps/desktop/src/main/update-policy.ts` | Policy parsing/decision logic | | `scripts/ci/publish-forgejo-release.mjs` | Canonical Forgejo registry + Release + feed publisher | diff --git a/docs/map/11-gap-backlog.md b/docs/map/11-gap-backlog.md index a539482..d3a5462 100644 --- a/docs/map/11-gap-backlog.md +++ b/docs/map/11-gap-backlog.md @@ -22,6 +22,8 @@ Legend: `[ ]` open ยท `[~]` in progress ยท `[!]` blocked externally ยท `[x]` res |---|---|---|---|---| | GAP-QA-01 | Quality | Extreme Red Team: headful end-to-end bug hunting across real desktop Electron, Web Next.js, and CI pipelines. | `red_team_log.md`, `tests/e2e/red_team_cycle*.spec.ts`, `apps/web/e2e/red_team_cycle4_web.spec.ts` | `[x]` 2026-09-15: 18 scenarios executed, 14 defects caught and 100% resolved (infinite chunking loop DEF-008, IPC signature mismatch DEF-004, markdown editor typing rollback DEF-006, Web RSC Link serialization DEF-012, secret scanner lookahead DEF-013, etc.). All 18 scenarios GREEN with zero regressions. | | GAP-REL-01 | Release | Official release publication to Forgejo and active public download center deployment. | `scripts/ci/publish-forgejo-release.mjs`, `apps/web/src/app/download/page.tsx`, `site/src/sections/Download.tsx`, `apps/web/e2e/red_team_cycle4_web.spec.ts` | `[~]` 2026-09-15: v1.1.0 release assets (`D3RO-Voice-Setup-1.1.0-x64.exe`, `.blockmap`, `latest.yml`, `update-policy.json`) published to canonical Forgejo registry and release hub. 2026-09-16: the published 1.1.0 installer carries no Authenticode signature, so it does not satisfy the release policy; product version moved to `1.2.0` and publication must come from CI with the signing gate GREEN. Download centers in `apps/web` (`/download`) and `site` (`#download`) link the canonical Forgejo feed. 2026-09-19: `1.3.7` (overlay fix) is published to the canonical updater feed (`latest.yml` = 1.3.7, 90.6MiB); the CI signing gate that blocks tag-driven publication is still unresolved, so this went out through the local updater path (GAP-REL-06). | +| GAP-REL-08 | Release | ๋‹ค์šด๋กœ๋“œ ์„ผํ„ฐ๊ฐ€ **์กด์žฌํ•˜์ง€ ์•Š๋Š” ์„ค์น˜ ํŒŒ์ผ**์„ ๊ฐ€๋ฆฌ์ผฐ๋‹ค. `apps/web/src/lib/desktop-release.ts`์™€ `site/src/release.ts`์˜ `DESKTOP_VERSION`์ด `1.2.0`์— ๋ฉˆ์ถฐ ์žˆ์–ด ์„ค์น˜ URL์ด `D3RO-Voice-Setup-1.2.0-x64.exe`์˜€๊ณ , ๊ทธ ๊ฒฝ๋กœ๋Š” ํ”ผ๋“œ์—์„œ 404๋‹ค(์‹ค์ธก: 1.2.0=404, 1.3.7=206). `version:sync`๊ฐ€ ์ด ๋‘ ํ‘œ๋ฉด์„ ๋ฎ์ง€ ์•Š์•„ ๊ณ„์† ์–ด๊ธ‹๋‚ฌ๋‹ค. | `scripts/ci/sync-version.mjs`, `apps/web/src/lib/desktop-release.ts`, `site/src/release.ts` | `[x]` 2026-09-19: ๋‘ ๋‹ค์šด๋กœ๋“œ ๊ณ„์•ฝ ํŒŒ์ผ์„ `sync-version.mjs` ๋Œ€์ƒ์— ์ถ”๊ฐ€ํ•ด ๋ฒ„์ „ยท๋ฆด๋ฆฌ์Šค์ผ์ด SSOT์—์„œ ์ž๋™ ๋ฐ˜์˜๋˜๋„๋ก ํ•˜๊ณ , ํ˜„์žฌ ๊ฐ’(1.3.7 / 2026-09-19)์œผ๋กœ ์ •์ •ํ–ˆ๋‹ค. `version:check`ยทtypecheckยทsite ๋นŒ๋“œ GREEN. | +| GAP-REL-09 | Release | ๋žœ๋”ฉ ์‚ฌ์ดํŠธ๊ฐ€ **์žฌ๋ฐฐํฌ๋˜์ง€ ์•Š๋Š”๋‹ค**. `deploy` ์›Œํฌํ”Œ๋กœ๊ฐ€ main push๋งˆ๋‹ค ์‹คํŒจํ•˜๊ณ  `https://d3ro.chanpaca.net/release-identity.json`์ด 404๋‹ค(๊ณต๊ฐœ ๋ฒ„์ „ ๊ฒ€์ฆ ๋ถˆ๊ฐ€). ์›Œํฌํ”Œ๋กœ๋Š” Cloudflare Pages ํ† ํฐ ์‹œํฌ๋ฆฟ์ด ์—†์œผ๋ฉด `exit 1`๋กœ ์ค‘๋‹จํ•œ๋‹ค. | `.forgejo/workflows/deploy-site.yml` | `[!]` 2026-09-19: Forgejo์— `CF_API_TOKEN`(๋˜๋Š” `CLOUDFLARE_API_TOKEN`) + `CF_ACCOUNT_ID`๋ฅผ ๋“ฑ๋กํ•˜๊ณ  `deploy-site.yml`์„ ์ˆ˜๋™ ์‹คํ–‰ํ•œ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€ GAP-REL-08์˜ ๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€ ์ˆ˜์ •์€ ๋กœ์ปฌ ๋นŒ๋“œ๋กœ๋งŒ ํ™•์ธ๋œ๋‹ค. | | GAP-REL-02 | Release | Windows stable publication needs an external public-trust Authenticode PFX, its password, the exact signer subject, and a Forgejo token, none of which live in the repository. | `.forgejo/workflows/release.yml`, `.gitlab-ci.yml`, `scripts/ci/set-forgejo-secrets.mjs`, `scripts/ci/verify-windows-release-artifact.ps1` | `[!]` 2026-09-18 measured: the Forgejo repo had **zero** Actions secrets; `FORGEJO_TOKEN` is registered now (2026-09-18) but `WIN_CSC_*` still have no values, so `v1.2.0` (run 49) and `v1.3.0` (run 51) both failed at the signing guard and **no updater-feed release has been published since `1.1.0`**. Inject the four secrets (`WIN_CSC_LINK`, `WIN_CSC_KEY_PASSWORD`, `WIN_CSC_EXPECTED_SIGNER_SUBJECT`, `FORGEJO_TOKEN`) with `npm run release:secrets` (check: `npm run release:secrets:check`), then re-run `release.yml` for the `v1.3.0` tag via `workflow_dispatch` (tags are immutable). **2026-09-19 ์ •์ •**: CI ์„œ๋ช… ๊ฒŒ์ดํŠธ๋Š” ์—ฌ์ „ํžˆ ๋ง‰ํ˜€ ์žˆ์ง€๋งŒ, updater feed์—๋Š” `1.3.2`~`1.3.7`์ด ๋กœ์ปฌ `release:updater` ๊ฒฝ๋กœ๋กœ ๊ฒŒ์‹œ๋˜์–ด ์žˆ๋‹ค(GAP-REL-06). | | GAP-REL-06 | Release | ์„œ๋ช… ์ธ์ฆ์„œ๊ฐ€ ์—†์–ด stable(`latest`) ์ฑ„๋„์— **๋ฌด์„œ๋ช…** ์„ค์น˜๋ณธ์„ ๊ฒŒ์‹œํ–ˆ๋‹ค. electron-updater๋Š” `app-update.yml`์— `publisherName`์ด ์—†์œผ๋ฉด ์„œ๋ช… ๊ฒ€์ฆ์„ ๊ฑด๋„ˆ๋›ฐ๋ฏ€๋กœ ์„ค์น˜๋Š” ๋™์ž‘ํ•˜์ง€๋งŒ, SmartScreen ํ‰ํŒ์€ ๋ฒ„์ „๋งˆ๋‹ค 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. | `scripts/ci/publish-updater-release.mjs`, `release/update-policy.json`, `.forgejo/workflows/release.yml` | `[!]` 2026-09-18: `1.3.2`๋ฅผ `--ack-unsigned`(๋ช…์‹œ์  ์Šน์ธ ํ”Œ๋ž˜๊ทธ)๋กœ ๊ฒŒ์‹œ. **2026-09-19: `1.3.7`๋„ ๊ฐ™์€ ๊ฒฝ๋กœ๋กœ ๊ฒŒ์‹œ**(`npm run release:updater -- --ack-unsigned`, ์„ค์น˜๋ณธ 90.6MiB, `latest.yml`=1.3.7, ์„ค์น˜๋ณธ sha512๊ฐ€ ํ”ผ๋“œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ์ผ์น˜). ์ธ์ฆ์„œ ํ™•๋ณด ์‹œ ๋” ๋†’์€ ๋ฒ„์ „์œผ๋กœ ์„œ๋ช… ๊ฒŒ์‹œํ•˜์—ฌ ๋Œ€์ฒดํ•˜๊ณ , ์ด ์˜ˆ์™ธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. | | GAP-REL-07 | Release | ํŒจํ‚ค์ง•๋œ `better-sqlite3`๊ฐ€ ํ˜ธ์ŠคํŠธ Node ABI์—ฌ์„œ `1.3.2` ์„ค์น˜๋ณธ์ด ์‹œ์ž‘ ์ฆ‰์‹œ ์ฃฝ์—ˆ๋‹ค(NODE_MODULE_VERSION 131 vs 130). ์›์ธ: ๋กœ์ปฌ `npm install`์ด ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์„ Node์šฉ์œผ๋กœ ์žฌ๋นŒ๋“œํ–ˆ๊ณ  ํŒจํ‚ค์ง•์ด ์žฌ๋นŒ๋“œ๋ฅผ ๊ฑด๋„ˆ์—ˆ๋‹ค. | `scripts/ci/verify-native-abi.mjs`, `scripts/ci/fix-native-abi.mjs`, `.gitlab-ci.yml`/`.forgejo`/`.github` ํŒจํ‚ค์ง• ๋‹จ๊ณ„ | `[x]` 2026-09-18: ํŒจํ‚ค์ง• ํ›„ Electron ABI๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ๊ฒ€์ฆ๋œ ํŠธ๋ฆฌ์—์„œ๋งŒ ์„ค์น˜๋ณธ์„ ์ƒ์„ฑ(`--prepackaged`)ํ•œ๋‹ค. `1.3.3`์€ ์„ค์น˜๋ณธ์—์„œ ์ถ”์ถœํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์žฌ๊ฒ€์ฆ GREEN. | diff --git a/scripts/ci/sync-version.mjs b/scripts/ci/sync-version.mjs index 172d442..9fde35f 100644 --- a/scripts/ci/sync-version.mjs +++ b/scripts/ci/sync-version.mjs @@ -180,6 +180,28 @@ updateText('apps/web/src/components/layout/sidebar.tsx', (text) => ), ) +// Download centers build the installer filename from these constants. They drifted +// to 1.2.0 while the feed served newer versions, so the download button pointed at +// an installer that does not exist. Keep both surfaces on the version SSOT. +for (const releaseContractPath of [ + 'apps/web/src/lib/desktop-release.ts', + 'site/src/release.ts', +]) { + updateText(releaseContractPath, (text) => + replaceExactlyOnce( + replaceExactlyOnce( + text, + /export const DESKTOP_VERSION = '[^']+'/, + `export const DESKTOP_VERSION = '${metadata.version}'`, + `${releaseContractPath} desktop version`, + ), + /export const DESKTOP_RELEASE_DATE = '[^']+'/, + `export const DESKTOP_RELEASE_DATE = '${metadata.releaseDate}'`, + `${releaseContractPath} desktop release date`, + ), + ) +} + const changelog = readFileSync(join(root, 'CHANGELOG.md'), 'utf8') if (!new RegExp(`^## \\[${escapeRegExp(metadata.version)}\\] - ${metadata.releaseDate}$`, 'm').test(changelog)) { fail(`CHANGELOG.md is missing [${metadata.version}] - ${metadata.releaseDate}.`) diff --git a/site/src/release.ts b/site/src/release.ts index 93e0264..910c795 100644 --- a/site/src/release.ts +++ b/site/src/release.ts @@ -5,10 +5,10 @@ // NAS ๋ฐฐํฌ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ `/releases/...` ๊ฐ™์€ ๋กœ์ปฌ ๊ฒฝ๋กœ๋Š” // ์‹ค์ œ ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ 404๊ฐ€ ๋œ๋‹ค. -export const DESKTOP_VERSION = '1.2.0' +export const DESKTOP_VERSION = '1.3.7' /** ๋ฆด๋ฆฌ์Šค ๊ฒŒ์‹œ์ผ. `release/product-version.json`์˜ releaseDate์™€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. */ -export const DESKTOP_RELEASE_DATE = '2026-09-16' +export const DESKTOP_RELEASE_DATE = '2026-09-19' const FORGEJO_ORIGIN = 'https://git.chanpaca.net' const FORGEJO_OWNER = 'yunchan'