FR-038 Wave 2 — 主專案 BE 遷移 Implementation Plan

For agentic workers: 用 superpowers:subagent-driven-development 逐 task 執行。Steps 用 - [ ]。 上游:Wave 1(jedi-oscal-v2 套件)已完成,見 handoff。契約:design.md + oscal-v2-deltas.sql + api-contract.md

Goal: 把主專案 compliance-manager-be 從舊 jedi-oscal 0.0.22 遷移到 jedi-oscal-v2,落地新業務流程(專案成立 clone 三件組、稽核輪次 project_audit_rounds、AP 延後到輪次、AR AO 全量矩陣、整改三層),讓 dev BE 從「新 schema + 舊 code 壞掉」恢復成可運作的新架構。

Architecture: ~110 檔(live grep 2026-06-14 = 109 source 檔,含 test 約 115)分 Type A(改 import+呼叫)/ B(改簽名+業邏輯)/ C(整段重寫)。DI 容器一次切換到 v2、同批改所有 consumer。新增 project_audit_rounds 為輪次 first-class。重建 DROP CASCADE 掉的 FK/view。

Tech Stack: Flask + SQLAlchemy 2.0 + PostgreSQL(DDD),jedi-oscal-v2(path-dep dev),pytest(test/)。

Scope: 只 BE(主專案)。FE 是 Wave 3。估 62–81h。


§1

0. Pre-flight(每個 task agent 開工必做)


§2

1. 遷移順序(依賴鏈,大部分序列)

Phase 2.0 前置(序列瓶頸)
  ├─ 2.0a DI 容器切換 v2 + Type A 批次改 import(一起做,否則 DI 一切就全壞)
  ├─ 2.0b 重建 / 廢棄 compliance FK(fk_ape)
  └─ 2.0c 重寫 vw_user_job_queue(對新 ap_tasks)
       ▼
B1 框架 + 資源庫 API 對齊新套件 ── 相對獨立,可與 B2 並進
       ▼
B2 專案成立流程重寫(clone 三件組,AP/AR 延後)   ← Type C
       ▼
B3 SSP 維護 + 啟動稽核 snapshot + project_audit_rounds 狀態機   ← Type C
       ▼
B4 AP 後端(草稿生成 + CRUD + subjects)
       ▼
B5 AR(AO 全量矩陣 + 風險總結)+ POA&M(整改三層 + 結案/覆核)   ← Type C
       ▼
Phase 2.Z 全 e2e(精誠機械 CMMC 劇本)+ baseline 零回歸

能平行的:Type A 批次(純改 import)可多 agent 分檔平行;B1 與 B2 可並進。必序列的:2.0a(DI 一切)、B2→B3→B5 的業務鏈、Type C 重寫。


§3

Phase 2.0 — 前置(序列,必先完成)

Task 2.0a: DI 切換 v2 + Type A 批次改 import

⚠️ 本段「~40 檔 import-rename」框架已被 2026-06-14 驗證推翻 —— v2 是結構性重寫(domain-service 層收掉、AO/AP-task/AR-data 表結構全變),且新舊套件 ORM model 撞同一 MetaData 無法共存(全切被強制、無 booting 中間態)。2A 正解是 gut-and-disable(v2 primitives 接真、B1~B5 業務面乾淨 disable、My Jobs 重寫),不是 import-rename,也不是 stub-everything。完整修正版執行計畫見 handoff/2026-06-14-2A-corrected-gut-and-disable-handoff.md(含 boot 必經面清單 / v2 wiring map / disable 手法 / My Jobs 重寫 / boot 驗證指令)。

Files: di_containers/oscal/oscal_containers.py實際 1074 行,verified —— 是 Phase 2.0 最大單一工作量,別照舊估的 150 行排程)+ ~40 Type A 檔(infra model/mapper/repo、domain entity import)

Task 2.0b: compliance FK 重建 / 廢棄判定 ⛔ USER-DECISION GATE,不要自己決定

Files: 新 migration scripts/sql/2026-XX-XX-fr038-wave2-rebuild-fk.sql

    • 我的建議(給 user 參考):新架構輪次/AP 關聯已搬到 project_audit_roundsassessment_plan_extensions(module_frame_id/owner_id 等 AP 延伸)很可能被 project_audit_rounds + project_extensions 取代 → 傾向 DROP;但需 grep 確認其 live consumer(grep -rl assessment_plan_extension app/ infra/ domain/)零引用才能 DROP。

Task 2.0c: 重寫 vw_user_job_queue

Files: scripts/sql/view/vw_user_job_queue.sql(重寫)+ infra/participant/model/vw_user_job_queue.py(ORM mirror 跟著改)+ consumer infra/participant/repository/task_assignee_repo_impl.py


§4

Phase B1 — 框架 + 資源庫 API 對齊(可與 B2 並進)

Files: api/module_frame/app/module_frame/service/*、相關 repo


§5

Phase B2 — 專案成立流程重寫(Type C)

Files: app/project/service/oscal_project_service.py(核心重寫)+ api/project/routes/project_route.py


§6

Phase B3 — SSP 維護 + 啟動稽核 snapshot + 輪次狀態機(Type C)

Files: app/oscal/service/*(SSP)、新 app/grc/service/audit_round_service.pyapi/grc/routes/


§7

Phase B4 — AP 後端

Files: app/grc/service/*api/grc/routes/assessment_plan_route.py


§8

Phase B5 — AR(AO 全量矩陣 + 風險總結)+ POA&M + 結案/覆核(Type C)

Files: app/grc/service/audit_service.pyinfra/grc/repository/grc_audit_repo_impl.py(重寫)、app/grc/service/poam_service.pyapi/grc/routes/{audit_route,poam_route}.py


§9

Phase 2.Z — 整合驗證(序列收尾)


§10

2. 風險與注意

  • DI 一切性:2.0a 沒一次切乾淨會讓整個 BE import 炸 —— Type A 批次要跟 DI 同 PR 完成才能起 BE。
  • 舊表沒了:consumer 引用舊 assessment_result_datas / catalog_control_assessments / 舊 AP 子表的,要改對新結構(Type B/C),不是改 import 就好。
  • 跨 schema FK 字串帶 schema 前綴(記憶 feedback_cross_schema_fk_must_qualify)。
  • 套件 docx/excel 匯入是 follow-up:B1 若需要 SSP 匯入,要嘛先補套件、要嘛暫接舊路徑——開工前確認。
  • 正式環境(D7):dev 用 drop&rebuild,stg/poc/prod 遷移策略未定,上正式前必須有可移植 migration(不能 drop schema)。
  • 每個 Type C 完成各自全 e2e,不要堆到最後。