2026-06-17。範圍:把生命週期最後兩階段(audit / poam)的 FE 遷到 v2 round-scoped, 並補上 AP → AR 溯源(assessment-subjects / tasks),依 OSCAL Assessment Results 模型。 user 拍板:全部一次做完;AR subjects 比照 OSCAL(result 層 child table)。
| 階段 | BE | FE |
|---|---|---|
| audit | ✅ v2 round-scoped 全 alive(`/audit-round/ |
finding |
| poam | ✅ v2 round-scoped alive(/audit-rounds/<uid>/poam-items、risks/<uid>/remediations、remediations/<uid>/milestones、close_round 強制 all_items_closed) |
❌ PoamView.vue AP-centric 打舊 GRC_POAM_LIST,無 round route |
AR 溯源缺口:add_result 只收 reviewed-controls;result 層無 assessment-subjects; observation.subjects / ar_results.assessment_log JSONB 欄存在但沒寫。
result 下平行陣列:reviewed-controls / assessment-subjects[] / assessment-assets / attestations / assessment-log(entry 可帶 related-tasks)/ observations[](每筆有 subjects[])/ risks[] / findings[]。本專案 findings/observations/risks 已是 FK→ar_results 的 child table → assessment-subjects 比照建 child table 即 OSCAL-faithful。
新增(mirror ar/oscal_ar_observation.* 的 FK→ar_results 結構 + ap/oscal_ap_assessment_subjects.* 的欄位):
infra/model/ar/oscal_ar_assessment_subjects.py — 表 oscal.ar_assessment_subjects: id PK / ar_result_id FK→oscal.ar_results.id NN CASCADE / sort_order / subject_type / subject_uuid / include bool / title / props JSONB / 審計欄domain/entity/ar/oscal_ar_assessment_subjects_entity.py + ..._query_entity.pyinfra/mapper/ar/ar_assessment_subjects_mapper.pydomain/repository/ar/ar_assessment_subjects.py(interface)+ infra/repository/ar/ar_assessment_subjects_repo_impl.py (get_by_ar_result(ar_result_id) + wholesale replace_for_result)assessment_result_service):add_result 增 assessment_subjects 參數, 寫入 child table;新增 list_result_subjects(ar_result_id)。assessment_result_app_service.init_ar_matrix_for_round:建 result 時,把 AP 的 assessment-subjects(ApAssessmentSubjectsRepoImpl.get_by_ap)map 成 AR subjects 傳給 add_result。add_observation 路徑允許帶 subjects(observation.subjects JSONB),FE 傳「這條查了哪些對象」。ar_results.assessment_log (entry: title/timing/methods/related-task uuid)。最小:echo 一份 task 清單當 log。get_findings response 補回 result-level subjects(供 FE 顯示)。scripts/sql/2026-06-17-ar-assessment-subjects.sql:建表 + GRANT ... cm_app + seq 權限 + INSERT schema_migrations。DEV 先套。project-audit-review-round = /project/projects/:id/round/:roundUid/audit。AuditReviewView:吃 roundUid;資料改 GET /audit-round/<roundUid>/ar/findings(AO 矩陣, control→AO findings + stats);判定 PUT .../ar/finding/<uid>;觀察 POST .../ar/observations (可選 subjects);風險 GET/POST .../ar/risks + PUT .../ar/risk/<uid>/findings;POST .../ar/finalize。:round-uid;總覽稽核按鈕改 isRoundRoute 派發到 -round。project-poam-round = /project/projects/:id/round/:roundUid/poam。PoamView:吃 roundUid;列表 GET /audit-rounds/<roundUid>/poam-items; detail .../poam-items/<uid>;三層編輯:風險→POST risks/<uid>/remediations→ POST remediations/<uid>/milestones→PUT milestones/<uid>(status/assignee/target_date)。oscal.ar_assessment_subjects 有列。