ADR-011:Prototype 體驗容器與工具頁
狀態
已接受(2026-10-26);runtime 已完成獨立實作人審(2026-10-27)。以 RFC 設計 revision 3為完整 API/協定與 15 項驗收契約;設計階段的歷史結論保留於下方,套件發布版本以目前版本為準。
背景
下游已用獨立工具頁支援一般瀏覽器取得合成驗證碼、選擇體驗情境、注入故障及重設。共用價值在於體驗範圍隔離、Native Session、世代檢查、資源生命週期與工具介面;業務 fixture、示範帳號、品牌與流程仍屬應用。
現行框架只有 mockAuthPlugin 的 Vite 組裝,來源應用需自行組合多個實例。框架回流需正式 middleware 接縫,並明定 HTTP 標頭缺席、併發重設、容量壓力、固定時鐘回歸與 promote 的處理。
決策
採共用容器、協定與工具組件,應用註冊業務 adapter 的方案,接受以下取捨:
| 面向 | 已接受結論 |
|---|---|
| 首版範圍 | Vite DEV+既有 Mock 模式;建置後共享 Prototype、Java Host/WAR 另案,不新增 HTTP 相容環境旗標 |
| 公開接縫 | Vite 的 middleware factory/工具 plugin,分離 Node 與 browser 入口;應用提供情境、故障、信件與 fixture |
| Session | 與現行引擎共用實作,每體驗獨立 store;basePath/beforeCors 明確掛載,不 fork Session/token 邏輯;全域舊 plugin 保持相容 |
| 體驗與來源 | 私密 HttpOnly Scope Cookie 與公開 generation 分工;Prototype/Refresh Cookie 都依應用與瀏覽器來源埠命名空間化;代理限制與非安全來源標頭下限依 RFC |
| 併發與重設 | 每體驗控制佇列+generation/expectedRevision;先準備候選再替換,失效 lease/晚回 Cookie 不得污染新容器;故障恢復不改業務結果 |
| 容量與回收 | 匿名預設 120 分鐘;登入後配合原 Native Session 有效期限及保持登入持久 Cookie,登出/撤銷後回到匿名期限。128 份、背景查詢不額外續命、LRU 與 busy/reservation 保護維持;容量壓力可回收尚未到期體驗。後續裁決見下節 |
| 無工具接線 | discovery 僅直接 404/200 HTML 可判 disabled,有效 200 JSON 才初始化;其餘結果明確錯誤,不在 enabled 後 fallback;既有固定時鐘回歸由應用保留 adapter |
| CORS | 全域合法 preflight 委派 Vite CORS;工具與世代 Native 的跨來源 preflight 在此前拒絕,兩種包裝分別驗收 |
| 資料與 promote | 產品仍經 service→MSW handler;未接域沿 browser seed,已接域在所選模式只有一個資料權威;promote/邊界 practices 在落地前對齊,不把 Node 組裝帶入產品 |
| 交付 | middleware/client/工具頁、參考接線與來源相容性、README/指南/Unreleased、15 項驗收及獨立 change 人審完成後才發布;本次不預占版號 |
考量的方案
2026-10-27:保持登入與體驗生命週期
使用者明確同意維持 TMS 既有保持登入行為,由框架自動協調;不新增應用設定, 不為了接入共用工具而縮短已驗證的登入期限。首版固定兩小時及工作階段 Scope Cookie 會使仍有效的 Native Session 提前失去容器,或在關閉瀏覽器後建立另一份體驗。
框架只讀 Native store 的有效期限、原閒置窗口及持久選擇,不讀出識別者或 credential。 匿名體驗維持兩小時;一般登入與保持登入均依原 Native 有效期限保留,只有保持登入才讓 Scope Cookie 持久保存。初始化保持此選擇;登出/撤銷後回到匿名方式。 固定/滑動登入期限仍由 Native 引擎判定,工具查詢或 touch 不額外延長登入資格。 128 份容量、壓力逐出、busy 保護、重設與世代失效機制均維持,記憶體 Mock 不承諾重啟後恢復。
這項裁決取代原 RFC revision 3 對已登入體驗也固定兩小時的部分;原受審正文與歷史雜湊保留。 實作及執行證據另行取得,不以本段決策宣稱發版已完成。
| 方案 | 優點 | 未採用或採用理由 |
|---|---|---|
| 下游各自維護 | 最少框架改動,應用可快速調整 | 隔離、回收及 Session 組裝持續分歧,未採用 |
| 直接搬入全部來源頁面與 fixture | 可立即取得完整來源功能 | 帶入業務、品牌與 URL,不符合框架責任,未採用 |
| 共用機制+應用 adapter | 可重用成熟行為,又保留業務邊界 | 採用;需實作生命週期及接線契約測試 |
| 同時交付部署型 Prototype | Vite/Host 體驗較一致 | 擴大跨框架範圍,首版不納入;此為明示範圍,不宣稱已交付 |
後果與限制
框架可統一工具的隔離與呈現,但應用仍須實作正確的 fixture 生命週期、故障原子套用及產品 handler 接線。已接/未接域的生命週期不同,工具必須揭露其涵蓋範圍;資源壓力逐出也必須有可辨識的重新開始流程。
HTTP 相容只承接既有開發模式能力,不繞過產品身分驗證、不改 credential 儲存,不承諾多分頁同時登入/登出的可靠性。完整 Session 可靠性仍在安全來源驗證。
13 條意見均已處置,沒有 declined 或另開 follow-up 的結論。未實作項目屬 RFC 的必要交付條件,未將其改寫為完成;CHANGELOG 於 runtime 實作時撰寫。本次只解除設計階段閘門,實作仍需另外的人審與發布流程。
審閱追溯
| 欄位 | 紀錄 |
|---|---|
| 審閱識別 | 20261026-prototype-experience-design |
| 審閱基線 | f2e4425590305e7feb61dc787748cc4cffd3c3d5 |
| 通過 revision | r3-5eb4247b84ed3e76 |
| 審閱者 | Jason Lin(jasonlin@leandev.io) |
| 確認時間 | 2026-10-26T13:25:11Z |
| 結論 | approve;R1-01~R1-10、R2-01~R2-03 共 13 條皆已核對處置,無 blocking/major 或新意見 |
| 受審 RFC SHA-256 | 42ef6780f52ecadf1aa649d9ab5d71a068f522a444e30b445f7e3423dad02463 |
| 預檢 | 文件 docs-only 建置及文件 lint、diff 檢查通過;框架站 revision 3 的實際 main 內容 9 項核對為 true,非僅 HTTP 200 SPA 外殼 |
第一輪要求四項 major 與其他說明;第二輪核對前十條已處置,再要求三項 minor;第三輪全部通過。完整設計正文與驗收要求留在 RFC;暫時審閱簡報及其附件依 peer-review 結案流程刪除,不搬成永久交換副本。結案後 RFC 的狀態與 Decision Log 可同步本紀錄,不改動已通過的 API/協定/驗收正文。
實作審閱追溯
20261026-prototype-tools-implementation 第 4 輪於 r4-6abbba9a9a6b8ba3 通過,
審閱者 Jason Lin 於 2026-10-26T23:13:58Z 確認 approve,5 條意見均已處置,
結論落點由維護者確認後結案。實作保存於 25a3814070423145f4f09457c6de48c5fbedfae6。
驗證包括 105 項框架 unit/Node、13 項參考 unit、21 項 Prototype browser、 兩模組各 23 項既有登入/Session E2E、6 項 promote helper 與 4 項 DEV+MSW 投影 smoke。 涵蓋中性示例接線與框架契約,沒有宣稱 TMS 業務 UAT;部署型 Host/WAR 仍不屬首版。