# A5 Manual Smoke Checklist

> **適用範圍**：A5 Session C T14 FE manual smoke。BE + FE shipped 後 user 自跑驗收。
> **前置**：BE branch `feature/ssp-import-export-phase2` 跑起來 + FE `npm run dev` 起來。
> **2026-05-21**

---

## 啟動環境

```bash
# BE
cd ~/Projects/Billows/Audit-Manager/compliance-manager-be
set -a; source .env; set +a
python main_app.py            # localhost:8000
# 看 log: tail -f log/app.log

# FE
cd ~/Projects/Billows/Audit-Manager/compliance-manager-fe
npm run dev                   # localhost:5180
```

登入：blsadmin / Billows@123!

---

## A. 路由 + 上傳頁

### A.1 Create mode 路由
1. 瀏覽器開 http://localhost:5180/module-frame/import-excel
2. ✅ 預期：頁面標題「從 Excel 建立合規資源庫」+ framework + version 兩個 Dropdown + file upload
3. ✅ 選 framework「CMMC 2.0」→ version dropdown 載入 published 版本清單

### A.2 Update mode 路由
1. 從 MF 詳細頁推導 MF uid（如 `123e4567-...`）
2. 開 http://localhost:5180/module-frame/{uid}/import-excel
3. ✅ 預期：頁面標題「從 Excel 匯入合規資源庫內容」+ 只顯示 file upload（無 framework picker）

### A.3 解析錯誤路徑
1. 上傳非 .xlsx 檔（如 .pdf / .docx）
2. ✅ 預期：FileUpload 元件拒絕 + 不允許點「解析」按鈕
3. 上傳結構錯誤 .xlsx（缺 sheet）
4. ✅ 預期：toast 顯示「解析失敗」+ error_message

---

## B. 預覽頁 5 sheet TabView

### B.1 載入 + tab badge
1. 上傳合法 Excel → 解析成功 → 自動 redirect /module-frame/import-excel/preview/:parseUid
2. ✅ 預期：5 個 tab：Devices / Information systems / Leveraged services / Parties / Controls
3. ✅ 預期：tab 右上角 badge 顯示 unmatched 數量（紅）或 fuzzy 數量（橘）

### B.2 Devices sheet
1. 切到 Devices tab
2. ✅ 預期：DataTable 顯示 name / IP / OS / device_type / status / match_status / 操作
3. ✅ 預期：每行 match_status 顯示「已配對」/「模糊匹配 (XX%)」/「未配對」其一

### B.3 InfoSystems sheet
1. 切到 Information systems tab
2. ✅ 預期：DataTable 顯示 name / abbreviation / system_status / description / match_status / 操作

### B.4 Controls sheet (row expansion)
1. 切到 Controls tab
2. 點任一行的 expansion arrow
3. ✅ 預期：展開後顯示 control statement 全文 + objectives DataTable（objective_key / statement）

---

## C. RowActionMenu — unmatched 三路徑

### C.1 選現有 (use_existing)
1. Devices tab → 找一個 unmatched row
2. 點操作欄三點 icon → 選「選現有」
3. ✅ 預期：EntityPickerDialog 開啟 + 載入 tenant.devices Dropdown（含 filter 搜尋）
4. 選一個 device → 點確定
5. ✅ 預期：該行 match_status 變「已改選」（藍 Tag）+ localStorage 自動 save

### C.2 新建 (use_inline_new)
1. Devices tab → 找一個 unmatched row
2. 點操作 → 選「新建」
3. ✅ 預期：InlineCreateDialog 開啟 + 預填 row.name + name/ip required field
4. 填完 → 點確定
5. ✅ 預期：該行 match_status 變「新建」（藍 Tag）+ localStorage save

### C.3 純文字保留 (skip_as_text)
1. 任一 sheet → 任一 row
2. 點操作 → 選「純文字保留」
3. ✅ 預期：match_status 變「純文字保留」（灰 Tag）

### C.4 重置 (reset)
1. 對已套用 decision 的行
2. 點操作 → 選「重置為自動配對」
3. ✅ 預期：match_status 回到原始 BE reconciler 配對結果

---

## D. localStorage 持久化

### D.1 重新整理頁面恢復
1. 對 Devices 第 1 行設「新建」+ 第 2 行設「選現有」
2. 切到 InfoSystems tab → 設一個「純文字保留」
3. **重新整理頁面（F5）**
4. ✅ 預期：3 個 decision 全部恢復 + match_status 顯示正確

### D.2 跨 tab 切換不丟 state
1. 對 Devices tab 設 decision
2. 切 Controls tab → 切回 Devices
3. ✅ 預期：decision 還在

---

## E. Confirm flow

### E.1 確認 Dialog
1. 設好若干 decisions 後點「確認匯入」
2. ✅ 預期：PrimeVue Dialog 開啟 + 顯示 4 個計數（自動配對 / 已改選 / 新建 / 純文字保留）
3. ✅ 預期：若有 inline create → 底部 hint「將同步新建 N 筆基礎資料」

### E.2 確認成功流程
1. 點 Dialog「確認匯入」
2. ✅ 預期：按鈕轉 loading + Cancel 按鈕 disabled
3. ✅ 預期：成功 → toast「匯入成功」+ localStorage 清空 + redirect MF 詳細頁

### E.3 確認失敗 rollback
1. 故意製造失敗（如 inline create device.name 撞 duplicate）
2. 點「確認匯入」
3. ✅ 預期：toast「匯入失敗」+ Dialog 關閉但 store state 保留 + user 可修正後重試
4. ✅ 預期 BE：tenant 表無髒資料（@transaction rollback 完整）

---

## F. Discard flow

1. 上傳 + 進預覽 → 點「捨棄」按鈕
2. ✅ 預期：DELETE /ssp-excel-import/:uid 呼叫成功
3. ✅ 預期：toast「已捨棄」+ redirect /module-frame
4. ✅ 預期：再開同 parseUid 的 preview URL → 顯示「找不到此解析資料」

---

## G. i18n 切換

1. 在預覽頁切到 English
2. ✅ 預期：所有 label / Tag / Dialog 文字翻譯到 English
3. ✅ 預期：sheet tab header / match_status / RowActionMenu 都 i18n 過

---

## H. 已知限制（user-facing 影響待評估）

### H.1 Decisions 對 write-time FK 不直接 propagate（design §10.2.1）
- ⚠ user 選的 matched_id_override / inline_create_row_idx 套用到 parsed_result，但實際寫 DB 的 FK 仍由 A4 orchestrator 決定
- **smoke 觀察點**：confirm 後到 MF 詳細頁看 device / info_system FK 是否真的對到 user 選的那筆
- 若 user 選 device A，但 BE 寫進去的是 device B → 確認此為已知限制，follow-up `F-A5-decision-write-propagation`

### H.2 Leveraged sheet action column 為空
- 設計偏差：BE InlineCreateSchema 不支援 leveraged inline；FE 也無 party menu API → 無從 picker
- smoke 觀察：leveraged sheet 操作欄為「－」placeholder
- 未來 polish 進 F-A5-leveraged-action

### H.3 Parties sheet decisions 被 BE skip
- BE A3/A4 reconciler 處理 parties；A5 decisions 對 parties 一律忽略
- smoke 觀察：parties sheet 操作欄為「由 BE reconciler 自動配對」

### H.4 Inline-created user 不發邀請信
- BE `add_user(entity, is_admin=False)` 無 send_invite 機制
- smoke 觀察：新建 user 後該 user 不會收到邀請信 → admin 後續手動處理

### H.5 SheetPreviewBasic + SheetPreviewRefDocs 未實作
- 01_基本資料 + 08_程序書 走 content_overrides；T14 未做 polish UI
- smoke 觀察：5 tab 只看到 5 個 decision sheet，沒有 basic / refdocs tab

---

## 完成後

跑完所有 ✅ 後告知，會接著進 T15 task arc 收口 SUMMARY。
若任何項目踩雷 → 記錄到 design-A5.md §10.3 偏差段 + 視 priority 補 hotfix 或 follow-up。
