fix(android): 限定同任务一次性页面复用,采购导航按路径等待商品页稳定 #373

Open
opened 2026-10-09 12:05:35 +08:00 by ila · 7 comments
Owner

This was generated by AI during triage.

基本信息

  • 类型:缺陷(Android 采购:正式采购阶段复用了其他任务的商品页,存在在错误商品上创建订单的风险)。
  • 风险等级:高(涉及创建订单)。实施、装机和真机验证都需要用户另行确认。
  • 状态:已合并并推送 main,联合验证通过,待真机验收;未安装、未发布。2026-10-09 用户拒绝新增分享操作,接受“控制导航顺序+等待页面稳定”的最小修复与非商品ID核验边界,并要求重购各任务给予充分商品页加载时间。此前v3完整身份证明目标由下列v4目标替代;诊断证据继续有效。
  • 来源:2026-10-09 用户要求分析「codex 把 #364 #365 #366 #367 #368 #370 合并到 main,最新 apk 安装到 192.168.0.9:39459 后,最后一批的 7 个采购任务重试都失败」的原因。Claude Code 分析后,用户确认:「1和2建工单」(本单为第 1 项)。
  • 关联:#226(引入「采购阶段复用当前商品页」)、#367(重购最后一批)、#374(下单前规格复核误判,第 2 项)。

已核验事实

线上数据与失败现场(只读,2026-10-09)

设备「采购2」(device 7,Agent 0.9.69-370-diag1)在 11:49~11:53 按 2131 → 2125 顺序重试 7 个任务,全部是 purchase 阶段(没有重新做规格探测)。失败现场快照(服务端 6 份 + 手机本地 1 份未上传)显示:

任务 本任务商品 现场实际所在商品 结果
2130 982178566127 2131 的商品 825093359197 PURCHASE_SPEC_TARGET_NOT_VISIBLE
2127 669950214847 2128 的商品 965717773155 PURCHASE_SPEC_TARGET_NOT_VISIBLE
2126 965717773155 2128 的商品 965717773155(碰巧相同) 规格已正确选中,被另一单的问题拦下
2125 226122195693 2126 的商品 965717773155(手机本地快照,「已选」仍是 2126 的规格) PURCHASE_SPEC_TARGET_NOT_VISIBLE

快照只在本机解析规格面板文字,未输出地址和姓名,用完已删除。

代码事实(origin/main e26743c817275137f7dc8a3659461d552371b9e3)

  • PurchaseRehearsalExecutor.kt:127-131:purchase 阶段遇到 OPEN_PRODUCT 时,若 canReuseCurrentProduct(input) 为真就跳过打开商品。
  • PurchaseRehearsalExecutor.kt:206:canReuseCurrentProduct 只判断 screen.problem == null && screen.hasPurchaseProductEvidence()。hasPurchaseProductEvidence(PddProductDetailCollector.kt:237)只要求是 PDD 包、有规格面板或规格入口或商品标题,不核对是不是本任务的商品。注释本意是只给「同一任务 spec_probe 后紧接的 purchase」复用。
  • verifyProduct(:314)同样只看 hasPurchaseProductEvidence。PDD 页面不显示 goods_id,界面上无法核对商品编号;之后的规格、数量、价格复核和 finalConfirmation 都不核对商品身份。
  • 代码路径:任务结束且满足空闲返回条件时,evaluateIdleReturn 可返回 Agent;#367 重购期间跳过该返回(AgentForegroundService.kt:1384),任务可能直接进入 purchase。这使跨任务复用旧商品页的风险更易暴露,但不能据此断定本批任务都跳过了打开链接。本批具体触发路径尚未证实,须结合下方用户观察和导航诊断判断。
  • openProduct(:261)调用 openLink 后,只要连续 2 次(间隔 100ms)读到「商品页证据」就认为打开成功。如果打开前 PDD 已经停在别的商品页,这 200ms 内读到的可能还是旧页面。

更正(2026-10-09,用户观察)

用户观察到:重购时每个任务都先用浏览器打开 PDD 链接,再跳转到 PDD 商品页。说明本批「打开商品」实际执行了,而不是被 canReuseCurrentProduct 跳过。更可能的过程(推断):

  • 正式采购用 PddLinkLauncher.open(url, preferDirect = true)(AgentForegroundService.kt:786)。直达方式(setPackage PDD + NEW_TASK|CLEAR_TASK,#232)只有抛异常时才退回浏览器(PddLaunchFallback.kt:5-6)。手机上只读查询确认 PDD 能处理该链接(MainFrameActivity),直达失败的原因尚未查明;当时的系统日志已被覆盖,本地也没有记录。手机为 Android 16 / ColorOS 16,GoAuto 无悬浮窗权限,推测与系统限制后台拉起其他应用有关,未证实。
  • 浏览器方式不清除 PDD 原有任务栈。点击「打开拼多多APP」后,PDD 先回到前台并显示上一个商品的页面;openProduct 连续 2 次(间隔 100ms)读到商品页证据就判定成功,于是把旧页面当成本任务商品。现场显示一两分钟后仍停在旧商品上。

本单拟分别处理两种风险(跳过打开、打开后误认旧页面);一次性交接只处理前者,后者仍须补齐可验证的旧页排除判据,不能宣称方案 1 已解决本批故障。

推断(未证实)

  • 不只是 #367:冷却期内来了下一个直接进入 purchase 阶段的任务(例如人工重试、重置后的任务,或在 AI 匹配等待期间设备先执行了其他任务的探测),同样可能复用错误页面。
  • 如果上一个商品恰好有同名的颜色和尺码,后续复核可能全部通过,最终在错误的商品上创建订单。本批没有发生,是因为目标规格在错误商品上找不到。

2026-10-09 导航取证补充(已授权、不下单)

代码 2c58d58(基于 e26743c),调试包 0.9.69-373-nav-diag3 / code 82。只读采样沿用采购的默认商品结构解析及“连续2次”旧判据;不调用采购执行器、不执行规格选择/地址/订单动作。时间为探针开始后的单调时钟毫秒(包含基线读取,不是固定 sleep 秒数);采样和真任务执行调度有差异。

  1. 浏览器尚未出现时就误认旧页的风险已在真机复现。 从已有商品 A 请求打开不同商品 B,run 7fe81efc-015e-488d-8ce7-830f13b99f43:
    • t=649:浏览器启动请求 ACCEPTED。
    • t=747:前台仍为 PDD,窗口114,标题与打开前相同,商品结构成立。
    • t=921:旧“连续2次商品结构”判据已经满足,但仍是旧标题;诊断明确 identityVerified=false。
    • t=1739:才观察到浏览器前台。
    • t=11401:唯一原生“打开拼多多APP”入口点击返回 SUCCESS。
    • t=12189:PDD过渡页;t=13218:不同标题的商品结构出现,窗口118。
    • t=20333:观察预算耗尽停止,未继续动作。
      这是发起浏览器后、浏览器真正前台之前的旧页误认,不仅是此前推测的“浏览器返回PDD后仍旧页”。仅增加小固定延时不能代替阶段判断。
  2. 窗口变化不足以证明新商品。 后续从 B 直达 A,run 43e22c1d-19fb-48ee-a2d6-9c9291adf90e:基线窗口118;t=671直达请求ACCEPTED;t=897窗口已变120,但解析标题仍与旧页相同、商品结构成立;t=1585才出现不同标题并满足旧判据。观察至约20秒结束。该证据反对“windowId变了即可解锁”;标题不同本身也不是目标goodsId证明。
  3. 本轮直达均未抛出异常,没有复现原批次为何自动退回浏览器。上述浏览器对照是人工指定该路径,不冒充实际 fallback 触发原因;shell触发可能影响系统后台启动许可,不能等同生产后台任务。
  4. 探针没有读取任务映射、没有领取/创建/重试采购任务。源goodsId只用于构造目标链接,不被当作界面回读。全部记录仅结构标量及标题内存比较布尔/枚举,无页面标题原文、原始树或整屏截图。
  5. 当前已获得旧判据过早通过的可复核时序,仍未确定完整商品身份成功判据,也未测量同任务探测→AI匹配→领取采购的有效交接间隔。因此一次性交接TTL与正式放行修复尚不能宣称完成。

v4 目标与用户确认边界

用户先授权“补齐两项方案和回归测试,再实施正式修复”,明确拒绝新增分享,随后接受最小导航等待方案并提出“重购最后一批时,每个任务之间间隔足够多的时间来等待pdd app商品页加载成功”。

  • 修复跨任务无条件复用,以及浏览器尚未出现就提前把PDD旧页作为导航完成的问题。
  • 等待发生在每个任务自身发起链接之后,不能仅在两任务之间空等。复用之外的每次重新打开都执行,#367批次逻辑不改。
  • 不读取分享链接、不回读页面goodsId;不能保证PDD忽略深链或返回稳定旧页时一定识别,也不能把稳定标题/窗口称为商品身份。 本版目标不再是v3的“必须证明当前页属于任务商品”。同名规格/任意人工切页仍有剩余风险;无法接受该边界时不能使用本版代替身份核验。
  • 不改Server/Web/API/数据库、采集器、规格选择/地址/下单逻辑、#374;不执行付款。本轮真机仅导航,不执行真实采购。

v4 实施方案与参数

A. 一次性同任务交接(30秒复用上限)

  1. 服务内存凭证绑定taskId、goodsId、源spec_probe attemptId、本地执行代次、无障碍实例及单调时钟探测完成时间。不持久化、不跨进程。
  2. 探测正常结束、结果安全保存且首次上传成功后才生成;生成时间锚定探测完成,不因上传/轮询/网络恢复续期。失败、重放上传不生成。
  3. 下一次业务执行在现有设备互斥/串行边界内先取出清空,再校验仅同任务同商品purchase可消费一次。来源与目标attempt不同为正常;源attempt只溯源,不比较相等。
  4. 有效年龄 0 <= age < 30_000ms。依据:当前Agent心跳15秒,探测结束后同步Outbox提交,Server事务后同步匹配,返回后释放互斥并triggerSync领取;网络请求与AI可能延长,因此30秒是保守政策(两个心跳间隔),不是实测最大时延/分位数,也不保证慢AI可复用。超过上限重新打开,不直接失败。
  5. 其他执行、重试、进程/服务/无障碍重建、主动打开链接/返回Agent/回首页使凭证无效。仍检查当前PDD商品结构;已知前台变化不复用。人工在同包内切页无法完全感知,记录限制。
  6. PurchaseExecutionInput 增加默认false的本地复用布尔,仅服务计算后传入;不能因屏幕有商品结构自行允许。

B. 导航等待(最长30秒,不无条件睡30秒)

  1. 保留PddLinkLauncher原直达NEW_TASK|CLEAR_TASK及异常回退路径;由启动结果事件告知执行器本次最终接受路径。未知路径不得当作直达提前放行。
  2. BROWSER必须先观察到受支持浏览器包,再观察PDD;浏览器出现前的PDD样本忽略。只允许既有浏览器打开PDD入口,固定重试间隔至少1秒,不在PDD内执行导航点击。
  3. DIRECT请求成功后至少经过3秒缓冲;BROWSER回到PDD后至少经过3秒缓冲。随后商品页至少连续稳定1秒且至少3次有效读取才放行。缓冲与稳定计时可重叠,读取到非PDD、空根、无商品结构、候选商品结构变动就重置稳定计时;登录/风控/无效商品按现有明确失败。
  4. 稳定特征仅用内存中的标题/规格入口或面板结构,忽略销量、拼单滚动与价格动态;不落盘页面文本。特征缺失或不稳定不能仅靠次数放行。此稳定检查是就绪证据,不是目标身份。
  5. 轮询间隔100ms,总预算从发起打开前以单调时钟计30秒,同时设最大轮数防坏时钟测试/异常;耗时系统调用返回后再校验预算,超时不再派发点击。缓冲值是基于diag3约1.6秒同包切换的初始保守参数,非平台加载保证;浏览器约13.2秒才出现新结构的现场由路径顺序+30秒预算覆盖。
  6. 超时返回PDD_DETAIL_ENTRY_FAILED,不执行后续规格/地址/订单动作。不调整任务总超时、网络超时、服务端任务状态机。
  7. 记录任务绑定的复用/重开原因、实际导航路径、耗时和固定结果,不记录页面原文;不增加普通流程原始树或截图。

实施步骤(本工单为唯一计划源)

  • 在现有issue-373 worktree中先为默认不复用、跨任务同名规格、交接一次消费/边界写失败测试。
  • 实现纯交接策略及AgentForegroundService最小接线,覆盖所有既有设备执行入口、离页入口;不改现有任务领取和互斥语义。
  • 为浏览器前旧页、路径顺序、慢加载、短暂稳定、超时零规格点击写失败测试;再实现纯导航就绪策略及PurchaseRehearsalExecutor接线。
  • 运行相关Android单测、release编译、debug构建;独立审查范围与并发/生命周期接线。保留原诊断探针与已有证据。
  • 更新长期Wiki业务规则/运维说明,回读revision,一轮sync和check。提交推送分支、回写证据待验收;不自动合并或发布。

验收与回归(v4,替代旧版绝对身份测试)

以下勾选为代码与自动化回归完成,不表示真实采购验收通过。

  • 无凭证/跨任务/不同商品/重复消费/非purchase/中途其他执行/服务或无障碍重建默认重开。
  • 合法同任务探测→采购一次复用;29,999ms可用,30,000ms及负年龄不可用;上传失败与重放不生成/续期。
  • 同名规格不能使跨任务复用成立;重购多任务每次独立导航。
  • 复现diag3旧页t921、浏览器t1739:浏览器之前不放行、不点规格。
  • 浏览器始终未出现即使旧PDD稳定也超时;返回PDD后不足3秒或不足稳定1秒/3读不能继续;标题/结构变化重置稳定计时。
  • 直达慢加载与快速同包切页有确定测试,不强制必须采到空白帧;直达与浏览器异常诊断保留。
  • 30秒预算与边界、耗时读取后超时、首页/空根/登录/风控/无效商品明确失败,后续规格/地址/下单次数0。
  • 稳定旧页与同包人工切商品不保证被识别,测试/文档不得宣称已获得goodsId身份核验。
  • 正式修复包真机导航/真实批量采购验收待执行与授权;相关单测、构建、review已通过,不能替代真机结论。

文档、风险与回退

Wiki Business-Rules-and-Glossary更新复用及导航等待边界,Deployment-and-Operations记录版本/验证限制;API/数据库无变化。额外缓冲每次重开最少约3秒,加载慢时等至30秒;浏览器转瞬未被采到会安全超时,商品稳定不等于身份正确。代码可回退无迁移,但回退会恢复跨任务复用风险。工单待用户验收,不因诊断完成或自动化通过关闭。

合并 main(2026-10-09)

用户授权按 #373 → #374 → 处理镜像冲突 → 联合回归与构建 → 推送 main 执行。main 合并提交 555a954605a83c12457ed1ada86eb732fe3bb023,最新文档提交 3ee8dfc0aa93ef9020786244cce29c487631ddbe,远端已确认。联合25套件478项全通过,APK构建与release单测源码编译通过。未安装、未执行真实采购、未部署或重启服务;工单仍待人工验收。

> *This was generated by AI during triage.* ## 基本信息 - 类型:缺陷(Android 采购:正式采购阶段复用了**其他任务**的商品页,存在在错误商品上创建订单的风险)。 - 风险等级:**高**(涉及创建订单)。实施、装机和真机验证都需要用户另行确认。 - 状态:**已合并并推送 main,联合验证通过,待真机验收;未安装、未发布**。2026-10-09 用户拒绝新增分享操作,接受“控制导航顺序+等待页面稳定”的最小修复与非商品ID核验边界,并要求重购各任务给予充分商品页加载时间。此前v3完整身份证明目标由下列v4目标替代;诊断证据继续有效。 - 来源:2026-10-09 用户要求分析「codex 把 #364 #365 #366 #367 #368 #370 合并到 main,最新 apk 安装到 192.168.0.9:39459 后,最后一批的 7 个采购任务重试都失败」的原因。Claude Code 分析后,用户确认:「1和2建工单」(本单为第 1 项)。 - 关联:#226(引入「采购阶段复用当前商品页」)、#367(重购最后一批)、#374(下单前规格复核误判,第 2 项)。 ## 已核验事实 ### 线上数据与失败现场(只读,2026-10-09) 设备「采购2」(device 7,Agent `0.9.69-370-diag1`)在 11:49~11:53 按 2131 → 2125 顺序重试 7 个任务,全部是 `purchase` 阶段(没有重新做规格探测)。失败现场快照(服务端 6 份 + 手机本地 1 份未上传)显示: | 任务 | 本任务商品 | 现场实际所在商品 | 结果 | |---|---|---|---| | 2130 | 982178566127 | 2131 的商品 825093359197 | `PURCHASE_SPEC_TARGET_NOT_VISIBLE` | | 2127 | 669950214847 | 2128 的商品 965717773155 | `PURCHASE_SPEC_TARGET_NOT_VISIBLE` | | 2126 | 965717773155 | 2128 的商品 965717773155(碰巧相同) | 规格已正确选中,被另一单的问题拦下 | | 2125 | 226122195693 | 2126 的商品 965717773155(手机本地快照,「已选」仍是 2126 的规格) | `PURCHASE_SPEC_TARGET_NOT_VISIBLE` | 快照只在本机解析规格面板文字,未输出地址和姓名,用完已删除。 ### 代码事实(`origin/main` `e26743c817275137f7dc8a3659461d552371b9e3`) - `PurchaseRehearsalExecutor.kt:127-131`:`purchase` 阶段遇到 `OPEN_PRODUCT` 时,若 `canReuseCurrentProduct(input)` 为真就跳过打开商品。 - `PurchaseRehearsalExecutor.kt:206`:`canReuseCurrentProduct` 只判断 `screen.problem == null && screen.hasPurchaseProductEvidence()`。`hasPurchaseProductEvidence`(`PddProductDetailCollector.kt:237`)只要求是 PDD 包、有规格面板或规格入口或商品标题,**不核对是不是本任务的商品**。注释本意是只给「同一任务 spec_probe 后紧接的 purchase」复用。 - `verifyProduct`(`:314`)同样只看 `hasPurchaseProductEvidence`。PDD 页面不显示 goods_id,界面上无法核对商品编号;之后的规格、数量、价格复核和 `finalConfirmation` 都不核对商品身份。 - 代码路径:任务结束且满足空闲返回条件时,`evaluateIdleReturn` 可返回 Agent;#367 重购期间跳过该返回(`AgentForegroundService.kt:1384`),任务可能直接进入 `purchase`。这使跨任务复用旧商品页的风险更易暴露,但不能据此断定本批任务都跳过了打开链接。本批具体触发路径尚未证实,须结合下方用户观察和导航诊断判断。 - `openProduct`(`:261`)调用 `openLink` 后,只要连续 2 次(间隔 100ms)读到「商品页证据」就认为打开成功。如果打开前 PDD 已经停在别的商品页,这 200ms 内读到的可能还是旧页面。 ### 更正(2026-10-09,用户观察) 用户观察到:重购时**每个任务都先用浏览器打开 PDD 链接,再跳转到 PDD 商品页**。说明本批「打开商品」实际执行了,而不是被 `canReuseCurrentProduct` 跳过。更可能的过程(推断): - 正式采购用 `PddLinkLauncher.open(url, preferDirect = true)`(`AgentForegroundService.kt:786`)。直达方式(`setPackage` PDD + `NEW_TASK|CLEAR_TASK`,#232)只有抛异常时才退回浏览器(`PddLaunchFallback.kt:5-6`)。手机上只读查询确认 PDD 能处理该链接(`MainFrameActivity`),直达失败的原因尚未查明;当时的系统日志已被覆盖,本地也没有记录。手机为 Android 16 / ColorOS 16,GoAuto 无悬浮窗权限,推测与系统限制后台拉起其他应用有关,未证实。 - 浏览器方式不清除 PDD 原有任务栈。点击「打开拼多多APP」后,PDD 先回到前台并显示上一个商品的页面;`openProduct` 连续 2 次(间隔 100ms)读到商品页证据就判定成功,于是把旧页面当成本任务商品。现场显示一两分钟后仍停在旧商品上。 本单拟分别处理两种风险(跳过打开、打开后误认旧页面);一次性交接只处理前者,后者仍须补齐可验证的旧页排除判据,不能宣称方案 1 已解决本批故障。 ### 推断(未证实) - 不只是 #367:冷却期内来了下一个直接进入 `purchase` 阶段的任务(例如人工重试、重置后的任务,或在 AI 匹配等待期间设备先执行了其他任务的探测),同样可能复用错误页面。 - 如果上一个商品恰好有同名的颜色和尺码,后续复核可能全部通过,最终在**错误的商品**上创建订单。本批没有发生,是因为目标规格在错误商品上找不到。 ### 2026-10-09 导航取证补充(已授权、不下单) 代码 `2c58d58`(基于 `e26743c`),调试包 `0.9.69-373-nav-diag3 / code 82`。只读采样沿用采购的默认商品结构解析及“连续2次”旧判据;不调用采购执行器、不执行规格选择/地址/订单动作。时间为探针开始后的单调时钟毫秒(包含基线读取,不是固定 sleep 秒数);采样和真任务执行调度有差异。 1. **浏览器尚未出现时就误认旧页的风险已在真机复现。** 从已有商品 A 请求打开不同商品 B,run `7fe81efc-015e-488d-8ce7-830f13b99f43`: - t=649:浏览器启动请求 ACCEPTED。 - t=747:前台仍为 PDD,窗口114,标题与打开前相同,商品结构成立。 - **t=921:旧“连续2次商品结构”判据已经满足,但仍是旧标题;诊断明确 identityVerified=false。** - t=1739:才观察到浏览器前台。 - t=11401:唯一原生“打开拼多多APP”入口点击返回 SUCCESS。 - t=12189:PDD过渡页;t=13218:不同标题的商品结构出现,窗口118。 - t=20333:观察预算耗尽停止,未继续动作。 这是**发起浏览器后、浏览器真正前台之前**的旧页误认,不仅是此前推测的“浏览器返回PDD后仍旧页”。仅增加小固定延时不能代替阶段判断。 2. **窗口变化不足以证明新商品。** 后续从 B 直达 A,run `43e22c1d-19fb-48ee-a2d6-9c9291adf90e`:基线窗口118;t=671直达请求ACCEPTED;**t=897窗口已变120,但解析标题仍与旧页相同**、商品结构成立;t=1585才出现不同标题并满足旧判据。观察至约20秒结束。该证据反对“windowId变了即可解锁”;标题不同本身也不是目标goodsId证明。 3. 本轮直达均未抛出异常,**没有复现原批次为何自动退回浏览器**。上述浏览器对照是人工指定该路径,不冒充实际 fallback 触发原因;shell触发可能影响系统后台启动许可,不能等同生产后台任务。 4. 探针没有读取任务映射、没有领取/创建/重试采购任务。源goodsId只用于构造目标链接,不被当作界面回读。全部记录仅结构标量及标题内存比较布尔/枚举,无页面标题原文、原始树或整屏截图。 5. 当前已获得旧判据过早通过的可复核时序,**仍未确定完整商品身份成功判据**,也未测量同任务探测→AI匹配→领取采购的有效交接间隔。因此一次性交接TTL与正式放行修复尚不能宣称完成。 ## v4 目标与用户确认边界 用户先授权“补齐两项方案和回归测试,再实施正式修复”,明确拒绝新增分享,随后接受最小导航等待方案并提出“重购最后一批时,每个任务之间间隔足够多的时间来等待pdd app商品页加载成功”。 - 修复跨任务无条件复用,以及浏览器尚未出现就提前把PDD旧页作为导航完成的问题。 - 等待发生在每个任务自身发起链接之后,不能仅在两任务之间空等。复用之外的每次重新打开都执行,#367批次逻辑不改。 - **不读取分享链接、不回读页面goodsId;不能保证PDD忽略深链或返回稳定旧页时一定识别,也不能把稳定标题/窗口称为商品身份。** 本版目标不再是v3的“必须证明当前页属于任务商品”。同名规格/任意人工切页仍有剩余风险;无法接受该边界时不能使用本版代替身份核验。 - 不改Server/Web/API/数据库、采集器、规格选择/地址/下单逻辑、#374;不执行付款。本轮真机仅导航,不执行真实采购。 ## v4 实施方案与参数 ### A. 一次性同任务交接(30秒复用上限) 1. 服务内存凭证绑定taskId、goodsId、源spec_probe attemptId、本地执行代次、无障碍实例及单调时钟探测完成时间。不持久化、不跨进程。 2. 探测正常结束、结果安全保存且首次上传成功后才生成;生成时间锚定探测完成,不因上传/轮询/网络恢复续期。失败、重放上传不生成。 3. 下一次业务执行在现有设备互斥/串行边界内先取出清空,再校验仅同任务同商品purchase可消费一次。来源与目标attempt不同为正常;源attempt只溯源,不比较相等。 4. 有效年龄 `0 <= age < 30_000ms`。依据:当前Agent心跳15秒,探测结束后同步Outbox提交,Server事务后同步匹配,返回后释放互斥并triggerSync领取;网络请求与AI可能延长,因此30秒是保守政策(两个心跳间隔),不是实测最大时延/分位数,也不保证慢AI可复用。超过上限重新打开,不直接失败。 5. 其他执行、重试、进程/服务/无障碍重建、主动打开链接/返回Agent/回首页使凭证无效。仍检查当前PDD商品结构;已知前台变化不复用。人工在同包内切页无法完全感知,记录限制。 6. `PurchaseExecutionInput` 增加默认false的本地复用布尔,仅服务计算后传入;不能因屏幕有商品结构自行允许。 ### B. 导航等待(最长30秒,不无条件睡30秒) 1. 保留PddLinkLauncher原直达NEW_TASK|CLEAR_TASK及异常回退路径;由启动结果事件告知执行器本次最终接受路径。未知路径不得当作直达提前放行。 2. BROWSER必须先观察到受支持浏览器包,再观察PDD;浏览器出现前的PDD样本忽略。只允许既有浏览器打开PDD入口,固定重试间隔至少1秒,不在PDD内执行导航点击。 3. DIRECT请求成功后至少经过3秒缓冲;BROWSER回到PDD后至少经过3秒缓冲。随后商品页至少连续稳定1秒且至少3次有效读取才放行。缓冲与稳定计时可重叠,读取到非PDD、空根、无商品结构、候选商品结构变动就重置稳定计时;登录/风控/无效商品按现有明确失败。 4. 稳定特征仅用内存中的标题/规格入口或面板结构,忽略销量、拼单滚动与价格动态;不落盘页面文本。特征缺失或不稳定不能仅靠次数放行。此稳定检查是就绪证据,不是目标身份。 5. 轮询间隔100ms,总预算从发起打开前以单调时钟计30秒,同时设最大轮数防坏时钟测试/异常;耗时系统调用返回后再校验预算,超时不再派发点击。缓冲值是基于diag3约1.6秒同包切换的初始保守参数,非平台加载保证;浏览器约13.2秒才出现新结构的现场由路径顺序+30秒预算覆盖。 6. 超时返回PDD_DETAIL_ENTRY_FAILED,不执行后续规格/地址/订单动作。不调整任务总超时、网络超时、服务端任务状态机。 7. 记录任务绑定的复用/重开原因、实际导航路径、耗时和固定结果,不记录页面原文;不增加普通流程原始树或截图。 ## 实施步骤(本工单为唯一计划源) - [x] 在现有issue-373 worktree中先为默认不复用、跨任务同名规格、交接一次消费/边界写失败测试。 - [x] 实现纯交接策略及AgentForegroundService最小接线,覆盖所有既有设备执行入口、离页入口;不改现有任务领取和互斥语义。 - [x] 为浏览器前旧页、路径顺序、慢加载、短暂稳定、超时零规格点击写失败测试;再实现纯导航就绪策略及PurchaseRehearsalExecutor接线。 - [x] 运行相关Android单测、release编译、debug构建;独立审查范围与并发/生命周期接线。保留原诊断探针与已有证据。 - [x] 更新长期Wiki业务规则/运维说明,回读revision,一轮sync和check。提交推送分支、回写证据待验收;不自动合并或发布。 ## 验收与回归(v4,替代旧版绝对身份测试) 以下勾选为代码与自动化回归完成,不表示真实采购验收通过。 - [x] 无凭证/跨任务/不同商品/重复消费/非purchase/中途其他执行/服务或无障碍重建默认重开。 - [x] 合法同任务探测→采购一次复用;29,999ms可用,30,000ms及负年龄不可用;上传失败与重放不生成/续期。 - [x] 同名规格不能使跨任务复用成立;重购多任务每次独立导航。 - [x] 复现diag3旧页t921、浏览器t1739:浏览器之前不放行、不点规格。 - [x] 浏览器始终未出现即使旧PDD稳定也超时;返回PDD后不足3秒或不足稳定1秒/3读不能继续;标题/结构变化重置稳定计时。 - [x] 直达慢加载与快速同包切页有确定测试,不强制必须采到空白帧;直达与浏览器异常诊断保留。 - [x] 30秒预算与边界、耗时读取后超时、首页/空根/登录/风控/无效商品明确失败,后续规格/地址/下单次数0。 - [x] 稳定旧页与同包人工切商品不保证被识别,测试/文档不得宣称已获得goodsId身份核验。 - [ ] 正式修复包真机导航/真实批量采购验收待执行与授权;相关单测、构建、review已通过,不能替代真机结论。 ## 文档、风险与回退 Wiki Business-Rules-and-Glossary更新复用及导航等待边界,Deployment-and-Operations记录版本/验证限制;API/数据库无变化。额外缓冲每次重开最少约3秒,加载慢时等至30秒;浏览器转瞬未被采到会安全超时,商品稳定不等于身份正确。代码可回退无迁移,但回退会恢复跨任务复用风险。工单待用户验收,不因诊断完成或自动化通过关闭。 ## 合并 main(2026-10-09) 用户授权按 #373 → #374 → 处理镜像冲突 → 联合回归与构建 → 推送 main 执行。main 合并提交 `555a954605a83c12457ed1ada86eb732fe3bb023`,最新文档提交 `3ee8dfc0aa93ef9020786244cce29c487631ddbe`,远端已确认。联合25套件478项全通过,APK构建与release单测源码编译通过。未安装、未执行真实采购、未部署或重启服务;工单仍待人工验收。
Author
Owner

2026-10-09 Claude Code 复核 Codex 审核意见(SynapBus #123/#124)

结论:Codex 对 #373 的 3 项意见核实成立,建议并入正文后再实施。以下行号以 origin/main e26743c 为准。

已核实

  1. 前台变化不能证明商品身份:GoAutoAccessibilityService.onAccessibilityEvent(:55-60)只在包名变化时递增 foregroundRevision;PDD 内部换商品不递增。正文方案 2 写的「以 currentForegroundRevision 变化作为打开成功前提」不成立,「先回 Agent」也只能证明离开过 PDD,不能证明回来的是新商品。
  2. 既有导航:PddNavigation.kt:39-42 的直达方式带 FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK,正式采购调用时 preferDirect = true。它会清掉 PDD 旧任务栈,但 startActivity 成功不代表目标商品已经加载,旧页面在切换完成前仍可能被读到。
  3. 交接记录应是一次性的:同意。spec_probe 与 purchase 是不同 attemptId,正文写的「taskId 和 attemptId」应改为:绑定 taskId、goodsId、来源 spec_probe 的 attemptId、本地执行代次,只允许紧接的那一次 purchase 消费一次,默认不复用。

建议修订正文(需用户确认后修改)

  • 方案 1 改为一次性交接凭证:spec_probe 正常结束时生成;下一次执行开始时,如果不是同一 taskId 的 purchase 就作废;purchase 读取后立即作废。服务或无障碍重建、进程重启后没有凭证,即不复用。统一在「每次执行开始」和「任何会操作 PDD 的入口」作废,不维护分散的黑名单。人工在 PDD 内切页无法可靠感知,所以只在紧接交接时复用,并保留现有页面证据检查。
  • 方案 2 改为:打开链接后,必须先看到旧页面消失的证据,再开始计算稳定商品页。可选的判断条件由实施时验证,例如活动窗口变化、或先读到非商品页的过渡状态。如果可以从无障碍窗口信息拿到 PDD 活动窗口 id,可以作为候选条件;失败现场快照的 manifest 中有窗口 id,但 UiSnapshot 是否提供还需实施时确认。**无法区分新旧页面时明确失败,不点击规格。**不把前台变化或「先回 Agent」当作充分证明。
  • 验收补充 Codex 列出的必测项:A→B 不同商品但规格同名;打开浏览器后回到旧 PDD 页;同包直达新页;同任务失败后再次重试(不复用);交接凭证只能用一次;中间执行其他路径或进程重启后失效;保留真正紧接的探测→采购不重复打开的回归。

未验证

未运行测试,未操作真机。旧页面消失的判断条件需要在实施时用真机现象确认。

## 2026-10-09 Claude Code 复核 Codex 审核意见(SynapBus #123/#124) **结论**:Codex 对 #373 的 3 项意见核实成立,建议并入正文后再实施。以下行号以 `origin/main` `e26743c` 为准。 ### 已核实 1. **前台变化不能证明商品身份**:`GoAutoAccessibilityService.onAccessibilityEvent`(:55-60)只在**包名变化**时递增 `foregroundRevision`;PDD 内部换商品不递增。正文方案 2 写的「以 `currentForegroundRevision` 变化作为打开成功前提」不成立,「先回 Agent」也只能证明离开过 PDD,不能证明回来的是新商品。 2. **既有导航**:`PddNavigation.kt:39-42` 的直达方式带 `FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK`,正式采购调用时 `preferDirect = true`。它会清掉 PDD 旧任务栈,但 `startActivity` 成功不代表目标商品已经加载,旧页面在切换完成前仍可能被读到。 3. **交接记录应是一次性的**:同意。spec_probe 与 purchase 是不同 attemptId,正文写的「taskId 和 attemptId」应改为:绑定 taskId、goodsId、来源 spec_probe 的 attemptId、本地执行代次,**只允许紧接的那一次 purchase 消费一次**,默认不复用。 ### 建议修订正文(需用户确认后修改) - 方案 1 改为一次性交接凭证:spec_probe 正常结束时生成;下一次执行开始时,如果不是同一 taskId 的 purchase 就作废;purchase 读取后立即作废。服务或无障碍重建、进程重启后没有凭证,即不复用。统一在「每次执行开始」和「任何会操作 PDD 的入口」作废,不维护分散的黑名单。人工在 PDD 内切页无法可靠感知,所以只在紧接交接时复用,并保留现有页面证据检查。 - 方案 2 改为:打开链接后,必须先看到**旧页面消失**的证据,再开始计算稳定商品页。可选的判断条件由实施时验证,例如活动窗口变化、或先读到非商品页的过渡状态。如果可以从无障碍窗口信息拿到 PDD 活动窗口 id,可以作为候选条件;失败现场快照的 manifest 中有窗口 id,但 `UiSnapshot` 是否提供还需实施时确认。**无法区分新旧页面时明确失败,不点击规格。**不把前台变化或「先回 Agent」当作充分证明。 - 验收补充 Codex 列出的必测项:A→B 不同商品但规格同名;打开浏览器后回到旧 PDD 页;同包直达新页;同任务失败后再次重试(不复用);交接凭证只能用一次;中间执行其他路径或进程重启后失效;保留真正紧接的探测→采购不重复打开的回归。 ### 未验证 未运行测试,未操作真机。旧页面消失的判断条件需要在实施时用真机现象确认。
Author
Owner

2026-10-09 Claude Code 更正:本批更可能的进入方式

用户观察:重购最后一批时,每个任务都先用浏览器打开 PDD 链接,再跳转到 PDD 商品页。

  • 这说明本批「打开商品」实际执行了,并没有被 canReuseCurrentProduct 跳过。正文原来的说法(跳过打开)对本批不准确,已在正文「更正」一节说明。
  • 更可能的过程:直达打开失败 → 退回浏览器 → PDD 回到前台时仍显示上一个商品 → openProduct 在 200ms 内把旧页面判定为打开成功。
  • 直达为什么失败尚未查明:PDD 能处理该链接;当时的系统日志已被覆盖;手机为 Android 16 / ColorOS 16,推测与系统限制后台拉起其他应用有关。
  • 经用户同意,正文新增方案 3「打开路径诊断」:记录走的是直达还是浏览器,直达失败时记录异常类名。验收新增两条对应的单元测试。原第 3 项「诊断」顺延为第 4 项。
  • 失败现场证明的「跑在上一个商品上」这一结论不变。方案 1、2 都仍然需要,本批更依赖方案 2「排除旧页面」。Codex 意见(评论 9064)尚待用户确认后并入正文。
## 2026-10-09 Claude Code 更正:本批更可能的进入方式 用户观察:重购最后一批时,每个任务都先用浏览器打开 PDD 链接,再跳转到 PDD 商品页。 - 这说明本批「打开商品」实际执行了,并没有被 `canReuseCurrentProduct` 跳过。正文原来的说法(跳过打开)对本批不准确,已在正文「更正」一节说明。 - 更可能的过程:直达打开失败 → 退回浏览器 → PDD 回到前台时仍显示上一个商品 → `openProduct` 在 200ms 内把旧页面判定为打开成功。 - 直达为什么失败尚未查明:PDD 能处理该链接;当时的系统日志已被覆盖;手机为 Android 16 / ColorOS 16,推测与系统限制后台拉起其他应用有关。 - 经用户同意,正文新增方案 3「打开路径诊断」:记录走的是直达还是浏览器,直达失败时记录异常类名。验收新增两条对应的单元测试。原第 3 项「诊断」顺延为第 4 项。 - 失败现场证明的「跑在上一个商品上」这一结论不变。方案 1、2 都仍然需要,本批更依赖方案 2「排除旧页面」。Codex 意见(评论 9064)尚待用户确认后并入正文。
Author
Owner

2026-10-09 导航诊断阶段开始(用户已授权)

用户授权补导航诊断、构建覆盖安装并保留用户数据,仅验证打开商品页;不进入规格选择、地址修改、下单或付款。基线 origin/main e26743c,分支 fix/373-navigation-diagnostics,worktree issue-373。

本阶段只保持既有导航选择逻辑并记录直达/浏览器、布尔结果、异常类名(不含消息/URL)、相对时间及聚合页面证据。增加仅 debug 包存在且受 shell DUMP 权限保护的导航验证入口,使用现有任务互斥锁,忙碌时拒绝、不抢占;验证入口不调用采购执行器、不创建/重试服务端任务。只记录临时诊断 runId 和结构标量,不保存正常流程原始树、页面文本、地址、截图。正式采购路径诊断继续关联既有任务/attempt/device/rule 快照。

先补测试、构建和签名校验,安装前后校验设置与设备身份摘要;本阶段不能代替旧页排除修复及整单验收。未授权合并或发布。诊断字段不需要 SQLite/业务库迁移。

## 2026-10-09 导航诊断阶段开始(用户已授权) 用户授权补导航诊断、构建覆盖安装并保留用户数据,仅验证打开商品页;不进入规格选择、地址修改、下单或付款。基线 origin/main e26743c,分支 fix/373-navigation-diagnostics,worktree issue-373。 本阶段只保持既有导航选择逻辑并记录直达/浏览器、布尔结果、异常类名(不含消息/URL)、相对时间及聚合页面证据。增加仅 debug 包存在且受 shell DUMP 权限保护的导航验证入口,使用现有任务互斥锁,忙碌时拒绝、不抢占;验证入口不调用采购执行器、不创建/重试服务端任务。只记录临时诊断 runId 和结构标量,不保存正常流程原始树、页面文本、地址、截图。正式采购路径诊断继续关联既有任务/attempt/device/rule 快照。 先补测试、构建和签名校验,安装前后校验设置与设备身份摘要;本阶段不能代替旧页排除修复及整单验收。未授权合并或发布。诊断字段不需要 SQLite/业务库迁移。
Author
Owner

导航诊断阶段交付 / 待验收(2026-10-09)

本次仅执行用户授权的“补导航诊断、保留数据覆盖安装、只打开商品页验证”,不是 #373 正式导航修复完成,也未实施 #374。

代码与验证

  • 分支 fix/373-navigation-diagnostics 已推送;实现 2c58d5817cda45243d2f4f5925fe7e6e87598e21,运维 Wiki 镜像 8f07a19。
  • 新增导航路径/结果/异常类名结构诊断,复用既有诊断表,无 schema 升级;debug-only 导航探针要求 DUMP 权限,占用既有设备互斥锁,20 秒观察预算,仅打开商品页、可点击浏览器唯一精确“打开拼多多APP”入口。PDD 内只读。
  • 新测试先失败后修复;最终选定的导航、探针、诊断、互斥及采购回归 131 项通过,0 失败/错误;:app:compileReleaseUnitTestKotlin、:app:assembleDebug 通过。不是全量单测结论。
  • 独立只读评审提出的派发前窗口/节点重验、耗时读取后取消与预算检查、debug-only 测试源集问题均已修正;复审无遗留阻塞。评审者未独立重跑测试。
  • git diff --check 通过。

安装

  • 指定真机已以 install -r 覆盖安装 0.9.69-373-nav-diag3 / code 82,未卸载、未清数据。
  • APK SHA256:f875bef42b04d9897567ae5fcaec2d3245cec48fb4b3975f811402ed0c25aef0,安装后读取 APK 哈希一致。
  • 使用用户提供的原签名,证书 SHA256:bf86d7465c6092be74ce9c4187eb30c9a7d045c3b91891a547e2598429766dec。设置、设备身份、界面偏好前后文件摘要一致;服务恢复 ONLINE,无当前执行任务。
  • 未创建/重试/重置服务端任务,未选规格、改地址、下单或付款。结束时手机停在 PDD 商品页。

核心真机证据

正文已补充最终 diag3 的 runId 与完整必要时间线:

  • 浏览器对照中,旧判定在约 0.921 秒已会接受旧商品页,浏览器到约 1.739 秒才首次出现;约 11.401 秒点击浏览器打开 PDD 入口,约 13.218 秒才读到不同标题的商品结构。
  • 直达对照中,约 0.897 秒窗口已变化但标题仍同旧页,约 1.585 秒才出现不同标题。
  • 因此仅“两次商品结构命中”会过早放行,窗口变化也不能单独作为目标页证明。标题不同同样不是 goodsId 身份验证。
  • 探针是 shell 触发的 synthetic 导航,不冒充真实采购任务;本轮未复现直达异常自动回退、未测到真实 probe→AI→采购间隔,不能据此定 TTL 或宣称正式缺陷已修复。

文档与范围

  • Gitea Wiki Deployment-and-Operations 已在线更新并回读一致,revision 69c80ae55159abbdb98c0f4acc68322cd320739d。
  • 一轮 harness.py sync 与一轮 sync --check 均成功,17 个核心映射一致。
  • 已提交本次运维页面完整生成镜像(保留该页既有发布记录)。同步同时生成的架构/业务规则两页差异仅为此前发布状态镜像,未混入本次提交,留在本 worktree 待原事项收尾;没有直接编辑或回退生成镜像。
  • 未合并 main、未发布/重启线上。分支未合并,worktree 保留。
  • 后续仍需按正文范围实施正式旧页排除/复用方案,并补真实任务时序与正常场景回归;本次停在诊断阶段待验收,不关闭工单。
## 导航诊断阶段交付 / 待验收(2026-10-09) 本次仅执行用户授权的“补导航诊断、保留数据覆盖安装、只打开商品页验证”,**不是 #373 正式导航修复完成,也未实施 #374**。 ### 代码与验证 - 分支 `fix/373-navigation-diagnostics` 已推送;实现 `2c58d5817cda45243d2f4f5925fe7e6e87598e21`,运维 Wiki 镜像 `8f07a19`。 - 新增导航路径/结果/异常类名结构诊断,复用既有诊断表,无 schema 升级;debug-only 导航探针要求 DUMP 权限,占用既有设备互斥锁,20 秒观察预算,仅打开商品页、可点击浏览器唯一精确“打开拼多多APP”入口。PDD 内只读。 - 新测试先失败后修复;最终选定的导航、探针、诊断、互斥及采购回归 **131 项通过,0 失败/错误**;`:app:compileReleaseUnitTestKotlin`、`:app:assembleDebug` 通过。不是全量单测结论。 - 独立只读评审提出的派发前窗口/节点重验、耗时读取后取消与预算检查、debug-only 测试源集问题均已修正;复审无遗留阻塞。评审者未独立重跑测试。 - `git diff --check` 通过。 ### 安装 - 指定真机已以 `install -r` 覆盖安装 **0.9.69-373-nav-diag3 / code 82**,未卸载、未清数据。 - APK SHA256:`f875bef42b04d9897567ae5fcaec2d3245cec48fb4b3975f811402ed0c25aef0`,安装后读取 APK 哈希一致。 - 使用用户提供的原签名,证书 SHA256:`bf86d7465c6092be74ce9c4187eb30c9a7d045c3b91891a547e2598429766dec`。设置、设备身份、界面偏好前后文件摘要一致;服务恢复 ONLINE,无当前执行任务。 - 未创建/重试/重置服务端任务,未选规格、改地址、下单或付款。结束时手机停在 PDD 商品页。 ### 核心真机证据 正文已补充最终 diag3 的 runId 与完整必要时间线: - 浏览器对照中,**旧判定在约 0.921 秒已会接受旧商品页,浏览器到约 1.739 秒才首次出现**;约 11.401 秒点击浏览器打开 PDD 入口,约 13.218 秒才读到不同标题的商品结构。 - 直达对照中,约 0.897 秒窗口已变化但标题仍同旧页,约 1.585 秒才出现不同标题。 - 因此仅“两次商品结构命中”会过早放行,窗口变化也不能单独作为目标页证明。标题不同同样不是 goodsId 身份验证。 - 探针是 shell 触发的 synthetic 导航,不冒充真实采购任务;本轮未复现直达异常自动回退、未测到真实 probe→AI→采购间隔,不能据此定 TTL 或宣称正式缺陷已修复。 ### 文档与范围 - Gitea Wiki `Deployment-and-Operations` 已在线更新并回读一致,revision `69c80ae55159abbdb98c0f4acc68322cd320739d`。 - 一轮 `harness.py sync` 与一轮 `sync --check` 均成功,17 个核心映射一致。 - 已提交本次运维页面完整生成镜像(保留该页既有发布记录)。同步同时生成的架构/业务规则两页差异仅为此前发布状态镜像,未混入本次提交,留在本 worktree 待原事项收尾;没有直接编辑或回退生成镜像。 - 未合并 main、未发布/重启线上。分支未合并,worktree 保留。 - 后续仍需按正文范围实施正式旧页排除/复用方案,并补真实任务时序与正常场景回归;本次停在诊断阶段待验收,不关闭工单。
ila changed title from fix(android): 正式采购阶段只在同一任务探测后紧接时复用商品页,其他情况重新打开本任务链接 to fix(android): 限定同任务一次性页面复用,采购导航按路径等待商品页稳定 2026-10-09 15:00:17 +08:00
Author
Owner

v4 正式修复交付 / 待验收

  • 分支 fix/373-navigation-diagnostics 已推送。实现 dbf9a5f4606529189e57b6c266449070d5001340,本单 Wiki 镜像 92aeab8d04627401d27ec154f2877bd53a2f81f5。另以 c9b7a2d 单独收尾前轮已发布 #365/#367/#368/#370 的遗留镜像,未混入业务代码。
  • 默认不复用当前商品页;仅同任务、同商品、首次成功上传的探测结果可交接一次,30秒TTL从探测完成起算。失败/重放/其他执行/上下文变化不复用,fresh capture 后再次校验。
  • 每次重新打开链接按 DIRECT/BROWSER 路径等待。浏览器出现前忽略旧PDD;至少3秒缓冲、稳定1秒且至少3次读取(计时可重叠),最多30秒。浏览器点击完成后至少1秒才重试;耗时读取后再次检查期限,不在超时后点击。
  • 不增加分享,不核验屏幕goodsId;稳定旧页及不可感知的同包人工切页仍是明确限制。没有修改Server/Web/数据库/API协议、采集器业务、规格/地址/下单流程、#367批次逻辑或#374。

验证

  • 主Agent独立执行相关 Android 回归:23个套件、451项,失败0、错误0、跳过0;不是全量测试结论。
  • :app:compileReleaseUnitTestKotlin、:app:assembleDebug、git diff --check 通过。
  • 独立规格/代码质量复审均通过;慢Binder导致实际点击间隔不足的问题已修正并补回归。评审者只读核验,主Agent实际运行Gradle。
  • APK android/app/build/outputs/apk/debug/app-debug.apk:0.9.69-373-fix1 / code 82,SHA256 171f4b12395e2940ce873b62ea394799f521d1a0997f6aaf7582a123c24795e8。apksigner校验通过,沿用原签名证书 bf86d7465c6092be74ce9c4187eb30c9a7d045c3b91891a547e2598429766dec。

文档与未执行项

  • Wiki Business-Rules-and-Glossary revision 6c1a317ef67a0b015bb16a615b8c490b384188a0;Deployment-and-Operations revision 01a3a9cd968510c9435ec1fb2be0040fe17d0282。在线回读一致,sync及sync --check通过,17映射一致。首次sync因前轮遗留镜像未提交被保护性拦截,单独提交后完成同步。
  • 本次正式修复包尚未安装,未执行真实采购/付款、未合并main、未发布或重启线上。 手机仍是前轮诊断包;原探针旧判据日志不证明新执行器通过。
  • 未合并的 D:/OPC/goauto-worktrees/issue-373 保留。待用户授权装机与验收,不关闭工单。
## v4 正式修复交付 / 待验收 - 分支 `fix/373-navigation-diagnostics` 已推送。实现 `dbf9a5f4606529189e57b6c266449070d5001340`,本单 Wiki 镜像 `92aeab8d04627401d27ec154f2877bd53a2f81f5`。另以 `c9b7a2d` 单独收尾前轮已发布 #365/#367/#368/#370 的遗留镜像,未混入业务代码。 - 默认不复用当前商品页;仅同任务、同商品、首次成功上传的探测结果可交接一次,30秒TTL从探测完成起算。失败/重放/其他执行/上下文变化不复用,fresh capture 后再次校验。 - 每次重新打开链接按 DIRECT/BROWSER 路径等待。浏览器出现前忽略旧PDD;至少3秒缓冲、稳定1秒且至少3次读取(计时可重叠),最多30秒。浏览器点击完成后至少1秒才重试;耗时读取后再次检查期限,不在超时后点击。 - 不增加分享,不核验屏幕goodsId;稳定旧页及不可感知的同包人工切页仍是明确限制。没有修改Server/Web/数据库/API协议、采集器业务、规格/地址/下单流程、#367批次逻辑或#374。 ### 验证 - 主Agent独立执行相关 Android 回归:23个套件、451项,失败0、错误0、跳过0;不是全量测试结论。 - `:app:compileReleaseUnitTestKotlin`、`:app:assembleDebug`、`git diff --check` 通过。 - 独立规格/代码质量复审均通过;慢Binder导致实际点击间隔不足的问题已修正并补回归。评审者只读核验,主Agent实际运行Gradle。 - APK `android/app/build/outputs/apk/debug/app-debug.apk`:`0.9.69-373-fix1 / code 82`,SHA256 `171f4b12395e2940ce873b62ea394799f521d1a0997f6aaf7582a123c24795e8`。apksigner校验通过,沿用原签名证书 `bf86d7465c6092be74ce9c4187eb30c9a7d045c3b91891a547e2598429766dec`。 ### 文档与未执行项 - Wiki Business-Rules-and-Glossary revision `6c1a317ef67a0b015bb16a615b8c490b384188a0`;Deployment-and-Operations revision `01a3a9cd968510c9435ec1fb2be0040fe17d0282`。在线回读一致,sync及sync --check通过,17映射一致。首次sync因前轮遗留镜像未提交被保护性拦截,单独提交后完成同步。 - **本次正式修复包尚未安装,未执行真实采购/付款、未合并main、未发布或重启线上。** 手机仍是前轮诊断包;原探针旧判据日志不证明新执行器通过。 - 未合并的 `D:/OPC/goauto-worktrees/issue-373` 保留。待用户授权装机与验收,不关闭工单。
Author
Owner

按授权顺序合并 / 联合验证完成

  • #373 合并提交 1e924fa41195281a3223003a69c8c16ae37f8aa5;#374 合并提交 555a954605a83c12457ed1ada86eb732fe3bb023;main 最新 3ee8dfc0aa93ef9020786244cce29c487631ddbe 已推送。两单原提交及分支历史保留,未压缩或强推。
  • 源码自动合并无冲突;3份Wiki镜像冲突选择 #374 已生成的较新完整镜像(包含 #373),没有手工改写业务正文。随后在线更新合并事实并回读,再完成一轮sync/check,17映射全部一致。
  • 集成环境 D:/OPC/goauto-worktrees/release-373-374,未切换或覆盖根仓库用户旧分支/本地改动,未更新Supervisor运行目录。

集成验证

  • 主Agent实际运行联合筛选:Purchase*、PddLaunchFallback、PddNavigation、PddProductDetailCollector、CurrentPageCollection、SpecPanelRecognition、SpecOptionDedup、TruncatedSpecCard、SpecValueNormalizer、NavigationProbe、BrowserProbeClickPolicy、AgentDiagnostic*、TaskExecutionMutex。
  • 25套件478项,0失败、0错误、0跳过;:app:compileReleaseUnitTestKotlin、:app:assembleDebug成功。存在原有弃用/未使用变量编译警告,未扩大范围修改。git diff检查通过。
  • 本轮未重跑已记录卡住的无关图搜全量用例,不宣称完整单测或真机采购通过。
  • APK D:/OPC/goauto-worktrees/release-373-374/android/app/build/outputs/apk/debug/app-debug.apk,SHA256 6e2d0e0ed1eb943b3f168bb16d628d2c2bb4ce3b7c7c8b9e567dcdf8259150f8。版本保留 0.9.69-373-fix1 / code82,同时包含#374,不与单独#373包混淆。
  • apksigner验证通过,原签名证书SHA256 bf86d7465c6092be74ce9c4187eb30c9a7d045c3b91891a547e2598429766dec。没有安装或清手机数据。

文档与清理

  • Business-Rules-and-Glossary revision a47b6b3b7ef7745417d1c2c88932f5bb12228f27;Deployment-and-Operations revision 3f69f2e39675752dfd43dc38de41cb7defb74a42,回读一致、镜像检查通过。
  • 清理前已确认两工单HEAD是origin/main祖先、status为空、没有未跟踪任务资料/数据库、没有进程或Supervisor配置引用、没有外部链接;仅有可再生成的Gradle/build和Python缓存。集成APK保留在release工作区。
  • 分别执行非force的 git worktree remove,均遇Windows Filename too long,Git登记已移除但 D:/OPC/goauto-worktrees/issue-373、D:/OPC/goauto-worktrees/issue-374 留有部分目录,未强删。分支与提交保留,源码可恢复;按规则记录残留待后续清理。
  • 首次main推送曾遇一次认证失败,未改凭据/权限,原命令重试成功;远端main已回读确认。

本轮不涉及业务库迁移、Admin发布、服务重启、手机安装或真实采购/付款。仍保留#373非goodsId身份核验及#374结构/摘要格式的已知边界。工单不关闭,待用户验收。

## 按授权顺序合并 / 联合验证完成 - #373 合并提交 `1e924fa41195281a3223003a69c8c16ae37f8aa5`;#374 合并提交 `555a954605a83c12457ed1ada86eb732fe3bb023`;main 最新 `3ee8dfc0aa93ef9020786244cce29c487631ddbe` 已推送。两单原提交及分支历史保留,未压缩或强推。 - 源码自动合并无冲突;3份Wiki镜像冲突选择 #374 已生成的较新完整镜像(包含 #373),没有手工改写业务正文。随后在线更新合并事实并回读,再完成一轮sync/check,17映射全部一致。 - 集成环境 `D:/OPC/goauto-worktrees/release-373-374`,未切换或覆盖根仓库用户旧分支/本地改动,未更新Supervisor运行目录。 ### 集成验证 - 主Agent实际运行联合筛选:Purchase*、PddLaunchFallback、PddNavigation、PddProductDetailCollector、CurrentPageCollection、SpecPanelRecognition、SpecOptionDedup、TruncatedSpecCard、SpecValueNormalizer、NavigationProbe、BrowserProbeClickPolicy、AgentDiagnostic*、TaskExecutionMutex。 - **25套件478项,0失败、0错误、0跳过**;`:app:compileReleaseUnitTestKotlin`、`:app:assembleDebug`成功。存在原有弃用/未使用变量编译警告,未扩大范围修改。git diff检查通过。 - 本轮未重跑已记录卡住的无关图搜全量用例,不宣称完整单测或真机采购通过。 - APK `D:/OPC/goauto-worktrees/release-373-374/android/app/build/outputs/apk/debug/app-debug.apk`,SHA256 `6e2d0e0ed1eb943b3f168bb16d628d2c2bb4ce3b7c7c8b9e567dcdf8259150f8`。版本保留 `0.9.69-373-fix1 / code82`,**同时包含#374,不与单独#373包混淆**。 - apksigner验证通过,原签名证书SHA256 `bf86d7465c6092be74ce9c4187eb30c9a7d045c3b91891a547e2598429766dec`。没有安装或清手机数据。 ### 文档与清理 - Business-Rules-and-Glossary revision `a47b6b3b7ef7745417d1c2c88932f5bb12228f27`;Deployment-and-Operations revision `3f69f2e39675752dfd43dc38de41cb7defb74a42`,回读一致、镜像检查通过。 - 清理前已确认两工单HEAD是origin/main祖先、status为空、没有未跟踪任务资料/数据库、没有进程或Supervisor配置引用、没有外部链接;仅有可再生成的Gradle/build和Python缓存。集成APK保留在release工作区。 - 分别执行非force的 `git worktree remove`,均遇Windows `Filename too long`,Git登记已移除但 `D:/OPC/goauto-worktrees/issue-373`、`D:/OPC/goauto-worktrees/issue-374` 留有部分目录,未强删。分支与提交保留,源码可恢复;按规则记录残留待后续清理。 - 首次main推送曾遇一次认证失败,未改凭据/权限,原命令重试成功;远端main已回读确认。 本轮不涉及业务库迁移、Admin发布、服务重启、手机安装或真实采购/付款。仍保留#373非goodsId身份核验及#374结构/摘要格式的已知边界。工单不关闭,待用户验收。
Author
Owner

2026-10-09 按用户授权完成合并版真机覆盖安装(未执行采购):

  • 使用 adb install -r,返回 Success;未卸载、未清除数据。
  • 版本 0.9.69-373-fix1 / code 82,包含 #373 + #374;基于已推送 main 3ee8dfc0aa93ef9020786244cce29c487631ddbe 的集成构建。
  • 新旧签名证书 SHA256 一致;安装后设备 base.apk SHA256 与构建文件一致:6e2d0e0ed1eb943b3f168bb16d628d2c2bb4ce3b7c7c8b9e567dcdf8259150f8。
  • 安装前运行状态 ONLINE、无 current_task_id 标记。设置、设备身份、界面偏好三个文件安装前后 SHA256 完全一致。
  • 仅完成安装验证,未触发采集、采购、下单或付款,未发布/重启服务端。采购业务真机效果仍待用户验收;工单保持开放。
  • 本次仅增加安装证据,无新增长期契约或运维流程变化,不重复更新 Wiki。
2026-10-09 按用户授权完成合并版真机覆盖安装(未执行采购): - 使用 `adb install -r`,返回 Success;未卸载、未清除数据。 - 版本 `0.9.69-373-fix1` / code 82,包含 #373 + #374;基于已推送 main `3ee8dfc0aa93ef9020786244cce29c487631ddbe` 的集成构建。 - 新旧签名证书 SHA256 一致;安装后设备 base.apk SHA256 与构建文件一致:`6e2d0e0ed1eb943b3f168bb16d628d2c2bb4ce3b7c7c8b9e567dcdf8259150f8`。 - 安装前运行状态 ONLINE、无 current_task_id 标记。设置、设备身份、界面偏好三个文件安装前后 SHA256 完全一致。 - 仅完成安装验证,未触发采集、采购、下单或付款,未发布/重启服务端。采购业务真机效果仍待用户验收;工单保持开放。 - 本次仅增加安装证据,无新增长期契约或运维流程变化,不重复更新 Wiki。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#373