# FR-048 Phase 2b-3 交接 prompt（尾巴收尾批：PSR/subtask/留言/batch-complete/MF 敏感 GET）

> 下面整段是給執行 session 的 prompt。前置：2b-2 已收完（`c05ed713`）。
> 與 2c 檔案面不重疊（2c＝7 份 grc `_check_*` 收編），但**不要同時跑**（同一 working tree，
> 避免互相 add 到對方半成品）；先後順序不拘。

---

【接手主題】FR-048 Phase 2b-3 — 收掉 2b-2 交棒單的尾巴五項（矩陣 §7.3「留待下一波」）

必讀：
1. `docs/features/FR-048-2607-unified-auth-guard/endpoint-authz-matrix.md` §7.3 留待表 ＋ §3 各模組列
2. `common/authz/` 現況（`assert_project_participant` / `assert_project_manager` / decorators 皆已就緒，本波**不需要新 canonical**）

【branch】fix/v1.8.0-bugs，禁止切 branch。不動 jedi-* 套件。**不碰 2c 的 7 個檔**（audit_service / poam / audit_round / job_import / task_execution / assessment_plan / assessment_result _app_service）。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【工作清單】

### 1. project_summary_report ＋ subtask_status_history（參與者級，軸③）

2b-2 已確認卡點＝**container 未接 participant_role_service**，補 DI wiring 後掛守門：
- create：project 維度從 request（uid）resolve → `assert_project_participant`
- update/delete/export/history-revert：依 uid 先查 entity → 走 `entity.project_id` → guard（PSR entity 有 project_id；subtask 反查先 grep 確認欄位/既有反查，禁重複造輪）
- spec 明載「無角色細分」＝只驗專案歸屬，**不要**升級成 manager

### 2. grc job 留言 POST（`app/grc/service/job_comment_service.py:23 add_comment`）

- 角色定調：**任一參與者**（留言＝協作行為；PUT/DELETE 既有 owner 守門不動）
- 反查：job_execution → workflow_execution_id → 復用已復活的 `WorkflowExecutionService.assert_project_participant(workflow_execution_id)`（DI 注入該 service），**不要**另寫反查鏈

### 3. grc batch-complete 自身入口（`app/grc/service/job_batch_complete_service.py`）

- route path 本來就有 `project_uid`（`/project/<project_uid>/jobs/batch-complete`）→ thread 進 service，resolve 後 `assert_project_manager`（**D7 定調 manager-only**，批次完成＝規劃側批次操作；per-job 的 transitive participant 守門保留不動，本守門是入口層更嚴的一道）
- DI 注入 participant_role_service（照 80514dff 的 job_service pattern）

### 4. MF 敏感 GET（軸②，P3 縫收口）

分兩類處理：
- **JSON 讀取類**（axios 必帶 bearer，無原生下載問題，直接掛）：control-defaults GET list/detail（`module_frame_control_default_route.py:50/75`）→ `@require_super_admin_route`
- **檔案下載類**（**逐支查 FE 呼叫方式再動**，`compliance-manager-fe/src/config/api/api.js` ＋ call site）：
  - template export / download（`module_frame_template_import_route.py:66/94`）
  - control-defaults export / import-template、excel-template、ssp-import-template、ssp-export 類（矩陣 3.2 全列）
  - FE 是 axios blob → 掛 `@require_super_admin_route`；是 `window.open`/`window.location`/`<a href>` → **不掛**，矩陣該列轉 Phase 4 signed-token（比照 2b-2 對 survey/import-template 的處置）
- 掛上的全部登記過渡名單（併 `module_frame.manage`）

### 5. 收尾

- 每項補單測（非授權 403 / 授權放行；PSR/subtask 用 participant mock）
- **回歸驗證**：baseline worktree 集合 diff（起點 commit 開 worktree 跑 `python -m pytest test/ -q --continue-on-collection-errors`，comm 比對，新增失敗必須 0）
- 矩陣逐列銷帳 ＋ §7.4 落地紀錄（含「檔案下載類」逐支的 FE 查證結論，轉 Phase 4 的列清楚）
- commit 按主題分批（顯式 add、禁 -am、不 push）；一句話 status＋手測 checklist，收尾等 user 下令

【手測 checklist 必含】參與者在專案內新增留言/摘要報表照常；非參與者打同端點 403；admin 下載 MF 範本照常、一般使用者 403（僅掛上的那幾支）。
