下面整段是給執行 session 的 prompt。前置:Phase 1 已 merge、Phase 2a 矩陣已產出且 user 已定調——缺任一就停下回報,不要自己往下做。
【接手主題】FR-048 統一授權守門 Phase 2b — 照端點授權矩陣補**專案域(軸③)**守門
必讀(照順序):
docs/features/FR-048-2607-unified-auth-guard/endpoint-authz-matrix.md(工作清單=矩陣中軸③且 Phase=2b 的列;只做 user 已定調的列,「需 user 定調」的跳過)docs/analysis/2026-07-07-unified-auth-guard-design.md §2 軸模型、§5.1 補法、§7 Phase 2b 注意事項common/authz/__init__.py 決策表(Phase 1 產物)【branch】fix/v1.8.0-bugs,禁止切 branch。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 【每條的做法(三步,全在 app service 層)】
common.authz 新路徑 import,不用舊 shim 路徑):
assert_project_manager(role_service, project_id, ...)(需要 role_service 就走 DI __init__ 注入+container wiring,不要在 method 內自建)SspPermissionChecker.require_write_access(ssp_uid)(AP 狀態前置一起帶到)test/,注意 app service 測試要 patch logger(DBLogHandler 對 SessionLocal=None 會炸,見 memory 慣例)。【順手項(矩陣 §4 A 類)】已用 canonical 守門的模組(participant/SSP/framework),把 import 從舊 shim 路徑換成 common.authz,零行為變更。 【不要動(矩陣 §4 B 類)】audit-round 家族 7 份私有 _check_role/_check_manager/_check_auditor 本波不收編——那是 Phase 2c 的事(泛化 assert_project_role 後委派),現在動純屬回歸風險。
【鐵則】
@transaction scope(guard 需要 session);沒有就照 CLAUDE.md DB Transaction 規範補。【flow_engine 守門復活(本 phase 壓軸,量大可拆下個 session)】 common/authz/workflow.py 的 assert_workflow_project_participant 目前函式開頭 return(FR-038 v2 暫拔)。要用 v2 鏈重建反查:workflow_execution → 輪次/SSP → project(v1 的 AP-task mapping 已 dark,不能用)。參考 memory:v2 job→輪次反查走 task_assignees.project_id,別比對 workflow_execution_uid。判定邏輯不變(任一參與者放行、fail-closed、admin 放行)——它是軸③的第三個解析器,不准另立新軸。改完移除開頭 return、補測試。
【驗收】
pytest test/ 全綠【commit】按模組分批 commit(顯式 add、禁 -am、不 push),message 格式:fix(FR-048): <模組> 寫入端點補專案角色守門(軸③)。收尾等 user 下令。