417d69ceb3
leo 2026-08-10 在 youlin stage 改完密碼被登出,之後怎麼登都回不去。 病灶是「這一瞬間讀不到」被當成「這個人不存在」,而且做的是**不可逆**的動作。 認證的家是 CF Workers Secret,改它會產生 worker 新版本,既有 isolate 讀到的 還是舊 env(#55 實測 ≥15 秒)。舊的 requirePortalUser 在那個空窗裡直接把 session 從 KV 刪掉——不是擋下讓你重試,是當場銷毀,等 secret 鋪開也回不來。 #55 補的「讀不到就再問一次加速器」只加在登入路徑(findAndVerifyUser),這道門沒有。 三處修法(缺一不可): 1. requirePortalUser 先問一次加速器再判定(與登入路徑同一招、同一支函式) 2. **永不因「讀不到」刪 session**;仍讀不到且正在傳播空窗 → 回 503 `auth_store_propagating` 而不是 401(讀得到 record 的「已停用」照舊刪,那是確定的事實) 3. 前端 boot() 從「任何非 2xx 都 dropSession」收斂成**只有 401 才算被登出** ——後端不刪、前端卻自己丟掉 localStorage 的 token,症狀一模一樣 順帶修掉同一族的一個資料遺失路徑:mutateAuthStore 舊版拿「可能是舊版 env」當底稿做 read-modify-write,而 writeAuthStore 會重切分片並刪掉多出來的舊分片 ⇒ 底稿若是 「某帳號被建立之前」的版本,那個帳號會在這次寫入中被抹掉且無法還原(secret 是唯一真相源)。 改成先問加速器、再把 env 版與 overlay 版取聯集當底稿;刪除仍有效(fn() 在聯集之後才跑)。 驗證:tsc 與 baseline 同為 23 個既有錯誤(零新增);tests/portal-auth.test.ts 27/27 綠。 stage 實測見交付回報。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R8vF2zS2XpaZjzkC75Fjss