Files
go-sip/docs/evidence/20260918-acceptance-matrix.md
T

28 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-09-18 本地开发与验收矩阵(更新 2026-09-19
范围:`go-sip` 子项目本地工程检查及本轮真实云控制面/主机 smoke。该矩阵不是生产签收;本轮创建并加固了一台测试 ECS,从固定 EIP 对三条登记 SIP endpoint 做了 OPTIONS 200 reachability probe,并按用户选择各发送一条真实 INVITE,后续又在用户即时确认后对 provider-second 做了一次临时抓包的 direct-PJSIP 探针;没有形成 `200 OK` 已接通电话、RTP/录音或可确认的供应商拨号消费,且没有把外部系统凭据写入项目。
> **范围修订(2026-09-20)**:本历史矩阵的双节点/第二 Cell/生产联调门禁已被 `docs/evidence/20260920-scope-amendment.md` supersede。本阶段按单节点、单 Cell、单租户和契约/fixture/隔离环境签收;真实 ECS、真实供应商、生产 SaaS/MQ receipt、双节点/第二 Cell/双租户和生产切换均延期第二阶段。历史数据仍按事实保留,不代表当前门禁。
| 门禁 | 本地结果 | 证据/未决项 |
| --- | --- | --- |
| G0 / W01 契约发布 | **本地通过 / 外部阻塞** | 项目内 `contracts/upstream/2026-09-18-p1-baseline` 已完成严格事件/双模式 AI/授权/OSS/静态制品/profile Schema、正反例与哈希;明确继承 dirty source 且非外部权威,真实预算/授权仍未签收。 |
| W02 Unary Proto/会话 | **本地通过 / 集成待验证** | `agent.v1.AgentControlService` Proto、生成 stubs、`proto/ERRORS.md`、Buf manifest 和生成/handler 测试通过;Dispatcher/Agent部署级运行会话仍需联测。 |
| W03-a 工具链/依赖 | **本地通过** | `go.mod` Go 1.27.1、Cobra 双子命令、`go mod verify`、依赖许可证清单和 `govulncheck@v1.7.0` 无漏洞扫描;ARI/LLM/ASR/TTS 隔离 API/协议 Mock PoC 已记录,正式锁版和真实供应商仍未验收。 |
| W03-c SQLite/MQ PoC | **本地通过 / 外部未验收** | inbox、幂等、outbox、publisher-confirm 边界、租户队列/版本化 exchange、lease、配额和控制 CAS 有 race 单测;`make mq-integration-local` 以 disposable RabbitMQ 4.1.8 验证 adapter confirm/ACK/permanent reject→DLQ/consumer cancellation,并验证 Dispatcher tenant consume→SQLite inbox/task/outbox→event publish;当前候选二进制另在 owner-authorized ECS 通过隔离 RabbitMQ 完成 `routed=true``inbox=1/task=1/outbox=1`,再由候选 Dispatcher flush 为 `task_status=accepted/outbox_status=published`(证据:`docs/evidence/20260918-rabbitmq-integration.md`);SaaS 侧使用版本化 contract/fixture Mock,边界记录在 `docs/evidence/20260919-local-saas-contract-mock.md`;没有批准 broker 版本/ACL/崩溃注入/SaaS application receipt。 |
| W03-e AI Schema PoC | **本地通过 / 供应商未验收** | W01 项目内 Schema 通过 full-AI/ASR-only 正负例、不可变摘要和模式匹配;真实供应商参数/能力/凭据仍未验收。 |
| W05 Dispatcher | **本地部分通过** | SQLite 任务/配额/控制/replay/outbox 及内部 HTTP handler 有本地测试,且覆盖 SQLite 文件 close/reopen 后 dispatching outbox 恢复为 retry,以及 `TestOutboxProcessCrashRecovery` 覆盖测试子进程在 durable claim 后退出、父进程恢复并重新发布(证据:`docs/evidence/20260918-w05-restart.md`);contract-backed local flow 串联命令/配额/Agent 执行/event 校验;`ExecuteReserved` 将已持有 reservation 与 Agent permit/Execute 联通,并以事务方式区分提交前回队列与未知占用;RabbitMQ adapter 默认 prefetch=1、per-tenant DLQ、publisher confirm 和 manual ACK/NACK,以及 Dispatcher tenant consume→SQLite inbox/task/outbox→event publish,已通过 disposable RabbitMQ 4.1.8 集成;当前候选 ECS `--consume` 自动 flush 回执也已通过,`task_status=accepted``outbox_status=published`,临时 SaaS-events queue 收到 `agent-call.command.result`(证据:`docs/evidence/20260918-rabbitmq-integration.md`)。批准 broker/ACL、真实进程/commit 故障、SaaS application receipt 或跨 Cell 真实验证仍未完成。 |
| W06 Agent | **本地部分通过 / 云端 loopback mTLS smoke 通过** | 文件 state/transcript/assets、原子封口、损坏隔离、boot→unknown、TLS1.3 mTLS config、静态 Cell 制品启动路径/激活校验、gopsutil 主机/进程资源采样(媒体/AI维度显式 unknown)、Unary R01 pre-activation probe/R02 activation/session/fencing/CAS/permit/fact/upload boundary handlers 和 CLI listener 已通过本地测试,包含旧 client CA 被替换后拒绝的本地 trust-root rotation 单测;W06 定向本地证据见 `docs/evidence/20260918-w06-w12-local.md`;已部署 release 在 owner-authorized Debian ECS loopback listener 完成 `ActivateAgent` + `GetAgentStatus`,并拒绝无客户端证书和 rogue-CA 证书;项目 `internal/rpc.DialFromFiles` + `dispatcher.AgentCoordinator`、当前工作树实际 `dispatcher` Cobra endpoint-inventory startup、同一主机两 loopback Agent/Cell session smoke、服务端错误 Agent/Cell metadata 拒绝测试、错误 inventory misbinding 的远程 `PermissionDenied`,以及重启式 CA 根替换(旧 client 拒绝、新 client 成功)、同一 Agent boot 下 Dispatcher 重启 generation 1→2、Agent-side leaf fingerprint allowlist(同 CA 未授权 client 拒绝)均通过(`docs/evidence/20260918-w06-mtls-cloud.md`);仍未完成物理两 Cell/跨主机、fleet-wide endpoint-role rotation/revocation distribution 和真实健康采样。
| W08 Permit/Execute | **隔离 mock mTLS 通过 / 生产阻塞** | 当前工作树项目 `internal/rpc.DialFromFiles` + `dispatcher.AgentCoordinator.ExecuteRaw` 已在 owner-authorized ECS mock Agent 上完成 R01/R02、执行许可、Execute 和 accepted receipt;同一工作树 `Dispatcher.ExecuteReserved` 通过 SQLite quota/command/reservation 串联 mTLS Agent,结果为 accepted receipt、task_status=running`docs/evidence/20260918-w06-mtls-cloud.md`);没有跨 Cell 最后发起屏障、Agent/Asterisk 业务路径的 SIP originate、真实 MQ application receipt 或故障注入验收;三条直连 SIPp INVITE 仅是独立线路诊断。 |
| W07/W10 双 AI | **本地 Mock/授权/SDK API PoC 通过 / 真实参数门禁阻塞** | W01 双模式 Schema、不可变摘要、Agent RPC 对 permit/Execute 的授权绑定校验、bounded/cancellable ASR-only/full-AI mock pipeline 和阶段调用测试通过;隔离 `openai-go/v3.62.0` streaming 参数/禁重试、`dashscopego/v0.1.2` Paraformer surface、`doubao-speech-go` ASR/TTS surface 均编译通过;Volcengine TTS 当前缺 speed/volume/pitch 可达性,DashScope endpoint injection/两家真实供应商的取消/背压/能力验收仍未完成,禁止复用旧 LLM/TTS。 |
| W09 SIP/ARI/RTP | **隔离 Asterisk/ARI runtime PoC 通过 / 业务媒体与真实阻塞** | 已锁定并引入 Pion RTP `v1.10.5``internal/media` 只做 bounded policy adapter,库解析和 payload/SSRC/包长边界测试通过;新增 `TestPacketGuardPreservesPCMAPayloadByteForByte` 通过 160-byte PT=8 fixture 的精确 payload/header 保真;`internal/contract.ValidateStaticArtifact` 覆盖 Schema、Cell/source/digest/revision、egress allowlist、必需 trunk 和重复 trunk 拒绝;临时 module `ari/v5.3.1` 已在固定 Asterisk `22.10.1` 隔离容器运行:内部 Stasis channel、mixing bridge、RTP/UDP PCMA ExternalMedia、`UNICASTRTP_LOCAL_ADDRESS/PORT``StasisEnd` 均通过;双 ExternalMedia 合成 RTP 经过 bridge 转发并验证 RTP v2/PT=8(证据:`docs/evidence/20260918-w09-ari-runtime.md`)。隔离 SIPp-to-PJSIP/ARI signaling 已通过(证据:`docs/evidence/20260918-w09-sip-ari.md`);进一步的 PJSIP/PJSUA2 mock leg 已通过真实 SIP RTP 双向 PCMA、U1/U2/U3 播放、端点 WAV 封口和 ARI 清理(证据:`docs/evidence/20260918-w09-sip-rtp-ari.md`)。另在 owner-authorized Debian ECS 通过现有 SIPp image 从固定 EIP 对 `61.132.228.221:5060``60.171.24.90:5060``160.202.254.79:5060` 各发一条 OPTIONS,均收到 `SIP/2.0 200 OK`(证据:`docs/evidence/20260918-ecs-sip-deployment.md`);这不证明 provider authorization、registration、caller-ID/dial-prefix 或真实媒体。另在 owner-authorized ECS 按用户选择对三条登记线路各发一条真实 INVITE:数企 `480 Temporarily Unavailable`、中鼎 `404 Not Found`、百应含 PCMA SDP 的 `183 Session Progress` 后无 `200 OK`,均未形成已接通对话(证据:`docs/evidence/20260918-real-sip-provider-calls.md``docs/evidence/20260919-real-sip-provider-calls-retry.md`)。后续允许窗口重试仍无最终 `200 OK`2026-09-19 新 ECS 对两个白名单目标直连真实供应商,数企/百应仍无最终 `200`,中鼎第二目标一次信令达到 `200`,但 media probe 未干净完成,未验收 RTP/录音;用户即时确认后又对 provider-second 做了 1 次真实 direct-PJSIP 外呼,临时 PCAP 观察 8 个 SIP 包、0 个媒体包和 `100/200/404` token,原始 PCAP 已删除且未自动重试;证据:`docs/evidence/20260919-real-provider-ecs-direct.md`。这仍未证明供应商真实媒体、端到端生产 PCMA sample preservation、录音 retention/OSS handoff、重连、Agent 集成,`docs/evidence/20260919-sip-routing-implementation-comparison.md` 进一步记录父目录线路配置与 Go Agent 的注册/认证、From/PAI、前缀和选路边界;ARI 也未锁入生产 module。 |
| W11 OSS/录音 | **Alibaba OSS 本地/ECS通过 / 生产闭环阻塞** | W01 OSS control-plane Schema、受限 HTTPS grant 的 host/size/checksum/expiry/object-key/redirect 校验、Agent 直接 PUT client 和 upload metadata RPC handlers 通过;Dispatcher 使用 Alibaba 官方 OSS Go SDK v215分钟单次 grant,显式重新申请,源资产保留;本地及新 ECS mTLS gRPC→OSS 内网 endpoint 已完成 PUT/HEAD、SQLite completion、`recording.ready` outbox 和幂等验证(证据:`docs/evidence/20260920-local-oss-mq-integration.md``docs/evidence/20260920-new-ecs-preflight.md`);没有生产 SaaS application receipt、生产 broker ACL/TLS 和真实 provider-third 新录音闭环。 |
| W12 事件/观测/故障 | **本地资源样本/事件部分通过** | command.result outbox/replay、8 种 strict event Schema/fixtures、`transcript.updated` archive/realtime builder、gopsutil 资源样本 freshness/unknown、contract-backed local flow、状态和本地检查有证据;新增 `internal/calllog` 的 HMAC `phone_ref`、掩码手机号和 allow-list JSONL 业务日志,覆盖执行/呼叫状态/终态/attempt/录音事实,验证原始号码不落盘,证据见 `docs/evidence/20260919-phone-call-business-log.md`W12 定向 replay/outbox/no-originate-retry 证据见 `docs/evidence/20260918-w06-w12-local.md`;最新 race/vet/module/契约/Proto 回归通过;指标、应用收讫、整体补传和故障注入未闭合。
| W13-a 本地构建 | **本地通过 / 生产候选未冻结** | `make acceptance-local`:契约哈希、`go mod verify``go test -race ./...``go vet ./...``go build`、mock smoke 和 real-mode fail-closed 均通过;`make release` 生成带源脏状态、模块/二进制 SHA-256、Go版本和无凭据声明的本地 manifest;该 release 已复制到 ECS hash-named releases 目录并按 manifest 校验 binary/go.mod/go.sum,仍明确 `production_approval=false`;新增物理 Debian 13 systemd 上传包 `0.1.0-p1.20260919``deploys/install.sh` 在 owner-authorized ECS 完成 checksum/OS/权限和 `systemd-analyze verify` smoke,详见 `docs/evidence/20260919-physical-systemd-deployment.md`。 |
| W13-b/P1 两 Cell | **物理单机安装 smoke / 两 Cell 真实阻塞** | 已有两套隔离 mock Cell 的 Agent session/permit/execute 测试;一台 Debian ECS 已创建、加固并完成当前候选二进制 Agent/Dispatcher mock 启动、隔离 RabbitMQ tenant consume→SQLite→outbox flush、Asterisk mock、三条 SIP endpoint OPTIONS 200 smoke,以及三条线路真实 INVITE 的非接通结果及后续允许窗口重试,证据:`docs/evidence/20260918-ecs-sip-deployment.md``docs/evidence/20260918-rabbitmq-integration.md``docs/evidence/20260918-real-sip-provider-calls.md``docs/evidence/20260919-real-sip-provider-calls-retry.md``docs/evidence/20260918-cloud-host-bootstrap.md`。仍没有物理两 Agent/两 Asterisk/三供应商真实媒体/真实双 AI/录音验收、生产镜像 digest、容量或 N+1 证据;初始账户失败保留在 `docs/evidence/20260918-aliyun-provisioning-blocker.md`。 |
| W14/W15/W16 | **阻塞/延期** | 真实 P1、旧新切换、第二租户公平/真实 broker 背压/DLQ 未执行;本地 round-robin 加 SQLite scheduler_state 文件重开恢复、prefetch=1/DLQ 拓扑代码不等于 P2 通过。单主机 smoke 不等于 W14;当前仍缺 Asterisk/ARI/SIP/AI/OSS/MQ 真实链路和两 Cell。 |
## 结论
本轮可以签收的是本地 M/PoC、真实云盘点及可重复检查入口,不可以签收 G0、W04、真实依赖、P1、切换或生产容量。解除顺序:项目内 W01 → W02 已完成;仍须完成 W03 正式 PoC/依赖门禁 → W04,再按 W05–W13 集成和授权逐项验收。