fix(android): 最终规格复核有限重定位滚出视口的已选维度 #224

Open
opened 2026-09-05 16:17:20 +08:00 by ila · 4 comments
Owner

原始需求摘要

来源:用户于 2026-09-05 反馈,最新版 Agent 执行 CG90 时失败:最终规格复核未能确认精确选中状态 [dimension=color,reason=summary_token_missing,panel=normal_scrollable,summary=false,tokenMatched=false,candidates=0,proof=true],并确认按分析方案建单实施。

当前事实与根因

  • CG90 固化的执行规格为颜色“新中式上衣:青花瓷”、尺码“XL 建议120-140斤”,规格决策已完成;本缺陷不在 Admin 映射或采购规则。
  • proof=true 表示同一次执行中,目标颜色曾在唯一候选上取得精确选中证据。
  • 最终 VERIFY_ORDER_SUMMARY 只解析当前视口:颜色行滚出视口后得到 candidates=0;新版普通滚动规格面板又没有解析到“已选”汇总,得到 summary=false,于是以 summary_token_missing fail-closed。
  • 现有最终复核不会在已锁定的规格面板内有限滚动、重新找到各维度目标。因此“目标已选择但维度暂时不可见且无汇总”的页面会误判失败。
  • CG90 在修改地址和创建订单之前失败,没有越过不可逆下单边界。

目标

最终规格复核不再把当前视口或“已选”汇总作为唯一证据;在已确认且锁定的规格面板容器内有限重定位每个目标维度,以新读取的页面证据确认精确规格仍然选中。

非目标

  • 不放宽精确匹配,不接受相近规格或多候选。
  • 不仅凭历史 proof=true 直接放行。
  • 不修改服务端映射、采购规则、价格保护、地址或订单状态机。
  • 不自动重试 CG90,不在实施/自动测试中修改真实地址、创建订单或付款。
  • 不保存原始控件树或整屏截图,不引入 OCR/VLM。

前置依赖与并行性

  • 基于 #214 的唯一目标、新鲜节点、锁定面板和有限滚动安全约束。
  • 与 #223 已完成的探测后规格决策兼容;#223 负责下发精确规格,本单只负责 Android 最终复核。
  • 可独立实施,无数据库、接口、权限或服务端依赖。

实施方案

  1. 把最终规格复核改为按维度执行只读的有限重定位:每次重新抓取页面、确认仍是同一规格面板,并只在解析器已锁定的面板容器内滚动。
  2. 当前视口可见唯一精确目标且节点暴露 selected/checked 时立即确认;已选汇总精确命中且当前无冲突时沿用既有确认规则。
  3. 当前维度不可见时,沿既有安全方向和次数有限搜索,重新解析后验证目标;容器缺失、页面变化、多候选、不可选、到边或仍无新鲜选中证据时明确失败。
  4. 同一次执行的旧选择 proof 只用于说明曾经成功选择和桥接可见性判断,不能单独替代最终新鲜复核;不得为了复核再次点击规格。
  5. 诊断只记录维度、面板类型、候选计数、汇总/匹配/proof/重定位结果等脱敏标量。

验收标准

  • 普通滚动面板中,颜色滚出当前视口且没有“已选”汇总时,最终复核会在锁定容器内有限滚动回颜色行,并在取得新鲜精确选中证据后通过。
  • 尺码和颜色均按服务端下发的完整精确值复核,不按短 token 猜测完整目标。
  • 当前可见但未选、目标消失、目标不唯一、容器丢失、页面变化或有限搜索到边时继续 fail-closed。
  • 最终复核不点击规格,不触及地址、创建订单或支付控件。
  • 既有“汇总 + 唯一候选”“已选节点”“可见冲突”和长尺码 token 回归测试继续通过。

验证

  • Android 单元测试覆盖:颜色滚出视口且无汇总后重定位成功;重定位仍无新鲜选中证据失败;多候选/页面变化/容器缺失失败;既有最终复核回归。
  • 运行受影响 Android 单元测试并构建 APK。
  • 真机只安装新版 APK;正式采购、地址修改和创建订单仍由用户单独触发验收。

风险与安全边界

本单位于创建订单前的采购安全门禁。重定位只允许在解析器已确认的规格面板容器内执行有限滚动,不点击规格和订单动作;证据不足必须失败。付款永久禁止。

设计证据

恢复既有采购流程的 Android 内部缺陷,无新增页面或交互,按规则免 UI 原型。方案已由用户于 2026-09-05 以“按照你的建议来建工单,做”确认。

文档影响

无长期文档影响:不改变 API、数据、配置、状态机或既有“精确选择、有限滚动、证据不足失败”的长期安全规则,只修复其 Android 实现偏差,因此跳过 Wiki 更新与同步。

工具说明

当前会话未提供项目 Gitea MCP 的工单读写能力,按仓库规则回退项目已配置的 Gitea API;凭据仅从本机 gitea.env 读取,未写入工单或日志。

任务记录

  • 默认不创建任务快照。
  • 完成后提交、推送并回写验证和提交哈希,工单保持待验收。
## 原始需求摘要 来源:用户于 2026-09-05 反馈,最新版 Agent 执行 CG90 时失败:`最终规格复核未能确认精确选中状态 [dimension=color,reason=summary_token_missing,panel=normal_scrollable,summary=false,tokenMatched=false,candidates=0,proof=true]`,并确认按分析方案建单实施。 ## 当前事实与根因 - CG90 固化的执行规格为颜色“新中式上衣:青花瓷”、尺码“XL 建议120-140斤”,规格决策已完成;本缺陷不在 Admin 映射或采购规则。 - `proof=true` 表示同一次执行中,目标颜色曾在唯一候选上取得精确选中证据。 - 最终 `VERIFY_ORDER_SUMMARY` 只解析当前视口:颜色行滚出视口后得到 `candidates=0`;新版普通滚动规格面板又没有解析到“已选”汇总,得到 `summary=false`,于是以 `summary_token_missing` fail-closed。 - 现有最终复核不会在已锁定的规格面板内有限滚动、重新找到各维度目标。因此“目标已选择但维度暂时不可见且无汇总”的页面会误判失败。 - CG90 在修改地址和创建订单之前失败,没有越过不可逆下单边界。 ## 目标 最终规格复核不再把当前视口或“已选”汇总作为唯一证据;在已确认且锁定的规格面板容器内有限重定位每个目标维度,以新读取的页面证据确认精确规格仍然选中。 ## 非目标 - 不放宽精确匹配,不接受相近规格或多候选。 - 不仅凭历史 `proof=true` 直接放行。 - 不修改服务端映射、采购规则、价格保护、地址或订单状态机。 - 不自动重试 CG90,不在实施/自动测试中修改真实地址、创建订单或付款。 - 不保存原始控件树或整屏截图,不引入 OCR/VLM。 ## 前置依赖与并行性 - 基于 #214 的唯一目标、新鲜节点、锁定面板和有限滚动安全约束。 - 与 #223 已完成的探测后规格决策兼容;#223 负责下发精确规格,本单只负责 Android 最终复核。 - 可独立实施,无数据库、接口、权限或服务端依赖。 ## 实施方案 1. 把最终规格复核改为按维度执行只读的有限重定位:每次重新抓取页面、确认仍是同一规格面板,并只在解析器已锁定的面板容器内滚动。 2. 当前视口可见唯一精确目标且节点暴露 `selected/checked` 时立即确认;已选汇总精确命中且当前无冲突时沿用既有确认规则。 3. 当前维度不可见时,沿既有安全方向和次数有限搜索,重新解析后验证目标;容器缺失、页面变化、多候选、不可选、到边或仍无新鲜选中证据时明确失败。 4. 同一次执行的旧选择 proof 只用于说明曾经成功选择和桥接可见性判断,不能单独替代最终新鲜复核;不得为了复核再次点击规格。 5. 诊断只记录维度、面板类型、候选计数、汇总/匹配/proof/重定位结果等脱敏标量。 ## 验收标准 - 普通滚动面板中,颜色滚出当前视口且没有“已选”汇总时,最终复核会在锁定容器内有限滚动回颜色行,并在取得新鲜精确选中证据后通过。 - 尺码和颜色均按服务端下发的完整精确值复核,不按短 token 猜测完整目标。 - 当前可见但未选、目标消失、目标不唯一、容器丢失、页面变化或有限搜索到边时继续 fail-closed。 - 最终复核不点击规格,不触及地址、创建订单或支付控件。 - 既有“汇总 + 唯一候选”“已选节点”“可见冲突”和长尺码 token 回归测试继续通过。 ## 验证 - Android 单元测试覆盖:颜色滚出视口且无汇总后重定位成功;重定位仍无新鲜选中证据失败;多候选/页面变化/容器缺失失败;既有最终复核回归。 - 运行受影响 Android 单元测试并构建 APK。 - 真机只安装新版 APK;正式采购、地址修改和创建订单仍由用户单独触发验收。 ## 风险与安全边界 本单位于创建订单前的采购安全门禁。重定位只允许在解析器已确认的规格面板容器内执行有限滚动,不点击规格和订单动作;证据不足必须失败。付款永久禁止。 ## 设计证据 恢复既有采购流程的 Android 内部缺陷,无新增页面或交互,按规则免 UI 原型。方案已由用户于 2026-09-05 以“按照你的建议来建工单,做”确认。 ## 文档影响 无长期文档影响:不改变 API、数据、配置、状态机或既有“精确选择、有限滚动、证据不足失败”的长期安全规则,只修复其 Android 实现偏差,因此跳过 Wiki 更新与同步。 ## 工具说明 当前会话未提供项目 Gitea MCP 的工单读写能力,按仓库规则回退项目已配置的 Gitea API;凭据仅从本机 `gitea.env` 读取,未写入工单或日志。 ## 任务记录 - 默认不创建任务快照。 - 完成后提交、推送并回写验证和提交哈希,工单保持待验收。
Author
Owner

实施完成,待验收

提交:cdcb6930d056e1f4138a536050caf3bb555feba9(分支 fix/224-final-spec-revalidation,已推送)

最终实现

  • 最终规格复核发现目标维度不在当前视口时,不再立即因 summary_token_missing 失败;仅在当前解析器重新确认的规格面板容器内按既有上限有限滚动,每次滚动后重新抓取和解析页面。
  • 重定位后只接受完整目标唯一匹配且节点暴露新鲜 selected/checked,或既有严格“汇总 token + 唯一候选/本次 proof”证据;目标可见但未选、多候选、面板关闭、容器缺失、滑动失败或搜索结束仍无证据时继续 fail-closed。
  • 重定位过程不点击规格,不触及地址、创建订单或支付控件;旧 proof=true 不能单独放行。
  • 失败诊断保留既有稳定原因,并追加 relocated、relocationSwipes 脱敏标量。
  • Agent 版本提升为 0.9.45 (58)。

验证

  • 定向 PurchaseRehearsalExecutorTest:61 项通过。
  • scripts/verify.ps1 -Component android:Debug/Release 全部单元测试通过,Debug APK 构建通过。
  • git diff --check:通过。
  • python dev_scripts/harness.py check --strict:通过。
  • APK:android/app/build/outputs/apk/debug/app-debug.apk,6,279,632 bytes,SHA-256 11683a94e7468d96bd11881f73847c62b4ebf36763e893d731b65e0a1361525b。
  • 安装前确认设备 10 无活动采购任务、无运行中采集任务;已覆盖安装到 192.168.0.173:41751,设备回读 versionName=0.9.45、versionCode=58,Agent 无障碍服务仍启用。

文档与安全边界

  • 无长期文档影响,按工单方案跳过 Wiki 更新和同步。
  • 未重启 Server/Web;本单为 Android-only,服务端无需重启。
  • 未自动重试 CG90,未修改地址、未创建订单、未执行付款;真机采购结果待用户手动对同任务重试验收。
  • 工作区既有 docs/12-syb-erp-interface.md、server/config/settings.yml 及未跟踪文件均未纳入提交。
## 实施完成,待验收 提交:`cdcb6930d056e1f4138a536050caf3bb555feba9`(分支 `fix/224-final-spec-revalidation`,已推送) ### 最终实现 - 最终规格复核发现目标维度不在当前视口时,不再立即因 `summary_token_missing` 失败;仅在当前解析器重新确认的规格面板容器内按既有上限有限滚动,每次滚动后重新抓取和解析页面。 - 重定位后只接受完整目标唯一匹配且节点暴露新鲜 `selected/checked`,或既有严格“汇总 token + 唯一候选/本次 proof”证据;目标可见但未选、多候选、面板关闭、容器缺失、滑动失败或搜索结束仍无证据时继续 fail-closed。 - 重定位过程不点击规格,不触及地址、创建订单或支付控件;旧 `proof=true` 不能单独放行。 - 失败诊断保留既有稳定原因,并追加 `relocated`、`relocationSwipes` 脱敏标量。 - Agent 版本提升为 `0.9.45 (58)`。 ### 验证 - 定向 `PurchaseRehearsalExecutorTest`:61 项通过。 - `scripts/verify.ps1 -Component android`:Debug/Release 全部单元测试通过,Debug APK 构建通过。 - `git diff --check`:通过。 - `python dev_scripts/harness.py check --strict`:通过。 - APK:`android/app/build/outputs/apk/debug/app-debug.apk`,6,279,632 bytes,SHA-256 `11683a94e7468d96bd11881f73847c62b4ebf36763e893d731b65e0a1361525b`。 - 安装前确认设备 10 无活动采购任务、无运行中采集任务;已覆盖安装到 `192.168.0.173:41751`,设备回读 `versionName=0.9.45`、`versionCode=58`,Agent 无障碍服务仍启用。 ### 文档与安全边界 - 无长期文档影响,按工单方案跳过 Wiki 更新和同步。 - 未重启 Server/Web;本单为 Android-only,服务端无需重启。 - 未自动重试 CG90,未修改地址、未创建订单、未执行付款;真机采购结果待用户手动对同任务重试验收。 - 工作区既有 `docs/12-syb-erp-interface.md`、`server/config/settings.yml` 及未跟踪文件均未纳入提交。
Author
Owner

CG91 真机结果与 v2 方案(待确认后实施)

CG91 证明 v1 已执行一次锁定容器重定位:candidates=8, relocated=true, relocationSwipes=1,但 candidateCount 是当前视口该维度的总候选数,不是目标匹配数。当前实现只要任意候选出现便提前终止,因此尚不能判断精确目标是否已重新出现,也不能判断目标节点是否暴露选中状态。

用户建议在成功勾选颜色/尺码后把选中状态保存在变量中,后续滑动到规格不可见时继续用于创建订单前判断。该方向可采用,但不能是无条件布尔值。建议 v2:

  1. 新增每维度 targetMatchCount / selectedTargetCount 脱敏诊断;重定位只有在精确目标出现、明确冲突或到达边界时终止,不能因其他候选出现终止。
  2. 在颜色和尺码全部选择完成后生成仅存在于本次 executor/attempt 内存中的联合选择证明,绑定 taskId、goodsId、完整精确目标、面板身份和证据代次。
  3. 联合证明必须来自“最后一次规格点击之后”的新鲜页面:每个目标分别由 selected/checked,或同一份严格已选汇总 + 唯一完整候选确认;仅早于另一维度点击的旧 proof 不得组成联合证明。
  4. 后续只允许数量调整、核价和同一锁定面板内滚动复用该证明;任何规格点击、面板关闭/重开、Activity/商品变化、异常页或目标/任务变化立即失效。
  5. 最终复核优先读取当前新鲜证据;目标滚出视口且无汇总时,只有有效联合证明且当前页面/面板连续性仍成立才能桥接可见性缺口。仍有冲突或连续性不足则 fail-closed。
  6. 不持久化该证明,不上传控件树/节点文字,不点击地址、订单或支付目标。

CG91 未进入不可逆下单边界,未创建订单。v1 暂不验收;以上属于 #224 范围内的 v2 修正,不另建工单。

## CG91 真机结果与 v2 方案(待确认后实施) CG91 证明 v1 已执行一次锁定容器重定位:`candidates=8, relocated=true, relocationSwipes=1`,但 `candidateCount` 是当前视口该维度的总候选数,不是目标匹配数。当前实现只要任意候选出现便提前终止,因此尚不能判断精确目标是否已重新出现,也不能判断目标节点是否暴露选中状态。 用户建议在成功勾选颜色/尺码后把选中状态保存在变量中,后续滑动到规格不可见时继续用于创建订单前判断。该方向可采用,但不能是无条件布尔值。建议 v2: 1. 新增每维度 `targetMatchCount` / `selectedTargetCount` 脱敏诊断;重定位只有在精确目标出现、明确冲突或到达边界时终止,不能因其他候选出现终止。 2. 在颜色和尺码全部选择完成后生成仅存在于本次 executor/attempt 内存中的联合选择证明,绑定 taskId、goodsId、完整精确目标、面板身份和证据代次。 3. 联合证明必须来自“最后一次规格点击之后”的新鲜页面:每个目标分别由 selected/checked,或同一份严格已选汇总 + 唯一完整候选确认;仅早于另一维度点击的旧 proof 不得组成联合证明。 4. 后续只允许数量调整、核价和同一锁定面板内滚动复用该证明;任何规格点击、面板关闭/重开、Activity/商品变化、异常页或目标/任务变化立即失效。 5. 最终复核优先读取当前新鲜证据;目标滚出视口且无汇总时,只有有效联合证明且当前页面/面板连续性仍成立才能桥接可见性缺口。仍有冲突或连续性不足则 fail-closed。 6. 不持久化该证明,不上传控件树/节点文字,不点击地址、订单或支付目标。 CG91 未进入不可逆下单边界,未创建订单。v1 暂不验收;以上属于 #224 范围内的 v2 修正,不另建工单。
Author
Owner

v2 方案简化确认

用户明确说明 Agent 为内部系统,门禁不需要过度复杂,并确认采用“精确勾选后把勾选状态保存在变量中,后续规格滚出视口时用于最终判断”的方向。

本单 v2 收敛为:

  • 仅当服务端下发的完整精确目标在唯一候选上完成点击后确认,才在本次 executor 内存中保存该维度和值的选择证明。
  • 最终仍处于同类型规格面板,且当前页面没有暴露“其他候选明确 selected/checked”或错误已选汇总时,可以用该内存证明桥接颜色/尺码及汇总滚出视口的缺口;不再强制滚回并重复取得节点选中属性。
  • 当前页面出现明确冲突、离开/重开规格面板、页面异常或任务结束时不得复用;不持久化、不跨 attempt、不接受相近值、不重复点击规格。
  • 保留 v1 的有限重定位作为没有可用内存证明时的受控兜底,并修正“看到任意候选就提前终止”的条件为只对精确目标/明确冲突终止。
  • 付款仍永久禁止。

该简化由用户于 2026-09-05 明确确认,替代上一条评论中的复杂联合证据方案;按此实施并重新构建真机版本。

## v2 方案简化确认 用户明确说明 Agent 为内部系统,门禁不需要过度复杂,并确认采用“精确勾选后把勾选状态保存在变量中,后续规格滚出视口时用于最终判断”的方向。 本单 v2 收敛为: - 仅当服务端下发的完整精确目标在唯一候选上完成点击后确认,才在本次 executor 内存中保存该维度和值的选择证明。 - 最终仍处于同类型规格面板,且当前页面没有暴露“其他候选明确 selected/checked”或错误已选汇总时,可以用该内存证明桥接颜色/尺码及汇总滚出视口的缺口;不再强制滚回并重复取得节点选中属性。 - 当前页面出现明确冲突、离开/重开规格面板、页面异常或任务结束时不得复用;不持久化、不跨 attempt、不接受相近值、不重复点击规格。 - 保留 v1 的有限重定位作为没有可用内存证明时的受控兜底,并修正“看到任意候选就提前终止”的条件为只对精确目标/明确冲突终止。 - 付款仍永久禁止。 该简化由用户于 2026-09-05 明确确认,替代上一条评论中的复杂联合证据方案;按此实施并重新构建真机版本。
Author
Owner

v2 实施完成,继续待验收

新增提交:095dbfa(已推送 fix/224-final-spec-revalidation)。

  • 按用户确认的内部系统简化方案,本次 executor 在完整精确规格点击后确认成功时保存内存选择证明;最终仍处于同类型规格面板且没有明确选中冲突时,可桥接规格与“已选”汇总滚出视口的缺口。
  • 内存证明不持久化、不跨 attempt;当前出现其他候选明确 selected/checked、错误汇总、面板变化或异常页时继续失败。
  • v1 重定位终止条件已改为精确目标匹配/明确冲突,不再因 candidateCount > 0 的其他候选提前停止;诊断增加 targetMatches。
  • 定向 PurchaseRehearsalExecutorTest 61 项通过;完整 Android Debug/Release 单元测试及 Debug APK 构建通过。
  • 与 #225 合并构建为 Agent 0.9.47 (60),已覆盖安装到 192.168.0.173:41751,无障碍服务启用。未自动重试 CG91,未修改地址、未创建订单、未付款。
## v2 实施完成,继续待验收 新增提交:`095dbfa`(已推送 `fix/224-final-spec-revalidation`)。 - 按用户确认的内部系统简化方案,本次 executor 在完整精确规格点击后确认成功时保存内存选择证明;最终仍处于同类型规格面板且没有明确选中冲突时,可桥接规格与“已选”汇总滚出视口的缺口。 - 内存证明不持久化、不跨 attempt;当前出现其他候选明确 selected/checked、错误汇总、面板变化或异常页时继续失败。 - v1 重定位终止条件已改为精确目标匹配/明确冲突,不再因 `candidateCount > 0` 的其他候选提前停止;诊断增加 `targetMatches`。 - 定向 `PurchaseRehearsalExecutorTest` 61 项通过;完整 Android Debug/Release 单元测试及 Debug APK 构建通过。 - 与 #225 合并构建为 Agent `0.9.47 (60)`,已覆盖安装到 `192.168.0.173:41751`,无障碍服务启用。未自动重试 CG91,未修改地址、未创建订单、未付款。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#224