Session 2 交接 Prompt — C2.1(SSP-scoped endpoints 基礎批)

2026-05-22 Session 1 完成後建立。貼以下 ``` 框內容開啟 Session 2。


你正在接手 SSP 在專案內直接編輯 — Phase C Session 2 實作。

## Session 1 完成狀況(已 ship)

| Phase | Commit | 說明 |
|-------|--------|------|
| C1 | 381d3ec | 9 個 OSCAL SSP 角色 seed 進 system_menus + oscal_roles;兩表加 UNIQUE constraint |
| C8 | be1d286 | _ROLE_LABEL_MAP 清理;_ROLE_LABEL_PATTERNS 擴增到 9 條 |
| C7 | e7f29e3 | 06_外部利用服務 sheet 恢復;TEMPLATE_VERSION v2.0.0 → v2.1.0 |

DB 也已執行 C8 data fix:oscal_responsible_parties 刪除 26 筆 broken role(manager/reviewer/auditor/viewer)。

## 本 Session 目標:C2.1(11 個 SSP-scoped endpoints)

### 必讀文件

1. CLAUDE.md(已自動載入)
2. docs/features/FR-011.3-2605-ssp-edit-in-project/README.md(tracker)
3. docs/features/FR-011.3-2605-ssp-edit-in-project/design-C2.md
4. docs/features/FR-011.3-2605-ssp-edit-in-project/implementation-plan-C2.md(Batch 1 部分)

### C2.1 工作範圍(11 個 endpoint)

**前置**(sequential,其他 endpoint 都依賴):
- T1:`SspProjectResolver` + `require_ssp_manager` helper + 新 error codes
- T2.1:`module_frame_party_service` 抽 base method(ssp_id 參數化)
- T2.2:`module_frame_ssp_resources_service` 抽 base method

**Endpoint 實作**(T1+T2 完成後可分兩組平行):
- T3:`/ssp/<ssp_uid>/parties` 4 個 endpoint(GET list / POST / PUT / DELETE)
- T4:`/ssp/<ssp_uid>/ssp-resources` 4 個 endpoint
- T5:`/ssp/<ssp_uid>/system-characteristic` GET + PUT 2 個
- T6:`/projects/<uid>/current-ssp-uid` GET 1 個

### Pre-flight(開工前必跑)

```bash
# 1. 確認 C1 seed 已在 DB
PGPASSWORD='jedi@123!' psql -h 192.168.50.188 -p 25432 -U cmmgr -d guidant_ai_dev \
  -c "SELECT COUNT(*) FROM system_menus WHERE \"group\" = 'ssp_party_role';"
# 預期:9

# 2. 確認 MF service 內部已是 SSP scope
grep -n "scope_type.*ssp\|scope_id=ssp" \
  app/module_frame/service/module_frame_ssp_resources_service.py \
  app/module_frame/service/module_frame_party_service.py | head -10

# 3. 確認 GrcErrorCode 下一個可用序號
grep -E "GRC_4[0-9]+" common/code/grc_error_code.py | tail -10

# 4. 確認 ProjectAssessmentPlanMapping 反查路徑
grep -rn "ProjectAssessmentPlanMapping" domain/ infra/ --include="*.py" | head -5

規範提醒

  • Route 不做 DB 查詢;權限檢查在 app service 層透過 require_ssp_manager
  • 每個 public method 都要有 @transaction
  • 新 error code 格式:GRC_<HTTP狀態碼><序號>(pre-flight 確認下一個空號)
  • git add 只加指定檔案(不用 -A 或 -am)
  • 每個 T 各自 commit,不要批量塞一個 commit
  • 每個 commit 後更新 README tracker 的 C2 行

完成後

  • README tracker C2 行狀態改為 shipped + commit hash
  • 建立 changelog:docs/changelog/2026-05-22-feat-ssp-project-endpoints-c2-1.md
  • 遇到 design 沒覆蓋的情境 → 停下問 user
§1

Branch

feature/ssp-import-export-phase3(目前所在 branch)

§2

DB 連線

PGPASSWORD='jedi@123!' psql -h 192.168.50.188 -p 25432 -U cmmgr -d guidant_ai_dev