# FR-080 決策者驗收清單（八棒做完，2026-09-10）

> 給決策者親手驗。每項寫「怎麼做、預期看到什麼、壞了會長怎樣」。失敗的直接在 Notion 母卡 CM-1619 最下面回寫，首腦併成修正卡。
> 環境：worktree `compliance-manager-be-fr080` 的 BE 起在 **8010**（起之前 `lsof -i :8010` 確認是這個資料夾的），DB 是 DEV。

## A. 自動化（首腦已跑，你可以重跑一次確認）

```
cd /Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be-fr080
unset VIRTUAL_ENV VIRTUAL_ENV_PROMPT
.venv/bin/python -m pytest test/test_module_boundaries.py -q        # 86 過（含五層守衛）
.venv/bin/python scripts/deliverables/plugin_metrics.py            # 105 / 6 / 8,677 / 17
```
套件測試各支：`cd /Users/chouraymond/Projects/Jedicogy/module/jedi-python-package-fr080/<套件> && <上面那個 python> -m pytest tests -q --ignore=tests/architecture`。全綠的：asset、system-core（5 失敗是既有）、log、task-platform（15 skip 是殼不在）、bulletin（4 失敗 11 錯是既有）、detection、license-runtime、compliance-audit、evidence-classification、ai-dashboard、iam、file-upload、common。survey 48 失敗 42 錯是既有基線。

## B. 不靠主專案起得來（三行指令，你親跑）

**資產**：
```
cd /Users/chouraymond/Projects/Jedicogy/module/jedi-python-package-fr080/jedi-asset
docker compose -f harness/docker-compose.yml up -d
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be-fr080/.venv/bin/python harness/dev_app.py --migrate
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be-fr080/.venv/bin/python harness/dev_app.py --smoke
docker compose -f harness/docker-compose.yml down -v
```
預期：印出「缺 X-Auth → 401」「devices/menu → 200」「information-systems/menu → 200」「全部斷言通過」。壞了會長怎樣：500 或 assert 失敗。**沒先 `--migrate` 直接 `--smoke` 會 500，那是順序不是缺陷。**

**系統核心**：同上，目錄換 `jedi-system-core`，多一行「管理端點缺 X-Platform-Admin → 403」。

## 怎麼開畫面測（C、D、E 都用這個）

**後端**：worktree 的 BE 起在 8010（現在跑的就是，程式是最新的）。要重起：
```
cd /Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be-fr080
unset VIRTUAL_ENV VIRTUAL_ENV_PROMPT
PORT=8010 poetry run python main.py
```
**前端**：FE repo 已有 `.env.development.local` 指向 `http://localhost:8010`，直接起 dev server：
```
cd /Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-fe
npm run dev          # 開 http://localhost:5180
```
FE 在 `feature/FR-075` 分支沒關係，本 arc 沒改 FE 程式（只有兩條錯誤碼文案的 patch 還沒套，遇到那兩個錯誤會顯示代碼而不是文案，不影響測試）。

**帳號**：用 DEV 既有的 `blsadmin`（租戶 102 管理員）測 C；D 的「切換租戶」「選單管理」「操作日誌」要平台管理員（root 租戶帳號）。

## C. 主專案功能回歸（DEV 8010，每頁列表／新增／修改／刪除各一次）

| 頁面 | 特別看 | 壞了會長怎樣 |
|---|---|---|
| 設備管理（左側選單 系統管理 → 設備管理，`/device/device-manage`） | 建立者顯示**暱稱**不是帳號；刪除前確認框顯示引用數 | 暱稱空白＝查暱稱接口沒接；引用數恆 0＝引用計數接口沒接 |
| 資訊系統管理（系統管理 → 資訊系統管理，`/information-system/manage`） | 新增帶系統負責人 → 詳細頁顯示負責人姓名 | 負責人空白 |
| 系統設定 SMTP（系統設定 → SMTP 設定，`/system/smtp-config-manage`） | 存一筆不改密碼 → 重開密碼還在；**把 SMTP 列全刪 → 顯示空列表不是跳錯** | 跳錯＝I2 沒修好 |
| 選單管理（系統管理 → 選單管理，`/system/system-menu-manage`，要平台管理員） | 新增／修改／刪除 | |
| 任一有下拉的頁面（例如設備管理的「設備類型」下拉） | 設備類型選項正常出現 | 選項空＝選單 API 斷 |
| 操作日誌（系統設定 → 操作日誌，`/log/user-log`，要平台管理員） | 列表載入、匯出下載 | |
| log 轉發設定（系統設定 → Log 轉發設定，`/system/log-forwarding`） | 頁面載入、存一次「最後修改者」顯示暱稱、按「發送測試 log」有回應 | |
| 公告（溝通與互動 → 公告管理，`/bulletin/bulletin-manage`；一般使用者看 `/bulletin/bulletin-list`） | 指定兩個部門 → 詳細頁兩個部門名稱；用該部門帳號看得到、其他看不到；下架時間填早於上架 → 顯示「公告下架時間必須晚於上架時間」；刪除成功不是 409 | 部門名空白＝名冊接口沒接；錯誤碼顯示代碼不是文案＝字串值變了 |
| 專案參與者、任務指派（專案與任務 → 專案列表 `/project/projects` → 進一個專案 → 設定頁加參與者；任務設置頁派人；被派的人看「待辦任務」`/project/task-manage`） | 專案設 manager → 建任務 → 派給人 → 被派的人「我的任務」看得到 → 通知寄出 | |
| 任務問卷（**待辦任務** `/project/task-manage` → 點一個問卷型任務 → 右側「任務執行抽屜」） | ① 抽屜的「指派人員」顯示**名字**（例如 Billows Admin）不是帳號或空白。② 問卷區列出這個任務的問卷，「開啟問卷」進得去。③ 用兩個被派了不同任務的帳號各登入，待辦任務列表各自只出現自己的、數量對。（設備名、任務 uid 那些欄位畫面沒畫，要看的話 F12 → Network → `task-survey` 請求的 Response，runner 已驗過可跳） | ① 空白＝名冊接線壞了。③ A 看到 B 的＝篩選被丟掉，第 6 棒抓到修掉的資料外洩地雷回來了 |
| 問卷填答（待辦任務 → 點一份問卷 → 進填答頁 `/survey/fill`） | 填答頁上方或填答人資訊區的**部門欄有名稱** | 空白＝第 4 棒修的接線缺陷回來了 |
| 檢測工具（合規與稽核 → 工具外掛管理 `/plugin/tool-plugin-manage`；派工在專案的任務設置頁綁工具） | 綁工具 → 派工（DEV agent 若離線，派到「無可用 agent」即可）→ 執行紀錄列表報告檔可下載 | |
| 稽核（專案與任務 → 我的稽核管理 `/project/audit-manage`；進專案 → 稽核輪次 → 任務設置樹、審閱） | 我的稽核清單、任務設置樹、審閱 | 這 5 條 API 沒動，確認不受影響 |
| AI 儀表板（AI 與分析 → AI 儀表板 `/dashboard/ai-dashboard`） | health 回 200；產生儀表板在 DEV 會回「金鑰未設定」（DEV 三把 AI 金鑰本來就空），改前改後一樣 | |
| 檔案上傳（任一任務的佐證上傳，或專案的 SSP 匯入頁） | 上傳一個檔 → 建立者暱稱正常 | |

## D. 多租戶與授權（第 7 棒動地基、第 6 棒動授權）

| 項目 | 怎麼做 | 預期 |
|---|---|---|
| 切換租戶（右上角租戶切換，要平台管理員） | 平台管理員切到另一個租戶 | 資料切換正確 |
| 使用者清單（租戶與組織 → 使用者管理 `/auth/user-manage`）、部門樹（→ 部門管理 `/department/department-manage`） | 各開一次 | 與改前一樣 |
| 跨租戶隔離（用租戶 A 的帳號登入，設備管理／公告／專案列表都不該出現租戶 B 的資料） | 租戶 A 帳號看不到租戶 B 的設備／公告／專案 | 看得到＝RLS 壞了（jedi-common 地基改動） |
| 授權狀態（授權管理 → 我的授權狀態 `/license/status`，用子租戶帳號登入看） | 子租戶帳號打授權狀態頁 | 解析到頂層持照租戶 |
| 子租戶額度（租戶與組織 → 租戶管理 `/tenant/tenant-manage` 開新子租戶，到授權上限第 N+1 個要被擋） | 開子租戶到上限 | 第 N+1 個被擋 |
| BE 啟動 log（終端機 `tail -50 compliance-manager-be-fr080/log/app.log`） | `tail -50 log/app.log` | 沒有 `localhost:4317` 連線錯誤 |

## E. 拔掉測試（證明真的是插件）

`core/app_factory.py` 找到 `register_asset` 那行註解掉 → 重啟 BE → 設備與資訊系統的 9 條 API 全 404、其他頁面正常 → 還原。system-core、bulletin、task-platform 同理各做一次（`register_system_core`、`register_bulletin`、`register_participant`）。

## F. 收口待辦（不是驗收項，是你要裁的）

1. 五支新套件發版推 Nexus（asset、system-core、log、task-platform、bulletin），發版後主專案 pyproject 改回正式 pin。
2. M3：六條外鍵 migration 與 FR-069 以來七支 `envs=dev` 一起審，放行前要查客戶環境孤兒數。
3. FE error-code patch 套上（`handoff/CM-1626-fe-error-code.patch`）。
4. test repo 一支假綠 e2e（`my-tasks-detection.steps.js:323`）改斷言。
5. `feature/FR-080` 合回，與資安掃描 arc 協調時機；合完 `git worktree remove` 兩個 worktree。
6. 另案候選：稽核套件死 route 底下的 service／repo 刪除；survey 作答核心對任務指派 service 的耦合；compliance-audit 去留；②層命名。
