Files
go-sip/docs/evidence/20260921-mq-upload-progress.md
T

38 lines
4.4 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.
# MQ 上传调整:本地阶段证据
本记录仅覆盖本地代码和隔离测试,不代表完整目标通过,不代表真实 OSS、供应商或生产验收。
## 已实现
- Dispatcher 使用已绑定身份,持久保存 `recording.uploaded` 上传事实和原通知。上传完成只在 outbox 发布成功后记录;R13 在通知尚未交付时返回 Unavailable,可重试原事实通知。
- 上传路径不再执行对象 HEAD、不等待 SaaS、不生成 OSS ID,也不发送 `recording.ready`。内部完成响应的旧 `oss_id` 字段已移除并保留字段编号;旧不可变外部契约包未因此修改。
- Agent 在 PUT 前独占并持久记录上传尝试。失败或结果未知不会自动再次 PUT;成功结果和原 binding/asset 保存到文件,Agent 启动恢复仅发送通知,不申请 TOKEN、不读取或发送录音。
- TOKEN 固定 15 分钟,非法文件大小明确拒绝;普通 HTTP transport 错误不再携带外层签名 URL。签名 URL 不是 OSS 原生一次性凭据。
- 授权按 upload_id/operation_id/请求摘要持久绑定;重放旧操作只返回原授权,即使它已经过期。`agent upload-retry` 要求调用方显式提供新的 UUID v4 请求ID;各次请求分别持久占用,不能复用旧请求执行另一轮PUT。
- 原始上传及通知恢复、显式再申请共用跨进程文件锁。源文件变化时按实际发送字节核验大小/SHA-256,不能把预读摘要当作实际上传事实。
- 授权时的bucket/object_key持久绑定。后续配置更换bucket不能改写原上传通知的位置,也不能把原上传身份重新授权到另一个bucket。
- OSS参数仅来自严格JSON文件及其明确引用的凭据环境变量;旧OSS环境配置、HEAD核验和OSS ID生成辅助路径已移除。部署样例及systemd入口使用必需的JSON配置。
- MQ 发送保留原 `event_id`/`message_id` 到 AMQP `MessageId`。使用 persistent 消息、durable 队列及精确绑定、mandatory 和 publisher confirm。
- outbox 每次仅领取即将发送的一条消息。原批量领取方式在第一条发送失败时,会使余下消息滞留 dispatching,现有回归测试证明无需重启即可恢复整批;恢复状态写入错误不再被吞掉。
- MQ 独占身份连接断开会停止共享准入上下文,新 Dispatcher RPC 被拒绝;不能由此推断 Agent 已有许可全部撤销。
## 已执行检查
- Go 1.27.1。
- 修改相关包的 race 测试,以及全仓 vet、格式和 diff 检查通过;这些不是最终全仓覆盖率验收。
- `TestRecordingNotificationRecoveryDoesNotPUTAgain`:本地 TLS 测试端,重启文件状态后一次 PUT、一次授权请求、两次事实通知,保留源文件。
- `TestLocalUploadNoticeSurvivesUnroutableAndRestart`:独立本地 RabbitMQ vhost,无绑定返回失败;SQLite 重启后保留原通知;恢复绑定后入队。
- 同一测试注入“RabbitMQ 实际发布成功,但应用丢失发布结果”:交付未被提前标记完成,再次发送保留原 MessageId 和正文。队列收到两份同身份持久消息,符合至少一次交付;未新建资产或触发 PUT。这是应用边界故障注入,不冒称网络层 confirm 抓包实测。
- 上传完成判定发生在读取队列前,不需要 SaaS 消费者或业务处理回复。
- 本地 D1/D2 隔离、查询/补传与上传分别使用隔离测试队列环境;相关 RPC、MQ、Dispatcher race 测试通过。
- 本地MQ专项race日志:`/tmp/go-sip-local-acceptance.cpYTru/test.log`,退出码0,覆盖store/RPC/MQ/Dispatcher/CLI;Agent/OSS race检查另见 `/tmp/go-sip-upload-race-latest.log`。
- 新增授权旧请求不续期、显式新请求一次PUT、跨Spool互斥、实际上传字节变化拒绝、原bucket跨配置变更保留等测试。旧路径清理后相关普通回归通过:`/tmp/go-sip-oss-cleanup-tests.log`。
- `deploys/config/dispatcher.json.example` 已通过当前严格Schema验证。
## 未关闭事项
- 执行、控制、AI 配置/授权的完整 v2 MQ 运行链路及持久恢复尚未全部完成。
- 旧运行文档和部分非上传事件仍待统一;不得以本记录关闭整个 W 任务。
- 最终全仓 race、构建、至少 65% 覆盖率、契约和统一部署诊断验收尚未完成。最新全仓普通测试覆盖率 39.9%(未启用本地 MQ 集成环境),仍低于 65%;不能用局部测试通过代替。
- 未执行任何真实 OSS、云资源、付费供应商或外呼验证。