SSP OSCAL Alignment — Phase 3 / Phase 4 接手 Handoff — 2026-05-25

項目 內容
接手範圍 Phase 3(Excel/Docx 樣板重設計)+ Phase 4(FE preview UI 重設計)
起點 commit(主專案) d12bd705(feature/ssp-oscal-alignment branch;30 commits ahead of origin,全 local 未 push)
起點 commit(jedi-oscal) Phase 1 ship 全 local(18 commits ahead)
Phase 1+2 收尾 SUMMARY docs/features/FR-028-2605-ssp-oscal-alignment/handoff/2026-05-25-phase1-phase2-FINAL-SUMMARY.md
建議切法 先 Phase 4 → 再 Phase 3 → 最後處理 Bug C / L1 套件進版 — 理由見 §3
預估天數 Phase 3: 4d(design.md §3)+ Phase 4: 5d(design.md §4) — 兩 phase 可有重疊(Phase 4 不依賴 Phase 3 Excel 改完)

0. 一句話結論(接手者最先看這段)

user 在 template-edit 看不到 import 結果 = Phase 4 沒做。Phase 1+2 已把 BE 寫對(DB 4 新表 + RLS + ConfirmService pipeline),但 FE template-edit 5-tab 還是舊架構(讀 jedi_device / jedi_information_system 舊概念表)→ user 看到「外部利用服務 (1)」「設備 (0)」「資訊系統 (0)」,4 個 components 在 FE「不存在」。要 demo readiness,先做 Phase 4。


1. 必讀文件清單(按順序)

# 文件 為何讀 重點段
1 docs/features/FR-028-2605-ssp-oscal-alignment/handoff/2026-05-25-phase1-phase2-FINAL-SUMMARY.md 知道 Phase 1+2 ship 了什麼 / 留了什麼 leftover §7.4(Hotfix)/ §8(Leftover)/ §9(demo gap)
2 docs/features/FR-028-2605-ssp-oscal-alignment/design.md §3 + §4 Phase 3 + Phase 4 scope §3.1-§3.3 Excel/Docx 樣板;§4.1-§4.4 FE Tab 重設計
3 docs/features/FR-028-2605-ssp-oscal-alignment/design.md §11.13 / §11.16 / §11.17 Phase 2 留下的 reconciliation + 教訓
4 domain/oscal/import_pipeline/normalizer.py 理解 v2-bundle dict shape(Phase 3 Excel parser 要產出這個 shape)
5 domain/oscal/adapter/cmmc_ssp_adapter.py adapt_to_bundle() Docx 端 v3 輸出 reference(Phase 3 Excel parser mirror 這個) 該方法
6 app/oscal/service/ssp_excel_import_app_service.py _apply_content_overrides() Phase 4 開工前要 fix 的 Bug C — Excel 怎麼做的,docx 要 mirror line 1242-1370
7 app/oscal/service/ssp_docx_import_app_service.py _run_v2_bundle_confirm() Bug C 要改的入口 line 697+
8 domain/oscal/service/ssp_shell_service.py Bug A fix 抽出的新 service,Phase 4 可能會用到
9 FE repo ~/Projects/Billows/Audit-Manager/compliance-manager-fe src/views/template-edit/(Phase 4 才需要) Phase 4 改 FE 時的對應路徑 找 5-tab 元件

Conversation historydocs/conversation-history/2026-05-24/ssp-oscal-alignment-phase2/ + .../ssp-oscal-alignment-phase2-closeout/(後者是 Phase 2 收尾 + Bug A + RLS hotfix 的 raw dump)。


2. Phase 3 + Phase 4 範圍速覽

2.1 Phase 3 — Excel/Docx 樣板重設計(design.md §3)

子段 範圍 影響
§3.1 Excel sheet 重組 04_設備 → 04_資產清冊;06_外部利用服務 → 06a_元件清冊 + 06b_利用授權;05_資訊系統刪除 TEMPLATE_VERSION 0.x → 3.0.0(major bump)
§3.2 Docx 樣板加表 H2 System Components / Hardware Maintenance / Leveraged External Systems 三段加表 + 加 anchor 進 docx_section_extractors.py Docx 樣板 .docx 檔要實際編輯
§3.3 Reference template 重產 scripts/regenerate_reference_templates.py 跑 v3.0.0 測試 fixture 重產
§3.X Excel parser fix(從 §11.13 帶出來) domain/oscal/parser/excel/cmmc_excel_parser.py 輸出 parsed_result["schema_version"] = "v2-bundle" + components / leveraged_authorizations / inventory_items 三 list(mirror Docx Task 8 adapt_to_bundle Excel import 從 412 → 200 + 寫入新表

Phase 3 唯一阻擋條件:Excel parser fix 必須在 §3.1 sheet 改完後做(parser 要對應新 sheet 名)。

2.2 Phase 4 — FE preview UI 重設計(design.md §4)

子段 範圍
§4.1 Tab 結構 舊 5 tab → 新 5 tab:[基本資料][受評標的][參與人員][元件 + 授權 + 資產][控制項];第四 tab 全新
§4.2 第四 tab 內部結構 3 sub-panel:元件清冊 DataTable / 利用授權 Card list / 資產清冊 DataTable;leveraged_auth ref 用 VLOOKUP-style chip
§4.3 元件 component 主 component 重設計 SspComponentsLeveragedInventoryTab.vue 取代 LeveragedSection.vue(廢棄)
§4.4 Reuse excel preview component Excel side 既有 SheetPreviewLeveraged.vue 等 generalize 後 docx-import-v2 共用

Phase 4 唯一阻擋條件:BE 端 read API 必須能回新表內容。Phase 2 已 ship ssp_components / ssp_leveraged_authorizations / ssp_inventory_items 寫入;read endpoint 需要 audit 一遍。


3. 建議切法 — 先 Phase 4 → 再 Phase 3

3.1 為何先 Phase 4?

理由 說明
Demo readiness user 看不到 import 結果是當前最大痛點(§9 demo gap);Phase 4 才解
Docx 已能 import Phase 2 ship 後 docx import 全通;Phase 4 不被 Phase 3 卡
Phase 3 主要影響 Excel Excel import 從 412 → 200 重要但不阻擋 docx 端 demo
FE 改動 BE 配合度低 Phase 4 主要 FE work(template-edit 重寫),BE 端只需 audit read endpoints;可平行做

3.2 為何不先 Phase 3?

  • Phase 3 Excel sheet 重組要動既有 reference templates + 測試 fixtures,影響面大;做完仍解不了 demo gap。
  • Phase 3 §3.X Excel parser fix 確實重要,但 user 端可暫時「Excel 帶不進新表,請用 docx」workaround;Phase 4 之後再做。

3.3 開工順序建議(user 拍板「衝一下 3, 4」的最佳路徑)

Step 1 → Phase 4 開工前必做:fix Bug C(v2-bundle confirm 套 content_overrides,見 §4.2)
Step 2 → Phase 4.1 + 4.2 + 4.3 FE template-edit 重設計(5d)
         同時 BE 端 audit read endpoints 對 4 張新表(半天,並行)
Step 3 → 確認 user 在 template-edit 能看到 docx import 結果 → demo readiness 解鎖
Step 4 → Phase 3.X Excel parser fix(恢復 Excel import 200)
Step 5 → Phase 3.1-3.3 Excel/Docx 樣板重設計(含 TEMPLATE_VERSION bump)
Step 6 → 全 ship 完,user 拍板 → L1 jedi-oscal 0.0.18 → 0.1.0 bump + push(§5)

4. 開工前必處理(Phase 4 第一個 commit 前)

4.1 Bug B — docx import 5 parties 全 skip → 0 parties 寫入

項目 內容
推測 FE diff stepper 預設 decision=skip;user 沒手動切換就 confirm → BE 全 skip 是正確行為
Phase 4 必做 (a) FE 重設計時把 party diff 預設改 accept 或加 highlight;(b) BE 端 audit response 顯示的 decision distribution;(c) 釐清 user 在 UI 上看到的 vs BE 收到的 payload 是否一致
不能直接「accept by default」 風險:user 沒看 diff 就誤寫資料;要 UX 一起設計(pre-select all + visible counter)

4.2 Bug C — v2-bundle confirm 路徑沒套 content_overrides

這個必須先 fix,不然 Phase 4 FE 改 preview UI 後 user 編輯不會生效,整個 Phase 4 demo 失敗

項目 內容
症狀 user 在 docx preview UI 改 component 類型 / LA 欄位 → submit 後 DB 仍是 parse 時原值
Root cause ssp_docx_import_app_service._run_v2_bundle_confirm 入口直接 dict_to_bundle(parsed_result["bundle"])沒套 content_overrides。對比 Excel side ssp_excel_import_app_service._apply_content_overrides 有完整 metadata / system_characteristic / sheet rows / controls overrides handling
Fix outline _run_v2_bundle_confirm 入口加 _apply_content_overrides_to_bundle() helper:拆 overrides 對 bundle.components / bundle.leveraged_authorizations / bundle.inventory_items 三 list 做 row-level update(mirror Excel _apply_content_overrides 的 sheet-row loop logic)
設計決策 Excel side override 是針對 parsed_result dict path(row_overrides[sheet_key][row_idx]);v2-bundle 已是 dataclass list → 要先決定 mapping 策略:(a) idx-based mapping(FE 送 {"components": {0: {...}, 1: {...}}});(b) uid-based mapping(用 ParsedComponent.uid_ref;目前 v2-bundle 的 uid_ref 是 parse-time 生成,前後一致)。建議 (b) — 安全(idx-based 對 normalize 後重排不抗壓)
Test tests/test_ssp_docx_import_app_service.py 加 case:preview 改 component type + LA title → confirm 後 DB 看到 override 後的值

4.3 Pre-flight checklist

# 1. 兩 repo branch:
git branch --show-current  # 預期 feature/ssp-oscal-alignment
git -C ~/Projects/Jedicogy/module/jedi-python-package/jedi-oscal branch --show-current

# 2. Dev DB Phase 2 final state(密碼請查 .env):
psql -h 192.168.50.188 -p 25432 -U cmmgr -d guidant_ai_dev -c "
SET app.is_super_admin='t';
SELECT
  (SELECT count(*) FROM oscal.ssp_leveraged_authorizations) AS la,
  (SELECT count(*) FROM oscal.ssp_components) AS comp,
  (SELECT count(*) FROM oscal.ssp_inventory_items) AS inv;"
# 預期: la=12, comp=341, inv=0

# 3. Smoke baseline:
tail -50 log/app.log              # 預期無 Traceback
pytest tests/test_ssp_docx_import_app_service.py  # 應綠(32 既有 + Phase 2 新加)

# 4. 驗 demo gap 是否還在(Phase 4 完成的 acceptance):
#    MF 62c31d47-a90e-40e0-98ae-cb0c164a8acc / SSP id=260
psql -h 192.168.50.188 -p 25432 -U cmmgr -d guidant_ai_dev -c "
SET app.is_super_admin='t';
SELECT id, uid, title FROM oscal.ssp_leveraged_authorizations WHERE ssp_id=260;
SELECT id, uid, title, component_type FROM oscal.ssp_components WHERE ssp_id=260;"
# 預期: 1 LA + 4 components — FE 改完 Phase 4 後 template-edit 第四 tab 必須全 4 個都看得到

5. 結尾必做(Phase 3+4 全 ship 後)

5.1 L1 — jedi-oscal 0.0.18 → 0.1.0 bump + Nexus push + 主專案 pin 還原

User 拍板才執行(見 §7.1 of 2026-05-25-phase1-phase2-FINAL-SUMMARY.md)。建議 Phase 3+4 ship 完一次處理 — 中間還會改 jedi-oscal(Phase 5 export 端)就再 bump 一次成本高。

5.2 兩 repo git push

兩 repo 都還 local(主專案 30 commits ahead;jedi-oscal 18 commits ahead)。Push 需 user 明確指示(per CLAUDE.md「push 永遠要 user 明確指示」)。

5.3 Phase 3+4 收尾文件

收尾時參照 Phase 1+2 SUMMARY 模板產出:

  • docs/features/FR-028-2605-ssp-oscal-alignment/handoff/<YYYY-MM-DD>-phase3-phase4-FINAL-SUMMARY.md
  • docs/changelog/<YYYY-MM-DD>-feat-ssp-oscal-alignment-phase3-phase4.md
  • design.md §11 補新增的 reconciliation entries
  • 對話紀錄 extract 到 docs/conversation-history/<YYYY-MM-DD>/ssp-oscal-alignment-phase3-4-{...}/

6. 精簡開工 prompt(直接複製貼)

你接手 SSP OSCAL Alignment Phase 3 + Phase 4。Phase 1+2 完整 SHIPPED(30 主專案 + 18 jedi-oscal commits,全 local 未 push)。

按以下順序讀文件:
1. docs/features/FR-028-2605-ssp-oscal-alignment/handoff/2026-05-25-phase1-phase2-FINAL-SUMMARY.md §7.4 / §8 / §9(必看 user-facing demo gap)
2. docs/features/FR-028-2605-ssp-oscal-alignment/handoff/2026-05-25-phase3-4-handoff.md(本文件 — 完整 Phase 3+4 範圍 + 建議切法 + Bug B/C)
3. docs/features/FR-028-2605-ssp-oscal-alignment/design.md §3(Phase 3)+ §4(Phase 4)+ §11.13 §11.16 §11.17
4. domain/oscal/import_pipeline/normalizer.py(v2-bundle dict shape)
5. domain/oscal/adapter/cmmc_ssp_adapter.py adapt_to_bundle()(Docx v3 輸出 reference)

開工前 pre-flight 跟 acceptance verify SQL 見 handoff §4.3。

建議切法:先 Phase 4(解 user-facing demo gap)→ 再 Phase 3(Excel parser fix + 樣板重設計)。

開工第一個 commit 前必做:
- Bug C fix(_run_v2_bundle_confirm 套 content_overrides)— Phase 4 demo 阻擋條件
- Bug B 釐清(5 parties 全 skip)— BE/FE 共查

收尾後(user 拍板):L1 — jedi-oscal 0.0.18 → 0.1.0 bump + Nexus push + 主專案 pin 還原 + 兩 repo git push。

附錄 A — 路徑速查

用途 路徑
Phase 1+2 FINAL SUMMARY docs/features/FR-028-2605-ssp-oscal-alignment/handoff/2026-05-25-phase1-phase2-FINAL-SUMMARY.md
本 handoff docs/features/FR-028-2605-ssp-oscal-alignment/handoff/2026-05-25-phase3-4-handoff.md
Spec v1.2 + §11 reconciliation 17 條 docs/features/FR-028-2605-ssp-oscal-alignment/design.md
Phase 1 plan docs/features/FR-028-2605-ssp-oscal-alignment/implementation-plan-phase1.md
Phase 2 plan docs/features/FR-028-2605-ssp-oscal-alignment/implementation-plan-phase2.md
Import pipeline 共用 module domain/oscal/import_pipeline/
Docx adapter domain/oscal/adapter/cmmc_ssp_adapter.py
Docx app service app/oscal/service/ssp_docx_import_app_service.py
Excel app service app/oscal/service/ssp_excel_import_app_service.py
SspShellService(Bug A fix 抽出) domain/oscal/service/ssp_shell_service.py
Conversation history docs/conversation-history/2026-05-24/ssp-oscal-alignment-phase2{,-closeout}/
FE template-edit(Phase 4 主戰場) ~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/views/template-edit/