Files
go-sip/docs/evidence/f09-local-acceptance-v0.3.md
T

28 lines
5.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.
# F09 P1 本地 Mock 验收:任务发现 v0.3
仅验收单节点、单 Dispatcher、单 Agent、单 Cell、单租户的隔离 Mock。任务发现采用项目内拟定 `docs/thirds/v0.3.md`,其余 SaaS 项目内业务协议仍为 v0.1;`contracts/upstream/v1/` 未修改。下述结果不是 SaaS/management 或生产验收。
## 适用矩阵
| 场景 | 本地事实与测试 |
| --- | --- |
| 同一合同及分页 | 首次与后续均读取 `tasks[]`,`after` 是规范十进制事件游标;首次多页、空页保持游标、同任务后续更新、`removed` 墓碑均通过。响应不含逐项 `event_id`;请求中的 `page_token`、旧 `changes`/410 路径不运行,也无 HTTP→MQ 回退。见 `internal/configread/discovery_v03_test.go`、`internal/dispatcher/task_runtime_v03_test.go`。 |
| 并发翻页、页中断与重启 | Mock 在翻页时加入同任务更新事件,D 追至最终空页并应用较新状态;第二页 HTTP 失败时仅持久保存首个成功页,关新准入;关闭并重新打开 SQLite 后从已提交的游标续读,不从零重建,也不跳过页。见 `internal/dispatcher/task_runtime_v03_recovery_test.go`、`task_runtime_v03_test.go`。 |
| 故障与事务 | 非规范/倒退游标、异常响应及 HTTP 410 均报错,不伪造空页;发现服务中断时停止旧任务消费者但保留 MQ 控制。SQLite 触发器模拟分配写失败后,任务、游标和响应证据全部回滚;未物理填满磁盘。v0.2 checkpoint 无法直接当事件 ID 使用,阻断静默切换。见 `internal/configread/discovery_v03_test.go`、`internal/store/local_v03_discovery_test.go`、`local_v03_failure_test.go`、`internal/dispatcher/task_runtime_v3_test.go`。 |
| 控制与重复投递 | 发现页先将任务从 `running` 改为 `paused`,后续更新为 `running`:SaaS 状态与游标已推进,但已持久的暂停不自动重开原队列;只有 MQ `resume` 读取单任务并确认新鲜 `running` 后准入与原队列才恢复。MQ pause/stop 及 removed 墓碑不因发现页运行状态而解除;pause 保留积压、stop 对未接纳命令静默 ACK,在途终结仍出最终结果。重复执行恢复原回执,持久一次性拨号决定不产生第二次呼叫。见 `internal/store/local_v03_discovery_test.go` 的 `TestEventPageRunningAfterDiscoveryPauseWaitsForMQResume`、`internal/dispatcher/task_discovery_resume_test.go` 的 `TestTaskDiscoveryRunningAfterPauseRequiresMQResumeToRestartQueue`、`TestEventRuntimeHTTPPausedToRunningNeedsMQResume`,以及 `internal/store/local_v03_failure_test.go`、`execute_business_duplicate_test.go`、`local_origination_test.go`、`internal/dispatcher/task_control_v3_test.go`、`task_queue_v3_stop_active_test.go`。 |
| SaaS 建队与 MQ/最终结果 | 受限 Dispatcher RabbitMQ 用户的 `configure` 权限为空,只消费 SaaS Mock 预建任务/控制队列;队列缺失或满、确认丢失与重投不冒充已接纳。HTTP→SQLite→MQ→Mock 最终结果与 outbox 恢复集成通过。见 `internal/mq/amqp_v3_integration_test.go`、`amqp_v3_queue_full_integration_test.go`、`internal/dispatcher/local_v01_integration_test.go`。 |
| 既有门禁 | 号码白名单、时段、配额、超时、录音结果与最后拨号判断继续使用 F04/F08 本地测试;V3 mixed/real 入口在资源连接前拒绝,Mock 不发真实呼叫。 |
## 执行记录与覆盖率
- `./scripts/acceptance-local.sh`:通过。依次核对 gofmt、Proto/本地 Schema 正反例和 SHA-256 清单、`go mod verify`、`go test -race ./... -count=1`、`go vet ./...`、构建及受限 RabbitMQ 集成测试。首次执行发现一个旧集成夹具仍使用 v0.2 全量响应;改为 v0.3 `after=0` → `after=1` 并在载入任务配置前追平后复测通过。
- `scripts/check-contracts.sh`:v0.3 正例 8、反例 2、清单文件 13 均通过;旧 v0.2 清单仅作为历史,不参与运行。`docs/contracts/local-contract-manifest-v0.3.json` SHA-256 为 `f32b114b998883901baddd7c4e0225a2643bf5ab68ce54ace5dfa12c543eea93`;`docs/thirds/v0.3.md` SHA-256 为 `9a22e9ab5da7d859b5fde4b77cb50ddc148e39567704609d633b91a529af564d`。
- `go test -cover -count=1`:P1 业务包 `agent` 71.1%、`callwindow` 84.4%、`configread` 75.2%、`contract` 74.0%、`dispatcher` 70.5%、`rpc` 69.9%、`store` 67.4%、`tenant` 85.4%;RabbitMQ integration 下 `mq` 66.4%、`dispatcher` 70.6%。本轮 P1 业务包均 ≥65%。`cmd/sip-go-agent` 30.0%、历史 `internal/callruntime` 61.7% 单列技术债,不冒称全仓库达标;`mq` 未带 integration tag 的结果不用于验收。
- 工具链为 Go 1.27.1;RabbitMQ 本地镜像 `rabbitmq:4.1-management-alpine`,受限账号无 `configure` 权限。`git diff --check` 通过;本地功能只提交到开发分支,未合并或推送 `main`,不把 Mock 产物宣称为生产制品。
## 未通过的外部门禁
逐项无 `event_id` 是已确认的项目内响应形态:D 只能核验响应级游标进退,**不能独立证明 SaaS 页内顺序和没有漏项**。外部 SaaS 必须签收完整有序返回和无过期游标;长期保留撤销墓碑所需容量及灾备连续性仍未签收。v0.2 已运行状态不得按 v0.3 游标自动解释,也不删旧任务、执行/幂等/outbox;真实切换须另获受控回迁方案和授权。
真实 SaaS/management、OSS/SIP/云部署、拨号、第二节点/Cell/租户、容量与生产切换均未验证或未授权;本地通过不解除 F06 真实模式阻断。