2e26528bc9
leo 2026-08-18 當場抓到「剛剛不是說不要 v?」——實查確認不是措辭問題: 規約寫在 wiki,而**產生號碼的那條路照舊帶 v**。這輪修的是產地與載體。 ① 對外號從**產生端**就是裸的 `daemon-version.py` 是 daemon 那條線唯一的版本產生器,一路長到 產物檔名(Arcrun-<版本>.dmg)、manifest.daemon.version、/api/latest。 - 新戳的版本一律裸號;`RELEASED_RE` 加 `v?` 讀得懂歷史 - 🔴 重打同一版**沿用 changelog 上原本的寫法**:selfupdate.go 的 newerThanCurrent() 是字串不等於就提示更新 ⇒ 把 v0.18.28 改吐成 0.18.28 會讓每台已安裝的機器收到一個內容相同卻宣稱是新版的**假更新**。 規約會自己過期:頂上那段變裸號之後,重打路徑吐的也是裸號。 - 實測:真實 changelog +一段未發佈 → 產生器吐 `0.18.30`(不是 v0.18.30) ② release 掛得動真的成品(本輪的硬前置) leo:「assets 都寫 source code,這兩個附檔實際是什麼?是 dmg 還是 go?」 ——那是 Gitea/GitHub 自動產生的整包 repo 快照。實測既有 release 的 attachment 數是 **0**,坐實那兩個附檔沒有一個是成品。 - gitea/github-release.mjs 各補 uploadReleaseAsset/listReleaseAssets (兩邊 API 形狀不同是 API 本身的差別,不硬套成同一種) - release-lines.mjs 讓**每條版本線各自宣告**自己的成品(assetKeys); daemon 線明列 mac/win/msix,**排除釘在 0.15.7 的兩筆歷史遺留** ——照「有 file 欄就掛」會把舊檔掛上新版頁面,正是本輪要治的病 - ship.mjs 建完 release 後掛檔,並**回頭查證**附件真的在頁面上; 缺任何一個就擋(不留「點下去沒東西」的版本頁) ③ 內外對應由機器產生,不再是總管手寫 leo:「對應關係記在該次發佈的 release note,不靠號碼本身編碼」 - 新增 internal-version.mjs:`RAG-20260818-001-<commit7>` - 🔴 `formatInternalVersion` 收到空的 artifacts 直接丟例外 ⇒ **算不出一個沒有成品的內部號**(leo:「內部每次就要出貨 bundle 的版本」)。 ops-facts 原本記著「這件事目前靠自律,沒有機械閘」——這就是那道閘 - 序號從**既有 release 的事實**算,不養會漂的帳;tag 與內文都掃 (08-17 那兩筆內部號寫在 tag_name 上,只掃內文當天會從 1 重編、無聲撞號) 紅線遵守:既有 tag/檔名一個都沒回頭改;沒寫 GitHub(②③ 實測都在 Gitea); 沒部署、沒推 main、沒自己併分支。演練建的 release 與 tag 都已刪除複驗。 測試:installer 252 支全綠(原 233 +新 19);collector 產生器新增 6 支全綠。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>