{"id":181,"url":"https://git.ilapage.cn/api/v1/repos/OPC/goauto/issues/42","html_url":"https://git.ilapage.cn/OPC/goauto/issues/42","number":42,"user":{"id":2,"login":"ila","login_name":"","source_id":0,"full_name":"","email":"2+ila@noreply.git.ilapage.cn","avatar_url":"https://git.ilapage.cn/avatars/faaf175503307561b7b576285cea4e7f","html_url":"https://git.ilapage.cn/ila","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2026-08-10T14:40:32+08:00","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"ila"},"original_author":"","original_author_id":0,"title":"T40 Android 采购演练规则与持久执行基线","body":"## 基本信息\n\n- 类型：需求 / Android采购演练 / 持久执行基线\n- 所属总体设计：#32\n- 阶段：待实施（受 #32 QuantUX 原型审核门禁阻塞）\n\n## 依赖与并行\n\n- 前置工单：#33采购共享契约、#34服务端采购演练任务能力，以及#32原型经用户明确验收\n- 是否允许并行：服务端契约稳定后可开发；必须先于真实地址修改和创建订单\n- 原因：先用没有外部副作用的演练验证“服务端规则变化无需升级APK”和Android持久执行边界\n\n## 子项目影响\n\n- 交付单元：android / shared-docs\n- 是否跨子项目：是\n- 是否修改共享接口：只实现#33已确认的采购演练契约，不自行扩展\n- 验证：Android单元测试、APK构建、规则固件测试和不下单真机演练\n\n## 原始需求\n\n`cmautobuy`已经验证了商品、规格、数量、价格复核和本地Outbox等采购安全规则，但其PDD页面判断大量写死在Windows Client中，每次兼容新控件树都要更新Client。GoAuto第一步应保留手机直连云端架构，把可变化的页面证据和操作顺序放入服务端规则，并在不创建订单的演练流程中验证。\n\n## 做什么\n\n- 增加采购演练执行类型；任务输入人工指定PDD商品、精确颜色、尺码、数量、订单总价上限、设备和采购规则快照。\n- Android使用Room/SQLite持久化最小采购任务、执行尝试和Outbox：`task_id`、`attempt_id`、规则快照哈希、当前步骤、状态、结果、上报状态和时间。\n- 任务结果与待上报Outbox在同一事务保存；网络重试只重发既有结果，不重新操作PDD。\n- 复用GoAuto版本化规则和能力协商，采购规则只能调用已声明的通用类型化动作。\n- 用服务端规则完成：打开商品、验证商品身份、进入规格面板、精确选择颜色/尺码、设置数量、复核规格/数量/订单总价。\n- 最终复核完成后停在安全点并提交`rehearsal_completed`，不得进入地址修改和订单创建。\n- 从`cmautobuy`提取已验证的页面证据、唯一候选、精确规格、数量和价格保护测试场景；不复制Windows Client、ADB或Python线程架构。\n- 登录失效、验证码、风控、人机验证、商品不一致、价格超限和控件不唯一时明确失败。\n- 规格缺失或定位不到目标规格时不直接失败：按 #46 全量遍历采集规格与颜色价格并提交服务端，本趟正常结束；服务端 AI 匹配后重新派发第二趟执行。Agent 只按服务端下发的精确规格执行，本地不自行挑选候选。\n- `pending` 状态的 PDD 商品只有 URL 与 `goods_id`，其身份校验只依赖 `goods_id`，不做标题比对。\n\n## 规则与Agent边界\n\n仅修改服务端规则即可处理：文字/ID/层级证据变化、同义文字、等待时间、有限滑动次数、已知弹窗分支和最近可点击父节点策略。\n\n必须升级Agent的情况：新增通用动作类型、新的复杂遍历算法、系统级OEM浮层能力、无障碍API边界或新的本地可靠性机制。服务端下发任意脚本不在范围内。\n\n## 不做什么\n\n- 不接SYB导入和Shopee映射管理；测试输入允许人工准备。\n- 不修改收货地址，不点击创建订单，不进入支付页面，不支付。\n- 不采集PDD订单号、快递单号或执行货运宝回填。\n- 不保存原始控件树、截图、PDD账号凭据或完整收货地址。\n- 不迁移或保留Windows桌面Client架构。\n\n## 验收标准\n\n- [ ] 规则A可以完成一次商品、规格、数量和总价复核后安全停止。\n- [ ] 服务端把按钮同义文字、等待时间或滑动次数改成规则B后，不更新APK即可执行新任务。\n- [ ] 旧任务仍执行自身规则A快照，不受规则B影响。\n- [ ] 下发Agent不支持的能力时在操作PDD前返回`AGENT_CAPABILITY_MISMATCH`。\n- [ ] 数量、价格或唯一页面证据不满足时停止，不点击相近候选。\n- [ ] 规格定位不到时按 #46 走采集回传并结束本趟，不在本地挑选相近候选；第二趟按下发规格精确执行。\n- [ ] 结果与Outbox事务保存；断网/重启后只重新上报，不重复执行PDD操作。\n- [ ] 全流程没有修改地址、创建PDD订单或支付。\n- [ ] Android单元测试、APK构建和一加真机安全演练通过。\n\n## 风险和回退\n\n本工单不得包含任何真实下单动作。采购演练能力与采集能力按任务类型隔离；出现问题可停用采购演练规则并回退APK，不影响现有采集闭环。\n\n---\n\n> **2026-08-18 规则修订**：本工单的规格匹配相关条款已按 [#46 T44 采购规格 AI 匹配与实时规格回传（决策变更）](https://git.ilapage.cn/OPC/goauto/issues/46) 修订，以上文正文为准。#46 是该决策的唯一事实来源。\n\n## 2026-08-20 实施前阻塞核对\n\n- 新增阻塞依赖：#53（采购规则参数化动作契约）。\n- 当前服务端只接受 `actions[].type`，无法承载本单已确认的按钮同义词、等待时间和滑动次数；在 #53 验收前不能实现满足验收条件的 Android 解释器。\n- 本单保持待实施，未执行 PDD 操作，未修改 Android、服务端或数据库。\n## 2026-08-20 服务端联调阻塞\n\n- 新增阻塞依赖：#54（统一采集与采购任务的设备心跳、忙碌和离线处理）。\n- 当前心跳、设备列表和离线扫描只识别 `collection_task`；Android 如实上报采购任务会收到 `DEVICE_TASK_MISMATCH`，省略上报则违反共享契约。\n- Android 本地实现与单测/APK 构建已完成，修改暂存工作区；#54 验收前不进行真机采购演练、不提交 #42 完成结果。","ref":"","assets":[],"labels":[],"milestone":null,"projects":null,"assignee":null,"assignees":null,"state":"closed","is_locked":false,"comments":6,"created_at":"2026-08-17T10:24:50+08:00","updated_at":"2026-08-21T15:19:18+08:00","closed_at":"2026-08-20T23:15:41+08:00","due_date":null,"time_estimate":0,"pull_request":null,"repository":{"id":4,"name":"goauto","owner":"OPC","full_name":"OPC/goauto"},"pin_order":0,"content_version":3}