D-20260822-02|CI 測試目錄與 Profile 執行架構¶
背景與驅動力¶
測試資格原本分散在 workflow、package scripts、Playwright skip 與環境旗標。這使 Private 日常 節省額度的規則被誤套成任何 CI 都不能執行人工視覺,也讓一般 E2E、canonical、nightly 與 release 重複安裝瀏覽器、建立應用程式並維護各自的測試清單。Public 後若直接把完整矩陣套到 每次 PR,也會重複執行與平台無關的 gate。
考慮過的選項¶
- 繼續由各 workflow 維護命令與旗標:容易漂移且無法從單一來源回答實際覆蓋,否決。
- 只以 package scripts 收斂:仍缺少生命週期、平台、長短、必要性與證據類型,否決。
- 以版本化測試目錄描述 suite,workflow 只決定 policy 與 runner placement(採納)。
決定¶
- 主 repo 的
.ci/test-catalog.json是 suite 資格、順序、命令、artifact、必要性、duration、 evidence、scope 與平台支援的唯一機器權威;resolver 對未知輸入、空 plan、重複或不完整平台 fail closed。workflow 不再自行維護 grep、spec 檔或OPEN4WD_*suite 選擇旗標。 - Private 日常只有 GitHub-hosted Linux,平行執行 core 與 E2E;只選
required + short + machine。E2E 不等待 core,且 canonical smoke 與一般 Chromium 共用一次 build。既有 run 32499946409 推估兩 job 比串行單 job 省 675 秒牆鐘,重複 setup 約 45 秒; 後續只以正常 run 被動校正,不另推 A/B 版本。 - Public 日常執行所有
required + machine,不以 duration 排除;common 只在 Linux 一次, platform 才分 Ubuntu/Windows/macOS。Private/Public 日常都不執行 human-visual。 Full / manual的 Linux hosted、Windows self-hosted、macOS self-hosted,以及三平台 hostedRelease readiness,全部呼叫同一 full contract。full 包含 optional、long、canonical、 authoring sources 與 human-visual;三平台 suite ID 與順序必須相同,差異只有 runner/OS。- self-hosted 只接受手動 dispatch,不接 push、PR、schedule 或 public event;離線不影響
CI / required。日常聚合器只要求當前 visibility 選中的工作成功,selected skipped、cancelled 或 missing 一律失敗。 - 人工視覺案例集中在
e2e/manual-visual/,一般 Playwright collection 永遠排除;full runner 明確設定 catalog 擁有的OPEN4WD_VISUAL_ARTIFACTS=1產生 artifact。自動成功只代表檔案完整 產生,不代表人工核准。像素、黑畫面、透明度、幾何與 overflow 等機器斷言仍留在日常 gate。 - 移除 nightly schedule;extended fuzz、performance、canonical completion/performance 等唯一 內容納入 full catalog。每個 full 平台 job 只建立一次 E2E browser artifact,後續群組重用。
- 一般 Playwright config 排除 catalog 專屬的 canonical、authoring、performance 與 determinism 檔案;專屬 config 只由精確 suite 命令使用,避免日常誤收長測試與 full 重複執行。
- catalog suite 可明示同 stage/scope 的
supersedes關係:Public daily 與 full 選到 coverage 時, coverage 取代unit-core的重複 assertion run;property、determinism、fuzz、performance 與 integration 維持各自唯一 partition。requiresE2eBuild不受 suite stage 限制,core-stage 的 determinism 也必須先取得同一份 E2E build。test:unit:performance僅保留為test:perf相容別名, 不另占 full suite。 - runner 先完成所有非 E2E-build suite,再準備唯一 E2E build 並執行需要它的 suites;避免 full 中的 production build 覆寫測試產物後,後續 browser matrix 誤用不含 harness 的 dist。
後果與影響¶
repository 從 Private 轉 Public 時依事件 visibility 自動改用 Public 日常 policy,不需再推 CI 設定。Private 日常額度集中在兩個可平行 Linux job,公開後避免三平台重複 common gate;完整 發布證據仍由同一三平台 full contract 提供。代價是 full 為保持跨平台合約一致,會在三平台 重複部分 common suite,且人工視覺 artifact 仍需維護者另行觀看與記錄裁決。
本決策取代 D-20260821-01 的 public-auto=完整 full matrix、舊 self-hosted workflow 與
hosted-full 入口,也取代 D-20260822-01 的「CI 存在即禁止人工視覺」規則;保留
D-20260821-02 的 Private 日常 Chromium、retries=0 與 Docker 按需 parity 原則,改由 catalog
profile 執行。