50 KiB
SIP Go Agent 验证与切换验收 v0.3
保留C/S/E/L/A共88项跨阶段验收基线,按本次范围拆分:P1为1 Agent/1 Asterisk/单 Cell、至少3家SIP trunk 的契约与协议 fixture、单租户、静态配置及双AI模式;真实 SaaS/MQ 联调、双节点、第二 Cell、第二租户和生产切换延期第二阶段。 10个P1汇总门禁不是新增10项用例。项目内本地/隔离运行时用例已有部分通过,真实外部联调仍未执行。
1. 使用边界
本文件是 Go 重写方案 的执行清单,不是验收通过报告。项目内已具备 Go 可执行程序、W01/W02 契约与本地测试入口;下文仍将本地通过、协议 Mock、真实集成和生产签收严格分开。
每个阶段分别报告:通过、失败、未执行、被外部条件阻塞,以及“本阶段不适用/延后”。延后不得计入通过率或当成实现。旧Python证据不计Go通过数;管理平台、SIP Mock、供应商和Go Agent分别签收。
1.1 P1本次上线的10个汇总门禁
下表汇总现有用例与本次拓扑/模式的覆盖要求,不另建测试框架或增加虚假通过记录。全部满足才可签收单租户内测首发;Mock、协议PoC与真实供应商证据分列。
| 门禁 | 可判定完成标准 | 用例/证据 |
|---|---|---|
| P1-01 独立制品/契约 | 单module/Cobra双命令独立构建;格式化/vet/race/构建及实际依赖门禁通过,使用入口与引用Schema可追踪;GAP的P1部分关闭 | C01–C11、L01–L08、A01/A02 |
| P1-02 单节点就绪 | 恰有1 Agent/1 Asterisk、1单活D;单 Cell 完成绑定/版本/健康/准入与隔离链路验证;失联或未授权时停止新接单,单 Cell 仅接满足授权与全局额度的新执行 | A03–A11/A18/A20、S07/S10;单 Cell/固定出口 fixture |
| P1-03 至少3家SIP | 至少3个不同供应商独立trunk;登记单 Cell/出口授权、主叫/前缀/codec/额度,使用配置/路由/协议 fixture 覆盖;未知/未授权组合拒绝;SIP 外呼时间门禁为 Asia/Shanghai 09:00(含)至 20:00(不含),边界外 fail-closed;真实供应商外呼延期第二阶段 |
E01–E08/E20;供应商配置矩阵、SIP/ARI/媒体 fixture、internal/callwindow |
| P1-04 ASR-only | 百炼/火山两ASR适配分别验证;D从契约 fixture 取批准版本,命令→ASR文字/录音→结果 outbox 闭环;LLM/TTS不可用不影响且调用/额度为0;ASR参数实际生效、无虚假播放 | GAP-08/09、E09/E14/E17/E22、L06/§5.1;单 Cell 隔离组合 |
| P1-05 完整AI | OpenAI兼容LLM+火山TTS在本地/协议隔离环境完成双向对话/取消/打断/超时/背压验证;契约参数直达SDK/控制器,调参不改代码/重启,不硬编码model/voice/speed;无旧实现/静默降级/旧音频重播;真实供应商费用/联调延期 | E09–E11/E14/E17/E22、L06/§5.1;协议/参数/音频 fixture |
| P1-06 结果与资产 | 既有7路径/8事件的合法场景和反例通过;实时文字/opt-out及时,call/command整体补传保留原ID;录音verified后ready、授权读取字节一致,失败恢复不重拨 | S01–S04/S16/S23、E08/E12/E17–E19、A07/A15/A16 |
| P1-07 租户骨架/全局额度 | 只启用1个租户,未启用租户拒绝;独立队列/原值key/复合幂等/窗口受控;单 Cell 竞争租户/供应商/按模式AI额度不超配;双租户和跨 Cell 汇总不在本轮 | C05–C07、S08/S09/S18/S20–S22;SQLite/实际许可计数 |
| P1-08 故障与控制 | 重投10次同一执行只产生一次实际发起;覆盖§4.1崩溃窗口、MQ/Unary/ARI断连及D/A重启,未知不重拨/不释放;pause/stop/CAS/最后许可及 09:00–20:00 时间门禁正确,旧库恢复正确 |
S01–S27的P1部分、E02/E03/E13/E21、A07/A08/A18/A20 |
| P1-09 静态配置/稳定性 | 管理批准制品经维护窗口加载;错误版本/哈希、未排空/未确认、部分失败均不恢复相关准入;两种模式按§9.1受限隔离负载持续稳定测试,告警/录音/资源无未解释泄漏 | E04/E05/E13、A09–A14的P1部分、S27;单 Cell profile与原始计数器 |
| P1-10 本地恢复/授权 | 单节点唯一写入与唯一调度所有权、备份/维护更新/恢复演练通过;契约/fixture 签收白名单、时段、限额/预算与风险;明确D单点和未上传资产丢盘边界。生产切换与真实授权延期第二阶段 | §7/§8、A06/A17–A20;运维步骤与隔离签收记录 |
两模式均需在本地/协议隔离环境验证,所有纳入本轮的供应商配置 fixture 和单 Cell 组合分别留存闭环证据;稳定性长跑按批准的隔离负载矩阵覆盖全部 fixture。SIP 外呼时间窗口使用注入时钟覆盖 08:59:59、09:00:00、19:59:59、20:00:00 四个边界,窗口外必须在最后许可前失败且不产生 originate。真实供应商、ECS、生产 SaaS/MQ receipt 和生产切换如实标记为第二阶段,不能把 fixture 写成真实联调完成。
1.2 88项基线的阶段适用规则
未列出的C/S/E/L/A用例全部适用P1。 下列混合用例必须拆分子场景并记录阶段,不得将整行未做部分标PASS。
| 用例/范围 | P1必须做 | P2(第二租户前) | 后续功能/规模验收 |
|---|---|---|---|
| S06;S17公平部分 | 单租户集合/持久窗口及崩溃恢复 | 第二阶段再做等权有界轮询、额度不足跳过、轮转进度/重启公平、§9公平SLO | 权重/借用/大规模 |
| S08/S09/S18/S20–S22 | 当前单租户与单 Cell 原子额度、背压、DLQ原租户恢复、安全停用 | 双节点/第二 Cell 汇总、多租户同时执行的额度、租户级公平/ACL/清理互不影响 | 多D分布式额度 |
| S02/S08的FALLBACK | 未启用自动跨供应商FALLBACK,不因失败/超时重拨;未知策略按批准能力拒绝 | 同P1 | 启用前另测合法attempt/CPS及重试条件 |
| S05/S07/S24/A20 | 真实broker断连/重启,单D唯一所有权/第二进程拒绝、SQLite备份/恢复和旧所有者隔离 | 同P1 | broker quorum、跨机D HA/接管 |
| E04/E05/A12/A14 | 静态来源/版本/哈希、维护屏障、实际加载、部分失败/人工恢复、唯一写入 | 同P1 | 在线发布编排/自动回滚 |
| A13 | 不启用在线改配入口 | 不强制 | 完整动态新增/修改/停用 |
| E15/A19 | 固定单节点/单 Cell 绑定、新boot/旧会话隔离,静态清单人工变更的排空/收尾 | 第二阶段再做多节点集合与跨 Cell 变化 | 在线弹性增删集合 |
| E16 | MQ结果留真实attempt/线路/Cell/出口历史事实;缺事实标不完整 | 同P1 | 管理平台统计聚合/全量事实接口集成 |
| A09/A11 | 基本资源/新鲜度、单 Cell 静态授权候选的固定选择、完整额度 | 第二阶段增加租户公平和多节点安全 | 高级负载评分/全量遥测 |
| A16 | 本地文字恢复、实时MQ/opt-out;文本OSS归档明确未启用 | 同P1 | 文本归档新合同/权限/下载 |
| A17 | 维护窗口升级、实际兼容/版本校验、不兼容拒绝 | 同P1 | N/N-1混合运行/在线滚动编排 |
| L01/L02/L04/L06/L08 | 核验实际采用的依赖/协议/codec;生成使用入口及引用闭包,不裁掉源Schema | 增量核验新依赖/入口 | 全部候选/未用音频能力不作首发门禁 |
| §6、§9的DEV公平/SCALE-MOCK/真实规模 | §9.1受限单节点稳定性、既有安全/恢复/延迟指标 | 第二阶段再做 DEV 公平、多节点和多租户 | Python/Go对比、1000路/N+1/HA |
P2退出须至少两个模拟租户验证隔离/总额不超配,并用三个等权模拟租户完成§9的首次许可、100许可份额与故障恢复公平测试;通过后才开放第二真实租户。最后许可/fencing和控制屏障已在P1,不随多D协调延期。
2. 独立验证环境
从P1a开始,本项目自己的CI/本地入口负责;这些入口当前尚未实现:
- 精确验证 Go 1.27.1 构建工具链和依赖锁文件;格式化、
go vet ./...、go test -race ./...、普通构建分别执行。race 构建与生产构建分别测性能,不能混用数据。 - 使用Dispatcher真实隔离SQLite、Agent持久文件卷和RabbitMQ,不引PG/Agent业务DB;不得导入Python Store/MemoryBroker或用进程内对象替代协议交互。
- P1使用1单活Dispatcher、1 Agent/1 Asterisk、SaaS/OSS/MQ协议 Mock及故障代理;角色独立进程/权限/目录,可在本机隔离测试。第二节点、第二 Cell、第二D自动接管和两份SQLite双活均延期,不用NFS。
- Agent使用已确认的共享群组证书,但每节点由预配置Endpoint主动激活并绑定受限会话;测试必须区分群组TLS认证与节点授权。
- Mock 的数据库、vhost、队列、目录和端口只属于本次运行;清理只能操作明确登记的测试资源,失败时保留可脱敏重放的证据。
- 单独检出
go-sip后执行验证,不挂载父仓库、不读取父.env、不 import 其它项目内部代码。 - 测试夹具随本项目维护;外部 SIP Mock 只能使用固定版本/digest 镜像及版本化协议。基础开发和纯逻辑验证不能以其它业务系统启动为前置。
- 默认拒绝真实外网。真实 RabbitMQ/DB 集成不等于已授权访问真实 SIP、AI、OSS 或云账号。
testing/synctest 适合进程内时间/取消单测;真实 broker、SQL 事务、网络分区与崩溃恢复必须另测。任何“定时器单测通过”都不能替代分布式安全证据。
3. 契约与隔离验收
| ID | 场景 | 必须满足 |
|---|---|---|
| C01 | 独立目录/发行包运行 | 无父目录、Python 或管理平台源码依赖;Mock 下可独立验证 |
| C02 | 契约来源和生成一致性 | 来源/版本/哈希/生成器可追溯;当前MQ信封已对齐,不回退旧字段;8种payload专属约束缺口须先补齐,通用object通过不算事件验收 |
| C03 | Python/Go 黄金报文 | 字段、空值、数字、时区、枚举、幂等/关联 ID 语义一致;没有新增 HTTP 拨号 |
| C04 | JSON 与配置 SHA-256 | Unicode、字段顺序、空集合、数字边界均符合批准的规范化规则;重复键/歧义输入显式处理 |
| C05 | 原值租户绑定 | 正文、队列/路由、可信身份一一匹配;ASCII/Unicode/分隔符等保持原值;224 UTF-8 字节边界实测 |
| C06 | 不支持的路由或超大消息 | 明确拒绝/停止发布并保留源任务;无截断、无静默清洗、无无限重试 |
| C07 | 信任边界 | 无法通过 MQ 注入 SIP 地址、认证信息、越权主叫、其它租户或任意供应商 URL |
| C08 | 模式隔离 | mock/mixed/real 可辨认;real 拒绝 Mock/测试凭据,Mock 默认不能拨公网电话 |
| C09 | 运行与指标隐私 | 日志、错误、trace、pprof 不泄漏密钥/对话/完整号码;指标无无界高基数标签 |
| C10 | 路径/类型/大小反例 | SaaS既有7路径和响应按Schema校验,bool不得充int、字符串不得隐式转数值,HTTP 64KiB/MQ256KiB及边界、缺字段/额外字段均有反例;不擅自新增业务路径 |
| C11 | HTTP幂等/权限/目标 | control/replay/upload授权/complete的必需Idempotency-Key、作用域、租户/目标绑定均测;缺头拒绝,同键同内容复用,同键跨目标/异内容冲突,outbound.replay/outbound.hangup不可越权 |
4. MQ、数据库与控制面验收
| ID | 场景 | 必须满足 |
|---|---|---|
| S01 | 持久接入前/后崩溃 | 提交前不 ACK;提交后 ACK 丢失可重投,唯一约束阻止重复接受 |
| S02 | 并发重复命令 | 同执行重投/换command ID不增加预留或业务尝试,异载荷冲突可追溯;P1不启用自动FALLBACK,未来启用才另验合法attempt/CPS |
| S03 | 状态与 outbox 原子性 | 事务回滚不产生幽灵结果;提交后断网仍可恢复原事件 ID 发布 |
| S04 | confirm 丢失/不可路由 | 重发原事件、正确处理 mandatory/return;不把 confirm 当 SaaS 应用 ACK |
| S05 | broker 重启、断连和 quorum 故障 | 真正经过 AMQP 和持久队列验证;单节点开发通过不代替三节点 HA 结论 |
| S06 | 大租户积压/小租户到达 | 接入、持久窗口、调度及重启恢复都公平;未 ACK/内存/待执行量有界 |
| S07 | Dispatcher单活/恢复 | P1第二进程不得取得并行写入/发许可权;受控恢复前撤销旧所有者并核验代次/占用,两份SQLite不能各自发额度;不是自动选主/HA演练 |
| S08 | 全局并发/CPS | P1单D汇总当前租户、供应商及单 Cell 的预留/拨号/振铃/已接通/未知占用,无超额;ASR-only不占LLM/TTS。第二阶段再扩展多租户/多 Cell 汇总;FALLBACK后续启用仍计CPS |
| S09 | 部分资源不足 | 租户/供应商、Cell/端口、出口或本模式必需AI任一不足时不能拨号;部分预留释放安全,ASR-only不因未用LLM/TTS缺失被拒,完整模式不静默降级 |
| S10 | 心跳丢失/授权过期 | 停止新任务,已有未知通话占用不靠 TTL 自动释放;恢复要对账 |
| S11 | 控制幂等/CAS | 使用 expected_task_revision,区分 requested/applied revision;同租户 command 重试不再次加版本,错字段/冲突版本拒绝,同 ID 异载荷冲突 |
| S12 | pause/stop/drain/hangup | HTTP 202不是applied;pause和stop drain均保留已拨出/振铃及已接通的原生命周期,阻止新发起;stop显式drain或hangup,hangup缺权限拒绝,部分挂断失败/回执丢失继续 applying/reconciling,全部必要确认后才 applied |
| S13 | applied 与最后 originate 竞态 | 在授权/落盘/投递/ARI 窗口注入控制和分区;先确认持久屏障和旧许可收敛,再 applied;不得出现 applied 后旧 revision 的新拨号 |
| S14 | 撤销后的恢复 | 整任务 pause 屏障覆盖积压/重试/已消费未拨/拨号/振铃;SaaS 禁发并过滤撤销对象,旧执行对账后 paused 可按当前生效 revision 和新 command/execution 授权恢复;stopped 拒绝 resume,旧命令不能复活 |
| S15 | 等待/开始时限 | waiting、dial timeout、max duration 按契约区分;资源等待不能伪装为已拨或成功 |
| S16 | call/command 整体补传 | 仅 call_id/source_command_id,受理即固定截止点;保留原事件/顺序/版本,实时优先、分批限速;含尚无 call 的 command;404/410 区分,拒绝 task/execution/局部筛选,补传自身结果不递归,completed 不是 SaaS 应用收讫 |
| S17 | 多轮故障与数据库恢复 | 恢复 inbox、控制版本、占用、outbox 和公平进度;按 §9 的完好持久卷边界验证 RTO,而非只证明能启动 |
| S18 | 租户复合幂等键 | A/B 租户用完全相同 command/execution/event ID,事实互不覆盖;数据库按 tenant_id+业务 ID 唯一,异载荷冲突不重拨 |
| S19 | 历史事实优先 | 认证/租户归属通过后,对已完成/已拒绝命令的重投返回原事实;任务暂停、配置失效不能改写原决定;换消息 ID 不绕过 execution 去重 |
| S20 | 拓扑/ACL/启动漂移 | exchange 类型、绑定、持久化/上限/拒绝策略不符就不 ready;发布者/消费者最小权限,不能跨租户路由或任意声明资源 |
| S21 | 队列满/blocked | 满队列拒绝新发布、不丢队头,SaaS 留原 ID/任务;内存/磁盘报警与 blocked 限制接入,恢复不爆发无界重试 |
| S22 | DLQ 与安全停用 | 死信恢复回原租户并经过全部配额;禁用/删除租户前对账未决命令、outbox、补传/资产;不能删共享结果队列或悬空任务 |
| S23 | 分域版本/乱序资产 | command/call/segment/recording 分域合并;高版本 call.finished 先到也不吞掉低版本独立资产/attempt,recording.ready 不被结束快照覆盖 |
| S24 | 较旧备份恢复 | 恢复时保持准入关闭,识别已 ACK 但回退的 inbox/控制/占用/幂等水位并与 Cell/SaaS 对账;旧租约/版本不能恢复成第二次拨号许可 |
| S25 | 墓碑/去重保留 | stop 墓碑、execution 去重不随普通日志 TTL 删除;清理后仍有可验证永久失效依据,否则阻塞清理;历史重投不复活 |
| S26 | 时钟偏移 | 覆盖前跳/回拨及阈值边界;偏差>500ms告警、>2s停止新准入,单调时钟用于 duration、DB 时间用于共享租约/CPS,不能错误释放活动占用 |
| S27 | 告警/就绪/恢复保护 | MQ/DB中断、心跳失效、满盘和录音/AI/补传积压逐项注入;真实抓取指标并投递测试告警接收器,验证停止新准入、未知状态和阈值恢复,不只检查日志有文字 |
4.1 必须覆盖的崩溃窗口
至少在以下位置做独立进程 kill/网络故障注入:
- inbox 事务提交前、提交后且 broker ACK 前。
- 资源预留提交前后、内部投递前后及 confirm 丢失。
- 中央账本认领及Agent执行文件持久化后、ARI请求已送达但响应丢失、接通后进程退出。
- pause accepted 后、Cell 屏障确认前、applied 发布后且旧授权仍在网络途中。
- 通话终态已落盘但全局结果未确认、结果已发布但本地确认丢失。
- OSS PUT 中断、上传成功但 complete 失败、verified 后但
recording.ready未发布。
每个窗口都检查:实际发起次数、持久状态、有效所有权/控制版本、资源占用、消息原 ID、录音可恢复性。无法证明外部动作未发生时应进入待对账,而不是重试 originate。
5. Cell、媒体与 AI 验收
| ID | 场景 | 必须满足 |
|---|---|---|
| E01 | 2Cell/至少3供应商路由 | 只用静态授权Cell/trunk;逐启用组合验证主叫/前缀/codec/出口;原始号码白名单校验,前缀一次构造,无串用、逐呼reload或自动跨供应商重拨 |
| E02 | ARI 乱序/断线/404 | 事件正确归属;断线后有界追平/对账;不能因通道查询失败就证明“从未拨过” |
| E03 | originate 结果未知 | 中央权威账本、Agent执行文件与ARI对账前不释放占用/重新拨号;重投/Unary响应丢失不产生第二通电话,不要求Agent SQLite |
| E04 | 配置版本、哈希与禁用 | mTLS/身份/CAS/哈希正确;先准入屏障及必要排空,再原子替换/reload/加载确认;失败回滚也需确认,disabled 删除片段不能先于屏障 |
| E05 | 发布/停用与在途通话 | 不逐呼 reload,不擅自强挂已有通话;屏障前不得下发破坏性 reload;部分成功/失联/配置漂移保持受影响资源阻塞,不以 DB active 指针替代实际加载事实 |
| E06 | RTP 解析与 fuzz | 畸形/超长/扩展/padding/序号时间戳回绕、乱序、重复、丢包均无崩溃/越界/无界分配 |
| E07 | 媒体隔离与时钟 | 包/SSRC/源验证,多个通话不串音;PCMA/PCM、采样率、节拍和抖动策略有证据 |
| E08 | early media 与录音 | 振铃/183 不计 answered;从接通开始记录双向实际音频,双方标识音、时长、末帧与业务结果一致,不能用空 WAV/合成音冒充 |
| E09 | ASR双模式生命周期 | 百炼/火山适配分别验首包/最终结果/结束/取消,模型/语言/中间稿/采样与热词/VAD等获批参数实际生效;ASR-only无LLM/TTS及虚假播放;复用协议但无旧项目运行依赖 |
| E10 | 新LLM/TTS首发必需 | 完整模式使用新批准官方/开源SDK,真实权限/音频/模型/取消/打断/限额/费用验收;未启用或仅Mock即P1 blocked,不调用旧实现或用“兼容OpenAI”替代能力证据 |
| E11 | 打断与慢消费者 | 旧轮次不再播放;生成/排队/发送/播放可区分,缓冲按时长/字节有界 |
| E12 | 录音交接与重放 | OSS 校验 verified 后才出 recording.ready;哈希/长度/ID 正确,恢复不重拨、不覆盖未交付文件 |
| E13 | 资源泄漏/优雅退出 | 多轮超时、取消、断网后,goroutine、FD、端口、buffer、临时文件和占用回到可解释基线 |
| E14 | 模式相关依赖缺失 | 必需依赖unknown/缺失拒新任务;ASR-only可在LLM/TTS不可用时正常运行,完整模式不能静默退成仅ASR;未知不是健康 |
| E15 | Cell 集合/重启/世代 | 新增/移除 Cell 分别做 bootstrap/撤销和集合屏障;旧 boot/旧授权世代/乱序序列不能恢复 ready;响应丢失后幂等重试不覆盖漂移事实 |
| E16 | 管理统计事实 | 经版本化协议发布实际发起/attempt/接通/结束/来源及线路/Cell/出口历史快照、水位;与独立 SIP/ARI 证据比对,缺事实标不完整,禁止用当前配置补历史 |
| E17 | 文字与已播放事实 | final 后迟到中间稿不覆盖;当前同段 final 同内容幂等、异内容冲突,未来修订需先改契约;打断后的旧片段不记已播放,缺段发 transcript.failed,不阻塞 call.finished |
| E18 | DNC 闭环 | 获批判定后 contact.opt_out 及时发出,不等挂断;独立 SaaS 持久禁发并处理相关任务屏障,拒绝擅自新增关键词判定 |
| E19 | 上传注册/签名/覆盖 | CALL_NOT_REGISTERED 保留文件;签名过期续原会话,不新建资产;限定 HTTPS/headers/对象、拒任意重定向,verified 后旧签名不能覆盖,独立读取实际字节验证 |
| E20 | 已知媒体事故回归 | ExternalMedia 未就绪/端口未取到、桥成员不齐、错误来源/SSRC、取消末帧均有协议夹具;原 MixMonitor 路径须停止封口后上传,新录音路径须证明等价 |
| E21 | spool/永久丢盘 | 70/80/60% 阈值、活动录音余量、满盘/只读/截断/永久丢盘分别注入;不删未确认文件,不静默丢录音/重拨,不宣称未上传数据 RPO=0 |
| E22 | 不可变AI版本/配置来源 | GAP-08/09从上游批准生成;D按任务版本向SaaS获取/校验,Agent固定有效快照,条件必填/合法事件/超时/资源有反例。同版本异内容/缓存越权拒绝,不增MQ模式/URL/密钥;调参新版本无重启生效,在途不变;细则§5.1,历史事实按S19 |
5.1 AI参数有效性验收(E09/E10/E22/L06的P1子场景)
不新增用例编号/总数。使用本项目SaaS协议Mock返回版本化配置,实际SDK向隔离协议Mock发请求并记录脱敏字段;计时/打断/缓存等本地参数同时观测控制器行为,不能只检查配置结构体非空。真实供应商测试另获授权。
| 子场景 | 通过判定 |
|---|---|
| 配置唯一来源 | 两个Agent仅向D取执行快照,D按任务agent_version_id调用已有SaaS AI GET;模型/voice/resource/协议端点来自受控配置/引用。断开本地业务env覆盖仍一致,不存在私造task-config或Agent直连SaaS |
| 逐参数可达 | 交互§6.2所有首发启用字段均有source→effective→SDK字段或控制器映射;每项至少基线/变更值及适用边界。音频实际采样/编码、TTS语速/voice、LLM采样/Token、ASR输出控制、超时/打断/分句/缓存均测,不以请求200代替生效 |
| 零值/缺省/拒绝 | temperature=0、interim=false、allow_interrupt=false及合法空列表不会被默认覆盖;未提供/null与零值区分,默认由批准源版本物化。未支持/越界/额外字段或冲突有原因,不能静默忽略/钳制/透传metadata |
| 无重启调参与隔离 | SaaS发布v2,新任务引用后两Agent均使用新参数;v1排队任务及进行中通话仍用v1,同v1异内容拒绝。两通合成任务使用不同model/voice/阈值并发,不共享可变SDK参数或串凭据 |
| 缓存/故障/期限 | 缓存按租户+版本绑定;SaaS不可达时只用符合已批新鲜度/撤销规则的缓存,无合法缓存拒新准入并遵守admission_deadline。过期/撤销/异租户缓存/引用丢失均注入,不静默选latest或默认模型、不重拨历史执行 |
| SDK能力与供应商差异 | 百炼/火山ASR分别验实际API与参数;OpenAI兼容模型不支持的参数明确拒绝;火山TTS语速/音量等必须证明确切映射。不满足就blocked/换库或补上游,不写协议客户端或吞字段 |
| 安全/权限/隐私 | 任意URL/重定向、跨租户credential_ref、headers/raw_request注入和超过资源/时限硬限额均拒绝;调试仅给版本/摘要/SDK和脱敏有效参数,日志/错误/trace不含prompt/变量/密钥 |
| 取消/重试/计费 | OpenAI默认重试显式关闭并用429/断流/超时验证实际生成调用次数;stop/打断后不因SDK自动恢复再生成或播放旧帧。SaaS调参不能打开未经批准的副作用重试 |
只读源索引与Schema本轮不变;未获批GAP-09扩展不得塞入现有严格对象后宣称“支持”。参数PoC先测模拟请求映射,再以获批真实SDK/模型确认效果,不把文档参数名或main示例当兼容证据。
6. 后续性能比较与生产容量(非P1门禁)
P1仍执行§9.1小规模稳定性与安全/恢复测试,不以“快速上线”为由删除长时间运行检查;但无需先做本节性能研究或规模验收。
6.1 Python/Go 公平比较
后续专项登记相同测试范围的Python基线,再用同硬件/容器限制、数据库、RabbitMQ、消息大小、租户分布、拨号速率、通话时长和依赖延迟比较。该对比不阻塞P1。
分别测量以下层次,不能把精简的 Go 模块与包含额外职责的 Python 整机直接相除:
| 层次 | 主要指标 |
|---|---|
| 纯调度控制面 | 接入/决策吞吐、P50/P95/P99、租户等待、事务/锁延迟、CPU/RSS/GC、积压恢复 |
| Cell 协议 Mock | originate/事件处理、活跃通话资源、FD/端口、重复/未知执行数 |
| 完整媒体/AI Mock | RTP 包率/带宽、音频积压、首包、打断、spool/OSS 速度、长稳泄漏 |
| 真实供应商链路 | 接通与音频质量、ASR/LLM/TTS 延迟、供应商限额/错误、费用 |
数据记录硬件、软件/镜像/契约版本、时长、负载、暖机、重复次数和原始证据。承接 §9 已有 DEV/SCALE-MOCK 数值;G0 登记具体版本/环境/获批变更,不能把既有基线全部推回“待定”。阶段基线不是生产 SLA 或消费授权。
6.2 1000 路与 N+1
生产目标是 至少 1000 路同时已接通、具有完整 ASR/LLM/TTS 的 AI 通话,不是 1000 路排队、振铃或只有静音 RTP 的连接。
- 先以完整负载测得每 Cell 安全容量
C,再验证(N - 1) × C >= 1000,另留发布、降级和拨号峰值余量。 - 并发之外单独测试 CPS、振铃/拨号占用、供应商白名单/配额、AI 并发/速率、RTP 端口/包率/带宽、FD/连接数、conntrack、防火墙及出口。
- 多机器、多 EIP 直连;不能用同一地址填两次充当备用线路,也不验证单 EIP+NAT 备选。
- 主备调度器、broker、数据库、OSS 和供应商故障分别测试。未知通话先保留占用;不能为恢复吞吐跳过对账。
- N+1 证明的是剩余安全容量和恢复能力,不是 Cell 故障时活动通话无损迁移。故障中断了多少通话、恢复用了多久必须如实报告。
- Mock 负载只验工程容量和故障处理,不替代真实 1000 路、N+1 及供应商签收。
7. 迁移、试点与回滚
7.1 上线前置
- G0中P1契约/双AI模式、SaaS AI配置与可调参数GAP-09、SQLite/文件、内部许可/屏障、静态交接、预算/保留已签收;延后缺口单列。
- P1a–P1d完成且§1.1十个汇总门禁有独立证据,无未关闭的重复拨号、超配、控制或资产丢失;不要求P2公平或1000路/N+1先通过。
- 数据库迁移与恢复演练完成,备份/哈希/版本可核验;明确旧新版本的读写兼容范围。
- 真实白名单、供应商、Cell/出口、测试时段和费用逐项获得授权。当前仅允许原始号码
15003164745、15830461047,不得从历史测试记录扩展名单。
7.2 安全切换步骤
- **离线/影子验证:**复制脱敏输入到隔离域,只计算决策,不消费正式队列、不占生产额度、不调用 ARI。
- **选择切换边界:**只选授权的租户/Cell/路由。共享供应商或 AI 额度无法统一协调时,不做旧新并行灰度,改维护窗口完整排空。
- **冻结旧端:**停止新发布/准入/消费或建立对应控制屏障,确认旧所有权撤销;处理已发许可、未 ACK 和在途执行。业务 pause 与 stop 保留各自语义,不为迁移默认 stop/hangup,也不把 paused 任务永久化。
- **排空/对账:**识别已接通、拨号/振铃、未知执行和未交付资产。已有通话由原 Cell 完成;不能以公平或切换为理由擅自挂断。
- **搬迁已批准的状态:**显式导出/导入待执行、幂等 ID、控制版本、占用、outbox、补传及录音交接进度;保留 ID 与来源校验,不双写旧库。
- **授予新端所有权:**确认旧端不再拥有同一调度域/资源写权限,Go 验证队列绑定、配置版本和外部健康后,才开放小规模新准入。
- **观察/扩大:**检查业务、媒体和成本指标及拒绝原因;按签收的窗口放量,不因 CPU 很低就提高供应商额度。
P1运行不依赖旧Python Cell;迁移验证如需临时桥接而旧端不满足新许可/控制语义,保持Mock直到Go Cell就绪,不以HTTP代理绕过。
7.3 回滚边界
- **Go 尚未发起真实执行:**撤销 Go 权限,对账后可恢复旧版本。
- **Go 已执行但可排空且状态兼容:**冻结准入,待通话与资产交接可确认,完成反向状态迁移/兼容验证,再转移所有权。
- **存在未知通话、不可逆 schema 或不兼容状态:**暂停新任务并人工对账/前向修复,不能退镜像后让旧版本重新消费原命令。
- 每次演练确认:无双写、无双发许可、无重复 originate,原 ID/控制版本/配额/录音均可追溯。未确认事实记为 unknown,不能为了完成切换改成成功。
8. 证据与签收
每个测试记录:测试ID/子场景/阶段、Git/构建/契约/镜像版本、mock/mixed/real、AI模式、tenant/Cell/供应商授权组合、profile/参数、起止时间、预期/实际、脱敏证据、失败注入点、风险/复测。分阶段记延后与blocked,不能整行混记PASS。
阶段签收分开列出:
- 文档/契约检查。
- 单module/Cobra双命令构建、Go单元/race/静态/fuzz、Proto与契约生成校验。
- 真实隔离SQLite/RabbitMQ集成、Dispatcher唯一所有权与恢复、Agent文件持久性及Unary故障。
- SIP/ARI/RTP/AI/OSS Mock 集成。
- 经授权的真实 SIP、ASR、LLM/TTS、OSS 验证。
- P1受限稳定性与已授权费用;P2公平调度;后续完整1000路/N+1分别签收。
- P1维护切换、人工恢复、备份演练;在线发布/HA切换待相应功能启用另验。
本轮仅能检查第 1 类中的文档结构与一致性,不能把尚未生成的 Go 测试/服务列为“通过”。
开发前的交付/解锁证据见 G0开发准备与契约冻结方案 §2/§5/§8。D01–D10方案已获用户确认;项目内 W01 版本和 W02 Proto 已交付,但外部权威签收、D10正式PoC和真实供应商仍未完成;十项交付门禁不增加本方案88项运行验收数量。§5.5内部profile已确认为隔离PoC初始值,未实测、不是生产SLA,也不覆盖下节上游/供应商基线。P1必须实施当前租户及单 Cell 原子配额,P2/第二阶段再扩展多租户公平、跨 Cell 和并行竞争验收。
E12/E19新增明确子场景(不新增用例编号):证明Agent从Dispatcher取得受限配置后直接连接OSS上传,Dispatcher/gRPC链路没有录音文件内容;Dispatcher失联时有效授权可继续直传,过期则保留文件,放弃当前token并等待显式重新授权,不回退长期AK。直传成功但Dispatcher/complete不可达时保留原资产和待完成状态,恢复后幂等完成SaaS verified再由Dispatcher发recording.ready及OSS ID;PUT成功不得提前发ready。
9. 继承的量化测试 profile
以下是上游《最终开发部署监控与验收计划_v1.0.md》§5 的只读测试摘要,不是新的参数权威,也不是P1全量必跑清单。P0导入带来源/哈希的profile;按§9.1生成有来源和变更理由的阶段profile,不篡改摘要。租约/许可/窗口/保留/恢复等安全值继承,实际费用/能力/生产RPO/RTO另批。
| profile 项 | 上游默认测试值/判定 |
|---|---|
| DEV 拓扑 | 3租户、2中央调度实例、2 Cell;每租户并发2/CPS1、突发令牌1,全局并发6/CPS3;每Cell测试容量4;HA另测3节点quorum |
| 公平/窗口 | 等权、每轮每租户最多1许可,无事件轮转间隔≤100ms,新活跃租户发现≤1s;每租户未ACK≤4/持久待发起≤16,全局未ACK≤32/待发起≤64,跨实例汇总 |
| 发布/消息 | 每租户发布≤10条/s,命令队列1000条或16MiB先到者;满队列reject-publish,不丢头部,源任务留SaaS;MQ≤256KiB,HTTP JSON≤64KiB,超限不截断文本;全局broker水位需显式配置 |
| 授权/通话/AI | 授权300s且不越允许时段,首次准入30s,到期终结≤1s;重投/重启不延期;振铃30s、最长通话180s、静音15s、AI首输出超时5s;AI故障不自动切SIP或播放自造提示 |
| 心跳/时钟 | 心跳2s、租约10s、对账轮询≤2s;失联禁止本地新发起、未知占用保留;偏差>500ms告警、>2s停止新准入,覆盖时钟跳变 |
| HTTP/投递重试 | HTTP连接3s/总请求10s;可恢复失败退避1/2/4/8/16/30s加抖动,每轮最多6次,尊重Retry-After/有效期;耗尽持久隔离告警、不删原事实或换ID;录音字节传输120s超时 |
| 上传/补传 | 授权300s,对象Mock文件≤16MiB;补传每批≤100事件、全局≤50事件/s,优先实时结果,分批读取避免全量入内存 |
| 保留 | 事件补传7d,SaaS测试inbox至少8d,日志7d;对象覆盖对应ready完整补传窗口,未决恢复对象不普通清理;已交接本地录音满足verified/ready确认/无恢复任务后至少24h;去重/stop墓碑不套普通TTL |
| 磁盘 | 测试录音/缓存卷至少16GiB;70%告警、80%停新接单,60%且依赖恢复再接单;预留空间覆盖活动通话最大剩余录音 |
| 中断/恢复 | SaaS消费/上传中断5min,恢复后10min内补齐固定负载;卷完好时已提交事实/最终稿/封口录音不丢,DB/MQ恢复后60s内恢复安全调度;永久丢未上传录音不承诺RPO=0 |
| 查询/受理/控制 | HTTP查询P95≤500ms;正常消费时SaaS持久发布→命令持久受理P95≤2s;健康且无不确定发起时控制持久受理→相关屏障applied P95≤2s;失联不能当成功样本 |
| 公平SLO | 持续有资格且资源足够的B/C发现活跃后≤2s得首次许可;稳定竞争至少100许可,3等权租户份额偏差≤10个百分点;不足/隔离者单列 |
| AI/文字/录音/清理 | ≥100有效轮次;VAD结束→首个有效TTS送桥P95≤1500ms,插话→停止旧TTS送桥P95≤500ms;最终稿形成→SaaS Mock事务应用P95≤3s;≤180s通话挂断→对象verified/ready消费/授权读取≤120s;正常结束30s内清本次通道/桥/媒体 |
| SCALE-MOCK | ≥2调度实例、100租户×并发12、全局并发1200、模拟CPS20;额外200占用预算用于拨号/振铃/换批,不能计已接通;扩展测试Cell容量并注明,不套DEV容量4;暖机后持续补充新授权执行,≥1000模拟接通维持60min |
| 重投/真实规模 | 同ID重投10次仍同一事实;真实完整AI≥1000已接通稳定≥60min,并验证N+1安全容量与故障后新授权补负载;不将断掉的旧execution换ID自动重拨 |
阶段执行时须同时记录profile、环境、参数和原始计数器。如源包与摘要冲突,先同步修订;阶段拓扑差异用批准覆盖文件表达,不在实现中悄悄修改源值。
9.1 P1/P2阶段profile与稳定性判定
| 项目 | 阶段执行规则 |
|---|---|
| P1拓扑 | 1单活D、1 Agent/1 Asterisk、1启用租户、至少3供应商 fixture;第2 D仅负例,双租户仅后续阶段。单 Cell/出口条件按本地隔离 fixture 签收 |
| P1负载 | G0登记租户/全局/供应商/单 Cell 并发与CPS、媒体和两模式AI额度、预计呼叫数/费用、磁盘与资源阈值;不高于已验证能力/批准预算。缺参数/授权阻塞真实联调,不自动套1000路或DEV全局6 |
| P1延迟/恢复 | 继承上表适用的受理/控制/心跳/时钟/重试/保留/spool/上传/恢复阈值。ASR-only采用文字/录音指标,TTS首包/打断标不适用而非通过;完整模式采用全部相关AI指标,模式专属静音/超时按GAP-08批准值 |
| P1持续稳定性 | 在登记负载下两种模式分别持续补充新授权执行运行≥60min,覆盖单 Cell 及至少3供应商 fixture;完整模式至少100有效对话轮次,ASR-only至少100最终识别片段。工程 Mock/mixed 分别记录,真实呼叫/费用另行明确授权;不能循环重拨旧execution凑样本 |
| P1通过判定 | 无重复实际发起、跨通话串音、超额或越权;无未解释的事实/资产丢失;正常结束30s内清本次媒体资源,goroutine/FD/端口/spool有可解释基线且不持续泄漏;适用P95/恢复指标通过,未满足项有失败/blocked记录而非删样本 |
| P2公平profile | 仍1单活D/2 Cell,启用3个隔离模拟租户,继承DEV每租户额度、窗口与公平SLO:合格且资源足够者发现后≤2s首许可,至少100许可中份额偏差≤10个百分点;大租户积压、额度耗尽跳过及重启恢复均验证 |
| 后续 | 多D、broker HA、SCALE-MOCK、真实1000路/N+1以及权重/借用另立项;不作为P1/P2已通过能力 |
60min/100片段是本次工程稳定性底线,不是容量SLA或自动消费授权;若真实预算不足须明确阻塞或由用户重新批准验收范围,不能以Mock通过替代真实双模式。
10. 开源复用与 SDK 门禁
组件候选和源证据见 开源组件选型与复用清单。以下 PoC 在项目内隔离协议 Mock/真实本地 Asterisk、DB、MQ 下执行;不是自动获准调用供应商。
| ID | 场景 | 必须满足 |
|---|---|---|
| L01 | 版本/许可/供应链 | module 路径、tag/commit、Go 1.27.1 构建与 go.sum 一致;主/传递依赖许可证、NOTICE/SBOM、漏洞扫描与处置记录齐全;未核验不进入生产镜像 |
| L02 | 3.1/2020-12生成校验 | 锁定可用生成器/校验库,覆盖实际使用入口及全部引用闭包、nullable/required/额外字段/哈希和双模式正反例;来源包保留完整,生成可重复,不手改Schema降级;未用管理API无需全量生成服务 |
| L03 | ARI SDK 与 Asterisk | 锁定 Asterisk 镜像和 SDK major;验证 ExternalMedia 返回/变量读取、订阅/断连/取消、bridge、录音和 reload 路径;ARI响应丢失不会被默认重试变成二次 originate |
| L04 | RTP/音频库 | 使用库完成 packet parse/marshal、A-law/μ-law/PCM/重采样所需能力;黄金音频、长度/端序/SSRC、fuzz、抖动/回绕/长稳通过;不把 Pion G.711 depayloader 当作 PCM 解码器 |
| L05 | AMQP/SQLite/恢复封装 | SDK/封装暴露manual ACK、return/confirm、连接世代和取消;恢复无旧channel ACK/丢confirm/窗口翻倍;真实SQLite验证单writer/短事务/CAS/WAL/Sync/checkpoint/备份/迁移,不能套PG行锁语义 |
| L06 | 选定AI SDK/参数/重试 | 核验百炼/火山ASR、官方openai-go对目标兼容LLM、火山TTS的精确模块/协议/鉴权/音频/取消/费用;§5.1参数必须映射有效、无硬编码默认。火山SDK必要字段缺失则阻塞,OpenAI关闭默认重试;不自写协议或验证所有未选候选 |
| L07 | OSS/HTTP SDK 边界 | Agent 消费 SaaS 签名而不擅自接管签名职责;标准库 PUT/SDK 保留约定 headers、对象/会话/哈希与取消语义,E19全过;日志不含签名密钥或URL凭据 |
| L08 | 复用审查/替代门禁 | 每个协议边界列出所用库/原生能力和理由;自有代码限业务状态机及薄适配;归档/不兼容候选不得静默替代为手写。先替换库、修上游或报告阻塞;例外须用户另批 |
11. 上游需求到 Go 验收追踪
本表保留跨阶段追踪,不改变上游契约。P0按§1.2逐子场景标P1/P2/后续,记录源版本/哈希及入口/参数/证据;未实现、blocked或延后不得计PASS,不能把本表全部条目当P1前置。
| 上游要求 | 方案章节 | Go 验收 | profile/判定及证据 |
|---|---|---|---|
| 主契约 §4.1–4.1.1;FIX-05/12;V04 | §6.4 | S11–S14、E18 | 控制2s基线;revision/权限/目标绑定、ARI发起/挂断、多Cell屏障;paused可恢复/stopped不可恢复 |
| 主契约 §4.4;FIX-09/10/12;V10 | §6.5 | S16、S23 | call/command固定集合、原ID与404/410;outbound.replay、跨目标冲突;分批限速、恢复、不递归 |
| 主契约 §6.2、§7.2;FIX-02/03;V01/02 | §6.1/6.3 | C05–C07、S01–S04、S18/19 | 跨租户同ID、同ID重投10次、换command同execution、异载荷与提交窗口;真实broker/DB计数 |
| 主契约 §5.1.2;FIX-04/06/07;V03/05 | §6.1/6.2 | S05–S10、S20–S22 | DEV窗口/100次公平/队列上限、HA quorum、confirm/blocked及源任务保留 |
| 主契约 §7.2/7.3、§9;FIX-15/16;V08/10 | §6.6/7.2 | S23、E10/11/17/18/22 | 独立SaaS按域收敛文字/播放/opt-out,100轮与时延、同段final异内容冲突 |
| 主契约 §4.3/§8;FIX-11/17–20;V09/10/11 | §7.3 | E08/12/19/21、L07 | 180s通话→交接≤120s、5min中断→10min补齐、70-80-60%/24h;幂等头/作用域/绑定/实际字节与覆盖反例 |
| SIP-27/28/29/30/32 | §8 | E04/05/15、L03 | reload前屏障/新旧集合/bootstrap/幂等/部分成功;管理模拟端、调度和Asterisk三方证据 |
| SIP-13/14/33 | §8/9 | E16 | attempt历史快照/跨午夜/零分母/缺事实补齐、接通后AI失败不冲减接通;与管理固定样例核对,不由Agent重造统计口径 |
| FIX-06–08/21/22;V03/07/11/12 | §5.3/6.2/9.1 | S07/10/17/24–26、E13/21 | 完好卷60s及永久丢盘边界;旧库恢复到新目标核对,不覆盖新防重事实、不删墓碑;告警接收/保护/恢复有证据 |
| FIX-14/17;V06/07;既有媒体事故 | §7.1 | E01–E09/E20、L03/04 | 真实Asterisk+Mock对端、至少两通不同标识音、实际双向RTP/录音;30s清理及ExternalMedia/桥/末帧;不确定不FALLBACK |
| FIX-01/13/23;V01/12;SIP-38独立性原则;用户复用要求 | §3/4/9 | C01–C11、S27、L01–L08 | 无父目录检出、7路径/64KiB/256KiB/类型反例、模式/权限/SDK与许可证;对应管理平台测试不冒充Go验收 |
| V12–V14、M1–M3、R1–R3 | §9–11 | 全部适用用例及§6/§7 | 同环境对比、1000路60min、N+1/供应商另验、切换/回滚/备份;Mock不替代真实 |
P0冻结前逐行登记阶段、状态、责任人及风险。本轮运行时均为未执行;文件/链接/源指纹可检查,但GAP-01~09的未批准部分不能标通过,后续范围不阻塞无关阶段。
12. 最新架构验收 A01–A20
源数据/RPC草案见 通信与事件数据交互,源快照见 字段索引。本组与前述68项合计88项,按§1.2分阶段;缺首发Proto/契约则P1 blocked,未来在线发布接口未实现记后续,不用临时字段凑过。
| ID | 场景 | 可判定通过条件 |
|---|---|---|
| A01 | 事件/接口全集与覆盖 | 现有42操作/115组件的源哈希、7路径、1种执行命令/8种event_type和原样例均可追踪;旧信封/非法call.transcript拒绝;payload专属Schema及条件规则补齐后才冻结 |
| A02 | Cobra一个制品两个业务 | 同module/镜像构建,显式业务子命令仅agent/dispatcher,无默认双业务启动;help/version不触网;agent不初始化MQ/业务DB,dispatcher不开RTP/Agentspool;配置错误不泄漏凭据 |
| A03 | Endpoint引导启动 | 业务启动只填D Endpoint;部署提供证书/ARI/目录/批准静态制品。未激活不取敏感配置/接任务,D按单一受控Endpoint绑定后核验自身SIP/OSS/AI版本;缺Asterisk/凭据/静态版本not-ready |
| A04 | Endpoint与实例归属 | 任意自报URL、错误cell/agent、重复Endpoint、克隆spool、新旧boot并存、移除后重连分别测试;仅D预配置绑定生效,不产生SSRF或双执行归属 |
| A05 | 共享证书授权隔离 | Agent群组证书不能调用D角色的管理RPC;伪造另一agent_id但无对应激活会话被拒;会话限定boot/代次/操作/租户执行目标;明确共用私钥不提供节点级证书隔离 |
| A06 | TLS/轮换/泄露边界 | SAN/SNI/信任链/有效期严格校验,禁止跳过验证;D证书与Agent群组身份分离;全组轮换/撤销及过渡窗口有演练,新准入阻塞和已有执行收尾策略可追溯 |
| A07 | Unary接受/结果未知 | Execute快速accept,不把RPC保持到通话结束;注入请求送达/副作用后回包丢失,按原ID查询/对账,控制accepted≠applied,不无条件重试originate;Report重投只生成原MQ事件 |
| A08 | Agent文件而非业务DB | 无SQLite/PG连接,manifest/文字/录音/待报事实单写;崩溃/半行/Sync前后/rename窗口/路径穿越均测;启动只恢复对账/上传/上报,不凭残留文件重拨 |
| A09 | 健康新鲜度/资源采样 | 心跳查询2s、TTL10s;旧boot/乱序/过期样本不恢复ready;采样失败为unknown而非0;host/cgroup/process口径、CPU/load/内存/FD/spool/媒体资源与gopsutil/ARI证据对应 |
| A10 | 能力/版本/供应商匹配 | 软件与协议能力、AI版本、每provider/trunk的desired/applied/hash、注册适用性可区分;未知/不兼容/未加载/未验证时拒新准入,不把“支持SIP”当获授权所有供应商 |
| A11 | 静态候选/健康准入 | 单 Cell 按固定已批准策略选新执行;CPU低不越当前租户/供应商/本模式AI/端口限额,基本保护/恢复可验证;新boot不清未知,已有执行不改投/迁移;高级负载评分延后 |
| A12 | 静态SIP/运行配置 | 部署交付管理批准制品、D按身份核验目标/版本;原Schema/来源/哈希/凭据引用验证,缺密钥/错mode/任意路径/脚本拒绝;首次实际加载确认前not-ready,不要求R04/R06在线推送 |
| A13 | 动态改配/停用 | D固定目标集合、持久发布意图、先关闭准入并收敛必要占用,再ApplyTrunkConfig;每Agent实际加载确认;修改/新增/移除/disabled不逐呼reload、不擅自强挂 |
| A14 | 静态失败/人工恢复/单写 | 版本/哈希冲突、写完未加载、部分失败/确认丢失、恢复旧制品失败/旧代次回报均注入;保持真实installed和阻塞,旧管理直写不可与受控静态入口并行;在线自动回滚后续 |
| A15 | SaaS来源OSS配置 | D受控获取SaaS配置/授权并只向对应Agent/执行/对象发短期信息;显式重新授权/配置轮换不中途换资产归属;不泄漏长期AK/签名URL;录音使用recording-uploads和upload_id/complete |
| A16 | 实时文字+OSS归档 | transcript.updated/final/opt-out按原时限回SaaS,不等整通话上传;文本归档无批准授权接口时明确未启用,不冒充recording.ready、不生成新event_type;冻结后验证原segment版本/哈希及查看权限 |
| A17 | 维护更新与版本校验 | P1维护关闭准入/排空/更新/重新激活后才恢复;只用已验证组合,不兼容阻塞,Proto字段号不复用,构建版本不冒充AI版本;混合N/N-1与在线滚动后续 |
| A18 | 退出/断联/收尾 | D退出不强挂Agent已授权通话;A保留文件并可在恢复后补报;SIGTERM先关准入/排空,超时未决状态明确;永久丢盘不承诺零丢失,保留/告警按§9 |
| A19 | Endpoint清单增删 | 列表受控版本化;新增先验证/激活/加载再可调度,移除先排空/对账再撤销新任务权限;旧执行事实仍有受控收尾/人工恢复路径,不能简单丢弃或误删资产 |
| A20 | 单活D升级/旧库恢复 | 停旧所有者、SQLite一致性备份/迁移、核对Agent最高已见许可/配置及未知占用后开放;不得两份SQLite各自发额度,不把语音Cell N+1当D自动HA |
12.1 用户新要求的追踪
| 要求 | 设计位置 | 验收 |
|---|---|---|
| 同项目Cobra双命令、统一更新 | 主方案§3.1/§5.7 | A02/A17/A20、L01 |
| D SQLite、Agent文件、Unary | 主方案§5.1–5.4;交互§7–8/§10–11 | A07/A08/A18/A20、S/E恢复用例 |
| Endpoint最小启动、共享mTLS | 主方案§5.4–5.5;交互R01–R03/R05 | A03–A06/A19 |
| 健康/负载/版本/供应商和配置版本 | 主方案§5.6;交互§9 | A09–A11、E15/E16 |
| P1静态配置;在线发布延后 | 主方案§8;交互§12 | A12/A14、E04/E05的P1部分;A13后续 |
| OSS源SaaS、D统一回传、文本仍MQ | 主方案§7.3;交互§5/§10 | A15/A16、E17–E19 |
| 全部事件/字段与遗漏 | 交互§1–6/§13;只读字段索引 | A01、C02/C10/C11、GAP-01~09按阶段 |
| 单节点/单Agent/单Asterisk、至少3SIP fixture | 主方案§1.1/§5/§8 | P1-02/03、E01、授权组合矩阵 |
| 单租户首发;双租户/公平后续 | 主方案§6.2/§10 | P1-07、S18/S08;第二阶段 S06/§9公平profile |
| ASR-only与完整AI均首发 | 主方案§7.2;交互§4/§13 | P1-04/05、E09/E10/E14/E22、GAP-08 |
| 百炼/火山ASR、OpenAI兼容LLM、火山TTS | 组件清单§1.3/§4.3;主方案§7.2.1 | L01/L06、E09/E10;两ASR及选中LLM/TTS的真实能力分别验 |
| D从SaaS取任务配置,参数不写死 | 交互§6.1–§6.3;主方案§7.2.1 | E22/L06/§5.1、GAP-09;逐参数可达、无重启/不串通话、缓存与隐私 |
| 稳定快速上线、控制面裁剪 | 主方案§1.2/§10 | §1.1/1.2分期、§9.1受限稳定性,不以HA/1000路为前置 |
尚待确认的参数/接口只阻塞其所属阶段;P1必需的双模式、供应商授权、许可/恢复不能延后。已确认的无PG、Unary、共享Agent证书、实时文字MQ与上述上线范围不得悄悄改回。