修复:选项角标致文本截断使规格选中确认失败,且已选摘要兜底失效 #252

Open
opened 2026-09-09 17:36:05 +08:00 by ila · 0 comments
Owner

来源与目标

2026-09-09 用户报告:真机临时采集失败,停留在 PDD 规格面板。原话:

「最新agent,192.168.0.9:35399 ,现在临时采集失败,停留在pdd app规格面板,分析报错:SPEC_PANEL_EVIDENCE_NOT_MATCHED:点击规格后离开了商品规格面板」
「真机现在停留在pdd 商品页规格面板,为什么自动遍历了颜色第一行,来到第二行就失败呢。是不是颜色里的"%"号干扰呢」

目标:让规格遍历能在 PDD 给选项附加角标(导致标签被省略号截断)时仍然正确确认选中,并让「已选摘要」在缺少既定前缀的面板形态下仍可作为兜底证据。

排除的假设

用户怀疑颜色名里的 % 干扰。已排除:第一行三个选项同样含 100%,且全部遍历成功。

真机证据(设备 192.168.0.9,Agent 0.9.67 / versionCode 80,PDD 8.22.0,2026-09-09)

失败时页面为 PDD 的订单确认形态面板(含收货地址、微信支付、提交订单 ¥15.7,同时内嵌可点的颜色分类)。屏幕 1080x2354,可滚动容器为 RecyclerView (0,1108)-(1080,2057)。

六个颜色选项的 TextView 原始文本对比:

第1行  '  白色小帽子【100%竹节棉】'
       '藏蓝色小帽子【100%竹节棉】'
       '白色笑脸【100%竹节棉】'

第2行  '藏蓝色笑脸【100...\n 零差评'      ← 失败点,selected=true
       '  白色小蝴蝶结【100%竹节棉】'
       '藏蓝色小蝴蝶结【100%竹节棉】'

失败的这一个选项,PDD 在同一个 TextView 内附加了「零差评」角标(换行后置),挤压导致商品名被省略号截断为 藏蓝色笑脸【100...,完整名应为 藏蓝色笑脸【100%竹节棉】。

顶部摘要节点文本为 零差评#藏蓝色笑脸【100%竹节棉】 M 【建议80-95斤】,不含「已选」前缀。

代码事实

症状一:精确相等匹配被角标破坏

android/.../automation/PddProductDetailCollector.kt:1668(stablePrice):

val targetState = screen.dimensions.flatMap { it.values }
    .any { it.text == color && (it.node.selected || it.node.checked) }

it.text == color 为精确相等。被截断的 藏蓝色笑脸【100...\n 零差评 与目标 藏蓝色笑脸【100%竹节棉】 不相等,targetState 恒为 false。

症状二:已选摘要兜底识别过窄

RuleContract.kt:90:summaryPrefixes = ["已选", "请选择", "已選", "請選擇"]。

该面板摘要为 零差评#藏蓝色笑脸【100%竹节棉】 M 【建议80-95斤】,无上述前缀,故 selectedSummary 为空,targetSummary 兜底同样失效。

两条证据路径同时断开后,panelMissingReads 累加,达到 SPEC_PANEL_LOST_STABLE_READS = 2(PddProductDetailCollector.kt:1662/1788)即返回
PageProblem("SPEC_PANEL_EVIDENCE_NOT_MATCHED", "点击规格后离开了商品规格面板")。

与行号无关:「零差评」是该 SKU 独有的角标,与它在第几行无关。该 SKU 移到第一行同样会失败;「第一行成功、第二行失败」是巧合,不得据此按行号定位。

范围

  1. Android:规格选中确认不得仅依赖选项文本精确相等。应以节点自身的 selected / checked 属性作为主证据(失败样本中该节点 selected=true 明确可读),文本仅作辅助校验。
  2. Android:文本辅助校验需容忍 UI 角标与省略号截断。允许的做法是剥离角标后按前缀匹配,且要求前缀在本维度候选中唯一;候选不唯一时必须判失败,不得选择"最像"的一个。
  3. Android:selectedSummary 的识别需覆盖缺少「已选」前缀的面板形态,但仍须是结构化判据(例如摘要节点位于面板固定区域且与当前选中项一致),不得退化为"页面上任意包含该文本的节点"。
  4. 补充单测:覆盖带角标且被截断的选项、无角标的普通选项、以及前缀截断后在候选中不唯一时必须失败。

非目标(安全边界,不可放宽)

  • 不得放宽为模糊匹配或相似度匹配。 AGENTS.md 规定 Agent 本地不得猜测规格或点击相近候选。本工单只解决"同一个选项因角标导致文本变形",不解决"选项之间语义相近"。
  • 不得因截断而接受多个候选;前缀匹配必须唯一。
  • 不修改服务端、不修改规则契约的既有别名语义、不新增能力位。
  • 不改动采购的下单、地址与支付路径。
  • 不使用 OCR/VLM,不保存原始控件树或整屏截图。

相邻观察(记录,不在本工单处理)

  1. 失败时设备停在订单确认形态页面(含 提交订单)。采集流程能走到该页面本身值得单独评估:它距不可逆动作仅一步。本工单只修文本匹配,不改变采集进入该页面的行为。
  2. 该页面收货地址后缀为 _cg91,而任务 91 是 2026-09-05 已失败的旧任务。说明地址后缀会滞留到下次修改。这对 #242 的按后缀回填是一个边界风险:若某任务改地址后失败,其后创建的订单可能携带旧后缀,导致回填误配。建议补入 #242 评估,不在本工单处理。

方案与设计证据

Android 端缺陷修复,无新页面或用户可见交互变化,不需要 UI 原型。设计证据为上述真机控件树原始文本对比与 PddProductDetailCollector、RuleContract 的现有实现。

验收

  • 带角标且被省略号截断的选项,能正确确认选中并继续遍历价格。
  • 普通选项行为不变,既有测试不回归。
  • 前缀截断后在候选中不唯一时明确失败,不选择相近候选。
  • 缺少「已选」前缀的面板形态下,摘要兜底可用且仍为结构化判据。
  • Android 单测与 :app:assembleDebug 通过。
  • 真机验证需人工授权后单独进行。

文档影响

若最终方案改变了 Business-Rules-and-Glossary 中规格选中确认的对外判据描述,需按 Wiki-first 流程更新;若仅为文本归一化的内部实现调整、未改变"不得猜测规格、不得点击相近候选"的安全语义,可记录为无长期文档影响并说明原因。

依赖

无阻塞依赖。当前 Android 修复链顶端为 fix/249-local-purchase-diagnostics(659bbc6),本工单应基于该链顶端开发,以免与今日 #238、#243–#249 的改动冲突。

## 来源与目标 2026-09-09 用户报告:真机临时采集失败,停留在 PDD 规格面板。原话: > 「最新agent,192.168.0.9:35399 ,现在临时采集失败,停留在pdd app规格面板,分析报错:SPEC_PANEL_EVIDENCE_NOT_MATCHED:点击规格后离开了商品规格面板」 > 「真机现在停留在pdd 商品页规格面板,为什么自动遍历了颜色第一行,来到第二行就失败呢。是不是颜色里的"%"号干扰呢」 目标:让规格遍历能在 PDD 给选项附加角标(导致标签被省略号截断)时仍然正确确认选中,并让「已选摘要」在缺少既定前缀的面板形态下仍可作为兜底证据。 ## 排除的假设 用户怀疑颜色名里的 `%` 干扰。**已排除**:第一行三个选项同样含 `100%`,且全部遍历成功。 ## 真机证据(设备 192.168.0.9,Agent 0.9.67 / versionCode 80,PDD 8.22.0,2026-09-09) 失败时页面为 PDD 的**订单确认形态面板**(含收货地址、微信支付、`提交订单 ¥15.7`,同时内嵌可点的颜色分类)。屏幕 1080x2354,可滚动容器为 RecyclerView (0,1108)-(1080,2057)。 六个颜色选项的 TextView **原始文本**对比: ``` 第1行 ' 白色小帽子【100%竹节棉】' '藏蓝色小帽子【100%竹节棉】' '白色笑脸【100%竹节棉】' 第2行 '藏蓝色笑脸【100...\n 零差评' ← 失败点,selected=true ' 白色小蝴蝶结【100%竹节棉】' '藏蓝色小蝴蝶结【100%竹节棉】' ``` 失败的这一个选项,PDD 在同一个 TextView 内附加了「零差评」角标(换行后置),挤压导致商品名被**省略号截断**为 `藏蓝色笑脸【100...`,完整名应为 `藏蓝色笑脸【100%竹节棉】`。 顶部摘要节点文本为 `零差评#藏蓝色笑脸【100%竹节棉】 M 【建议80-95斤】`,**不含「已选」前缀**。 ## 代码事实 **症状一:精确相等匹配被角标破坏** `android/.../automation/PddProductDetailCollector.kt:1668`(`stablePrice`): ```kotlin val targetState = screen.dimensions.flatMap { it.values } .any { it.text == color && (it.node.selected || it.node.checked) } ``` `it.text == color` 为精确相等。被截断的 `藏蓝色笑脸【100...\n 零差评` 与目标 `藏蓝色笑脸【100%竹节棉】` 不相等,`targetState` 恒为 false。 **症状二:已选摘要兜底识别过窄** `RuleContract.kt:90`:`summaryPrefixes = ["已选", "请选择", "已選", "請選擇"]`。 该面板摘要为 `零差评#藏蓝色笑脸【100%竹节棉】 M 【建议80-95斤】`,无上述前缀,故 `selectedSummary` 为空,`targetSummary` 兜底同样失效。 两条证据路径同时断开后,`panelMissingReads` 累加,达到 `SPEC_PANEL_LOST_STABLE_READS = 2`(`PddProductDetailCollector.kt:1662/1788`)即返回 `PageProblem("SPEC_PANEL_EVIDENCE_NOT_MATCHED", "点击规格后离开了商品规格面板")`。 **与行号无关**:「零差评」是该 SKU 独有的角标,与它在第几行无关。该 SKU 移到第一行同样会失败;「第一行成功、第二行失败」是巧合,不得据此按行号定位。 ## 范围 1. Android:规格选中确认不得仅依赖选项文本精确相等。应以**节点自身的 `selected` / `checked` 属性**作为主证据(失败样本中该节点 `selected=true` 明确可读),文本仅作辅助校验。 2. Android:文本辅助校验需容忍 UI 角标与省略号截断。允许的做法是**剥离角标后按前缀匹配,且要求前缀在本维度候选中唯一**;候选不唯一时必须判失败,不得选择"最像"的一个。 3. Android:`selectedSummary` 的识别需覆盖缺少「已选」前缀的面板形态,但仍须是结构化判据(例如摘要节点位于面板固定区域且与当前选中项一致),不得退化为"页面上任意包含该文本的节点"。 4. 补充单测:覆盖带角标且被截断的选项、无角标的普通选项、以及前缀截断后在候选中不唯一时必须失败。 ## 非目标(安全边界,不可放宽) - **不得放宽为模糊匹配或相似度匹配。** `AGENTS.md` 规定 Agent 本地不得猜测规格或点击相近候选。本工单只解决"同一个选项因角标导致文本变形",不解决"选项之间语义相近"。 - 不得因截断而接受多个候选;前缀匹配必须唯一。 - 不修改服务端、不修改规则契约的既有别名语义、不新增能力位。 - 不改动采购的下单、地址与支付路径。 - 不使用 OCR/VLM,不保存原始控件树或整屏截图。 ## 相邻观察(记录,不在本工单处理) 1. 失败时设备停在**订单确认形态页面**(含 `提交订单`)。采集流程能走到该页面本身值得单独评估:它距不可逆动作仅一步。本工单只修文本匹配,不改变采集进入该页面的行为。 2. 该页面收货地址后缀为 `_cg91`,而任务 91 是 2026-09-05 已失败的旧任务。说明**地址后缀会滞留到下次修改**。这对 #242 的按后缀回填是一个边界风险:若某任务改地址后失败,其后创建的订单可能携带旧后缀,导致回填误配。建议补入 #242 评估,不在本工单处理。 ## 方案与设计证据 Android 端缺陷修复,无新页面或用户可见交互变化,不需要 UI 原型。设计证据为上述真机控件树原始文本对比与 `PddProductDetailCollector`、`RuleContract` 的现有实现。 ## 验收 - 带角标且被省略号截断的选项,能正确确认选中并继续遍历价格。 - 普通选项行为不变,既有测试不回归。 - 前缀截断后在候选中不唯一时明确失败,不选择相近候选。 - 缺少「已选」前缀的面板形态下,摘要兜底可用且仍为结构化判据。 - Android 单测与 `:app:assembleDebug` 通过。 - 真机验证需人工授权后单独进行。 ## 文档影响 若最终方案改变了 `Business-Rules-and-Glossary` 中规格选中确认的对外判据描述,需按 Wiki-first 流程更新;若仅为文本归一化的内部实现调整、未改变"不得猜测规格、不得点击相近候选"的安全语义,可记录为无长期文档影响并说明原因。 ## 依赖 无阻塞依赖。当前 Android 修复链顶端为 `fix/249-local-purchase-diagnostics`(`659bbc6`),本工单应基于该链顶端开发,以免与今日 #238、#243–#249 的改动冲突。
ila self-assigned this 2026-09-09 17:36:05 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#252