---
title: "FR-132 A.1 — 權限粒度盤點：該拆出獨立動詞的候選"
---

# 權限粒度盤點：該拆出獨立動詞的候選

- **卡**：T-1.7（CM-2547），唯讀分析，不改程式、不改能力點樹
- **用途**：決策者裁「哪些這版拆、哪些下版、哪些不拆」
- **行號**：「A:行號」指 `inventory/a1-capability-tree.md` 附錄 A 的行；其餘寫檔案路徑與行號

## 給決策者的三句話

1. 557 支逐支過完，**真正該拆的不多：候選 10 列、14 支 route**；只有兩項值得這版做——「改帳號」和「給人角色」要分開（`iam.user.assign`，T-3.8 正在做指派 API），「按下 AI 分類」要從「上傳整理證據」分出來（要花 AI 額度）。
2. 多數看起來粗的地方，其實第二道「專案角色」已經分開了（開輪次、結案、退回階段只有專案 manager 能做；完成、退回任務只有被指派人能做），再拆能力點只是租戶層多一道，價值低。
3. 有三項各模組盤點**已裁過**，但照本卡判準仍符合，列在「翻案候選」等你決定要不要翻；其中最值得看的是**資源庫的範本與 SSP 匯出掛在「看」底下，唯讀角色也能帶走**，和 SSP 匯出另開一顆的原則相反。

另外：卡上提到的「專案 CSV 匯入走 `grc.project.create`」查不到這支端點。建專案只有一支 `POST /oscal-project/start`（A:630），前端專案頁的匯入只有 SSP 匯入與任務匯入兩種（`compliance-manager-fe/src/views/project/ProjectPlanningView.vue:197-242`）。最接近的是「用 Excel／Word 檔新建資源庫」掛 `oscal.resource-library.create`（A:895、A:899），列在翻案候選第 2 列。

## 方法

**讀了哪些段**：附錄 A 全部 12 段（A:620-1244），每段 50-90 行分次讀；第二部分能力點樹（A:519-582，既有獨立動詞的基準）；附錄 D 裁示（A:1404-1459）；design.md §6.1 粒度規則（design.md:142-163）；四份模組盤點的「定案結論」段（`a1-grc.md`、`a1-oscal-flow.md:290-305`、`a1-detection-evidence-survey.md`、`a1-system-iam.md`、`a1-platform.md:183-197`）；出貨五角色 `resources/roles/shipped-roles.json`。

**怎麼判**：每支 route 問卡上的三個判準（不同職務會分開給／一次性不可逆／批次或跨界）。符合的再查兩件事：

- **service 層有沒有第二道**（專案角色 manager／auditor、被指派人），有的話優先度降一級——因為「這個人在這個專案能不能做」已經分開了，拆能力點只多管「整個租戶能不能做」。
- **各模組盤點有沒有裁過**。裁過的不放候選清單，放「翻案候選」，讓你看得到但不會跟既有裁示打架。

**用到的事實**（逐一開檔核過）：

| 事實 | 出處 |
|---|---|
| 改帳號的 request 帶 `user_roles`（就是指派） | `jedi_iam/api/serializers/user.py:26`；`a1-system-iam.md:138-140、261` |
| 改任務設定 service 要求專案 manager | `app/flow_control/service/job_service.py:337` |
| 任務新增／修改的 request 帶 `assignees` | `api/flow_control/serializers/job.py:283、319` |
| 開輪次要 manager、發起覆核要 auditor、結案要 manager | `jedi_compliance_audit/app/service/audit_round_app_service.py:240、613、567` |
| 階段推進看該階段主角色，manager 可越級；階段回退只限 manager | `app/flow_engine/service/stage_advance_service.py:130`；`stage_rollback_service.py:96` |
| 完成、退回任務只限被指派人與 manager | `app/flow_engine/service/workflow_execution_service.py:656、827` |
| 批次完成是 N 次單筆完成，逐筆濾指派人 | `app/flow_control/service/job_batch_complete_service.py:49-65` |
| 開始 AI 分類起背景工作 | `jedi_evidence_classification/api/routes/evidence_batch_route.py:158` |
| 重建整個租戶 Drive 資料夾（destructive） | `api/cloud_integration/routes/google_drive_sync_route.py:209` |
| 資源庫匯出 SSP docx／pdf／odt | `api/module_frame/routes/mf_ssp_export_route.py:48` |

## 候選清單

「出貨角色影響」＝拆出去後，五個出貨角色中誰今天因持有那項 CRUD 而能做、拆後會失去（萬用字元 `*.*.*`、`模組.*.*` 自動涵蓋新動詞，不會失去）。

### 高（建議這版拆）

| 模組.資源 | 現在掛 | route（附錄 A 行號） | 建議動詞 | 判準 | 出貨角色影響 | 理由 |
|---|---|---|---|---|---|---|
| iam.user | `iam.user.create`／`update` | `POST /user`（A:1106）、`PUT /user/<uid>`（A:1108），request 的 `user_roles` 欄 | `iam.user.assign`（既有動詞） | 一、二 | 無（iam 只有系統管理員有，`*.*.*` 涵蓋） | 改姓名電話（人資、窗口）和給人角色（資安主管，給管理員角色＝提權）是不同職務；T-3.8 正在做指派 CRUD，新 API 直接掛新動詞成本最低。舊 PUT 夾帶 `user_roles` 時改要求 assign，或直接不再收這欄 |
| evidence.classification | `evidence.classification.update` | `POST /evidence-batches/<b>/classify`（A:1015） | `execute`（**新造，待裁**） | 三（觸發 AI、花額度） | 無（只有稽核主管 `evidence.*.*` 有 update） | 同一顆 update 也管上傳檔、移除檔、完成上傳（A:1012-1014）。實務上助理整理上傳、主管才按「開始分類」花錢；今天做不到 |

### 中（建議下版拆）

| 模組.資源 | 現在掛 | route | 建議動詞 | 判準 | 出貨角色影響 | 理由 |
|---|---|---|---|---|---|---|
| grc.audit | `grc.audit.update` | `POST .../stage/advance`（A:720）、`POST .../stage/rollback`（A:721） | `grc.audit.approve`（沿用；或新造 `advance` 待裁） | 一、二 | **稽核員會失去**（列舉了 `grc.audit.update`），拆時要在範本補上，否則稽核員推不了自己負責的階段 | 推進含「審核階段通過／退回」（`a1-grc.md:177` 說明），是狀態轉換；同一顆 update 也管改觀察事項、風險。第二道：推進看階段主角色、回退限 manager，所以降為中 |
| evidence.classification | `evidence.classification.update` | `POST /evidence-batches/<b>/archive`（A:1016） | `evidence.classification.approve`（沿用） | 三（跨界：寫進任務佐證） | 無 | 把 AI 分類結果每檔每檢查點寫成一筆任務佐證，等於「採信分類」；和上傳整理不是同一個決定 |
| evidence.cloud-integration | `evidence.cloud-integration.update` | `POST /integrations/google-drive/tenant/rebuild-all`（A:1005） | `execute`（新造，同上列） | 二、三（全租戶、外部服務、破壞性） | 無（稽核主管 `evidence.*.*`） | 同一顆 update 也管單筆同步重試（A:1001）；「重試一筆」和「重建全公司資料夾」風險差很多 |
| grc.job（**繞過既有動詞**） | `grc.job.create`／`update` | `POST .../assessment-object/<ao>/jobs`（A:692）、`PUT .../job/<job>`（A:690），request 的 `assignees` 欄 | 夾帶 `assignees` 時改要求 `grc.job.assign` | 一 | **一般成員**持有 `grc.job.update` 但沒有 assign；service 另要求 manager，實際影響只在他是某專案 manager 時 | `grc.job.assign` 已存在（A:702-705 指派端點），但改任務時一併送指派人就繞過它。不是新拆，是補齊既有拆分 |

### 低（記錄即可）

| 模組.資源 | 現在掛 | route | 建議動詞 | 判準 | 出貨角色影響 | 理由 |
|---|---|---|---|---|---|---|
| grc.audit | `grc.audit.create` | `POST /projects/<pid>/audit-rounds`（A:645）、`POST /audit-round/<rid>/launch-reverify`（A:649） | `grc.audit.close`（輪次生命週期併一顆）或不拆 | 一 | 稽核員會失去（有 `grc.audit.create`） | 開輪次和新增觀察事項同一顆。但開輪次限 manager、發起覆核限 auditor，第二道已分開；`a1-grc.md` 定案 3 也裁了 audit 不再細拆 |
| iam.user | `iam.user.update` | `POST /user/change-status/<uid>`（A:1110） | 不拆或 `iam.user.close` | 一、二 | 無 | 停用帳號是離職流程，但多半和改資料同一個人做 |
| evidence.classification | `evidence.classification.update` | `POST /classification-ground-truth`（A:1023） | `evidence.classification.import`（沿用） | 三（匯入） | 無 | 匯入正解基準，給評估分類準確度用，極少用 |
| grc.project（繞過既有動詞） | `grc.project.create` | `POST /oscal-project/start`（A:630），request 的 `participants` 欄 | 不拆 | 一 | 無 | 建專案時順手加成員繞過 `grc.project.assign`；但建專案表單本來就要選成員（同一表單不同欄位），建議維持 |

## 翻案候選（已裁過，照本卡判準仍符合）

| 模組.資源 | 現在掛 | route | 已裁 | 照判準看 | 建議 |
|---|---|---|---|---|---|
| oscal.resource-library | `oscal.resource-library.read` | 控制預設值匯出 Excel（A:835）、範本 SSP 匯出 docx／pdf／odt（A:843） | `a1-oscal-flow.md` 定案 4：資源庫匯出歸 read | 判準三（匯出）。第三部分寫「`oscal.*.read` 拿不到 `oscal.ssp.export`，只看不帶走是刻意的」（A:605），資源庫匯出卻讓唯讀、稽核員、一般成員都能帶走 | **中**：開 `oscal.resource-library.export`。範本是公版內容不是客戶資料，所以不到高；但客戶自己改過的範本（含預設實作說明）就是客戶的內容 |
| oscal.resource-library | `create`／`update` | 匯入資源庫 JSON／YAML（A:794-796）、控制預設值匯入四步（A:837-840）、SSP Excel／Word 匯入目標是資源庫時（A:895-902） | `a1-oscal-flow.md` 定案 2：資源庫不開 import | 判準三（匯入） | **低**：維持。會用資源庫的只有稽核主管與系統管理員，兩者都有整包，拆了沒有人受惠 |
| detection.remote-agent | `detection.remote-agent.update` | 核准新報到 agent（A:934）、重新綁定設備指紋（A:935） | `a1-detection-evidence-survey.md` 定案 4：核准歸 update，不開 approve | 判準一、二（信任一台機器、核准即簽憑證） | **低**：維持。管 agent 的就是 IT 一人，改名和核准不會分給不同人 |

## 不拆但容易誤判的

| route | 看起來像 | 為什麼不拆 |
|---|---|---|
| 開始掃描、取消、重跑等執行控制 8 支（A:953-961） | 判準三：觸發 agent 掃描 | 通則 A＋`a1-detection-evidence-survey.md` 定案 1：在任務頁做、做的就是任務指派人。掃描範圍另由 FR-129 授權網段管，不靠能力點 |
| 啟動任務執行（A:643）、強制開始卡住的任務（A:695） | 判準一、三：寄通知、越過合流閘道 | 已在 `grc.job.assign`（`a1-grc.md` 定案 7）：本質是派工，能指派就要能派發。兩支 service 都另限 manager |
| 完成任務、退回任務（A:710-711） | 審核關卡的「通過／退回」也走這支，像 approve | 審核關卡是一個獨立任務，有自己的被指派人；誰能審由「指派給誰」決定，service 限被指派人與 manager（`workflow_execution_service.py:656、827`） |
| Excel 匯入問卷答案（A:737） | 判準三：批次匯入 | 第一部分已裁（A:93）：線上填和 Excel 匯入是同一個受稽方做同一件事 |
| AI 儀表板自動生成（A:1211）、AI 小幫手聊天（A:1212） | 判準三：花 AI 錢卻掛 read | 這兩個資源本身就是 AI 功能，`ai.assistant.read`／`ai.dashboard.read` 就是「能不能用 AI」的開關（`a1-platform.md` 定案 6）；資源沒有其他動作可分 |
| 測試寄信、測 LDAP、測通知、測 log 轉發、測工具連線（A:1082-1089、A:950） | 判準三：觸發外部服務 | 對象是管理員自己剛填的設定，是設定表單的一步；只有設定管理員會按 |
| 產生 agent 註冊碼（A:937） | 判準三：發放註冊碼 | 註冊碼是新增 agent 的唯一入口，「能產生註冊碼」就等於「能新增 agent」，掛 create 正確；停用註冊碼掛 delete 也對 |
| 批次刪專案（A:635）、批次完成任務（A:696） | 判準三：批次 | 批次刪就是 N 次刪除（delete 本來就獨立）；批次完成在 service 逐筆濾指派人，權限不比單筆大 |
| 下載框架 OSCAL（A:767）、下載空白範本（A:836、A:841-842） | 判準三：匯出 | 框架是公開標準；空白範本不含任何資料 |
| 摘要報告還原歷史版本（A:731） | 判準二：覆蓋 | 還原後仍可再還原，不是不可逆；做的人就是編輯報告的人 |

## 統計

| 項目 | 數量 |
|---|---|
| 讀過的 route | 559（附錄 A 合計，A:1245） |
| 候選 | 10 列、14 支 route |
| 涉及資源 | 6 個：`iam.user`、`evidence.classification`、`evidence.cloud-integration`、`grc.audit`、`grc.job`、`grc.project` |
| 高 | 2 列（3 支） |
| 中 | 4 列（6 支） |
| 低 | 4 列（5 支） |
| 翻案候選 | 3 列（約 17 支，含通則 C 依目標判的 8 支） |
| 不拆但易誤判 | 10 組 |

其餘約 540 支照現行掛法即可：多數是同一資源的不同欄位（SSP、資源庫、問卷子物件）、挑選下拉（通則 B）、或已經拆好的獨立動詞。

## 新造動詞清單（等裁）

| 動詞 | 用在 | 問題 | 替代方案 |
|---|---|---|---|
| `execute` | `evidence.classification.execute`（開始 AI 分類）、`evidence.cloud-integration.execute`（重建全租戶資料夾） | design §6.1 限定獨立動詞只有四類（狀態轉換、對外送出、指派、匯入，design.md:150），`execute`（觸發外部服務或花錢）是第五類，要改規則 | 不新造：AI 分類改用 `evidence.classification.create`（把「開始一次分類」當成新增一筆分類執行），上傳整理留 update。缺點是 create 今天是「建批次」，兩件事又擠在一起 |
| `advance`（備選） | `grc.audit.advance`（階段推進、回退） | 只有在不想沿用 `grc.audit.approve` 時才需要；沿用的話，審閱打勾和推進階段會綁在一起 | 建議沿用 `approve`：兩者都是「主管確認這一段可以往下走」，`a1-grc.md` 定案 5 也是為了守四類而沿用 approve |

沿用既有動詞的（不必另裁）：`iam.user.assign`、`evidence.classification.approve`、`evidence.classification.import`、`oscal.resource-library.export`（若翻案）。
