diff --git a/system-dev/docs/3-specs/pending-changes.md b/system-dev/docs/3-specs/pending-changes.md index 703f3a0..ec0605c 100644 --- a/system-dev/docs/3-specs/pending-changes.md +++ b/system-dev/docs/3-specs/pending-changes.md @@ -615,3 +615,64 @@ leo 的判準(2026-07-30): - **⏸ 等 leo 裁的兩題(票上 §七)**:① App 前端跑 Portal origin(ES module)還是 iframe ——短期 App 是否都由我們自己寫?② v0 只開 `nav` 一個掛載點夠不夠? - **狀態**:⏳ 待 confirm。沒 confirm 前照現行 SDD 走,不開新 SDD、不動功能程式碼。 + +--- + +## 提案:安裝器的狀態判斷一律看帳號,中心帳本降級成純優化資料(leo 2026-08-14) + +- **leo 原話(本提案的來源,也是判準)**: + > 「你吃飯了沒?是由我來判斷的嗎?我看到你沒有盤子,應該問你吃了嗎? + > 但我沒問,堅持說你吃過了,**因為我這裡登記你吃了,結果讓你不能買飯**。」 + > 「我有**檢修孔**,需要去問問就好了,東西有沒有**一看就知道**, + > **根本不應該由中心判斷**。」 + +- **病根(同一天三次撞牆,同一個形狀)**: + 安裝器用**自己的帳本**(`INSTALLER_KV` 的 `deployed::`) + 決定「這台裝過了沒」,而不是去看**帳號上現在有什麼**—— + 但它手上一直握著那把 CF token,一次 API 就問得到(=leo 說的檢修孔)。 + + | 撞牆 | 帳本說 | 現場 | 結果 | + |---|---|---|---| + | leo(`#120`) | 裝過了 → `update` | leo21c 已被清空,0 顆 worker | `rule.mjs:257` 停手「找不到任何要更新的 worker」,**畫面上沒有出口** | + | 封測者(`#123`) | 沒人綁這個名字 → 可以建 | 名字已被上次半殘安裝佔走 | CF 回 `title already exists`,**帳號永久卡死** | + | 08-14 早上的處置 | — | — | **人工去 uncle6 刪掉那筆紀錄**才能繼續=把帳本改回跟現場一致。**那是繞過,不是修法** | + +- **要達成什麼**:**帳本壞掉、被清掉、或根本不存在時,安裝器照樣裝得起來。** + +- **變更面(規格層,不是實作指定)**: + 1. **`mode`(init/update)的來源改成帳號現況**——「這個帳號上有沒有我們的 worker」。 + `worker.js:1750-1756` 現在讀兩條通道的 KV 前綴決定,改成問帳號。 + 2. **`rule.mjs:257` 那道「說是更新卻一顆 worker 都找不到 → 停手」不再是錯誤**。 + 在新判準下這個組合根本不會出現:沒有 worker ⇒ `mode` 本來就會是 `init`。 + (該閘原本是 `#97` 的另一道門,其防護目的由「2b 已部署綁定絕對優先」承接。) + 3. **中心帳本降級成純優化/提示資料**,只保留它別處拿不到的東西: + 每顆 worker 上次部署的 `sha256`(差異更新)、`bundleBase`(跨通道互蓋警告 t157)。 + 4. 🔴 **鐵律:帳本永遠不得產生「停手」。** 帳本與現場不合時, + **以現場為準並順手把帳本改對**,不是把使用者擋在門外。 + + > leo 補充(2026-08-14,這句定義了帳本的身分): + > 「**我只是記錄上次的,這次去看看**,本來要記錄 sha, + > **一看東西都沒了,也不能硬說你裝過**。」 + > + > ⇒ **帳本記的是「上次」,不是「現在」。** 它是歷史紀錄,不是狀態宣告。 + > 每一趟都要去看現場;**看到的與帳本衝突時,看到的才算數**。 + > ⇒ 這也是為什麼「帳本不得停手」不是一條例外處理,而是它本來就沒有那個權限—— + > 一份講過去的紀錄,本來就不該否決現在觀察到的事實。 + +- **不動的牆**: + · 2b「已部署 worker 的綁定=事實,絕對優先」不得放寬(`#97` 的災情來源) + · 接管同名資源仍須呼叫端聲明 `createNameIsOurs`,預設 fail-closed(`#123` 的反向災情) + · 判斷仍只有**一份**,在 `shared/resource-rule/`;安裝器不得自建第二套 + +- **影響分析**: + · 動的是 `installer/oauth-prototype/worker.js` 的 mode 決定點 + `shared/resource-rule/rule.mjs` + 的 update-mode 前置閘;**鏡像兩份要同批**(`MIRROR.json` 守著) + · 多一次帳號查詢(`listAllScripts` 本來就會查,可共用,預期零額外成本) + · 不動 KBDB、無 schema 異動、無新金鑰面、無新公開端點 + · 會讓 `#120` 從「要人工清中心紀錄」變成不需要人介入 + +- **牽涉的票**:`inkstone/Arcrun#120`(重裝死結,本提案的主治對象) + |`inkstone/Arcrun#123`(已併 `9ad95ee`,是同一個病在資源層的那一半) + |`inkstone/arcrun-rag#78`(用戶版 uninstaller,受益但不因此結案) + +- **狀態**:⏳ **待 leo confirm 範圍**。方向已由 leo 當面給定;未 confirm 前不動功能程式碼。