feat(t216): deliver recoverable device order commands

This commit is contained in:
QiuSW
2026-07-28 13:23:18 +08:00
parent 75fdc63db2
commit 2372ab2280
32 changed files with 2415 additions and 65 deletions
+2 -1
View File
@@ -58,7 +58,8 @@ T-205 原子领取/租约状态机、T-206 Android 登录/有限离线、T-207
证据回传、T-211 参考图召回和 SKU 硬匹配、T-212 候选身份映射,以及 T-213 受控
规格组合/价格核验均已完成。T-208 的原始候选观测、模型评估、确定性推荐、逐候选
结构化人工理由和修订历史也已完成。T-214 商品持久身份和重新定位指纹、T-215
Admin 候选确认与不可变待投递授权也已完成;当前实现 T-216 设备命令投递与确认。
Admin 候选确认、不可变待投递授权及 T-216 设备命令可靠投递与确认均已完成;下一项
是 T-217 已授权商品重新定位与订单 dry-run。
不得直接把候选链接或列表 ordinal 当成授权。
手机从管理后端领取任务并回传结果,VLM、拼多多自动化和人工确认在 App 本地完成。
T-206 增加有限离线执行;T-207 已复用 Roubao 端上 OpenAI 兼容适配器并加密本地 Key。
+1 -1
View File
@@ -17,7 +17,7 @@
| IX-008 | US-006 | App/管理端错误状态 | 自动失败、取消、重试上传 | 显示结构化原因和恢复动作 | P0 | 已定 |
| IX-009 | US-008 | App 候选理由/管理端决策详情 | 接受、拒绝、改选或修正 | 保存逐候选结构化人工标签 | P1 | T-208 已实现 |
| IX-010 | US-009 | App 独立执行设置/同步状态 | 配置模式、离线执行或补报 | 授权内独立执行并可审计同步 | P0 | T-206 离线控制已实现,结果补报待 T-207 |
| IX-011 | US-010 | Admin 候选授权/App 订单执行 | 选择候选并授权、设备领取执行 | 创建一笔可对账的待付款订单并提醒人工付款 | P0 | T-215 已完成;T-216 进行中 |
| IX-011 | US-010 | Admin 候选授权/App 订单执行 | 选择候选并授权、设备领取执行 | 创建一笔可对账的待付款订单并提醒人工付款 | P0 | T-215/T-216 已完成;T-217 待实现 |
## IX-001 管理 Web 登录
+16 -12
View File
@@ -5,7 +5,7 @@
## 当前快照
- 日期:2026-07-28
- 阶段:T-216 设备下单命令投递、确认与恢复进行中
- 阶段:T-216 设备下单命令投递、确认与恢复已完成,待开始 T-217
- Git:当前分支为 `main`;T-001 至 T-004、T-101 至 T-104、T-201 至 T-207、T-209、
T-208、T-210、T-211、T-212、T-213、T-214 均已纳入 Git 历史
- 生产代码:`android-buyer/` 已接入 Roubao Android 源码
@@ -17,10 +17,10 @@
- 本机 Android 工具:JDK 17.0.13、Command-line Tools 22.0、SDK 34、
Build Tools 34.0.0、Platform Tools/ADB 37.0.0;用户级 SDK 环境变量已设置
- Android Studio:未安装;`winget` 静默安装卡住后已终止,不阻塞命令行构建
- 测试:T-215 Android 单元测试、Debug/Release 构建和根 `init.ps1` 通过;
Debug APK `1.4.12 (17)` 已安装并启动于 PKG110
- 后端测试:T-215 运行 `go test ./...`、`go test -race ./...`、`go vet ./...`;
v8 migration 往返、带授权数据的降级保护和 Admin 授权接口集成测试均通过
- 测试:T-216 Android Debug/Release 单元测试与构建和根 `init.ps1` 通过;
Debug APK `1.4.13 (18)` 已构建但未覆盖安装,PKG110 当前仍为 `1.4.12 (17)`
- 后端测试:T-216 运行 `go test ./...`、`go test -race ./...`、`go vet ./...`;
v9 migration 往返、带命令数据的降级保护及 pull/ACK HTTP 集成测试均通过
- 原型:4 个管理 Web 页面和 7 个 Android 页面均可离线独立打开;Playwright
以 1440×900、390×844、360×800 验证 36 个页面/视口组合,无页面横向溢出、
脚本错误或外部请求,Android 可见交互控件均不小于 44px
@@ -68,6 +68,10 @@
candidate key 选择并为全部候选填写结构化理由,服务端在同一事务追加人工 review、
不可变授权快照、事件和幂等记录。领取前可按版本改选,已投递后禁改;页面明确仅
授权创建设备端待付款订单,不授权付款。
- T-216 设备命令:App 在 heartbeat 后主动拉取同一条不可变授权,严格校验跨端
canonical hash、任务内容和候选四组指纹,先写 Keystore-backed 状态再幂等 ACK。
网络响应丢失和进程重启复用同一 ACK key;后台候选不再允许手机本地选择或重复
采集。本任务只同步授权,未打开拼多多或执行下单。
- Workflow:纯 Kotlin runner 已支持步骤 timeout、最多 3 次 retry、安全阻塞、
用户停止和单 runner 并发拒绝;T-102 已接入搜索加有界候选采集五步
- TaskSource:严格 CLI 已生成并验证真实私有 ProbeTask;默认 APK 不含私有 fixture
@@ -81,7 +85,8 @@
- 离线执行:默认 30 分钟有限授权和 30 秒 best-effort heartbeat 已实现;PKG110
真机断开临时后端 95 秒后保持同一 execution,重连后滑动续期;到期持久安全停止,
RUNNING 不自动重新分配
- 测试设备:OnePlus PKG110,Android 16/API 36;肉包 `1.4.12 (17)`;拼多多
- 测试设备:OnePlus PKG110,Android 16/API 36;已安装肉包 `1.4.12 (17)`,
待安装构建为 `1.4.13 (18)`;拼多多
`8.17.0 (81700)`
- 设备就绪:拼多多首页、文字/图片搜索、双列候选卡、详情截图和返回均已通过 8.17.0
真机验证;采购员已在 ColorOS 设置中手动启用肉包采购无障碍,APK 覆盖安装后授权
@@ -96,7 +101,7 @@
已用 CLI 真实导入并逐字段/图片哈希验证,生成物位于被忽略的 `.local/`
- 标准启动路径:`$env:RUN_START_COMMAND="1"; .\init.ps1`
- 标准验证路径:`.\init.ps1`
- 当前 blocker:T-215 无阻塞。真实 VLM 服务地址、模型、设备级测试凭证、成本上限
- 当前 blocker:T-216 无阻塞。真实 VLM 服务地址、模型、设备级测试凭证、成本上限
和数据留存尚未确认;当前只支持单 SKU/JPEG;候选探针截图要求 Android 11/API 30+
## 当前目录
@@ -128,7 +133,7 @@
| `docs/tasks/T-208.md` | DONE | 归一化候选决策数据并增加结构化人工 review |
| `docs/tasks/T-214.md` | DONE | 建立 execution-scoped candidate key 与设备采集指纹 |
| `docs/tasks/T-215.md` | DONE | Admin 按 candidate key 选择并创建不可变待投递授权 |
| `docs/tasks/T-216.md` | DOING | App 主动拉取并先加密落盘再确认同一条下单命令 |
| `docs/tasks/T-216.md` | DONE | App 主动拉取并先加密落盘再确认同一条下单命令 |
| `docs/design/` | 已确认 | T-202 原型索引、4 个管理页和 7 个 Android 页面 |
| `deepseek总结.txt` | 已有 | 历史讨论摘要,不是正式需求权威 |
| `android-buyer/` | 已有 | Roubao `main` 固定 commit 的 Android 基线 |
@@ -139,10 +144,9 @@
## 任务摘要
- 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-215。
- 正在进行:T-216 设备下单命令投递、确认与恢复。
- 下一步:依次实现设备命令、订单 dry-run、单次提交对账和
付款提醒。
- 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-216。
- 正在进行:无。
- 下一步:依次实现订单 dry-run、单次提交对账和付款提醒。
## 当前可运行内容
+18 -8
View File
@@ -4,7 +4,7 @@ title: 设备下单命令投递、确认与恢复
phase: 2
deps:
- T-215
status: DOING
status: DONE
created: 2026-07-28
context_ref: 827afc7
work_branch: null
@@ -127,13 +127,13 @@ v9:
## 验收要点
- [ ] 只有原 user/device/execution/generation/token 且租约有效时能拉取命令。
- [ ] 首次拉取原子进入 `DELIVERED`;网络重放返回相同 command/hash 且不重复事件。
- [ ] App 严格校验并先加密持久化,存储失败不 ACK,重启可恢复同一命令。
- [ ] ACK 幂等进入 `ACKNOWLEDGED`,错误 hash/command/设备和并发请求被拒绝。
- [ ] 后台候选流程等待 Admin,不再允许手机本地选择并提前完成任务。
- [ ] App 等待/已授权状态可见,但不打开拼多多、不选择 SKU/数量、不提交订单。
- [ ] v9 migration、Go test/race/vet、Android test/Debug/Release 和根验证通过。
- [x] 只有原 user/device/execution/generation/token 且租约有效时能拉取命令。
- [x] 首次拉取原子进入 `DELIVERED`;网络重放返回相同 command/hash 且不重复事件。
- [x] App 严格校验并先加密持久化,存储失败不 ACK,重启可恢复同一命令。
- [x] ACK 幂等进入 `ACKNOWLEDGED`,错误 hash/command/设备和并发请求被拒绝。
- [x] 后台候选流程等待 Admin,不再允许手机本地选择并提前完成任务。
- [x] App 等待/已授权状态可见,但不打开拼多多、不选择 SKU/数量、不提交订单。
- [x] v9 migration、Go test/race/vet、Android test/Debug/Release 和根验证通过。
## 边界
@@ -147,3 +147,13 @@ v9:
- 2026-07-28:T-215 实现提交 `827afc7` 后领取。复用现有 30 秒前台 heartbeat 和
Keystore-backed 状态,选择 pull + durable-before-ACK,避免 Android 后台推送和
HTTP 不确定结果造成命令丢失。
- 2026-07-28:新增 v9、命令 pull/ACK API、同一授权重放和投递/确认审计事件。
HTTP 集成覆盖错误 hash、响应丢失后的相同 key 重试、ACK 后恢复拉取、事件不重复
及带数据禁止降级。
- 2026-07-28:Android `1.4.13 (18)` 增加命令 canonical hash 校验、加密持久化、
固定 ACK key、重启恢复和等待/已授权 UI。后台任务有候选后不再出现手机接受/
拒绝入口,也禁止再次采集;空候选仍保留安全终态。
- 2026-07-28:Go/Kotlin 固定哈希向量一致;Android 测试证明存储失败时 ACK 调用数
为 0。`go test ./...`、`go test -race ./...`、`go vet ./...`、Android `test`、
Debug/Release assemble 和根 `.\init.ps1` 全部通过。APK 已构建,未在本任务中
覆盖安装或执行拼多多页面动作。