FR-038 — Wave 1 SUMMARY + Wave 2 Handoff(自包含,可冷接)

日期:2026-06-14 · branch(三 repo 皆):feature/oscal-refactor · 皆未 push 給下個 session:Wave 0(契約)+ Wave 1(jedi-oscal-v2 套件)已完成。本文件讓你冷接 Wave 2(主專案 BE 遷移)


§0 TL;DR

  • Wave 0 契約 ✅ 完成(schema delta + design + plan,皆過審查)。
  • Wave 1 套件 jedi-oscal-v2 ✅ 完成:42 表 + 全核心邏輯 + snapshot/clone + CMMC 匯入 + OSCAL JSON 匯出,194 tests 全綠,最終 review Approved。
  • ⚠️ 現狀:dev DB 的 oscal schema 已 drop & 重建成新結構;但主專案 BE 仍跑舊 jedi-oscal 0.0.22 → dev 的 OSCAL 功能目前是壞的,要 Wave 2 把 BE 遷到新套件才恢復。
  • Wave 2 = 大遷移:115 檔 import 舊套件,估 62-81h。需先寫 Wave 2 implementation-plan + 補完整 API 契約,再執行(建議獨立 session)。

§1 已完成成果座標

Wave 0 契約(主專案,commit dad80aef + 471862d8,已 commit 未 push)

Wave 1 套件(~/Projects/Jedicogy/module/jedi-python-package/jedi-oscal-v2/,57 commits,未 push、未發 Nexus)

  • 42 model + 23 app/domain service + 194 tests(DEV DB round-trip)
  • import 名 jedi_oscal_v2;base class 來自 jedi-commonBaseRepositoryImpl[Entity,Query,Model,Mapper]Base/BaseModeltransaction
  • 對外 service(主專案 Wave 2 import 點):FrameworkService / CatalogService / ProfileService(+resolve_profile)/ SspService(+deep_clone_ssp) / AssessmentPlanService(+generate_draft) / AssessmentResultService / AssessmentRiskService / PoamService(+generate_from_findings) / RemediationService / OscalSnapshotService(snapshot_ssp/clone_resource_library) / OscalIoService(export_oscal) / ports.oscal_parser_factory.get_oscal_parser_adapter
  • 重要 pattern 決策(沿用):id-only 表 entity 帶 uid: Optional[str]=None sentinel(BaseRepositoryImpl.update 讀 entity.uid);uuid-identity 用 mapped_column("uuid", PG_UUID, key="uid");FK-to-built→真 FK + 模組頂 import target,FK-to-unbuilt→plain BigInteger;app service 不加 @transaction(caller 開 scope);測試用 tests/conftest.py rollback-isolated db_session(set app.is_super_admin='t' 繞 RLS)

dev DB 狀態

  • oscal schema = 新結構(48 表:base 42 + delta 6),compliance.project_audit_rounds 在、3 條 FK 在、CHECK 在
  • public.schema_migrations 已記 2 筆(base + delta)

§2 Wave 2(BE 遷移)冷接資料 —— 這是你要做的

§2.1 規模(discovery 盤點結果)

  • 115 檔 import 舊 jedi_oscal(api 6 / app 50 / infra 30 / domain 25 / DI 4)
  • 分類:Type A(改 import+呼叫,~40 檔)/ Type B(改簽名+業邏輯,~30 檔)/ Type C(整段重寫,4-6 檔)
  • 估 62-81h

§2.2 Type C 核心重寫點(最高風險)

  1. app/project/service/oscal_project_service.pystart_oscal_project() 拆成 start_project(clone 資源庫三件組,AP/AR 不在此建)+ launch_new_round(建 round → snapshot SSP → 建/沿用 AP+AR per engagement)
  2. di_containers/oscal/oscal_containers.py — 150+ 行,31+ 套件 service/repo 重新註冊(舊 → jedi_oscal_v2
  3. infra/grc/repository/grc_audit_repo_impl.py — AR 從單行 verdict 改 AO 全量矩陣 查詢(8+ 個 OscalAssessment* query 全改)
  4. 關鍵 FK 改向:project_assessment_plan_mapping(AP→ project_audit_rounds)、assessment_plan_task_workflow_mapping(task→ ?需對齊新 ap_tasks)、ssp_reference_documents.context_id

§2.3 DROP CASCADE 待重建(已查證)

  • compliance.assessment_plan_extensions 的 FK fk_ape_assessment_plan → 被刪。可一行 ALTER 重建(target oscal.assessment_plans 還在)但先確認此表在 project_audit_rounds 模型下是否還需要(可能被取代);重建前先查 orphan。
  • public.vw_user_job_queue(My Jobs 資料源,scripts/sql/view/vw_user_job_queue.sql)→ 被刪,不能 replay:它 join 的 4 張舊 AP 表(assessment_plan_task_workflow_execution_mapping / assessment_plan_controls / assessment_plan_groups / assessment_plan_tasks)在新 schema 都沒了。要對新 oscal.ap_tasks + public.workflow_execution_control_mapping 重寫。ORM mirror infra/participant/model/vw_user_job_queue.py + consumer infra/participant/repository/task_assignee_repo_impl.py 要跟著新 column set 改。

§2.4 Q1 任務執行綁定(記得)

job 綁「專案 SSP 控制項」、專案成立就建、與輪次無關(不是綁 AP task)。舊 project-start 為 AP task 建 workflow 的邏輯要改成為 SSP 控制項建。

§2.5 建議 Wave 2 執行順序

  1. 前置(序列):DI 容器遷移(但因 115 檔還 import 舊套件,DI 不能孤立切換 —— 要跟 Type A 批次一起)+ 重建 fk_ape(若保留)+ 重寫 vw_user_job_queue
  2. 補完整 API 契約(design §5 目前只有路由骨架)→ 解鎖 FE 平行
  3. Type A 批次(可平行)→ Type B → Type C(序列重寫,每個全 e2e 測)
  4. FE(Wave 3)用「垂直功能管線」跟在對應 BE 端點後(B4→C1、B5→C2…),非全平行

§3 全域 follow-up / 已知問題

  • 套件待發 Nexus(feature 全完成 + user 明示才 bump+推;屆時主專案 pin 版本 + 還原 pyproject path-dep 一起 commit)
  • 主專案 pyproject.tomljedi-oscal-v2 path-dep 是 dev-only,未 commit(刻意)
  • generate_from_findings 無 idempotency guard → Wave 2 caller gate 在 AR 定版後
  • deep_clone_ssp 子表 audit-user 沿用 source(cosmetic,Wave 2 可加 curr_user param)
  • OscalIoService POA&M export query dispatch 靠 repo class 名 substring(fragile,Wave 2 可改傳 query class)
  • D5 ISO 整合(risk_accepted deviation / L1⊂L2 / SoA 自選排除)全部 follow-up
  • D7 正式環境(stg/poc/prod)schema 遷移策略未定(dev 用 drop&rebuild;正式不能這樣)

§4 規範文件齊全度

  • ✅ changelog:docs/changelog/2026-06-14-feat-fr038-wave1-jedi-oscal-v2-package.md
  • ✅ 本 SUMMARY/handoff
  • ⏳ conversation-history 歸檔(本 session JSONL extract)— 收尾流程進行中
  • ⏳ memory feedback(本 arc 教訓)— 收尾流程進行中
  • ⏳ Notion 任務 — 收尾流程進行中
  • ⏳ Wave 2 implementation-plan + 完整 API 契約 — 下一步(step 2)