| 項目 | 內容 |
|---|---|
| 提出日 | 2026-05-31 |
| Branch | feature/ai-analysis-result-landing(BE + FE 同名) |
| 預計 FR | FR-031(新整數號,relates to FR-030 證據自動分類 arc) |
| 範圍 | BE(主專案 + DB + 報表計算)+ FE(兩個新報表頁 + 兩處入口連結),跨 2 repo |
| 狀態 | Phase 0 白話需求,討論已收斂,待搬 docs/features/ 進 Phase 1 |
| 來源 | 既有獨立 Python 報表專案 ~/Desktop/AirAsia 真實證據/CMMC佐證/_驗證/(validate.py / gen_ao_adjudication.py + WEB整合_報告產生規格.md) |
把目前「另一個 Python 專案產出的兩份 HTML 分析報表」,搬進系統內變成兩個獨立可瀏覽的報表頁(用前端既有設計樣式重畫),並把每次分類 run 的結果存進資料庫(這階段 Drive / DB 兩邊都存)。
_report-original.json、_state.json、_container-log.txt)。對應獨立專案
validate.py
[a]/[b] 子項,較嚴)+ 控制項層級(忽略子項,較高)對應獨立專案
gen_ao_adjudication.py
並存、互補,不是二選一切換:① 給「對照 User 的數字成績」,② 給「AI 對中立正解的真實對齊度」。
獨立專案是 offline 跑,靠外部 Excel + Source_Evidences/ 資料夾。搬進系統後,這些外部依賴大多不需要,對應如下:
| 報表概念 | 獨立專案(offline)來源 | 系統內來源 |
|---|---|---|
| AI 放置 | _report-original.json matches≥門檻 |
run 的 _report-original.json(AI 第一次分析的原始輸出,immutable) |
| User 正解 / ground truth | Source_Evidences/ 外部人工資料夾 |
run 的 _state.json placements(User 在既有審閱頁修正後的當前狀態) |
| CANON(報告② 基準) | 腳本內寫死 63 檔 | 固定 seed 一份(per-framework,這階段先固定,不做動態維護) |
| catalog(控制項/AO 定義) | Excel | 系統既有 cmmc_l1_aos.json(已是 NIST 編碼) |
| FAR↔︎NIST crosswalk | INDEX_TO_NIST / SPECIAL_IX |
不需要 — 系統內 AI 與 ground truth 都已是 NIST ao_id |
_state.json 本來就會隨 User 在審閱頁編輯而持續異動;報表頁是 on-demand 計算,每次打開就拿當下最新的 _state 重算 → 永遠反映即時分類狀態。approved_at / approved_by 欄位。_state 還等於 AI 原始 → 即時算會是召回/精確 100%、缺漏多餘 0(無意義)。此時報表頁自動偵測(讀 last_edited_at == null)→ 顯示一行純資訊提示:「此 run 尚未經人工審閱,目前分類等同 AI 原始輸出,召回/精確僅供參考」。不擋、不需動作。_report-original.json + _state.json + 固定 CANON + catalog → 算 → 顯示。不寫回、不觸發任何既有流程。/project/projects/<project_uid>/ap/<ap_uid>/classify-evidence/run/<run_folder_id>/project/projects/<project_uid>/ap/<ap_uid>,在「自動分類證據」Dialog 內、歷史執行資料清單後面掛上每筆 run 的兩個報表連結。canon_rules 證據類型→控制項規則表)← 延後_state.json(零碰既有 put_state)put_state 補一行同步 DB state 欄位,報表讀 DB(較貼合「移到 DB」目標,但動到既有後端 method —— 不改畫面)cmmc_l1_canon.json,零 migration、可直接編輯)vs DB 表。傾向 JSON 資源檔。| 報告 | 可行性 | 關鍵點 |
|---|---|---|
| 報告① | ✅ 高度可行 | 輸入(AI=_report-original.json、User=_state.json、catalog=cmmc_l1_aos.json)系統內全有;系統內已是 NIST → 免 crosswalk;演算法(doc_key 去重 / 四級 / 未分類三類診斷 / Docker log)只吃 JSON,零阻礙 |
| 報告② | ✅ 演算法可行 | 唯一前提是 CANON 要存在;這階段用固定 seed(移植現有 63 檔版本)即可,不需規則表/維護 UI |
已追 code 驗證的流程串接:
POST classify-evidence → container write_outputs 寫 _report-original.json(AI原始) + _state.json(初始=AI)
→ BE _finalize_drive_output 建 run folder、上傳兩 JSON
→ [既有審閱頁] User 編輯 → put_state 改 source=manual、覆寫 _state.json ← User 正解落地點
→ [新報表頁] 唯讀讀 _report-original + _state(當前) + 固定CANON + catalog → 算 → 顯示
原則:欄位會一直調整 → 大 payload 走 JSONB;只把要查/排序/顯示的少數欄位升成正式 column。報表不另存、on-demand 算(改演算法不用洗舊資料)。
evidence_classification_runs(鏡像整個 Drive run folder)| 欄位 | 型別 | 說明 |
|---|---|---|
id |
BIGSERIAL PK | |
run_folder_id |
VARCHAR | Drive run folder id(自然鍵,現在 URL 用的就是這個) |
run_folder_name |
VARCHAR | |
tenant_id / project_id / ap_id / org_unit_id |
INT | 查詢 / RLS / 列表索引欄 |
framework_id / model |
VARCHAR | |
confidence_threshold |
NUMERIC | |
status |
VARCHAR | queued/running/completed/failed |
archive_files |
BOOLEAN | analyze-only vs 已歸檔 |
input_file_count / classified_count |
INT | 列表顯示 |
estimated_cost_usd |
NUMERIC | 跨批比成本(亦留 metadata json 內) |
triggered_at / completed_at / archived_at / last_edited_at |
TIMESTAMPTZ | last_edited_at 供報告① 判降級 |
triggered_by_user_id / archived_by_user_id / last_edited_by_user_id |
INT | |
report_original |
JSONB | _report-original.json 全文(AI 原始,immutable) |
state |
JSONB | _state.json 全文(當前狀態,與 Drive 同步) |
container_log |
TEXT | _container-log.txt(報告① 的 Docker log 診斷段用) |
| 審計欄位 | created_user / created_dt / updated_user / updated_dt(依專案規範含 *_name) |
approved_at / approved_by(報告① 走即時,已砍)。..._report_cache)這階段先不做,需要時再加。| 基準 | 範圍 | 存法 | 未來 |
|---|---|---|---|
| CANON(報告② 用) | per-framework | 固定 seed JSON(file_name → [control_id] + 理由,移植現有 63 檔) |
規則表 + 維護 UI |
| catalog(控制項/AO 定義) | per-framework | 沿用既有 cmmc_l1_aos.json |
— |
報告① 的 ground truth 不另建表 —— 它就是 run 的
stateJSONB(即時),不是獨立資料集。
~/Desktop/AirAsia 真實證據/CMMC佐證/_驗證/
validate.pygen_ao_adjudication.pyWEB整合_報告產生規格.mddocs/features/FR-030.3-2605-evidence-classify-xlsx-pptx/handoff/2026-05-30-evidence-classify-arc-SUMMARY.mddocs/api/evidence-classification/state-json-schema.mddocs/api/evidence-classification/api-spec.mdapp/evidence_classification/service/evidence_classification_service.pyscripts/evidence/classify/docker/container_entrypoint.py write_outputs