FR-041 稽核結果(AR)填寫優化 — 實作計畫

設計見同夾 design.md。原則:先文件後 code;每階段先跑 pre-flight 驗假設再動。 實作序 A → B → C(C 依賴 A);每階段 user 手測通過才進下一階。AR 是敏感管線,逐塊上、不一次全炸。

§1

Phase A — 繼承 AP 查核指引進 AR(小、零破壞先行)

A.0 Pre-flight

  1. AR control detail / findings API 餵 FE 中欄的資料路徑assessment_result_app_service.get_findings 與 control-detail 端點回什麼;FE AuditControlRefcontrolDetail/controlMeta 從哪來(決定規劃指引塞哪個欄位回前端)。
  2. AR init 現況init_ar_matrix_for_round / _assessment_log_from_tasks 實際 echo 哪些;AP activities(steps/props/related_controls)怎麼依控制項取(control-id 對 activity.related_controls)。
  3. snapshot 落點:規劃脈絡塞 assessment_log entry vs 新 planning_context JSONB —— 傾向不動 schema(塞 assessment_log 或 detail API 即時組)。確認 AR 是否要「凍結」規劃(snapshot)還是「即時讀 AP」(若 AP 已凍結則即時讀亦可)。

A.1 BE

  • AR 讀取依控制項回傳規劃脈絡:{control_id: {methods, guidance:[{method, description}], subjects}},由 AP activities 組(steps→guidance、props→methods、related_controls→control 對應)。
  • 落點依 A.0.3:優先在 control-detail/findings API 即時組(不動 schema);若要 snapshot 才寫 AR init。

A.2 FE

  • AuditControlRef 加「規劃查核指引」區(唯讀):方法 chip + 各方法指引文字。
  • 資料接 A.1;i18n 補標題(zh-tw + en)。

A.3 測試 + 驗收

  • BE:規劃脈絡組裝(含無指引/無 AO fallback)單元測試。
  • 手測:判定頁選控制項 → 中欄看得到 AP 規劃的方法 + 指引。
§2

Phase B — 缺失 → 風險 → 矯正打通

B.0 Pre-flight

  1. Risk 模型欄位:jedi_oscal_v2 risk/AR risk entity 有哪些欄(severity 確定有;驗有無 remediation/影響欄);既有 risk 端點 payload(POST /risksPUT /risk/{uid}/risk/{uid}/findings)。
  2. POA&M 生成路徑poam_app_service close round 生成 POA&M 時讀 finding 還是 risk、帶哪些欄(決定矯正建議/嚴重度怎麼流進去)。
  3. finding↔︎risk link:既有 risk.linked_findings 機制(FE notMetControls → risk sources)。

B.1 BE

  • risk 加「矯正建議 / remediation」承載(schema 有欄用欄、無則 props 或套件補;對齊 OSCAL risk.remediation/POA&M item)。
  • POA&M seed 讀 risk 的 severity + remediation(依 B.0.2)。

B.2 FE

  • 判定區 not_met → 就地展開風險小表單(嚴重度 + 風險/影響描述 + 矯正建議);存判定一併 upsert risk + link 該 finding(沿用既有端點)。
  • 「風險」分頁保留為總覽。

B.3 測試 + 驗收

  • BE:risk remediation 存讀;POA&M seed 帶 severity/remediation。
  • 手測:判定 not_met → 就地開風險+矯正 → 風險分頁/POA&M 看得到。
§3

Phase C — 觀察引導化(依賴 A)

C.0 Pre-flight

  1. observation 端點/欄位POST /observations(description/methods/subjects/relevant_evidence)能否標記「對應哪個規劃方法」(用 methods 即可?需 props?)。
  2. evidence 來源loadEvidence(job 檔/問卷/Drive)的結構,作為「證據引用」下拉母體。

C.1 FE(主要)

  • 右欄觀察區改:照 A 帶進的規劃方法逐項列「看到什麼 + 證據引用 + 對象」;存 observation(methods 預填該項)。保留額外自由觀察入口。

C.2 BE

  • 原則零新欄(沿用 observation);必要時 props 標記規劃方法對應。

C.3 測試 + 驗收

  • 手測:照規劃方法逐項記觀察+證據 → 重整還原 → finding 連結正確。
§4

DB / 套件異動(全 feature)

  • 目標零新表;A 傾向不動 schema(即時組規劃脈絡)。
  • B 若 risk 缺 remediation 欄 → jedi_oscal_v2 補(dev symlink/path-dep,發版等 user 明示)。
  • C 原則零 schema。
§5

收尾(每階段 user 下令才做)

  • changelog(type=feat)各階段一份:A 繼承指引 / B 風險矯正串接 / C 觀察引導化。
  • design.md §10 狀態更新;Notion 任務;push 等 user。