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


§1

一句話總結

把 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 落地。


§2

變更範圍(按主題)

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)

§3

跨 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)

§4

規範文件齊全度盤點

項目 狀態 路徑
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

§5

部署 handover

需重啟 BE

  • 動到 jedi-oscal entity(dev 走 poetry path dep)
  • BE service / DI / repo / SQL migration

SQL migration(待跑)

# 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)

§6

已知 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 保留 保留中, 看是否有外部連結

§7

收尾結論

本 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 / 觀察期 / 等明確需求才動的範疇。