feat(agent-call): implement remediation plan

This commit is contained in:
2026-09-13 19:20:28 +08:00
parent d30314c7d1
commit b95d2aee81
25 changed files with 3159 additions and 535 deletions
@@ -0,0 +1,128 @@
{
"finished_at": "2026-09-13T10:59:31.729Z",
"gate_status": "INCOMPLETE",
"probes": {
"V01": {
"duration_ms": 15.796,
"evidence": {
"http_execute_route": "absent",
"profile": "mock",
"schema_negative_cases": 3
},
"status": "PASS"
},
"V02": {
"duration_ms": 161.588,
"evidence": {
"calls": 1,
"different_execution_command": "associated",
"same_command_replays": 1
},
"status": "PASS"
},
"V03": {
"duration_ms": 344.365,
"evidence": {
"lease_duplicate_calls": 0,
"scheduler_instances": 2,
"tenants_admitted": [
"tenant-demo",
"tenant-b",
"tenant-c"
]
},
"status": "PASS"
},
"V04": {
"duration_ms": 34.727,
"evidence": {
"affected_commands": 1,
"stale_cas": "rejected",
"waiting_barrier": "applied"
},
"status": "PASS"
},
"V05": {
"duration_ms": 149.141,
"evidence": {
"dead_letters": 0,
"recovered": true,
"retained_id": "cmd_broker_retry"
},
"status": "PASS"
},
"V06/V07": {
"duration_ms": 2131.36,
"evidence": {
"asterisk_real": "not_run",
"disconnect_state_before_reconcile": "reconciling",
"fallback_redials": 0,
"mock_protocol": "pass",
"outcomes": {
"busy": "busy",
"disconnect": "failed",
"no_answer": "no_answer"
}
},
"status": "PASS"
},
"V08": {
"duration_ms": 994.059,
"evidence": {
"old_tts_reused": false,
"segments": 200,
"turns": 100
},
"status": "PASS"
},
"V09": {
"duration_ms": 1131.946,
"evidence": {
"bad_checksum": "failed",
"invalid_ready": 0,
"missing_object": "failed"
},
"status": "PASS"
},
"V10": {
"duration_ms": 113.747,
"evidence": {
"original_event_ids": true,
"pending_after_recovery": 0,
"pending_during_outage": 13
},
"status": "PASS"
},
"V11/V12": {
"duration_ms": 144.282,
"evidence": {
"backup": "verified",
"metrics": "healthy",
"real_mode_mock_rejection": true,
"restored_counts": {
"commands": 1,
"events": 13,
"inbox": 13,
"recordings": 1
},
"restored_db_facts": true,
"rollback_preserves_db": "not_run"
},
"status": "PASS"
},
"V13": {
"duration_ms": 0.543,
"evidence": {
"evidence_file": "docs/evidence/scale-mock-2026-09-12.json",
"reason": "historical state-only evidence cannot satisfy continuous media V13",
"status": "not_run"
},
"status": "NOT_RUN"
}
},
"production": {
"V14": "blocked_external_evidence"
},
"profile": "mock",
"started_at": "2026-09-13T10:59:26.507Z"
}
+30 -19
View File
@@ -1,27 +1,38 @@
# 持久真实 SIP/Asterisk 测试环境证据(2026-09-13)
# 真实 SIP/Asterisk 测试环境证据(2026-09-13)
## 环境
## 当前环境(探针期间)
- ECS:`i-2zegaldd07mkp0xyhcff`,Ubuntu 24.04,`ecs.e-c1m1.large`。
- 竞价策略:`SpotAsPriceGo`(自动竞价);竞价回收可能中断活动通话。
- 固定 EIP:`123.56.71.98`,当前保持 `InUse` 并绑定该 ECS。
- Asterisk:`22.10.1`,固定镜像 digest:`sha256:0f5e3cd0e9a86bc9dc4750929abee9ba1faae11ed39739f3e75343d39d837e41`。
- 线路:UDP `61.132.228.221:5060`,IP 白名单免注册。
- PJSIP contact:`Avail`,实测 RTT 约 `22.146 ms`。
- 主叫原值:`BD93205882`;`From user` 与 `CALLERID` 均使用原值,未发送 P-Asserted-Identity。
- 环境按用户要求保留,未在本轮测试后停止或删除。
- ECS:`i-2ze4hvi6xvy02g0wz9kk`,北京 `cn-beijing`,Ubuntu 24.04,`ecs.e-c1m1.large`,探针期间 Running。
- 竞价策略:`SpotAsPriceGo`;竞价回收可能中断活动通话。
- 固定 EIP:`123.56.71.98`,AllocationId `eip-2zeevfsaxzwuue2szy7xb`;探针期间 InUse 并绑定该 ECS。
- 创建/绑定:2026-09-13 10:28 UTC;使用专用 VSwitch、安全组和 KeyPair,实例公网带宽上限为 0。
- Asterisk:22.10.1,镜像及实际 image ID 均为固定 digest `sha256:0f5e3cd0e9a86bc9dc4750929abee9ba1faae11ed39739f3e75343d39d837e41`,容器状态 `running/healthy`。
- 管理检查:SSH 未开放;通过阿里云 Cloud Assistant 执行只读检查。Cloud-init 初始拉取镜像期间较慢,最终完成并启动容器。
- PJSIP contact:`provider-primary-aor/sip:61.132.228.221:5060` 为 `Avail`,RTT 约 `22.164 ms`。
- 出口与信令:SIP 日志显示请求从 `123.56.71.98:5060` 发出;安全组仅允许供应商 `61.132.228.221/32` 的 UDP `5060` 和 `10000–10800`。
- 主叫原值:`BD93205882`;`From user`/`CALLERID` 保留原值,未发送 P-Asserted-Identity。
## 两个被叫测试
## 单次真实外呼探针
两次均使用同一环境、线路、主叫、UDP/ulaw、RTP 配置;均只发起一次,不自动重试。
- 执行时间:2026-09-13 10:52:59 UTC。
- 原始被叫:`18601013734`。
- 实际目标:`708918601013734`。
- 线路:`provider-primary`,UDP/ulaw;仅发起一次,无自动重试、无 FALLBACK。
- SIP:收到 `100 trying`,随后收到 `488 Not Acceptable Here`。
- 原因:`Reason: Q.850;cause=88;text="INCOMPATIBLE_DESTINATION"`。
- 后续:发送 ACK;Asterisk 执行 Hangup;15 秒后无活动通道。
- 接通/RTP:未接通,未获得 `180/183/200` 或 RTP/录音证据。
| 原始被叫 | 实际呼出目标 | SIP结果 | RTP/接通 |
| --- | --- | --- | --- |
| `18601013734` | `708918601013734` | `100 trying` 后 `488 Not Acceptable Here`;`Q.850 cause=88 INCOMPATIBLE_DESTINATION` | 未接通、无 RTP |
| `18625770806` | `708918625770806` | `100 trying` 后 `488 Not Acceptable Here`;`Q.850 cause=88 INCOMPATIBLE_DESTINATION` | 未接通、无 RTP |
## 测试后资源处置
两组不同号码在同一线路上得到完全相同的目的地不兼容结果,进一步支持供应商共享路由/线路参数问题;仍不能仅凭两次失败排除同一号码段盲区。需供应商提供已知可达号码,或确认被叫格式/路由、From 域和编解码要求后再继续。
按用户授权,探针结束后已优雅停止并删除本次创建的 ECS;删除前确认该实例是唯一 `project=agent-call` 候选,系统盘为 40 GiB 且 `DeleteWithInstance=true`。已确认实例和系统盘不再返回;固定 EIP 未释放、未解绑,当前为 `Available`。
## 范围边界
## 结论
本次仅验证了持久 ECS、Asterisk、SIP OPTIONS/contact、两次真实 INVITE 和失败回执;未验证真实 RTP、MQ、OSS、ASR、LLM/TTS 或完整 AI 通话。
本次确认了单路 ECS/Asterisk 底座、PJSIP contact、固定出口和一次真实 INVITE 链路;供应商以 `488/Q.850 cause=88 INCOMPATIBLE_DESTINATION` 拒绝目标,R1 外呼接通验收未通过。该结果不能证明真实 RTP、ASR、LLM/TTS、MQ、OSS 或生产容量/N+1 已验收。
供应商需先确认 `7089` 前缀/目标路由、From 域/主叫格式和编解码,或提供已知可达测试号码。未确认前不再次拨号。
## 历史记录
此前同一固定 EIP/线路对 `18625770806` 的探针目标 `708918625770806` 也返回 `488/Q.850 cause=88`;历史实例已按测试回收规则删除,固定 EIP 未释放。