From 2407f5a1c15ca774c499b1bb4b66a9fbeb76c81e Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Sat, 19 Sep 2026 08:53:11 +0900 Subject: [PATCH] docs(map): record where the release pipelines actually stop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The tag pipeline dies at the sidecar step before the signing guard because the release runner cannot see Python 3.11, the site deploy now builds and fails only for the missing Cloudflare token, and the portable channel published 1.3.7 with only its evidence-upload step failing. ๐Ÿ’˜ Generated with Crush Assisted-by: Crush:deepseek-v4.1-flash --- docs/map/11-gap-backlog.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/map/11-gap-backlog.md b/docs/map/11-gap-backlog.md index eef0ebe..0d2a81e 100644 --- a/docs/map/11-gap-backlog.md +++ b/docs/map/11-gap-backlog.md @@ -23,9 +23,10 @@ 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๋งˆ๋‹ค ์‹คํŒจํ•œ๋‹ค. ์‹ค์ธก ์›์ธ(run#66 ๋กœ๊ทธ): `site/src/sections/Hero.tsx`๊ฐ€ ํƒ€์ด๋จธ ref๋ฅผ `NodeJS.Timeout`์œผ๋กœ ํƒ€์ดํ•‘ํ•ด `@types/node` ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ–ˆ๊ณ , ๋ฐฐํฌ ์žก์€ `npm ci --prefix site`๋งŒ ํ•˜๋ฏ€๋กœ ์กฐ์ƒ `node_modules`์˜ hoisted ํƒ€์ž…์ด ์—†์–ด `tsc -b`๊ฐ€ `TS2503: Cannot find namespace 'NodeJS'`๋กœ ์‹คํŒจํ•œ๋‹ค. ๊ทธ๋ž˜์„œ `https://d3ro.chanpaca.net/release-identity.json`์ด 404๋‹ค(๊ณต๊ฐœ ๋ฒ„์ „ ๊ฒ€์ฆ ๋ถˆ๊ฐ€). | `.forgejo/workflows/deploy-site.yml`, `site/src/sections/Hero.tsx` | `[x]` 2026-09-19: ref๋ฅผ `ReturnType`์œผ๋กœ ๋ฐ”๊ฟ” hoisted ํƒ€์ž… ์˜์กด์„ ์ œ๊ฑฐํ–ˆ๋‹ค(๊ฒฉ๋ฆฌ `--typeRoots`๋กœ CI ์กฐ๊ฑด ์žฌํ˜„ โ†’ ์ˆ˜์ • ์ „ TS2503, ์ˆ˜์ • ํ›„ clean). ๋ฐฐํฌ ์žก์ด Cloudflare Pages ๋‹จ๊ณ„๊นŒ์ง€ ์ง„ํ–‰๋˜๋Š”์ง€ ๋‹ค์Œ run์œผ๋กœ ํ™•์ธํ•œ๋‹ค. | -| GAP-REL-09b | Release | ์œ„ ๋นŒ๋“œ๋ฅผ ํ†ต๊ณผํ•œ ๋’ค์—๋„ `deploy`๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๋‹ค์Œ ์›์ธ์€ Cloudflare Pages ์‹œํฌ๋ฆฟ์ด๋‹ค. ์›Œํฌํ”Œ๋กœ๋Š” `CF_API_TOKEN`(๋˜๋Š” `CLOUDFLARE_API_TOKEN`)์ด ์—†์œผ๋ฉด `exit 1`๋กœ ์ค‘๋‹จํ•œ๋‹ค. | `.forgejo/workflows/deploy-site.yml` | `[ ]` 2026-09-19: Forgejo์— `CF_API_TOKEN` + `CF_ACCOUNT_ID`๋ฅผ ๋“ฑ๋กํ•˜๊ณ  `deploy-site.yml`์„ ์ˆ˜๋™ ์‹คํ–‰ํ•ด ์‚ฌ์ดํŠธ๋ฅผ ์žฌ๋ฐฐํฌํ•œ๋‹ค. | -| GAP-REL-10 | Release | ํƒœ๊ทธ ํŒŒ์ดํ”„๋ผ์ธ์€ ์„œ๋ช… ๊ฐ€๋“œ์— ๋„๋‹ฌํ•˜๊ธฐ **์ „์—** sidecar ๋‹จ๊ณ„์—์„œ ์ฃฝ๋Š”๋‹ค. Forgejo ์ž์ฒด ๋Ÿฌ๋„ˆ(`yunchan-win`)์— Python 3.11+๊ฐ€ ์—†์–ด `sidecar:setup`("Python 3.11+ ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค") โ†’ `sidecar:build` โ†’ `verify-sidecar-bundle.mjs`๊ฐ€ ์—ฐ์‡„ ์‹คํŒจํ•œ๋‹ค(์‹ค์ธก: `v1.3.7` release-windows run#65 ๋กœ๊ทธ). ์ฆ‰ CI ๊ฒŒ์‹œ๋Š” ์ธ์ฆ์„œ ์ด์ „์— ๋Ÿฌ๋„ˆ ํ™˜๊ฒฝ์—์„œ ๋จผ์ € ๋ง‰ํ˜€ ์žˆ๋‹ค. | `.forgejo/workflows/release.yml`, `.forgejo/workflows/portable.yml`, `apps/desktop/scripts/setup-sidecar.mjs` | `[!]` 2026-09-19: ๋Ÿฌ๋„ˆ์— Python 3.11+๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์›Œํฌํ”Œ๋กœ์— `actions/setup-python` ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€ ๊ฒŒ์‹œ ์ •๋ณธ์€ ๋กœ์ปฌ `release:updater`/`release:portable` ๊ฒฝ๋กœ๋‹ค(GAP-REL-06). | +| GAP-REL-09 | Release | ๋žœ๋”ฉ ์‚ฌ์ดํŠธ๊ฐ€ **์žฌ๋ฐฐํฌ๋˜์ง€ ์•Š๋Š”๋‹ค**. `deploy` ์›Œํฌํ”Œ๋กœ๊ฐ€ main push๋งˆ๋‹ค ์‹คํŒจํ•œ๋‹ค. ์‹ค์ธก ์›์ธ(run#66 ๋กœ๊ทธ): `site/src/sections/Hero.tsx`๊ฐ€ ํƒ€์ด๋จธ ref๋ฅผ `NodeJS.Timeout`์œผ๋กœ ํƒ€์ดํ•‘ํ•ด `@types/node` ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ–ˆ๊ณ , ๋ฐฐํฌ ์žก์€ `npm ci --prefix site`๋งŒ ํ•˜๋ฏ€๋กœ ์กฐ์ƒ `node_modules`์˜ hoisted ํƒ€์ž…์ด ์—†์–ด `tsc -b`๊ฐ€ `TS2503: Cannot find namespace 'NodeJS'`๋กœ ์‹คํŒจํ•œ๋‹ค. ๊ทธ๋ž˜์„œ `https://d3ro.chanpaca.net/release-identity.json`์ด 404๋‹ค(๊ณต๊ฐœ ๋ฒ„์ „ ๊ฒ€์ฆ ๋ถˆ๊ฐ€). | `.forgejo/workflows/deploy-site.yml`, `site/src/sections/Hero.tsx` | `[x]` 2026-09-19: ref๋ฅผ `ReturnType`์œผ๋กœ ๋ฐ”๊ฟ” hoisted ํƒ€์ž… ์˜์กด์„ ์ œ๊ฑฐํ–ˆ๋‹ค(๊ฒฉ๋ฆฌ `--typeRoots`๋กœ CI ์กฐ๊ฑด ์žฌํ˜„ โ†’ ์ˆ˜์ • ์ „ TS2503, ์ˆ˜์ • ํ›„ clean). ๊ฐ™์€ ์ˆ˜์ •์„ pushํ•˜์ž `deploy` run#67์ด ์‚ฌ์ดํŠธ ๋นŒ๋“œ๋ฅผ ํ†ต๊ณผํ•ด `dist/`๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ , ์‹คํŒจ๋Š” ๋‹ค์Œ ๋‹จ๊ณ„(Cloudflare)๋กœ ์ด๋™ํ–ˆ๋‹ค. | +| GAP-REL-09b | Release | Cloudflare Pages ์‹œํฌ๋ฆฟ์ด ์—†์–ด `deploy`์˜ ๋งˆ์ง€๋ง‰ ๊ฒŒ์‹œ ๋‹จ๊ณ„๊ฐ€ ์‹คํŒจํ•œ๋‹ค. ์›Œํฌํ”Œ๋กœ๋Š” `CF_API_TOKEN`(๋˜๋Š” `CLOUDFLARE_API_TOKEN`)์ด ์—†์œผ๋ฉด `exit 1`๋กœ ์ค‘๋‹จํ•œ๋‹ค. | `.forgejo/workflows/deploy-site.yml` | `[!]` 2026-09-19 ์‹ค์ธก(run#67): ๋นŒ๋“œ๋Š” GREEN, ๊ฒŒ์‹œ ๋‹จ๊ณ„์—์„œ `CLOUDFLARE_API_TOKEN ์—†์Œ` โ†’ exit 1. Forgejo์— `CF_API_TOKEN` + `CF_ACCOUNT_ID`๋ฅผ ๋“ฑ๋กํ•˜๊ณ  `deploy-site.yml`์„ ์ˆ˜๋™ ์‹คํ–‰ํ•ด ์‚ฌ์ดํŠธ๋ฅผ ์žฌ๋ฐฐํฌํ•œ๋‹ค(๊ทธ ์ „๊นŒ์ง€ `d3ro.chanpaca.net`์€ ์˜› ๋ฒ„์ „์„ ์„œ๋น™). | +| GAP-REL-10 | Release | `release-windows`(ํƒœ๊ทธ ํŒŒ์ดํ”„๋ผ์ธ)๋Š” ์„œ๋ช… ๊ฐ€๋“œ์— ๋„๋‹ฌํ•˜๊ธฐ **์ „์—** sidecar ๋‹จ๊ณ„์—์„œ ์ฃฝ๋Š”๋‹ค. ์ด ๋Ÿฌ๋„ˆ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” `sidecar:setup`์ด Python 3.11+๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค(`Python 3.11+ ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค`) โ†’ `sidecar:build` โ†’ `verify-sidecar-bundle.mjs` ์—ฐ์‡„ ์‹คํŒจ(์‹ค์ธก: run#65 `v1.3.7`, run#61 `v1.3.6`). ๊ฐ™์€ ๋Ÿฌ๋„ˆ์˜ portable ์žก์€ `py -3.11 โ†’ Python 3.11.9`๋ฅผ ์ฐพ์•„ ์‚ฌ์ด๋“œ์นด ๋นŒ๋“œ์— ์„ฑ๊ณตํ•˜๋ฏ€๋กœ, ์›Œํฌํ”Œ๋กœ/์ปจํ…Œ์ด๋„ˆ ๊ฐ„ PATH ์ฐจ์ด๋‹ค. | `.forgejo/workflows/release.yml`, `apps/desktop/scripts/setup-sidecar.mjs` | `[!]` 2026-09-19: ๋Ÿฌ๋„ˆ์— Python 3.11+(`py` ๋Ÿฐ์ฒ˜ ํฌํ•จ)๋ฅผ ๋ณด์žฅํ•˜๊ฑฐ๋‚˜ ์›Œํฌํ”Œ๋กœ์— `actions/setup-python` ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ทธ ์ „๊นŒ์ง€ ์„œ๋ช… ๊ฒŒ์‹œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค(GAP-REL-02์™€ ๋ณ„๊ฐœ ์„ ํ–‰ ์ฐจ๋‹จ). | +| GAP-REL-11 | Release | portable ์›Œํฌํ”Œ๋กœ์˜ ๋งˆ์ง€๋ง‰ `actions/upload-artifact@v4` ๋‹จ๊ณ„๊ฐ€ Forgejo ๋Ÿฌ๋„ˆ์—์„œ `GHESNotSupportedError`๋กœ ์‹คํŒจํ•œ๋‹ค(์ฆ๊ฑฐ ๋ณด์กด๋งŒ ์‹คํŒจ, ๊ฒŒ์‹œ๋Š” ์„ฑ๊ณต). | `.forgejo/workflows/portable.yml` | `[x]` 2026-09-19: `v1.3.7` portable ๊ฒŒ์‹œ๋Š” run#64์—์„œ ์„ฑ๊ณต(7z ๋‹จ์ผ ๋ณผ๋ฅจ 83.7MB + zip 2๋ถ€, `portable-latest/portable.json`์ด 1.3.7 ๋ณด๊ณ ). ๋‚จ์€ ์กฐ์น˜: upload-artifact ๋‹จ๊ณ„๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ v3/๋‹ค๋ฅธ ๋ณด์กด ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊ฟ” ์›Œํฌํ”Œ๋กœ๋ฅผ GREEN์œผ๋กœ ๋งŒ๋“ ๋‹ค. | | 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. | @@ -53,7 +54,7 @@ Legend: `[ ]` open ยท `[~]` in progress ยท `[!]` blocked externally ยท `[x]` res | GAP-STT-03 | Local engines | On hosts where `localhost` resolves only to IPv6, every local engine call (STT sidecar and Ollama) was refused. Audio capture and local LLM appeared dead. | `apps/desktop/src/main/utils/loopback.ts`, `LocalSTTService`, `LocalLLMService`, `RAGService`, `OnlineLLMService`, `STTManager` | `[x]` 2026-09-18: loopback normalization to `127.0.0.1` for all local engine URLs; defaults updated; 9 unit tests. Verified against the live sidecar and Ollama on a host with an IPv6-only `localhost`. | | GAP-STT-04 | Local STT | Live partial transcript (`CAP-03`, `voice:partialTranscript`) was marked done but had **no producer**: the channel, popup UI, and preload existed, nothing ever emitted. | `apps/desktop/src/main/services/VoiceModeService.ts`, `LocalSTTService.transcribePartial`, `STTManager.transcribePartial` | `[x]` 2026-09-18: 1.5 s cadence over a 7.5 s trailing window, greedy decode, drained before the final transcription; never inserted. | | GAP-STT-05 | Local STT | The bundled sidecar lacked faster-whisper's Silero VAD data, so `vad_filter=true` transcription would have failed at runtime even with the engine bundled. | `apps/desktop/scripts/build-sidecar.mjs`, `scripts/ci/verify-sidecar-bundle.mjs` | `[x]` 2026-09-18: `--collect-all faster_whisper` plus a packaging-time presence check for `assets/silero_vad_v6.onnx`. | -| GAP-REL-03 | Release | ์„œ๋ช…์ด ์—†์–ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—†๋‹ค(์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์ „ ๊ณต๋ฐฑ). | `.forgejo/workflows/portable.yml`, `scripts/ci/build-portable.mjs`, `scripts/local/install-d3ro-voice.ps1`, `bucket/d3ro-voice.json` | `[x]` 2026-09-18: ์„œ๋ช… ์—†๋Š” portable ์ฑ„๋„ ๊ตฌํ˜„ โ€” 95MiB 7z ๋ถ„ํ•  ๋ณผ๋ฅจ(688MB โ†’ 162MiB) + Scoop ๋ฒ„ํ‚ท + ์ˆ˜๋™ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ Forgejo์— ๊ฒŒ์‹œ. ์‹ค์ œ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ end-to-end ๊ฒ€์ฆ(๋ณผ๋ฅจ ๋‹ค์šด๋กœ๋“œ โ†’ SHA-256 โ†’ ๊ฒฐํ•ฉ โ†’ ํ•ด์ œ โ†’ ์—”์ง„ ํฌํ•จ ํ™•์ธ). updater feed๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Œ. | +| GAP-REL-03 | Release | ์„œ๋ช…์ด ์—†์–ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—†๋‹ค(์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์ „ ๊ณต๋ฐฑ). | `.forgejo/workflows/portable.yml`, `scripts/ci/build-portable.mjs`, `scripts/local/install-d3ro-voice.ps1`, `bucket/d3ro-voice.json` | `[x]` 2026-09-18: ์„œ๋ช… ์—†๋Š” portable ์ฑ„๋„ ๊ตฌํ˜„ โ€” 95MiB 7z ๋ถ„ํ•  ๋ณผ๋ฅจ(688MB โ†’ 162MiB) + Scoop ๋ฒ„ํ‚ท + ์ˆ˜๋™ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ Forgejo์— ๊ฒŒ์‹œ. ์‹ค์ œ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ end-to-end ๊ฒ€์ฆ(๋ณผ๋ฅจ ๋‹ค์šด๋กœ๋“œ โ†’ SHA-256 โ†’ ๊ฒฐํ•ฉ โ†’ ํ•ด์ œ โ†’ ์—”์ง„ ํฌํ•จ ํ™•์ธ). updater feed๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Œ. **2026-09-19: `1.3.7`์ด CI portable run#64์—์„œ `portable-latest`์— ๊ฒŒ์‹œ๋จ**(7z ๋‹จ์ผ ๋ณผ๋ฅจ 83.7MB + zip 2๋ถ€, `portable.json`=1.3.7) โ€” ์ฆ‰ portable ๊ฒฝ๋กœ๋Š” CI๋งŒ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ , ์‹คํŒจํ•œ ๊ฒƒ์€ ๋งˆ์ง€๋ง‰ ์ฆ๊ฑฐ ์—…๋กœ๋“œ ๋‹จ๊ณ„๋‹ค(GAP-REL-11). | | GAP-REL-04 | Release | canonical feed๋Š” Cloudflare ๋’ค์— ์žˆ์–ด ์—…๋กœ๋“œ ๋ณธ๋ฌธ์ด **100MiB**๋ฅผ ๋„˜์œผ๋ฉด HTTP 413์œผ๋กœ ๊ฑฐ๋ถ€ํ•œ๋‹ค. | `scripts/ci/publish-updater-release.mjs`, `docs/deployment/unsigned-distribution.md` | `[~]` 2026-09-18: ์„ค์น˜๋ณธ์„ 90.6MiB๋กœ ์ค„์—ฌ ์—…๋ฐ์ดํŠธ ํ”ผ๋“œ ๊ฒŒ์‹œ๋ฅผ ๋ณต๊ตฌํ–ˆ๋‹ค(GAP-STT-07). ํœด๋Œ€์šฉ/Scoop ์ฑ„๋„์€ ์—ฌ์ „ํžˆ 95MiB ๋ถ„ํ• ์ด ํ•„์š”ํ•˜๋‹ค. | | GAP-STT-07 | Local STT | ์ง„(์‚ฌ์ด๋“œ์นด)์„ ์•ฑ ๋ฒˆ๋“ค์— ๋„ฃ์œผ๋ฉด ์„ค์น˜๋ณธ์ด 100MiB๋ฅผ ๋„˜๊ณ  ๋งค ์—…๋ฐ์ดํŠธ๋งˆ๋‹ค 162MiB๋ฅผ ๋‹ค์‹œ ๋ฐ›๋Š”๋‹ค. | `apps/desktop/src/main/services/RuntimeProvisioner.ts`, `apps/desktop/electron-builder.yml` | `[x]` 2026-09-18: ์„ค์น˜๋ณธ์—์„œ ์—”์ง„/ffmpeg๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ฒ˜์Œ ํ•„์š”ํ•  ๋•Œ `runtime-latest`์—์„œ ๋‚ด๋ ค๋ฐ›๋Š”๋‹ค(๋ถ€ํ’ˆ๋ณ„ + ๊ฒฐํ•ฉ๋ณธ SHA-256 ๊ฒ€์ฆ). ์„ค์น˜๋ณธ 189MB โ†’ 90.6MiB, ๋Ÿฐํƒ€์ž„ 1ํšŒ 116MiB(์—”์ง„ 94.4 + ffmpeg 21.7). ์‹ค์ œ feed๋กœ ํ†ตํ•ฉ ๊ฒ€์ฆ ์™„๋ฃŒ. | | GAP-STT-06 | Local STT | Decode settings were untuned: previous-text conditioning let repeated hallucinations compound, and no VAD parameters meant slow, uneven segments. | `apps/desktop/sidecar/main.py` | `[x]` 2026-09-18: `condition_on_previous_text=false`, bounded low-temperature fallback, `no_speech`/`compression_ratio`/`log_prob` thresholds, 300 ms silence trimming. Same transcript, ~5x faster on the reference machine (7.7 s audio: 1609 ms โ†’ 303 ms). |