Files
go-sip/docs/evidence/20260922-mq-only-local-final.md

5.8 KiB
Raw Permalink Blame History

MQ-only 本地最终回归证据

本记录只证明当前独立项目的单节点、单 Dispatcher、单 Agent、单 Cell、单租户本地/隔离范围;不代表真实 SaaS、真实供应商、云主机、生产 broker 或生产切换通过。

代码与契约

  • Gogo version 已核验为 Go 1.27.1 linux/amd64。
  • ./scripts/check-contracts.sh:通过,旧不可变契约包哈希未改。
  • ./scripts/check-proto.sh:通过,buf lint/build/generate、生成包测试和 proto/manifest.json(含 reserved oss_id 变更)通过。
  • go mod verify:通过。
  • git diff --check:通过。
  • make check:通过,日志 /tmp/go-sip-make-check-final-6.log。该入口包含格式化、Proto检查、本地 acceptance 和 scripts/mq-only-acceptance-local.sh;脚本为缺失地址提供 loopback 默认值,Broker 不可用时失败而不跳过,real 模式清除 broker URL 后仍 fail-closed。专项日志 /tmp/go-sip-mq-only-acceptance.log

MQ 流程

使用 loopback RabbitMQ 127.0.0.1:33252 的隔离 vhost/队列,未连接 SaaS

为避免测试被环境变量静默跳过,最终专项命令显式设置了以下 loopback 地址并使用 -v -count=1;日志 /tmp/go-sip-mq-targeted-final.log 中每个目标均出现 PASS,且日志末尾确认 No targeted integration test was skipped

export GO_SIP_LOCAL_MQ_URL=amqp://guest:guest@127.0.0.1:33252/
export GO_SIP_LOCAL_QUERY_MQ_URL=amqp://guest:guest@127.0.0.1:33252/go-sip-query-tests
export GO_SIP_LOCAL_UPLOAD_MQ_URL=amqp://guest:guest@127.0.0.1:33252/go-sip-upload-tests
export RABBITMQ_URL=amqp://guest:guest@127.0.0.1:33252/go-sip-query-tests
go test -race -p 1 -v ./internal/dispatcher \
  -run 'TestLocalMQ(AIConfigurationAuthorizationRoundTrip|ActiveControlReplyRecovery|RequestRoundTrip)$' -count=1

go test -race -p 1 -v ./internal/rpc \
  -run '^TestLocalUploadNoticeSurvivesUnroutableAndRestart$' -count=1

go test -race -p 1 -v -tags integration ./internal/mq \
  -run 'TestV2LocalBrokerIdentityIsolationAndReliableRouting|TestLocalRabbitMQConfirmAckAndDeadLetter|TestV2LocalBrokerDisconnectStopsPublisher' -count=1

go test -race -p 1 -v ./internal/store \
  -run 'TestMQControlRejectsLateRevisionWithoutRegressingTask|TestMQReplayOnlyRequeuesOriginalBusinessFacts' -count=1

实际专项结果覆盖:AI配置/授权、控制丢回复与重启、command/call query/replay、上传通知不可路由/重启、D身份/租户隔离、persistent confirm/DLQ、broker断连、迟到revision及原事实补传。

  • TestLocalMQAIConfigurationAuthorizationRoundTrip:AI 配置请求/响应、内嵌授权、原关联、重复、租户/出口隔离及 SQLite 重启恢复。
  • TestLocalMQActiveControlReplyRecovery:控制消息入站、Unary Agent、已应用但回复丢失、Dispatcher SQLite 重启、原操作恢复、最终 persistent 回执;不重复执行,任务 revision 只推进一次。
  • 查询/整体补传本地往返:只恢复原事实/回执,不新建任务、不拨号。
  • TestV2LocalBrokerDisconnectStopsPublisher:底层 AMQP 连接断开后 Broker.Done 可见,发布被拒绝。
  • scripts/mq-only-acceptance-local.sh:通过,日志 /tmp/go-sip-mq-only-acceptance.log;脚本显式执行 AI、控制、query/replay、upload notice、D身份隔离、persistent confirm/DLQ、broker断连和revision测试,并拒绝 SKIP/无测试运行。go test -tags integration -race -p 1 ./internal/mq 的完整回归仍见 /tmp/go-sip-mq-buildtag-integration-5.log
  • TestMQControlRejectsLateRevisionWithoutRegressingTask:过期 revision 控制被拒绝,任务状态和 revision 不回退。
  • 上传 MQ 集成测试:无绑定、确认结果丢失、SQLite 重启和重复通知均沿原 MessageId/正文恢复,不重新 PUT 或新建资产。

上传边界

Dispatcher 配置文件是 OSS 配置唯一来源;grant 固定 15 分钟。Agent 每个显式授权尝试最多一次 PUT,失败/过期保留文件;同请求重放返回原 grant,新 UUID 请求才可显式重新申请。上传成功后保存 recording.uploaded 事实及 outbox,以 persistent、durable 队列/绑定、mandatory 无 return、publisher confirm 为交付条件。不等待 SaaS 会话、verified、OSS ID 或消费回复,不新增 VERIFYING。

质量检查与覆盖率

  • make coverage:通过,脚本 scripts/coverage.sh 对 Go 生成的 gen/ protobuf 代码单独排除后统计业务源码,结果 65.8%;原始包含生成代码的总值约 56.1%,两者均保留,未把生成代码排除后结果冒充全量值。日志 /tmp/go-sip-coverage-final.logprofile /tmp/go-sip-coverage.out,业务 profile /tmp/go-sip-coverage-business.out
  • go test -race -p 1 ./...:通过,日志 /tmp/go-sip-final-race.loggo vet ./...:通过,日志 /tmp/go-sip-final-vet.log;构建通过,/tmp/go-sip-final-build
  • Provider/CallRuntime 只使用 loopback httptest 和合成 PCM/WAV;没有付费 AI、真实外呼或真实 SaaS 请求。

未执行与边界

已按 deploys/cell/nonprod-call-evidence.sh --preflight-only 尝试诊断;当前开发主机以非root运行,入口立即以 must run as root for tcpdump and Asterisk diagnostics fail-closed(日志 /tmp/go-sip-nonprod-preflight-missing.log)。同时核验主机缺少 Asterisk、tcpdumpsystemd 为 degraded。因此没有伪造 mixed/real 抓包、真实外呼或部署诊断通过。项目的本地 mock/协议回归通过不替代该诊断,也不替代第二阶段真实供应商/SaaS/生产验收。

本目标明确要求保留工作树自有改动且不自动提交、暂存或清理;因此当前改动保持未提交/未暂存。验收依据是上述可复现命令、日志和源码检查,不是任务树声明或提交状态。最终工作树摘要另保存于 /tmp/go-sip-working-tree-final.txt