Leo
|
8c22c6858b
|
feat(daemon): 0.18.33——機器 ID 進二進位,三平台成品全裸號(inkstone/mira#6)
collector 加了 machineid.go 之後 daemon 源碼與成品脫節,
daemon-source-check 擋下(閘是對的)。照規矩補 changelog 再重編三平台。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-18 17:53:23 +08:00 |
|
Leo
|
48546a768c
|
feat(daemon): 0.18.32 三平台全裸號成品+補上 msix 的搬運缺口(arcrun-rag#88)
- 產生端實測吐裸號:changelog 標題 `## 0.18.31`、二進位 -X main.version=0.18.31
- 三平台成品檔名全裸:Arcrun-0.18.32.dmg / Arcrun-win-0.18.32.exe / Arcrun-0.18.32.msix
- 🔴 補上一個安靜的洞:build-msix.sh 只吐到 dist-msix/Arcrun.msix,
而出貨線找的是 dist/Arcrun-<版本>.msix,且 msix 標 required:false
⇒ 它會安靜地少一個檔而出貨線照印綠。上一版的 msix 是人手搬的。
這正是 daemon-sync 當初要根治的「只活在人記憶裡的步驟」。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-18 16:55:59 +08:00 |
|
Leo
|
03a2c3d5f8
|
fix(ship): 解開出貨線的兩個自鎖——閘改成量指紋、戳版順序倒過來(arcrun-rag#88)
出貨線從第 5 站 daemon-source-check 就把自己鎖死,push/deploy/verify/
release-record 四站一次都沒執行過。實查真兇是**兩個**,不是一個,而且同源:
D95 第一輪把 `CHANGELOG.md` 搬進 `collector/`(為了讓 collector/ 自足、
有資格獨立成 repo)之後,**「宣告新版本」這個動作本身就是在改 collector/**。
── 自鎖① 出貨線那道閘:用 git 歷史當代理 ────────────────────────────
舊判法=`git log <宣告那顆>..HEAD -- collector` 非空就擋。
⇒ 一顆**只改宣告、一行程式都沒動**的 commit(dcd0132 就是)也被算成
「宣告之後源碼又動過」⇒ 閘擋自己。
⇒ 反過來也不準:collector/ 底下有些檔案(打包腳本旁的 .mjs 工具、README)
根本不會進到執行檔,動了它們一樣被判「要重打包」。
🔴 兩件事都對,疊起來變成死結:**衝突在範圍重疊,不在任何一方做錯。**
修法不是把 changelog 搬回去(那會推翻 D95 第一輪),也不是加路徑白名單
(那就是被禁的字串比對)。改成問**同一件事實**,而那份事實這個 repo 早就在算:
`daemon-version.py` 每次戳版都把「當下的原始碼指紋」記進
`.version-source.json`(2026-08-06 起就存在)。
**版本 X 的指紋 == 現在算出來的 ⇒ X 的成品確實是照這份源碼打的。**
宣告那一步改到的檔案,在戳版當下就已經算進指紋 ⇒ 結構上不可能擋自己;
而「改了 code 卻沒重打包」照樣指紋不同 ⇒ 原本要擋的一個都沒放過。
指紋怎麼算是 daemon 自己的知識,出貨線**不重寫一份**(兩套並存必然漂移):
新增唯讀的 `daemon-version.py --source-state`,`daemon-freshness.mjs` 只負責問與判。
這就是遷移計畫寫的「daemon-freshness 該**搬家**不是加固」。
── 自鎖② 戳版的順序:帳本記的是「還沒戳版」那一刻的樹 ──────────────
`main()` 原本先 `check_or_record()` 再把宣告寫進 changelog。而 changelog 就住在
指紋涵蓋的樹底下 ⇒ 帳本記下來的那棵樹,從寫完宣告那一刻起就不存在了。
實撞(本輪 A/B 重現,見 daemon-version.test.mjs ⑦):
build-mac.sh 戳版打完 dmg → 同一輪 build-win.sh 走「重打同一版」路徑
→ 現在的指紋(含已戳版的 changelog)≠ 帳本裡那個 → dist/ 已有 dmg
→ 判「版號已對應另一份原始碼」→ **第二個平台永遠打不出來**
而上游 `daemon-sync` 兩個平台都要,缺一不准出貨 ⇒ 出貨線在這裡也走不完。
⇒ 先寫宣告、再記指紋。(這條路是升版,帳本不可能已有該版號 ⇒ 不會中途 die。)
🔴 這個病是 D95 第一輪帶進來的:v0.18.29 打包時 changelog 還在 docs-site/,
不在指紋範圍內,所以當時不會發作。
── 為什麼要多一本逐檔帳(.version-source-files.json)────────────────
總指紋只有 16 個字,對不上時只講得出「不一樣」。而紅線要求
「回報通過時要說得出它實際比對了什麼」⇒ 逐檔雜湊讓閘講得出**哪幾個檔**變了。
只留最新一版(閘只問最上面那一版),與總指紋帳本一樣排除在指紋之外(自我參照)。
── 閘要留痕(InkStoneCo#48)────────────────────────────────────────
`installer/daemon-freshness-gate-log.md`:擋下、放行、明知故犯放行,三種都記。
── 順手收進來的一筆(同一輪的複驗項)───────────────────────────────
cherry-pick 89dd323:`checkDocsLive()` 的假綠。實測線上 stage 文件站——
那一頁是舊的(135KB 逐版列表、沒有 dcd0132 的 meta-refresh),卻因為內文
剛好含一次 releases 網址而被 `body.includes()` 判過 ⇒ fails=0。修後 fails=1。
實測
· daemon 0.18.30:Mac dmg 8.3M + Windows exe 22M **同一輪打出來**(修前不可能)
· 閘判決:status=ok,帳本 ad1106716ae426d2 == 現在 ad1106716ae426d2(涵蓋 228 個檔)
· installer 測試 257 支全綠;collector 版本產生器 9 支全綠(新增 ⑦⑧⑨)
· daemon-freshness 自己的演練 15 支:兩個方向各有案例
(不擋自己/仍擋得住沒重打包/問不出來一律停/留痕)
紅線遵守:只碰 stage;沒推 main、沒併分支、沒碰 prod/GitHub。
Refs: inkstone/arcrun-rag#88
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-18 15:39:52 +08:00 |
|
Leo
|
3af210e03a
|
docs: 版本說明頁刪除,改連 GitHub 版本發佈(arcrun-rag#41)
leo 2026-08-17:「這個頁面刪除。」
(同一件事 08-09 就講過:「不要同步,docs 的版本說明直接連回 github 的版本發佈」,
那時記在該檔檔頭當待辦,理由是「等 releases 累積出足夠版本歷史」——現有 9 筆,理由失效。)
使用者要看版本紀錄 → github.com/youlinhsieh/arcrun-rag/releases。文件站不再自己維護一份。
── 🔴 動手前發現的事:那一頁不只是一頁 ──────────────────────────────
`docs-site/src/content/docs/help/changelog.md` **同時是兩個東西**——文件站的一頁,
以及**雲端引擎 `1.4.x` 的出貨原稿**(`installer/scripts/daemon-notes.mjs` 的 `CHANGELOG_REL`,
被 `ship.mjs` 的 docs-changelog/release-record 與 `github-release.mjs` 讀)。
直接 `rm` 會讓雲端那條線的 GitHub/Gitea 版本發佈點進去變空白。
⇒ 頁面刪掉,**原稿搬去 repo 根的 `CHANGELOG.md`**(旁邊就是根的 `RELEASE_LINE`),
形狀與桌面版那條線一致:`collector/CHANGELOG.md` + `collector/DAEMON_LINE`。
`collector/CHANGELOG.md` 一個字都沒動。
── 投影機制整套拆掉(0fb72ae,D95 第四輪,昨天才併進 main)──────────
它存在的唯一理由是把 daemon 段落渲染回這一頁。頁面沒了,它就是沒人用的機制:
· `docs-site/remark-daemon-changelog.mjs`(整支)
· `astro.config.mjs` 的 import 與 `markdown.remarkPlugins`
· `package.json` build 的 `--force`(那是投影的必要條件,不是通用旗標)
· `collector/.../daemon-notes.mjs` 的 `releasedSections()`/`releasedSectionsFromFile()`/`RELEASED_HEADING`
· `collector/.../daemon-notes.test.mjs`(4 支全是投影的演練)
`daemon-notes.mjs` 其餘匯出(notesForVersion/checkNotes…)是出貨線在用的,留著。
── 舊網址留一條轉址,不直接 404 ──────────────────────────────────
那個網址掛在側欄上、也印在 landing「這一版改了什麼」旁邊,已隨 landing 部署到使用者
瀏覽器裡。repo 內的連結本輪都改成直接指 GitHub(landing/docs 首頁/側欄),
所以轉址不服務任何內部連結,只接書籤與舊 HTML。它是 `astro.config.mjs` 的一行宣告
(沒有程式、沒有真相源可以漂),而且被 verify-docs 每次出貨夾住 ⇒ 不是要維護的機制。
── ⚠️ 一次真的降級,標在這裡不藏 ────────────────────────────────
`verify-docs.mjs` 原本斷言「線上那一頁有這兩個版號」——沒有頁面就沒有東西可查。
改成斷言「那條轉址還在」(=線上這顆確實是這份原始碼建的)。
**舊斷言抓得到「內容停在上一版」,新斷言抓不到。** 差額由 `release-record` 站承接:
每條版本線都要有一筆版本發佈、內文抽不到就中止——那一站有牙齒且更早跑。
`docs` 站的 ① 那道「這一版寫了嗎」照舊每個目標都問(D65:不准跳)。
實測
· 建置產物:`1.4.4x`/`v0.18.2x` 命中 0 個檔;`dist/help/changelog/index.html`
=轉址頁(meta refresh+canonical+a href 全指 releases)
· 兩種網址(astro preview):`/docs/help/changelog` 與 `…/changelog/` 皆 200,
內容同一份轉址頁,版本號命中各 0
· 站內死連結:指向該網址的 href 0 條;pagefind 11 個 fragment 含 changelog 者 0;sitemap 未列
· 產生鏈完整:`1.4.47`→根 CHANGELOG.md(摘要+4 行內文)/`v0.18.29`→collector/CHANGELOG.md
(摘要+6 行內文)/`1.4.29`→根(6 行);不存在的版號回 null
· `node --test installer/scripts/*.test.mjs` 233 支全綠
(238→233:-4 投影演練、-1 htmlText,兩者的實作都已移除)
· 建置那句 `/404.htmlEntry docs → 404 was not found.` 是既有行為——
拿掉 redirects 重建仍出現,與本輪無關
Refs: inkstone/arcrun-rag#41
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-18 14:35:25 +08:00 |
|
Leo
|
bd25efaae5
|
refactor(collector): 剪掉臍帶——collector/ 自己就算得出自己的版本號(D95 第一輪②)
leo 2026-08-17:「身為管理者,你要從頭到尾**不要有很多扭曲**,因為你根本不記得
你做的這些扭曲,**每次都要查**,很直接,源碼、產出物,從 stage 到 prod。」
`collector/` 原本要伸手到 repo 根才算得出自己的版本,共四條:
① `daemon-version.py` 讀 `docs-site/src/content/docs/help/changelog.md`
② `daemon-version.py` 讀 `ROOT/DAEMON_LINE`
③ `daemon-version.py` 的原始碼指紋從 repo 根 `git ls-files collector`
④ `changelog-section.sh` 讀 `$REPO_ROOT/docs-site/...` 並 exec
`$REPO_ROOT/installer/scripts/daemon-notes.mjs`
⑤(複驗才發現的第五條)`build-msix.sh` 用 `git rev-parse --show-toplevel`/../../.env
推 InkStoneCo 頂層拿 MS Store Identity
現在全部落在 `collector/` 內部:
· `collector/CHANGELOG.md` ← 新家。**原檔同時裝著兩條版本線**
(桌面版 `v0.18.x` + 雲端引擎 `1.4.x`),已按版號格式拆開;
雲端那 17 段原地不動留在 docs-site,桌面版這 30 段搬過來。
· `collector/DAEMON_LINE` ← 從 repo 根搬進來
· 指紋改以 `collector/` 為根算(`cwd=COLLECTOR`、pathspec `.`)
⇒ 相對路徑前綴變了、而路徑有進雜湊 ⇒ `FINGERPRINT_ALGO` 3→4,
照既有設計讓帳本自動整本作廢重記(不要手改 JSON)
· `daemon-notes.mjs` 實作搬進 `collector/cmd/arcrun-app/`,
`installer/scripts/daemon-notes.mjs` 變薄殼轉呼叫
⇒ **根可以往內伸手,collector 不可以往外伸手**,方向單向
· `build-msix.sh` 改成往上找「帶著那把鍵的 .env」,
leo 08-06「腳本自己去讀不要再問人」原樣保留,但不再綁目錄結構
驗收閘:`collector/check-standalone.sh`——不是 grep,是**行為證明**:
把 collector/ 的檔案單獨複製到 repo 之外的臨時目錄、在那裡 git init,
再跑版本計算與打包前置閘。跑得起來=真的自足。
自己發現並修掉的三件:
· `arcrun-tray/assets/store/` 與 `--setup` 其實還活著(見上一顆 commit)
· 兩支同名的 `daemon-notes.mjs` CLI 守衛比的是**檔名尾綴**
⇒ 兩支一起開火,問雲端版號時 collector 那支先 exit(1),
薄殼根本沒機會查 docs-site。改成比絕對路徑。
· `collector/CHANGELOG.md` 的「怎麼出新版」說明若照抄那行標題,
會被 `daemon-version.py` 的純字串比對當成「有待發佈內容」而誤升版
⇒ 說明裡刻意不寫成真的標題,並把這個邊角寫在檔案裡
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-18 13:05:33 +08:00 |
|