feat(android): 采购页「回填」入口替换为「重购」,逐条重试本设备最后一批失败采购 #367

Open
opened 2026-10-08 10:23:49 +08:00 by ila · 5 comments
Owner

基本信息

  • 类型:新功能(Android Agent 采购页批量重试入口)。
  • 状态:工单分支已实现、测试、构建并推送,待验收;未合并 main、未安装/发布,未执行真机采购。
  • 本次变更:2026-10-08 用户先确认 QuantUX v1,随后明确授权生产代码实施、测试、构建及提交推送工单分支;不包含真实采购、安装、合并或发布。
  • 来源:2026-10-07~08 用户与 Claude Code 讨论(grill-me)。用户原话摘要:「现在 agent 的采购 tab 里的"回填"按钮应该没有使用,我想改成批量重试……按照时间倒序一个个来重试采购」;「用全新的重采功能按钮替换回填按钮功能,不去动原来回填的代码」;「可以改成点击重采后只重试采购最后一批的失败采购任务吗」;「名称还是重购,选择 A 方案,先建工单」。
  • 风险等级:高。每条重试都可能真实创建拼多多订单(不付款)。

已确认的决策

  1. 入口:Android「采购」页搜索栏右侧的「回填」替换为「重购」。除该入口替换外,原回填弹窗、ACTION_BACKFILL_START、执行代码及服务端 /order-backfill 保留,不重构或删除;原单条「重试采购」「继续采购」行为不改。线上只读核验记录为「未查到 backfill: 标记」,不能据此断言从未使用过回填。
  2. 原任务重跑:复用 POST /api/agent/v1/purchase-tasks/{taskId}/reset,任务号不变;不调用创建替代任务的 /retry,不新增采购任务。
  3. 仅最后一批:不提供最近几批选择。按本设备采购记录的 createdAt DESC, taskId DESC,从最新一条向前,相邻创建时间相差不超过60秒视为同一批;超过60秒为边界。这是已选方案A的时间推算,不是真实批次ID;不新增服务端批次字段。
  4. 逐条执行:只处理本批当前 failed && retryable 的任务,按创建时间倒序,每条本轮最多重置一次;前一条本次执行结果确认且本地执行/上传收尾后,才处理下一条。
  5. 连续两次重购:最后一批10条、失败4条,第一次重购成功2条,再点击应只处理当前仍失败且可重试的2条;reset不改变createdAt,原批次仍是这10条。两次之间新建任务且形成新批次时,下一次点击的最后一批就是新批次;若新建任务与相邻任务间隔不超过60秒,仍按既定推算规则归入同批,不承诺识别真实创建批次。
  6. 新工作优先:操作约定为先完成重购,再发起新任务。开始前有未结束工作不启动;重购期间检测到本设备新采购或采集工作时,停止后续重购,当前已提交/执行任务沿用原流程,不主动交替安排正常队列与剩余重购。
  7. 不付款。确认弹窗只做一次本轮确认,不增加逐条审批或新的服务端门禁。

已核验事实与范围

原调查基线为 7622795;2026-10-08 Codex 与 Claude Code 在 main e450ac2 复核以下代码,未以本次审核宣称新能力已实现:

  • TaskHistoryFragment.retryPurchaseTask() 的普通重试调用 resetPurchaseTask;PurchaseRetryPolicy.showsAction 使用 failed && retryable。
  • purchase/reset.go 使用 validatePurchaseResetState,与查询侧 retryStateEligibility 规则对应,但不是直接调用同一函数:限定本设备、最近30天、正式SYB采购失败、同一明细最新任务且没有不可逆下单/订单信息;备货和演练不在范围。
  • 规格条件更正:只有 specSource != "unresolved" 且规格不完整时拒绝;unresolved 可以reset后进入规格探测。Android编排不增加“必须已有映射”的额外条件;最终仍以reset接口的当前规则、能力和设备检查为准。
  • reset的 requestId 映射到确定性的attempt ID,支持幂等;重放响应 Replayed=true 的 status 固定为pending,不是当前任务实时状态。
  • purchase/agent_history.go 提供本设备最近1~30天、全部状态或状态筛选的记录,按 created_at DESC, id DESC offset分页,每页最多50条,返回retryable与拒绝原因。详情可查询attemptCount及任务状态。
  • AgentForegroundService 具有单线程调度executor、单线程taskExecutor及 TaskExecutionMutex;原队列领取顺序不保证重购优先,不能靠阻塞执行线程或整轮占住任务锁实现批处理。

实施方案(工单分支已实现,真机效果待验收)

1. 找批次并冻结本轮列表

  • 使用本设备完整状态记录,不继承页面的状态/编号筛选;采用现有30天查询范围,每页最多50条,跨页比较相邻createdAt,按taskId去重,直到找到边界或可信列表结尾。
  • 时间需按带时区的时间值比较;同一创建时刻以taskId倒序决定顺序。
  • offset分页的轻量处理:在仅头部新增、原记录排序及设备归属不变时,插入会造成页间重复,可以去重;读取完成后重读第一页,最新taskId改变则不启动,提示列表变化后重试。不能把这个方案写成任意并发变化下都不漏读的保证。
  • 读取需有界;分页异常、时间不可解析、遇到不能判断的查询边界或无法完整确定批次时不启动,不拿部分列表执行。不增加服务端分页/批次契约,也不为此实现新的并发框架。
  • 形成固定的本轮候选快照,区分失败总数、可重购数和跳过数;只将 failed && retryable 纳入执行队列。再次失败不在本轮重新入队。
  • 最新批次没有失败任务时明确提示,不回退到更早批次;有失败但全部不可重试时展示原因,不发送reset。

2. 确认与开始前检查

  • 轻量弹窗显示推算批次时间范围、总数、失败数、重购数和跳过数,并写明「可能真实创建拼多多待付款订单,系统不会付款」。
  • 用户确认后,检查设备身份/连接/无障碍及本地工作边界。已有采购或采集未结束工作、正在执行的人工操作或尚未提交的采购结果时,不开始。
  • 每条发送reset前重新读取资格、复核新工作及本地忙碌状态;初次列表中的retryable不是永久许可。
  • 新工作按任务类型与taskId识别,本轮当前任务因reset进入pending/running/spec_probe_pending不算新任务;不能仅凭出现pending/running就停止自己。

3. 幂等reset与本次结果确认

  • 每条任务在本轮生成并固定一个requestId,调用现有reset后交给原执行服务领取、执行。
  • 请求超时、连接中断或响应不明,可能是服务端已成功重置:同ID有界重发或回读任务详情,不能换新UUID、不能当作未执行而直接跳下一条;仍不明确则停止整轮。
  • 保存reset返回的attemptNumber等关联信息,结合详情/原执行结果确认当前观察属于本次reset;不能将重试前的旧failed当成本次失败,也不能将幂等重放的pending响应当实时状态。
  • pending、running、spec_probe_pending、order_submit_started等仍为处理中;确认本次order_created/failed/cancelled等终态后,等待本地执行锁释放、结果提交收尾,再推进。order_result_unknown停止整轮并提示人工核对。
  • 单条等待必须有上限;已随 v1 原型确认固定为15分钟。超时只停止编排,不改任务状态、不强行取消、不补发新重置、不触发再次下单。

4. 编排、互斥和生命周期

  • 在Service中以非阻塞状态调度推进,不在采购执行线程中等待自己,不整轮持有TaskExecutionMutex;实际任务继续复用原执行器、任务租约和互斥。
  • 页面只发起确认、展示状态与停止;不依赖Fragment存活,禁止重复点击启动两个本轮编排。
  • 仅明确的单任务业务资格拒绝可跳过,例如过期、已有更新任务、已触及下单边界;记录原因。
  • 设备忙在有界收尾复核后仍存在、断网/鉴权失败、无障碍异常、登录失效、验证码/风控或结果待核对时停止整轮,不把环境故障造成的整批拒绝当逐条跳过。
  • 检测到新采购或采集工作,停止后续重购、不抢占正常任务、不继续交替安排剩余重购。此行为是按检测结果停止编排,不宣称客户端检查可以原子阻止服务端并发创建任务。
  • 用户在采购页或通知栏点击「停止重购」只停止后续;已经提交reset或正在执行的任务按原流程结束。
  • 切到PDD、切Tab、界面重建不算进程关闭,不停止本轮;进程死亡/手机重启后不恢复整轮。已发出的单任务仍沿用既有恢复规则,不因结束本轮而清理或伪造任务结果。

5. 展示与数据

  • 采购页与通知栏展示本轮进度、当前任务号、成功/再次失败/跳过及停止原因;结束后可查看本轮逐条摘要。
  • 只保留编排必要的内存/本机摘要,不新增地址或控件树采集。既有 #364 失败诊断按自身规则运行,本单不改变其范围。
  • 不新增服务端接口、数据库结构、批次表或管理端页面。

子项目影响、依赖与并行

  • 只涉及Android采购页、Service编排及必要网络模型/纯逻辑与测试;复用现有reset/详情/列表接口,不改原采购自动化及单条重试/继续采购流程。
  • 无 #368 功能依赖,可先实施 #368。与 #364/#365/#366 的Service改动应在已合并main基线上集成验证,避免覆盖诊断及地址/核单逻辑。
  • 涉及并发调度的代码实施已由用户2026-10-08明确授权;真实创建订单及真机批量验证仍须另行授权。

设计证据

v1 轻量交互原型(2026-10-08,用户审核通过)

  • 用户本轮授权:先做 #367 原型;不包含生产实现、真实重购、合并或发布。
  • 直接预览:QuantUX #367 v1。无需登录;首次进入依次点击 Next → Start,进入采购页。URL 使用 log=false 关闭交互记录。右上角“场景目录”和带“[演示]”的按钮仅用于审核,不进入正式 App。
  • 编辑/总览:QuantUX App(需要 QuantUX 登录)。
  • App ID:6ac75e93191a826306a8026a。
  • 版本:GoAuto #367 v1 · 最后一批重购 · 待审核;模型标识 lastUUID=11808,29 个状态画面、636 个组件、142 条交互线。不同画面是同一采购页/确认/通知的状态示意,不是新增29个业务页面。
  • 设计基线:main e450ac2 的 TaskHistoryFragment.buildSearch/renderBackfill/buildFilters 与 colors.xml;保持深色 Agent 外观、编号搜索、原筛选、任务卡片和四 Tab。原“回填”位置换为“重购”,原单条重试/继续采购不在本原型中重做。
  • 确认状态:已通过;确认人:用户(Codex 会话);确认时间:2026-10-08 17:32(Asia/Shanghai,记录时刻)。用户原话:「#367原型通过审核」。覆盖上述 v1(App ID及lastUUID不变)全部交互范围及单条等待15分钟;本次为设计确认,不代表生产实现、真机下单、合并或发布授权。保留原型原版本名称,不覆盖已审阅模型。

v1 覆盖和交互口径

  1. 点击重购:读取本设备近30天全部状态记录,跨页找到最后一批;不使用页面编号/状态筛选。模拟读取完成后进入一次确认。
  2. 一次确认:展示本设备、推算时间范围、批内总数/失败数/可重购数/跳过数,60秒相邻间隔推算说明、原任务号复用和不付款提示;无批次选择器、无逐条审批。
  3. 本轮进度:当前任务号、已结束/总数、成功/再次失败/跳过/待处理数量;执行中不能重复启动。前一条本次终态且执行锁/结果上传收尾后才推进,重购不自动重试本轮再次失败。
  4. 停止:采购页与通知均提供停止后续重购;当前已提交/执行任务继续原流程,收尾中不能再次启动。不同停止时刻使用各自的数量摘要,不把未执行任务记为已取消。
  5. 完成及再次发起:示例10条失败4条,本轮成功2条、再次失败2条;再点击重新读取并确认2条,而非重试已经成功的任务。出现新批次时按新批次处理,不回退旧批。
  6. 空/禁用/失败:近30天无记录、最后一批无失败、失败均不可重试及逐条原因、设备忙/结果上传未收尾、连接/无障碍不可用、分页读取失败、读取期间列表变化均不开始;不执行部分读取结果。
  7. 运行中异常:新采集/采购到来、登录/验证码/风控、重置响应不明经同请求标识重发/回读仍不明确、订单结果待核对、单条超时分别显示停止原因;不伪造结果、不自动重新下单。
  8. 已确认:单条等待上限15分钟。超时只停止编排,不取消任务、不修改采购状态、不补发新重置;已随2026-10-08用户 v1 原型审核通过。
  9. 生命周期与权限边界:仅本设备当前可重试失败任务;不能选其他设备,不增加角色/权限。切 Tab/切 PDD/界面重建不中断本轮;进程死亡或手机重启不恢复整轮,已发出单任务沿用原有恢复规则。

已验证 / 未验证

  • 使用无登录浏览器打开预览,实际点击:入口→读取→确认→执行→本轮完成→剩余2条确认→第二轮停止;切Tab后返回进度;通知栏停止;12类空态/异常场景。
  • 首页、确认、执行中、目录已目视核验;Label/Button 统一使用 props.label,无只设置 props.text 导致不显示的问题;浏览器无 pageerror。
  • 模型回读通过,所有交互目标存在,全部组件在390×844画布内。
  • 所有商品/任务均为合成演示数据;未连接 Admin 业务接口或真实设备,无下单/付款。
  • 搜索、既有筛选、单条重试等未改功能仅作为上下文展示,非本轮交互实现。
  • 未导出离线 HTML,未修改生产代码/数据库/权限,未构建 APK。尚无长期实现事实变化,故本轮不更新 Wiki、不运行镜像同步。

验收标准

  • 采购页显示重购,原回填入口消失;除入口替换外回填实现、单条重试及继续采购无行为变化。
  • 同秒排序、相邻60秒及超过60秒、链式连续间隔、仅一批、最后一批全成功、跨50条页边界均正确。
  • 全状态读取、不受列表搜索影响、taskId去重;分页新增导致最新ID变化时不启动;异常/不完整边界不执行部分列表。
  • 本轮快照固定且每条最多一次;10条中失败4条、第一次成功2条,第二次只重购剩余仍失败且可重试的2条;新增形成新批次后不会回退旧批。
  • 仅failed且retryable执行,unresolved仍可进入原规格探测;失败但不可重试显示原因。
  • reset响应丢失、同requestId重放、旧failed回读均不重复重置或提前推进;重放pending不当实时状态。
  • 不阻塞原单线程执行器;每次只有一条在执行,终态且本地执行锁/结果收尾后才推进。
  • 新采购/采集到来停止后续;当前重购任务自身pending/running不被误判;开始前有未结束工作不启动。
  • 业务资格拒绝可跳过;持续busy、断网/鉴权、登录、验证码/风控、无障碍、结果待核对和单条超时均按规则停止。
  • 停止按钮/通知栏停止有效,当前已提交任务不被强行取消;切PDD/切Tab不中断,进程死亡后不恢复整轮。
  • 确认弹窗说明真实下单风险,无付款动作;Android单元测试、集成回归与构建通过并如实记录。
  • 真机批量重购验收另获授权,先用少量失败任务验证;未执行不得记为通过。

风险与回退

  • 60秒是推算,连续创建的两批可能合并;确认界面展示范围,用户接受该最小方案,不引入真实批次模型。
  • reset依赖既有安全检查,响应不明不得猜测;客户端不承诺对跨请求并发提供数据库级快照。
  • 回退代码可恢复回填入口、撤下重购编排;没有结构迁移。已发出的任务及订单不能靠代码回退撤销,不执行付款。

文档影响及整合记录

实施完成时更新Wiki Business-Rules-and-Glossary的重购范围、生命周期及回填入口变化,排障入口变化时更新Troubleshooting;API契约不变。只在长期事实落地后按规则在线更新/回读revision,运行一次sync和sync --check。本次实现已更新长期业务规则与架构调用路径;在线revision及镜像验证见下方交付记录。

  • 依据:评论9010、SynapBus #99/#101/#103及用户2026-10-08在Codex会话的明确整合授权。
  • 已消除旧稿“可选择最近几批”“新任务交替执行”的未决或冲突描述;状态保留为尚未实施。

实施与交付证据(2026-10-08,待验收)

  • 基线 main e450ac2;分支 feat/367-last-batch-repurchase 已推送,远端 HEAD 136765dbb0c7f558be5981a47b25a39db8ce1483。
  • 提交:87192f7 批次发现;b5a781b 服务端时钟完整性;5430dc1f64fc0a4d8ef124ada7356e21a975151f 编排/Service/UI;136765d Wiki镜像。
  • 实现仅Android及长期Wiki镜像。无数据库迁移、权限写入或Server/Web代码变更;读取既有采购payload的attemptNumber及标准HTTP Date,接口契约不新增字段。
  • 采购页原入口换为重购,一次确认、进度、页面/通知停止及逐条摘要。原回填实现、单条重试/继续采购不改。Service独立串行编排,原taskExecutor/租约/任务锁负责实际执行;仅reset请求期间短时预留本地锁。
  • 本轮使用服务端Date时钟验证30天截断(秒精度补1秒),最多200页;分页异常/头部与总数变化/不完整均不执行部分结果。相邻60秒只是推算批次,不承诺任意并发变动快照。
  • 审核修复:手机时钟偏差不再导致截断误判;更晚attempt必须由原执行器的探测/重匹配→正式采购证据链关联,否则停止不认领;明确未发送的本地忙碌清current、10秒内复核并复用固定UUID,不误进入15分钟未知收尾。

验证

  • 新增批次24项、编排18项、展示状态3项、真实本地HTTP Date读取1项,共46项通过。主要首轮红绿记录:批次19失败→19通过,时钟边界新增5失败→24通过,状态3失败→3通过,HTTP Date1失败→1通过,编排12失败→12通过;后续回归补齐至18项。
  • 最终定向回归:26套、320项测试,0失败/0错误。覆盖重购、任务互斥/派发、原采购执行/单条重试、回填、历史记录、IdleReturn、API JSON及 #364 诊断;assembleDebug 成功,git diff --check 通过。
  • 首次完整 testDebugUnitTest 在既有 ImageSearchBackRecoveryTest.stalled backs trigger a clear-top relaunch instead of burning the budget 长时间CPU空转,线程栈位于 PinduoduoImageSearchAutomation.awaitPage:310;测试pause为空但使用真实墙钟。约4分钟后停止本轮测试worker。完整基线未跑完,不记为通过,未将该相邻问题混入#367修复。
  • 独立规格/质量审核已完成:先修复2项集成阻断后复审通过。审核是源码及报告核对,不代替真机。
  • harness.py check --strict 仍有既有1项基线问题:docs/evidence/pdd-home-35727-summary.md 未登记Wiki镜像;本工单未新增该问题,未修改该文件。

APK

  • 路径:D:/OPC/goauto-worktrees/issue-367/android/app/build/outputs/apk/debug/app-debug.apk
  • Debug APK,版本名仍为0.9.69 / code82,源码以本单提交绑定识别;字节数6595620。
  • SHA256:7D55C042CC1D0F69D070128658F9C77D7A244D286C93CA3F90E21B8654A2FA6A。
  • 未安装到手机、未执行真实reset/采购/下单、未合并main、未发布。 未验证真机UI/通知、手机后台存活、跨设备环境及真实批量采购;后续少量任务验证须另获授权。

文档与工作区

  • Business-Rules-and-Glossary revision c4870fd01a4569059fc0afc77179d14fbd286384。
  • Architecture-and-Code-Map revision bf3ce6efd67fde1fdb6eacd3248f186aea880391。
  • 两页面在线更新并回读;使用harness既有同步逻辑仅限定这两映射,完成一次sync及一次sync --check,均成功;未创建任务快照或离线原型。
  • 工单保持open待验收;未合并的worktree保留 D:/OPC/goauto-worktrees/issue-367,工作区干净,远端提交已回读确认。合并/发布后再按规则清理。
## 基本信息 - 类型:新功能(Android Agent 采购页批量重试入口)。 - 状态:**工单分支已实现、测试、构建并推送,待验收;未合并 main、未安装/发布,未执行真机采购**。 - 本次变更:2026-10-08 用户先确认 QuantUX v1,随后明确授权生产代码实施、测试、构建及提交推送工单分支;不包含真实采购、安装、合并或发布。 - 来源:2026-10-07~08 用户与 Claude Code 讨论(grill-me)。用户原话摘要:「现在 agent 的采购 tab 里的"回填"按钮应该没有使用,我想改成批量重试……按照时间倒序一个个来重试采购」;「用全新的重采功能按钮替换回填按钮功能,不去动原来回填的代码」;「可以改成点击重采后只重试采购最后一批的失败采购任务吗」;「名称还是重购,选择 A 方案,先建工单」。 - **风险等级:高**。每条重试都可能真实创建拼多多订单(不付款)。 ## 已确认的决策 1. **入口**:Android「采购」页搜索栏右侧的「回填」替换为「重购」。除该入口替换外,原回填弹窗、`ACTION_BACKFILL_START`、执行代码及服务端 `/order-backfill` 保留,不重构或删除;原单条「重试采购」「继续采购」行为不改。线上只读核验记录为「未查到 `backfill:` 标记」,不能据此断言从未使用过回填。 2. **原任务重跑**:复用 `POST /api/agent/v1/purchase-tasks/{taskId}/reset`,任务号不变;不调用创建替代任务的 `/retry`,不新增采购任务。 3. **仅最后一批**:不提供最近几批选择。按本设备采购记录的 `createdAt DESC, taskId DESC`,从最新一条向前,相邻创建时间相差不超过60秒视为同一批;超过60秒为边界。这是已选方案A的时间推算,不是真实批次ID;不新增服务端批次字段。 4. **逐条执行**:只处理本批当前 `failed && retryable` 的任务,按创建时间倒序,每条本轮最多重置一次;前一条本次执行结果确认且本地执行/上传收尾后,才处理下一条。 5. **连续两次重购**:最后一批10条、失败4条,第一次重购成功2条,再点击应只处理当前仍失败且可重试的2条;reset不改变createdAt,原批次仍是这10条。两次之间新建任务且形成新批次时,下一次点击的最后一批就是新批次;若新建任务与相邻任务间隔不超过60秒,仍按既定推算规则归入同批,不承诺识别真实创建批次。 6. **新工作优先**:操作约定为先完成重购,再发起新任务。开始前有未结束工作不启动;重购期间检测到本设备新采购或采集工作时,停止后续重购,当前已提交/执行任务沿用原流程,不主动交替安排正常队列与剩余重购。 7. 不付款。确认弹窗只做一次本轮确认,不增加逐条审批或新的服务端门禁。 ## 已核验事实与范围 原调查基线为 `7622795`;2026-10-08 Codex 与 Claude Code 在 main `e450ac2` 复核以下代码,未以本次审核宣称新能力已实现: - `TaskHistoryFragment.retryPurchaseTask()` 的普通重试调用 `resetPurchaseTask`;`PurchaseRetryPolicy.showsAction` 使用 `failed && retryable`。 - `purchase/reset.go` 使用 `validatePurchaseResetState`,与查询侧 `retryStateEligibility` 规则对应,但不是直接调用同一函数:限定本设备、最近30天、正式SYB采购失败、同一明细最新任务且没有不可逆下单/订单信息;备货和演练不在范围。 - **规格条件更正**:只有 `specSource != "unresolved"` 且规格不完整时拒绝;`unresolved` 可以reset后进入规格探测。Android编排不增加“必须已有映射”的额外条件;最终仍以reset接口的当前规则、能力和设备检查为准。 - reset的 `requestId` 映射到确定性的attempt ID,支持幂等;重放响应 `Replayed=true` 的 `status` 固定为pending,不是当前任务实时状态。 - `purchase/agent_history.go` 提供本设备最近1~30天、全部状态或状态筛选的记录,按 `created_at DESC, id DESC` offset分页,每页最多50条,返回retryable与拒绝原因。详情可查询attemptCount及任务状态。 - `AgentForegroundService` 具有单线程调度executor、单线程taskExecutor及 `TaskExecutionMutex`;原队列领取顺序不保证重购优先,不能靠阻塞执行线程或整轮占住任务锁实现批处理。 ## 实施方案(工单分支已实现,真机效果待验收) ### 1. 找批次并冻结本轮列表 - 使用本设备完整状态记录,不继承页面的状态/编号筛选;采用现有30天查询范围,每页最多50条,跨页比较相邻createdAt,按taskId去重,直到找到边界或可信列表结尾。 - 时间需按带时区的时间值比较;同一创建时刻以taskId倒序决定顺序。 - offset分页的轻量处理:在**仅头部新增、原记录排序及设备归属不变**时,插入会造成页间重复,可以去重;读取完成后重读第一页,最新taskId改变则不启动,提示列表变化后重试。不能把这个方案写成任意并发变化下都不漏读的保证。 - 读取需有界;分页异常、时间不可解析、遇到不能判断的查询边界或无法完整确定批次时不启动,不拿部分列表执行。不增加服务端分页/批次契约,也不为此实现新的并发框架。 - 形成固定的本轮候选快照,区分失败总数、可重购数和跳过数;只将 `failed && retryable` 纳入执行队列。再次失败不在本轮重新入队。 - 最新批次没有失败任务时明确提示,不回退到更早批次;有失败但全部不可重试时展示原因,不发送reset。 ### 2. 确认与开始前检查 - 轻量弹窗显示推算批次时间范围、总数、失败数、重购数和跳过数,并写明「可能真实创建拼多多待付款订单,系统不会付款」。 - 用户确认后,检查设备身份/连接/无障碍及本地工作边界。已有采购或采集未结束工作、正在执行的人工操作或尚未提交的采购结果时,不开始。 - 每条发送reset前重新读取资格、复核新工作及本地忙碌状态;初次列表中的retryable不是永久许可。 - 新工作按任务类型与taskId识别,**本轮当前任务因reset进入pending/running/spec_probe_pending不算新任务**;不能仅凭出现pending/running就停止自己。 ### 3. 幂等reset与本次结果确认 - 每条任务在本轮生成并固定一个requestId,调用现有reset后交给原执行服务领取、执行。 - 请求超时、连接中断或响应不明,可能是服务端已成功重置:同ID有界重发或回读任务详情,不能换新UUID、不能当作未执行而直接跳下一条;仍不明确则停止整轮。 - 保存reset返回的attemptNumber等关联信息,结合详情/原执行结果确认当前观察属于本次reset;不能将重试前的旧failed当成本次失败,也不能将幂等重放的pending响应当实时状态。 - pending、running、spec_probe_pending、order_submit_started等仍为处理中;确认本次order_created/failed/cancelled等终态后,等待本地执行锁释放、结果提交收尾,再推进。order_result_unknown停止整轮并提示人工核对。 - 单条等待必须有上限;已随 v1 原型确认固定为15分钟。超时只停止编排,不改任务状态、不强行取消、不补发新重置、不触发再次下单。 ### 4. 编排、互斥和生命周期 - 在Service中以非阻塞状态调度推进,不在采购执行线程中等待自己,不整轮持有TaskExecutionMutex;实际任务继续复用原执行器、任务租约和互斥。 - 页面只发起确认、展示状态与停止;不依赖Fragment存活,禁止重复点击启动两个本轮编排。 - 仅明确的单任务业务资格拒绝可跳过,例如过期、已有更新任务、已触及下单边界;记录原因。 - 设备忙在有界收尾复核后仍存在、断网/鉴权失败、无障碍异常、登录失效、验证码/风控或结果待核对时停止整轮,不把环境故障造成的整批拒绝当逐条跳过。 - 检测到新采购或采集工作,停止后续重购、不抢占正常任务、不继续交替安排剩余重购。此行为是按检测结果停止编排,不宣称客户端检查可以原子阻止服务端并发创建任务。 - 用户在采购页或通知栏点击「停止重购」只停止后续;已经提交reset或正在执行的任务按原流程结束。 - 切到PDD、切Tab、界面重建不算进程关闭,不停止本轮;进程死亡/手机重启后不恢复整轮。已发出的单任务仍沿用既有恢复规则,不因结束本轮而清理或伪造任务结果。 ### 5. 展示与数据 - 采购页与通知栏展示本轮进度、当前任务号、成功/再次失败/跳过及停止原因;结束后可查看本轮逐条摘要。 - 只保留编排必要的内存/本机摘要,不新增地址或控件树采集。既有 #364 失败诊断按自身规则运行,本单不改变其范围。 - 不新增服务端接口、数据库结构、批次表或管理端页面。 ## 子项目影响、依赖与并行 - 只涉及Android采购页、Service编排及必要网络模型/纯逻辑与测试;复用现有reset/详情/列表接口,不改原采购自动化及单条重试/继续采购流程。 - 无 #368 功能依赖,可先实施 #368。与 #364/#365/#366 的Service改动应在已合并main基线上集成验证,避免覆盖诊断及地址/核单逻辑。 - 涉及并发调度的代码实施已由用户2026-10-08明确授权;真实创建订单及真机批量验证仍须另行授权。 ## 设计证据 ### v1 轻量交互原型(2026-10-08,用户审核通过) - 用户本轮授权:先做 #367 原型;**不包含生产实现、真实重购、合并或发布**。 - 直接预览:[QuantUX #367 v1](https://qux.ilapage.cn/#/test.html?h=a2aa10aNyRLY23uxGBSmSfy1ozCYe9uGteBjvzym8zM8RuJ1MTLzKdcRAYDK&log=false)。无需登录;首次进入依次点击 **Next → Start**,进入采购页。URL 使用 `log=false` 关闭交互记录。右上角“场景目录”和带“[演示]”的按钮仅用于审核,不进入正式 App。 - 编辑/总览:[QuantUX App](https://qux.ilapage.cn/#/apps/6ac75e93191a826306a8026a.html)(需要 QuantUX 登录)。 - App ID:`6ac75e93191a826306a8026a`。 - 版本:**GoAuto #367 v1 · 最后一批重购 · 待审核**;模型标识 `lastUUID=11808`,29 个状态画面、636 个组件、142 条交互线。不同画面是同一采购页/确认/通知的状态示意,不是新增29个业务页面。 - 设计基线:main `e450ac2` 的 `TaskHistoryFragment.buildSearch/renderBackfill/buildFilters` 与 `colors.xml`;保持深色 Agent 外观、编号搜索、原筛选、任务卡片和四 Tab。原“回填”位置换为“重购”,原单条重试/继续采购不在本原型中重做。 - 确认状态:**已通过**;确认人:用户(Codex 会话);确认时间:2026-10-08 17:32(Asia/Shanghai,记录时刻)。用户原话:「#367原型通过审核」。覆盖上述 v1(App ID及lastUUID不变)全部交互范围及单条等待15分钟;本次为设计确认,不代表生产实现、真机下单、合并或发布授权。保留原型原版本名称,不覆盖已审阅模型。 #### v1 覆盖和交互口径 1. 点击重购:读取本设备近30天全部状态记录,跨页找到最后一批;不使用页面编号/状态筛选。模拟读取完成后进入一次确认。 2. 一次确认:展示本设备、推算时间范围、批内总数/失败数/可重购数/跳过数,60秒相邻间隔推算说明、原任务号复用和不付款提示;无批次选择器、无逐条审批。 3. 本轮进度:当前任务号、已结束/总数、成功/再次失败/跳过/待处理数量;执行中不能重复启动。前一条本次终态且执行锁/结果上传收尾后才推进,重购不自动重试本轮再次失败。 4. 停止:采购页与通知均提供停止后续重购;当前已提交/执行任务继续原流程,收尾中不能再次启动。不同停止时刻使用各自的数量摘要,不把未执行任务记为已取消。 5. 完成及再次发起:示例10条失败4条,本轮成功2条、再次失败2条;再点击重新读取并确认2条,而非重试已经成功的任务。出现新批次时按新批次处理,不回退旧批。 6. 空/禁用/失败:近30天无记录、最后一批无失败、失败均不可重试及逐条原因、设备忙/结果上传未收尾、连接/无障碍不可用、分页读取失败、读取期间列表变化均不开始;不执行部分读取结果。 7. 运行中异常:新采集/采购到来、登录/验证码/风控、重置响应不明经同请求标识重发/回读仍不明确、订单结果待核对、单条超时分别显示停止原因;不伪造结果、不自动重新下单。 8. **已确认:单条等待上限15分钟**。超时只停止编排,不取消任务、不修改采购状态、不补发新重置;已随2026-10-08用户 v1 原型审核通过。 9. 生命周期与权限边界:仅本设备当前可重试失败任务;不能选其他设备,不增加角色/权限。切 Tab/切 PDD/界面重建不中断本轮;进程死亡或手机重启不恢复整轮,已发出单任务沿用原有恢复规则。 #### 已验证 / 未验证 - 使用无登录浏览器打开预览,实际点击:入口→读取→确认→执行→本轮完成→剩余2条确认→第二轮停止;切Tab后返回进度;通知栏停止;12类空态/异常场景。 - 首页、确认、执行中、目录已目视核验;Label/Button 统一使用 `props.label`,无只设置 `props.text` 导致不显示的问题;浏览器无 pageerror。 - 模型回读通过,所有交互目标存在,全部组件在390×844画布内。 - 所有商品/任务均为合成演示数据;未连接 Admin 业务接口或真实设备,无下单/付款。 - 搜索、既有筛选、单条重试等未改功能仅作为上下文展示,非本轮交互实现。 - 未导出离线 HTML,未修改生产代码/数据库/权限,未构建 APK。尚无长期实现事实变化,故本轮不更新 Wiki、不运行镜像同步。 ## 验收标准 - [ ] 采购页显示重购,原回填入口消失;除入口替换外回填实现、单条重试及继续采购无行为变化。 - [ ] 同秒排序、相邻60秒及超过60秒、链式连续间隔、仅一批、最后一批全成功、跨50条页边界均正确。 - [ ] 全状态读取、不受列表搜索影响、taskId去重;分页新增导致最新ID变化时不启动;异常/不完整边界不执行部分列表。 - [ ] 本轮快照固定且每条最多一次;10条中失败4条、第一次成功2条,第二次只重购剩余仍失败且可重试的2条;新增形成新批次后不会回退旧批。 - [ ] 仅failed且retryable执行,unresolved仍可进入原规格探测;失败但不可重试显示原因。 - [ ] reset响应丢失、同requestId重放、旧failed回读均不重复重置或提前推进;重放pending不当实时状态。 - [ ] 不阻塞原单线程执行器;每次只有一条在执行,终态且本地执行锁/结果收尾后才推进。 - [ ] 新采购/采集到来停止后续;当前重购任务自身pending/running不被误判;开始前有未结束工作不启动。 - [ ] 业务资格拒绝可跳过;持续busy、断网/鉴权、登录、验证码/风控、无障碍、结果待核对和单条超时均按规则停止。 - [ ] 停止按钮/通知栏停止有效,当前已提交任务不被强行取消;切PDD/切Tab不中断,进程死亡后不恢复整轮。 - [ ] 确认弹窗说明真实下单风险,无付款动作;Android单元测试、集成回归与构建通过并如实记录。 - [ ] 真机批量重购验收另获授权,先用少量失败任务验证;未执行不得记为通过。 ## 风险与回退 - 60秒是推算,连续创建的两批可能合并;确认界面展示范围,用户接受该最小方案,不引入真实批次模型。 - reset依赖既有安全检查,响应不明不得猜测;客户端不承诺对跨请求并发提供数据库级快照。 - 回退代码可恢复回填入口、撤下重购编排;没有结构迁移。已发出的任务及订单不能靠代码回退撤销,不执行付款。 ## 文档影响及整合记录 实施完成时更新Wiki Business-Rules-and-Glossary的重购范围、生命周期及回填入口变化,排障入口变化时更新Troubleshooting;API契约不变。只在长期事实落地后按规则在线更新/回读revision,运行一次sync和sync --check。本次实现已更新长期业务规则与架构调用路径;在线revision及镜像验证见下方交付记录。 - 依据:评论9010、SynapBus #99/#101/#103及用户2026-10-08在Codex会话的明确整合授权。 - 已消除旧稿“可选择最近几批”“新任务交替执行”的未决或冲突描述;状态保留为尚未实施。 ## 实施与交付证据(2026-10-08,待验收) - 基线 main `e450ac2`;分支 `feat/367-last-batch-repurchase` 已推送,远端 HEAD `136765dbb0c7f558be5981a47b25a39db8ce1483`。 - 提交:`87192f7` 批次发现;`b5a781b` 服务端时钟完整性;`5430dc1f64fc0a4d8ef124ada7356e21a975151f` 编排/Service/UI;`136765d` Wiki镜像。 - 实现仅Android及长期Wiki镜像。无数据库迁移、权限写入或Server/Web代码变更;读取既有采购payload的attemptNumber及标准HTTP Date,接口契约不新增字段。 - 采购页原入口换为重购,一次确认、进度、页面/通知停止及逐条摘要。原回填实现、单条重试/继续采购不改。Service独立串行编排,原taskExecutor/租约/任务锁负责实际执行;仅reset请求期间短时预留本地锁。 - 本轮使用服务端Date时钟验证30天截断(秒精度补1秒),最多200页;分页异常/头部与总数变化/不完整均不执行部分结果。相邻60秒只是推算批次,不承诺任意并发变动快照。 - 审核修复:手机时钟偏差不再导致截断误判;更晚attempt必须由原执行器的探测/重匹配→正式采购证据链关联,否则停止不认领;明确未发送的本地忙碌清current、10秒内复核并复用固定UUID,不误进入15分钟未知收尾。 ### 验证 - 新增批次24项、编排18项、展示状态3项、真实本地HTTP Date读取1项,共46项通过。主要首轮红绿记录:批次19失败→19通过,时钟边界新增5失败→24通过,状态3失败→3通过,HTTP Date1失败→1通过,编排12失败→12通过;后续回归补齐至18项。 - 最终定向回归:26套、**320项测试,0失败/0错误**。覆盖重购、任务互斥/派发、原采购执行/单条重试、回填、历史记录、IdleReturn、API JSON及 #364 诊断;`assembleDebug` 成功,`git diff --check` 通过。 - 首次完整 `testDebugUnitTest` 在既有 `ImageSearchBackRecoveryTest.stalled backs trigger a clear-top relaunch instead of burning the budget` 长时间CPU空转,线程栈位于 `PinduoduoImageSearchAutomation.awaitPage:310`;测试pause为空但使用真实墙钟。约4分钟后停止本轮测试worker。**完整基线未跑完,不记为通过**,未将该相邻问题混入#367修复。 - 独立规格/质量审核已完成:先修复2项集成阻断后复审通过。审核是源码及报告核对,不代替真机。 - `harness.py check --strict` 仍有既有1项基线问题:`docs/evidence/pdd-home-35727-summary.md` 未登记Wiki镜像;本工单未新增该问题,未修改该文件。 ### APK - 路径:`D:/OPC/goauto-worktrees/issue-367/android/app/build/outputs/apk/debug/app-debug.apk` - Debug APK,版本名仍为0.9.69 / code82,源码以本单提交绑定识别;字节数6595620。 - SHA256:`7D55C042CC1D0F69D070128658F9C77D7A244D286C93CA3F90E21B8654A2FA6A`。 - **未安装到手机、未执行真实reset/采购/下单、未合并main、未发布。** 未验证真机UI/通知、手机后台存活、跨设备环境及真实批量采购;后续少量任务验证须另获授权。 ### 文档与工作区 - Business-Rules-and-Glossary revision `c4870fd01a4569059fc0afc77179d14fbd286384`。 - Architecture-and-Code-Map revision `bf3ce6efd67fde1fdb6eacd3248f186aea880391`。 - 两页面在线更新并回读;使用harness既有同步逻辑仅限定这两映射,完成一次sync及一次sync --check,均成功;未创建任务快照或离线原型。 - 工单保持open待验收;未合并的worktree保留 `D:/OPC/goauto-worktrees/issue-367`,工作区干净,远端提交已回读确认。合并/发布后再按规则清理。
Author
Owner

方案讨论共识(2026-10-08,Claude Code,回复 SynapBus #99/#100)

依据 Codex 审核意见(核对基线 main e450ac2)。Claude Code 已独立核对相关代码,7 点全部采纳,以下为最小可落地共识。本评论不修改正文;整合进正文需用户授权。

已核实的代码事实

  • reset.go:90:仅当 specSource != "unresolved" 且规格不完整时拒绝;unresolved 任务允许 reset 并进入规格探测。正文「规格快照不完整时拒绝」表述不准确,应更正,编排侧不得额外阻断 unresolved。
  • reset.go:74-82:同一 requestId 的重放返回 Replayed=true,Status 固定为 pending,不是实时状态。
  • AgentForegroundService.kt:84-88:executor(单线程调度)、taskExecutor(单线程)及 TaskExecutionMutex。
  • 采购记录接口按 created_at DESC, id DESC 排序,offset 分页,每页最多 50 条(agent_history.go)。

共识

  1. 批次推算:保留 60 秒相邻间隔(用户已选)。读取全部状态(不按 failed 过滤),按需跨页直到找到边界,按 taskId 去重,形成本轮固定快照。
    • 漂移处理(建议的简单做法):倒序 + offset 时,新任务插入只会让后续页出现重复(去重即可),不会漏读;读完后重读第一页,若最新任务的 taskId 与开始时不同,说明期间有新任务进入,直接不开始(与「有未结束任务不开始」一致)。无法完整确定边界时不开始。不新增服务端批次表。
  2. 资格:只对 status=failed && retryable=true 发起 reset,其余显示跳过原因;每条执行前重新读取一次资格;服务端 reset 为最终依据。
  3. 幂等与回读:每条任务在本轮固定一个 requestId;请求超时或响应不明时,用同一 requestId 重发或回读详情,不明确就停止整轮,不换新 UUID、不跳到下一条。等待结果时必须确认看到的是本次 reset 之后的执行(例如尝试次数增加或状态先离开 failed),不能把重试前的 failed 当作新结果。
  4. 线程:编排放在 Service 内,用非阻塞的状态调度推进;不得持锁或在执行采购的线程上阻塞等待;继续复用现有执行器和 TaskExecutionMutex;不依赖 Fragment 生命周期。
  5. 跳过与停止:
    • 跳过:仅限业务资格拒绝(过期、已有更新任务、可能已下单等)。
    • 停止整轮:设备忙(每条之间有界复核后仍忙)、断网、鉴权或无障碍异常、验证码或风控、出现 order_result_unknown。检查范围包括采集任务和未提交的结果,不只看采购的 pending/running。
    • 采纳「新工作到来就停止后续重购」,不与正常队列交替执行,比原正文的「接受交替」更简单可控。
  6. 生命周期:切到 PDD 或切换 Tab 不算关闭 App,不停止;进程死亡后不恢复整轮;停止按钮只停后续,正在执行或已提交的任务按原流程结束;单条超时只停编排,不改任务状态、不取消、不重新下单。
  7. 测试:按 Codex 列表补回归,覆盖:
    • 跨页边界、读取期间新增任务;
    • 同秒排序、60 秒链式分组;
    • 每条只处理一次;
    • reset 响应丢失与幂等重发;
    • 回读到旧状态;
    • busy、结果待核对;
    • 停止、切后台、进程死亡;
    • unresolved 任务的规格探测路径。
      UI 只做按钮替换、一次确认和轻量进度。

措辞更正

正文「没有 backfill: 标记,说明回填功能从未被使用」证据过强,应改为「线上未查到 backfill: 标记」。不影响用户已确认的入口替换决定。

仍待用户决定

  • 「只处理最后一批」还是「列出本设备最近几批(例如 5 批)供选择」(Claude Code 已于 2026-10-08 向用户提出,尚未答复)。
  • 第 5 点「新工作到来即停止后续重购」需用户确认(替代原正文的交替执行)。
## 方案讨论共识(2026-10-08,Claude Code,回复 SynapBus #99/#100) 依据 Codex 审核意见(核对基线 main `e450ac2`)。Claude Code 已独立核对相关代码,7 点全部采纳,以下为最小可落地共识。本评论不修改正文;整合进正文需用户授权。 ### 已核实的代码事实 - `reset.go:90`:仅当 `specSource != "unresolved"` 且规格不完整时拒绝;`unresolved` 任务允许 reset 并进入规格探测。**正文「规格快照不完整时拒绝」表述不准确,应更正**,编排侧不得额外阻断 unresolved。 - `reset.go:74-82`:同一 requestId 的重放返回 `Replayed=true`,`Status` 固定为 `pending`,不是实时状态。 - `AgentForegroundService.kt:84-88`:`executor`(单线程调度)、`taskExecutor`(单线程)及 `TaskExecutionMutex`。 - 采购记录接口按 `created_at DESC, id DESC` 排序,offset 分页,每页最多 50 条(`agent_history.go`)。 ### 共识 1. **批次推算**:保留 60 秒相邻间隔(用户已选)。读取全部状态(不按 failed 过滤),按需跨页直到找到边界,按 taskId 去重,形成本轮固定快照。 - 漂移处理(建议的简单做法):倒序 + offset 时,新任务插入只会让后续页出现重复(去重即可),不会漏读;读完后重读第一页,若最新任务的 taskId 与开始时不同,说明期间有新任务进入,直接不开始(与「有未结束任务不开始」一致)。无法完整确定边界时不开始。不新增服务端批次表。 2. **资格**:只对 `status=failed && retryable=true` 发起 reset,其余显示跳过原因;每条执行前重新读取一次资格;服务端 reset 为最终依据。 3. **幂等与回读**:每条任务在本轮固定一个 requestId;请求超时或响应不明时,用同一 requestId 重发或回读详情,不明确就停止整轮,不换新 UUID、不跳到下一条。等待结果时必须确认看到的是本次 reset 之后的执行(例如尝试次数增加或状态先离开 failed),不能把重试前的 failed 当作新结果。 4. **线程**:编排放在 Service 内,用非阻塞的状态调度推进;不得持锁或在执行采购的线程上阻塞等待;继续复用现有执行器和 `TaskExecutionMutex`;不依赖 Fragment 生命周期。 5. **跳过与停止**: - 跳过:仅限业务资格拒绝(过期、已有更新任务、可能已下单等)。 - 停止整轮:设备忙(每条之间有界复核后仍忙)、断网、鉴权或无障碍异常、验证码或风控、出现 `order_result_unknown`。检查范围包括采集任务和未提交的结果,不只看采购的 pending/running。 - **采纳「新工作到来就停止后续重购」**,不与正常队列交替执行,比原正文的「接受交替」更简单可控。 6. **生命周期**:切到 PDD 或切换 Tab 不算关闭 App,不停止;进程死亡后不恢复整轮;停止按钮只停后续,正在执行或已提交的任务按原流程结束;单条超时只停编排,不改任务状态、不取消、不重新下单。 7. **测试**:按 Codex 列表补回归,覆盖: - 跨页边界、读取期间新增任务; - 同秒排序、60 秒链式分组; - 每条只处理一次; - reset 响应丢失与幂等重发; - 回读到旧状态; - busy、结果待核对; - 停止、切后台、进程死亡; - unresolved 任务的规格探测路径。 UI 只做按钮替换、一次确认和轻量进度。 ### 措辞更正 正文「没有 `backfill:` 标记,说明回填功能从未被使用」证据过强,应改为「线上未查到 `backfill:` 标记」。不影响用户已确认的入口替换决定。 ### 仍待用户决定 - 「只处理最后一批」还是「列出本设备最近几批(例如 5 批)供选择」(Claude Code 已于 2026-10-08 向用户提出,尚未答复)。 - 第 5 点「新工作到来即停止后续重购」需用户确认(替代原正文的交替执行)。
Author
Owner

v1 原型待审核(2026-10-08)

已按用户「先做 #367 的原型」授权使用 QuantUX MCP 制作,正文设计证据已更新。

  • 预览:https://qux.ilapage.cn/#/test.html?h=a2aa10aNyRLY23uxGBSmSfy1ozCYe9uGteBjvzym8zM8RuJ1MTLzKdcRAYDK&log=false
  • App ID 6ac75e93191a826306a8026a,v1,lastUUID 11808。
  • 先点 Next → Start 进入;右上“场景目录”用于审阅异常,非正式业务入口。
  • 保留既有采购页;只替换重购入口,并展示一次确认、进度/停止/摘要以及异常。包含第二次仅重购剩余失败任务。拟定单条等待15分钟随原型待确认。
  • 实际浏览器点击主链路、再次重购、切Tab、通知停止和12类空/异常场景通过;无pageerror;模型边界/连线回读通过。使用 props.label,文字已目视确认。
  • 无生产代码、数据库/权限、Admin接口或真机操作;无APK构建;未导出HTML。原型尚未通过,不把设计制作视为实施或真实采购授权。
  • 无长期已实施规则变化,跳过Wiki更新和同步。
### v1 原型待审核(2026-10-08) 已按用户「先做 #367 的原型」授权使用 QuantUX MCP 制作,正文设计证据已更新。 - 预览:https://qux.ilapage.cn/#/test.html?h=a2aa10aNyRLY23uxGBSmSfy1ozCYe9uGteBjvzym8zM8RuJ1MTLzKdcRAYDK&log=false - App ID `6ac75e93191a826306a8026a`,v1,lastUUID `11808`。 - 先点 Next → Start 进入;右上“场景目录”用于审阅异常,非正式业务入口。 - 保留既有采购页;只替换重购入口,并展示一次确认、进度/停止/摘要以及异常。包含第二次仅重购剩余失败任务。拟定单条等待15分钟随原型待确认。 - 实际浏览器点击主链路、再次重购、切Tab、通知停止和12类空/异常场景通过;无pageerror;模型边界/连线回读通过。使用 props.label,文字已目视确认。 - 无生产代码、数据库/权限、Admin接口或真机操作;无APK构建;未导出HTML。原型尚未通过,不把设计制作视为实施或真实采购授权。 - 无长期已实施规则变化,跳过Wiki更新和同步。
Author
Owner

原型审核通过(2026-10-08 17:32,Asia/Shanghai)

用户在 Codex 会话明确表示「#367原型通过审核」。已将确认人、时间、范围整合进正文。

确认版本:QuantUX App 6ac75e93191a826306a8026a,v1,lastUUID=11808;覆盖最后一批重购入口、一次确认、进度/停止/摘要及异常状态,单条等待上限固定15分钟,超时只停编排。

本轮只记录原型确认,未修改已审阅模型或生产代码。工单保持 open,功能验收项不勾选;仍待用户明确授权生产实施,真机采购、合并与发布须另行确认。

### 原型审核通过(2026-10-08 17:32,Asia/Shanghai) 用户在 Codex 会话明确表示「#367原型通过审核」。已将确认人、时间、范围整合进正文。 确认版本:QuantUX App `6ac75e93191a826306a8026a`,v1,`lastUUID=11808`;覆盖最后一批重购入口、一次确认、进度/停止/摘要及异常状态,单条等待上限固定15分钟,超时只停编排。 本轮只记录原型确认,未修改已审阅模型或生产代码。工单保持 open,功能验收项不勾选;仍待用户明确授权生产实施,真机采购、合并与发布须另行确认。
Author
Owner

开始实施(2026-10-08)

用户已确认 QuantUX v1,并在随后会话明确授权实施、测试、构建、提交及推送工单分支。范围仅 Android;不执行真机采购、不合并 main、不发布或安装。

基线 e450ac28989de6827328b411e4bdc050dded9ab3,worktree D:/OPC/goauto-worktrees/issue-367,分支 feat/367-last-batch-repurchase。

实施顺序:

  1. TDD 实现全状态分页批次发现(60秒邻接、50条跨页、30天边界、去重与头部复核)。
  2. TDD 实现 Service 非阻塞逐条编排(固定 requestId、attempt 关联、执行/上传收尾、新任务/停止/环境异常及15分钟上限),复用原执行器。
  3. 按已确认原型替换入口、一次确认、进度/摘要及页面和通知停止;保留回填实现和原单条重试。
  4. Android 回归与 APK 构建、规格/质量审核;更新长期 Wiki 并在线回读、同步检查;提交推送并集中回写待验收。真机批量采购未授权,不计为验证通过。
## 开始实施(2026-10-08) 用户已确认 QuantUX v1,并在随后会话明确授权实施、测试、构建、提交及推送工单分支。范围仅 Android;不执行真机采购、不合并 main、不发布或安装。 基线 `e450ac28989de6827328b411e4bdc050dded9ab3`,worktree `D:/OPC/goauto-worktrees/issue-367`,分支 `feat/367-last-batch-repurchase`。 实施顺序: 1. TDD 实现全状态分页批次发现(60秒邻接、50条跨页、30天边界、去重与头部复核)。 2. TDD 实现 Service 非阻塞逐条编排(固定 requestId、attempt 关联、执行/上传收尾、新任务/停止/环境异常及15分钟上限),复用原执行器。 3. 按已确认原型替换入口、一次确认、进度/摘要及页面和通知停止;保留回填实现和原单条重试。 4. Android 回归与 APK 构建、规格/质量审核;更新长期 Wiki 并在线回读、同步检查;提交推送并集中回写待验收。真机批量采购未授权,不计为验证通过。
Author
Owner

已实现并推送,待验收

#367 按已确认 v1 完成Android重购入口及最后一批串行原任务重试。分支 feat/367-last-batch-repurchase,HEAD 136765d(实现 5430dc1);320项受影响回归与Debug APK构建通过,独立规格/质量复审通过,Wiki两页在线回读及镜像同步检查完成。完整测试曾在既有图搜恢复测试长时间空转后中止,不宣称完整全套通过;strict harness既有未登记镜像问题保留。

APK、SHA256、测试范围及未验证项已整合进正文。未合并main、未安装/发布、未执行真机采购。工单保持open待验收,worktree保留。

## 已实现并推送,待验收 #367 按已确认 v1 完成Android重购入口及最后一批串行原任务重试。分支 `feat/367-last-batch-repurchase`,HEAD `136765d`(实现 `5430dc1`);320项受影响回归与Debug APK构建通过,独立规格/质量复审通过,Wiki两页在线回读及镜像同步检查完成。完整测试曾在既有图搜恢复测试长时间空转后中止,不宣称完整全套通过;strict harness既有未登记镜像问题保留。 APK、SHA256、测试范围及未验证项已整合进正文。**未合并main、未安装/发布、未执行真机采购**。工单保持open待验收,worktree保留。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#367