跳轉到

D-20260803-01|持久儲存拒絕保留既有 UGC 偏好

背景與驅動力

D-20260802-13 規定 standardgenerous 需要 persistent storage,但其「請求失敗或 API 不可用時保存/回復為 off」文字沒有區分 這次 requested mutation 與請求前已保存的 sanitized level。若玩家原本已有非 off 偏好,拒絕 另一個等級的請求不應覆寫既有偏好;瀏覽器目前未確認 persistence 時,既有非 off 也必須如實 顯示為 dormant,而不是被呈現成 off

本裁決只修正 persistence request 的 mutation 結果與狀態呈現,不改 LRU 門檻、storage authority 生命週期、peer serving 或任何網路邊界。

考慮過的選項

  • 每次拒絕都強制保存 off:會把失敗的 requested mutation 變成另一個未請求的寫入,並破壞 既有合法偏好,否決。
  • persistence 未確認仍樂觀保存玩家剛請求的非 off level:無法證明額外 retention 的必要條件, 否決。
  • 以請求前 sanitized saved level 為 rollback boundary;只有 persistence 成功才提交 requested mutation(採納)。

決定

  • 設定層先讀取並 sanitize 目前已保存的 ugcContribution.level;無效值依既有 sanitizer 收斂為 off。玩家請求 standardgenerous 時,只有 persistent storage 已確認或本次請求成功後, 才提交 requested mutation。
  • persistence request 被拒、拋錯或 API 不可用時,該 requested mutation 失敗,不保存新 level, 並保留請求前的 sanitized saved level。先前為 off 就維持 off,UI 顯示本次拒絕 feedback; 不得因拒絕而假稱 standardgenerous 已保存。
  • 先前已保存的 standardgenerous 若目前未確認 persistence,仍顯示該保存值,但額外 retention 不啟用,runtime 狀態為 storage-not-persistent。這種 dormant 狀態不得靜默改寫或顯示成 off;下一次成功取得 persistence 後,才可依保存 level 啟用。
  • 公開設定 action(包含 persistence 拒絕路徑)不得建立、啟動或重試 storage authority,也不得 啟動身分、Ledger、Helia networking 或 P2P。正常 AppShell lifecycle 仍依 D-20260802-14 獨立管理 authority,不受本裁決 擴張或改寫。

後果與影響

設定 UI 的選中值永遠反映實際 sanitized saved level;拒絕 feedback 描述本次 mutation 失敗,不把 既有值誤報為 off 或新請求值。storage-not-persistent 表示非 off 偏好已保存但額外 retention 目前休眠,並不表示 networking、authority 或 provider 已啟動。

本決策只窄幅修正 D-20260802-13 的 persistence-denial 語意;不重寫歷史決策,不改 D-20260802-14 的單一 storage authority、離線 GC、借用 adapter 或 disposal 契約,也不新增 Kubo、 port、CSP、共識、rule ID、global seed 或 closed-browser background service。