Skip to content

權限與安全機制:能力邊界矩陣與越權防護 ​

學完你能做什麼 ​

  • 理解能力邊界矩陣的設計原理和權限隔離機制
  • 學會設定 Claude Code 的權限檔案,避免使用 --dangerously-skip-permissions
  • 掌握越權操作的處理流程和恢復方法
  • 了解強制技能使用驗證的機制
  • 能夠識別和修復權限相關的安全問題

你現在的困境 ​

你可能遇到過這些情況:

  • 不知道為什麼 Agent 無法存取某些檔案
  • 執行 factory run 時總是被提示需要權限,直接用了 --dangerously-skip-permissions 跳過
  • 不清楚 Agent 之間的權限邊界,擔心越權操作導致資料汙染
  • 越權發生後不知道如何處理和恢復

如果這些問題讓你困擾,這章會幫你建立完整的權限和安全認知。

什麼時候用這一招 ​

當你需要:

  • 設定 Claude Code:為 Factory 專案設定正確的權限檔案
  • 除錯權限問題:排查 Agent 為什麼無法讀寫特定檔案
  • 處理越權異常:恢復越權操作導致的中斷流水線
  • 擴展 Agent:新增新的 Agent 時定義其權限邊界
  • 安全稽核:檢查現有專案的權限設定是否合理

核心思路 ​

AI App Factory 的安全機制基於能力邊界矩陣(Capability Boundary Matrix),確保每個 Agent 只能在授權的目錄中操作。

記住這個比喻:

  • Agent 就像是工廠裡的專業工人
  • 能力邊界矩陣就像工作許可證,明確規定每個工人可以進入哪些車間、操作哪些設備
  • Sisyphus 排程器就像安全主管,在工人進出車間時檢查許可證,確保沒有越權行為

三層防護機制:

層級職責檢查時機
Claude Code 權限檔案系統讀寫權限AI 助手啟動時
能力邊界矩陣Agent 目錄存取權限階段執行前後
強制技能驗證特定階段的技能使用要求bootstrap 和 ui 階段

能力邊界矩陣詳解 ​

為什麼需要權限隔離? ​

想像一下沒有權限限制會發生什麼:

  • PRD Agent 修改了 UI 檔案:UI 設計被改亂,無法追溯
  • Tech Agent 讀取了 Code 檔案:技術架構受程式碼實作影響,偏離 MVP 原則
  • Code Agent 修改了 PRD:需求文件被程式碼邏輯「汙染」,職責混亂

答案:職責邊界不清,產物無法追溯,品質無法保證。

能力邊界矩陣通過限制每個 Agent 的讀寫權限,確保職責分離。

權限矩陣表格 ​

Agent可讀取目錄可寫入目錄說明
bootstrap無input/僅在 input/ 目錄建立或修改 idea.md
prdinput/artifacts/prd/讀取想法檔案,產生 PRD;禁止寫入其他目錄
uiartifacts/prd/artifacts/ui/讀取 PRD,產生 UI Schema 與預覽
techartifacts/prd/artifacts/tech/, artifacts/backend/prisma/讀取 PRD,產生技術設計和資料模型
codeartifacts/ui/, artifacts/tech/, artifacts/backend/prisma/artifacts/backend/, artifacts/client/根據 UI 和技術設計產生後端和客戶端程式碼;不得修改上游產物
validationartifacts/backend/, artifacts/client/artifacts/validation/驗證程式碼品質,產生驗證報告;只讀不修改程式碼
previewartifacts/backend/, artifacts/client/artifacts/preview/讀取已產生的服務與客戶端,撰寫演示說明

核心原則

  • 單向依賴:Agent 只能讀取上游階段的產物,不能讀取下流或同級產物
  • 職責獨立:每個 Agent 只能寫入自己的產出目錄
  • 禁止越權:未授權的讀寫操作會被視為安全違規

權限檢查流程 ​

Sisyphus 排程器在每個階段執行前後都會進行權限檢查:

執行前(告知權限):

1. Sisyphus 讀取 capability.matrix.md
2. 將目前 Agent 的可讀和可寫目錄傳遞給 AI 助手
3. AI 助手在執行時必須遵守這些限制

執行後(驗證輸出):

1. Sisyphus 掃描新建立或修改的檔案
2. 檢查檔案路徑是否在 Agent 的授權目錄範圍內
3. 如果發現越權,立即處理(見越權處理機制)

自動化 vs 人工

權限檢查主要由 AI 助手(Claude Code)的權限系統和 Sisyphus 的驗證邏輯自動完成。只有在越權等異常情況下才需要人工介入。

設定 Claude Code 權限 ​

為什麼不推薦 --dangerously-skip-permissions? ​

你可能見過這樣的命令:

bash
claude --dangerously-skip-permissions

這個選項的問題:

問題說明風險
跳過所有檢查Claude Code 不再驗證任何檔案操作AI 可能誤刪、誤改系統檔案
安全漏洞Agent 可以讀寫任意目錄越權操作無法被攔截
無法追溯沒有權限邊界,問題難以定位除錯和維護困難

Factory 自動產生權限設定 ​

Factory CLI 在初始化專案時會自動產生 .claude/settings.local.json,設定精確的權限:

產生時機:factory init 命令執行時

設定內容(原始碼位置:cli/utils/claude-settings.js:41-91):

json
{
  "permissions": {
    "allow": [
      // ========== 檔案操作權限 ==========
      "Read(/path/to/project/**)",
      "Write(/path/to/project/**)",
      "Glob(/path/to/project/**)",
      "Edit(/path/to/project/*,**)",
      
      // ========== Git 操作權限 ==========
      "Bash(git add:*)",
      "Bash(git commit:*)",
      "Bash(git push:*)",
      // ... 更多 git 命令
      
      // ========== 建置工具權限 ==========
      "Bash(npm install:*)",
      "Bash(npm run:*)",
      "Bash(npx:*)",
      
      // ========== TypeScript 權限 ==========
      "Bash(tsc:*)",
      "Bash(npx type-check:*)",
      
      // ========== 資料庫 (Prisma) 權限 ==========
      "Bash(npx prisma validate:*)",
      "Bash(npx prisma generate:*)",
      "Bash(npx prisma migrate dev:*)",
      
      // ========== Factory CLI 權限 ==========
      "Bash(factory init:*)",
      "Bash(factory run:*)",
      "Bash(factory continue:*)",
      
      // ========== Docker 權限 ==========
      "Bash(docker compose:*)",
      "Bash(docker build:*)",
      
      // ========== 技能 (Plugins) 權限 ==========
      "Skill(superpowers:brainstorming)",
      "Skill(superpowers:writing-plans)",
      "Skill(ui-ux-pro-max)",
      "Skill(*)",
      
      // ========== Web 操作權限 ==========
      "WebFetch(domain:github.com)",
      "WebFetch(domain:npmjs.org)",
      
      // ========== 通用工具權限 ==========
      "Bash(curl:*)",
      "Bash(grep:*)",
      "Bash(find:*)"
    ]
  },
  "features": {
    "autoSave": true,
    "telemetry": false
  }
}

權限設定的特點:

特性說明範例
專案層級限制只允許讀寫目前專案目錄Read(/Users/xxx/my-app/**)
命令級精確控制每種命令都有明確的權限模式Bash(npm install:*) 不允許 npm install --global
跨平台支援自動適配 Windows 和 Unix 路徑Windows 使用 //d/**,Unix 使用 /path/**
技能白名單明確列出允許使用的技能Skill(superpowers:brainstorming)

檢查設定是否生效:

bash
# 檢視產生的權限設定
cat .claude/settings.local.json

# 驗證檔案存在
ls -la .claude/settings.local.json

平台差異

Windows 和 Unix/macOS 的路徑格式不同:

  • Windows: //C/** 或 //d/**(磁碟機)
  • Unix/macOS: /Users/username/project/**

Factory 會自動偵測目前平台並產生正確的路徑格式。

越權處理機制 ​

什麼是越權操作? ​

越權定義:Agent 寫入了未在其授權清單中的目錄。

典型場景:

Agent授權寫入目錄越權寫入目錄問題
prdartifacts/prd/artifacts/ui/PRD Agent 越界修改了 UI 檔案
techartifacts/tech/artifacts/prd/Tech Agent 修改了需求文件
codeartifacts/backend/artifacts/prd/Code Agent 逆向修改了上游產物

越權處理流程 ​

當 Sisyphus 偵測到越權寫入時:

mermaid
flowchart TD
    A[Agent 完成階段] --> B[Sisyphus 掃描輸出檔案]
    B --> C{路徑在授權清單?}
    C -->|是| D[驗證通過,進入下一階段]
    C -->|否| E[標記為越權]
    E --> F[移動檔案到 _untrusted/]
    F --> G[記錄失敗事件]
    G --> H[暫停流水線]
    H --> I[等待人工介入]
    I --> J{使用者決定}
    J -->|忽略並繼續| K[刪除越權檔案]
    J -->|修改權限| L[更新 capability.matrix.md]
    J -->|修改 Agent 行為| M[調整 Agent 定義]
    K --> N[重新執行階段]
    L --> N
    M --> N

越權產物隔離 ​

越權檔案會被移動到 artifacts/_untrusted/<stage-id>/ 目錄:

範例:PRD Agent 越權寫入 artifacts/ui/

artifacts/
├── prd/
│   └── prd.md
├── ui/
│   └── ui.schema.yaml  ← 原本應該在這裡,但被 PRD Agent 寫入了
└── _untrusted/
    └── prd/
        └── ui/
            └── ui.schema.yaml  ← 越權檔案被移動到這裡

錯誤提示:

⚠️  Unauthorized writes detected for stage "prd":

Untrusted files:
  - artifacts/ui/ui.schema.yaml

Files moved to quarantine: artifacts/_untrusted/prd/artifacts/ui/ui.schema.yaml

Pipeline paused. Please review these files before proceeding.

Choose action:
  1. Delete untrusted files and retry
  2. Adjust permissions in capability.matrix.md
  3. Modify Agent behavior in .factory/agents/prd.agent.md
  4. Continue (accept untrusted files) - Not recommended

人工介入處理 ​

方案 1:刪除越權檔案,重新執行(推薦)

bash
# 檢視越權檔案
ls -la artifacts/_untrusted/prd/

# 刪除越權檔案
rm -rf artifacts/_untrusted/prd/

# 重新執行階段
factory continue

方案 2:調整權限矩陣

如果越權是合理的(例如某個 Agent 確實需要寫入額外的目錄):

bash
# 編輯權限矩陣
nano .factory/policies/capability.matrix.md

# 修改 Agent 的可寫入目錄
# 例如:給 prd Agent 新增 `artifacts/ui/` 寫入權限

# 重新執行
factory continue

方案 3:修改 Agent 行為

如果越權是 Agent 誤操作:

bash
# 編輯 Agent 定義
nano .factory/agents/prd.agent.md

# 明確禁止寫入非授權目錄
# 新增指令:"禁止寫入 artifacts/ui/ 或其他非授權目錄"

# 重新執行
factory continue

警告

選項 4(接受越權檔案)是極不推薦的做法,因為:

  • 違背了權限隔離的設計原則
  • 會導致職責混亂,難以追溯
  • 後續階段可能因為錯誤的產物而失敗

強制技能使用驗證 ​

某些階段要求使用特定的技能來保證輸出品質。Sisyphus 會驗證這些技能的使用情況。

bootstrap 階段驗證 ​

強制要求:必須使用 superpowers:brainstorm 技能

為什麼?

  • Brainstorming 技能提供結構化的思維框架
  • 確保產品想法經過深入挖掘,而非膚淺描述
  • 防止 Agent 跳過關鍵的分析步驟

驗證方法:

  1. 檢查 Agent 輸出訊息中是否明確說明已使用該技能
  2. 如果沒有提及,拒絕接受產物
  3. 提示重新執行,明確強調必須使用該技能

失敗提示:

❌ 檢測到未使用 superpowers:brainstorm 技能

Bootstrap Agent 必須使用 superpowers:brainstorm 技能深入挖掘使用者想法。

請重新執行 bootstrap 階段,並在輸出中明確說明:
"我已使用 superpowers:brainstorm 技能分析使用者想法..."

正確範例:

我已使用 superpowers:brainstorm 技能深入分析使用者想法。

通過 brainstorming 技能,我識別了以下關鍵點:
- 核心問題:[問題描述]
- 目標使用者:[使用者畫像]
- 價值主張:[價值點]
- 關鍵假設:[假設清單]

產生的想法文件:input/idea.md

ui 階段驗證 ​

強制要求:必須使用 ui-ux-pro-max 技能

為什麼?

  • UI/UX Pro Max 技能提供專業的設計系統框架
  • 避免「AI 預設風格」(Inter 字體、紫色漸層等)
  • 確保設計方案的一致性和可維護性

驗證方法:

  1. 檢查 Agent 輸出訊息中是否明確說明已使用該技能
  2. 檢查 ui.schema.yaml 中的設計系統設定是否專業
  3. 如果設計系統設定非專業推薦,拒絕接受產物

失敗提示:

❌ 檢測到未使用 ui-ux-pro-max 技能

UI Agent 必須使用 ui-ux-pro-max 技能產生專業的設計系統和 UI 原型。

請重新執行 ui 階段,並在輸出中明確說明:
"我已使用 ui-ux-pro-max 技能設計 UI 系統..."

正確範例:

我已使用 ui-ux-pro-max 技能設計 UI 系統和原型。

通過 ui-ux-pro-max 技能,我選擇了:
- 設計方向:[具體風格,如:極簡主義 / 賽博龐克]
- 色彩系統:[配色方案]
- 字體系統:[字體選擇]
- 元件庫:[元件規範]

產生的 UI 產物:
- artifacts/ui/ui.schema.yaml
- artifacts/ui/preview.web/index.html

連續失敗處理 ​

如果某個階段連續兩次因為技能驗證失敗:

  1. 暫停流水線
  2. 請求人工介入
  3. 檢查以下可能的問題:
    • AI 助手是否安裝了對應的技能(Plugin)
    • Agent 定義中是否明確要求使用該技能
    • Skill 檔案路徑是否正確

實戰演練:處理越權異常 ​

假設 PRD Agent 越權寫入了 UI 目錄,我們來看完整的處理流程。

步驟 1:識別越權 ​

PRD 階段完成後,Sisyphus 報告:

⚠️  Unauthorized writes detected for stage "prd":

Untrusted files:
  - artifacts/ui/ui.schema.yaml

Files moved to quarantine: artifacts/_untrusted/prd/artifacts/ui/ui.schema.yaml

Pipeline paused.

步驟 2:檢視越權檔案 ​

bash
# 檢視越權檔案內容
cat artifacts/_untrusted/prd/artifacts/ui/ui.schema.yaml

# 輸出範例:
yaml
# PRD Agent 產生的 UI Schema(越權產物)
pages:
  - name: Home
    components:
      - Hero
      - Features

步驟 3:分析原因 ​

可能原因:

原因說明證據
Agent 誤操作PRD Agent 錯誤地產生了 UI 檔案檔案內容確實包含 UI 結構
Prompt 不明確Agent 定義未禁止寫入其他目錄需要檢查 .factory/agents/prd.agent.md
權限設定錯誤PRD Agent 的寫入權限過大需要檢查 capability.matrix.md

檢查 Agent 定義:

bash
cat .factory/agents/prd.agent.md

檢查權限矩陣:

bash
cat .factory/policies/capability.matrix.md | grep -A 1 "prd"

輸出:

| **prd** | `input/` | `artifacts/prd/` | 讀取想法檔案,產生 PRD;禁止寫入其他目錄 |

權限矩陣是正確的,問題出在 Agent 行為上。

步驟 4:修復 Agent 定義 ​

編輯 Agent 定義,新增明確的禁止指令:

bash
nano .factory/agents/prd.agent.md

新增內容:

markdown
## 禁止事項

- ❌ **禁止寫入 `artifacts/ui/` 目錄**:UI 設計由 UI Agent 負責
- ❌ **禁止寫入 `artifacts/tech/` 目錄**:技術架構由 Tech Agent 負責
- ❌ **禁止寫入 `artifacts/backend/` 或 `artifacts/client/`**:程式碼產生由 Code Agent 負責
- ✅ **只能寫入 `artifacts/prd/` 目錄**:產生 PRD 文件

步驟 5:刪除越權檔案,重新執行 ​

bash
# 刪除越權檔案
rm -rf artifacts/_untrusted/prd/

# 重新執行 PRD 階段
factory continue

步驟 6:驗證修復 ​

檢查 PRD 階段是否再次越權:

bash
# 檢視產生的產物
ls -la artifacts/prd/

# 確認沒有寫入其他目錄
ls -la artifacts/_untrusted/prd/

# 輸出應為空,表示沒有新的越權

成功標誌:

✓ prd 完成!

產生的產物:
- artifacts/prd/prd.md

...(檢查點選項)

沒有出現越權警告

安全最佳實踐 ​

1. 初始化時檢查權限設定 ​

bash
# 執行 factory init 後立即檢查
cat .claude/settings.local.json

# 驗證以下內容:
# ✅ permissions.allow 陣列存在
# ✅ 專案路徑正確(Windows 為 //d/**,Unix 為 /path/**)
# ✅ 包含必要的命令權限(npm, git, factory, docker 等)
# ✅ 包含技能權限(superpowers, ui-ux-pro-max)

2. 定期審查權限矩陣 ​

bash
# 檢查權限矩陣
cat .factory/policies/capability.matrix.md

# 確認:
# ✅ 每個 Agent 的讀寫權限合理
# ✅ 沒有過度授權(例如 Code Agent 不應寫入 PRD)
# ✅ 越權處理機制明確

3. 監控越權事件 ​

bash
# 檢視是否有越權檔案
ls -la artifacts/_untrusted/

# 如果存在越權檔案,分析原因:
# - 是 Agent 誤操作?
# - 是權限設定不合理?
# - 是需要調整 Agent 定義?

4. 使用版本控制保護設定檔 ​

bash
# 將關鍵設定檔納入 Git
git add .claude/settings.local.json
git add .factory/policies/capability.matrix.md
git commit -m "chore: add security configuration files"

原因:

  • 防止誤刪或誤改設定
  • 支援權限設定的版本追溯
  • 團隊協作時保持權限一致

settings.local.json 應該提交嗎?

雖然名字包含 local,但 Factory 產生的 .claude/settings.local.json 是專案層級的權限設定,應該納入版本控制。團隊所有成員應該使用相同的權限設定。

5. 定期更新權限設定 ​

當以下情況發生時,需要更新權限設定:

觸發條件需要更新的設定
新增新的 Agent更新 capability.matrix.md
引入新的建置工具更新 settings.local.json 的 Bash 權限
新增新的技能(Plugin)更新 settings.local.json 的 Skill 權限
調整 Agent 職責更新 capability.matrix.md

更新流程:

bash
# 1. 修改設定檔
nano .claude/settings.local.json
# 或
nano .factory/policies/capability.matrix.md

# 2. 提交修改
git add .claude/settings.local.json
git add .factory/policies/capability.matrix.md
git commit -m "security: update permissions for new Agent/Tool"

# 3. 重新初始化權限(可選)
# 如果修改了 capability.matrix.md,無需額外操作,Sisyphus 會自動讀取
# 如果修改了 settings.local.json,可能需要重啟 Claude Code

常見安全問題排查 ​

問題 1:Agent 無法讀取檔案 ​

症狀:

❌ Error: Cannot read file: artifacts/prd/prd.md

排查步驟:

  1. 檢查檔案是否存在

    bash
    ls -la artifacts/prd/prd.md
  2. 檢查 Agent 的讀取權限

    bash
    cat .factory/policies/capability.matrix.md | grep -A 1 "prd"

    確認 Agent 的可讀目錄包含該檔案所在目錄。

  3. 檢查 Claude Code 權限設定

    bash
    cat .claude/settings.local.json | grep "Read"

    確認專案目錄的 Read 權限存在。

問題 2:Agent 無法寫入檔案 ​

症狀:

❌ Error: Cannot write file: artifacts/prd/prd.md

排查步驟:

  1. 檢查 Agent 的寫入權限

    bash
    cat .factory/policies/capability.matrix.md | grep -A 1 "prd"

    確認 Agent 的可寫目錄包含目標目錄。

  2. 檢查 Claude Code 權限設定

    bash
    cat .claude/settings.local.json | grep "Write"

    確認專案目錄的 Write 權限存在。

  3. 檢查目錄是否存在

    bash
    ls -la artifacts/prd/

    如果目錄不存在,Agent 會自動建立,但需要 Write 權限。

問題 3:越權警告頻繁出現 ​

症狀:

同一 Agent 頻繁出現越權警告。

排查步驟:

  1. 分析越權模式

    bash
    ls -la artifacts/_untrusted/<stage-id>/

    檢視 Agent 總是寫入哪些目錄。

  2. 檢查 Agent 定義

    bash
    cat .factory/agents/<stage>.agent.md

    確認是否有明確的禁止指令。

  3. 考慮是否需要調整權限

    • 如果越權是合理的 → 更新 capability.matrix.md
    • 如果越權是誤操作 → 修改 Agent 定義

問題 4:技能驗證失敗 ​

症狀:

❌ 檢測到未使用 superpowers:brainstorm 技能

排查步驟:

  1. 確認技能已安裝

    • 檢查 AI 助手是否安裝了對應的 Plugin
    • Claude Code:檢查 settings.local.json 的 Skill 權限
    • OpenCode:檢查 Plugin 清單
  2. 檢查 Agent 定義

    bash
    cat .factory/agents/<stage>.agent.md

    確認 Agent 明確要求使用該技能。

  3. 檢查 Skill 檔案路徑

    bash
    ls -la .factory/skills/<stage>/skill.md

    確認 Skill 檔案存在且路徑正確。

本課小結 ​

權限與安全機制是 AI App Factory 的核心防護體系,包括:

三層防護:

  1. Claude Code 權限:檔案系統讀寫權限,由 settings.local.json 設定
  2. 能力邊界矩陣:Agent 目錄存取權限,由 capability.matrix.md 定義
  3. 強制技能驗證:特定階段的技能使用要求,由 Sisyphus 驗證

核心原則:

  • 職責分離:每個 Agent 只能讀寫授權目錄
  • 單向依賴:Agent 只能讀取上游產物,不能讀取下流或同級產物
  • 越權隔離:越權檔案自動移至 _untrusted/,等待人工處理
  • 技能保證:Bootstrap 和 UI 階段必須使用指定技能

實踐要點:

  • 初始化時檢查權限設定是否正確產生
  • 定期審查能力邊界矩陣,確保權限合理
  • 監控越權事件,及時修復 Agent 行為
  • 使用版本控制保護設定檔
  • 遇到問題時,按照排查流程定位原因

記住這個流程:

factory init → 產生權限設定 → 執行流水線 → Sisyphus 檢查權限
      ↓                                                      │
      └── 越權? → 移至 _untrusted/ → 人工介入 → 修復 → 繼續 ──┘

下一課預告 ​

下一課我們學習 失敗處理與回滾。

你會學到:

  • 失敗識別機制(輸出缺失、內容不符、越權)
  • 自動重試策略和失敗歸檔流程
  • 回滾機制和人工介入流程
  • 如何從失敗中恢復流水線

附錄:原始碼參考 ​

點選展開檢視原始碼位置

更新時間:2026-01-29

功能檔案路徑行號
能力邊界矩陣定義source/hyz1992/agent-app-factory/policies/capability.matrix.md全文(1-23 行)
Claude Code 權限產生source/hyz1992/agent-app-factory/cli/utils/claude-settings.js38-91 行
權限檢查邏輯source/hyz1992/agent-app-factory/agents/orchestrator.checkpoint.md47-53 行
越權處理策略source/hyz1992/agent-app-factory/agents/orchestrator.checkpoint.md19-21 行
Bootstrap 技能驗證source/hyz1992/agent-app-factory/agents/orchestrator.checkpoint.md58-70 行
UI 技能驗證source/hyz1992/agent-app-factory/agents/orchestrator.checkpoint.md72-84 行

關鍵函式:

  • generatePermissions(projectDir) - 產生 Claude Code 權限設定(第 41-91 行)
  • generateClaudeSettings(projectDir) - 產生並寫入 settings.local.json(第 256-275 行)
  • getPathPatterns() - 取得平台特定的路徑模式(第 14-36 行)

關鍵常數:

  • 越權隔離目錄:artifacts/_untrusted/<stage-id>/
  • 技能名稱:
    • Bootstrap: superpowers:brainstorm
    • UI: ui-ux-pro-max
  • 平台路徑格式:
    • Windows: //{drive}/**
    • Unix/macOS: /path/to/project/**