# 在线客服系统 · 开发 / 验收任务计划（Agent 执行用）

> 配套：[customer-service-plan.html](customer-service-plan.html) · [prototype.html](prototype.html)
> 版本：**v3.0 · 2026-04-24 · Per-biz OpenClaw**
> 适用：由 AI Agent 驱动的开发流程。每任务含**范围 / 产出 / 验收 / 依赖**；完成后按【验收】逐条自检；未通过项登记 §17，**不得自判通过**。

---

## 0. v3.0 架构口径（必读）

**每 biz 独立一套 OpenClaw workspace，独立训练；OpenClaw 承担完整工作流**（AI 首轮 / RAG / 升级判断 / 业务 API / Approvals）。**Cloudflare 只做边缘接入 + 前端 + 精简管理台持久化**。

| 能力 | 组件 |
|---|---|
| AI 引擎 + 业务工作流 | **N × OpenClaw workspace**（`/opt/openclaw/workspaces/{biz}/`，每业务一套 `SOUL.md` / `skills/` / `memory/` / `sessions/` / `approvals/` / `channels/`） |
| OpenClaw 入口 | **Cloudflare Tunnel** per-biz ingress（`{biz}-cs.int.yitongcs.com`） |
| 用户前端 | **Pages** `cs-widget`，`data-biz="{biz}"` 决定走哪个 workspace |
| 坐席 + 管理端 | **Pages** `cs-console` + **Cloudflare Access** SSO + TOTP |
| REST / WS | **Workers** `cs-api`（唯一 Worker） |
| WS 终结 | **Durable Object** `BridgeDO`（薄转发，无业务状态） |
| 坐席抢单 | **Durable Object** `AgentPresenceDO` per biz |
| 主库 | **Cloudflare D1** `ytk-cs-db`（5 表：workspaces / knowledge / agents / training_samples / audit_log） |
| 对象存储 | **R2** `cs-assets` |
| 指标 / 日志 | Analytics Engine + Logpush |
| 邮件 / 防刷 | Email Routing + Turnstile |

> **不再使用**：Vectorize（→ OpenClaw Memory）、Queues（→ OpenClaw 内部事件）、KV 路由规则（→ SOUL.md）、v2.0 的 `SessionDO`（消息状态由 OpenClaw Sessions 管）。

---

## 1. Agent 执行规范

| 项 | 要求 |
|---|---|
| 上下文 | 读 [plan](customer-service-plan.html) 对应章节 + [配置.md](../配置.md) |
| 代码仓库 | CF 端：`cs/workers/` / `cs/durable-objects/` / `cs/pages/` / `cs/d1/`。OpenClaw 侧：每 workspace 一个 git 仓 `openclaw-ws-{biz}` |
| 部署工具 | `wrangler`（CF）· `cloudflared`（Tunnel）· `openclaw`（workspace 管理）· `gh`（PR） |
| Secrets | 绝不入库；`wrangler secret put`；本地 `.dev.vars` |
| 测试 | Vitest + Miniflare；每 workspace 须有 `tests/soul.test.yaml` Agent 行为测试 |
| 遇阻 | 立即登记 §17，不绕过安全检查 |

---

## 2. P0 前置阻塞

### T-00-01 修复 OpenClaw AI provider
- **现状**：`channels list` 返回 `refresh_token_reused`/401。
- **操作**：以 `yitongkan` 执行 `openclaw configure` / `openclaw channels login`；优先接 Anthropic Claude 4.6 作主，OpenAI Codex 作备。
- **验收**：`ssh yitongkan@69.30.251.10 "openclaw run --prompt 'ping'"` 返回文本。

### T-00-02 升级 OpenClaw
- **操作**：升到 `2026.4.22+`；升级前快照 `~/.openclaw/` 到 `/opt/openclaw/backup/YYYYMMDD/`。
- **验收**：`openclaw --version` 无版本告警。

### T-00-03 账号 / 路径规范化
- **范围**：决定 OpenClaw 侧由 `yitongkan` 或新 `ytk-cs` 服务账号运维；目录由 `/opt/yitongkan-company/` 迁到 `/opt/openclaw/workspaces/`（符合 v3.0 多 workspace 布局）。
- **产出**：`cs/docs/runbook-accounts.md` 写明最终账号 + 路径。
- **验收**：新路径下 `ls workspaces/` 至少能看到 `_template/` 和 `ytk/`。

### T-00-04 Cloudflare 账户能力核查
- **范围**：Workers Paid / D1 / DO / R2 / Pages / Access / Turnstile / Email Routing / AE / Logpush 开通。
- **产出**：`cs/docs/cf-resources.md` 记录资源 ID。
- **验收**：`wrangler whoami` / `wrangler d1 list` / `wrangler r2 bucket list` 对得上。

---

## 3. Workspace 基础（W0 · 1–2 天）

### T-10-01 创建 workspace 模板 `_template/`
- **产出**：
  - `IDENTITY.md`（占位 `{BIZ_DISPLAY_NAME}` / `{BIZ_DOMAIN}`）
  - `SOUL.md` 最小可用（语气 / 强制升级 / 技能调用 / 兜底，见 plan#19.1）
  - `AGENTS.md`（白名单式 skill 权限）
  - `skills/faq/` `skills/escalate/` 空目录 + README
  - `channels.yaml`（默认只开 `web-bridge`，Telegram 注释供启用）
  - `tests/soul.test.yaml`（plan#19.2 测试用例）
  - `.gitignore` 排除 `memory/` `sessions/` `approvals/`
- **验收**：`openclaw run --workspace _template --prompt "测试"` 启动成功（即便无业务能力）。

### T-10-02 fork 出 `ytk/` workspace
- **操作**：`openclaw ws clone _template ytk`；填 IDENTITY + 基础 SOUL（使用 plan#5.2 示例片段）。
- **产出**：`/opt/openclaw/workspaces/ytk/` 完整；git init + push 到 `github.com/yitongkan/openclaw-ws-ytk`（私有）。
- **验收**：`openclaw run --workspace ytk --prompt "我要投诉"` 输出含「转接人工」。

### T-10-03 Cloudflare Tunnel per-biz ingress
- **操作**：`cloudflared tunnel create openclaw-tunnel`（如已有跳过）；`config.yml` 按 plan#6.2 配；每新 biz 加一行 ingress + 加一个 Zero Trust Self-hosted Application + Service Token。
- **Worker secrets**：`OPENCLAW_CF_ACCESS_ID_YTK` / `OPENCLAW_CF_ACCESS_SECRET_YTK`（含 biz 后缀便于轮换）。
- **验收**：
  - `cloudflared tunnel info openclaw-tunnel` active。
  - 带 Service Token 调 `https://ytk-cs.int.yitongcs.com/health` 返 200。
  - 不带 header → 401。

### T-10-04 Telegram 内测链路
- **操作**：在 ytk workspace 开启 Telegram channel；`approvals` 开启。
- **验收**：内部 5 人发消息后 `openclaw approvals list --workspace ytk` 有待审；审核通过在 Telegram 落地。

### T-10-05 Integration · ytk-api（主站 API 对接）
- **产出**：`workspaces/ytk/integrations/ytk-api.yaml`（plan#5A.5 结构）：base_url + bearer token + 端点（orders.get / accounts.lookup / vip.status / room.status）+ pii_scrub 规则。
- **密钥**：`YTK_API_TOKEN` 存入 OpenClaw vault（`openclaw vault set --workspace ytk YTK_API_TOKEN=...`），**不得入 git**。
- **验收**：`openclaw run --workspace ytk --prompt "调 accounts.lookup 测试 contact=18812345678"` 能返回脱敏后的账户信息。

### T-10-06 Integration · ticket-system（工单系统对接）
- **产出**：`integrations/ticket-system.yaml`：`POST /v1/tickets` 端点；auth type=hmac 或 bearer；响应含 `ticket.id` / `ticket.tracking_url`。
- **验收**：用测试工单系统（staging）创建一条 ticket 能返回 id。

### T-10-07 Integration · dns-admin（备用域名管理，可选）
- **产出**：`integrations/dns-admin.yaml`：mTLS 客户端证书对接；端点 `domains.backup.list` + `domains.backup.activate`（后者 `confirm_required: true`）。
- **用途**：运维类客服场景，用户问「备用域名」时可查，Trainer 有权限可切换。
- **验收**：`domains.backup.list` 调用返回当前 biz 的备用域名列表。

### T-10-08 Workflow · refund（退款流程）
- **产出**：`workspaces/ytk/workflows/refund.yaml`（严格按 plan#5A.2）：6 步流程（collect_identity → verify → collect_order → query_order → ask_reason → confirm → create_ticket → done），含 on_cancel / on_escalate。
- **SOUL 触发**：在 SOUL.md §3A 加「当意图命中 `workflows/*.yaml` 的 trigger.intents，立刻启动对应 workflow」。
- **测试**：写 `tests/flows/refund.test.yaml`：mock ytk-api + ticket-system 响应；输入「我要退款」→ 按固定序列回复 → 断言最终调用了 `tickets/create` 且返回 ticket id；边界：用户取消、订单不可退、已退款。
- **验收**：
  - 在 Telegram 内测走一遍完整 6 步流程成功落工单。
  - CI 跑 `openclaw test --workspace ytk --flow refund` 全绿。
  - D1 `cs_workflow_runs` 有完整一行记录（含 flow_id / status=completed / ticket_id / api_calls）。

### T-10-09 Workflow · account-query（账户查询，简单流程）
- **产出**：`workflows/account-query.yaml`：1~2 步（可选「请先登录」→ 调 account/lookup → 返回脱敏摘要）。
- **用途**：验证简单流程能工作；覆盖「只查不改」类场景。
- **验收**：触发后正确输出账户摘要；非账号本人查询返 403 风格话术。

### T-10-10 Workflow runtime（OpenClaw 侧）
- **范围**：如果 OpenClaw 原生尚未支持 workflow runner，需在 workspace `_runtime/` 约定 + 写一个轻量运行时（OpenClaw plugin 形式）：读 yaml → 维护 state → dispatch to skill / ask / confirm。优先复用 OpenClaw 已有能力，避免自建 DAG 引擎。
- **产出**：要么 `plugins/workflow-runner/` 实现（~300 行 TS），要么一份「OpenClaw 已有 XX 能力可直接用」的调研笔记。
- **验收**：T-10-08 和 T-10-09 能实际跑通。

---

## 4. Cloudflare 基础设施（W1）

### T-20-01 D1 schema（5 表）
- **产出**：`cs/d1/migrations/0001_init.sql`（plan#8 全部 5 表 + 索引）。
- **验收**：`wrangler d1 migrations apply ytk-cs-db --remote` 成功；`wrangler d1 execute ytk-cs-db --command "SELECT name FROM sqlite_master WHERE type='table'"` 返 5 张表。

### T-20-02 D1 `cs_workspaces` 初始化
- **产出**：插入 `ytk` 一行：stage=`bootstrapped`，tunnel_host=`ytk-cs.int.yitongcs.com`，workspace_path=`/opt/openclaw/workspaces/ytk`，channels=`["web","telegram"]`。
- **验收**：管理后台能读到。

### T-20-03 KV / R2 资源
- **产出**：KV `cs-runtime`（坐席 online 快照 / 短期 token） · R2 `cs-assets`（lifecycle: `logs/` 30d、`backups/` 30d）。
- **验收**：`wrangler kv:namespace list` / `wrangler r2 bucket list` 都有。

### T-20-04 仓库骨架
```
cs/
├── workers/cs-api/           # 唯一 Worker
├── durable-objects/
│   ├── bridge-do/            # WS 转发到 OpenClaw
│   └── agent-presence-do/
├── pages/
│   ├── cs-widget/
│   └── cs-console/           # 坐席 + 管理台
├── d1/migrations/
├── shared/                   # openclaw-client / access-jwt / redact
└── docs/
```
- **验收**：`pnpm i` 通过；`wrangler deploy --dry-run` 对每个子项目通过。

---

## 5. cs-api Worker + BridgeDO（W2）

### T-30-01 cs-api Worker
- **栈**：TS + Hono；绑定 D1 / KV / R2 / BridgeDO / AgentPresenceDO / AE / Email / per-biz OpenClaw secrets。
- **路由**：plan#9 全部（`/cs/{biz}/session` / `/messages` / `/rate` / `/upload` / `/ws`；`/agent/*`；`/admin/*`）。
- **biz 路由**：URL 路径中的 `{biz}` + header `X-CS-Biz`，双重校验；查 D1 `cs_workspaces` 拿到 `tunnel_host` + Service Token secret 名。
- **验收**：curl/Postman 全覆盖；Miniflare 集成测试通过。

### T-30-02 BridgeDO（薄 WS 转发，无业务状态）
- **职责**：
  - `fetch()` 接 Worker 转来的 WS upgrade → `state.acceptWebSocket(ws)`（Hibernation）。
  - 与 OpenClaw Gateway 建立另一条 WS（fetch upgrade 到 `{biz}-cs.int.yitongcs.com/ws?workspace={biz}&session={uuid}`，带 Service Token）。
  - 双向转发消息；不维护 seq 也不写 D1（所有持久化在 OpenClaw Sessions）。
  - 仅在 OpenClaw 侧返回 `status: human` / `approval_created` 时转发给用户。
- **验收**：并发 50 个 WS 稳定；断连重连能从 OpenClaw sessions 续接。

### T-30-03 OpenClaw Client（shared）
- **产出**：`shared/openclaw-client.ts` 支持：
  - `run(biz, sessionKey, prompt)` 同步 REST
  - `approvals.list(biz)` / `approvals.approve(biz, id)` / `approvals.modify(biz, id, content)` / `approvals.reject(biz, id, content)`
  - `sessions.get(biz, uuid)` / `sessions.messages(biz, uuid)`
  - `memory.reindex(biz)` / `memory.search(biz, query)`
  - `workspaces.soul.read(biz)` / `workspaces.soul.write(biz, content, actor)` （后者会触发 git commit）
- **容错**：重试 2 次；超时 10s；熔断（10s 内 3 次失败进半开）。
- **验收**：单测覆盖成功 / 401 / 超时 / 熔断。

### T-30-04 用户鉴权 + Turnstile
- **范围**：主站 JWT 或游客 cookie → 短期 BridgeDO upgrade token（KV 15min）。
- **Turnstile**：首次建会话必验。
- **验收**：无 token → 401；Turnstile fail → 拒绝建会话。

---

## 6. Widget（W2）

### T-40-01 Web Component 浮窗
- **栈**：原生 TS + Web Component + Shadow DOM；Pages `cs.yitongcs.com`。
- **嵌入**：`<script src="https://cs.yitongcs.com/widget.js" data-biz="ytk" async></script>`。
- **登录注入**：`window.__CS_USER__ = { user_id, token }`。
- **验收**：`dist/widget.js.gz` ≤ 50KB；dev 端到端一次对话；宿主 `body{color:red}` 不影响。

### T-40-02 多 biz 验证
- **测试**：同一页同时挂载两个 widget（`data-biz="ytk"` 和 `data-biz="bizdemo"`），确认两个会话互不干扰，走到不同 workspace。
- **验收**：两个对话的 `matched_faq` 来自不同 workspace 的 `skills/faq/entries/`。

---

## 7. AgentPresenceDO + 坐席台（W3）

### T-50-01 AgentPresenceDO
- **范围**：per biz 一实例；30s 心跳；Alarm 90s 超时下线；原子 claim；每 10s 写 KV 快照 `agents:{biz}:online`。
- **验收**：100 并发 claim 仅 1 人成功；断连 90s 下线。

### T-50-02 Access SSO + group policies
- **Zero Trust apps**：
  - `cs-console.yitongcs.com` → group `agents` + TOTP。
  - `cs-admin.yitongcs.com`（与 console 同域不同 path 或独立子域）→ group `admins` + TOTP + Step-Up。
- **Worker**：验 `Cf-Access-Jwt-Assertion` → 映射到 `cs_agents.access_email`。
- **验收**：未登录跳 Access；`/agent/me` 返 profile。

### T-50-03 坐席后端 API（透传 OpenClaw Approvals）
- **范围**：plan#9.2 全部端点；`/agent/queue?biz=` 实质是调 `shared/openclaw-client.ts` 的 `approvals.list(biz)` 透传。
- **操作语义**：`/approval/{id}/approve` → `approvals.approve`；`/modify` → `approvals.modify` + 写 `cs_training_samples` 一行（label 暂空等复核）；`/reject` → `approvals.reject` + 写 `cs_training_samples`（label=`bad_ai`）。
- **验收**：三种姿态完整走通；D1 中 training_samples 数据正确。

### T-50-04 坐席台前端（Angular 复用）
- **布局**：三栏（队列 / 消息 / 用户信息），见 plan#11.1；队列 per-biz 分 tab（坐席 `biz_scope` 多业务时）。
- **AI 草稿视图**：卡片展示 workspace / 置信度 / 引用的 `skills/faq/entries/*.md` 路径，点击可预览。
- **Ctrl+K** 命令面板：搜 workspace memory + 快捷操作。
- **验收**：三姿态操作 → D1 + OpenClaw 一致；跨 biz 切换 tab 无 context 错乱。

---

## 8. 管理后台 · Workspace 模块（W3–W4）

### T-60-01 Workspace 列表
- **范围**：卡片视图，每 biz 展示 stage / 版本（SOUL.md hash 前 8 位）/ 渠道 / 在线坐席 / 24h 解决率 / 改写率 / LLM 成本 / 快捷跳转。
- **操作**：新增 biz（表单触发 `POST /admin/workspaces`；Worker 侧调运维 skill 创建 workspace dir + Tunnel ingress + git repo，或留接口等手工执行）。
- **验收**：新增一个 `bizdemo` 后列表出现且能进详情页。

### T-60-02 Workspace 详情 · SOUL.md 编辑器
- **功能**：读写 `SOUL.md`（走 `workspaces.soul.*`）；展示 git 历史；支持 diff；保存 = git commit + 审计 + 可选立即同步；回滚按钮 = checkout 指定 commit。
- **安全**：写 SOUL.md 必须 Access Step-Up；必须运行 `tests/soul.test.yaml` 通过才允许生效。
- **验收**：修改一条规则 → 保存 → 测试通过 → 实时对 Agent 生效；回滚一键恢复。

### T-60-03 Workspace 详情 · Skills / Channels / Memory 视图
- **Skills 视图**：只读列出 `skills/` 下所有条目（文件名 + 首行 description）。新增 / 编辑 skill 超出 W1-5 范围，留占位。
- **Channels**：展示 `channels.yaml` 当前状态；支持开关 Web/Telegram/WhatsApp/Discord。
- **Memory 搜索**：通过 `memory.search` 查询，显示 top-5 命中条目。
- **验收**：三个 tab 数据真实读取 OpenClaw。

### T-60-04 阶段切换（Stage Gate）
- **范围**：`POST /admin/workspaces/{biz}/stage` body `{target: 'phase-2', approver_email: '...'}`；要求双签（请求 + 确认，间隔 5 分钟内另一 admin 点确认）。
- **验收**：双签流程完成才改 `cs_workspaces.stage`；审计记录两人签名。

### T-60-05 Workflows 可视化管理
- **列表**：读 workspace 下 `workflows/*.yaml`，展示每个 flow 的 name / version / 步骤数 / trigger.intents / 最近 24h 运行数。
- **详情**：
  - yaml 文本编辑器（走 PR 合并，同 SOUL）
  - 可视化 DAG 只读视图（步骤节点 + 跳转连线）
  - 漏斗分析：读 `cs_workflow_runs` 按 step 统计进入 / 流失 / 完成率
  - 最近运行列表：最近 50 条 `cs_workflow_runs`，点击展开查看 `summary`（PII 自动打码）
- **测试回放**：一键触发 `tests/flows/{flow}.test.yaml`，返回通过 / 失败 + 耗时。
- **验收**：refund 可视化 DAG、24h 有 20+ 运行记录、漏斗百分比合理、一键测试有结果。

### T-60-06 Integrations 管理 + 健康检查
- **列表**：读 `integrations/*.yaml`，展示 base_url / auth type / 端点数 / 健康状态 / 24h QPS / 错误率。
- **健康检查**：Cron 每 1 分钟对每个集成的 `/health` 或首个 GET 端点探活；结果缓存到 KV `integration:health:{biz}:{id}`。
- **密钥状态**：仅展示 "token 已设置 / 过期时间 / 最后使用"；**永不展示明文**。读 OpenClaw vault metadata。
- **审计**：yaml 改动走 PR；改密钥必须 Access Step-Up + 双签 + 写 `cs_audit_log`。
- **验收**：ytk-api / ticket-system / dns-admin 可见；人工将 token 设为无效 → 1 分钟内健康变红 + 告警邮件。

### T-60-07 Workflow 观测埋点
- **范围**：Worker 侧在每个 workflow step 前后写 Analytics Engine（`blob1=biz, blob2=flow_id, blob3=step_id, blob4=outcome(enter/leave/success/fail)`）。
- **运行入库**：workflow 结束（completed / cancelled / escalated / failed）把 summary 写 D1 `cs_workflow_runs`。
- **验收**：AE SQL 能画漏斗；`cs_workflow_runs` 至少 100 行（灰度期 refund 样本）。

---

## 9. 管理后台 · 知识库（W4）

### T-60-10 FAQ CRUD（per biz）
- **范围**：plan#12 模块；管理员/Trainer 可增删改；发布 = `status='published'`。
- **验收**：增一条 FAQ → D1 有记录。

### T-60-11 同步到 workspace
- **流程**：`POST /admin/workspaces/{biz}/sync` → Worker 读 D1 `cs_knowledge(biz, status='published')` → 通过 `workspaces.soul.write` 系列 API 写到 `skills/faq/entries/` 下为一个个 `.md` 文件（文件名含 id）→ 调 `memory.reindex(biz)` 触发重嵌入 → 更新 `synced_at`。
- **失败处理**：单条失败 → 标 `sync_error`，不阻塞其它。
- **验收**：同步后，在 workspace 对话问「这条新 FAQ 的问题」能得到命中回答。

### T-60-12 批量导入 CSV/JSON
- **范围**：`POST /admin/knowledge/import?biz=` 接受 CSV / JSON；异步落 D1。
- **验收**：导入 100 条 TOP 工单问答，全部入 D1 draft 状态。

---

## 10. 管理后台 · 训练语料（W4）

### T-60-20 Training samples 复核视图
- **范围**：per-biz 筛选；待复核 / good_ai / bad_ai / need_sop 切换；AI 原始 vs 人工最终并排展示；支持一键新建 FAQ（把人工最终答复作为新 FAQ）。
- **验收**：复核 10 条样本后 label 正确；新建 FAQ 流程走通。

### T-60-21 月度 JSONL 导出（Cron）
- **范围**：每月 1 日 04:00 Cron → per-biz 导出上月 samples → R2 `cs-assets/training/{biz}/{yyyy-mm}.jsonl`。
- **验收**：R2 可下载；格式 `{biz,q,a,label}` 无错行。

### T-60-22 D1 每日备份（Cron）
- **范围**：03:30 → `wrangler d1 export` → R2 `backups/d1/YYYY-MM-DD.sql.gz`；保留 30 天。
- **验收**：连续 3 天 3 个文件；随机抽 1 份可恢复。

### T-60-23 OpenClaw workspace 每日快照（Cron，OpenClaw 侧 + Worker 侧触发）
- **方案**：03:45 Cron → 调 OpenClaw 侧 `openclaw ws export --workspace={biz} --output=/tmp/...tar.gz` 的 skill → R2 `backups/workspaces/{biz}/YYYY-MM-DD.tar.gz`。
- **验收**：连续 3 天 3 份；可恢复。

---

## 11. 附件 / 评价 / 移动端（W4）

### T-70-01 R2 附件（presigned）
- **流程**：Widget 调 `/cs/{biz}/upload` → Worker 签发 R2 presigned PUT URL（15min）；MIME 白名单；10MB 上限；路径 `cs/{biz}/{yyyy-mm}/{uuid}.{ext}`。
- **验收**：上传 → 下载 → 过期 403。

### T-70-02 满意度评价
- **范围**：会话关闭弹 👍/👎 + 可选文字 → 写 AE + D1（留 ref 到 OpenClaw session_id）。
- **验收**：差评立即反映 `cs_bad_rating_rate_1h`（per biz）。

### T-70-03 Android WebView
- **范围**：App 打开 `cs.yitongcs.com/?biz=ytk&channel=android&token=...`；附件 JS bridge。
- **验收**：Android 机一次含附件会话走通。

---

## 12. 监控 / 告警 / 熔断 / 安全（W5）

### T-90-01 Analytics Engine 埋点（含 biz tag）
- **指标**：plan#16.1 全部（`cs_openclaw_latency_p95` / `cs_ai_resolve_rate` / `cs_approval_rewrite_rate` / `cs_bad_rating_rate_1h` / `cs_tunnel_health` / `cs_llm_cost_daily`），所有 blobs 含 `biz` 字段。
- **验收**：AE SQL `SELECT blob1 as biz, count() FROM cs_metrics GROUP BY blob1` 返回多业务分组数据。

### T-90-02 告警
- **渠道**：Email Routing → `alerts@yitongcs.com`（运维组）。
- **规则**：error_rate/queue_depth/bad_rating_rate 阈值；Tunnel disconnected 立即；**per biz 独立触发**。
- **验收**：注入 ytk 故障告警邮件送达；bizdemo 不受影响。

### T-90-03 Logpush
- **范围**：Workers + Trace Events → R2 `cs-assets/logs/YYYY-MM-DD/`。
- **验收**：`wrangler tail` 实时；R2 有落地文件。

### T-B0-01 熔断（per biz）
- **条件**：1h 差评 > 10% 或 OpenClaw error > 20% → 该 biz 切「AI 只生成草稿不自动发」（实际是调 `workspace.stage='paused'` 临时态）+ Email 告警。
- **验收**：模拟 20 条差评 → 该 biz 临时降级，其他 biz 正常。

### T-B0-02 Turnstile + rate limit
- **范围**：Widget 首建 Turnstile；`/cs/{biz}/session` per IP 10/min。
- **验收**：连续建会话 429；Turnstile fail → 拒。

### T-B0-03 Tunnel Service Token 轮换 SOP
- **周期**：90 天；`wrangler secret put OPENCLAW_CF_ACCESS_SECRET_{BIZ}` 更新。
- **产出**：`cs/docs/runbook-tunnel.md`。
- **验收**：演练一次轮换，服务无感知。

### T-B0-04 Content 出站二次扫描
- **范围**：敏感词表小而关键（黄/政/暴），写在 Worker 代码内常量（非 KV，避免被改）；出站再扫一遍作兜底。
- **验收**：注入 10 条样本全拦截转人工。

### T-B0-05 TLS / 保留期 / 审计
- **要求**：TLS 1.3；OpenClaw sessions 保留 180 天（workspace 配置）；删会话 / 导训练集 → Step-Up + `cs_audit_log`。
- **验收**：`curl -vI cs-api.yitongcs.com` TLSv1.3；删操作触发 Step-Up + 审计。

---

## 13. 多业务隔离 E2E（W5）

### T-A0-01 BizN onboarding 全流程
- **范围**：新建 `bizdemo` workspace 从零到灰度 10%，全程跑 plan#14 SOP。
- **产出**：`cs/docs/onboarding-bizdemo.md` 记录每步耗时与问题。
- **验收**：
  - 3~5 人日内完成。
  - 两个 biz 同时运行，相互之间：FAQ 不串、坐席按 `biz_scope` 隔离、LLM 费用报表分开。
  - Access / Tunnel / 审计 三重校验通过（故意在 ytk session 调 bizdemo API 应返回 403）。

---

## 14. 文档 / 培训（W5）

### T-C0-01 运维文档
- `cs/docs/runbook.md`（部署 / 回滚 / 常用 wrangler + openclaw 命令 / Tunnel 重启）
- `cs/docs/troubleshooting.md`（OpenClaw 401 / Tunnel 断 / D1 配额 / workspace git 冲突 / SOUL.md 测试失败）
- `cs/docs/workspace-template-guide.md`（新业务如何 fork 模板）

### T-C0-02 Trainer 培训
- `cs/docs/trainer-handbook.md`（如何读 training samples → 修 SOUL.md → 提 PR → 灰度）
- 30 分钟录屏存 R2 `cs-assets/training-videos/`

### T-C0-03 坐席培训
- `cs/docs/agent-handbook.md`（三姿态 / 跨 biz 切换 / 快捷键）

---

## 15. Phase 1 灰度（per biz，以 ytk 为例）

| 阶段 | 范围 | 前置 |
|---|---|---|
| G-1 | Telegram Demo（内部 10 人） | §3 完成 |
| G-2 | dev 环境 100% | §4–§7 完成 |
| G-3 | 生产 10% 灰度 | §8–§11 完成 + 监控 + 脱敏 |
| G-4 | 生产 50% | G-3 稳定 3 天无 P1 告警 |
| G-5 | 生产 100% | §12 完成 |

BizN 可以并行独立跑自己的灰度节奏。

---

## 16. Phase 2 门禁（per biz，独立评估）

| 指标 | 阈值 | 观测 |
|---|---|---|
| AI 自助解决率 | ≥ 75% | 连续 4 周 |
| 差评率 | ≤ 3% | 连续 4 周 |
| 敏感话题兜底率 | 100% | 30 天 0 漏判 |
| 训练语料覆盖 | TOP 100 每问 ≥ 20 样本 | 一次性 |
| 熔断演练 | ≥ 1 次 | 历史 |
| SOUL.md 自动化测试 | 100% 通过 | 每次改动必跑 |

---

## 17. 阻塞项登记（Agent 写入）

| 任务 ID | 阻塞原因 | 需谁解决 | 登记时间 |
|---|---|---|---|
|  |  |  |  |

---

## 18. W5 交付清单

- [ ] 所有 `T-XX-XX` done
- [ ] `ytk` workspace 生产 100% ≥ 7 天稳定
- [ ] `bizdemo` 完成端到端隔离验证
- [ ] AE per-biz 看板 ≥ 24h 可见
- [ ] R2 有 D1 / workspace 两条备份线 30 天
- [ ] 运维 / Trainer / 坐席 三套手册 + 录屏齐备
- [ ] Tunnel Token 轮换流程演练过
- [ ] ytk Phase 2 门禁指标基线记录（作为后续评估起点）
