FR-037 · 2026-06-10 · 資料補齊・現有流程分析

OSCAL 新表/欄位 — 資料從哪來、怎麼接進現有流程

Table 已對齊(欄位名 + 必填 + 新表規劃)。本文件分析現有資料填入流程與模式,把每個新表/欄位對應到「資料來源 + 該接進哪條流程」,作為資料補齊規劃的依據。本階段只分析,範圍尚未拍板。

現有資料填入的 4 條主線

先看資料現在怎麼進表——這決定新表要接哪裡。

1Catalog / Profile(控制層)
框架檔 PDF/Excelparser adaptercatalog_* 表使用者勾選profiles + profile_controls
來源:parser 抽取(catalog)+ 使用者勾選控制項子集(profile)。
⚠️ parser 只抽 ~40%:id/title/description/guidance/assessment-objectives。parts / params / props / links / 子控制項完全沒抽
2SSP(實作層,FR-036 後 3 路徑灌同一組 ssp_* 子表)
① 資源庫編輯 UI寫樣板 SSP 子表 ② clone(啟動/launch)深拷貝樣板 → 專案 SSP ③ docx/excel 匯入解析 → 子表
目前有捕捉:control-impl / objectives / system-characteristics(name/敏感度/scope)/ components / inventory / leveraged-auth / 程序書池。
⚠️ 完全沒捕捉:information-type、C/I/A impact、security-impact-level、system-user、by-component、set-parameter、diagrams。
3Assessment Plan(評估層)
start_oscal_projectclone profile controlsap groups/controls/tasks綁 workflow template
來源:從 profile + catalog 群組快照 + catalog_control_assessments 生 tasks。
⚠️ task_type 寫死 'manual'、assessment_methods 空、include 沒快照、import-ssp 用 ssp_id(stringified int)。
4Assessment Results / POA&M(評估層)
launch_audit 建空 ar_controls稽核員填 verdict + findingconfirm_audit 批次生 POA&Mmanager 填 remediation
來源:verdict / finding(title/category/severity/desc) = 稽核員輸入;POA&M = 從 fail/partial findings 批次衍生;remediation/due/assignee = manager 輸入。
⚠️ result.description / observation / risk / finding-target:目前無任何來源。finding.title 其實已捕捉(只是欄位 nullable)。

關鍵 pattern:SSP 的 3 條路徑

任何新增的 SSP 子表,都必須同時接進這 3 條路徑,漏一條那條路徑就灌不進資料:
① 資源庫編輯 加 write-strategy(樣板 SSP 子表寫入)
② cloneSspVersioningService.clone_to_new_version 加深拷貝(含 id remap)
③ 匯入 加 docx/excel parser 抽取 + write-strategy
這就是「怎麼套進新 Table」的答案——新表 = 新 model + 上面 3 個接點。clone 是純拷貝既有子表,所以只要新表建好且 3 路徑都接上,版本化與專案 clone 自動帶

資料補齊的三種分類

A 衍生 / 回填
資料已存在或可推導

從既有欄位 / FK / 已捕捉資料推出來。import_*、別名欄、poam title/desc、finding.title 設 NN。

成本:低 · migration + mapper · 無 UX
B 轉換
值/約束要改

詞彙值域對應、nullable→NN、欄位拆分。資料多半已在,改值或改約束。

成本:中 · 值對應 migration + 改寫入路徑 · 無 UX
C 全新捕捉
今天完全沒來源

需要新 UI / 匯入 / parser 去捕捉,SSP 類還要接進 3 路徑。是否做取決於產品要不要這功能。

成本:高 · 新表 + 捕捉點 + 流程接線 · 要 UX

④-A衍生 / 回填 資料已存在或可推導

新欄位資料來源怎麼填
ssps.import_profile既有 profile_idprofiles.uid一次性 backfill UPDATE + 寫入時 mapper 帶
assessment_plans.import_ssp既有 ssp_idssps.uidbackfill + mapper(注意 ssp_id 是 stringified int)
assessment_results.import_ap既有 assessment_plan_idassessment_plans.uidbackfill + mapper
poams.import_sspAP → SSP 推導backfill + confirm_audit 生成時帶
ssp_control_implementations.control_id= 既有 control_identifierbackfill copy + 寫入時雙寫
ssp_control_implementation_objectives.statement_id= 既有 statement_identifierbackfill copy + 雙寫
poams.title 衍生finding.titleconfirm_audit 批次生成時帶入
poams.description 衍生finding.description同上(與既有 remediation_plan 並存)
assessment_result_findings.title → NN稽核員已填(create_finding)資料已在,直接設 NOT NULL(先驗無 NULL)

④-B轉換 值 / 約束要改

對象原 → 新做法
ssp_system_characteristics.statusactive/archived → operational / under-development / under-major-modification / disposition / other值對應 migration + 改編輯 UI 下拉選項;確認既有資料對映規則
assessment_plan_tasks.task_typemanual/automated/hybrid → OSCAL milestone/actionmanual/automated/hybrid 移到 props;新 OSCAL 欄給預設值(多數任務屬 action)
ssp_components.status / .descriptionnullable → NOT NULL先驗既有資料是否有 NULL → 回填 default → 收緊;編輯/匯入確保必填
ssp_leveraged_authorizations.party_uuid / .date_authorizednullable → NOT NULL同上(注意既有資料可能有空值需補)
assessment_result_datas.title / .started_atnullable → NOT NULLlaunch_audit 已寫入(title='稽核執行'/started_at=now)→ 收緊低風險
assessment_result_evidences.descriptionnullable → NOT NULL驗既有資料 + 收緊
catalog_control_parts.proseNOT NULL → 可為 NULL(放寬)直接 ALTER(解除過嚴,無資料風險)

④-C全新捕捉 今天完全沒來源

這才是真正要規劃「誰填、從哪來、怎麼接」的部分。編輯clone匯入 = SSP 三路徑需接點。

SSP 層

新表/結構該由哪條流程捕捉需要做什麼
ssp_system_information_types + C/I/A impact(FIPS 199)system-characteristics 編輯 編輯clone匯入新「資訊類型 + 衝擊」UI 區塊;docx/excel parser 抽取;接 3 路徑
security-impact-level(3 欄)同 system-characteristics 編輯編輯 UI 3 個 C/I/A 下拉;clone/import 帶
ssp_system_users + ssp_authorized_privileges新「使用者授權」編輯區 編輯clone新表 + UI(user/role/privilege 矩陣)+ 3 路徑
ssp_by_components(+ export/inherited/satisfied)控制項實作編輯(元件層)編輯clone匯入新表 + 元件層實作 UI;leveraged auth 繼承鏈;接 3 路徑
ssp_set_parameters控制項實作編輯 / 從 catalog param 帶新表 + UI(參數值);可預載 catalog 參數;接 3 路徑
ssp_diagramsSSP 編輯 圖檔上傳 編輯clone新表 + 檔案上傳 UI;接 clone

AR / POA&M 層

新表/結構該由哪條流程捕捉需要做什麼
assessment_result_finding_targets稽核員建 finding 時 稽核擴充 create_finding:指定 target type + status(satisfied/not-satisfied) + implementation-status
assessment_result_observations稽核階段(稽核員填觀察)新表 + 稽核 UI(methods/collected/subjects)
assessment_result_risks稽核階段 / 接既有風險評鑑模組新表 + 稽核 UI(或與風險模組連動);最大工程
assessment_result_datas.descriptionlaunch_audit 時填 / 從 title 衍生小 UI 欄位 或 衍生 default

控制層 / 共用層

新表/結構該由哪條流程捕捉需要做什麼
catalog props/links/子控制項/param constraints框架匯入 parser 匯入parser 增強(目前丟棄這些);影響各框架 adapter
profile_imports / merge / modifyprofile 建立/編輯流程新表 + profile 編輯 UI;目前壓成單一 catalog_id
back-matter oscal_resources(+ hashes/document_ids/revisions)匯入時保存原始 resource + 附件 匯入新表 + 匯入保存;程序書池可部分映射

待決策(範圍)

1範圍:只做 A+B(衍生/回填+轉換,機械式、無 UX),還是含 C-SSP(與 FR-036 SSP 表族同期),或全做含 AR observation/risk + back-matter?
2C 類取決於產品要不要該功能:information-type/FIPS199、system-user、by-component、risk 等是 OSCAL 完整 round-trip 才需要的捕捉點——做不做看 conformance 目標。
3接線成本集中在 SSP 3 路徑:每個 SSP 新表 = 新 model + 編輯 write-strategy + clone 深拷貝 + 匯入 strategy。建議與 FR-036 動 SSP 表時一起接。
下一步:你看完這份分析後決定範圍,我再進入正式設計(每個選定項目的資料流、UI/parser 接點、migration),寫成 implementation plan。