專案總覽頁右上加一組「控制項視角|證據視角」切換;切到證據視角後,左樹沿用並多一層到評估目標,右邊永遠是一張平的證據清單(檔案可預覽/下載、連結直接開),每列寫它掛在哪些評估目標、屬於哪個任務。只看不改。
現在要看某條評估目標交了哪些檔,得點群組 → 展開控制項 → 展開評估目標 → 展開任務 → 開抽屜,四層才看到檔名。PM/顧問要盤「這個控制項證據齊不齊」「哪些 AO 一份都沒有」,只能一條條點。
| # | 決策 | 理由 | 被排除 |
|---|---|---|---|
| D1 | 入口在專案總覽頁本身,右上切換,不另開頁 | 左樹、麵包屑、輪次切換都已在這頁,使用者的心智是「同一個專案換個角度看」 | 獨立頁(多一條路徑、多一次載入) |
| D2 | 右邊永遠一張表、一組表頭;左樹只縮範圍(像 Google Drive 點資料夾) | 決策者實看巢狀分段版後退回「很難看、不友善」。業界(Drata/Vanta 證據庫、Finder/SharePoint)一致:清單平鋪、歸屬用欄位表達。表格 UX 共識:巢狀上限兩層、不准手風琴包手風琴 | D 版「選群組→依控制項分段卡片→再依 AO 分段卡片」 |
| D3 | 「位置」欄寫每份證據掛在哪些評估目標(編號標籤+完整名稱,一個 AO 一行,超過三個收成「還有 N 個…」);選群組時行首多控制項代號;選到 AO 時此欄不顯示 | 一個檔對到五個 AO 只出一列,同時解掉「同檔重複五次」;完整名稱是決策者明示(只有 obj.N 看不懂) | 只顯示 obj.N 標籤 |
| D4 | 分段是選配:工具列「不分段|依控制項|依評估目標」,開了只在同一張表插群組標題列;無證據的 AO 在分段模式出一列灰字「尚無證據」 | 缺口不能被藏掉,但預設不逼使用者看分段 | 預設分段 |
| D5 | 沒有狀態欄(不顯示已採納/待審/退回) | 查過:compliance.job_evidences 沒有審核狀態欄;FR-142 的「採用」記在稽核結果那邊且明寫「不改任務端資料、不標有效無效」。雛形早期假資料的「退回原因」是編的,已拿掉 |
自己發明一套證據狀態 |
| D6 | 連結型證據照 Drata 做法當正式證據列出(標題+網址,點了開新分頁) | job_evidences.evidence_type=LINK、reference_url、description 早就存在,任務抽屜已能加;Drata 的來源型別本來就是 File/URL/Ticket 並列 |
— |
| D7 | 每列帶「所屬任務」,點了開現有 JobExecutionDrawer;要加檔、改連結回抽屜做,本頁不提供寫入 |
寫入的守門、上傳、Drive 同步全在抽屜,不重做一套 | 列上直接刪/改對應 |
| D8 | 左右分隔用 PrimeVue Splitter,照 EvidenceClassificationReview.vue:433 的用法(:gutter-size="6"、state-key、state-storage="local") |
決策者明示「有現成的就不要自己硬寫」;雛形的純 JS 版只是模擬行為 | 自寫拖曳 |
| D9 | 資料來源沿用 control-tree(GET /ssp/<ssp_uid>/control-tree),不開新的彙總端點;BE 只把 tree 裡每筆證據的欄位補齊(上傳者、時間、檔案 uid、大小) |
專案總覽頁本來就一次載入整棵樹,每個任務底下已帶 evidences[](ssp_control_implementation_service.py:554),缺的只是四個欄位;再開一支端點=第二套真相 |
新 GET /audit-round/<uid>/evidences 彙總端點 |
| D10 | 問卷型證據(SURVEY)第一版不列 | tree 把問卷放在 job.surveys[] 另一條路、欄位形狀不同;問卷不是「檔」,使用者口述的痛點是檔案與連結 |
三型合一 |
雛形:prototype/d2-evidence-flat.html(決策者 2026-10-25 核可)。雛形只取結構與行為,不取字級、字型、配色——FE 一律 dark-card+全站字級。
SelectButton「控制項視角|證據視角」,放在「匯出」類按鈕左邊;切換狀態記 localStorage(key 含專案 uid)。SplitterPanel 約 320px,min 220):沿用現有群組→控制項樹,證據視角下控制項可再展開評估目標;群組與控制項列尾顯示「N 份」(去重後的證據數),評估目標列尾顯示該 AO 的份數,0 份紅字。搜尋框沿用。SplitterPanel)一張 dark-card:
SourceBadge)|上傳者(暱稱)|時間|所屬任務|操作(檔案:預覽、下載;連結:開啟)。feedback_table_one_value_per_cell_and_side_by_side_colors)。infra/readmodel/oscal/ssp_control_implementation_query.py:184)id, jid, evidence_type, source, ref_id, reference_url, classification_run_id, file_name
| 欄位 | 來源 | 用途 |
|---|---|---|
uid |
je.uid |
列 key、與 JOB_EVIDENCES 回傳對齊 |
file_uid |
uf.uid |
預覽/下載(FilePreviewDialog.open(fileUid, name)、openFileDownload(fileUid)) |
file_size |
uf.size |
顯示大小 |
description |
je.description |
連結標題(LINK 的 name 目前退到 reference_url,顯示不友善) |
created_user |
je.created_user |
上傳者(login_name) |
created_user_name |
app service 層 enrich_audit_nickname_objs |
上傳者暱稱(CLAUDE.md 審計欄位規範:有 created_user 必配 created_user_name) |
created_at |
je.created_at |
時間 |
位置(控制項/AO)不用補——tree 的巢狀結構就是位置:groups[].controls[].assessment_objects[].jobs[].evidences[],FE 攤平時把路徑帶在每列上。同一份證據掛多個 AO 時會在多個 jobs[] 下各出現一次(同 uid),FE 以 uid 去重、把路徑收進「位置」欄。
沿用 control-tree 既有守門(專案參與者可讀)。不新增能力點、不新增端點、不新增 migration。
| 卡 | 做什麼 | Repo | 規模 |
|---|---|---|---|
| FR-163.1 | control-tree 證據欄位補齊(上表七欄)+ nickname enrich | BE | 小:一支 SQL 加欄+一處 dict 加鍵+enrich 一行 |
| FR-163.2 | 證據視角:切換鈕、左樹加 AO 層與份數、右欄平表、Splitter、i18n | FE | 中:新子元件一支+總覽頁掛載 |
批 1:FR-163.1。批 2:FR-163.2(等 .1 合入並重啟 BE)。FE 在 .1 之前可先用既有欄位開工(名稱、型別、來源、連結都已在 tree),只有上傳者/時間/預覽下載等 .1。
prototype/index.html(A/B/C 是 10/23 的三個早期方向,D 是第一版巢狀、D2 是定案)src/views/project/ProjectAuditorOverview.vue(2,114 行,已超標,新邏輯一律新子元件)app/oscal/service/ssp_control_implementation_service.py:536-562、infra/readmodel/oscal/ssp_control_implementation_query.py:184-199source=REUSED 徽章沿用 SourceBadge)