fix(android): 规格复核前移到改地址前;改地址后不核对规格和数量,只拦「选择…后,提交订单」(#374 后续) #376
Open
opened 2026-10-09 16:17:27 +08:00 by ila
·
4 comments
No Branch/Tag Specified
main
fix/370-horizontal-grid
feat/372-export-shop
feat/378-heartbeat-diagnostics
feat/372-export-price
feat/372-list-export
fix/377-rejected-purchase-outbox
fix/376-pre-address-spec-verification
fix/374-final-spec-confirmation
fix/373-navigation-diagnostics
fix/370-color-discovery
feat/367-last-batch-repurchase
fix/368-image-search-partial-link
integration/364-365-366-main
feat/364-purchase-failure-snapshot
integration/365-366-validation
fix/365-order-result-observation
fix/366-address-editor-ready
fix/359-auto-match-resume
feat/363-inner-code-page-size
fix/362-truncated-spec-card
fix/361-spec-probe-click
docs/agents-worktree-rules
fix/358-syb-size-weight
feat/357-syb-cancel-status
feat/356-purchase-order-filter
fix/355-syb-list-timeout
feat/353-syb-shop-multiselect
fix/354-syb-top-pagination
fix/352-syb-source-created
fix/348-reveal-swipe
feat/340-syb-excluded-products
fix/351-inner-code-apply-selection
fix/350-match-layout
fix/350-inner-code-matching
feat/349-batch-return-use
feat/347-batch-return-cancel
feat/345-yeeke-reship
fix/346-root-serves-spa
fix/344-inner-code-stall-match
fix/343-syb-writeback-session
feat/339-syb-page-size
feat/338-return-match
feat/337-yeeke-admin-ui
feat/336-yeeke-return-sync
fix/335-bottom-submit-node
fix/334-spec-probe-top-swipe
fix/333-purchaser-device-owner
fix/331-spec-panel-recognition
fix/330-syb-writeback-session
feat/327-syb-writeback-filter
feat/326-order-information
fix/325-order-result
feat/316-chrome-order-backfill
fix/307-backfill-entry
feat/305-syb-order-writeback
feat/306-order-paid-amount
release/283
fix/283-purchase-mapping-consistency
fix/230-horizontal-spec-selection
feat/263-spec-rematch
fix/262-purchase-handoff
fix/260-261-purchase-readiness
fix/259-partial-collection-link
feat/258-one-click-replace
fix/257-color-normalized-match
fix/256-collection-single-dimension
fix/255-current-page-reidentify
feat/253-one-click-link
fix/254-match-loading
fix/251-syb-spec-candidates
feat/250-continuous-collection
fix/249-local-purchase-diagnostics
fix/248-bottom-submit
fix/247-short-address-panel
fix/246-address-return-panel
fix/245-purchase-failure-diagnostics
fix/244-selected-card-duplicates
fix/243-spec-entry-recovery
feat/242-agent-order-backfill
feat/241-order-backfill-endpoint
fix/239-syb-partial-sync
fix/238-spec-panel-preswipe
feat/237-client-api-keys
feat/236-purchaser-syb-sync
fix/235-syb-pagination-overlap
release/234-integrated
fix/229-address-entry-dedup
fix/228-selection-proof-panel-transition
fix/227-address-panel-return
fix/226-reopen-pdd-on-manual-retry
fix/225-in-place-purchase-retry
fix/224-final-spec-revalidation
fix/223-probed-confirmed-mapping
chore/221-devharness-sync
feat/218-purchase-result-bubble
fix/217-agent-retry-current-spec
fix/216-syb-spec-role-order
feat/215-mandatory-live-spec-probe
feat/214-verified-purchase-actions
fix/212-syb-sync-shop-snapshot
feat/211-spec-entry-ready-wait
feat/210-order-result-payment-transition
feat/209-pdd-bottom-spec-entry
feat/200-ai-match-result-purchase-ready
feat/199-job-execution-logs
feat/198-syb-ai-parse
feat/195-scheduled-spec-auto-match
fix/197-ai-write-timeout
feat/190-syb-inline-correction
fix/193-address-entry-reveal
feat/194-one-click-spec-match
fix/192-order-result-scroll
No results found.
Labels
No items
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: OPC/goauto#376
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
基本信息
0.9.69-373-fix1)后,重购最后一批 7 个采购任务,要求分析失败原因。随后经过讨论和逐题问答确认:用户确认的决定(2026-10-09 问答)
quantity字段改为目标数量已核验事实
线上数据与失败现场(只读,2026-10-09)
失败现场快照 2、10~13 只在本机解析规格面板文字,地址类文字已过滤,文件用完已删除。
dimension=size;stage=missing_proof;summaryPresent=1已选: #[新品闪购*夏日大卖]桔色 XL [建议110-120斤]dimension=color;stage=missing_proof;summaryPresent=0#快要抢光#[纯白]RW圆领 3XL码[145-165斤]dimension=color;stage=missing_proof;summaryPresent=0PURCHASE_SPEC_SELECTION_UNCONFIRMEDPURCHASE_QUANTITY_MISMATCH)共 13 次,全部是数量 ≥ 2 的任务。数量 ≥ 2 的任务走到下单前或已完成的约 110 次,数量 = 1 的约 1570 次,后者从未出现。推断是改地址后 PDD 把数量重置了,但未证实。补充真机文字证据(Codex 只读,2026-10-09)
用户保留未选中颜色、尺码的现场后,Codex 在指定测试手机上只读获取当前无障碍结构(PDD 包名
com.xunmeng.pinduoduo)。未点击、未滑动、未触发任务,原始树仅在内存解析,未落盘;以下仅记录不含个人信息的提示和结构:请选择: 颜色分类 尺码TextView;clickable=false、enabled=true;无子节点选择颜色分类及尺码后,提交订单TextView;clickable=false、enabled=true;无子节点,直接父节点也不可点击enabled=true不能证明规格已选全或可以创建订单;文字节点不可点击也不能据此排除它所属的提交按钮区域。实际点击目标与所属可点击区域仍按既有结构定位。失败现场结构核对(Claude Code 只读,2026-10-09,快照 11 / attempt 4181)
本机解析后已删除,只记录结构:
FrameLayout(bounds[0,2159][1080,2306])。按finalSubmitTargets的规则,它就是被选中的提交行row。TextView,层级为TextView→ 不可点击的LinearLayout→ 上述FrameLayout。它的最近可点击祖先就是row,而且它是row内唯一带文字的节点。row内文字的规则能读到完整提示,和 Codex 的真机观察(文字节点的直接父节点不可点击)一致。代码事实(
origin/main3ee8dfc0aa93ef9020786244cce29c487631ddbe)SELECT_SPEC→SET_QUANTITY→VERIFY_UNIT_PRICE→VERIFY_ORDER_SUMMARY→UPDATE_SHIPPING_ADDRESS→CREATE_ORDER(PurchaseRehearsalExecutor.kt:140-165),某一步失败后,后面的步骤都不执行。CREATE_ORDER依次执行finalConfirmation→beforeOrderSubmit(evidence)→irreversibleStarted = true→submitOrderOnce(:161-178)。beforeOrderSubmit(AgentForegroundService.kt:865-878)先在本地写markOrderSubmitStarted(含final_confirmation_json),再调用服务端markPurchaseOrderSubmitStarted。order_result_unknown,现有submitOrderOnce在点击前失败的PURCHASE_SUBMIT_TARGET_AMBIGUOUS也是这样。final_confirmation_json只存在手机本地(PurchaseTaskStore.kt:130-139),不上传服务端;代码中没有任何地方解析它。其中quantity字段取自下发的目标数量(FinalConfirmationEvidence.quantity = input.quantity)。selectExactSpecWithRetry、isExactSpecSelected,:594-693):目标已经选中就不点;否则点击目标,点击后必须读到目标处于选中状态,或者摘要匹配,否则失败。verifySummary(:1123)→verifyExactSpecSelection(:751)。selectedSummary == null,例如面板显示的是「请选择: …」),只要选规格时记录过证明,就直接判为通过(attempt_selection_state),即使目标选项就在屏幕上且没有选中。attempt_selection_proof)。finalConfirmation(PurchaseLiveAutomation.kt:314)依次检查地址、唯一提交按钮、规格(PurchaseFinalSpecVerifier.verify,#374,要求每个维度都有可见证据或摘要整段相等,否则missing_proof)、价格、数量。finalSubmitTargets(PurchaseLiveAutomation.kt:882)主要按结构定位:在已识别面板范围内选择底部可点击行,再返回该行内符合条件的带文字节点供clickFresh重定位并向上找到可点击祖先;既有支付类文字排除保持不变。FINAL_SUBMIT_MARKERS/legacyMarker只是诊断信号,不是定位放行条件。因此「选择颜色分类及尺码后,提交订单」仍可能被结构定位为提交目标,须另加未选提示检查;不能描述为靠「提交订单」文字定位。目标
非目标
beforeOrderSubmit)的位置,不改本地存储和服务端边界协议,不上传final_confirmation_json。方案
0. 共用判断(新函数,只在规格复核中使用)
finalSubmitTargets唯一目标所属的实际提交按钮区域,区域必须可见且位于当前面板内;沿用既有底部行与最近可点击祖先关系,不改变点击目标选择。读取该区域当前可见的提示文字,而不是只依赖返回的单个文字节点或enabled属性。完整单节点提示直接检查;若同一按钮的提示拆分到多个文字节点,按明确的阅读顺序组合属于同一按钮的文字片段,不重复叠加父子节点相同文字,不拼入其他按钮、嵌套独立可点击子按钮、规格列表、面板摘要或不可见旧节点。不扩大到全屏搜索。去掉全部空白后,必须从头到尾完整匹配:^(选择|選擇).+(后|後)[,,](提交订单|提交訂單)$。不使用「包含某个词」的判断。此文字来源规则在改地址前、finalConfirmation与submitOrderOnce的提示检测中共用;不新增规格值或数量复核。finalSubmitTargets已选出的行row为范围,不只看返回的chosen;row子树中可见、自身有文字、子孙都没有文字的节点;row,与现有leafCandidates的条件相同,从而排除嵌套的独立可点击子按钮;bounds.top、再按bounds.left排序后直接拼接。rowSubtreeLabels:它把row.label和全部子孙 label 拼在一起,在 label 会上传给父节点的布局下会重复。finalSubmitTargets一并返回row、chosen和拼接后的文字,三处调用共用;点击目标仍是chosen,行的选择、唯一性和支付排除逻辑不变。实施时选最小改法。normalizeFinalConfirmation)的选项可见、可选,且未选中(selected、checked都为 false,沿用解析器的父子聚合);同维度没有其他选中项;面板内也没有「已选」摘要。1. 改地址前的复核(
verifySummary,加严,第 5 题)selection_prompt。attempt_selection_state和attempt_selection_proof这两条沿用历史证明的路径,只在当前屏幕出现目标可见但未选中时改为失败,原因target_visible_unselected。目标选项不可见时仍然沿用历史证明,这两条路径不是全部取消。verifySummary中现有的数量和价格检查也不变。PURCHASE_SPEC_SELECTION_UNCONFIRMED,诊断里的reason使用新值。失败发生在改地址之前,不执行改地址。2. 改地址后的下单前复核(
finalConfirmation,放宽,第 1、2、6 题)PURCHASE_SPEC_NOT_MATCHED,详情finalSpec;stage=selection_prompt,不含页面文字。这一步在beforeOrderSubmit之前,所以是普通失败:不写本地和服务端的提交边界,不点击,任务记为failed,重购继续下一个任务。PurchaseFinalSpecVerifier的全部规格判断(missing_proof、摘要整段相等、selected_conflict、candidate_collision、unavailable、summary_conflict、composition_ambiguity),以及数量核对(PURCHASE_QUANTITY_MISMATCH)。改地址后不检查摘要未选提示,只记录(见方案 4)。3. 点击前兜底(
submitOrderOnce)order_result_unknown,边界只写这一次。要把这个零点击分支变成确定的失败,必须扩大到本地存储和服务端边界协议,不在本单范围;需要时另行建单并确认。4. 只记录、不拦截的屏幕状态(第 4 题)
FinalConfirmationEvidence新增:observedQuantity:唯一可见可用数量输入框中的数字;如果不是恰好一个,记为空;selectedSummaryPresent:面板内是否有「已选」摘要;summaryPromptPresent:面板内是否有摘要未选提示。final_confirmation_json时,原quantity键改为targetQuantity,并增加上面三项。新增字段只有数字和布尔值,不含页面文字和个人信息。用本批现场对照
selection_prompt或target_visible_unselected失败,不执行改地址selection_prompt普通失败,不点击、不写边界子项目影响、依赖与并行
PurchaseRehearsalExecutor.kt(verifySummary/verifyExactSpecSelection);PurchaseLiveAutomation.kt(finalConfirmation、submitOrderOnce、FinalConfirmationEvidence);PurchaseFinalSpecVerifier.kt(改为只做按钮提示判断,或者删除后由新函数替代,实施时选最小改法);AgentForegroundService.kt(beforeOrderSubmit中 JSON 键名和新增字段);PddProductDetailCollector.kt(只读取面板内的摘要提示,不改现有解析行为);设计证据
非 UI 改动,无需原型;以本正文为准。
验收标准
改地址前(方案 1):
reason=selection_prompt,没有执行改地址。target_visible_unselected(原来会以attempt_selection_state通过)。改地址后(方案 2):
PURCHASE_SPEC_NOT_MATCHED(stage=selection_prompt)。执行器层面验证:beforeOrderSubmit没有被调用,本地没有order_submit_started,没有点击,任务记为failed。点击前兜底(方案 3):
submitOrderOnce截图时按钮出现提示 → 不点击;执行器结果为order_result_unknown,提交边界只写一次。提示识别正反例(方案 0):
TextView,均enabled=true,底部文字节点及直接父节点不可点击 → 仍通过既有结构关联其实际按钮区域并识别未选提示;不能因文字节点启用或不可点击而漏判。最终复核在边界前普通失败、不点击;点击前兜底保留既定 unknown 语义。选择颜色分类及尺码后,和提交订单分处两个可见文字节点,返回的点击文字节点只含后一段 → 组合该按钮文字后能识别;父子重复标签不重复拼接。此项是其他布局的回归,不是本次现场事实。PURCHASE_CONFIRMATION_PANEL_TYPES中(finalSubmitTargets返回空)→ 只检查摘要提示,不因找不到按钮而报错。finalConfirmation中finalSubmitTargets返回空或不唯一 → 仍按现有逻辑报PURCHASE_SUBMIT_TARGET_AMBIGUOUS,不受新规则影响。屏幕状态记录(方案 4):
final_confirmation_json中有targetQuantity、observedQuantity、selectedSummaryPresent、summaryPromptPresent,原quantity键已经不存在;数量输入框不是恰好一个时,observedQuantity为空;不含页面文字和个人信息。回归:
PurchaseFinalSpecConfirmationTest按新规则改写,在回写中逐条说明删除或改写的用例;verifySummary、地址、价格、提交按钮相关测试通过;Android 构建通过,如实记录。风险与回退
observedQuantity可以用来事后核查。target_visible_unselected可能误拦。这是偏安全的方向。order_result_unknown,需要人工核对,重购会停。只有在最终复核到点击之间页面发生变化时才会走到这里。verifySummary;无数据迁移。final_confirmation_json的键名变化只影响新写入的记录。文档影响
备注
本单由 Claude Code 依据线上只读查询、失败现场快照(本机解析后已删除)、代码阅读、与用户的问答和 Codex 审核意见起草;不含账号、地址、Cookie 或 Token。
fix(android): 下单前规格复核识别摘要营销标签,并滑动规格列表取得选中证据(#374 后续)to fix(android): 规格复核前移到改地址前,改地址后只拦 PDD 未选规格提示(#374 后续)2026-10-09 Claude Code 审核回复(SynapBus #129/#130,Codex 对 v2 的意见)
基线
origin/main3ee8dfc0aa93ef9020786244cce29c487631ddbe。以下为讨论意见,正文尚未修改;把这些修订并入正文需用户确认。结论
Codex 的三点和补充都已核实成立,建议全部并入正文。第 1 点是 v2 的错误,必须修改。
1. 提交边界(必须修改)
已核实:
PurchaseRehearsalExecutor.kt:161-178的顺序是finalConfirmation→beforeOrderSubmit(evidence)→irreversibleStarted = true→submitOrderOnce。beforeOrderSubmit(AgentForegroundService.kt:865-878)会先写本地markOrderSubmitStarted,再调用服务端markPurchaseOrderSubmitStarted。submitOrderOnce内抛出的任何异常,都会被外层转成order_result_unknown。现有的PURCHASE_SUBMIT_TARGET_AMBIGUOUS(点击前就失败)也是这样处理的。v2 方案 3 写「submitOrderOnce内检查,不会进入订单结果不明」,这一说法不成立。建议修订:
finalConfirmation:它在提交边界之前。出现未选提示(包括「选择…后,提交订单」按钮)时,按普通失败处理(PURCHASE_SPEC_NOT_MATCHED),不调用beforeOrderSubmit,不写本地和服务端边界。submitOrderOnce只做兜底:点击前截图时如果出现同样的提示,就不点击。但这时边界已经写入,结果如实保留现有的保守状态order_result_unknown。不移动持久化边界,不改协议。finalConfirmation遇到提示 → 任务失败,beforeOrderSubmit没有被调用,本地没有写入order_submit_started;submitOrderOnce截图时出现提示 → 没有点击,结果是order_result_unknown,边界只写一次。2. 未选提示的范围(必须修改)
finalSubmitTargets认出的那一个提交按钮,并且它必须可见、位于面板内。去掉空白后,文字必须完整匹配「(选择|選擇) + 任意内容 + (后|後) + (,|,) + (提交订单|提交訂單)」,从开头匹配到结尾。target_visible_unselected:只在attempt_selection_state和attempt_selection_proof这两条路径上,且当前屏幕的目标选项可见并且selected/checked为 false 时才生效。选项不可见时仍然沿用历史证明,历史证明路径没有全部取消。另外保留「布局不暴露选中属性」的回归测试:有「已选」摘要时不受影响;既没有摘要、也没有选中属性时,按正文风险第 2 条记录为可能误拦。3. 根因表述(必须修改)
已核实:同一商品的另一个规格改地址后保持选中,只能说明规格清空不是每次改地址都会发生,不能排除「地址修改导致部分组合被清空」。建议把正文里的「不成立」改为:「尚无证据确认,不能归因于地址修改。规格丢在哪一步、『黑色 + L』是否售罄,都未核实。」
补充(采纳)
PurchaseFinalSpecConfirmationTest按新规则改写时,明确保留一条「目标不符但没有提示,也放行」的已知行为用例。地址、价格、数量、提交按钮唯一性的测试不删除。验收里会写明这一点。未验证项
本次只读了代码,没有运行测试,没有装机,也没有真机验证。
fix(android): 规格复核前移到改地址前,改地址后只拦 PDD 未选规格提示(#374 后续)to fix(android): 规格复核前移到改地址前;改地址后不核对规格和数量,只拦「选择…后,提交订单」(#374 后续)2026-10-09 Claude Code 复核回复(SynapBus #133/#134,Codex 对 v3 的补充)
基线
origin/main3ee8dfc0aa93ef9020786244cce29c487631ddbe;正文按 2026-10-09 16:51:12 的版本读取。结论
Codex 的三点补充成立,方向可以实施,下面给出最小修正。但正文当前已损坏(见下文「正文损坏」),实施前必须先修复。
代码更正已核实
finalSubmitTargets(PurchaseLiveAutomation.kt:882-948)的做法:FINAL_SUBMIT_MARKERS只用来算诊断字段legacyMarker,不参与定位。v3 中「按『提交订单』等标记识别」的说法有误,Codex 的更正正确。三点补充:可以实施,最小修正如下
文字来源:用
finalSubmitTargets已经选出的那一行row,不能只用返回的chosen节点。建议把行和按钮文字一起返回,例如SubmitTarget(row, chosen, text),三处调用(改地址前、finalConfirmation、submitOrderOnce)共用这个结果。点击目标仍然是chosen,选择逻辑不变。拆分文字的组合规则,写成可测试的形式:
row子树内自身有文字、子孙节点都没有文字的可见节点;row,这一条和leafCandidates的过滤条件相同;bounds.top、再按bounds.left排序后拼接;rowSubtreeLabels是把row.label和全部子孙的 label 拼起来,在 label 会传给父节点的布局下会重复,所以不能复用。v3 的完整正则作用于拼接后的文字;单个完整节点(本次真机现场就是这样)属于同一规则的特例。
隔离:第 2 点中「最近可点击祖先必须是
row」已经排除了嵌套的独立可点击子按钮。行外节点、摘要、规格列表不在row子树里,不可见节点被可见性条件排除。现有的支付排除、行并列判断和唯一性检查不变。补充:改地址前那一步,如果当前面板类型不在
PURCHASE_CONFIRMATION_PANEL_TYPES中,finalSubmitTargets会返回空,这时只检查摘要提示,不做按钮检查。这与 v3「识别出唯一提交按钮时才检查」一致,建议在验收里加一条用例。正文损坏(必须修复)
方案 0「按钮未选提示」那一行的正则结尾
$`丢了,原位置被插入了一份从「## 基本信息」到「### 0. 共用判断(新函数,只在规格复核中使用)」的正文副本,然后才接上「。不使用「包含某个词」的判断……」。因此当前正文中「基本信息」到「方案 0」这一段出现了两次,正则也不完整。推测原因:更新时用了字符串替换,替换内容中的
$`被当作「匹配位置之前的全部文本」展开了(JavaScriptString.replace等的特殊替换模式)。这是推测,未证实。修复方法:删除插入的副本,恢复正则结尾
$`。修改正文需要用户确认。未验证项
本次只读了代码和正文,没有运行测试,没有装机,也没有真机验证。
2026-10-09 用户明确授权实施 #376。按正文 v3(17:01:22,含评论 9101 的最小细化)开始:基线 main
3ee8dfc0aa93ef9020786244cce29c487631ddbe;分支fix/376-pre-address-spec-verification,独立 worktreeD:/OPC/goauto-worktrees/issue-376。严格限 Android、相关测试及既定 Wiki 业务规则更新;先测试、再实现、独立复核后提交推送。保留已确认的规格/数量放宽风险,不改提交边界协议、不改 Server/Web/业务库。本次不装机、不执行真实采购/付款、不合并 main 或发布。2026-10-09 实施与装机完成,待验收
范围与提交
9c7357609cee7c73b57edd030136ed12ef9485b6。a953a5e9fbe01cbef6d08c97d024167eab248c75。fix/376-pre-address-spec-verification已推送,远端回读与本地 HEAD 一致。首次 Git 推送认证失败,重试成功,未更改凭据。PurchaseFinalSpecVerifier.kt,新增有界摘要观察PurchaseSelectionEvidence.kt。不改普通采集器实现或规格点击选择,不新增分享、OCR、重新选规格和支付。验证证据
--rerun-tasks强制重跑:19 套件 418 项通过,0失败、0错误、0跳过,24 个 Gradle task 实际执行。*Purchase*Test、*SpecPanelRecognitionTest、*SpecValueNormalizerTest、*TruncatedSpecCardTest、*PddProductDetailCollectorTest、*SpecOptionDedupTest、*PddNavigationTest、*SpecClickDiagnosticTest。assembleDebug、compileReleaseUnitTestKotlin、git diff --check通过。编译仍有未修改文件的既有 deprecated/unused 警告。harness.py check --strict在未修改基线即失败:docs/evidence/pdd-home-35727-summary.md未登记为 Wiki 镜像,源于既有a16e692;本次不混入治理修复。核心 Wiki 一致性检查另外通过。文档
f8bb75d1fc0b5e8822186c740ac2034fbd562057;明确旧 #374 与新 #376 行为及风险边界。harness.py sync、一次sync --check,17 个核心镜像一致,只有业务规则镜像变化。用户追加授权的覆盖安装
192.168.0.9:39459,安装前 ONLINE、无 current_task_id 标记。adb install -r返回 Success;未卸载、未清数据、未修改服务器配置。ce48656d2d2173b258a0ab467fe02fbffbe3d1552d78f4d897cdcba433670575。bf86d7465c6092be74ce9c4187eb30c9a7d045c3b91891a547e2598429766dec。0.9.69-373-fix1 / code82,本次未调整版本号;必须用上述哈希区分已包含 #376 的新包,不能只看版本名。D:/OPC/goauto-worktrees/issue-376/android/app/build/outputs/apk/debug/app-debug.apk。原 PurchaseFinalSpecConfirmationTest 用例逐项处理
bracket display variants and offscreen color are proven by full panel summarysummary above scroll area is accepted for scrollable and non scrollable sheetschecked only exact option and physical parent child duplicates provide selection proofselected other color or size overrides matching summary and positive targetselected bracket variants are not a conflictdistinct physical identical or normalized target options are collisionsexplicit unavailable target cannot be rescued by summaryall required selected proofs take priority over a single non proving summaryselected options retain established parser separation of trailing display priceunselected visible options alone and unrelated title cannot prove selectionpanel external prefixed summary is ignored even at same coordinatesstructural ancestry overrides textual path prefixwhole summary rejects substring sizes colors extra dimensions quantity and unsupported separatorsknown candidates making another full composition reject ambiguous summarysummary permits invisible color despite another unselected visible colorrequired single dimension must equal whole summary and empty pair is never proofanchored selected prefix variants preserve internal colons commas and whitespaceconflicting scoped summaries reject even both exact options selecteddisplay normalization is narrow and content preservingexisting structurally recognized unprefixed summary is usablesame dimension groups retain earlier selected conflicts and physical candidatescollector default still collapses same raw labels and leaves summary behavior unchangedindependently bounded selected options survive absent full panel boundaryprice quantity and address checks remain enforced其他夹具调整:一条 SpecPanelRecognitionTest 的定位页面改为正常提交文案;两条 TruncatedSpecCardTest 的已完成选规格假页面不再显示“请选择”。原定位、去重、点击次数和 target-first 断言保留。