# AI 审批编排 — PRD（阶段 0 + 阶段 1 合并）

> **版本**: v1.0-draft
> **状态**: 🚧 Draft（待 multi-role review）
> **最后更新**: 2026-05-19
> **关联 Issue**: [#409](http://43.130.59.228/FFAIWorkspace/workspace/issues/409) / [#410 issuecomment-4528](http://43.130.59.228/FFAIWorkspace/workspace/issues/410#issuecomment-4528)
> **EU AI Act 时间窗**: 2026-08-02 强制生效（buffer 10.5 周）

---

## 1. 概述

### 1.1 一句话目标

把 FFOA 审批从"纯人工流程引擎"演化为支持 L1 AI 辅助审批的 AI-first 架构，落地 EU AI Act Article 14 合规框架（policy-as-code + 可证明人类监督 + 完整审计），MVP 覆盖审批量 top 5 form_template（约 80% 业务量）。

### 1.2 范围（阶段 0 + 阶段 1）

**In-scope**：

- **阶段 0 共用基建**：
  - Policy-as-Code 声明式策略表 + 自身版本审计（ApprovalPolicyHistory）
  - Risk Tier Registry（3 tier × 4 维评分 + top 5 form_template 起步配置）
  - AI Form Spec 标准（落 `FormVersion.schema._ai`；本模块定义规范，form-engine 持有数据）
  - audit-system 扩 6 字段 + AuditAction 4 新值 + 哈希链分段迁移规范（本模块声明扩展需求，audit-system 实施）
  - 校准 Dashboard（`/ai-orchestration/calibration`）+ 5 核心 metric
- **阶段 1 L1 辅助审批**：
  - AiRecommendationLog（审批 task × AI 调用全链路）
  - AI 推荐生成器（ModelRouter + 历史相似 Top 3 + 推理链 + 幂等）
  - 反 rubber-stamp affordance（Tier 3 强制阅读 + "我已阅读"勾选 + 推翻 modification_diff 必填）
  - AI 不可用 fallback（侧栏保留 + 不阻塞审批 + audit 标记原因）

**Out-of-scope**（本 PRD 不实施，留接口位）：

| 项 | 归属 / 时机 |
|---|---|
| AI Form Genesis 自然语言生成 | `ai-form-genesis` 模块（合并 PRD 阶段 1.5）|
| approval-engine `AI_STAGE` 节点类型 | 阶段 2 独立工单 |
| approval-engine `ApprovalTaskAction.ANALYSIS_FAILED` | 阶段 2 独立工单 |
| L3 Agent 主动提单 | 阶段 3 独立工单 |
| Phase 2 置信度 ensemble calibration（calibrated_confidence 字段） | 阶段 1 上线后 1 个月数据收集；本 PRD 字段位预留 NULL |
| ModelRouter region routing 实现 | 独立 spike（本 PRD 阶段 0 范围标阻塞项）|
| ModelRouter 容量 + 成本估算 | 独立 spike |

---

## 2. 背景与为什么是现在做

### 2.1 现状

FFOA 审批 + 表单已达"传统审批系统"完整形态：4 模块 + 1 流程图模块文档齐全，30 字段类型 L2 验证基本完成，多审批模式（串/并/会/或签、加签/减签/转发/撤回/重提循环）全部支持，Temporal.io 深度集成，覆盖矩阵实现 ~83% / 测试 ~78%。

但站在 AI 时代回看，**审批环节缺失 AI 介入点**——决策、推荐、自动路由、起草批语、风险识别这些 AI 时代标配能力没有承载位置；当前 approval-engine 还是"纯人工流程引擎"。

### 2.2 为什么是现在做

1. **EU AI Act Article 14（2026-08-02 强制生效）**：高风险 AI 强制要求"可证明的人类监督 + policy-as-code 与 agent 代码分离 + 完整审计"——任何"事后补"方案合规成本高一个量级
2. **业界 2026 已收敛**：Microsoft Copilot Studio multistage approvals / Salesforce Agentforce Operations / ServiceNow Otto 都是 3 层 HITL（辅助审批 → AI Stage → Agent 主动提单）公开参考
3. **FFAI Agent Phase 1 完成**：ModelRouter + Temporal + form-engine schema + 审计 + 多租户字段全部就位
4. **现在不做，未来每加一个 AI 能力都要绕过历史包袱**

---

## 3. 跟 standards/16 的关系（合规论证）

Policy-as-Code / Risk Tier Registry / AI Form Spec 三张表表面像 `docs/standards/16-data-layering-and-metadata-policy.md` §4.1 禁止的"L4 元数据驱动"，但实际定性为**"事实存储 + 合规审计"**，不属 L4。4 条理由：

| # | 理由 |
|---|---|
| 1 | **不给业务运营自助配置**：本模块的策略表由 IT 管理员 / AI Ops 配置，不开放业务运营在生产 UI 自助加字段——不命中 §4.6 触发条件 2 |
| 2 | **法规约束非灵活性需求**：EU AI Act Article 14 / GDPR Article 22 强制要求 "policy 可独立于 agent 代码审阅 + 完整审计 trail"——这是法规要求 policy 必须存数据库而不是硬编码，**跟"想让产品灵活"的元数据驱动场景动机相反** |
| 3 | **存档本质是事实数据**：AI 推荐 / 推理链 / 修改 diff 是已发生事件的事实记录（类似 AuditLog），不是"运行时由数据驱动业务逻辑"——存储模型上是 L3 事件表 + 物化 Snapshot 形态 |
| 4 | **边界清晰**：跟 "FieldDefinition / WorkflowDefinition / GuardDefinition 让运营在 UI 改业务规则"的元数据驱动场景判据不重叠——本模块没有"运营在 UI 改字段定义" 这种 §4.1 反模式 |

**未来若其他模块引用本 PRD 当先例**，复用"事实存储 vs 配置"判据。

**若 review 阶段被驳回**（reviewer 不同意"不属 L4"判定）：
- 上升用户决策；
- 备选方案 A：把 ApprovalPolicy 重命名为 `ApprovalDecisionPolicy` 强调"事实存储"；
- 备选方案 B：扩 standards/16 增加 L4 合规子类（"合规驱动的策略表"豁免 L4 限制）。

---

## 4. MVP 范围与灰度策略

### 4.1 灰度维度

| 维度 | 说明 |
|---|---|
| **form_template**（主灰度） | 按审批量 top 5 form_template 先后开启；其他模板默认 `ai_mode=OFF` |
| **organizationId**（兜底灰度） | 某组织 LLM 推荐质量差 / 数据质量差 → Policy-as-Code 单独关该组织 |

主键 + 唯一性约束（详 §5.1.1）：表 `id` 用 UUID 作 PK；业务唯一性走 **partial unique** `(form_template_key, organization_id) WHERE is_active=true`，保证"同 key+org 同一时刻只有 1 条 active"，同时允许历史 inactive 记录共存（用于策略变更前后的 effective_from/effective_to 时间轴）。

### 4.2 Top 5 form_template 起步配置（详见附录 A）

| form_template | 初始 tier | ai_mode | confidence_threshold | 月预算（USD）|
|---|---|---|---|---|
| expense（报销） | Tier 1 | RECOMMEND | 0.70 | 1000 |
| business-trip（出差） | Tier 1 | RECOMMEND | 0.70 | 800 |
| purchase（采购） | Tier 2 | RECOMMEND_WITH_REVIEW | 0.70 | 1500 |
| contract-sign（合同签署） | Tier 3 | RECOMMEND_WITH_HARD_GATE | 0.75 | 2000 |
| asset-disposal（资产处置） | Tier 3 | RECOMMEND_WITH_HARD_GATE | 0.80 | 1000 |

### 4.3 ai_mode 枚举

| 值 | 含义 |
|---|---|
| `OFF` | AI 推荐功能禁用（默认 fail-safe） |
| `RECOMMEND` | 显示推荐 + 置信度 + 推理链；审批人自由采纳 / 修改 / 忽略 |
| `RECOMMEND_WITH_REVIEW` | 同上 + 推翻 modification_diff 必填理由 |
| `RECOMMEND_WITH_HARD_GATE` | 同上 + Tier 3 反 rubber-stamp affordance（强制阅读倒计时 + "我已阅读"勾选） |
| `SUGGEST_ONLY`（保留位） | 仅"建议"显示，不算正式推荐；Phase 2 加 |

---

## 5. 功能模块

### 5.1 Policy-as-Code

#### 5.1.1 数据形态（详见 06-data-model）

主表 `ApprovalPolicy`：
- **PK** = `id`（UUID）
- **业务唯一性** = partial unique `(form_template_key, organization_id) WHERE is_active=true`
- **时间轴** = `effective_from` / `effective_to`（历史 inactive 记录用 effective_to 标记结束时间；同一 (form_template_key, organization_id) 可以有多条 inactive + 1 条 active）
- **策略变更流程** = 写入新 active 记录 + 把旧 active 改 `is_active=false` + 同事务设 `effective_to=now()` + 写 ApprovalPolicyHistory（详 §5.1.3）

字段（关键）：
- `form_template_key`（如 `'expense'`）
- `organization_id`（'__GLOBAL__' 表示全局兜底；具体 org_id 覆盖全局）
- `tier`（引用 `RiskTierRegistry.tier_id`）
- `ai_mode`（OFF / RECOMMEND / RECOMMEND_WITH_REVIEW / RECOMMEND_WITH_HARD_GATE）
- `confidence_threshold`（默认 0.7）
- `monthly_ai_call_budget`（USD；超限自动降级 ai_mode=OFF）
- `cross_org_visibility`（NONE / HIERARCHICAL / GLOBAL，默认 NONE）
- `reviewer_set`（required reviewer 角色列表，JSON）
- `effective_from` / `effective_to`（时间窗）
- `created_by` / `updated_by` / `is_active`

#### 5.1.2 解析顺序

查询时：`(form_template_key, organization_id)` 精确匹配 → 命中即用；否则 `(form_template_key, '__GLOBAL__')` 兜底；都不命中 → 隐式 `ai_mode=OFF`（fail-safe）。

#### 5.1.3 版本审计（ApprovalPolicyHistory）

每次 ApprovalPolicy 修改写一条 history 记录：
- `policy_id` / `revision_number` / `before_snapshot` / `after_snapshot` / `changed_by` / `changed_at` / `change_reason`

ApprovalPolicy 软删除（`is_active=false`）→ history 保留全量历史。

#### 5.1.4 配置变更告警

某 `(form_template, org)` 24 小时内策略变更 ≥ 3 次 → 告警 AI Ops oncall（防被滥用 / 防回环抖动）。

---

### 5.2 Risk Tier Registry

#### 5.2.1 数据形态

`RiskTierRegistry` 表：3 行固定（v1 不开放新增），`tier_id ∈ {1, 2, 3}`。

每 tier 含 4 维评分阈值（max 评分；评分体系详见 5.2.2）：
- `irreversibility_max`（不可逆性 0-10）
- `blast_radius_max`（影响半径 0-10）
- `compliance_max`（合规敏感度 0-10）
- `confidence_required_min`（置信度下限 0.0-1.0）

| tier | irreversibility | blast_radius | compliance | confidence_required |
|---|---|---|---|---|
| 1（低风险） | ≤ 3 | ≤ 3 | ≤ 3 | ≥ 0.65 |
| 2（中风险） | ≤ 6 | ≤ 6 | ≤ 6 | ≥ 0.70 |
| 3（高风险） | ≤ 10 | ≤ 10 | ≤ 10 | ≥ 0.75 |

#### 5.2.2 评分语义

| 维度 | 0-3 | 4-6 | 7-10 |
|---|---|---|---|
| irreversibility | 可在 24h 内回滚 | 需人工干预回滚 / 7 天内 | 不可回滚 / 资金支付 / 合同签署 |
| blast_radius | 影响 1 人 | 影响 1 部门 / ≤ 10 人 | 影响全公司 / 跨组织 / 客户可见 |
| compliance | 内部流程 | 涉合规但非强制（如 SOX 报告辅助） | EU AI Act / GDPR / 财务审计强相关 |
| confidence_required | LLM 自信即可 | 历史相似度高 + 自信 | 多模型集成 + 历史相似度高 + 风险点核对完成 |

#### 5.2.3 form_template → tier 映射

写在 `ApprovalPolicy.tier` 字段（不在 `RiskTierRegistry` 表写映射，保持 Registry 纯净）。

---

### 5.3 AI Form Spec 标准

本模块**定义规范**，`form-engine` 持有数据（落 `FormVersion.schema._ai` 子节点）。

#### 5.3.1 `_ai` 子节点 schema

`FormVersion.schema` JSON 顶层加 `_ai` 字段（不影响现有 form 渲染器）：

```jsonc
{
  "type": "object",
  "properties": { /* 现有字段定义 */ },
  "_ai": {
    "version": "1.0",                   // AI Form Spec 标准版本
    "generation_prompt": "用户原始的自然语言输入",
    "model_version": "claude-opus-4-7", // 生成时模型版本 = prompt hash 上下游
    "model_calls": [                    // LLM 调用 trace
      { "call_id": "uuid", "model": "...", "tokens_in": 0, "tokens_out": 0, "duration_ms": 0 }
    ],
    "frozen": true,                     // 锁版标记；frozen=true 禁止任何字段编辑
    "frozen_at": "2026-05-19T13:35:50+08:00",
    "frozen_by": "user-uuid",
    "risk_tier": 2,                     // 跟 ApprovalPolicy.tier 联动
    "sensitive_fields": ["amount", "id_card_number"],  // PII 字段名清单
    "source_origin": "AI" | "DESIGNER" | "TEMPLATE",
    "audit_log_ids": [/* 关联 audit 记录 */]
  }
}
```

#### 5.3.2 版本机制

- `_ai.version = '1.0'`（本 PRD v1.0 定）
- 未来扩展字段：**只加不删**；`_ai.version` 升版时旧 FormVersion 仍合法
- 字段定义详见 06-data-model

#### 5.3.3 冻结策略

- `frozen=true` → 任何 FormVersion 字段编辑被 form-engine 拒绝（API 层校验）
- `frozen=true` → 仅可发布新 FormVersion（version + 1）继承
- designer 视图遇到 `frozen=true` → 切只读 + AI 元字段标灰禁编（详 form-management 模块）

#### 5.3.4 sensitive_fields 强制规则

- AI 推荐 / AI Form Genesis 调用 LLM 前，**强制 redact** `sensitive_fields` 列出的字段值（替换为 `[REDACTED]`）
- AuditLog 记录 "已脱敏" 标记 + 脱敏前 hash（不存原值）
- 生产环境 PII 字段未标 `sensitive_fields` 是高风险 leak —— 阶段 0 出 sensitive_fields 标准识别 + 强制清单（详 06-data-model）

---

### 5.4 AI 推荐生成器（阶段 1 核心）

#### 5.4.1 触发时机

审批 task 处于 `PENDING` 状态 + Policy-as-Code 命中 `ai_mode ≠ OFF` + 月度 budget 未超 → 异步触发 AI 推荐生成（Temporal Activity）。

#### 5.4.2 生成流程

```
1. 幂等 key 检查：(approval_task_id, turn_id, prompt_hash) 2 分钟内 → 复用上次结果
2. PII redact：根据 FormVersion._ai.sensitive_fields redact 表单字段
3. 历史相似 Top 3：调 knowledge-base RAG（按 organizationId 隔离 / HIERARCHICAL / GLOBAL 按 Policy.cross_org_visibility）
4. ModelRouter 按 tier 选模型 + region routing（依赖 ModelRouter spike 完成）
5. LLM 调用：组装 prompt（form data redacted + 历史 Top 3 + 风险点 hints + system prompt v{model_version}）
6. 输出解析：recommended_action + confidence + reasoning_chain（max 4KB）+ risk_indicators[]
7. 置信度判断：单条推荐落库 `AiRecommendationLog.effective_ux_mode` 字段（per-recommendation 渲染模式，独立于 Policy 级 `ai_mode`，枚举集合 = §4.3 ai_mode 枚举的子集）：

   **降级表**（输入 `ai_mode` + `confidence < threshold` → 输出 `effective_ux_mode`）：

   | Policy `ai_mode` | confidence ≥ threshold | confidence < threshold |
   |---|---|---|
   | `OFF` | `OFF`（不生成推荐）| `OFF`（不生成推荐，**保 fail-safe**）|
   | `RECOMMEND` | `RECOMMEND` | `RECOMMEND_WITH_REVIEW`（**渲染层降级**：禁用一键采纳 + modification_diff 必填理由）|
   | `RECOMMEND_WITH_REVIEW` | `RECOMMEND_WITH_REVIEW` | `RECOMMEND_WITH_REVIEW`（已是最严，无需再降级）|
   | `RECOMMEND_WITH_HARD_GATE` | `RECOMMEND_WITH_HARD_GATE` | `RECOMMEND_WITH_HARD_GATE`（保留 Tier 3 强制阅读）|
   | `SUGGEST_ONLY` | `SUGGEST_ONLY` | `SUGGEST_ONLY`（仅建议，不算正式推荐，无需降级）|

   **关键不变量**：
   - `effective_ux_mode` 枚举集合 ⊆ §4.3 `ai_mode` 枚举（不引入新值）
   - `ai_mode=OFF` 始终保留 fail-safe，**任何 confidence 都不升级**
   - **不修改 Policy.ai_mode** 本身；仅在单条 AiRecommendationLog 上写 effective_ux_mode
   - 语义层级：`ai_mode` = "模板默认 UX 是什么"（Policy 级配置）；`effective_ux_mode` = "这条推荐实际 UX 怎么渲染"（per-recommendation 运行时）
8. AiRecommendationLog 落库（含 idempotency_key / model_calls / tokens_used）
9. audit.before + after 调用（agent registry 包装层自动；本模块不直接写 audit）
10. 推送通知给审批人（侧栏数据就绪）
```

#### 5.4.3 失败 fallback

| 失败类型 | 行为 |
|---|---|
| LLM 超时（> 30s） | 重试 1 次；仍失败 → AiRecommendation 状态 = FAILED + audit `ai_unavailable_reason='LLM_TIMEOUT'` |
| LLM 输出不 parseable | 同上 + reason = `PARSE_ERROR` |
| 月度 budget 超限 | 状态 = FAILED + reason = `BUDGET_EXCEEDED` + Policy 自动降级 ai_mode=OFF + 告警 AI Ops |
| ModelRouter 配额耗尽 | 状态 = FAILED + reason = `MODEL_ROUTER_EXHAUSTED` |
| 跨境合规拒绝 | 状态 = FAILED + reason = `COMPLIANCE_BLOCKED` |
| AI Form Spec sensitive_fields 未配置但识别到 PII | 状态 = FAILED + reason = `PII_SAFEGUARD_VIOLATION` + 阻断 LLM 调用 + 告警 |

**所有 FAILED 状态在 approval-center 侧栏显示 "AI 暂不可用（[原因]）"，不阻塞审批主流程**。

#### 5.4.4 推理链组装规则

LLM 输出的 reasoning_chain 必须含：
- 关键决策点（"为什么推荐 approve"）
- 引用的历史相似 task ID（透明可点开）
- 风险点列表（`risk_indicators[]` 字段单独存）
- 不含 PII 原值

**反 rubber-stamp 关键**：reasoning_chain 是审批人能"读懂决策依据"的唯一窗口；UX 必须强迫审批人至少扫一眼（详 5.7）。

#### 5.4.5 置信度来源（Phase 1 vs Phase 2）

- **Phase 1 = LLM self-report**：直接取 LLM 输出的 `confidence: 0.0-1.0`
- **Phase 2 = ensemble calibrated**：用 1 个月生产数据 × form_template × historical modification rate 校准
- AuditLog 同时保留 `agent_confidence`（self-report）+ `calibrated_confidence`（Phase 2 落 NULL，Phase 2 上线后批量回填）
- **EU AI Act 合规风险注释**：self-report 校准误差 15-30%（业界实证）；Phase 1 上线时在合规文档明示"v1 用 self-report，v2 切 calibrated"

---

### 5.5 校准 Dashboard

#### 5.5.1 入口

- **主入口（全量视图）**：`/ai-orchestration/calibration` 页面，**IT 管理员 + AI Ops** 可见（RBAC: `calibration_dashboard:view_all`）
- **主入口（自己模板视图）**：同 URL，但仅显示 `created_by = self` 的 form_template 指标；**表单管理员**可见（RBAC: `calibration_dashboard:view_own`）；UI 自动按 RBAC 切换全量 / 自己模板视图
- **嵌入入口**：每个 form_template 详情页镶嵌指标卡片（form-management 模块负责实现卡片，本模块提供 API）；可见性同上（IT/AI Ops 看全量；表单管理员看自己模板）

#### 5.5.2 5 核心 metric

| Metric | 计算 | 告警阈值 |
|---|---|---|
| `modification_rate` | 7 日内 modification_diff 非空数 / 总推荐数 × 100% | > 30% 告警 |
| `time_to_decision` | 审批人查看推荐 → 做出决定的平均秒数 | 单值不告警；趋势可见 |
| `ai_unavailable_count` | 1 小时内 FAILED 状态数 | > 10/h 告警 |
| `confidence_distribution` | confidence 分桶（< 0.5 / 0.5-0.7 / 0.7-0.85 / > 0.85） | < 0.7 占比 > 40% 告警 |
| `ai_cost_usd_per_template_per_month` | 月累计 tokens × 单价 | 单 template > 月预算 90% 告警 |

#### 5.5.3 Dashboard UX

- 时间轴：1h / 24h / 7d / 30d 切换
- 按 form_template / organizationId / tier 多维筛选
- 单 metric 点开 → 钻取到 AiRecommendationLog 列表（按 audit 字段过滤）
- 详细 UX 规格见 `05-ui-interaction-spec.md`（本 PRD 不细化）

#### 5.5.4 物化策略

`CalibrationMetricsSnapshot` 表 5 分钟 cron 物化（form_template × hour_bucket × tier）；Dashboard 查询走物化表 + 实时 5 分钟内增量 union。

---

## 6. 角色与权限

### 6.1 权限矩阵

| 角色 | L1 侧栏可见 | 推翻 AI 推荐 | Risk Tier 配置 | Policy-as-Code 写 | 校准 Dashboard | History 查看 |
|---|:-:|:-:|:-:|:-:|:-:|:-:|
| 审批人 | ✓ | ✓（按 affordance 规则） | - | - | - | - |
| 发起人 | - | - | - | - | - | - |
| 表单管理员 | - | - | - | - | ✓（自己模板） | - |
| IT 管理员 | ✓（审计目的） | - | ✓ | ✓ | ✓（全量） | ✓ |
| **AI Ops（新角色）** | ✓ | - | ✓ | ✓ | ✓（全量 + 模型调优） | ✓ |

**注**：AI Ops 是否新增 head count 是组织问题；PRD 仅定义角色 + 权限点。落地实施期间由组织决定具体由谁担任。

### 6.2 新增 RBAC 点

落各模块 `permissions.constants.ts`（按 standards/21 § 3.5 RBAC 常量化强制）：

| RBAC 点 | 模块 |
|---|---|
| `ai_approval:read_recommendation` | ai-approval-orchestration |
| `ai_approval:adopt` | ai-approval-orchestration |
| `ai_approval:override` | ai-approval-orchestration |
| `risk_tier:configure` | ai-approval-orchestration |
| `policy_as_code:read` | ai-approval-orchestration |
| `policy_as_code:write` | ai-approval-orchestration |
| `policy_as_code:read_history` | ai-approval-orchestration |
| `calibration_dashboard:view_own` | ai-approval-orchestration |
| `calibration_dashboard:view_all` | ai-approval-orchestration |
| `audit_log:view_ai_fields` | audit-system |

---

## 7. 反 rubber-stamp Affordance（EU AI Act 关键）

### 7.1 Tier 1（低风险）

- 显示推荐 + 置信度 + 推理链摘要
- "一键采纳" 按钮立即可用
- 推翻路径：点 "修改后采纳" → 修改 modification_diff 自动记录

### 7.2 Tier 2（中风险）

- 同 Tier 1，但推翻路径 modification_diff 必须含人写理由（输入框非空）

### 7.3 Tier 3（高风险） + destructive 操作

- **强制阅读倒计时**：`max(5s, min(15s, 字数/8))` 秒；倒计时未结束按钮 disabled
  - 公式说明：reasoning_chain 50 字 → 6.25s；100 字 → 12.5s；200 字 → 25s 封顶 15s
  - 字数 < 40 → 5s 下限保证审批人最少思考时间
- **"我已阅读 [理由 1, 理由 2, ...]" checkbox**：reasoning_chain 中的 `risk_indicators[]` 每项作为独立勾选项，至少勾选 1 项才能采纳
- **推翻 modification_diff 必填理由 + 至少 20 字符**
- **审批人停留行为采集**：推理链区域 hover 秒数 + scroll 距离（不采集鼠标轨迹），落 AuditLog 用于事后 rubber-stamp 行为分析

### 7.4 公式选取理由

issue 原方案 "字数 / 4"（100 字 = 25s）UX 测试预测会被审批员强烈反对（审批高峰 1 天 100 单 = 2500s 强制等待）。改 `max(5s, min(15s, 字数/8))` 封顶 15s：
- 下限 5s：心理学最低注意时间
- 字数 / 8：阅读速度约 300 字/分钟即 5 字/秒，除以 8 ≈ 2.5 字/秒（按"理解"而非"扫"算）
- 上限 15s：超过此值审批员开始切别的 tab，倒计时形同虚设

**Phase 2 调整路径**：本字段位放 Policy-as-Code `reading_seconds_formula` 字段（v1 留 NULL = 默认公式）；生产 1 个月后按 form_template 调整。

---

## 8. 安全 + 合规边界

### 8.1 EU AI Act Article 14

| 要求 | 本 PRD 落地 |
|---|---|
| 可证明的人类监督 | 反 rubber-stamp affordance（7.3）+ 审批人采纳 / 推翻全链路 audit |
| policy-as-code 与 agent 代码分离 | ApprovalPolicy 表 + 5.1 解析顺序 |
| 完整审计 | AuditLog 6 字段扩展 + 哈希链分段（详 audit-system 模块） |

### 8.2 GDPR Article 22

| 要求 | 本 PRD 落地 |
|---|---|
| 自动化决策可解释 | reasoning_chain + risk_indicators[] |
| 自动化决策可推翻 | "修改后采纳" / "忽略推荐" 路径 |
| 留审计 | modification_diff 必填 + AuditLog |

### 8.3 PII 处理

- `FormVersion._ai.sensitive_fields` **强制声明** PII 字段
- LLM 调用前**强制 redact**（5.3.4）
- audit 记录"已脱敏"标记 + 脱敏前 hash（不存原值）
- **未声明 sensitive_fields 但识别到疑似 PII 字段** → AI 推荐生成器 fail-safe = 拒绝调用 LLM + audit `PII_SAFEGUARD_VIOLATION`
- 阶段 0 出 sensitive_fields 识别规则清单：字段名匹配（`id_card` / `bank_card` / `passport` / `phone` / `email` / `身份证` / `银行卡` 等）+ 字段类型推断；运营按 form_template 一一确认

### 8.4 跨境合规（依赖 ModelRouter）

| 数据归属 | LLM 路由 |
|---|---|
| EU 数据 | Azure OpenAI EU / AWS Bedrock EU |
| 中国数据 | 腾讯混元 / 通义千问 |
| 其他 | OpenAI / Anthropic |

**阻塞项**：ModelRouter 当前不支持 region routing → **本 PRD 阶段 0 范围必须含 region routing 子任务**（独立 spike，跟 form_template 配置联动：`organizationId` → `data_residency_region` → ModelRouter 选模型）。

---

## 9. 回滚 + Feature Flag

### 9.1 全量关闭

| Flag | 作用 | 关闭路径 |
|---|---|---|
| `AI_RECOMMENDATION_ENABLED` (global env / unleash) | 关闭所有 form_template 的 L1 侧栏 | < 5 分钟 |
| `AI_FORM_GENESIS_ENABLED` (global env / unleash) | 关闭 AI Form Genesis 入口（用户回退到 designer 编辑） | < 5 分钟 |

### 9.2 单 form_template 关闭

`ApprovalPolicy.ai_mode = OFF` → 立即生效（缓存 TTL ≤ 1 分钟）。

### 9.3 单 organizationId 关闭

`ApprovalPolicy` 加 `(form_template, organizationId)` 条目 `ai_mode=OFF` → 立即生效。

### 9.4 月度 budget 超限自动降级

Cron 5 分钟跑：检查 `ai_cost_usd_per_template_per_month` ≥ `monthly_ai_call_budget` → 自动 `ai_mode=OFF` + 写 PolicyHistory + 告警 AI Ops。

### 9.5 任一关闭路径不影响审批主流程

侧栏消失 / 不显示 / 显示 "AI 暂不可用" → 审批人继续走传统人工审批；form 提交流程零变更。

---

## 10. 测试策略

### 10.1 AI 推荐质量回归（新方法）

LLM stochastic → 传统快照失效。**MVP 第 1 周建黄金集**：

- **50 条 baseline**：(form_template, form data fixture, expected_action, expected_confidence_bucket) 元组
- **每月加 10 条**：从生产 modification_rate 异常案例提取
- **评估方法**：
  - `recommended_action` 完全匹配（categorical, 必须等）
  - `confidence_bucket` 完全匹配（< 0.5 / 0.5-0.7 / 0.7-0.85 / > 0.85 4 桶）
  - `reasoning_chain` semantic similarity（embedding cosine）> 0.85
  - **ensemble check**：4 个模型对同 prompt 多数投票一致 ≥ 3
- **回归门禁**：PR 触发 → 跑黄金集 → similarity < 0.85 / action mismatch > 5% / ensemble agreement < 3 → CI fail
- **生产持续校准**：modification_rate 周报 + 跨 model_version 对比 + 自动开升级 issue

### 10.2 传统三层覆盖

| 层 | 覆盖 |
|---|---|
| L0 / L0a/b | listAsProviderTools 输出快照（agent registry 工具回归） |
| L0c | approval-center 详情接口 aiRecommendation 字段契约 |
| L1 | 所有新增 API + Policy-as-Code 配置生效 + 哈希链迁移脚本 + 幂等 key + sensitive_fields redact + 跨境路由 |
| L1c | AiRecommendationLog 分区 + 归档脚本数据完整性 |
| L2 | approval-center 侧栏 E2E（zh-CN + en-US 双语）+ 反 rubber-stamp 倒计时手工测 |
| L3 UAT | top 5 form_template 灰度上线 7 天 + AI Ops review modification_rate + sensitive_fields 漏 redact 抽查 |

### 10.3 性能基准

| 指标 | 目标 |
|---|---|
| L1 侧栏 AI 推荐 p99 | < 3s |
| AI Form Genesis 生成 p99 | < 8s（详 ai-form-genesis 模块） |
| AiRecommendationLog 查询 p99 | < 100ms（走分区索引） |
| 校准 Dashboard 加载 p99 | < 2s（走物化表） |

---

## 11. 验收标准 + KPI

### 11.1 阶段 0 验收

- [ ] Policy-as-Code 表 + History 表 + Risk Tier Registry 创建并通过 L1 集成测试
- [ ] AI Form Spec `_ai` 子节点规范文档完整；form-engine 实现侧能消费
- [ ] audit-system 6 字段扩展 + AuditAction 4 新值上线；哈希链分段迁移脚本通过 L1c 验证
- [ ] 校准 Dashboard 页面可访问；5 metric 实时上 Prometheus + Grafana
- [ ] sensitive_fields 识别清单出 v1（覆盖 top 5 form_template）
- [ ] ModelRouter region routing 子任务 spike 完成 + 合入

### 11.2 阶段 1 验收

- [ ] AiRecommendationLog 落库 + 月分区生效
- [ ] 推荐生成器跑通 5 个 form_template；黄金集 50 条 ≥ 90% pass
- [ ] 反 rubber-stamp 倒计时公式生效；Tier 3 模板 UAT 测试审批员 ≥ 95% 完成强制阅读
- [ ] AI 不可用 fallback 通过 chaos test（kill ModelRouter / 模拟超时 / 跨境拒绝）
- [ ] Feature Flag `AI_RECOMMENDATION_ENABLED` 关闭 → 侧栏 5 分钟内消失
- [ ] 月度 budget 超限自动降级 → cron 触发 + Policy 自动改 + 告警 AI Ops 验证通过

### 11.3 业务 KPI（上线后 1 个月）

| KPI | 目标 |
|---|---|
| L1 侧栏可用率 | ≥ 95%（ai_unavailable / 总推荐 ≤ 5%） |
| modification_rate（Tier 1） | ≤ 30%（推荐质量合格） |
| modification_rate（Tier 2/3） | ≤ 50%（中高风险更多人为判断） |
| 审批人 time_to_decision 中位数 | 较无 AI 时下降 ≥ 20%（验证"辅助"价值） |
| AI 成本 / 单审批 | ≤ $0.05 USD |
| sensitive_fields 漏 redact 投诉 | 0（硬底） |

---

## 12. 风险 + 假设 + 依赖

### 12.1 关键风险

| 风险 | 缓解 |
|---|---|
| LLM self-report 置信度校准差 → 反 rubber-stamp 触发过多 / 过少 | Phase 1 显式告知 / Phase 2 切 calibrated_confidence；阶段 1 上线后 1 个月数据收集 |
| ModelRouter region routing 未完成阻塞跨境合规 | 阶段 0 范围必含 region routing spike；超期 → 砍 EU org 上线 |
| 月度 budget 超限自动降级被业务方反对（"业务高峰被关 AI"） | budget 默认值参考 5.1.1 起步配置 + 每月人工 review 调整 + 超限告警提前 14 天预警 |
| EU AI Act 时间窗超期 | 超期合规预案（13.2）|
| AI 推荐质量差导致审批员忽略侧栏 | modification_rate 监控 > 30% 告警；黄金集回归门禁；ai_mode 单 form_template 关闭路径 |
| sensitive_fields 配置遗漏导致 PII leak | aiyle-safe = 未声明 sensitive_fields 但识别到疑似 PII → 阻断 + 告警；UAT 阶段抽查 |

### 12.2 假设

- knowledge-base RAG 已 GA 且支持按 organizationId 过滤（如未支持 → 本 PRD 阶段 0 加子任务）
- ModelRouter 支持 tier-based model selection（已有，按 Phase 1 文档）
- audit-system 哈希链分段迁移可行（实施细节由 audit-system 模块 PRD 详写）
- approval-center 详情抽屉 480px 改造工作量可控（实施细节由 approval-center 模块 spec 详写）

### 12.3 依赖

- **#410 PR-A 合入**（柔性卡口；不阻塞 PRD 起草，但本 PRD 实施期前必须合）
- **ModelRouter region routing spike**（阶段 0 阻塞项）
- **ModelRouter 容量 + 成本估算 spike**（独立 spike，影响 budget 默认值）
- **knowledge-base RAG organizationId filter**（如未支持，子任务）

---

## 13. 跟其他模块的契约 + Out-of-scope

### 13.1 跟其他模块的契约

| 模块 | 本 PRD 输出 | 模块侧实施 |
|---|---|---|
| approval-engine | 审批 task 状态变更 hook（PENDING → 触发推荐生成） | 不改契约面；附 hook 调用 |
| approval-center | 详情接口响应加 `aiRecommendation` 字段 + 列表标识 | 详情抽屉 UI 实现见 approval-center/05-ui-interaction-spec |
| form-engine | AI Form Spec `_ai` 子节点规范 | FormVersion.schema 字段说明见 form-engine/06-data-model |
| form-management | designer 切只读规则 + FormTemplate.source/origin | UI + 数据模型实现见 form-management 文档 |
| audit-system | 6 字段扩展 + AuditAction 4 新值 + 哈希链分段迁移规范 | 实施见 audit-system/06-data-model |
| agent | 通过 `@modules/agent/registry` 调 ModelRouter（依赖 PR-A） | 见 standards/21 |
| knowledge-base | "历史相似 Top 3" 查询 API（按 organizationId 隔离） | 复用现有 RAG API |
| ai-form-genesis | 共用 AI Form Spec 标准 + sensitive_fields redact 规则 | 见 ai-form-genesis 模块 |

### 13.2 Out-of-scope

详 1.2 § "Out-of-scope"。

---

## 14. 阶段交付计划

### 14.1 时间表

| 阶段 | 时长 | 累计 | 剩余 buffer | 输出 |
|---|---|---|---|---|
| 多角色 PRD review + 修订 | 1 周 | 2026-05-26 | 9.5 周 | PRD v2 (approved) |
| 阶段 0 实施 | 3 周 | 2026-06-16 | 6.5 周 | 5 表 + 校准 Dashboard + audit 扩字段 + region routing spike |
| 阶段 1 实施 | 2 周 | 2026-06-30 | 4.5 周 | 推荐生成器 + 反 rubber-stamp affordance + 全 5 form_template |
| UAT + 灰度上线 | 2 周 | 2026-07-14 | 2.5 周 | 灰度 1 org → 全量 |
| 生产合规验证 | 2 周 | 2026-07-28 | **5 天** | EU AI Act 合规 sign-off |

### 14.2 超期合规预案

**触发条件**：2026-07-01 仍未完成阶段 0。

**预案**：
- 砍阶段 1（不上线 AI 推荐生成器）
- 阶段 0 audit-system 扩字段 + Policy-as-Code + Risk Tier Registry **必须 8-02 前 GA**
- 至少满足 EU AI Act "可证明人类监督"的"字段就位 + 策略表就位"硬底
- AI 推荐功能 2026-09 上线（合规允许，因为 audit 字段已就位为未来推荐留 trace）

---

## 15. 附录

### 附录 A：Top 5 form_template 起步配置（详）

| form_template | 描述 | tier | ai_mode | confidence_threshold | monthly_budget USD | 跨组织 |
|---|---|---|---|---|---|---|
| `expense` | 报销 | Tier 1 | RECOMMEND | 0.70 | 1000 | NONE |
| `business-trip` | 出差 | Tier 1 | RECOMMEND | 0.70 | 800 | HIERARCHICAL（同集团子公司互看） |
| `purchase` | 采购 | Tier 2 | RECOMMEND_WITH_REVIEW | 0.70 | 1500 | NONE |
| `contract-sign` | 合同签署 | Tier 3 | RECOMMEND_WITH_HARD_GATE | 0.75 | 2000 | NONE |
| `asset-disposal` | 资产处置 | Tier 3 | RECOMMEND_WITH_HARD_GATE | 0.80 | 1000 | NONE |

### 附录 B：sensitive_fields 识别清单 v1

按字段名匹配（不区分大小写）：

| 类别 | 字段名模式 |
|---|---|
| 身份 | `id_card` / `idCard` / `id_number` / `identity_no` / `passport` / `身份证` / `护照号` |
| 银行 | `bank_card` / `bankCard` / `account_no` / `iban` / `银行卡` / `账号` |
| 联系方式 | `phone` / `mobile` / `tel` / `电话` / `手机` / `email` （仅外部联系人字段；内部员工 email 不算） |
| 财务敏感 | `salary` / `bonus` / `tax_id` / `工资` / `薪资` |
| 医疗 | `medical_record` / `diagnosis` / `体检` / `病历` |
| 凭证 | `password` / `secret` / `token` / `api_key` |

匹配后 form_template 创建者**必须 review 一次**确认 `sensitive_fields` 标记是否完整 / 误标。

### 附录 C：AiRecommendationLog 状态机概览

详 04-state-machine.md。

```
PENDING → READY → ADOPTED / OVERRIDDEN / IGNORED
         ↘
          FAILED（含 UNAVAILABLE / TIMEOUT / PARSE_ERROR / BUDGET_EXCEEDED / COMPLIANCE_BLOCKED / PII_SAFEGUARD_VIOLATION）
```

---

## 16. 关联文档

- Issue #409: http://43.130.59.228/FFAIWorkspace/workspace/issues/409
- 方向 review: http://43.130.59.228/FFAIWorkspace/workspace/issues/410#issuecomment-4528
- 11 项工程审查决策: `.learnings/2026-05-19-410-plan-review.md`（PR #448）
- Agent 接入规范: `docs/standards/21-agent-business-module-integration.md`（PR #449）
- 数据分层政策: `docs/standards/16-data-layering-and-metadata-policy.md`
- 平行 PRD: `docs/modules/ai-form-genesis/01-prd.md`（阶段 1.5）
- 依赖模块: `docs/modules/agent/`、`docs/modules/approval-engine/`、`docs/modules/audit-system/`、`docs/modules/knowledge-base/`
