28 lines
13 KiB
Markdown
28 lines
13 KiB
Markdown
# 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 v2,15分钟单次 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 集成和授权逐项验收。
|