# 多角色合成试点：范围、运行与证据边界

本页是**受控技术模拟**，不是外部用户试点，也不是生产性能报告。场景、令牌、接收方和事件均由测试程序临时生成；不得把通过次数写成真实用户数量。真实试点仍须按 [PILOT.md](PILOT.md) 获得接收系统所有者授权。

## 运行

在仓库根目录准备 MoonBit CLI、Node.js 24+ 和依赖（`npm ci --ignore-scripts`）：

```bash
node scripts/simulated-pilot.mjs --profile quick
```

快速档运行 Node.js 单元/安全边界测试以及八组 SQLite 网关端到端场景。完整档还需要本机 Docker Engine；它会创建**只监听 127.0.0.1、没有持久卷**的一次性 PostgreSQL 17 容器，完成后只停止该次创建的容器，不触碰已有 HookLab 服务：

```bash
npm run test:simulated
npm run test:simulated -- --repeat 3
```

第二条重复数据库档三轮，用于观察合成接管与批量投递是否出现回归；`--repeat` 限定 1–30。若已有专用的本机 `hooklab_test` 数据库，也可将 `TEST_DATABASE_URL` 指向它，再执行 `node scripts/simulated-pilot.mjs --profile full`。脚本拒绝远程及非测试库名称；它会写入随机命名租户，因此不要对共享或真实数据库运行。所有模式生成 Git 忽略的 `target/simulated-pilot-report.json`，报告只含角色、场景、轮次、耗时与通过状态，不含令牌或事件正文。

## 模拟的用户与失败面

| 模拟角色 | 可执行证据 | 观察点 |
| --- | --- | --- |
| 发布方与开发者 | 网关发布、配置、平台集成 | 幂等键、契约拒绝、CloudEvents 与原子持久化 |
| 第三方提供方与安全员 | 网关验签、平台接入 | 伪造/过期签名、原始正文、无副作用拒绝 |
| 接收系统所有者 | 网关慢端点、平台集成、接收端单测 | 签名、503→204、重复投递时的一次业务效果 |
| 租户 Owner / Viewer | 平台集成 | 跨租户拒绝、角色权限、撤销与密钥轮换 |
| 运维员 | 死信、熔断、重启、租约、平台接管 | 重试界限、恢复、双实例领取、审计与指标 |
| 容量维护者 | 平台额度、接管样本 | 跨实例事件/字节/积压额度和合成延迟样本 |

[公开交互页](index.html)播放六个固定教学样例，**并不运行后端**。它可解释流程，不能代替上述可执行测试。CI 的 `simulated-pilot` 作业使用独立 PostgreSQL 17 服务运行完整档三轮；公开日志与仅含摘要的 artifact 可供复核。摘要只记录经过断言核对的 32 条合成事件样本、p50/p95、整批完成和租约接管耗时，不保存原始请求或密钥。

2026-09-28 的[提交 `e6921f0` CI](https://github.com/bzhangui/hooklab/actions/runs/36429210008)中，18 个场景组全部通过（网关与单元 9 组、数据库 3 组 × 3 轮）。每轮均验证 32 条合成事件和同一投递 ID 的故障接管；三轮接管耗时为 30,100 / 30,098 / 30,104 ms，发布请求的 p95 为 117 / 118 / 125 ms，整批完成耗时为 322 / 322 / 329 ms。这些是该次 CI 条件下的观测值，不是用户侧 SLA 或容量承诺；原始摘要在该运行的 `simulated-pilot-summary` artifact 中。

## 判定边界

通过这些测试，只能说明被覆盖的代码路径在所用本机/CI 环境下按预期工作。它不能证明真实使用者觉得容易接入、真实网络的延迟、跨地域灾备、长时间稳定性或公网多租户安全。负载轮次和环境应与报告一并记录，不应选取最好的一次作为性能承诺。
