2bbfa453d3
leo 2026-08-08 真機看到 v0.18.24 的更新畫面:
「不要這麼長的散文,簡短講改了什麼,細節去 docs 讀。」
畫面是一整面文字牆,`**粗體**` 還原樣露出來。
真兇不是文案,是**最後一哩沒有機制**:
- 單一真相源(changelog.md)08-06 就立好了(30f726b),
changelog-section.sh 也有 --check 閘擋「忘了寫更新內容」。
- 但它的**投影**那一段是 `tr '\n' ' '`——把整段散文壓成一坨,
而且 grep 全 repo **沒有任何東西呼叫它**(build-*.sh 只用 --check)。
- ⇒ 每次出貨都是有人臨時寫一段 python 折行塞進 manifest,
每次重寫一次、沒人檢查結果長什麼樣。
為什麼只能是一行短句(不是排版沒做好):
main.js:215 是 `<div class="d">${esc(u.notes)}</div>`
① esc() ⇒ 任何 markdown 符號都會原樣露出
② .d 沒有 white-space:pre ⇒ 塞 \n 也不會分行
改法:
- 新增 installer/scripts/daemon-notes.mjs =**唯一的投影器**:
只取 changelog 每條的粗體標題、串成一行、超長截斷並導去說明文件。
- changelog-section.sh 的投影段改成委派給它(--check 閘原樣保留),
兩邊同一份規則不會漂移。
- ship.mjs 新增 notes 步驟:每次出貨自動套用,手改過的會被改回來。
- release.mjs 的 verifyManifest 加第四條規則:notes 必須存在、無 markdown、
單行、不超長,且**等於 changelog 的機械投影**——手改一律擋下。
實測:
· v0.18.24/23/22 三版各自產出 62/51/80 字,零手工調整
· 手改成一段散文 → verify-manifest exit 1,兩條規則都抓到
· 再跑一次管線 → 自己改回正確那一行
· 用 daemon 真實 style.css + main.js 的真實 markup 渲染兩版對照並截圖:
舊 576 字(含 8 個原樣露出的 **)vs 新 62 字三行讀完
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>