# FR-162 跨框架控制項對應 — 收尾總結

- 期間：2026-10-24 ～ 2026-10-26（四棒首腦＋工作坊 24 張子卡）
- 母卡：CM-3057
- 細節來源：`FR-162-LOG.md` 第 1～4 棒；現行規則見 `../design.md` 與規格頁

## 一、為什麼做

決策者原話：「要降低 user 重工……讓 user 在引入不同框架的時候，就不要一直重複上傳證據，可以用關聯的方式完成多項框架規範。系統應該是要到 AO。」

一份程序書常同時滿足 ISO 27001、CMMC、CRA 好幾個框架。系統原本沒有「框架 A 的控制項對到框架 B 的哪條」的資料（v1 那張表已隨套件退役），所以導入第二個框架就得把證據再上傳一次。

## 二、做出來的東西

| 功能 | 使用者看到什麼 |
|------|---------------|
| 對照資料 | 套件 `jedi-oscal-v2` 兩張表，對齊 OSCAL 1.2.2 `mapping-collection`；控制項層與評估目標層雙粒度；官方、第三方、顧問、AI 四種來源分開記 |
| 官方與第三方資料 | 隨套件出貨：CMMC↔800-171（規則生成）、800-171↔800-53（附錄 D）、800-53↔ISO 2022（NIST OLIR）；CRA（OSA）、SEMI E187（SunSquare）標第三方 |
| 解析服務 | 多跳轉乘（最多三跳）、信心度連乘、關係取最弱、評估目標層找不到退回控制項層、排除規則、同目標取最短路徑 |
| 控制項關聯管理頁 | 主軸 × 並排欄矩陣；膠囊點開看兩端條文、來源、轉乘路徑；×、拖曳搬移、＋多選新增、清空、關聯表 Excel 匯出匯入、還原出廠設定 |
| 證據沿用 | 專案總覽「證據作業」入口；一個來源專案一份設定的三欄調整頁；任務抽屜單筆沿用；沿用是關聯不是複製 |
| 重複證據看得見 | 上傳統一算 sha256 並回填；同檔多處標「也掛在 N 處」；上傳同內容提示 |
| 刪除語意 | 刪除只動本專案、同專案多處可選範圍；沿用刪了＝本專案不適用，沿用不再建議；來源被刪下游照常、標「來源已移除」；刪掉的證據不再給下載 |

## 三、關鍵決策（決策者裁）

| 決策 | 理由 |
|------|------|
| 對照進套件、不塞 catalog | 對照會變、catalog 不一定變；多對多要帶關係型別與信心度 |
| 鍵用控制項代號與評估目標 `part_id` | 不綁數字 id，跨環境、跨重匯可對 |
| 跨專案沿用，不做一專案多框架 | 一專案一框架是既有模型，沿用就能解重工 |
| 工作台是矩陣不是一對一 | 一對一數量隨框架數平方成長 |
| 一個來源一份設定，不做批次、不做復原某一次 | 使用者反悔時要的是「調回去」，不是「復原某次」 |
| 來源範圍＝使用者看得到的專案 | 「同租戶」會把別的組織單位的專案列進來，屬資料外洩 |
| 對照只能同層 | 矩陣、沿用、Excel 共用同一套解析，開例外每個入口都要各自處理 |
| 刪除只動本專案、不提供連帶刪除 | 跨專案刪除跨過權限與輪次狀態；原上傳者無權替其他專案決定 |
| 沿用不複製檔案 | 檔案不可改、軟刪不會連帶刪檔、外鍵保護；複製只多儲存空間且打掉去重 |
| `job_evidences` 不開 RLS | 背景與系統脈絡路徑太多，收益小、驗證面大 |

決策推理全文：`docs/analysis/2026-10-24-cross-framework-control-mapping.md`、`2026-10-24-mapping-sources-for-frameworks-without-official-crosswalk.md`、`2026-10-26-fr162-same-level-mapping-and-evidence-delete-semantics.md`。

## 四、交付物

**套件（Nexus 已發，2026-10-26）**

| 套件 | 版本 | 內容 |
|------|------|------|
| jedi-oscal-v2 | 2.9.0 | 對照兩表與 migration 021～026、解析服務、OSCAL 與 Excel 匯入匯出、對照資料包 seed |
| jedi-file-upload | 1.3.8 | 上傳統一算 sha256、回填用分頁查詢 |

同批另發 jedi-compliance-audit 1.4.1（FR-161.3）、jedi-task-platform 1.4.1（FR-155），非本 FR 的改動，因宿主已依賴一併發。

**主線 migration（`phase=active`，只套 DEV）**

| 檔 | 內容 |
|----|------|
| `2026-10-24-fr162-control-mapping-capabilities.sql` | 能力點 read／manage、選單、系統角色預設授權 |
| `2026-10-24-fr162-job-evidences-reused.sql` | `source` 放行 REUSED、`reused_from_evidence_id`、`mapping_entry_id`、`projects.last_evidence_reuse_at` |
| `2026-10-24-fr162-control-mapping-ai-capability.sql` | 平台層能力點 ai-suggest |
| `2026-10-26-fr162-job-evidences-not-applicable.sql` | `deleted_reason` 放行 NOT_APPLICABLE |

**文件**

| 類別 | 位置 |
|------|------|
| 規格 | `docs/spec-site/current/compliance-framework/control-mapping.md`、`evidence/evidence-reuse.md`、`evidence/evidence-reuse-adjust.md` |
| 使用手冊 | `docs/user-manual/control-mapping-and-evidence-reuse-guide.md`（技術支援站已收錄） |
| 設計 | `../design.md`（現行規則） |
| 決策分析 | 三份，見第三節 |

**commits**：四棒合計 BE、FE、套件各數十支，全部已 push 到 `feature/FR-139`；清單見 LOG 各 block。

## 五、已知 follow-up（未做，各有理由）

| 項目 | 狀態 |
|------|------|
| 出貨基線重產 | 上表四支 migration 與套件 026 要進下一包基線；重產屬決策者裁示 |
| STG／POC 上版 | 只套 DEV；上版等決策者放行 |
| 挑選器導航樹抽共用元件 | 第 8 份手刻樹，決策者 10-25 裁「之後再做」，要另開 FR |
| 全站 13 檔手刻分段按鈕收斂到 `SegmentButtons` | 另案 |
| 遺留端點 `POST /oscal/control-mappings/rebuild` | 畫面已無入口，尚未刪 |
| 守衛紅：套件解析服務 domain→infra import | 要不要開小卡修待裁 |
| 三冊 provenance 補網址；NIST SP 800-82 r3 換一級來源 | 待決策者下載檔 |
| AI 建議與 OSCAL 匯入匯出 | 畫面隱藏中，後端端點照舊 |
| AI 配對準確率 | 未實測 |
| SMCC WG4 官方比較分析 | 出來後換掉 SunSquare 二級來源 |
| `upload_files` sha256 空 2,619／4,888 | 回填讀不到檔的，見 CM-3097 回寫 |
| e2e regression | 母卡收口另開一棒到 test repo 補 |

## 六、教訓（濃縮）

- **雛形要在 design 與開卡之前**：跳過雛形直接開卡，決策者看雛形後改了三處，每處都要回頭改 design 與卡。
- **分批要逐張掃登記型共用檔**：error code 表、migration manifest、api.js、locales、router 兩張卡同時加列就撞；「不同模組」不等於「不同檔」。這條犯了兩次。
- **STATE 是快照**：工作坊平行推進幾小時就過期，開新卡前一定 fetch 母卡全部子卡實況。
- **「同租戶」不等於「使用者看得到」**：RLS 只擋租戶，任何「列其他專案給使用者選」都要走專案列表的可見性。
- **動 UI 前先查現成的**：分段按鈕、導航樹都有現成的，自刻被連續點名；只靠 build 就回報＝把驗證丟給決策者。
- **根因要查到判定邏輯那一行**：「逐條寫清不乾淨」不是筆數問題，是解析器沒拿那種排除去比；查到那一行，修法從「開例外」變成「改一處判斷」。
- **刪除語意先查歷史資料分布**：同一個原因值被多種動作共用，拿它當新語意會把歷史全部算進去。
