# FR-151 GRC 延伸 — 首腦 STATE（living，只描述此刻）

**日期**：2026-10-21（第 6 棒：⑨ 驗收、準備合回 main）　｜　**branch**：BE／FE／jedi 皆 `feature/FR-139`　｜　**未 push**　｜　**LOG**：`FR-151-LOG.md`　｜　**母卡**：CM-2914

## 0. 原始需求（接手先懂這個）

公司要過 ISO 27001 或 CRA，稽核一堆沒過。老闆要在一頁看出「哪個部門幾條沒過、找哪位主管」。PM 定調補 GRC 的 G（責任）與 R（風險），C 平台本來就有。**決策者 2026-10-19 結論：第一版先把 GRC 核心產出來，鎖定 Compliance／Cybersecurity 面向；供應商、財務等領域留接口慢慢加。**

## 1. 文件現況

站 `docs/features/FR-151-2610-grc-governance-risk-extension/`，SA 式多頁：`1-requirement/`（01 背景、02 領域知識、03 使用情境）、`2-analysis/`（04 現況、05 決策紀錄、06 外部對照）、`3-plan/`（07 第一版、08 第二版含備註、10 總計畫）。**PM 看 10 總計畫，決策者的結論在 10 置頂「結論」節。** 舊單頁稿在 `archive/`。側欄分組靠 `scripts/deliverables/render_index.py` 的 `GROUP_STAGE`／`GROUP_LABELS`。改 md 後 `python scripts/deliverables/render_index.py <資料夾>` 再 commit。

## 2. 決策者已定（有日期才算）

- A1：RACI 對象＝專案 SSP 控制項實作（2026-10-19）。
- **第一版八題 A2～A5、B1、B2、C1、C2 全裁（2026-10-19），皆照首腦建議**，裁示原文在 05。含：同意動 jedi-iam 套件加部門主管（B1）；負責部門住 SSP 不另開公司層預設表（B2，決策者理由：資源庫與 SSP 綁在一起、部門跟著 C）。
- 第一版範圍＝找頭兒最小版**加 RACI 四格掛 SSP**（推翻上一棒「不做 RACI」）。
- C 合規證據類不做：政策生命週期、意識訓練、三道防線（框架控制項已涵蓋／無框架要求）。
- 兩版：一找頭兒（G）、二風險總表（R）。沒有第三版。供應商清單、事件紀錄、KRI 水位線是總表之外的紀錄表或設定，不在計畫，留接口。
- 名詞：「風險登錄」統一改「風險總表」。
- **兩版合併為一版、約四週**（2026-10-20）。D1：風險只存一張表——現有 `oscal.ssp_risks` 升格公司層風險總表（綁專案改可選），顧問只在總表填，SSP 頁籤「風險評估」改唯讀顯示關聯風險，CRA 匯出與評估目標照原路讀；不另立公司層表、不做「升級」。
- 風險關聯控制項存**框架控制項編號**（三個 CRA 專案同一條只勾一次），關聯專案由編號系統算出不用填（2026-10-20）。
- 熱圖不做（評分、等級門檻、五乘五等級對照圖要做）；接受簽核不做（狀態留「已接受」值）；專案風險升級刪除（2026-10-20）。
- RACI 表是通用掛點：對象類型欄給風險、政策文件、供應商等未來模組共用（2026-10-20）。
- **跳過雛形直接開卡**，畫面風格跟既有頁一致（2026-10-20）。
- 文件結構 SA 式多頁、側欄分類。
- **第 4 棒（2026-10-20 手測後）新裁**：
  - 專案總報告（final）也要補責任節與風險節 → 開 ⑩ CM-2924（已做）。
  - 刪風險要清 RACI 孤兒列 → ⑦ 已補 `delete_subject`。
  - 資源庫編輯頁也要能設負責部門與責任矩陣，與專案同一份資料 → 開 ⑪ CM-2925（已做）。決策者確認的概念：**控制項綁部門就決定 A（部門主管）與 R（任務處理人）的預設，RACI 矩陣是看全表＋處理例外（改 R、設 C／I）**。
  - 規劃頁要能**批次設定負責部門**（勾群組或個別控制項、可跨群組），且規劃頁與資源庫**共用同一個對話框**。
  - **R 落到評估目標（第 3 案）**：一條控制項多個評估目標各有處理人時，矩陣維持控制項層、預設 R 依負責條數排出代表顯示「Bob 等 N 人」；報告與 GRC 總覽列沒過項目時只取沒過那幾條評估目標的處理人；人工 R 優先。預設 R 不存表、不需 migration、不影響已手動設的 RACI。
  - 責任矩陣上兩顆批次鈕收成一顆「批次設定」選單（負責部門／R／C／I）。
  - 風險表單：Dialog 標題照全站表單寫法放大、**沒關聯的欄位不並排**（只留部門／A、衝擊可能性／對照圖兩組）、全欄 placeholder、必填要有文字訊息；寬度先加到 64rem，**拆獨立頁先不做**（決策者喊停）。
  - 風險總表要有分頁與排序，**照既有 DataTable 模式（useTableQuery），不自刻**。
  - 部門管理頁加租戶篩選；部門主管不可選到別租戶的帳號（bug，已修在 jedi-iam）。
  - 資源庫編輯頁（`ModuleFrameTemplateEditView.vue` 1,395 行）**要重構**，與專案規劃頁大量重疊——另開 FR，不在 FR-151。
- **第 5 棒（2026-10-20，決策者手測後連續裁示；全文在 05，這裡只列結論）**：
  - A2 補裁：R／C／I **一律只存人**，部門只是挑人的篩選；所有設 RACI 的畫面與後端統一。
  - A6：部門 RACI 預設（責任分工設定頁，全公司一份）；R 取值＝人工 → 評估目標處理人 → 部門預設 → 空。**晚間改判**：SSP 內不設 RACI，矩陣只是控制項頁籤的唯讀總覽；設定只在控制項表單或 Excel。
  - A7：R 自動補進**沒指派**的任務，已指派（含覆核者）一律不動。
  - D4：總表補欄位（對照 PM 的 GRC Overview Dashboard.xlsx）；算的欄位讀時算；Review Date＝風險自己的下次審查日（複查日），空值依等級帶週期、只填空。Excel「Open Issues」＝未結改善計畫，不是第二版的「事件」。
  - D5：風險新增／編輯改獨立頁；選部門即時帶 RACI 預覽；控制項四層過濾可跨框架。D6：處理計畫改關聯資源庫，可當場新增。
  - D7：GRC 總覽砍掉重練成主管簡報式儀表板（雛形 `prototype/grc-dashboard.html`）；**風險快照與趨勢先不做**。
  - D8：單筆風險現況報告做可列印頁，不做 popup、不做 Word；編輯頁「系統記錄」卡拿掉。
  - D9：風險總表欄位選擇器（預設 10 欄、29 欄可勾）。D10：SSP 現況 Excel 補負責部門欄、責任矩陣 sheet 可匯回；**任務配置匯入不加 RACI**。D11：風險總表 Excel 匯入（編號空白新增、有編號更新）。
  - 輪次頁責任矩陣只有兩列是對的：GRC測試專案的資源庫只勾兩條控制項。
  - 結案報告 Word 與頁面排版差異：決策者另開 session 處理（FR-145 範圍），已 commit `e89bdb4ba`（Word／PDF 改由程式依報告頁元件順序產生、單一新範本 `closing_report_template.docx`），首腦第 5 棒交接時代驗：closing report 四支測試 58 過、FR-151 207 過、無殘留引用、build 腳本資料檔斷言不涉舊範本。
  - ⚠️ **歷史歸屬錯位**：舊範本兩份與 `closing_report_docx_responsibility.py`／`_risks.py` 四支的**刪除落在首腦交接 commit `4c70ef1db`**，不在 `e89bdb4ba`——那個 session 先 `git rm` 進了 index，首腦 commit 時把整個 index 一起帶走。HEAD 內容正確、未 push，不改寫歷史；查這四支檔的去向要看 `4c70ef1db`。

## 3. 待裁

- ✅ 2026-10-21 決策者裁（照首腦建議）：風險 Excel 匯出加「說明／受影響資產／備註」三欄（29→32）、三欄皆可匯入；專案頁「風險等級」只改名「剩餘風險等級」、不加固有等級欄。實作卡 **CM-2965**（Stage 1，sonnet／high）。SPEC risk-register 頁隨卡改。
- 其餘待裁見 §5.0 第 10 列（已全部裁完）。


## 4. 待驗真實情境（寫第二版前問 PM 或顧問）

顧問今天的風險評估做完就丟還是持續維護／客戶部門分工對得到框架群組嗎／老闆會自己開系統嗎／一家客戶同時幾個專案／客戶有沒有在管供應商、記事件。列在 01 待驗表與 10 待驗節。

## 5. 接手要做（每項單獨等令）

**任務總表（此刻）**

| 卡 | 線 | 內容 | 狀態 |
|---|---|---|---|
| ① CM-2915 | G | 部門加主管欄（jedi-iam）＋跨租戶修正 | ✅ 首腦驗收（Notion 修正待驗證，等決策者複測） |
| ② CM-2916 | G | 控制項負責部門＋**批次設定**（共用對話框） | ✅ 同上 |
| ③ CM-2917 | G | RACI 責任矩陣＋**R 落到評估目標**＋批次選單 | ✅ 同上 |
| ④ CM-2918 | G | GRC 總覽頁 | ✅ 同上 |
| ⑤ CM-2919 | G | 階段結案報告責任節＋SSP Excel 責任矩陣 sheet | ✅ 同上（退回一次後修好） |
| ⑥ CM-2920 | R | 風險總表本體＋表單改版＋分頁排序 | ✅ 同上 |
| ⑦ CM-2921 | R | 稽核沒過自動建風險＋刪風險清 RACI | ✅ 同上 |
| ⑧ CM-2922 | R | 風險匯出 Excel＋階段報告風險節 | ✅ 同上（退回一次後修好） |
| ⑩ CM-2924 | G/R | 專案總報告補責任節與風險節 | ✅ 同上 |
| ⑪ CM-2925 | G | 資源庫編輯頁負責部門／責任矩陣（同一份） | ✅ 同上 |
| ⑫ CM-2926 | G | 部門 RACI 預設＋責任分工設定頁＋矩陣改總覽／例外（A6） | ✅ 首腦驗收（Notion 修正待驗證，等決策者複測） |
| ⑬ CM-2927 | G | RACI 的 R 回填沒指派的任務（A7） | ✅ 首腦驗收（Notion 修正待驗證，等決策者複測） |
| ⑭ CM-2928 | R | 風險獨立頁＋表單改版（RACI 預覽／四層選控制項跨框架／兩欄／處理計畫改關聯資源庫） | ✅ 首腦驗收（Notion 修正待驗證，等決策者複測） |
| ⑮ CM-2929 | R | 總表補欄位（Record ID／Category／合規狀態／改善計畫三欄／複查兩欄／審查日自動帶） | ✅ 首腦驗收（Notion 修正待驗證，等決策者複測） |
| ⑯ CM-2930 | G | 責任分工設定 Excel 匯出匯入 | ✅ 首腦驗收（Notion 修正待驗證，等決策者複測） |
| ⑰ CM-2931 | G | SSP 端 RACI 入口調整（A6 改判） | ✅ 首腦驗收（Notion 修正待驗證，等決策者複測） |
| ⑱ CM-2932 | G/R | GRC 總覽砍掉重練（D7，雛形 prototype/grc-dashboard.html） | ✅ 首腦驗收（Notion 修正待驗證，等決策者複測；DEV 無稽核資料，待決卡與通過率空狀態） |
| ⑲ CM-2933 | R | 單筆風險現況報告（D8，可列印頁）＋拿掉編輯頁「系統記錄」卡、關聯專案搬處置段 | ✅ 首腦驗收（Notion 修正待驗證，等決策者複測） |
| ⑳ CM-2934 | R | 風險總表欄位選擇器（D9） | ✅ 首腦驗收（決策者已手測） |
| ㉑ CM-2935 | G | SSP 現況 Excel 負責部門欄＋責任矩陣 sheet 匯入（D10） | ✅ 首腦驗收（API 未 HTTP 實打，手測前先重啟 BE） |
| ㉒ CM-2936 | R | 風險總表 Excel 匯入（D11） | ✅ 首腦驗收（同上；待裁匯出三欄見 §3） |
| ⑨ CM-2923 | — | SPEC（四頁新頁＋九頁補節＋結案報告手冊） | ✅ Done（`01a30338c`，首腦驗收、決策者確認） |

**下一步（每項單獨等令）**

決策者 2026-10-21 宣告**準備整理後把 `feature/FR-139` 合回 main**。這條 branch 從 2026-10-14（merge-base `24cc72972`）起帶了 FR-135／138～151 共十餘個 FR，收尾是跨 FR 的事；FR-151 的部分併在下面「合回 main 前總清單」裡，不再單獨列。

### 5.0 合回 main 前總清單 → 已拆成 FR-154

整條 `feature/FR-139` 合回 main 的收尾（套件發版、還原 pin、出貨基線、SPEC 補齊、收尾修正、權限矩陣、arc-review、進版 1.27.0）已自本節拆出為獨立 arc **FR-154**：`docs/features/FR-154-2610-fr139-branch-merge-closeout/handoff/FR-154-STATE.md`，Notion 母卡 CM-2975（子卡 CM-2965～2974）。本節不再更新。FR-151 自己剩下的：21 張子卡等決策者複測、母卡 CM-2914 等收 Done。

### 5.1 決策者手測清單（DEV，blsadmin；先重啟 BE）

DEV 部門 99 已改名「產品研發部」。CMMC 專案 AC.L1-b.1.i 與 GRC測試專案兩條控制項上有決策者自己設的 C／I 例外，首腦沒動。

- **責任（G）**：部門管理設主管、租戶篩選、子租戶主管下拉；責任分工設定頁設 R／C／I 預設（部門當篩選、只存人）、Excel 匯出匯入；規劃頁批次設定負責部門；控制項表單 RACI 四格（改了標「個別指定」、可還原）；控制項頁籤「責任矩陣」唯讀總覽；資源庫同樣能設、與專案同一份；R 有人時沒指派的任務自動被指派、已有人的不動；SSP 現況 Excel 主表「負責部門」欄與「責任矩陣」sheet 改完匯回。
- **風險（R）**：風險總表欄位選擇器、跳轉篩選膠囊；新增／編輯獨立頁（選部門即時 RACI 預覽、四層選控制項可整群組／整版本加入、分組顯示、處理計畫綁資源庫並可當場新增、頁尾儲存、「現況」卡）；現況報告頁與列印預覽；風險 Excel 匯出與匯入（編號空白新增、有編號更新、壞資料標問題）；專案規劃頁 SSP「風險評估」頁籤不分框架都顯示。
- **儀表板**：GRC 總覽四層、熱圖固有／剩餘切換與點格跳轉、匯出簡報 PDF、部門主管只看自己子樹。
- **要先走完一輪稽核才看得到**：自動建風險與待納入、合規狀態、未結改善計畫、儀表板三張待決卡與專案通過率、現況報告第 3／4 段、階段與總報告的責任節與風險節。

## 6. 行為規範（本 arc 特有）

- 決策者的提問不是裁示；他說「寫進去」才動文件、build、commit。
- 決策者連問時只回答，不改檔。他要先理解全部再裁。
- 市面平台對照出的缺口不能直接變功能，先問「我們的框架控制項機制是否已涵蓋」。
- 大需求討論稿必含使用情境（memory `feedback_big_feature_discussion_needs_use_case_and_verify_pm_claims`）。
- 首腦不開 subagent。
- 驗收用 API 實打時：登入 `POST /api/1.0/login` body 是 `{"username","password"}`（不是 login_name），帳號 `TEST_ADMIN_USERNAME`／`TEST_PASSWORD` 在 test repo `.env.e2e`；控制樹回應含控制字元，python 解析用 `json.loads(..., strict=False)`。RACI 寫格 body 要包 `{"cells":[...]}`。驗完把測試資料還原（RACI 列、部門主管、控制項部門歸零）。
- 監控卡片狀態用 Monitor 每 10 分鐘 `python scripts/notion_case.py get CM-xxxx | grep 狀態`，只在「修正待驗證」時叫醒；「Not started」是還沒人接手不是回報。zsh 不吃 `${!v}` 間接展開。
- **同一工作樹會有平行 runner**（第 4 棒實際撞到 ⑪ runner 在卡片還是 Not started 時就動工）：首腦自己改檔前先 `git status`，看到不是自己的改動就別碰那支檔；commit 一律顯式 `git add <檔>`，commit 前 `git diff --cached --stat` 核對。卡片狀態不可信，以工作樹為準。
- **DEV 資料會被決策者同時手測**：測試前先記下原狀，測後只還原自己寫的那幾筆；看到不是自己寫的資料不動、回報。
- **首腦今天直接改了很多 code**（決策者手測回饋說「你就直接修正」）——那是決策者當次授權，不是常態；沒有這句話時照 §7 開卡派工。
- 前端分頁一律 `useTableQuery`＋lazy DataTable（照機關單位管理頁）；Dialog 標題用 `#header` 放 `<h2>`；必填用 `required-mark`＋`p-error` 文字訊息；沒關聯的欄位不並排。
- 新增 GRC 錯誤碼要登記 `test/fixtures_frozen_error_codes.py` 並同步 FE `error-code.json` 兩語系，否則守衛紅。
- **開卡指路徑前先查**：⑭⑮ 卡寫「動 jedi-oscal-v2」錯（風險 model 在主專案）、⑱ 寫「⑥ 已有分數區間篩選」錯、⑮ 寫讀 `compliance.poams` 錯（舊表、0 筆、無人寫入，現行是 `oscal.poam_items`）。都是 runner 查實後糾正。指名檔案、表、既有功能前 grep 一次。
- **新頁一律預設要一支路由 seed**（前端守衛比對 `ui_routes` 登記表，不登記誰都進不去）；⑭⑲ 兩次都漏寫「需 migration」。
- **列手測項前先看讀取路徑**：「匯出有那張 sheet」不等於「匯入會讀」（⑤ 那條匯回其實驗不過，㉑ 才補）。FR 新增欄位時主動盤「哪些 Excel 匯入匯出要跟上」。
- **工作樹被平行卡弄髒時，驗收測試在乾淨 worktree 跑**：`git worktree add <scratchpad>/wt HEAD`，連 `.env`，用主 repo 的 `.venv/bin/python -m pytest`，跑完 `git worktree remove --force` ＋ `prune`。
- **zsh 陷阱**：`"$SSP:AC..."` 的 `:A` 會被當修飾符展開成路徑，打出 GOV_400003 假錯誤；變數後接冒號一律寫 `${SSP}:`。
- **決策者另開 session 共用同一支 8000 BE 時，首腦不重啟**；要重啟先問。
- 🔴 **commit 前先看 index 有沒有別人 staged 的東西**：`git add <檔>` 只是加，不會把別人已 staged 的改動排除；`git commit` 帶走整個 index。平行 session 共用工作樹時，commit 前 `git diff --cached --stat` 逐行看，有不是自己的就先 `git restore --staged <檔>`（不動工作樹內容），或改用 `git commit <檔...>` 只提交指定路徑。第 5 棒交接 commit 因此帶走了結案報告 session 的四支刪除。
- **seed migration 的自我驗證要容許「已經是最終態」**：新裝客戶的出貨 seed 是基線庫的最終態，之後 migrate 才補套各支 seed；斷言寫死「當下中間態」（某選單還沒出現、還在舊群組）在 DEV 能過、新裝必炸。重產基線後一律在乾淨 postgres:16 跑 init＋兩輪 migrate 才算驗完（FR-144／148 兩支即此坑）。
- 決策者要「參考業界」時要真的查完再畫（Eramba／CISO Assistant／ServiceNow IRM／Drata／Vanta 的對照已寫在 05 D7），不能拿 PM 的 Excel 頂。


## 7. 派工 prompt 骨架（換卡號即可）

```
接 Notion CM-xxxx（FR-151 ⑦ <卡名>，母卡 CM-2914）。
前置：CM-yyyy 卡尾已有首腦「✅ 驗收通過」註記。
工作目錄 ~/Projects/Billows/Audit-Manager/compliance-manager-be；FE 在 ~/Projects/Billows/Audit-Manager/compliance-manager-fe。兩 repo 都在 feature/FR-139，不切 branch。
先讀卡，卡上「怎麼做／在哪裡／手測／紀律」已自足，照卡做；只動 DEV。
<本卡關鍵提醒一到三句>
注意：pyproject.toml 的 jedi-iam path dependency 改動不要 stage；平行卡只 git add 自己的檔。
<若有主線 migration：回寫時明講「出貨基線待重產」（決策者已裁：等 FR 結束一起重產，不要自己動）。>
做完：各 repo 顯式 git add 檔名 commit、回寫本卡白話補充（commit hash、手測清單、打折處）、狀態改「修正待驗證」。push 等令。
model opus／effort high。（⑧ 用 sonnet）
```

## 追加：FR-152 D1 發現的兩個產品 bug（2026-10-21，首腦核實後開在本母卡下）

| 卡 | 做什麼 | 狀態 |
|---|---|---|
| CM-2954 | 規劃頁「新增任務」靜默失敗 — 根因比預期廣（props 指原範本、每輪各一複製品），改走對照表＋當前輪，查無回 404 | ✅ 首腦驗收（BE `8d2af9060`）；缺口：測試未覆蓋新主路徑，記卡上 |
| CM-2955 | 階段推進按鈕亮著、按了 403 — 裁示走 A：stage-info 一併查能力、FE 灰按鈕附原因；DEV PM 角色補能力、出貨一般成員不加 | ✅ 首腦驗收（BE `6fb34c2e2`、FE `95e93a47`；畫面待決策者重啟 BE 複測） |

spec 與建卡結果：`handoff/notion-cards-bugs-from-fr152(.json|-made.json)`。

