本卡屬 FR-143(母卡見上一張),第 1 棒:jedi-oscal-v2 匯出修四處不合規、jedi-compliance-audit 守門從「全部結案」改「計畫齊全」、task 形狀改成對應系統任務。後面三棒都靠這棒的 task 形狀,先跑。

這一棒在做什麼(白話)

改善計畫的資料照 OSCAL 標準存在三層表(風險 → 處置計畫 → task)。現在匯出的 JSON 用官方 schema 驗會失敗:task 沒帶到期日和負責人、引用 finding 時塞了一個自創的鍵、檔案裡引用的 finding 和 risk 清單是空的、task 多了標準沒有的狀態欄。這棒把這四處修掉。另外流程現在要等「每個里程碑都完成」才能往下走,改成「每個任務都排好計畫」就放行。task 的意義也要改:一筆 task 對應一個系統任務(流程),存那個流程的 uid、執行人員清單、到期日、改善措施。

在哪裡

pkg/jedi-oscal-v2/jedi_oscal_v2/app/service/io/oscal_io_service.py:1538  _risk_to_json(mitigating-factors 留空即可)
pkg/jedi-oscal-v2/jedi_oscal_v2/app/service/io/oscal_io_service.py:1564  _remediation_to_json
pkg/jedi-oscal-v2/jedi_oscal_v2/app/service/io/oscal_io_service.py:1584  _milestone_to_task_json  ← 沒帶 timing/responsible-roles
pkg/jedi-oscal-v2/jedi_oscal_v2/app/service/io/oscal_io_service.py:1600  _export_poam  ← findings[]/risks[]/observations[] 空
pkg/jedi-oscal-v2/jedi_oscal_v2/app/service/io/oscal_io_service.py:1685  _poam_item_to_json  ← related-findings 塞 finding-id
pkg/jedi-oscal-v2/jedi_oscal_v2/infra/model/poam/oscal_poam_milestone.py  task 表:task_type/title/description/assignee_user_id/target_date/status/completed_at/props
pkg/jedi-compliance-audit/jedi_compliance_audit/app/service/audit_round_pass_transitions.py:96  _close_on_pass:all_items_closed 不成立拋 GRC_POAM_NOT_ALL_CLOSED
pkg/jedi-compliance-audit/jedi_compliance_audit/app/service/poam_app_service.py:421  all_items_closed;:434 earliest_milestone_dates;:449 milestones_by_control(493 行,可加但接近上限)
compliance-manager-be/common/code/flow_control_error_code.py:109  GRC_POAM_NOT_ALL_CLOSED 文案

怎麼修

先查再寫:party 反查用既有 matched_user_id 機制(app/oscal/service/ssp_docx_import_app_service.py:_enrich_party_user_org_names 是反向例子);props 讀寫已有 JSONB 欄;不要另開表。

要寫測試

手測