# FR-132 存取管理 — arc 收尾 SUMMARY（2026-10-09）

> 由 `FR-132-LOG.md` 八個棒的 block 濃縮。母卡 CM-2510，子卡 CM-2511～2600 共 76 張。上線版本 **v1.26.0**（BE main `01dca31a4`、FE `0e2b1799`、jedi `143c309e`）。

## 為什麼做

公司層權限是 RBAC 但四處沒接上：部門範圍只存不判、起訖日判了畫面設不了、33 支 API 只驗登入、123 個能力點三套命名；兩個資安漏洞（選單明細與 JWT `is_admin` 不過濾到期／停用指派）。目標照「誰 × 角色 × 範圍 × 時效」補完。

## 做了什麼（行為差異）

| 面向 | 升級前 | 升級後 |
|---|---|---|
| 能力點 | 123 個、三套命名、大半只驗登入 | 208 個三段式（模組.資源.動詞），**全部真擋**，缺權限回 403 `GRC_403022` 並寫明缺哪顆 |
| 角色 | 逐筆勾 123 項 | 權限樹三層（分組 › 側欄頁 › 內頁，三支工作面子頁例外上樹）；萬用字元 pattern；系統管理員 `*.*.*` 每租戶恰一個不可改；四個範例角色可改可刪；JSON 匯出匯入 |
| 指派 | 角色綁人、無時效 | 使用者 × 角色 × 範圍 × 起訖日；到期仍顯示並標已到期、判定與選單不採計；部門只當屬性（隔離不做） |
| 畫面 | 角色管理、使用者管理 | 存取管理分組四頁（角色／指派／檢查存取／角色明細）；帳號表單角色區唯讀＋管理指派；342 顆按鈕照權限隱藏（專案內頁雙層） |
| 升級 | — | 舊名自動改新名；新拆 90 顆依三類補授；`grc.audit.read` 補給會進專案的角色；全集管理員轉系統管理員、非全集保留旗標原樣轉；升級補授腳本改寫新表 |
| 任務情境 | — | 任務動作看任務權限；結案問卷與檢測紀錄持「檢視任務證據」可讀；問卷本體依情境守門 |
| 錯誤追蹤 | 功能在但出貨包沒 sentry-sdk | 本版起隨包內建，設 `SENTRY_DSN` 即啟用，事件帶 release／environment／request_id |

## 改動範圍

- **BE**：192 commits（arc 起點 `518931af9`）。新模組 `api/permission_matrix/`；`common/authz/` 與 jedi-iam `authz/`（pattern 展開、log_only 機制、守門一致化）；27 支主線 migration；出貨基線重產兩次；`core/host_capabilities.py` 與各套件 capability 宣告；release 1.26.0。
- **jedi**：19 支套件改動並發版（jedi-iam 1.4.8→1.5.0 最大，52 檔）。
- **FE**：72 commits，存取管理四頁、角色樹 composable、v-can 守衛、342 顆按鈕。
- **文件**：design.md、inventory 八份、spec 站四頁＋退役舊頁＋使用手冊章、release note、兩份 analysis、STATE／LOG。

## 驗證

- 69 張實作子卡首腦逐張從 HEAD 核 diff 並實打；決策者手測三批回饋全部落地。
- 真擋後出貨五角色各建臨時帳號走遍側欄（0 個 403、0 錯誤提示），13 模組 31 支寫入端點 × 五角色 403 與角色設定全吻合。
- 舊庫升級排練（190，基線 1.22.0）：15 角色 21 帳號逐一比對，升級前權限零遺失；首腦獨立 SQL 展開 diff 複核。
- 守衛測試 `test_module_boundaries` 117 綠（基線重產後三條紅轉綠）、`test_fr132_*`、`test_role_templates`。
- 出包 smoke 9 項綠，新增探針④c 錯誤追蹤啟用。SBOM：四顆 image Critical／High 全 0。
- 三環境升級後：311 支 migration、208 全 enforce、每租戶一個系統管理員、八容器 healthy。

## 決策者裁示（全在 STATE「已定裁示」）

重點：D1～D12 照 design 定案、D12 部門隔離不做；部門範圍方式乙；不觀察直接真擋；出貨五角色與稽核員收窄；擁有者規則與 tree_page 例外；結案問卷視為證據；問卷本體依情境；公用角色不做；舊資料保留另開；排練用 190；jedi-iam 1.5.0；壞包同版號重出；arc-review 不做、e2e 不跑直接進版；site-regression 重建前發版不以 e2e 為 gate；三 repo 併回 main。

## 已知 follow-up

site-regression 重建（另開 FR）；乾淨安裝無基線庫能力點生成（另開 FR）；提權入口限制（下一版）；FR-B 專案層成員角色合併；舊資料與法規證據保留（討論串）；`GET /user/<停用 uid>` 500；三條既有紅燈；排練庫待 drop；DEV `.env` 含 DSN。

## 部署 handover

- 三環境皆 1.26.0＋`01dca31a4`；安裝包 188 `/opt/guidant-ai-be/.build/bundle/guidant-ai-1.26.0.tar.gz`（兩個 `.BAD-*` 壞包留對照）；image 在 Harbor `1.26.0-01dca31a`。
- STG／POC 要收錯誤追蹤：各自 `guidant.env` 放 `SENTRY_DSN` 後 `sudo guidantai restart`。
- 三台主機 `reboot-required`：190 已重開，188／189 未重開；下次升級若容器起不來（seccomp errno 524）重開再 `sudo guidantai start`。
- tag `v1.26.0` 由決策者打（BE／FE）。

## ✓ 已更新 / ✗ 漏做

✓ release note（canonical＋spec 站鏡射＋版本列表）、spec 快照 v1.26.0、spec 四頁＋退役＋手冊章（CM-2599）、design 已定裁示在 STATE、兩份 analysis、LOG 八個 block、STATE 結案版、memory 四條（site-regression gate、Nuitka 字串 import、STATE 待裁對 Notion、既有兩條）＋同步個人目錄、CLAUDE.md `DB_PASSWORD`。
✗ arc-review（決策者裁不做）；e2e 回歸與存取管理四頁測案（裁停，隨 site-regression 重建）；FR 站 README 總進度與 `docs/features/README.md` FR 登記表狀態欄（本棒未動，收 Done 後可一行改「已上線 v1.26.0」）。
