FR-074.5 / CM-1541 — 04-04 執行與結果回收 錄影 STATE(living,只描述「此刻」)

這是 living 檔,就地 Edit 覆寫。 每棒的決策與踩坑紀錄在 fr074-04-04-LOG.md(append-only)。 最後更新:2026-09-04(第 4 棒收工,重錄 A1(確認對話框文案調整)+重新合併八段 +合併片頭尾裁切(去頭 6 秒/去尾 5 秒),本棒交付完畢工作 repo 是 test repo~/Projects/Billows/Audit-Manager/compliance-manager-test/, branch feature/FR-069.5不切 branch)。


§0 一句話狀態

04-04 章的全部拍攝與合併已完成,且已修過一輪 user 覆看發現的兩個真 bug。 八段(A1/A2/B1/B2/B3/B5/B4/C)全部驗證綠燈、正式錄完、成功合併出 04-detection-04-execute-collect.mp4(26:12、88.9MB,第 4 棒重錄 A1+頭尾裁切後版本)。

第 2 棒交付後 user 實際看片,抓到兩個問題(見 §2.5):B1~B5 全五段的統計導覽框 都圈錯區塊OpenVAS 報告因為是 PDF 格式在 headless 環境卡死轉圈。第 3 棒 唯讀 probe 查證兩者根因後修正,B1~B5 全數重錄,重新合併。

剩下的是 .6 首腦收口範疇:合總片驗收、章節狀態表更新、Act 索引、母卡 CM-1535 回寫。 本 STATE 檔的任務到此結束,接手者若被派來做本章,應先確認是否還有收口動作沒做, 而不是重新盤點錄影狀態。


§1 🧭 這章拍了什麼(結案摘要)

04-03 在 190 建好七個檢測工具任務。本章拍:任務怎麼被發動、七支工具的掃描結果怎麼 回收成證據、報告怎麼看、任務怎麼結案。

最終八段結構(原規劃七段,第 2 棒拆出 B5):

A1(PM 發動)→ A2(執行者確認+SonarQube 上傳)→【切點】
→ B1(OpenSCAP 兩組+人工完成字卡/GCB 自動完成)
→ B2(CINC/Nmap)
→ B3(ZAP,0 發現怎麼解讀)
→ B5(OpenVAS,嚴重度分級——本來是後補選配段,重跑 42 分鐘後成功,趕上正式錄)
→ B4(SonarQube,品質門檻)
→ C(PM 規劃頁:完成模式回顧/重跑取消/無實質檢查/總結)

兩處對原大綱的重大偏離(第 1、2 棒各發現一個,皆已拍板落地):

  1. A1 改 PM 視角、A2 改執行者視角(第 1 棒):任務要 PM 在規劃頁按「開始執行任務」 才會轉 PROCESSING,且該動作會自動派掉六支工具的第一次掃描;執行者抽屜本身沒有 「開始執行」鈕。原「Alex 逐一按開始執行」的劇本不成立。
  2. C 段改走規劃頁、不走「我的任務」(第 2 棒):vw_user_job_queue 硬篩 user_id = 當前使用者,PM Bob 在待辦任務頁一筆任務都看不到——這是產品設計, 不是 bug。C 段改成 PM 在規劃頁任務面板回顧設定+說明重跑取消。

§2 交付物清單

項目 位置/狀態
八段獨立 mp4 reports/training-videos/chapters/04-detection-04-execute-collect-phase-{a1,a2,b1,b2,b3,b5,b4,c}.mp4
合併版 同目錄 04-detection-04-execute-collect.mp4(26:12、88.9MB,8 段 concat 無損+頭尾裁切(去頭 6 秒/去尾 5 秒),第 4 棒版本)
feature 檔 training/features/showcase/training/04-detection-04-execute-collect.feature(8 scenario)
outline(劇本,唯一真相) training/chapters/04-detection-tools/04-execute-collect/02-outline.md
狀態追蹤 training/chapters/04-detection-tools/04-execute-collect/03-status.md
merge 腳本 training/scripts/merge-phase-videos.sh(04-04 條目已改成 B5 動態選配陣列)
commit(test repo,未 push) 第 1 棒 4 個+第 2 棒 4cb71f9+第 3 棒 15f7b7f,皆在 feature/FR-069.5(第 4 棒無新 commit,mp4 產物不入版控)
commit(BE repo,未 push) 第 1 棒 be9ee974+第 2 棒 c19ed2b6+第 3 棒 699118ee;本次第 4 棒 STATE/LOG 更新待 commit(第 4 棒無 test repo commit,純錄影/合併/裁切操作)
Notion CM-1541 已 append 第 1、2 棒進度+狀態改「修正待驗證」;本棒完成後待 append

§2.5 🔴 第 3 棒修正:user 覆看合併片抓到的兩個真 bug

第 2 棒交付後 user 實際打開合併片看,發現兩個問題,第 3 棒唯讀 probe 查證後修正:

問題一:統計導覽框圈錯區塊(B1~B5 全五段都錯,不只 OpenVAS)

.exec-info-grid selector 圈到的是「開始時間/結束時間/觸發者/逾時秒數」的 metadata 區塊(JobExecutionDrawer.vue:2987),不是critical/發現項目/high/ log/low/medium 等統計數字的區塊(同檔 3087 行附近,標題文字「掃描結果統計」)。 七處導覽(B1 兩處、B2 兩處、B3、B4、B5 各一)全部圈錯,只是 GCB/CINC 那兩處 字卡文字模糊到看不出明顯矛盾,OpenVAS 因為字卡講「嚴重、高、中、低」但框住的內容 完全對不上才被 user 一眼抓到。

修法:改成 .p-dialog:has-text('執行詳情') >> text="掃描結果統計" >> xpath=..。 用唯讀 probe(Playwright script,帶 executor.json auth state 直連 190)驗證過: count=1innerText 完整含標題與六個統計值。七處全改。

問題二:OpenVAS 報告預覽卡死轉圈(環境限制,非測試設定或運氣問題)

OpenVAS 報告是本章唯一的 PDF(其他六支都是 HTML,upload_files.file_ext 可查證)。唯讀 probe 證實:直接 fetch 報告 URL 回應完全正常(200、 content-type: application/pdf、有效 PDF 內容 139KB),但瀏覽器把同一個 <iframe src="..."> 請求標記 net::ERR_ABORTED 並觸發 Playwright 的 download 事件——headless Chromium 沒有內建 PDF viewer,遇到 application/pdf 一律走下載流程,iframe 永遠拿不到內容渲染。另外測過 拿掉 context 的 acceptDownloads: true,行為完全一樣,排除是測試設定造成。

修法:B5 該環節改用 outline 早就寫好但沒被遵循的 fallback——不進預覽對話框, 改導覽指向「下載報告」按鈕,字卡講「這份是 PDF,直接下載看」。

為什麼會有這兩個問題(方法論教訓)

寫 B1~B5 劇本時,統計導覽用同一個 selector 複製貼上七次,沒有對任一處做過 「導覽框圈住的內容是否真的等於字卡在講的東西」的唯讀核對——五段都在跑 SKIP_OVERLAYS=true 的批次驗證裡「綠燈」,因為那個模式根本不渲染導覽框、 只跑底層 step,selector 選錯不會讓 step 失敗,綠燈只證明「元素存在」不證明 「圈對地方」。B5 的 PDF 問題則是照抄別段報告預覽骨架,沒有針對 OpenVAS 先 唯讀確認報告的實際檔案格式。這是同一個教訓在兩個不同地方重複發生: 沿用模板前,該處特有的資料/畫面形狀還是要單獨查一次;SKIP_OVERLAYS 綠燈 只驗證了流程走得完,沒驗證畫面對不對,最終驗收一定要真的看過畫面或影片。


§2.6 第 4 棒:A1 重錄與合併片頭尾裁切

user 反映 A1「開始執行任務」確認對話框文案有調整,要求重錄該段(維持既有時序不變, 只重錄)。SKIP_OVERLAYS 驗證 23 步全綠後正式重錄(2:14),重新合併八段。

user 要求合併片「前 6 秒、後 8 秒」剪掉。逐幀截圖核對後發現按字面 8 秒會切到 還在畫面上的「這章學了什麼」總結卡(倒數 5~8 秒都是總結卡或它的淡出),改成 只切倒數 5 秒的真空景,總結卡完整保留。最終 ffmpeg -ss 6 -t 1572.12 重新編碼 輸出,04-detection-04-execute-collect.mp4 現為 26:12、88.9MB

教訓:使用者口頭給的秒數是觀影當下的直覺印象,不是精確測量值;任何裁切在 真的下刀前,先逐秒截圖核對邊界內容,不能盲信數字直接執行。


§3 🔴 三個致命陷阱與陷阱④(給任何要重錄或延伸本章的人)

① 不要硬等「執行中」

掃描很快,B 段錄到時全部都是「成功」。我等待執行狀態出現「執行中」 會逾時 280 秒後失敗。 一律用 應看到執行狀態「成功」,按鈕後的等待用 應看到「已開始執行」的提示

② 自動完成模式的任務會從預設清單消失

GCB 是 auto,掃完即 COMPLETED,我的任務頁預設篩「進行中」看不到它。 每個 B 段開頭都要 我篩選「全部」的任務

③ CINC 有失敗與成功紀錄並存 → 排序已驗證安全

CINC 抽屜有失敗(id 1)與成功(id 8、9)紀錄並存。BE 排序是 started_at DESC, id DESCjedi-detectionlist_by_job_execution_ordered), 最新的成功紀錄排在最上面我開啟第一筆執行的詳情 可直接用,不必指定第 N 筆。 (第 1 棒標「未能驗證」的疑慮,第 2 棒已用 DB 排序邏輯 + 實跑雙重確認排除。)

④ GCB/CINC 沒有「發現 N 項」(第 2 棒新發現)

這兩支的 summary 只有 pass/fail/error/notapplicable沒有 findings 欄位。 FE shouldShowFindings()JobExecutionDrawer.vue:944)在 findings === undefined 時直接不顯示「發現 N 項」文字,對這兩支下 應看到發現項目統計 會逾時 30 秒失敗。 B1(GCB 段)、B2(CINC 段)已拿掉該斷言,字卡改講「只給通過/失敗/不適用三個數, 失敗那幾條就是要處理的」。OpenSCAP/Nmap/ZAP/SonarQube/OpenVAS 都有 findings,不受影響。


§4 已知的 S0/FE 校正(沿用,別再踩)

項目 實況
uploadSourceArchive() 第 1 棒已修:改走「點上傳鈕 → filechooser → setFiles」,不再直接對隱藏 input setInputFiles(會讓檔案落到 _default key、按鈕維持 disabled)。
抽屜標題 實際是「任務指南」不是「任務指引」
OpenSCAP 版型 兩組分派:exec-info-grid 3 個、「完整參數」toggle 2 個、各組有「第 N 組」Tag
OpenVAS 沒有「完整參數」摺疊
報告預覽 step 七支工具全部實跑驗證過(第 2 棒批次驗證+正式錄),全部可正常開啟預覽
我的任務 PM 可見性 硬篩 user_id,PM 看不到執行者任務——產品設計,C 段已改走規劃頁繞開
B1 完成任務鈕 任務結案(COMPLETED)後 canEdit 條件不再成立,鈕消失;B1 已改字卡說明不實按

§5 環境座標

項目
錄影環境 190(BASE_URL=https://192.168.50.190,安裝版 stack)
專案 2027 CMMC 2.0 Level1 年度稽核(uid d38beafe-1a96-41ad-acc6-0d5a4d31d93d
角色 PM Bob(blsit)/執行者 Alex Wang(blsemp1,user id 9)
DB 唯讀查法 ssh jedi@192.168.50.190 'docker exec guidant-db psql -U cmmgr -d guidant_ai -c "..."'
壓縮包 fixture training/fixtures/detection-tools/soybean-ui-main.zip(5.5 MB,入版控)
190 最終狀態 七任務全成功(含 OpenVAS 重跑後 succeeded、86 findings);OpenSCAP 一組已人工結案 COMPLETED