# FFAI Agent — Phase 2 PRD（Electron Desktop + Teams + Client Executor）

> **状态**：🟡 v0.2 — 架构反推已填；时间 / 阈值 / IT 评估结果待 Phase 1 GA 后填
>
> **本文档定位**：Phase 2（桌面端 + Teams 协同 + 客户端工具）的**详细产品需求**。
>
> **触发条件**：Phase 1 GA + north star 任务完成率达 [`01-prd-phase1.md`](./01-prd-phase1.md) §1 GA 阈值 ≥ 30 天
>
> **上游**：[`01-prd.md`](./01-prd.md) §5.2
>
> **技术对应**：[`02-architecture.md`](./02-architecture.md) §8 PR11 → PR15.5（含 PR14.5）

---

## 1. Phase 2 北极星与退出标准

> ❓ 阈值待 Phase 1 GA 跑出真实基线后填入。

| 指标 | MVP 退出（PR11+PR12 完成）| GA 退出（PR11→PR15.5 完成）|
|---|---|---|
| **主动触达 → 业务动作转化率**（Phase 2 north star，Teams 推审批/任务的转化率）| ≥ ❓ % | ≥ ❓ % |
| Desktop 端 DAU / 总 DAU | ≥ ❓ % | ≥ ❓ % |
| Teams 渠道日活会话数 | ≥ ❓ | ≥ ❓ |
| Client Executor 工具调用拒绝率（用户 deny 比例）| < 30% | < 15% |
| Phase 1 north star（任务完成率）持续达标 | ≥ Phase 1 GA 阈值 | 同上 |
| 客户端授权弹窗体感（用户调研，1-5 分）| ≥ 3.5 | ≥ 4 |
| Teams Bot 消息送达 p95 | < 3s | < 2s |
| Local backend 数据丢失事件 | **0** | **0** |
| 跨组织数据泄漏事件 | **0** | **0** |

---

## 2. 用户故事（按优先级 P0 / P1 / P2）

### 2.1 Desktop 相关（PR11 + PR12 + PR13）

| # | Persona | 故事 | 涉及 PR |
|---|---|---|---|
| **US-301** | 项目经理（power user）| 我想在 Win/macOS Desktop App 直接打开 FFAI Agent，不用每次浏览器找标签 | PR11 |
| **US-302** | 业务员工 | 我想 agent 帮我读本地 `~/Documents/出差报告 Q3.xlsx`，整理 → 推送到组织共享 OneDrive | PR12（File.read）+ PR10.5 |
| **US-303** | 全部 | 我想 agent 长任务跑完时收到系统级桌面通知（即使浏览器/Desktop 在后台） | PR12（Notify.push）|
| **US-304** | 项目经理 | 我想从浏览器复制一段表格，让 agent 翻译并写回剪贴板 | PR12（Clipboard.read/write）|
| **US-305** | IT 管理员 / 数据工程师 | 我想 agent 跑本地 `python` 脚本分析公司内部 csv（不上传 LLM），结果回灌 | PR13（Shell.exec + OS sandbox）|
| **US-306** | 全部 | 我想首次用 File.read 时弹 OS 系统授权弹窗，明确告诉我 agent 要访问什么目录 | PR12（首次授权）|
| **US-307** | IT 管理员 | 我想限制某些用户/组织不能用 Shell.exec（合规），通过 admin 后台 | PR13（HostBridge capability + RBAC）|

### 2.2 Teams 相关（PR14）

| # | Persona | 故事 | 涉及 PR |
|---|---|---|---|
| **US-401** | 业务员工 | 我想在 Teams 1:1 跟 @FFAI Agent 对话，跟在 Web 体验一致 | PR14（Teams Bot Inbound + Identity 映射）|
| **US-402** | 管理者 | 我想 agent 把审批主动推到我的 Teams DM 卡片，我点 "批准/驳回" 按钮即时回调 | PR14（A2UI → Adaptive Card 投影）|
| **US-403** | 项目团队 | 我想在 Teams 项目频道 @FFAI Agent，让它把当前频道 + 关联项目状态汇总发到频道 | PR14（频道支持）|
| **US-404** | 业务员工 | 我想 Teams 聊天窗口拖入附件，agent 自动落到我绑定的 OneDrive | PR14 + PR14.5 |
| **US-405** | 全部 | 我想 Teams 触发的 agent 调用业务工具时，**身份继承到我**（不是 agent 系统账号）| PR14（AAD ↔ FFAI Identity，INV-2）|

### 2.3 Storage / 服务端 CLI（PR14.5 + PR15）

| # | Persona | 故事 | 涉及 PR |
|---|---|---|---|
| **US-501** | Desktop 用户 | 我想 storage backend 切到 "本地"（隐私文件不上 OneDrive），agent 上传走 HostBridge 落本地目录 | PR14.5（LocalStorageAdapter）|
| **US-502** | 组织管理员 | 我想后台预配置组织默认 backend，新员工无感知可用（不必每人 onboarding 走绑定）| PR14.5（admin 后台）|
| **US-503** | IT 管理员 | 我想 agent 帮我跑 `kubectl get pods --namespace=prod`（只读，受白名单限），结果直接 Display 表格 | PR15（cli:kubectl 沙盒）|
| **US-504** | 数据工程师 | 我想 agent 跑 read-only 的 `psql` 查询线上 DB（脱敏视图），不需要打开终端 | PR15（cli:psql RO 角色）|
| **US-505** | DevOps | 我想 agent 调 `git log --oneline -n 20 -- src/` 帮我看本周改动 | PR15（cli:git）|

### 2.4 P2（GA 后再上）

- US-601: 跨 Desktop / Web / Teams 同账号会话同步（用户在哪儿看都一致）
- US-602: Teams 中支持 Plan mode（卡片里渲染 TODO list 让用户审）
- US-603: macOS / Windows 系统托盘 menubar mini-agent（一键唤出）

---

## 3. 功能清单（与架构 §8 PR 表对齐）

| PR | 功能模块 | 用户可见行为 | 优先级 | 验收 |
|---|---|---|---|---|
| **PR11** | Electron Desktop 壳 + HostBridge 接口 + Capability 协商 + Web UI 装壳跑通 + **i18n 双语**（OS 通知 / 系统托盘菜单 / 设置项） | macOS/Windows 双端启动登录 | P0 | US-301 + i18n missing key = 0 |
| **PR12** | Client Executor 第一批工具（`File.read/write/list` + `Notify.push` + `Clipboard.*`）+ 授权弹窗（含 i18n 双语 + a11y 键盘可操作 + ARIA dialog）+ audit（args 走 §4 Permission ask 同套脱敏规则后存原文，便于事故追查）| agent 帮读用户本地 Excel 并总结 | P0 | US-302/303/304/306 + i18n missing key = 0 |
| **PR13** | `Shell.exec` + OS 沙盒 + 二次授权 + admin 关停开关（**默认关，明示开启走 IT 审批**）+ **解释器白名单**（python / node / bash 显式允许，其他拒）+ **网络 egress 默认禁**（白名单放通）+ **fs 边界**（默认仅 `~/FFAI Workspace/`，扩展走 OS 文件选择器）+ **macOS 沙盒方案 day-1 选定**（**review 修正**：sandbox-exec deprecated；**ESF/Network Extension 是监控/拦截框架，不是沙盒**——必须选 App Sandbox + entitlements 或 Firejail-style 自研，PR13 启动前完成 PoC + Apple notarization 申请，**否则 macOS 不上 Shell 仅 Win**）+ **红队测试集（zero-failure gate）**（CWE-Top-25 注入 5 类 × ≥ 5 case + 季度新增样本，跟 PR2 红队 fixture 共享样本池单源管理）| agent 跑本地 git/python 脚本 | P0 | US-305/307 + 红队 25 case **0 逃逸**（任一 fail = block release）+ macOS 沙盒方案 PoC 通过 |
| **PR14** | TeamsInbox（Bot Framework webhook + **JWT 签名验证**）+ Graph API + **AAD↔FFAI Identity 配对挑战机制**（详见下）+ A2UI → Adaptive Card 投影 + 附件自动落 OneDrive + **i18n 双语 Adaptive Card** | @机器人触发审批流，按钮回调，附件自动入库 | P0 | US-401/402/403/404/405 + AAD 伪造测试 + 跨组织 Teams 用户假冒测试 |
| **PR14.5** | LocalStorageAdapter（复用 G4 Client Executor HostBridge fs.\*）+ 管理员后台 StorageBinding 预配置 UI | Desktop 用户切 Local backend 跑通 | P1 | US-501/502 |
| **PR15** | CLI Executor + Docker per-user 沙盒 + 第一批服务端 CLI 工具（git/kubectl/psql 只读 + adp-cli）+ 命令白名单 + network egress 限制 | agent 查 K8s pod 状态 / git log / psql 查询 | P1 | US-503/504/505 |
| ~~PR15.5~~ | **已挪到 Phase 1 PR0.5（monorepo 骨架前置，避免 GA 前抽包大返工）**——Phase 2 不再有 PR15.5；PR11 Electron 直接装 `@ffai/agent-renderer-lark` 即可 | — | — | — |

---

## 4. UI 与交互（详见 05-ui-interaction-spec.md，Phase 2 增量）

### 4.1 Desktop 壳

- **Win/macOS 同源 Chromium webview**（Electron），UI 跟 Web 一致
- **窗口管理**：单窗口（默认）/ 多窗口（Phase 2 GA 后）；最小化到系统托盘（macOS menubar / Windows tray，Phase 2 GA）
- **系统通知**：走 OS 原生通知中心，点击 deep link 拉起对应会话
- **本地数据缓存**：仅会话索引（用于离线显示标题列表），消息明细仍服务端拉

### 4.2 Client Executor 授权弹窗（关键体验决策）

按架构 §1.3.2 安全设计：

| 触发 | 弹窗内容 | 用户选项 |
|---|---|---|
| 首次调用某 capability（fs.read / clipboard / shell 等）| OS 系统级授权 + FFAI 二次确认 | 仅本次 / 本次会话 / 始终允许 / 拒绝 |
| Shell.exec 任何命令 | 命令完整 args + 沙盒目录 + 预期产出 | 同上（默认 ask）|
| File.read 路径不在 `~/FFAI Workspace/` 默认目录 | 路径 + agent 调用理由 | 同上 |

设计原则：**默认严格，明确动作 > 允许列表**。参考 Cursor（fs 写每次 ask）+ Claude Desktop（capability 首次授权）的最优实践。

### 4.2.1 AAD ↔ FFAI Identity 配对挑战机制（review 反馈，详细化原"首次配对挑战"一句话）

**威胁模型**：知道目标 FFAI userId 的同事可在自己 Teams 里发起 pair，把别人的 FFAI 身份绑到自己 AAD → 完整 INV-2 在 Teams 渠道破窗。

**强制流程**（必须双通道挑战 + 用户主动确认）：

1. 用户在 Teams 首次 @FFAI Bot
2. Bot 拒绝服务，回复 Adaptive Card："请先到 https://ffai.workspace/teams/pair 完成配对"
3. 用户在已登录的 FFAI Web（受信任旁路通道，**Web session 必须 reauth within 5 分钟**）点击该链接 → 显示 Teams AAD 信息（tenantId / userId / displayName / 邮箱）
4. **OOB confirm 流程**（review round 2 反馈：6 位挑战码可暴力 + 跨通道复制有截屏/抓包风险）：FFAI Web 弹出 confirm 按钮"是这个 Teams 账号吗？"，用户点确认（不需要键入挑战码到 Teams）
5. Bot 收到 FFAI Web 的 confirm 信号 + 验证 tenantId + AAD claim 一致 → 落 `TeamsIdentityMapping` 表（含挑战时间戳 / Web session id / IP / user-agent）+ **挑战速率限制**：单用户每 10 分钟最多 3 次配对尝试，防暴力 brute force
6. 落 TrajectoryEvent：source=`teams_identity_pair`，含完整审计

**安全约束**：
- 挑战码不可重用、5 分钟过期、单次使用
- 同一 AAD User ID 已绑定 FFAI User → 拒绝再绑（防覆盖攻击）
- 解绑必须从 FFAI Web 发起（不能从 Teams）+ 二次确认
- AAD tenantId 必须在公司允许列表（多组织映射时按 organizationId 强一致）
- 配对过程中 Web session 必须仍登录（防 session 劫持）

**API（替代原 `/identity/pair` 单端点）**：
- `POST /api/agent/teams/identity/challenge` —— Web 端发起，返回挑战码
- `POST /api/agent/teams/identity/confirm` —— Teams Bot 收到挑战码后验证
- `DELETE /api/agent/teams/identity/binding/:id` —— Web 端解绑

### 4.3 Teams 卡片

- **Adaptive Card v1.5**（Teams 原生支持最广）
- **A2UI → Adaptive Card 映射矩阵**：
  - `Text` → `TextBlock`
  - `Table` → `Table` (Adaptive Card 1.5+)
  - `Form` → `Input.*` 组件
  - `Button` → `Action.Submit` + 回调 URL
  - `Chart` / `Diff` / `File` → 降级为 "打开 Web 工作台" 链接卡（架构 §1.1.3 fallback 协议）
- **审批卡片专属设计**：单卡片含审批摘要 + 批准/驳回按钮 + 备注框

### 4.4 admin 后台增量页面（PR14.5 + PR15）

- **StorageBinding 配置页**：组织级默认 / per-user override / per-project override
- **Client Executor 关停开关**：per-org `disabledCapabilities: ['shell', 'fs.write']`
- **CLI 工具白名单管理**：可见哪些 cli 工具，per-org 控制

---

## 5. 数据模型（详见 02-architecture §5 + 06-data-model.md）

### 5.1 Phase 2 新增表

| 表 | 用途 | PR |
|---|---|---|
| `TeamsBotInstallation` | Teams Bot 安装/卸载状态、tenantId | PR14 |
| `TeamsIdentityMapping` | AAD User ID ↔ FFAI User ID（首次配对挑战记录）| PR14 |
| `ClientExecutorAuditLog` | Client 工具调用全记录（host_machine_id / capability / granted / args 摘要）| PR12 |
| `ShellSandboxPolicy` | per-org / per-user 的 Shell 限制规则 | PR13 |
| `CliToolDefinition` | 服务端 CLI 工具定义（template / sandbox image / 白名单）| PR15 |
| `OrganizationStorageBinding` | 组织默认 backend（PR14.5 admin 预配置）| PR14.5（已在 Phase 1 PR10.5 schema 里，PR14.5 加 admin UI）|

### 5.2 Phase 1 表的 Phase 2 字段扩展

| 表 | 新字段 | PR |
|---|---|---|
| `AgentSession` | `surface: 'web' \| 'desktop' \| 'teams' \| 'cli'`（已在架构里）| PR14 |
| `OrganizationAgentSettings` | `disabledCapabilities`（client executor 关停）/ `allowedCliTools`（CLI 工具白名单）| PR13 + PR15 |
| `StorageBinding` | `kind` 增 `'local'` | PR14.5 |

---

## 6. API 契约（Phase 2 增量，详见 07-api.md）

| Endpoint | Method | 用途 | PR |
|---|---|---|---|
| `/api/agent/desktop/host-bridge/capabilities` | POST | Desktop 壳启动时上报 capabilities | PR11 |
| `/api/agent/teams/webhook` | POST | Teams Bot Framework 入站 | PR14 |
| `/api/agent/teams/installations` | GET | 列出 Teams 安装状态（admin）| PR14 |
| `/api/agent/teams/identity/pair` | POST | AAD ↔ FFAI Identity 配对 | PR14 |
| `/api/agent/admin/client-executor/policies` | GET / POST | per-org disabledCapabilities CRUD | PR13 |
| `/api/agent/admin/cli-tools` | GET / POST / DELETE | per-org CLI 工具白名单管理 | PR15 |
| `/api/agent/admin/storage/binding/organization` | GET / POST | 组织默认 backend 预配置 | PR14.5 |
| `/api/agent/admin/audit/client-executor` | GET | ClientExecutorAuditLog 钻取 | PR12 |

**HostBridge 协议**（非 HTTP，是 Electron IPC / WS 反向通道，详见 02-architecture §1.3.2）：
- `capabilities()` —— 启动时上报
- `invoke(tool, args)` —— 反向调用工具，返回 `{ granted, result?, error? }`

**Teams Bot 协议**：完全遵循 Microsoft Bot Framework v4 + Adaptive Card 1.5。

---

## 7. 验收标准（按 US 编号，BDD）

### US-301 验收
```gherkin
Given 我已在公司 IT 拿到 FFAI Desktop 安装包（macOS .dmg / Windows .msi）
When 我打开 App，输入 SSO 登录
Then App 加载跟 Web 一致的 UI（Lark DS + 三栏）
And 同账号在 Web 和 Desktop 看到同一份会话列表
And 主动通知（如长任务完成）能从系统通知中心收到
```

### US-302 验收
```gherkin
Given 我有 Desktop App + 已绑定 OneDrive backend
When 我跟 agent 说 "读 ~/Documents/出差报告 Q3.xlsx 整理后传到 OneDrive 项目目录"
Then 首次弹 OS 授权弹窗（fs.read 权限），我点 "本次会话允许"
And agent 通过 client:fs.read 读到文件 → 内部分析 → 通过 service:File.upload 写到 OneDrive
And OneDrive Web 能看到新文件
And ClientExecutorAuditLog 有这次调用记录
```

### US-305 验收
```gherkin
Given 我有 Desktop App + Shell.exec 未被 admin 关停
When 我跟 agent 说 "用 python 算下 ~/data/sales.csv 的月度环比"
Then agent 调 client:shell 跑 `python -c "..."`
And OS 沙盒生效（无法访问 ~/Documents 之外）
And 二次授权弹窗显示完整命令 + 沙盒目录
And 结果回灌到对话流，Display Panel 渲染表格
```

### US-401 验收
```gherkin
Given 我公司 Teams 已安装 FFAI Bot
When 我在 Teams 1:1 @FFAI 说 "我本周待办"
Then 1.5 秒内 Bot 响应 Adaptive Card 列出待办（同 Web 体验，但 UI 是 Teams 卡片）
And agent 调业务工具时身份继承到我（INV-2 + US-405）
```

### US-402 验收
```gherkin
Given 我是审批人，组织已开启 Teams 审批通知
When 有人提交差旅审批，agent 触发"主动推送"
Then 我 Teams DM 收到 Adaptive Card：审批摘要 + 批准/驳回 + 备注框
When 我点 "批准"
Then 1 秒内 Approval.act 调用完成，卡片 update 为"已批准"
And 提交人 Teams 收到结果通知
```

### US-501 验收
```gherkin
Given 我是 Desktop 用户，绑定 backend 切到 "本地"
When agent 上传文件
Then File.upload 路由到 LocalStorageAdapter（不是 OneDrive）
And 文件实际落到 ~/FFAI Workspace/<org>/<project>/ 目录
And Phase 1 OneDrive 用户不受影响（StorageRegistry 按 binding 路由）
```

### US-503 验收
```gherkin
Given 我有 IT 管理员 RBAC，组织开启 cli:kubectl 工具
When 我跟 agent 说 "看 prod 命名空间的 pod 状态"
Then agent 调 cli:kubectl get pods --namespace=prod（只读白名单）
And Docker per-user 沙盒（image: ffai/cli-runner:kubectl）执行
And 网络仅放通 K8s API endpoint
And 结果以表格在 Display Panel 渲染
```

剩余 US 验收待对应 PR 启动时补。

---

## 8. 测试策略（Phase 2 增量）

| 层 | Phase 2 重点 |
|---|---|
| **L0a/L0b** | 新增 client executor / Teams Bot / CLI 工具 schema 校验 |
| **L1** | Teams Bot webhook 单元集成 + ClientExecutorAuditLog 记录完整 + Shell 沙盒越界拒绝 + 跨组织 cli 工具白名单生效 |
| **L2 MCP** | Desktop 壳安装 → 登录 → 调 File → 推 OneDrive 完整流程；Teams 模拟器跑审批卡片回调 |
| **L3 人工验收** | 内测部门 Desktop 用户 1 周日常使用反馈；Teams 审批 1 周流量验证 |
| **平台覆盖** | Win 10 / Win 11 / macOS 13+ / macOS 14+ 各跑 smoke；Teams Web / Teams Desktop 各跑 |

**新增专项测试**：
- **沙盒逃逸测试**（PR13）：恶意 prompt 注入诱导 agent 跑 `/etc/passwd` 必须被沙盒拦
- **AAD 身份伪造测试**（PR14）：篡改 Teams webhook payload 模拟其他用户必须验签失败
- **Teams 离线降级**（PR14）：Bot Framework 不可达时 web 端不受影响

---

## 9. 上线计划与里程碑

> ❓ 时间窗待 Phase 1 GA 数据出来后填。

| 里程碑 | 范围 | 用户 | 退出标准 |
|---|---|---|---|
| **M3 Desktop 内部 Alpha** | PR11 + PR12 | 内部团队 ~10 人 | Desktop 装包 + 三件套 + File 跑通 |
| **M4 Desktop GA** | + PR13 + PR14.5 | 全员可下载 | Shell 沙盒生产稳定 + Local backend 0 数据丢失 |
| **M5 Teams Beta** | + PR14 | 内测部门 Teams 频道 | Teams 三件套 + 审批主动推送转化率达 north star 阈值 |
| **M6 Teams GA** | + 多频道 + 多组织铺开 | 全员 | Phase 2 north star 达标 ≥ 30 天 |
| **M7 服务端 CLI 上线** | + PR15 | IT / 数据团队 | sandbox 0 逃逸 + 白名单 0 误放通 |
| **M8 monorepo 抽包完成** | PR15.5 | （透明，不影响用户）| Web/Desktop UI diff = 0 |

---

## 10. 风险与依赖

### 10.1 Phase 2 特有依赖

| 依赖 | 状态 | 缺则影响 | 责任方 |
|---|---|---|---|
| **Microsoft Bot Framework + Graph API 国内可达性** | **建议 Phase 1 GA 时启动调研**（不是 PR14 启动时）| PR14 Teams 完全不通；Phase 2 north star 不可达 | IT |
| **法务 Teams 数据出境合规**（Bot Framework + Graph API 默认走 Azure 全球，每条 Teams 消息出境）| 待评估 | 跟 LLM 出境合规同等阻断 | 法务 + IT |
| **per-surface cost budget**（Phase 2 引入 Teams 主动推送 + 服务端 CLI + 后台任务，token 消耗放大；Phase 1 quota 必须扩展）| 待设计 | 月度成本失控 | SRE + 财务 |
| **Apple Developer / Microsoft 代码签名证书**（Electron 分发）| 待申请 | macOS Gatekeeper / Windows SmartScreen 拦截 | 公司 IT / 法务 |
| **公司 IT 软件分发渠道**（Desktop App 分发） | 待确认 | 用户拿不到安装包 | IT |
| **AAD（Azure AD）公司租户** | 现存 | Teams Identity 映射跑不通 | IT |

### 10.2 Phase 2 特有风险

| 风险 | 影响 | 缓解 |
|---|---|---|
| Electron 包体积大 / 自动更新链路复杂 | 用户更新慢、装包烦 | 用 electron-updater + 公司内部 CDN |
| Teams Bot Framework 国内可达性问题 | Teams 完全不通 | day-1 评估，必要时切 Azure China 或延后 PR14 |
| Shell 沙盒被绕过 | **P0 安全事故** | 红队 prompt injection 测试 + OS 沙盒 + 二次授权 + admin 关停开关 |
| Client Executor 授权弹窗被滥用导致用户烦躁 | UX 灾难 | 参考 Cursor / Claude Desktop 最优实践 + capability 粗粒度（不每文件 ask）|
| Teams 渠道审批回调延迟 | 业务卡顿 | Webhook 异步入队 + p95 SLO |
| AAD ↔ FFAI Identity 映射错误 | 跨用户身份污染 | 首次配对挑战 + 审计日志 + 单元测试覆盖边界 |

---

## 11. 文档版本

| 版本 | 日期 | 变更 | 作者 |
|---|---|---|---|
| v0.0 (占位) | 2026-05-15 | 已知方向 + 待办 outline | (slot-2 session) |
| v0.2 (架构反推完整版) | 2026-05-15 | 按 Phase 1 PRD 同等深度重写：US 16 条 / PR 7 个 / 数据模型增量 / API 增量 / BDD 验收 6 条 / 风险依赖 | (slot-2 session) |
| v0.3 (8 角色 review) | 2026-05-15 | PR15.5 删除（移到 Phase 1 PR0.5）/ PR14 AAD 配对挑战详细化 / Teams 国内可达性提前到 Phase 1 GA / 加 per-surface cost budget / 加 i18n Adaptive Card 双语 | (slot-2 session + 8 角色 review) |
| v0.4 (Round 2 review) | 2026-05-16 | PR13 Shell sandbox 详细化（解释器白名单 + 网络禁 + fs 边界 + 红队 25 case + macOS deprecation 监控）/ PR14 AAD 配对改 OOB confirm + 速率限制 | (slot-2 session + 8 角色 round 2) |
| v0.5 (Round 3+4 review) | 2026-05-16 | PR13 修正 ESF/NE 措辞（ESF 是监控不是沙盒，必须选 App Sandbox 或 Firejail-style）+ 红队改 zero-failure gate / PR11/PR12 加 i18n 双语 + a11y / PR12 audit args 走 §4 脱敏规则后存原文 | (slot-2 session + 8 角色 round 3+4) |
