手冊首頁 / 證據管理 / 證據管理 功能群總覽

證據管理 功能群總覽

本檔放「本功能群多個頁面共用的知識」:頁面地圖、AI 證據分類生命週期、兩種「證據」概念的區分、儲存後端與雲端 / Agent 來源、角色基調、核心資料模型。

各頁面 spec 引用本檔,只寫自己頁面的差異——改共用邏輯時改這裡一份

1. 頁面地圖

本功能群橫跨證據分類閉環(AI 分類 → 覆核 → 報表)與證據來源基礎建設(雲端整合 / 檔案 Agent / 儲存設定)兩塊。

頁面 FE route 用途一句話 spec
證據分類覆核 /project/projects/:id/ap/:apUid/classify-evidence/run/:runFolderId AI 自動分類結果逐檔審閱 + 手動修正 placement 證據分類覆核
分類驗證報表 .../run/:runFolderId/report/validation 對照 User 修正後狀態,量化 AI 準度(召回 / 精確) 分類驗證報表
分類誤判報表 .../run/:runFolderId/report/adjudication 以中立正解基準(CANON)裁判 AI vs User 分類誤判報表
雲端整合(Drive) /settings/cloud-integrations 租戶 Google Drive 連接 / 同步狀態管理 雲端整合
檔案 Agent 管理 /system/remote-agent-manage FR-039 客戶端檔案 Agent 端點登錄 / 狀態 檔案 Agent 管理
儲存設定 /system/storage-config 全租戶檔案儲存後端(local / MinIO / remote_agent / Drive)設定 儲存設定

兩份分類報表(validation / adjudication)是同一個 run 的下游唯讀檢視,各自對應獨立 FE route 與 view,分為兩份 spec:驗證報表(量化準確度)與誤判報表(質化誰對誰錯)。

2. AI 證據分類生命週期(本群分類閉環的核心)

分類流程(FR-030):Drive Evidences/ 資料夾 → 觸發分類(manager)→ 容器 AI 逐檔分類 → run 資料夾 + _state.json → 覆核修正 → 報表 → 歸檔

evidence_classification_lifecycle drive Drive Evidences/ 待分類檔案 trig 觸發分類(manager) POST /classify-evidence drive->trig cont 容器 AI 分類 逐檔 → matches(AO+confidence) trig->cont run run 資料夾 + _state.json status: queued→processing→completed cont->run review 覆核修正 GET/PUT /state(加/減 placement) run->review rep 驗證 / 誤判報表 report_original × state 即時算 review->rep 下游檢視 arch 歸檔 copy placement 檔進 per-AO 資料夾 review->arch 完成
證據分類生命週期:觸發(manager)→ 容器 AI → run folder(_state.json)→ 覆核 → 驗證/誤判報表 → 歸檔

run 狀態evidence_classification_runs.status):queuedprocessingcompleted(成功)/ failed(容器 exit≠0);archived_files 旗標另記是否已把 placement 檔複製進 per-AO 資料夾(analyze-only 模式先不複製,覆核後手動歸檔)。

真相來源雙寫:placement 編輯狀態的真相是 Drive 上的 _state.json(覆核頁讀寫的就是它);evidence_classification_runs.state / report_original JSONB 是 DB 鏡像(供報表與跨頁查詢,_sync_run_state_to_db idempotent 同步)。報表以 report_original(AI 首次輸出,immutable)對照 state(User 修正後)計算

分類單位:per-AO placement——一個檔案可放進多個 AO({ControlId}[{letter}] 格式,如 AC.L1-3.1.1[a]);AO 母體來自 living SSP 的 in-scope 控制集(見 專案規劃頁)。

3. 兩種「證據」概念(新人最易混淆,先分清)

系統中「證據」有兩種獨立但相關的身份,不是同一份資料

Job Evidence(任務佐證) Classification Evidence(分類證據)
表 / 位置 compliance.job_evidences(綁 job_execution_id Drive Evidences/[domain]/[control]/[ao]/ 資料夾內檔案
來源 SYSTEM_UPLOAD(手動)/ DRIVE_SYNC(Drive 同步) AI 分類放置或 User 手動複製
用途 任務執行的完成佐證(受稽方上傳) AP 合規評估的框架相關檔案
涉及頁面 我的任務 本群分類覆核 / 報表
關聯 不與分類證據直接關聯 只都涉及「檔案儲存後端」這個共同基礎

兩者的交集只在「檔案存哪」——都由租戶的 STORAGE_CONFIG 決定儲存後端(見 §4)。改分類相關邏輯不要誤動 job_evidences,反之亦然。

4. 儲存後端與證據來源

本群管的是「證據檔案存哪、從哪來」的基礎建設:

面向 頁面 / 機制 說明
儲存後端切換 儲存設定(STORAGE_CONFIG system config,per-tenant) storage_typelocal / minio / remote_agent / Drive;重用 jedi-file-uploadIUploadFileProvider adapter
雲端來源 雲端整合(tenant_drive_integrations Google Drive OAuth 連接、webhook 同步、資料夾對應(drive_folder_mappings,scope 含 EVIDENCES)
客戶端落地 檔案 Agent 管理(remote_agents,FR-039) 機敏證據不上雲、落地客戶自有設備;agent 以 device fingerprint 綁定、心跳回報 status

背景同步:Drive 變更經 webhook → drive_sync_jobs 佇列非同步處理(詳見背景服務 spec)。分類前置要求:租戶 Drive CONNECTED + AP 已 init Drive 資料夾 + Evidences 有檔案。

5. 角色權限基調

角色是誰

  • manager(專案負責人)——觸發這一輪的 AI 證據分類。「身為 manager,我要對這次稽核的證據資料夾觸發 AI 分類,把檔案自動配對到對應控制項。」
  • 稽核參與者(v1 簡化:任何登入者)——覆核 AI 分類結果、修正誤判、查看分類報表。「身為稽核參與者,我要檢查 AI 分類的檔案是否放對控制項,把錯的改回來。」
  • 租戶 admin——設定證據存哪(本地 / MinIO / Drive)、管理雲端整合與客戶端檔案 Agent。「身為租戶 admin,我要設定這個租戶的證據要存在哪裡、要不要接 Google Drive。」

本群橫跨專案層(分類)與系統/租戶層(整合 / Agent / 儲存)兩種權限基礎:

動作 誰能做 檢查
觸發 AI 分類 專案 manager service 層 project_participant.role == "manager",否則 EC_403001
覆核 / 編輯 placement / 存 / 歸檔 v1 簡化:僅 JWT(未檢專案角色,實驗階段) 見 evidence-classification-review §3
檢視報表 同覆核
雲端整合 / 儲存設定 / Agent 管理 租戶 admin(系統管理層) 各頁 capability / route 層

本群 error code 前綴是 EC_(evidence_classification 模組),不是 GRC_——命名規則同(EC_<HTTP狀態碼><序號>),檔案在 common/code/evidence_classification_error_code.py。查錯別在 grc_error_code.py 找。

6. 核心資料模型

evidence_core_data_model cluster_classif 分類閉環(compliance) cluster_drive 雲端來源(public) cluster_agent 客戶端落地(compliance) runs evidence_classification_runs run 記錄(state/report_original JSONB) gt evidence_classification_ground_truth 正解基準(CANON) runs->gt 誤判報表 CANON fmap drive_folder_mappings 資料夾對應(含 EVIDENCES) runs->fmap run folder 在 Drive integ tenant_drive_integrations Google Drive 連接 integ->fmap 1:N sync drive_sync_jobs 同步佇列(webhook) integ->sync webhook agent remote_agents FR-039 檔案 Agent tok remote_agent_enroll_tokens 綁定 token agent->tok 綁定 job job_evidences 任務佐證(另一種證據) job->integ 或 Drive job->agent 儲存後端可選 remote_agent
證據管理核心資料模型:分類 run(藍)鏡像 Drive _state.json + ground truth;Drive 整合 / 資料夾對應 / remote agent 為來源;job_evidences 另一條線
schema 角色
evidence_classification_runs compliance 分類 run 記錄(DB 鏡像 Drive run folder;state / report_original JSONB;run_folder_id 自然鍵)
evidence_classification_ground_truth compliance 正解基準(per-tenant × framework;mapping JSONB = {file_name:[ao_id]};誤判報表 CANON 來源)
tenant_drive_integrations public 租戶 Google Drive OAuth 連接(token / webhook / 同步狀態)
drive_folder_mappings public Drive 資料夾 ↔︎ 系統實體對應(scope_type 含 PROJECT/AP/EVIDENCES…)
drive_sync_jobs public Drive 同步任務佇列(webhook 驅動、非同步)
remote_agents compliance FR-039 客戶端檔案 Agent registry(device fingerprint / status / 心跳)
remote_agent_enroll_tokens compliance Agent 綁定 enrollment token(sha256 hash)
job_evidences compliance 任務佐證(另一種證據,見 §3;儲存後端由 STORAGE_CONFIG 決定)

7. 本群共用的已知坑

  1. 兩種「證據」別混job_evidences(任務佐證)vs Drive 分類證據,是不同資料(見 §3)
  2. 真相在 Drive _state.json:分類覆核的 placement 真相是 Drive 上的 JSON,DB state 是鏡像;直接改 DB 會與 Drive 脫鉤
  3. 報表即時計算不存確認狀態:validation / adjudication 每次開都重算(對照 report_original immutable × state current),沒有「已確認」持久欄位
  4. error code 前綴 EC_ 不是 GRC_:查錯去 evidence_classification_error_code.py
  5. 分類限 CMMC L1 + Drive(v1):FR-030 v1 只支援 CMMC Level 1 框架 + Google Drive 來源;單 project 單 AP 觸發、無並行(同 project 一次一個 job)
  6. remote agent demo 邊界:FR-039 demo 階段落地不加密、無認證金鑰、無網路可達性檢查(見 FR-039 design)
  7. 覆核頁權限 v1 未鎖:觸發分類鎖 manager,但覆核 / 存 / 歸檔目前僅 JWT(實驗階段),非資安定案