# 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=1`，`innerText` 完整含標題與六個統計值。七處全改。

### 問題二：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 DESC`（`jedi-detection` 的 `list_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 |
