Files
go-sip/docs/evidence/f03-local-task-runtime-v0.1.md

3.3 KiB
Raw Permalink Blame History

F03 本地任务队列、发现与控制证据

范围与结论

F03 在单 Dispatcher、单 Agent、单 Cell、单租户的本地隔离环境通过。SaaS/management、真实云主机、供应商、SIP 拨号、生产部署与切换均未连接或验证;项目内 Mock 结果不代表外部兼容或生产验收。contracts/upstream/v1/ 仍是外部运行基线。

实现事实

  • Dispatcher 使用 MQ v3 运行时。任务队列和控制队列由 SaaS 预建;Dispatcher 只被动验证/消费和停止消费,不声明、绑定或删除这些队列。RabbitMQ 集成测试将 provisioner 与 Dispatcher 分成两个身份;Dispatcher 的 configure 权限正则为 ^$,直接 QueueDeclare 被拒绝,而被动连接、消费、排空和结果发布通过。CLI 不再提供 --tenant-key/--consume 自建租户队列路径,旧 tenant-queue consumer 与旧 per-call control worker 已移除。
  • 任务发现读取完整分页结果;不透明游标/页 token 校验连续性,完整发现窗口及任务归属在同一事务持久化后才推进水位。无游标时取完整快照,客户端检测到游标/页状态失效时走完整快照恢复。
  • 启动和轮询仅在任务归属、running 状态、有效配置快照均满足时订阅相同的 SaaS 预建任务队列。pause 先持久关闭接纳并停止消费者,保留积压;resume 重新读取权威 running 状态后恢复消费原队列;stop 先持久终态屏障并停止消费者,再读取权威 stopped 状态。
  • stop 将权威状态/版本先持久化但不写回执,随后被动排空并 ACK 未接纳积压,最后才事务写入 control receipt/outbox。排空失败时无回执,重复控制可继续排空并在成功后写入原任务结果,不产生未接纳命令回执或拨号。

验证记录

./scripts/acceptance-local.sh 通过。该入口检查格式、契约哈希与 Schema 正反例、go mod verify、go test -race ./... -count=1、go vet ./...、构建,并运行本地 RabbitMQ 集成测试。

  • 本地契约:4 个 Schema 有效;正例数量为 config-read 17、task-discovery 13、command-next 6、call-result 4;四类负例均拒绝;19 个 manifest 文件 SHA-256 校验通过。
  • 覆盖率:go test ./internal/configread ./internal/dispatcher ./internal/store -cover -count=1 分别为 76.8%、66.2%、65.3%。带本地 RabbitMQ 的 -race -cover -tags=integration 测试中,internal/dispatcher 为 66.4%,internal/mq 为 55.5%。项目 F09 的完整覆盖率门禁仍待 F09 统一验收,不在此处冒称已通过。
  • RabbitMQ 使用本机已缓存的 rabbitmq:4.1-management-alpine 镜像和临时 loopback 容器;集成 fixture 由独立 Mock SaaS 身份预建并清理队列。无 configure 权限的 Dispatcher 身份不能声明队列,但 V3 MQ 与 Dispatcher 端到端测试均通过。脚本在镜像未缓存时 fail-closed,不隐式拉取镜像。
  • 控制测试覆盖暂停保留积压、权威状态后恢复、已停止任务不能恢复、停止排空前不写回执、排空失败后重试,以及无归属任务的拒绝回执。发现/运行时测试覆盖完整快照/游标持久化、队列接纳资格和运行时缺配置失败关闭。

本证据只证明本地项目内契约与隔离 Mock。未访问真实 SaaS/management、外部 MQ、云、供应商或 SIP 线路;未发起真实呼叫、上传或切换。