release capacity after verified pre-answer channel termination

This commit is contained in:
2026-10-05 17:10:43 +08:00
parent 04e8383e2c
commit 65cef9ee30
6 changed files with 146 additions and 8 deletions
@@ -62,3 +62,11 @@
| `call-8bad49c7-5394-4576-b94f-baa9605ac20d` | 百应 / `1047` | INVITE→供应商 SIP 480→ACK;3 包、抓包退出 0;没有最终结果 | `8cbf1d04dc8dd2bcf47184ea95d3c9e1bfbf7da6d6b8cb274b613c729bcbf750` | `57e2ae884a5fb4a3beb38e51a5b89ed47a836ab8a486a23bcf4d99db2bd4a945` |
**截至 2026-10-05 13:58 CST,矩阵仍缺一格:数企 / `4745`。** 它此前只经历 ARI 400 或任务过期,未发出真实 SIP;但当日该线路/号码的保守尝试登记已达到 **3/3**,不能清零计数或绕开门禁补测。其余五格均有真实 INVITE 和供应商 480,均未接通。新中鼎与百应事件仍为 `dispatched` 未知占用,两格再次用满额度 2/2;Agent 原有 7 条 `unknown` 日记保持原样,最终结果 outbox 仍为 0。四项服务 active、Asterisk 0 活动通话、抓包凭证 0。没有得到对**新事件**的人工释放授权,当前不再外呼。禁止自动等到次日拨号;剩余格须在新的有效窗口由使用者明确安排,并先按规则处理未知占用。六格未全部实测,**不作六格总判定**。
## 17:10 CST 不拨号定位:额度为何再次占满
最近两条 `call-644430bc-862a-47d7-9d50-cda36edc947a`、`call-8bad49c7-5394-4576-b94f-baa9605ac20d` 的 Agent 日志均在原生 ARI `answer_wait` 阶段报 HTTP 404;两份原始抓包分别显示真实 INVITE→480→ACK。只读向同一台 Asterisk 查询两条事件对应的通道均得 **HTTP 404**;当时活动通话为 0。这能证明当前无对应活动通道,但旧 Agent 未将结束事实写入可恢复日记,也未发送 `ReportEnded`,Dispatcher 不得凭后台单次查看自动清除历史未知占用。两次真实尝试各占一个 `dispatched` 名额,达到容量上限 2/2;“未知”是**无可核实的终结报告**,不是已确认仍在通话。
代码根因是原生通道在进入 Stasis 前结束时,拨号器只返回 `answer_wait` 错误,清理时 ARI Hangup 又可能得到 404;上层一律将该错误视作不确定,既不记录无录音的真实失败,也不提交 Agent 终结报告。新代码按使用者选择,只对**已经成功收到 ARI originate 响应且尚未接通**的同一通道,在清理之后再次查询、明确获得 Asterisk `GET channel` 的 404 时,记真实的未接通失败、写 Agent 恢复日记并报告 Dispatcher,随后由既有确认流程释放容量;查询失败或通道仍存在则保留占用,不通过定时过期或 SIP 480 本身释放。日志增加确认标志,不写密钥或音频。隔离测试同时覆盖查询返回 404、仍存在、查询失败、报告成功与无法证明时不报告;未进行任何新的拨号。
本机 `go vet ./...`、`go test -race ./...`(19 个通过的包)、`go build ./...`、业务覆盖率 69.1%、当前合同 35 项与 Proto 7 项来源哈希通过。`make check` 因本机缺少 `buf` 在 Proto lint 前中止;**不能声称完整门禁通过**。此处代码尚未部署到非生产主机,**不会追认或自动核销上述两条历史未知事件**。现存未知占用仍需针对事件逐条明确授权、备份和核查后人工处理;不得以新逻辑冒充过去的终结回执。