fix(agent): 改地址返回采购面板后支持底部提交按钮结构定位(CG81,关联 #247) #248

Open
opened 2026-09-09 10:35:43 +08:00 by ila · 2 comments
Owner

状态与授权记录

已实现、测试、提交推送并授权覆盖安装,待用户验收;不关闭。

  • 建单时用户要求先不实施;2026-09-09 随后明确“做#248”,授权按本单方案实施、测试和构建。
  • 实施过程中用户另行授权安装到 192.168.0.9:35399,已覆盖安装 0.9.66 / 79 并回读确认,保留原数据。
  • 未触发真实采购重试、地址修改、创建订单或付款,未改 Server/Web/数据库/规则,未合并 main。详细实现、验证、Wiki 和安装证据见完成评论。

来源、目标与确认

  • 来源:2026-09-09 用户反馈 CG81 在 Agent 0.9.65 重试,修改地址返回规格面板后提示“地址保存后规格面板无法定位订单确认信息,未创建订单”。
  • 用户说明内部系统应简单易用,建议以返回后的地址入口和面板结构判断当前位置,在下单文字变动时使用面板底部按钮。
  • 本会话已确认最小流程:地址入口及当前任务后缀 + 既有规格摘要或数量证据;旧文案识别优先;匹配不到时定位面板底部唯一独立可点击按钮容器;保留最终规格、数量、价格和一次提交控制。
  • 建单时用户指令为按此最小流程建工单,先不实施,等待切换模型;后续实施与安装授权见上方记录。
  • 目标:解决下单按钮展示文字变化引发的地址误报与无效滚动,不为采购员增加操作、配置或审批。

已核验事实与基线

核验日期:2026-09-09。代码基线 bec8c8432159c58f5050489e4d2c4c04053f9507,分支 fix/247-short-address-panel,已推送、未合并 main;Android 0.9.65 / versionCode 78。

  • 目标手机已只读回读为该版本。CG81 第 12 次 attempt 失败,主任务错误码 PURCHASE_ADDRESS_SAVE_TIMEOUT,提示与用户反馈一致。
  • 只读现场能识别当前任务地址后缀;底部按钮为“复购价,”文字节点和金额节点组成,两个文字节点本身不可点击,共同父容器可点击。
  • PurchaseLiveAutomation.kt:766 的 FINAL_SUBMIT_MARKERS 只含“提交订单”“现在买,仅”“确认购买”,现有 finalSubmitTargets 不识别上述按钮。
  • hasFinalSavedAddressEvidence 把地址回读与唯一提交按钮识别绑定。按钮未命中时,即使地址后缀已显示,也进入 restoreFinalEvidenceInCurrentPanel 滚动恢复;本次错误精确对应 swipePurchaseIn 返回 false 的分支。
  • 底层局部滑动为何返回 false 缺少细分日志,尚未证实,不把“到边”“手势取消”“动画漂移”写成已确认根因。本单不顺带重写滑动执行器。
  • 现有地址入口解析主要识别手机号/地址卡片,并非页面分类器;仅有地址入口不能单独判定为采购面板。
  • 现场底部按钮是规格滚动区的外部兄弟区域。整个采购弹层边界与颜色/尺码 RecyclerView 边界必须区分,不能把滚动区当成整个面板而再次排除按钮。
    未保存原始 XML、整屏截图、地址全文、手机号或订单数据;未进行本轮真实下单验证。

依赖、范围与并行

  • 关联 #247、#246、#227、#152。依赖已有 #246 地址返回路径与 #247 矮面板识别代码,不宣称这些工单已获真机验收。
  • 实施前核对上述基线及最新分支状态;同一地址/下单文件的关联修改串行处理,不与其并行编辑。不混入无关 worktree 改动。
  • 交付单元:仅 Android 采购自动化及相关测试;按文档影响更新对应长期 Wiki。
  • Server/Web、API、数据库、采购规则 JSON、权限、租约及任务重试语义不变;不新增用户界面、配置开关或操作步骤。

已确认最小方案 / 设计证据

本会话于 2026-09-09 由用户确认下述流程并要求建单。属于恢复采购行为的缺陷,无新 UI,不要求完整原型;本节为流程设计证据。

  1. 分离地址验证与提交按钮定位。 地址保存退出后,确认仍在 PDD、地址入口及当前任务后缀存在,并保留已有规格摘要或数量控件证据,作为本次从地址编辑返回采购面板的上下文。保留现有地址回读规则,不能仅凭“存在地址入口”放行;不能让新上下文判断再依赖旧下单文案,形成循环条件。
  2. 旧路径优先、限定结构补充。 先沿用既有下单文字识别;仅没有匹配目标时,且本次已完成地址修改并返回采购面板,才查找整个采购弹层底部固定操作区内唯一、独立、可见启用的可点击按钮容器。合并其文字/金额子节点为同一个目标,不要求固定展示文案,不按控件树最后一项或固定屏幕坐标盲点,不使用覆盖整个弹层的大祖先作为按钮。
  3. 不因文案变化无效滚动。 地址已确认后不再为寻找底部固定按钮滚动颜色/尺码列表;确实缺少地址时沿用既有有界恢复。按钮无法识别或不唯一时提示按钮问题,不再误报地址保存超时。
  4. 统一定位与一次提交。 地址返回后的按钮检查、最终复核及真正提交使用一致的定位规则;实际点击前重新读取并核对目标,不复用过期节点。保留现有规格、数量、价格、地址、不可逆边界和一次提交逻辑,不增加重复点击或下单手势兜底。
  5. 保留最小安全边界。 多个底部候选、地址管理/编辑页、订单详情/支付页、明确付款动作、系统导航及悬浮控件均不得成为结构补充目标。当前确认仅针对已知采购面板内的提交按钮;不能退化为“只要有地址就点击最下方”。失败时明确停止,不增加面向采购员的新门禁。

验收条件

  • 已支持的“提交订单”“现在买,仅”“确认购买”继续走原成功路径,未触发不必要滚动或额外点击。
  • 合成复现“复购价,”与金额为兄弟子节点、底部按钮位于规格滚动区之外的结构;改地址返回后正确定位其唯一独立可点击容器。
  • 同样已确认的面板结构中,仅非支付展示文字变动仍可定位,不需逐个新增文案白名单。
  • 地址后缀已回读、旧文案未命中时不再进入无效滚动;地址缺失与按钮缺失/歧义分别报告。
  • 只有地址入口、仅有底部价格文字、多个独立操作容器、覆盖整页的大父节点、支付动作或页面改变时不误点;文字和金额的重复子节点不得被计为多个按钮。
  • 最终检查和点击定位一致;规格/数量/价格/地址不符仍停止,未通过不可逆边界不提交,单 attempt 不重复点击。
  • 已完成受影响测试、全量 353 项单元测试及 APK 构建、提交推送,真实采购效果待用户验收。
  • 获得后续明确真机授权后,使用 CG81 验证改地址返回、底部按钮识别及只读核单,并核对正常采购路径;不执行付款。未经验证不得宣称真实采购已修复。

后续验证方法

在对应实施 worktree 的 android/ 执行 gradlew.bat :app:testDebugUnitTest :app:assembleDebug --console=plain,补充覆盖真实几何关系的合成测试,不保存原始树或个人数据。提交前检查差异,推送前检查远端分支。构建与安装已获后续授权并完成;真实地址修改与创建订单未执行,仍需对象和范围明确的真机授权。

风险、非目标与文档影响

  • 此改动涉及创建订单目标定位,后续实施/真机操作必须遵守明确授权边界;内部系统简化不等于允许支付或不确定目标点击。
  • 不改颜色/尺码选择、AI 匹配、商品深链、通用面板解析器、滑动执行器、Admin、任务状态机,不批量调整现有规则,不新建或重置 CG81。
  • 有长期文档影响:后续实施时更新 Business-Rules-and-Glossary,说明地址确认与提交目标解耦、改地址返回后的结构补充范围及禁止支付边界;共享 API 无变化。先线上修改并回读 revision,再一轮 harness.py sync 与 sync --check,提交相关只读镜像。实施阶段已按此完成 Wiki 更新和一轮镜像同步、检查;不导出任务归档。

工具

当前工具列表无可用 Gitea MCP,因此回退项目安全配置提供凭据的 Gitea API;凭据不输出、不入工单。

## 状态与授权记录 **已实现、测试、提交推送并授权覆盖安装,待用户验收;不关闭。** - 建单时用户要求先不实施;2026-09-09 随后明确“做#248”,授权按本单方案实施、测试和构建。 - 实施过程中用户另行授权安装到 `192.168.0.9:35399`,已覆盖安装 0.9.66 / 79 并回读确认,保留原数据。 - 未触发真实采购重试、地址修改、创建订单或付款,未改 Server/Web/数据库/规则,未合并 main。详细实现、验证、Wiki 和安装证据见完成评论。 ## 来源、目标与确认 - 来源:2026-09-09 用户反馈 CG81 在 Agent 0.9.65 重试,修改地址返回规格面板后提示“地址保存后规格面板无法定位订单确认信息,未创建订单”。 - 用户说明内部系统应简单易用,建议以返回后的地址入口和面板结构判断当前位置,在下单文字变动时使用面板底部按钮。 - 本会话已确认最小流程:地址入口及当前任务后缀 + 既有规格摘要或数量证据;旧文案识别优先;匹配不到时定位面板底部唯一独立可点击按钮容器;保留最终规格、数量、价格和一次提交控制。 - 建单时用户指令为按此最小流程建工单,先不实施,等待切换模型;后续实施与安装授权见上方记录。 - 目标:解决下单按钮展示文字变化引发的地址误报与无效滚动,不为采购员增加操作、配置或审批。 ## 已核验事实与基线 核验日期:2026-09-09。代码基线 `bec8c8432159c58f5050489e4d2c4c04053f9507`,分支 `fix/247-short-address-panel`,已推送、未合并 main;Android 0.9.65 / versionCode 78。 - 目标手机已只读回读为该版本。CG81 第 12 次 attempt 失败,主任务错误码 `PURCHASE_ADDRESS_SAVE_TIMEOUT`,提示与用户反馈一致。 - 只读现场能识别当前任务地址后缀;底部按钮为“复购价,”文字节点和金额节点组成,两个文字节点本身不可点击,共同父容器可点击。 - `PurchaseLiveAutomation.kt:766` 的 `FINAL_SUBMIT_MARKERS` 只含“提交订单”“现在买,仅”“确认购买”,现有 `finalSubmitTargets` 不识别上述按钮。 - `hasFinalSavedAddressEvidence` 把地址回读与唯一提交按钮识别绑定。按钮未命中时,即使地址后缀已显示,也进入 `restoreFinalEvidenceInCurrentPanel` 滚动恢复;本次错误精确对应 `swipePurchaseIn` 返回 false 的分支。 - 底层局部滑动为何返回 false 缺少细分日志,尚未证实,不把“到边”“手势取消”“动画漂移”写成已确认根因。本单不顺带重写滑动执行器。 - 现有地址入口解析主要识别手机号/地址卡片,并非页面分类器;仅有地址入口不能单独判定为采购面板。 - 现场底部按钮是规格滚动区的外部兄弟区域。整个采购弹层边界与颜色/尺码 `RecyclerView` 边界必须区分,不能把滚动区当成整个面板而再次排除按钮。 未保存原始 XML、整屏截图、地址全文、手机号或订单数据;未进行本轮真实下单验证。 ## 依赖、范围与并行 - 关联 #247、#246、#227、#152。依赖已有 #246 地址返回路径与 #247 矮面板识别代码,不宣称这些工单已获真机验收。 - 实施前核对上述基线及最新分支状态;同一地址/下单文件的关联修改串行处理,不与其并行编辑。不混入无关 worktree 改动。 - 交付单元:仅 Android 采购自动化及相关测试;按文档影响更新对应长期 Wiki。 - Server/Web、API、数据库、采购规则 JSON、权限、租约及任务重试语义不变;不新增用户界面、配置开关或操作步骤。 ## 已确认最小方案 / 设计证据 本会话于 2026-09-09 由用户确认下述流程并要求建单。属于恢复采购行为的缺陷,无新 UI,不要求完整原型;本节为流程设计证据。 1. **分离地址验证与提交按钮定位。** 地址保存退出后,确认仍在 PDD、地址入口及当前任务后缀存在,并保留已有规格摘要或数量控件证据,作为本次从地址编辑返回采购面板的上下文。保留现有地址回读规则,不能仅凭“存在地址入口”放行;不能让新上下文判断再依赖旧下单文案,形成循环条件。 2. **旧路径优先、限定结构补充。** 先沿用既有下单文字识别;仅没有匹配目标时,且本次已完成地址修改并返回采购面板,才查找整个采购弹层底部固定操作区内唯一、独立、可见启用的可点击按钮容器。合并其文字/金额子节点为同一个目标,不要求固定展示文案,不按控件树最后一项或固定屏幕坐标盲点,不使用覆盖整个弹层的大祖先作为按钮。 3. **不因文案变化无效滚动。** 地址已确认后不再为寻找底部固定按钮滚动颜色/尺码列表;确实缺少地址时沿用既有有界恢复。按钮无法识别或不唯一时提示按钮问题,不再误报地址保存超时。 4. **统一定位与一次提交。** 地址返回后的按钮检查、最终复核及真正提交使用一致的定位规则;实际点击前重新读取并核对目标,不复用过期节点。保留现有规格、数量、价格、地址、不可逆边界和一次提交逻辑,不增加重复点击或下单手势兜底。 5. **保留最小安全边界。** 多个底部候选、地址管理/编辑页、订单详情/支付页、明确付款动作、系统导航及悬浮控件均不得成为结构补充目标。当前确认仅针对已知采购面板内的提交按钮;不能退化为“只要有地址就点击最下方”。失败时明确停止,不增加面向采购员的新门禁。 ## 验收条件 - [ ] 已支持的“提交订单”“现在买,仅”“确认购买”继续走原成功路径,未触发不必要滚动或额外点击。 - [ ] 合成复现“复购价,”与金额为兄弟子节点、底部按钮位于规格滚动区之外的结构;改地址返回后正确定位其唯一独立可点击容器。 - [ ] 同样已确认的面板结构中,仅非支付展示文字变动仍可定位,不需逐个新增文案白名单。 - [ ] 地址后缀已回读、旧文案未命中时不再进入无效滚动;地址缺失与按钮缺失/歧义分别报告。 - [ ] 只有地址入口、仅有底部价格文字、多个独立操作容器、覆盖整页的大父节点、支付动作或页面改变时不误点;文字和金额的重复子节点不得被计为多个按钮。 - [ ] 最终检查和点击定位一致;规格/数量/价格/地址不符仍停止,未通过不可逆边界不提交,单 attempt 不重复点击。 - [x] 已完成受影响测试、全量 353 项单元测试及 APK 构建、提交推送,真实采购效果待用户验收。 - [ ] 获得后续明确真机授权后,使用 CG81 验证改地址返回、底部按钮识别及只读核单,并核对正常采购路径;不执行付款。未经验证不得宣称真实采购已修复。 ## 后续验证方法 在对应实施 worktree 的 `android/` 执行 `gradlew.bat :app:testDebugUnitTest :app:assembleDebug --console=plain`,补充覆盖真实几何关系的合成测试,不保存原始树或个人数据。提交前检查差异,推送前检查远端分支。构建与安装已获后续授权并完成;真实地址修改与创建订单未执行,仍需对象和范围明确的真机授权。 ## 风险、非目标与文档影响 - 此改动涉及创建订单目标定位,后续实施/真机操作必须遵守明确授权边界;内部系统简化不等于允许支付或不确定目标点击。 - 不改颜色/尺码选择、AI 匹配、商品深链、通用面板解析器、滑动执行器、Admin、任务状态机,不批量调整现有规则,不新建或重置 CG81。 - 有长期文档影响:后续实施时更新 `Business-Rules-and-Glossary`,说明地址确认与提交目标解耦、改地址返回后的结构补充范围及禁止支付边界;共享 API 无变化。先线上修改并回读 revision,再一轮 `harness.py sync` 与 `sync --check`,提交相关只读镜像。实施阶段已按此完成 Wiki 更新和一轮镜像同步、检查;不导出任务归档。 ## 工具 当前工具列表无可用 Gitea MCP,因此回退项目安全配置提供凭据的 Gitea API;凭据不输出、不入工单。
Author
Owner

2026-09-09 用户明确指令“做#248”,现开始按已确认最小方案实施 Android 代码、测试及构建,基线 bec8c84,分支 fix/248-bottom-submit。此前仅建单暂停已解除;不安装、不操作真实采购/地址/订单、不付款。Gitea MCP 不可用,继续使用安全配置的 API。依赖 #246/#247 代码已具备,真机验收未完成;本单不改 Server/Web/数据库/规则/通用滑动器。

2026-09-09 用户明确指令“做#248”,现开始按已确认最小方案实施 Android 代码、测试及构建,基线 bec8c84,分支 fix/248-bottom-submit。此前仅建单暂停已解除;不安装、不操作真实采购/地址/订单、不付款。Gitea MCP 不可用,继续使用安全配置的 API。依赖 #246/#247 代码已具备,真机验收未完成;本单不改 Server/Web/数据库/规则/通用滑动器。
Author
Owner

实现完成并授权安装,待验收

实现与提交

  • 代码 c80c746,Wiki 镜像 8a3367a;基线 bec8c84,分支 fix/248-bottom-submit 已推送,未合并 main。
  • 仅 Android PurchaseLiveAutomation.kt、对应测试与版本号变化;原提交文案识别优先,旧文案存在但歧义不启用结构补充。
  • 地址回读与按钮定位解耦。当前地址及返回采购弹层的上下文已确认时,不再因按钮文字变化滚动规格区;按钮缺失/歧义提示按钮问题。
  • 结构补充仅用于本执行器刚完成改地址的流程:PDD、唯一地址入口、当前后缀、数量或已选摘要,取最近共同祖先作为整个弹层,排除全屏大祖先与地址编辑/订单/支付页。底部独立非滚动按钮须唯一,文字和人民币金额子节点归为一个动作,排除付款等动作;不采用全屏末节点或固定坐标,不改变通用解析器和滑动执行器。
  • 地址检查、最终复核及真正提交共用定位;保留原文字锚点,经原 clickFresh 重新定位并点击最近可点击父级。结构路径必须先通过最终复核;提交前再次核对锚点,复核失败清除锚点。原规格/数量/价格/地址及不可逆边界、一次提交逻辑保留,无下单手势兜底。

验证

  • 新增 9 项测试,覆盖复购价/其他非支付文案与金额拆分、按钮在规格滚动区之外、地址返回一次 Back、无效滚动消除、旧文案路径、缺失/歧义/纯价格/禁用/付款按钮拒绝、全屏大祖先/地址单一证据/订单支付页拒绝、重复文字归一/外部悬浮节点排除、最终规格数量价格地址复核、缺少当前执行上下文、提交前目标变化以及复核失败清除锚点。
  • 最终执行 gradlew.bat :app:testDebugUnitTest :app:assembleDebug --console=plain 成功;353 tests / 0 failures / 0 errors。差异检查通过。测试均为合成结构,未保存原始树、整屏截图或个人数据。
  • APK android/app/build/outputs/apk/debug/app-debug.apk:0.9.66 / versionCode 79;SHA256 ef82f2d339f3574cbcb01850dd20a0a2238e059b3c42446ebfd31970f1097ce3。

用户授权安装

  • 用户追加授权安装至 192.168.0.9:35399。安装前确认设备在线、原版本 0.9.65/78,线上运行采集与运行/提交中采购计数均 0。
  • adb install -r 返回 Success,回读 versionName=0.9.66、versionCode=79、lastUpdateTime=2026-09-09 10:47:36,保留原数据。
  • 未发起采购重试、修改真实地址、创建订单或付款;CG81 的真实结果和正常采购回归仍待用户验证,不宣称真机采购已成功。

文档与范围

  • Business-Rules-and-Glossary 在线回读 revision a445dfe3b76336f5c7387a2da9760c5d6e383ff6,完成唯一一轮 harness.py sync 和 sync --check,全部核心镜像一致。Wiki 中“尚未安装”对应写入时点;随后追加授权的安装事实以上述记录为准,不因安装重复同步 Wiki。
  • 仅提交本单业务镜像;同步带入的架构/API/SYB/部署 4 份无关镜像变化留在 worktree、未混入本单提交。没有修改这些线上页面,无任务归档。
  • 未改 Server/Web、API、数据库、规则 JSON 或任务租约,不重启服务器。未对底层滑动 false 的未确认原因做额外修复。
  • Gitea MCP 不可用,沿用安全配置的 API 完成回写。工单保持待验收,不关闭。
## 实现完成并授权安装,待验收 ### 实现与提交 - 代码 `c80c746`,Wiki 镜像 `8a3367a`;基线 `bec8c84`,分支 `fix/248-bottom-submit` 已推送,未合并 main。 - 仅 Android `PurchaseLiveAutomation.kt`、对应测试与版本号变化;原提交文案识别优先,旧文案存在但歧义不启用结构补充。 - 地址回读与按钮定位解耦。当前地址及返回采购弹层的上下文已确认时,不再因按钮文字变化滚动规格区;按钮缺失/歧义提示按钮问题。 - 结构补充仅用于本执行器刚完成改地址的流程:PDD、唯一地址入口、当前后缀、数量或已选摘要,取最近共同祖先作为整个弹层,排除全屏大祖先与地址编辑/订单/支付页。底部独立非滚动按钮须唯一,文字和人民币金额子节点归为一个动作,排除付款等动作;不采用全屏末节点或固定坐标,不改变通用解析器和滑动执行器。 - 地址检查、最终复核及真正提交共用定位;保留原文字锚点,经原 clickFresh 重新定位并点击最近可点击父级。结构路径必须先通过最终复核;提交前再次核对锚点,复核失败清除锚点。原规格/数量/价格/地址及不可逆边界、一次提交逻辑保留,无下单手势兜底。 ### 验证 - 新增 9 项测试,覆盖复购价/其他非支付文案与金额拆分、按钮在规格滚动区之外、地址返回一次 Back、无效滚动消除、旧文案路径、缺失/歧义/纯价格/禁用/付款按钮拒绝、全屏大祖先/地址单一证据/订单支付页拒绝、重复文字归一/外部悬浮节点排除、最终规格数量价格地址复核、缺少当前执行上下文、提交前目标变化以及复核失败清除锚点。 - 最终执行 `gradlew.bat :app:testDebugUnitTest :app:assembleDebug --console=plain` 成功;353 tests / 0 failures / 0 errors。差异检查通过。测试均为合成结构,未保存原始树、整屏截图或个人数据。 - APK `android/app/build/outputs/apk/debug/app-debug.apk`:0.9.66 / versionCode 79;SHA256 `ef82f2d339f3574cbcb01850dd20a0a2238e059b3c42446ebfd31970f1097ce3`。 ### 用户授权安装 - 用户追加授权安装至 `192.168.0.9:35399`。安装前确认设备在线、原版本 0.9.65/78,线上运行采集与运行/提交中采购计数均 0。 - `adb install -r` 返回 Success,回读 `versionName=0.9.66`、`versionCode=79`、`lastUpdateTime=2026-09-09 10:47:36`,保留原数据。 - 未发起采购重试、修改真实地址、创建订单或付款;CG81 的真实结果和正常采购回归仍待用户验证,不宣称真机采购已成功。 ### 文档与范围 - Business-Rules-and-Glossary 在线回读 revision `a445dfe3b76336f5c7387a2da9760c5d6e383ff6`,完成唯一一轮 `harness.py sync` 和 `sync --check`,全部核心镜像一致。Wiki 中“尚未安装”对应写入时点;随后追加授权的安装事实以上述记录为准,不因安装重复同步 Wiki。 - 仅提交本单业务镜像;同步带入的架构/API/SYB/部署 4 份无关镜像变化留在 worktree、未混入本单提交。没有修改这些线上页面,无任务归档。 - 未改 Server/Web、API、数据库、规则 JSON 或任务租约,不重启服务器。未对底层滑动 false 的未确认原因做额外修复。 - Gitea MCP 不可用,沿用安全配置的 API 完成回写。工单保持待验收,不关闭。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#248