# Phase C + D 收口 SUMMARY — 2026-05-23

> Branch：`feature/ssp-import-export-phase3`（沿用 phase2 延伸）
> 跨 repo：compliance-manager-be / compliance-manager-fe / jedi-oscal
> 一日完成：原 Session 4 handoff 接 smoke test 後一路追加 Phase D / B / Settings 整合 / leveraged 結構化 / cleanup

---

## 一句話總結

把 Session 4 預期的「smoke test 驗收 + 收尾」 task arc 擴大成「SSP tab UX 大改 + Project Settings 整合 + leveraged 結構化 + 多 bug fix + Phase E cleanup」一日完工，跨 3 repo 共 40+ commits，總共 5 個主題、1 份 batch changelog 落地。

---

## 變更範圍（按主題）

### 1. Phase D — SspTabPanel 重寫

| 項目 | 改動前 | 改動後 |
|------|-------|-------|
| 容器 | Accordion + AP selector | TabView 6 sub-tabs, apUid 從 URL params |
| Tab 結構 | 8 個（含適用控制項 / 程序書文件池）| 6 個（受評標的 / 責任單位 / 責任人員 / 設備 / 資訊系統 / 外部利用服務）|
| Lazy | `:lazy="true"` → 進入才 mount, counts 滯後 | `:lazy="false"` → 立即顯示 counts |

### 2. 受評標的 UX（前「基本資料」/「範圍概要」）

- Tab 改名：基本資料 → 範圍概要 → 受評標的（兩輪迭代）
- 加 intro block + 各欄位 placeholder / hint（中性化系統 → 範圍）
- 預設值：FIPS 分類 = high（BE `_empty_placeholder` 同步）/ status = active
- 範圍負責人 Dropdown（從 menuStore.userMenu 拉，不再手填 UID）

### 3. 外部利用服務結構化（leveraged provider + category + status + purpose）

| 層 | 改動 |
|----|------|
| jedi-oscal | OscalSspSystemImplementationItem 加 provider VARCHAR(255) + category VARCHAR(50) (commit `8de7991`) |
| BE migration SQL | `scripts/sql/2026-05-23-add-leveraged-provider-category.sql` (cmmgr 執行避 RLS) |
| BE service | SspLeveragedContextService add/update/list/_to_dict 都 wire 5 個新欄位 |
| BE Excel 06 sheet | SHEET_LEVERAGED 加 category column + 6 enum + i18n header |
| FE form | 4 欄位 → 7 欄位（類別 / 名稱 / 供應商 / 日期 / 狀態 / 用途 / 描述）, party_uuid 隱藏 |

### 4. Phase B — Generalize MF panels

| Panel | 加 prop |
|-------|--------|
| ModuleFramePartiesPanel | apiBase + scopeUid + loadFn/invalidateFn(cache hook) |
| ModuleFrameSspDevicesPanel | apiBase + scopeUid + apiRoot computed |
| ModuleFrameSspInfoSystemsPanel | 同上 |
| ModuleFrameDocumentPoolPanel | apiBase + scopeUid + MF/SSP path branch |

Service 80% 可複用（C5 §2.3 設計目標達成）。

### 5. Project Settings 整進專案規劃頁（5 flat tab）

- 抽 3 個 panel：`src/components/grc/project/{ProjectBasicInfoPanel,ProjectParticipantsPanel,ProjectCloudIntegrationsPanel}.vue`
- ProjectPlanningView 改 5 個頂層 tab：控制項實作 / 系統安全計畫 / 專案基本資訊 / 專案參與人員 / 程序書管理 / 雲端整合
- 各 card 70% 水平置中
- 拿掉「專案設定」按鈕（重複入口）
- 拿掉批次維護內 OSCAL 匯出（先隱藏）+ 程序書管理（變 tab 後不需 menu 入口）
- 舊 `/project/projects/<id>/settings` route 保留可用

### 6. i18n / 命名統一

- 「AP」→「稽核計畫」（zh-tw 全 7 處）
- 「SSP」→「系統安全計畫」（zh-tw 全 31 處，跨 6 個 JSON）
- 「基本資料」/ 「範圍概要」→ 「受評標的」
- SSP / MF 內「單位 / 參與人員」→「責任單位 / 責任人員」（對齊 OSCAL responsible-parties）
- 專案層 tab：「參與人員」→「專案參與人員」（區分 SSP 層）
- MF template-edit 7 個 tab header i18n 化（hardcoded → t() call）
- 落地 `oscal-role.json` (9 個 OSCAL ssp_party_role)
- SspPartiesSection + ModuleFramePartiesPanel 全部改吃 `GET /system/menu/ssp_party_role` 並走 menuStore cache

### 7. Bug fixes（一次收尾 7 個）

| Bug | Commit | 根因 |
|-----|--------|------|
| PROJECT_CURRENT_SSP URL 漏 /grc/ → 偽 CORS | FE `7ada044` | URL prefix 漏掉 |
| system-characteristic GET 404 | BE `a84de39` | 新 SSP 沒 SC row, raise 改 empty placeholder + PUT auto-create |
| SspProjectResolver SQL varchar=integer | BE `638cc00` | AP.ssp_id 是 varchar 存 int 字串, 需 str() cast |
| 啟動專案後 SSP 沒 main row → 設備/系統 CRUD 撞 | BE `2f69db0` | `_setup_ssp_system_implementation` clone from template |
| Project create 自動帶入 mf parties 角色錯誤 | FE `012cfb3` | 預設 'viewer' |
| ODT 預覽失敗 | BE `61b71bf` | PDF preview whitelist 漏 odt/ods/odp/rtf |
| FIPS 預設值不對 | BE `aa98c15` | empty_placeholder high + active |
| DocumentPoolPanel 重複 import | FE `2b66adf` | 拿掉重複行 |
| SspBasicSection onMounted 沒 import | FE `ad2aeab` | 補 import |

### 8. Phase E cleanup

- 刪 5 個死 component：SspPartiesSection / SspScopeDevicesSection / SspScopeInfoSystemsSection / useSspContext / useSspResources
- 刪 102 個死 i18n key（77 個 project-planning + 25 個 ssp-edit）

---

## 跨 repo commit 清單

### jedi-oscal package
- `8de7991` feat(ssp-impl-items): provider + category 欄位

### BE main
- `638cc00` fix(ssp-resolver): str() cast
- `a84de39` fix(ssp-system-characteristic): empty fallback + auto-create
- `2f69db0` feat(project-start): clone main row + items from template
- `aa98c15` tweak(ssp-system-characteristic): FIPS=high / status=active 預設
- `61b71bf` fix(file-preview): ODT whitelist
- `18a1110` feat(leveraged): structural fields BE 全鏈條

### FE main（40+ commits）
- 範圍：`57caca2..8d80972` 之間，包含 Phase C/D/B/E + bug fixes + i18n 整理
- 最後一筆：`8d80972` docs(changelog): Phase C/D 大整理（本 batch changelog）

---

## 規範文件齊全度盤點

| 項目 | 狀態 | 路徑 |
|------|------|------|
| Batch changelog | ✅ | FE `docs/changelog/2026-05-23-feat-ssp-tab-phase-c-d-redesign.md` |
| Tracker 更新 | ✅ | BE `docs/features/FR-011.3-2605-ssp-edit-in-project/README.md`（加 D / B-generalize / Settings 整合 / Issue 1 BE / Bug fix collection / E 共 6 row）|
| Phase C 既有 design 文件 | ✅ | C1~C8 8 份俱在 |
| Phase D 設計 | ⚠️ ad-hoc（user 邊回饋邊改, 未事先 design.md） | 已寫入本 SUMMARY 表 |
| SUMMARY 收口 | ✅ | 本檔 |
| Conversation history extract | ⏸ pending（user 未明確要求） | 待 user 指示時用 `scripts/extract_claude_sessions.py` |

---

## 部署 handover

### 需重啟 BE
- 動到 jedi-oscal entity（dev 走 poetry path dep）
- BE service / DI / repo / SQL migration

### SQL migration（待跑）
```bash
# Dev 環境
psql -h 192.168.50.188 -p 25432 -U cmmgr -d guidant_ai_dev \
     -f scripts/sql/2026-05-23-add-leveraged-provider-category.sql
```
（已執行過, 此檔留作 staging / production 用）

### Dev DB 已 manual 修補項目
- SSP 254 補了 6 筆 leveraged sample data（CMMC reference doc 模擬）
- SSP 253 清掉了 6 筆混淆資料（DELETE FROM oscal.ssp_system_implementation_items WHERE id BETWEEN 631 AND 636 + main row）

### Smoke test 範圍建議
1. 新建專案啟動 → 進專案規劃 → 5 tab 都能載入
2. SSP tab 6 sub-tabs counts 正確
3. 受評標的 預設值 FIPS=high / status=active
4. 外部利用服務 7 欄位都能新增 / 編輯 / 刪除
5. ModuleFrame 編輯頁 7 個 tab i18n 正確
6. 切 en locale → 確認所有 i18n key 落地（沒缺 key）

---

## 已知 follow-up

| 項目 | 級別 | 狀態 |
|------|------|------|
| launch_new_round 流程是否需要走 `_setup_ssp_system_implementation` | 中 | 待跟進 |
| 既有 SSP（pre-Phase-C）的 main row backfill SQL | 小 | 看實際情況 |
| SspSystemImplementationContext.resolve_sys_impl_main_id None 時 auto-create | 小 | 目前是 raise GRC_SSP_RESOURCE_NO_SSP, 可改 auto-create |
| 多框架支援 Phase 2/3（label neutralization 之後的實際多框架）| 大 | 等接客戶 |
| jedi-oscal 正式 bump version 推 Nexus | 中 | 等 user 明確指示 |
| 範圍負責人 picker 改更通用（目前用 system_menus userMenu, 跟其他 picker 不同源）| 小 | low priority |
| Project Settings 舊 route /settings 移除 vs 保留 | 小 | 保留中, 看是否有外部連結 |

---

## 收尾結論

本 task arc 起點：Session 4 handoff 預期「smoke 驗收」；終點：Phase C 全 8 子題 shipped + Phase D 受評標的 UX 大改 + Phase B 4 panel generalize + Project Settings 整合 + leveraged 結構化 + Phase E cleanup。

整體 SSP-edit-in-project feature 至此可宣告 Phase C 完工，剩餘 follow-up 屬於 polish / 觀察期 / 等明確需求才動的範疇。
