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_managerD7 定調 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(僅掛上的那幾支)。