# 权限与确认引擎

## 1. 目标

Agent 不能只靠提示词判断能不能执行动作。

财务系统需要独立的权限与确认引擎：

```text
Permission Engine
Confirmation Engine
```

它们负责：

- 判断用户是否能看某类数据。
- 判断任务是否能调用某个能力。
- 判断动作是否需要确认。
- 判断动作是否禁止自动执行。

## 2. 动作风险分级

建议按 L0-L5 分级。

### L0 只读查询

例子：

- 查询制度。
- 查询单据状态。
- 查询规则说明。
- 查询任务运行记录。

要求：

- 需要权限。
- 不需要确认。

### L1 生成建议

例子：

- 生成审批意见建议。
- 生成风险解释。
- 生成规则优化建议。

要求：

- 需要权限。
- 不写业务状态。
- 不需要确认，但要标记为建议。

### L2 生成草稿

例子：

- 生成报销草稿。
- 生成付款申请草稿。
- 生成知识库候选。

要求：

- 需要权限。
- 写入草稿区。
- 不进入正式流程。

### L3 用户确认后提交

例子：

- 用户确认后提交报销。
- 审批人确认后写入审批意见。
- 用户确认后发起补件。

要求：

- 必须二次确认。
- 必须记录确认人。
- 必须记录确认前后内容。

### L4 管理员确认后发布

例子：

- 发布规则。
- 发布知识库。
- 启用 MCP。
- 启用任务。

要求：

- 必须管理员确认。
- 必须有审核记录。
- 必须有版本。

### L5 禁止自动执行

例子：

- 自动最终审批。
- 自动付款。
- 自动绕过风控。
- 自动修改核心财务状态。

要求：

- Agent 永远不能直接执行。

## 3. 权限判断输入

```json
{
  "user_id": "emp_001",
  "agent": "user_agent",
  "source": "user_message",
  "action": "create_reimbursement_draft",
  "domain": "reimbursement",
  "resource": {
    "type": "reimbursement_request",
    "id": ""
  },
  "capability": "travel_reimbursement_create"
}
```

## 4. 权限判断输出

```json
{
  "allowed": true,
  "risk_level": "L2",
  "requires_confirmation": false,
  "reason": "",
  "permission_scope": {
    "departments": ["current_user"],
    "data_masking": false
  }
}
```

## 5. 确认弹窗策略

需要确认的动作必须显示：

- 动作名称。
- 影响对象。
- 关键字段。
- 执行后果。
- 是否可撤销。
- 确认人。

示例：

```json
{
  "title": "确认提交报销申请",
  "action": "submit_reimbursement",
  "summary": "将提交差旅报销单 TR-202605001，金额 ¥3,280。",
  "risk_level": "L3",
  "confirm_button": "确认提交"
}
```

## 6. Hermes 权限

Hermes 使用服务账号，不使用个人账号。

建议拆分权限：

```text
hermes:risk_scan
hermes:finance_statistics
hermes:knowledge_candidate
hermes:mcp_health_check
```

Hermes 默认只允许：

- 读脱敏快照。
- 跑规则。
- 调只读 MCP。
- 写报告、候选、工单。

Hermes 不允许：

- 写正式审批状态。
- 写正式付款状态。
- 发布规则。
- 发布知识。

## 7. User Agent 权限

User Agent 继承当前用户权限。

例如：

- 员工只能看自己的报销。
- 部门负责人可以看本部门。
- 财务可以看授权范围内数据。
- 管理员可以管理规则、任务、MCP。

User Agent 不能扩大用户权限。

## 8. 开发步骤

```text
Step 1: 定义 action risk level
Step 2: 建立 Permission Engine 接口
Step 3: 所有工具调用前接入权限判断
Step 4: L3/L4 动作接入确认弹窗
Step 5: 审计记录确认内容
Step 6: 增加权限测试用例
```

