3.4 KiB
3.4 KiB
MQ 控制恢复:本地增量证据
本记录不关闭 W 项、不代表外部供应商或生产验收。总体目标仍为 3/6。
已验证
- Dispatcher 在最后执行准入前保存 Agent 身份及完整执行绑定;控制屏障与执行请求按顺序处理。
- 控制目标、原请求和中间回执持久保存;仅收到 Agent 的 APPLIED 和预期的新 revision 后,事务保存最终回执及 outbox。未知结果不转为 applied。
- 常驻 Dispatcher 已接入控制处理循环;身份/租约失效时退出,退出等待循环结束后才关闭连接。
- 本地 gRPC Mock 注入“已应用但回复丢失”,恢复原控制操作、原结果,不再次执行任务。测试:
TestLocalContractBackedFlowEvidence。 TestLocalMQActiveControlReplyRecovery实际经过本地 RabbitMQ 入站、控制 worker、gRPC Agent 和最终持久消息出站;注入已应用回复丢失及 Dispatcher SQLite 重开,重复原控制仍取得原最终回执,任务只有一个且 revision 只增加一次。- 已占额度但尚未分配 Agent 的任务可在同一事务内完成本地控制并释放额度,不再留下永远等待远端回复的目标。已有分配或未知执行仍保留远端确认要求,不因此释放不明占用。
- Agent 使用部署 StatePath 旁的
.executions文件保存控制回执和执行绑定。写入使用临时文件、文件同步、重命名及目录同步;会话文件复用同一写入方法。 - 重启后未终结执行恢复为 unknown,不恢复原许可,不因进程重启清除未知占用。新 boot、新授权会话可取得同一控制操作的原回执;请求追踪与会话字段不改变业务幂等身份,业务正文变化仍拒绝。
- 损坏、版本不支持、与现有会话文件不配套的缺失执行日志,以及持久化失败,均明确失败。持久化失败后不能以进程内缓存返回成功。
- 文件不保存会话凭据、许可令牌、上传签名 URL、录音或完整对话。
- 控制必须明确选择 drain/hangup。stop+drain 只关闭新准入,不把进行中通话改成已结束,也不能随后 resume;Mock pause+hangup/stop+hangup 模拟结束通话。非 Mock 未接媒体挂断适配器时明确拒绝 hangup,不伪造完成。测试:
TestStopDrainPreservesCallAndCannotResume、TestControlPolicyDoesNotInventMediaCompletion。
测试:TestControlReceiptSurvivesRestartAndNewSession、TestCorruptExecutionJournalPreventsActivation、TestExecutionJournalFailureCannotReplayMemoryAsSuccess、TestMissingExecutionJournalWithExistingSessionFailsClosed,以及 Store 控制回执事务测试。
最近验证:RPC/Dispatcher/Store/CLI 的 race 测试、全仓 vet、构建和 git diff --check 通过。运行日志 /tmp/go-sip-execution-journal-race.log、/tmp/go-sip-mq-control-combined-race.log;最近构建输出 /tmp/go-sip-mq-control-check。这不是最终全仓验收或覆盖率达标证明。
尚未完成
- 非 Mock hangup 的媒体适配及与实际媒体状态的一致性;当前明确拒绝此路径,不能把 Mock 控制回执当成 Asterisk 通话状态证明。
- MQ AI 配置/实时授权、常驻调度到执行的完整运行接线与本地 MQ 双向验收。
- 重启、乱序、控制与执行竞争的完整故障矩阵;未知通话仍需实际状态核对,不自动释放或重拨。
- 全仓最终测试、至少 65% 覆盖率、统一部署诊断及当前计划/文档全面一致性。