fix(android): 地址入口局部重复时先下滑再唯一定位 #193

Open
opened 2026-09-01 17:36:33 +08:00 by ila · 11 comments
Owner

原始需求摘要

来源:用户于 2026-09-01 真机反馈,最新 Agent 在规格面板选择颜色和尺码后,没有从规格面板中间下滑以完整显示收货地址入口,随后报“收货地址入口不唯一”;用户确认“修复”。

当前事实与根因

  • 真机安装版本为 0.9.38 (51),连接本地 API http://192.168.0.224:8010。
  • PurchaseLiveAutomation.updateShippingAddress 当前先在整个可见页面统计掩码手机号节点;发现多个即在任何面板滑动前返回 PURCHASE_ADDRESS_ENTRY_AMBIGUOUS。
  • 只有完全找不到手机号节点时才查找唯一规格面板并从中间向下滑动。因此局部显示或无障碍树重复暴露同一地址手机号时,流程会提前失败。
  • 初次快照合并后的单一节点在点击前重新捕获时,仍可能因同一视觉区域的重复无障碍节点返回 AMBIGUOUS。

目标

修复 Android Agent 的收货地址入口定位:在唯一规格面板中处理局部/重复地址节点,必要时先有限下滑完整显示地址卡片,再安全点击唯一入口。

非目标与安全边界

  • 不修改 Admin、服务端、接口、数据库、任务状态机或采购规则。
  • 不重试当前失败任务,不创建真实订单,不执行支付。
  • 不猜测两个真实不同地址入口;仍须明确失败。
  • 不使用 OCR/VLM,不保存控件树或整屏截图。

前置依赖与并行性

  • 依赖 #192 最新 Android 分支,以避免同文件并行覆盖;本分支从 origin/fix/192-order-result-scroll 建立。
  • 仅影响 Android 自动化和测试,不可与其他同时修改 PurchaseLiveAutomation / GoAutoAccessibilityService 的任务并行合并。

实施方案(用户已确认)

  1. 每轮先验证唯一纵向规格面板,地址候选只在该面板范围内判断。
  2. 地址节点为 0 个、多个或尚未完整位于面板可见区域时,不立即报不唯一;先从面板中间执行有限次数向下手势并重新捕获。
  3. 完整显示后,按同一可点击地址卡片合并重复手机号子节点;确实属于不同卡片时保持不唯一失败。
  4. 点击前的实时节点刷新仅允许合并同一视觉区域/同一点击卡片的重复节点;不同区域仍返回 AMBIGUOUS。
  5. 增加局部重复节点经一次下滑后出现唯一完整地址入口、真实双面板/双入口仍失败、无支付点击的回归测试。

设计证据

恢复既有 Android 自动化行为的非 UI Bug,不新增页面、组件或交互,无需原型;以现有规格面板中间下滑行为、采购安全规则和回归测试为设计证据。

验收标准

  • 首屏存在同一地址的局部/重复手机号节点时,Agent 不在滑动前直接报不唯一。
  • Agent 只在唯一规格面板中间有限向下滑动,完整显示地址入口后继续既有地址修改与核验。
  • 同一卡片重复无障碍节点可安全合并;两个真实不同入口、多个规格面板或页面不稳定时仍 fail-closed。
  • 不新增支付点击,不削弱价格、地址后缀、最终提交、租约和互斥门禁。

验证计划

  • 定向运行 PurchaseLiveAutomationTest 和相关无障碍点击测试。
  • 运行 Android 完整验证与 Debug APK 构建。
  • 不执行真机正式采购;安装和真机采购验收需独立人工授权。

风险

地址修改处于正式采购流程,错误点击可能修改错误地址并影响订单。所有合并必须受同一面板、同一视觉区域或同一可点击卡片约束;不确定时停止。

文档影响

预计无长期文档影响:仅修复 Android 既有实现偏差,不改变接口、状态、配置、业务安全边界或运维方式,完成时复核。

工具回退说明

当前会话无可调用的 Gitea MCP,按规则回退 Gitea API;使用 Git 已配置安全凭据,凭据不写入工单、代码或日志。

## 原始需求摘要 来源:用户于 2026-09-01 真机反馈,最新 Agent 在规格面板选择颜色和尺码后,没有从规格面板中间下滑以完整显示收货地址入口,随后报“收货地址入口不唯一”;用户确认“修复”。 ## 当前事实与根因 - 真机安装版本为 `0.9.38 (51)`,连接本地 API `http://192.168.0.224:8010`。 - `PurchaseLiveAutomation.updateShippingAddress` 当前先在整个可见页面统计掩码手机号节点;发现多个即在任何面板滑动前返回 `PURCHASE_ADDRESS_ENTRY_AMBIGUOUS`。 - 只有完全找不到手机号节点时才查找唯一规格面板并从中间向下滑动。因此局部显示或无障碍树重复暴露同一地址手机号时,流程会提前失败。 - 初次快照合并后的单一节点在点击前重新捕获时,仍可能因同一视觉区域的重复无障碍节点返回 `AMBIGUOUS`。 ## 目标 修复 Android Agent 的收货地址入口定位:在唯一规格面板中处理局部/重复地址节点,必要时先有限下滑完整显示地址卡片,再安全点击唯一入口。 ## 非目标与安全边界 - 不修改 Admin、服务端、接口、数据库、任务状态机或采购规则。 - 不重试当前失败任务,不创建真实订单,不执行支付。 - 不猜测两个真实不同地址入口;仍须明确失败。 - 不使用 OCR/VLM,不保存控件树或整屏截图。 ## 前置依赖与并行性 - 依赖 #192 最新 Android 分支,以避免同文件并行覆盖;本分支从 `origin/fix/192-order-result-scroll` 建立。 - 仅影响 Android 自动化和测试,不可与其他同时修改 `PurchaseLiveAutomation` / `GoAutoAccessibilityService` 的任务并行合并。 ## 实施方案(用户已确认) 1. 每轮先验证唯一纵向规格面板,地址候选只在该面板范围内判断。 2. 地址节点为 0 个、多个或尚未完整位于面板可见区域时,不立即报不唯一;先从面板中间执行有限次数向下手势并重新捕获。 3. 完整显示后,按同一可点击地址卡片合并重复手机号子节点;确实属于不同卡片时保持不唯一失败。 4. 点击前的实时节点刷新仅允许合并同一视觉区域/同一点击卡片的重复节点;不同区域仍返回 `AMBIGUOUS`。 5. 增加局部重复节点经一次下滑后出现唯一完整地址入口、真实双面板/双入口仍失败、无支付点击的回归测试。 ## 设计证据 恢复既有 Android 自动化行为的非 UI Bug,不新增页面、组件或交互,无需原型;以现有规格面板中间下滑行为、采购安全规则和回归测试为设计证据。 ## 验收标准 - 首屏存在同一地址的局部/重复手机号节点时,Agent 不在滑动前直接报不唯一。 - Agent 只在唯一规格面板中间有限向下滑动,完整显示地址入口后继续既有地址修改与核验。 - 同一卡片重复无障碍节点可安全合并;两个真实不同入口、多个规格面板或页面不稳定时仍 fail-closed。 - 不新增支付点击,不削弱价格、地址后缀、最终提交、租约和互斥门禁。 ## 验证计划 - 定向运行 `PurchaseLiveAutomationTest` 和相关无障碍点击测试。 - 运行 Android 完整验证与 Debug APK 构建。 - 不执行真机正式采购;安装和真机采购验收需独立人工授权。 ## 风险 地址修改处于正式采购流程,错误点击可能修改错误地址并影响订单。所有合并必须受同一面板、同一视觉区域或同一可点击卡片约束;不确定时停止。 ## 文档影响 预计无长期文档影响:仅修复 Android 既有实现偏差,不改变接口、状态、配置、业务安全边界或运维方式,完成时复核。 ## 工具回退说明 当前会话无可调用的 Gitea MCP,按规则回退 Gitea API;使用 Git 已配置安全凭据,凭据不写入工单、代码或日志。
Author
Owner

实施完成,待验收

实现

  • 地址入口定位每轮先验证唯一纵向规格面板,候选仅在面板完整可见范围内判断。
  • 局部、重复或多个手机号提示不再在滑动前立即失败;Agent 会从唯一规格面板中间执行有限向下手势并重新捕获。
  • 完整显示后,属于同一可点击地址卡片的重复手机号子节点合并为一个入口;不同卡片仍保持 PURCHASE_ADDRESS_ENTRY_AMBIGUOUS。
  • 点击前实时刷新若出现同一视觉位置或同一地址卡片的重复节点,可安全合并;不同位置/卡片仍返回 AMBIGUOUS。
  • 未修改 Admin、服务端、接口、数据库、状态机、规则、价格保护、地址后缀核验、租约或互斥;未重试采购、未创建订单、未执行支付。

验证

  • 定向 PurchaseLiveAutomationTest 与 GoAutoAccessibilityServicePolicyTest:通过。
  • .\\scripts\\verify.ps1 -Component android:通过;Debug/Release 单元测试通过,Debug APK 构建成功。
  • git diff --check:通过。
  • 新增覆盖:重复局部地址提示先滑动后成功;同一卡片重复节点合并;两个真实地址卡片继续失败;双规格面板不滑动不点击;实时节点仅同一视觉目标可合并。

提交与依赖

  • commit:fcb5cf5e789de933051d0c64416908997e243898
  • branch:fix/193-address-entry-reveal
  • 基于:origin/fix/192-order-result-scroll(包含 #192)
  • 已推送:origin/fix/193-address-entry-reveal

文档影响

无长期文档影响:仅修复 Android 既有自动化实现偏差,不改变接口、数据、状态、配置、安全边界或运维方式,因此跳过 Wiki 更新及镜像同步。

未验证项

未安装到真机,也未执行正式采购验收;正式采购可能创建真实订单,必须另行获得人工授权。永久禁止支付。

工单保持打开,当前为待验收;未经用户明确验收不关闭。

## 实施完成,待验收 ### 实现 - 地址入口定位每轮先验证唯一纵向规格面板,候选仅在面板完整可见范围内判断。 - 局部、重复或多个手机号提示不再在滑动前立即失败;Agent 会从唯一规格面板中间执行有限向下手势并重新捕获。 - 完整显示后,属于同一可点击地址卡片的重复手机号子节点合并为一个入口;不同卡片仍保持 `PURCHASE_ADDRESS_ENTRY_AMBIGUOUS`。 - 点击前实时刷新若出现同一视觉位置或同一地址卡片的重复节点,可安全合并;不同位置/卡片仍返回 `AMBIGUOUS`。 - 未修改 Admin、服务端、接口、数据库、状态机、规则、价格保护、地址后缀核验、租约或互斥;未重试采购、未创建订单、未执行支付。 ### 验证 - 定向 `PurchaseLiveAutomationTest` 与 `GoAutoAccessibilityServicePolicyTest`:通过。 - `.\\scripts\\verify.ps1 -Component android`:通过;Debug/Release 单元测试通过,Debug APK 构建成功。 - `git diff --check`:通过。 - 新增覆盖:重复局部地址提示先滑动后成功;同一卡片重复节点合并;两个真实地址卡片继续失败;双规格面板不滑动不点击;实时节点仅同一视觉目标可合并。 ### 提交与依赖 - commit:`fcb5cf5e789de933051d0c64416908997e243898` - branch:`fix/193-address-entry-reveal` - 基于:`origin/fix/192-order-result-scroll`(包含 #192) - 已推送:`origin/fix/193-address-entry-reveal` ### 文档影响 无长期文档影响:仅修复 Android 既有自动化实现偏差,不改变接口、数据、状态、配置、安全边界或运维方式,因此跳过 Wiki 更新及镜像同步。 ### 未验证项 未安装到真机,也未执行正式采购验收;正式采购可能创建真实订单,必须另行获得人工授权。永久禁止支付。 工单保持打开,当前为待验收;未经用户明确验收不关闭。
Author
Owner

真机回归与方案修订(2026-09-01)

用户安装提交 fcb5cf5 后真机复测:Agent 已按预期在规格面板中间下滑并完整显示地址入口,但随后报“没有找到唯一的规格面板滚动区域”。

新增代码事实

#193 当前实现每轮都先重新要求唯一 scrollable 规格面板,再检查地址入口。PDD 下滑完成后会改变该区域的无障碍语义,原面板可能不再标记为 scrollable 或滚动节点结构变化;因此地址已完整出现仍在检查前失败。这是 #193 同一流程的回归,不扩大工单范围。

修订方案(用户已确认修复)

  • 首次需要滑动前仍必须验证唯一规格面板,并保存其可信可见范围。
  • 下滑后的新快照先在已验证范围内检查完整地址入口;唯一时直接继续既有地址流程,不再要求面板仍为 scrollable。
  • 只有地址仍未出现、确实需要继续滑动时,才重新要求当前页面存在唯一可滚动面板。
  • 当前页面失去滚动面板且地址仍不唯一/未出现时继续 fail-closed。
  • 增加“下滑后面板失去 scrollable 属性,但唯一完整地址入口已出现”的回归测试。

安全边界不变:不重试真机采购、不创建订单、不执行支付;不同地址入口仍不猜测。

## 真机回归与方案修订(2026-09-01) 用户安装提交 `fcb5cf5` 后真机复测:Agent 已按预期在规格面板中间下滑并完整显示地址入口,但随后报“没有找到唯一的规格面板滚动区域”。 ### 新增代码事实 #193 当前实现每轮都先重新要求唯一 `scrollable` 规格面板,再检查地址入口。PDD 下滑完成后会改变该区域的无障碍语义,原面板可能不再标记为 `scrollable` 或滚动节点结构变化;因此地址已完整出现仍在检查前失败。这是 #193 同一流程的回归,不扩大工单范围。 ### 修订方案(用户已确认修复) - 首次需要滑动前仍必须验证唯一规格面板,并保存其可信可见范围。 - 下滑后的新快照先在已验证范围内检查完整地址入口;唯一时直接继续既有地址流程,不再要求面板仍为 `scrollable`。 - 只有地址仍未出现、确实需要继续滑动时,才重新要求当前页面存在唯一可滚动面板。 - 当前页面失去滚动面板且地址仍不唯一/未出现时继续 fail-closed。 - 增加“下滑后面板失去 scrollable 属性,但唯一完整地址入口已出现”的回归测试。 安全边界不变:不重试真机采购、不创建订单、不执行支付;不同地址入口仍不猜测。
Author
Owner

真机回归修订已完成,继续待验收

修复

  • 首次需要滑动前仍验证唯一规格面板,并持久保留该次可信面板边界,仅用于本次地址定位循环。
  • 下滑后的快照先在已验证边界内检查完整地址入口;唯一时直接进入既有地址流程,不再要求 PDD 继续把面板标记为 scrollable。
  • 地址未出现或仍不唯一、且当前页面没有唯一可滚动面板时继续 fail-closed。
  • 未改变地址卡片去重、真实多入口失败、地址后缀核验、最终提交和禁止支付规则。

新增回归

  • “唯一面板下滑后失去 scrollable 属性,但唯一完整地址入口已出现”:通过;执行 1 次面板手势、1 次地址入口点击。
  • PurchaseLiveAutomationTest 定向测试:通过。
  • .\\scripts\\verify.ps1 -Component android:通过;Debug/Release 单元测试及 Debug APK 构建成功。
  • git diff --check:通过。

提交

  • 修订 commit:14459ead62e537451d211899a5d492380fb14b23
  • 分支:fix/193-address-entry-reveal
  • 已推送至 origin;该分支仍包含 #192 与 #193 前一提交。

文档及真机

无长期文档影响,继续跳过 Wiki 更新。修订 APK 尚未覆盖安装到手机,也未执行正式采购;真机安装和采购验收需用户明确授权,永久禁止支付。

工单保持打开,等待验收。

## 真机回归修订已完成,继续待验收 ### 修复 - 首次需要滑动前仍验证唯一规格面板,并持久保留该次可信面板边界,仅用于本次地址定位循环。 - 下滑后的快照先在已验证边界内检查完整地址入口;唯一时直接进入既有地址流程,不再要求 PDD 继续把面板标记为 `scrollable`。 - 地址未出现或仍不唯一、且当前页面没有唯一可滚动面板时继续 fail-closed。 - 未改变地址卡片去重、真实多入口失败、地址后缀核验、最终提交和禁止支付规则。 ### 新增回归 - “唯一面板下滑后失去 `scrollable` 属性,但唯一完整地址入口已出现”:通过;执行 1 次面板手势、1 次地址入口点击。 - `PurchaseLiveAutomationTest` 定向测试:通过。 - `.\\scripts\\verify.ps1 -Component android`:通过;Debug/Release 单元测试及 Debug APK 构建成功。 - `git diff --check`:通过。 ### 提交 - 修订 commit:`14459ead62e537451d211899a5d492380fb14b23` - 分支:`fix/193-address-entry-reveal` - 已推送至 origin;该分支仍包含 #192 与 #193 前一提交。 ### 文档及真机 无长期文档影响,继续跳过 Wiki 更新。修订 APK 尚未覆盖安装到手机,也未执行正式采购;真机安装和采购验收需用户明确授权,永久禁止支付。 工单保持打开,等待验收。
Author
Owner

CG56 真机回归与第二次方案修订(2026-09-01)

安装提交 14459ea 后,CG56 在地址流程报“没有找到唯一的规格面板滚动区域”。该错误说明本次进入地址流程时,PDD 从一开始就未暴露唯一、满足尺寸条件的 scrollable 面板,因此上一修订保存可信面板范围的逻辑尚未建立。

当前结构化日志未记录滚动候选数,无法区分 0 个或多个;两者共同根因是把不稳定的 PDD scrollable 属性当成了中间下滑的唯一授权证据。

修订方案(用户确认“修改”)

  • 生产地址流程接收当前 PurchaseExecutionInput,不只接收地址后缀。
  • 优先使用唯一可滚动面板;不存在或不唯一时,不直接降级为任意全局滑动。
  • 仅当当前快照同时满足 PDD 包名、唯一提交按钮、服务端下发的颜色/尺码已精确显示、唯一数量一致、价格存在且仍在任务固化范围内时,建立一次“已验证采购区域”。
  • 在已验证采购区域的屏幕中部执行仅向下、有限次数的手势;手势不依赖节点 scrollable 属性,不点击任何规格、提交或支付节点。
  • 每次继续手势前重新验证上述采购页证据;手势后优先读取可信范围内的唯一完整地址入口。
  • 页面证据不足、真实多地址、手势失败或页面不再变化时继续 fail-closed。
  • 新增 0 个/多个滚动候选但采购页强证据完整时的回归,以及强证据缺失时零手势回归。

安全边界不变:不重试 CG56、不创建订单、不支付;不保存控件树或截图。

## CG56 真机回归与第二次方案修订(2026-09-01) 安装提交 `14459ea` 后,CG56 在地址流程报“没有找到唯一的规格面板滚动区域”。该错误说明本次进入地址流程时,PDD 从一开始就未暴露唯一、满足尺寸条件的 `scrollable` 面板,因此上一修订保存可信面板范围的逻辑尚未建立。 当前结构化日志未记录滚动候选数,无法区分 0 个或多个;两者共同根因是把不稳定的 PDD `scrollable` 属性当成了中间下滑的唯一授权证据。 ### 修订方案(用户确认“修改”) - 生产地址流程接收当前 `PurchaseExecutionInput`,不只接收地址后缀。 - 优先使用唯一可滚动面板;不存在或不唯一时,不直接降级为任意全局滑动。 - 仅当当前快照同时满足 PDD 包名、唯一提交按钮、服务端下发的颜色/尺码已精确显示、唯一数量一致、价格存在且仍在任务固化范围内时,建立一次“已验证采购区域”。 - 在已验证采购区域的屏幕中部执行仅向下、有限次数的手势;手势不依赖节点 `scrollable` 属性,不点击任何规格、提交或支付节点。 - 每次继续手势前重新验证上述采购页证据;手势后优先读取可信范围内的唯一完整地址入口。 - 页面证据不足、真实多地址、手势失败或页面不再变化时继续 fail-closed。 - 新增 0 个/多个滚动候选但采购页强证据完整时的回归,以及强证据缺失时零手势回归。 安全边界不变:不重试 CG56、不创建订单、不支付;不保存控件树或截图。
Author
Owner

CG56 修订已完成,继续待验收

实现

  • 正式地址流程现在接收完整 PurchaseExecutionInput,地址中部手势的授权不再只依赖 PDD scrollable 属性。
  • 唯一滚动面板存在时继续使用既有面板内手势。
  • 滚动面板为 0 个或多个时,只有当前快照同时通过以下强证据才建立已验证采购区域:PDD 包名、唯一提交按钮、任务下发颜色/尺码仍显示、唯一数量与任务一致、价格存在且仍在任务固化范围内。
  • 通过后仅在当前 PDD 根窗口内、覆盖足够宽高的采购区域中部执行有限向下手势;不点击规格、提交订单或支付节点。
  • 每次需要继续手势都重新验证采购页证据;手势后优先读取可信范围内的完整地址入口。证据缺失、区域过小/越界、地址不唯一或页面不变化时 fail-closed。

回归与验证

  • 0 个滚动面板 + 强证据完整:1 次中部下滑后读取地址,通过。
  • 多个滚动面板 + 强证据完整:1 次中部下滑后读取地址,通过。
  • 缺少已选规格强证据:0 次面板手势、0 次区域手势、0 次地址点击并失败,通过。
  • 已验证手势区域必须位于当前 PDD 根窗口且至少覆盖 60% 宽、20% 高:策略测试通过。
  • .\\scripts\\verify.ps1 -Component android:通过;Debug/Release 单元测试及 Debug APK 构建成功。
  • git diff --check:通过。

提交

  • commit:bb879be8365644cc0bb6444e0850ac18d3bf9628
  • branch:fix/193-address-entry-reveal
  • 已推送 origin;分支包含 #192 及 #193 全部修订。

文档及真机

无接口、数据库、状态、配置、业务安全边界或运维变化,无长期文档影响,跳过 Wiki 更新。新 APK 尚未安装,未重试 CG56,未创建订单,未支付。

工单保持打开,等待真机验收。

## CG56 修订已完成,继续待验收 ### 实现 - 正式地址流程现在接收完整 `PurchaseExecutionInput`,地址中部手势的授权不再只依赖 PDD `scrollable` 属性。 - 唯一滚动面板存在时继续使用既有面板内手势。 - 滚动面板为 0 个或多个时,只有当前快照同时通过以下强证据才建立已验证采购区域:PDD 包名、唯一提交按钮、任务下发颜色/尺码仍显示、唯一数量与任务一致、价格存在且仍在任务固化范围内。 - 通过后仅在当前 PDD 根窗口内、覆盖足够宽高的采购区域中部执行有限向下手势;不点击规格、提交订单或支付节点。 - 每次需要继续手势都重新验证采购页证据;手势后优先读取可信范围内的完整地址入口。证据缺失、区域过小/越界、地址不唯一或页面不变化时 fail-closed。 ### 回归与验证 - 0 个滚动面板 + 强证据完整:1 次中部下滑后读取地址,通过。 - 多个滚动面板 + 强证据完整:1 次中部下滑后读取地址,通过。 - 缺少已选规格强证据:0 次面板手势、0 次区域手势、0 次地址点击并失败,通过。 - 已验证手势区域必须位于当前 PDD 根窗口且至少覆盖 60% 宽、20% 高:策略测试通过。 - `.\\scripts\\verify.ps1 -Component android`:通过;Debug/Release 单元测试及 Debug APK 构建成功。 - `git diff --check`:通过。 ### 提交 - commit:`bb879be8365644cc0bb6444e0850ac18d3bf9628` - branch:`fix/193-address-entry-reveal` - 已推送 origin;分支包含 #192 及 #193 全部修订。 ### 文档及真机 无接口、数据库、状态、配置、业务安全边界或运维变化,无长期文档影响,跳过 Wiki 更新。新 APK 尚未安装,未重试 CG56,未创建订单,未支付。 工单保持打开,等待真机验收。
Author
Owner

真机继续执行阻塞(2026-09-02)

用户已明确授权继续 #193 的安装和 CG56 正式采购回归。已完成:

  • 在干净的 fix/193-address-entry-reveal 工作树重新运行 Android 单元测试与 Debug APK 构建,均通过;
  • 覆盖安装提交 a1a9343 对应的 0.9.38 (51),设备端 APK SHA-256 与本地构建产物一致;
  • 安装前确认设备没有运行中采购任务或待上传 Outbox;CG56 仍为 failed、irreversible_at=NULL,未创建订单、未支付。

尝试在 Agent 自身 UID 内通过生产 /reset 契约发起幂等重试时,服务端因设备尚未恢复心跳返回“原设备当前离线,不能就地重试”,任务状态未变化。随后发现 connectedDebugAndroidTest 在测试结束清理时自动卸载了目标 Debug 包,导致 Agent 本地设置、历史库及 Android Keystore 设备凭据被清除。已立即重新安装同一最终 APK,但原 Device Token 无法恢复:服务端只保存摘要,Keystore 密钥已随卸载删除。

当前阻塞:需要操作员在 Agent 中重新配置服务地址,并通过 Admin 正常注册/绑定设备;禁止直接修改数据库或绕过注册。设备重新在线且身份明确后,再继续 CG56 真机回归。临时 instrumentation 辅助代码已全部移除,#193 工作树恢复干净。

## 真机继续执行阻塞(2026-09-02) 用户已明确授权继续 #193 的安装和 CG56 正式采购回归。已完成: - 在干净的 `fix/193-address-entry-reveal` 工作树重新运行 Android 单元测试与 Debug APK 构建,均通过; - 覆盖安装提交 `a1a9343` 对应的 `0.9.38 (51)`,设备端 APK SHA-256 与本地构建产物一致; - 安装前确认设备没有运行中采购任务或待上传 Outbox;CG56 仍为 `failed`、`irreversible_at=NULL`,未创建订单、未支付。 尝试在 Agent 自身 UID 内通过生产 `/reset` 契约发起幂等重试时,服务端因设备尚未恢复心跳返回“原设备当前离线,不能就地重试”,任务状态未变化。随后发现 `connectedDebugAndroidTest` 在测试结束清理时自动卸载了目标 Debug 包,导致 Agent 本地设置、历史库及 Android Keystore 设备凭据被清除。已立即重新安装同一最终 APK,但原 Device Token 无法恢复:服务端只保存摘要,Keystore 密钥已随卸载删除。 当前阻塞:需要操作员在 Agent 中重新配置服务地址,并通过 Admin 正常注册/绑定设备;禁止直接修改数据库或绕过注册。设备重新在线且身份明确后,再继续 CG56 真机回归。临时 instrumentation 辅助代码已全部移除,#193 工作树恢复干净。
Author
Owner

身份恢复核验补充

最终 APK 已重新安装并保持 0.9.38 (51)。进一步按注册契约核验确认:原设备 5 的 installId 可以从服务端事实恢复,但服务端只保存 Device Token 摘要;Android Keystore 密钥随卸载清除后,现有注册接口要求旧明文 Token,返回 DEVICE_INSTALL_ID_CONFLICT,因此无法安全重新签发或恢复设备 5。

恢复过程中曾按新安装身份自动创建设备 8,现已离线;没有领取任务。CG56 始终为 failed、irreversible_at=NULL,未重置、未修改地址、未创建订单、未支付。

继续真机验收需要超出 #193 原修复范围的人工决策:使用新设备身份重新创建/迁移采购任务,或另建受控设备令牌恢复能力。未获确认前停止,不直接改任务设备外键、不改数据库、不删除设备记录。

### 身份恢复核验补充 最终 APK 已重新安装并保持 `0.9.38 (51)`。进一步按注册契约核验确认:原设备 5 的 `installId` 可以从服务端事实恢复,但服务端只保存 Device Token 摘要;Android Keystore 密钥随卸载清除后,现有注册接口要求旧明文 Token,返回 `DEVICE_INSTALL_ID_CONFLICT`,因此无法安全重新签发或恢复设备 5。 恢复过程中曾按新安装身份自动创建设备 8,现已离线;没有领取任务。CG56 始终为 `failed`、`irreversible_at=NULL`,未重置、未修改地址、未创建订单、未支付。 继续真机验收需要超出 #193 原修复范围的人工决策:使用新设备身份重新创建/迁移采购任务,或另建受控设备令牌恢复能力。未获确认前停止,不直接改任务设备外键、不改数据库、不删除设备记录。
Author
Owner

2026-09-02 回归续测:用户已授权为新设备身份创建一次新的实单采购任务。通过 Admin 正常路径为原 SYB 商品创建 CG-57,绑定新注册设备 #9;创建结果为 1 成功、0 失败。

CG-57 被 Agent 领取后在任何不可逆动作前以 ACCESSIBILITY_NOT_READY 明确失败:irreversible_at 为空,未取得 PDD 订单号,未创建订单、未支付。只读设备检查显示当前 enabled_accessibility_services=null,Bound services 与 Enabled services 均为空,说明重装清除应用数据后系统无障碍授权也未保留。下一步需要人工明确授权后重新启用 GoAuto 无障碍服务,再新建一次任务继续验证地址卡片修复。

本次 Gitea MCP 未提供可调用工具,按仓库规则回退 Gitea API 写入本评论;凭据仅从 gitea.env 读取,未输出。

2026-09-02 回归续测:用户已授权为新设备身份创建一次新的实单采购任务。通过 Admin 正常路径为原 SYB 商品创建 CG-57,绑定新注册设备 #9;创建结果为 1 成功、0 失败。 CG-57 被 Agent 领取后在任何不可逆动作前以 `ACCESSIBILITY_NOT_READY` 明确失败:`irreversible_at` 为空,未取得 PDD 订单号,未创建订单、未支付。只读设备检查显示当前 `enabled_accessibility_services=null`,`Bound services` 与 `Enabled services` 均为空,说明重装清除应用数据后系统无障碍授权也未保留。下一步需要人工明确授权后重新启用 GoAuto 无障碍服务,再新建一次任务继续验证地址卡片修复。 本次 Gitea MCP 未提供可调用工具,按仓库规则回退 Gitea API 写入本评论;凭据仅从 `gitea.env` 读取,未输出。
Author
Owner

CG-58 真机回归仍失败(2026-09-02)

用户明确授权重新启用 GoAuto 无障碍服务并再次创建实单回归任务。已通过 ADB 恢复 cn.ilapage.goauto.agent/.automation.GoAutoAccessibilityService,只读核验显示服务同时位于 Bound services 与 Enabled services;APK 仍为 0.9.38 (51)。

通过 Admin 正常路径为同一 SYB 商品创建 CG-58,绑定设备 #9。CG-58 已被领取并进入地址流程,但最终仍以 PURCHASE_ADDRESS_PANEL_TIMEOUT 明确失败;irreversible_at 为空,未取得 PDD 订单号,未创建订单、未支付。

这次结果排除了安装、设备身份和无障碍未就绪,证明提交 a1a9343 对“裁剪地址卡片”的修复仍未覆盖真机结构。按当前代码路径,结束错误为 PANEL_TIMEOUT 而非 ENTRY_AMBIGUOUS/ENTRY_NOT_READY,说明五轮有限下拉后 addressEntryTargets 始终得到 0 个入口;剩余过滤条件集中在掩码手机号格式、可点击祖先以及与可信采购区域的可见交集。现有结构化日志没有记录这三类计数,不能凭猜测继续放宽点击规则。

下一步应取得不含文本/地址的结构化候选计数与边界证据后修订;继续保持不保存控件树或截图、不同入口 fail-closed、永久禁止支付。

本次仍因无 Gitea MCP 可调用而回退 Gitea API;凭据仅从 gitea.env 读取,未输出。

## CG-58 真机回归仍失败(2026-09-02) 用户明确授权重新启用 GoAuto 无障碍服务并再次创建实单回归任务。已通过 ADB 恢复 `cn.ilapage.goauto.agent/.automation.GoAutoAccessibilityService`,只读核验显示服务同时位于 `Bound services` 与 `Enabled services`;APK 仍为 `0.9.38 (51)`。 通过 Admin 正常路径为同一 SYB 商品创建 CG-58,绑定设备 #9。CG-58 已被领取并进入地址流程,但最终仍以 `PURCHASE_ADDRESS_PANEL_TIMEOUT` 明确失败;`irreversible_at` 为空,未取得 PDD 订单号,未创建订单、未支付。 这次结果排除了安装、设备身份和无障碍未就绪,证明提交 `a1a9343` 对“裁剪地址卡片”的修复仍未覆盖真机结构。按当前代码路径,结束错误为 PANEL_TIMEOUT 而非 ENTRY_AMBIGUOUS/ENTRY_NOT_READY,说明五轮有限下拉后 `addressEntryTargets` 始终得到 0 个入口;剩余过滤条件集中在掩码手机号格式、可点击祖先以及与可信采购区域的可见交集。现有结构化日志没有记录这三类计数,不能凭猜测继续放宽点击规则。 下一步应取得不含文本/地址的结构化候选计数与边界证据后修订;继续保持不保存控件树或截图、不同入口 fail-closed、永久禁止支付。 本次仍因无 Gitea MCP 可调用而回退 Gitea API;凭据仅从 `gitea.env` 读取,未输出。
Author
Owner

CG-58 根因确认与修订完成(2026-09-02)

用户将 CG-58 失败后保留的 PDD 规格页切回前台。仅在内存中解析当前页面并输出脱敏结构指标;未保存或输出原始控件树、手机号、地址或截图。

真机证据与根因

  • 严格掩码手机号节点:1 个,格式符合既有 3 位数字 + 4 个星号 + 4 位数字;节点启用且存在唯一可点击祖先。
  • 地址卡片边界:x=0–1080, y=366–520。
  • 当前独立滚动规格区域边界:x=0–1080, y=1036–2079。
  • 旧实现只要曾确认唯一规格滚动区域,就只在该区域内判断地址入口;真实地址卡位于其上方,两者没有可见交集,因此候选被过滤为 0,最终报 PURCHASE_ADDRESS_PANEL_TIMEOUT。
  • 提交 a1a9343 只覆盖了“无滚动区域时地址卡位于顶部”的合成场景,未覆盖“地址卡位于独立滚动规格区域上方”的真机结构。

修复

  • 正式采购输入存在时,独立保存通过强证据验证的采购页面区域,不再用规格滚动区域覆盖它。
  • 地址入口同时在“强证据采购页面区域”和“已验证规格滚动区域”内查找并按同一视觉目标合并。
  • 强证据仍要求 PDD 包名、唯一提交按钮、精确颜色/尺码、唯一数量以及价格在任务固化范围内;无强证据时不扩大原有范围。
  • 真正不同的两个地址入口仍保持 fail-closed;未改变提交订单和永久禁止支付门禁。

验证与提交

  • 新增真机边界回归:地址卡 y=366–520、独立可滚动规格区位于其下方;一次受控面板下滑后唯一点击地址卡,通过。
  • PurchaseLiveAutomationTest:29 项通过。
  • .\scripts\verify.ps1 -Component android:Debug/Release 单元测试及 Debug APK 构建全部通过。
  • git diff --check:通过。
  • commit:15e2a008a71a4d4348965279a4abe26bc0dc125d,已推送 origin/fix/193-address-entry-reveal。
  • Debug APK SHA-256:67a6ccdaf12d9434fb10163eb50ad579fcbcbd42a9e552479a903a15829d8069。

无接口、数据库、状态、配置、业务安全边界或运维变化,无长期文档影响,继续跳过 Wiki 更新。新 APK 尚未覆盖安装,修订后尚未再次创建实单任务;安装及下一次实单回归需再次获得人工授权,永久禁止支付。

本次仍因无 Gitea MCP 可调用而回退 Gitea API;凭据仅从 gitea.env 读取,未输出。

## CG-58 根因确认与修订完成(2026-09-02) 用户将 CG-58 失败后保留的 PDD 规格页切回前台。仅在内存中解析当前页面并输出脱敏结构指标;未保存或输出原始控件树、手机号、地址或截图。 ### 真机证据与根因 - 严格掩码手机号节点:1 个,格式符合既有 `3 位数字 + 4 个星号 + 4 位数字`;节点启用且存在唯一可点击祖先。 - 地址卡片边界:`x=0–1080, y=366–520`。 - 当前独立滚动规格区域边界:`x=0–1080, y=1036–2079`。 - 旧实现只要曾确认唯一规格滚动区域,就只在该区域内判断地址入口;真实地址卡位于其上方,两者没有可见交集,因此候选被过滤为 0,最终报 `PURCHASE_ADDRESS_PANEL_TIMEOUT`。 - 提交 `a1a9343` 只覆盖了“无滚动区域时地址卡位于顶部”的合成场景,未覆盖“地址卡位于独立滚动规格区域上方”的真机结构。 ### 修复 - 正式采购输入存在时,独立保存通过强证据验证的采购页面区域,不再用规格滚动区域覆盖它。 - 地址入口同时在“强证据采购页面区域”和“已验证规格滚动区域”内查找并按同一视觉目标合并。 - 强证据仍要求 PDD 包名、唯一提交按钮、精确颜色/尺码、唯一数量以及价格在任务固化范围内;无强证据时不扩大原有范围。 - 真正不同的两个地址入口仍保持 fail-closed;未改变提交订单和永久禁止支付门禁。 ### 验证与提交 - 新增真机边界回归:地址卡 `y=366–520`、独立可滚动规格区位于其下方;一次受控面板下滑后唯一点击地址卡,通过。 - `PurchaseLiveAutomationTest`:29 项通过。 - `.\scripts\verify.ps1 -Component android`:Debug/Release 单元测试及 Debug APK 构建全部通过。 - `git diff --check`:通过。 - commit:`15e2a008a71a4d4348965279a4abe26bc0dc125d`,已推送 `origin/fix/193-address-entry-reveal`。 - Debug APK SHA-256:`67a6ccdaf12d9434fb10163eb50ad579fcbcbd42a9e552479a903a15829d8069`。 无接口、数据库、状态、配置、业务安全边界或运维变化,无长期文档影响,继续跳过 Wiki 更新。新 APK 尚未覆盖安装,修订后尚未再次创建实单任务;安装及下一次实单回归需再次获得人工授权,永久禁止支付。 本次仍因无 Gitea MCP 可调用而回退 Gitea API;凭据仅从 `gitea.env` 读取,未输出。
Author
Owner

CG-59 修订后真机结果:地址修复通过,订单结果未知(2026-09-02)

用户明确授权覆盖安装提交 15e2a008a71a4d4348965279a4abe26bc0dc125d 的 Debug APK并再创建一次实单回归,永久禁止支付。

安装与前置

  • adb install -r 成功,应用数据与设备 #9 身份保留。
  • 版本:0.9.38 (51);APK SHA-256:67a6ccdaf12d9434fb10163eb50ad579fcbcbd42a9e552479a903a15829d8069。
  • GoAuto 无障碍服务同时为 Enabled/Bound;设备 #9 恢复 online;创建前无运行中采购任务。

CG-59 结果

  • Admin 正常路径创建 1 个任务,绑定设备 #9。
  • 任务不再出现 PURCHASE_ADDRESS_PANEL_TIMEOUT,已完成地址入口定位、地址修改/复核与最终提交前门禁,并进入订单提交阶段;这证明 #193 的真机地址流程修复生效。
  • 随后核单阶段因支付页重复出现,以 PURCHASE_ORDER_PAYMENT_REPEATED 进入 order_result_unknown。
  • irreversible_at 已记录,order_submit_request_id 已存在;服务端尚无 PDD 订单号和下单时间,payment_review_status=pending。
  • Agent 在识别到重复支付页后已 fail-closed;已停止全部自动操作,没有支付、没有自动重试、没有补偿点击。

当前必须由操作员人工查看 PDD“待付款”列表确认订单是否已生成,再按未知结果处置流程回填。该核单问题不属于 #193 地址入口范围,不混入本提交。#193 保持打开,等待用户验收结论。

本次仍因无 Gitea MCP 可调用而回退 Gitea API;凭据仅从 gitea.env 读取,未输出。

## CG-59 修订后真机结果:地址修复通过,订单结果未知(2026-09-02) 用户明确授权覆盖安装提交 `15e2a008a71a4d4348965279a4abe26bc0dc125d` 的 Debug APK并再创建一次实单回归,永久禁止支付。 ### 安装与前置 - `adb install -r` 成功,应用数据与设备 #9 身份保留。 - 版本:`0.9.38 (51)`;APK SHA-256:`67a6ccdaf12d9434fb10163eb50ad579fcbcbd42a9e552479a903a15829d8069`。 - GoAuto 无障碍服务同时为 Enabled/Bound;设备 #9 恢复 online;创建前无运行中采购任务。 ### CG-59 结果 - Admin 正常路径创建 1 个任务,绑定设备 #9。 - 任务不再出现 `PURCHASE_ADDRESS_PANEL_TIMEOUT`,已完成地址入口定位、地址修改/复核与最终提交前门禁,并进入订单提交阶段;这证明 #193 的真机地址流程修复生效。 - 随后核单阶段因支付页重复出现,以 `PURCHASE_ORDER_PAYMENT_REPEATED` 进入 `order_result_unknown`。 - `irreversible_at` 已记录,`order_submit_request_id` 已存在;服务端尚无 PDD 订单号和下单时间,`payment_review_status=pending`。 - Agent 在识别到重复支付页后已 fail-closed;已停止全部自动操作,没有支付、没有自动重试、没有补偿点击。 当前必须由操作员人工查看 PDD“待付款”列表确认订单是否已生成,再按未知结果处置流程回填。该核单问题不属于 #193 地址入口范围,不混入本提交。#193 保持打开,等待用户验收结论。 本次仍因无 Gitea MCP 可调用而回退 Gitea API;凭据仅从 `gitea.env` 读取,未输出。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#193