這是 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/, branchfeature/FR-069.5(不切 branch)。
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 檔的任務到此結束,接手者若被派來做本章,應先確認是否還有收口動作沒做, 而不是重新盤點錄影狀態。
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 棒各發現一個,皆已拍板落地):
vw_user_job_queue 硬篩 user_id = 當前使用者,PM Bob 在待辦任務頁一筆任務都看不到——這是產品設計, 不是 bug。C 段改成 PM 在規劃頁任務面板回顧設定+說明重跑取消。| 項目 | 位置/狀態 |
|---|---|
| 八段獨立 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 棒交付後 user 實際打開合併片看,發現兩個問題,第 3 棒唯讀 probe 查證後修正:
.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=1,innerText 完整含標題與六個統計值。七處全改。
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 綠燈 只驗證了流程走得完,沒驗證畫面對不對,最終驗收一定要真的看過畫面或影片。
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。
教訓:使用者口頭給的秒數是觀影當下的直覺印象,不是精確測量值;任何裁切在 真的下刀前,先逐秒截圖核對邊界內容,不能盲信數字直接執行。
掃描很快,B 段錄到時全部都是「成功」。我等待執行狀態出現「執行中」 會逾時 280 秒後失敗。 一律用 應看到執行狀態「成功」,按鈕後的等待用 應看到「已開始執行」的提示。
GCB 是 auto,掃完即 COMPLETED,我的任務頁預設篩「進行中」看不到它。 每個 B 段開頭都要 我篩選「全部」的任務。
CINC 抽屜有失敗(id 1)與成功(id 8、9)紀錄並存。BE 排序是 started_at DESC, id DESC(jedi-detection 的 list_by_job_execution_ordered), 最新的成功紀錄排在最上面,我開啟第一筆執行的詳情 可直接用,不必指定第 N 筆。 (第 1 棒標「未能驗證」的疑慮,第 2 棒已用 DB 排序邏輯 + 實跑雙重確認排除。)
這兩支的 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,不受影響。
| 項目 | 實況 |
|---|---|
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 已改字卡說明不實按 |
| 項目 | 值 |
|---|---|
| 錄影環境 | 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 |