現在稽核階段的判定頁是「一個控制項一個判定」:畫面擠、填寫框小,要先到別頁建風險再回來勾,很難用。稽核人員到現場拿的是 FR-141 那份逐評估目標(AO,控制項底下一條一條要查的檢查點)的稽核計畫,照表逐條查,結果也應該逐條記。亞航顧問交回的附件 Excel 正是這樣:稽核計畫的欄位原封不動,後面多「佐證資料」「稽核結果」兩欄。
本案做四件事:
RoundAuditReviewView.vue 1,083 行(超過 800 行上限),判定做在控制項層,風險要跨頁建。target.status.state 存 satisfied/not-satisfied;不適用 → target.implementation-status=not-applicable,state 存 satisfied、reason 存 other,匯出才合規;未判定=不建 finding,不落假值。套件自創的 pending/product_state 一併清掉。lifecycle=recommendation)。保留「風險」頁籤當總覽,可在那裡把多條 AO 的風險合併成一筆(進階功能,不是主路徑)。| 畫面 | OSCAL AR |
|---|---|
| 每條 AO 判定 | finding(每 AO 一筆)target.type=objective-id、target-id=AO part_id、status.state/reason、implementation-status |
| 發現 | finding.description(判定理由)+ observation.description(事實),finding 用 related-observations 連 |
| 佐證資料 | observation.relevant-evidence;observation.methods 從稽核計畫的查核方法帶 |
| 風險嚴重度 | risk.characterizations[].facets[{name=severity, system, value}](陣列形狀) |
| 風險說明 | risk.title/description/statement,status=open |
| 建議 | risk.remediations[](型別 response)lifecycle=recommendation |
| 第 7 章文字 | result.attestations[].parts |
| 第 1~6 章 | 從 AP 讀(FR-141 的 ap_terms_and_conditions/parties/task timing),AR 不重存 |
target_status={"product_state":…},匯出直接吐進 target.status,少了必填 state、多了不允許的欄(jedi-oscal-v2 app/service/io/oscal_io_service.py 約 1603 行;domain/service/ar/ar_finding_matrix_service.py 43-48 行)。characterizations={"severity":…},官方是陣列+origin+facets(app/service/ar/assessment_risk_service.py 99-100 行)。assessment_finding_risks 表,匯出讀的是 finding.related_risks JSONB,兩邊沒同步,service 建的關聯在匯出時會消失。assessment_remediations.lifecycle 允許空值且註解寫 recommendation/required;官方必填、值域是 recommendation/planned/completed。assessment_result_app_service.py 約 204 行的 init_ar_matrix_for_round 是控制項層一筆 finding,target_type 寫 objective-id、target_id 卻存 control_id;要改回 AO 層。feature/FR-141 分支、尚未合回 feature/FR-139;實作階段在哪個 branch 接由決策者裁。system_menus,不寫死。