From 2468a3bfb8cf37da9d37008dd61f54dd790d8647 Mon Sep 17 00:00:00 2001 From: ila Date: Fri, 7 Aug 2026 16:37:16 +0800 Subject: [PATCH] docs: import wiki at afc651f75a3a --- T-280.-.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 T-280.-.md diff --git a/T-280.-.md b/T-280.-.md new file mode 100644 index 0000000..c9554c3 --- /dev/null +++ b/T-280.-.md @@ -0,0 +1,64 @@ + +> 同步来源:[`docs/tasks/T-280.md`](/chengma/mroubao/src/commit/afc651f75a3abc2676bb13aa8a80f6aa6a25a72e/docs/tasks/T-280.md) · commit `afc651f75a3a` + +--- +id: T-280 +title: 安全停止后确认后台取消并清理本地任务 +phase: 2 +deps: + - T-259 + - T-270 + - T-279 +status: DONE +created: 2026-08-03 +context_ref: 3cdfe7e +work_branch: null +write_paths: + - docs/tasks/T-280.md + - docs/current-state.md + - android-buyer/app/src/main/** + - android-buyer/app/src/test/** +--- + +## 问题 / 背景 + +任务 `e965c234-3a02-40eb-8911-e46e7cecb065` 的执行租约到期后,Roubao 正确进入 +`SAFE_STOPPED`。Admin 随后取消任务,后台只写入 `cancel_requested`,等待原设备确认; +但 App 的普通同步和手动同步都会在安全停止分支提前返回,既不发送后端已允许的 +`SAFE_STOPPED` 心跳,也无法读取取消请求和调用取消确认接口。本地随后又被设备心跳恢复 +成“当前领取任务”,形成后台等待设备、设备等待后台的僵持状态。 + +## 行为契约 + +1. 自动化安全停止后不得恢复拼多多操作、候选搜索、订单 dry-run 或提交订单。 +2. 用户打开 Roubao 任务页或点击同步时,App 可以发送只用于控制面同步的 + `SAFE_STOPPED` heartbeat;过期执行不得借此延长 claim 或恢复执行资格。 +3. heartbeat 返回 `cancel_requested=true` 时,App 使用原 claim/execution 和固定幂等键 + 确认取消;成功后后台任务变为 `CANCELED`,App 原子清理本地 task/execution/order 状态。 +4. 后台未请求取消时,本地继续保持 `AUTHORIZATION_EXPIRED`,不能把“同一 active task” + 的设备心跳解释为恢复自动化。 +5. 网络失败保留本地安全停止状态,后续打开任务页或同步时继续重试控制面请求。 + +## 方案 + +1. 调整 Repository 的 `allowSafetyStoppedSync` 分支:只在普通执行循环中保持原提前停止; + 显式同步允许继续调用 task heartbeat,并复用既有取消确认和本地清理逻辑。 +2. 任务页处于 `AUTHORIZATION_EXPIRED` 时,自动轮询调用显式控制面同步,不再只调用 + device heartbeat 的领取关系恢复。 +3. 增加回归测试,证明过期安全停止状态会发送 `SAFE_STOPPED` heartbeat、确认取消、 + 清空本地状态,且不会触发任何拼多多 driver。 + +## 验收要点 + +- [x] Admin 取消过期任务后,打开 Roubao 最迟一个轮询周期内清理任务卡片。 +- [x] 后台任务从 `WAITING_CONFIRMATION + cancel_requested` 变为 `CANCELED`。 +- [x] 取消确认过程不恢复授权、不打开拼多多、不产生订单提交。 +- [x] Android Debug/Release 单测、lint 和构建通过。 + +## 执行记录 + +- 2026-08-03:根据过期任务无法确认 Admin 取消的问题创建任务,状态 `TODO`。 +- 2026-08-03:显式同步允许安全停止 execution 发送 `SAFE_STOPPED` heartbeat;任务页 + 恢复和十秒轮询改为控制面同步,复用既有取消确认与本地原子清理逻辑。 +- 2026-08-03:增加过期状态确认取消回归测试;Android 双变体单测、lint 和构建通过, + 状态改为 `DONE`。