feat: 采购失败保存现场控件树供管理员下载(诊断闭环) #364
Open
opened 2026-10-08 09:08:14 +08:00 by ila
·
10 comments
No Branch/Tag Specified
main
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#364
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.
基本信息
order_result_unknown。用户原话摘要:「延长待付款界面的等待时间。如果失败,要不要把最后现场的无障碍控件树数据保存到 sqlite 或提交给 admin,用来后续 debug 修复」;「内部系统,不需要门禁……要把原始控件树数据保存下载,才能完整 debug」。4ae33d8,新增「失败现场控件树」条款(用户 2026-10-07 确认):只在失败/结果待核对时保存;存本机 SQLite 和服务端;仅管理员下载;不进代码、普通日志、工单、Wiki、任务快照、SynapBus、采购员/Android 普通接口;密码框内容不存;整屏截图、付款、OCR/VLM 限制不变;两端自动清理,默认保留 30 天。已核验事实与证据边界
4ae33d8,2026-10-08。主要路径:PurchaseLiveAutomation.readOrderResult()、AgentForegroundService、AgentDiagnosticStore、GoAutoAccessibilityService与accessibility_service_config.xml。PURCHASE_ORDER_CONTEXT_NOT_FOUND结束。本轮沿用原调查记录,未重新查询线上数据。goauto_diagnostics.db/AgentDiagnosticStoreschema v3 保存白名单结构化诊断,保留 7 天、最多 50 条;不是原始树存储,也未发现相应服务端树上传接口。canRetrieveWindowContent、flagRetrieveInteractiveWindows等;服务代码也设置FLAG_RETRIEVE_INTERACTIVE_WINDOWS,本方案不新增相关权限或服务配置。目标与非目标
目标:
非目标:
capture()及解析输入,不混入规格匹配修复。实施单元划分
按两个可独立验收的单元落单:
拆单已完成:A 为 #365,B 为 #364;B 不按 Android / Server / Web 继续拆分。本单只验收 B,以下 A 的设计及验收条目保留历史,以 #365 为准,不计入本单实施范围。
A. 核单等待设计(历史,已拆至 #365)
paymentPageObserved判定该起点:当前该标记也会在待付款页面出现时置真,不等价于已执行安全返回。ORDER_RESULT_MAX_SAMPLES从 60 改为 120:现有循环含按采样序号触发的滑动,直接翻倍可能增加动作。B. 失败现场诊断设计
B1. 时机、窗口与属性
spec_probe与purchase两个阶段,manifest 必须记录真实phase。每个有效 attempt UUID 最多一份快照,可包含多个窗口;针对failed、order_result_unknown以及本节约束内的执行阶段异常现场进行诊断,不捕获成功任务。PurchaseSpecProbePolicy.demote(rawOutcome)之后的最终结果为准,避免漏掉“探测返回成功但空规格被降为失败”的情况。spec_probe_completed、order_created、rehearsal_completed成功结果均不生成快照。dismissPurchaseResultBubble()位于任务开始处,是清除上一次提示;不要求本次失败快照在该操作前截取,也不为诊断改变这一既有清理顺序。capture()或解析输入。getWindows()返回的默认显示屏可交互窗口,记录窗口 ID、类型、层级、标题、活动/焦点、边界、截取时间及可取得的包名/Activity。partial及原因;具体节点/耗时上限在实现前用代表性样本确定,不能无限遍历。B1a. 统一诊断入口与异常边界
catch/finally中无条件抓取。PurchaseLiveException)、执行阶段超时/意外异常、结果待核对,以及有有效 attempt 的规则解析失败等前置失败。executePurchaseTask()当前 try/catch 同时包含领取、执行、本机结果入队、悬浮窗和上传。订单成功且结果已落本机库后,即使flushPurchaseOutbox()网络失败、显示提示失败,也不得新增采购失败快照或改掉成功结果。原执行已失败但上传失败时复用已存快照,不重复截取。B1b. 重启与恢复现场
recoverInterruptedPurchases()处理的是重启后状态,不等于原失败时页面。已有快照直接复用/补传,不能覆盖;原现场没有保存时记录“进程中断,原现场未保存”。AGENT_RESTARTED_DURING_EXECUTION时,不抓重启后的页面充当旧任务原现场。B2. 密码保护与导出格式
password=true节点除 text 外,contentDescription、hint、stateDescription、tooltip、action label 等可能承载内容的文字字段均不保存,保留结构和状态。manifest.json及每窗口一个window-<id>.xml。ZIP 已压缩,不再套一层 gzip。hierarchy根,标准属性沿用 UIAutomator dump 命名,扩展属性使用合法名称或已声明命名空间。不能把多个根直接拼接成一个 XML。B3. 本机存储与 #361 依赖
agent_diagnostic白名单结构化记录。taskId、deviceId、服务端taskAttemptId(UUID)、规则快照哈希、阶段和错误码;尝试序号可用于显示,但不能代替 UUID 作为归属/幂等键。B4. 上传、服务端与容量
B5. Admin 下载与设计证据
子项目影响、依赖与并行边界
验收标准
A:等待调整(历史验收项,移交 #365,不计入本单)
B:完整诊断功能
风险及实施前待补齐项
文档影响
早期设计整合仅更新工单;本次实施已更新长期Wiki,revision及镜像验证见交付记录。未导出任务快照。
实施后需更新长期 Wiki:Business-Rules-and-Glossary(两阶段失败现场存储例外及恢复边界;核单预算由 #365 维护)、Architecture-and-Code-Map(导出器/存储/队列)、Agent-API-Contract(上传与管理员下载、attempt UUID 与幂等边界)、Troubleshooting(下载、partial 含义及诊断排查)。准确区分普通接口禁返原始树与专用诊断接口;先改线上 Wiki 并读取 revision,再一轮 sync + sync --check。
方案整合记录
2026-10-08,Codex 按用户“把这些决策和 8953 整合进正文,发消息给 Claude”更新。本次解决原草案全部六项待建议问题;容量数字仍为明确标记的测试起点,工单拆分尚未实际执行。评论 8952/8953 保留审阅历史,以本正文为当前设计依据;不表示实施、迁移、合并、部署或验收完成。
2026-10-08 评论 8962 与失败出口审核整合
用户授权采纳并整合 Codex 对消息 #83/#84 的审核,补充“成功后上传失败不截取”“重启不伪造原现场”等回归验收。代码核验基线
7622795d97d4da3dd638619af99628b0352a42dd:AgentForegroundService.executePurchaseTask()576–694、recoverInterruptedPurchases()736–775、PurchaseOutboxUploader和PurchaseRehearsalExecutor。本次明确 demote 后的最终失败、统一诊断入口的条件、成功结果上传异常排除、无有效 attempt/无障碍的未截取原因、原现场与恢复现场区别及不可逆状态保护,并修正已拆单后残留的待拆分描述。历史 A 节仅作引用,不纳入本单实施。只更新方案与待执行测试清单,未编写/运行测试、未修改代码、未实施迁移或发布。2026-10-08 v1 设计确认
2026-10-08 实施授权与工作计划
用户明确授权“#364 实施 Android 本地诊断库升级、服务端追加迁移、专用接口权限及本地迁移验证”。沿用评论8989已确认v1,仅本地实施/验证,不含线上迁移、合并main、发布、安装、真实现场抓取或下单。工作区
D:/OPC/goauto-worktrees/issue-364;分支feat/364-purchase-failure-snapshot,基线最新origin/main7622795;#365/#366不混入此分支,后续集成另行验证。实施检查点(代码/合成验证完成,真机差距见交付记录)
具体容量测试起点保持正文,正式限额依据仍须代表性现场样本;本轮不因缺少真机授权伪造验证或扩大采集权限。
2026-10-08 实施交付及三单合并
代码与范围
4581ee5(35个任务相关文件);文档0c24c38;main合并提交e450ac28989de6827328b411e4bdc050dded9ab3,已推送远端。合并前origin/main5f45932;隔离集成8c4940d保留 #365/#366 集成分支d2083e7全部提交,无生产代码冲突。#366仅②/hint保护,不包含仍缺证据的①。1791400000000_purchase_failure_snapshot.go,LONGBLOB/LONGTEXT、attempt唯一;专用DeviceToken上传、严格管理员摘要与ZIP下载;所有权/终态/幂等/恢复升级、ZIP/XML及容量验证、日志正文排除和30天定期清理。Web复用已确认v1,在执行记录末尾加200px管理员专属列。自动化及审核
gradlew.bat :app:test :app:assembleDebug退出0;Debug/Release各564项,均0失败/错误/跳过;不是只复用单分支结果。最终APK SHA256bf8ed021d2bfcc05d49eda54a7b40240a30eda2d1e93199c8dee408c052b1dbe,版本仍0.9.69/82;本轮未安装或发布APK。purchase/access/migrations/common/middleware/version-local/cmd/api无缓存通过,Server构建通过。实际Android合成导出器产生的ZIP经TestFailureSnapshotAndroidExporterContract验证通过,含双窗口、不可见/重复节点、特殊字符/UTF16编码、密码字段排除及null root;未使用生产数据。本地数据库(已单独授权)
127.0.0.1:3308MySQL8.4.3无goauto库,经用户授权创建全新库并完成70个注册baseline迁移,包含1791400000000;根目录已忽略config.yaml仅端口改为3308,不提交凭据。旧售后迁移所需初始密码仅当前进程临时生成,不记录或复用。TestFailureSnapshotAuthorizedLocalMySQL通过:#364追加迁移重复执行幂等,完整既有API目录/采购员权限对账,专用两接口无非管理员授权;64KiB manifest与2MiB BLOB合成数据回读及attempt唯一约束验证后事务回滚,采购任务仍0条。文档
2102252a3f0ecb646b49941cc603423abb76ca2c6a6a1a9a13aaf5284e5a81a79f849ad28525cebab9efffa2045d01399bfe02ce626cfd1bb379ec414349298c740c0cb94d8c6bf33423c9c7965ff1c76ca0b35cb1e8058b2930a9a01029822af8b571d2在线全文回读成功后只运行一轮
harness.py sync+sync --check,17页一致;本次诊断排查说明收敛至Local-Development-and-Verification和Deployment-and-Operations,原Troubleshooting的#365/#366内容不重复改写。五份镜像已提交,不直接改写镜像。已知限制及待验收
harness.py check --strict仍因基线已有docs/evidence/pdd-home-35727-summary.md未登记失败;Wiki一致性检查通过,未把二者混同。Web既有CSS/chunk提示保留,可选Android lint扫描未完成,不记通过。2026-10-08 已授权合并 main(#364/#365/#366)
e450ac28989de6827328b411e4bdc050dded9ab3,远端回读一致。合并前main为5f45932;#364实现4581ee5,原#365/#366集成d2083e7,三单生产集成8c4940d。保留源分支及全部提交,无生产代码冲突,没有压缩或丢弃历史。D:/OPC/goauto-worktrees/issue-364/android/app/build/outputs/apk/debug/app-debug.apk,SHA256bf8ed021d2bfcc05d49eda54a7b40240a30eda2d1e93199c8dee408c052b1dbe。未安装或发布;若通过Admin分发需按后续发布流程处理版本号,不把同versionCode产物宣称自动更新已启用。方案补充:控件树必须是完整原始现场(2026-10-08,Claude Code,用户确认补充)
用户要求失败时保存的应是原始控件树,能完整还原现场。原草案 B.1/B.2 有两处会导致数据不完整,补充如下,取代原草案中对应表述:
rootInActiveWindow。getWindows()截取屏幕上的全部窗口,记录每个窗口的类型、层级(layer)、标题、是否活动、是否获得焦点及窗口边界,再分别保存各窗口的完整节点树。flagRetrieveInteractiveWindows);如需修改服务配置,请在方案中说明影响。password=true节点不保存 text。uiautomator dumpXML。<hierarchy>的文件),节点属性名沿用uiautomator dump的命名(text、resource-id、class、package、content-desc、checkable、checked、clickable、enabled、focusable、focused、scrollable、long-clickable、password、selected、bounds等),扩展属性另加前缀。这样可以直接复用现有 XML 分析脚本。uiautomator dump一致;密码框 text 为空。以上补充不改变 AGENTS.md「失败现场控件树」条款的存放、访问与 30 天清理限制。
方案修订:采纳 Codex 对评论 8952 的审核建议(2026-10-08,Claude Code,用户确认补充)
依据:SynapBus
#goauto消息 #75/#76(Codex 对 #73/#74 与评论 8952 的审核)。Claude Code 已核对,6 条全部采纳;其中第 2 条已对照 origin/main 核实:accessibility_service_config.xml:5,7已配置flagRetrieveInteractiveWindows、canRetrieveWindowContent="true",GoAutoAccessibilityService.kt:45已设置FLAG_RETRIEVE_INTERACTIVE_WINDOWS。本评论修订评论 8952 及正文 B 节的对应表述,以下内容优先。getWindows()只返回默认显示屏上的可交互窗口,存在模态窗口时底层窗口可能不返回;窗口 root 为 null、截取过程中窗口变化、内容不可访问时,必须在快照中显式记录,不能静默缺失。capture()和解析输入。password=true的节点除 text 外,contentDescription、hint、stateDescription、tooltip、action label 等可能承载文字的字段也一律不保存;保留结构和状态,并补其他字段的泄漏测试。订单、地址等普通诊断数据仍按 AGENTS.md「失败现场控件树」条款保存,不增加额外门禁。manifest.json(快照元数据、窗口列表、partial 标记、属性清单版本等)和每个窗口一个window-<id>.xml。hierarchy根,属性名沿用 UIAutomator dump 命名;扩展属性使用合法命名或命名空间。仍待 Codex 回答的问题(正文「待 Codex 建议的问题」)
第 2 题(单帧还是多帧)已由上面第 6 点回答:单帧。其余仍待建议:
AgentDiagnosticStore,与 #361「安装后诊断库无新增记录」疑点的关系及处理顺序;feat(android): 采购失败保存现场控件树供管理员下载,并延长核单等待时间to feat: 采购失败保存现场控件树供管理员下载(诊断闭环)拆单记录(2026-10-08,Claude Code,用户确认)
方案补充:覆盖规格探测阶段,并在统一失败出口截取(2026-10-08,Claude Code,用户确认补充)
正文 B1 写的是「每个采购 attempt……覆盖
failed和order_result_unknown」,以下两点需要明确:1. 规格探测(spec_probe)阶段的失败也要保存
spec_probe和purchase两个阶段,两者都是在手机上实际执行的 attempt。例如 #1789 多次PURCHASE_SPEC_PROBE_EMPTY都发生在探测阶段。failed、order_result_unknown),都保存一份快照;manifest 记录phase。spec_probe_completed和order_created不保存。2. 截取挂在统一的失败出口,不按错误码逐个添加
PurchaseLiveException等明确失败、超时、意外异常,以及规则解析失败、无障碍未就绪等前置失败。依据 origin/main4ae33d8,AgentForegroundService.executePurchaseTask()(约 576 行起)汇总执行结果并上报,另有AgentApiException和通用Exception的处理分支(约 687、689 行)及结果待核对的上报路径(约 740~770 行)。dismissPurchaseResultBubble/结果悬浮窗显示、切回 Agent 之前完成,并有时间上限,不能延误结果上报和设备释放。#364 轻量设计 v1(2026-10-08,待用户确认)
用户本轮指令“做#364”已收到。核对正文B5及风险项后,尚未有管理员下载入口的设计确认;本轮先补设计证据,未编写生产代码、执行迁移或发布。仅复用现有采购任务详情的“执行记录”表,不新增页面。
布局(合成示意,无生产数据)
实施与授权边界
批准v1后,先核定共享API/表结构及幂等契约,再实施Android→Server→Web闭环。SQLite新增独立快照/待上传表;Server新增独立诊断存储及管理员专用接口。保留正文所有隐私、单attempt一份、结果优先、恢复来源及清理边界。
需另行明确授权:Android本地诊断库追加升级、服务端诊断表追加迁移及管理员/设备专用接口权限实施、本地迁移验证。线上迁移、合并main、发布、安装、真机现场截取与订单操作不包含在该授权内。
容量/节点/耗时最终值仍需代表性样本验证,正文2MiB ZIP/8MiB解压/64MiB本机只是测试起点;不能因为v1界面通过就把它们认定为实测。无授权真机数据时可先合成测试,但正式现场闭环验收仍待用户授权。
设计记录
版本:v1;确认人/时间:待用户确认;覆盖:采购详情执行记录的正常、partial、空、加载、失败、下载中及管理员/采购员边界。
文档影响:本次仅补待审核设计到工单,不改当前实现Wiki,不创建本地任务快照。
本地验证环境补充授权(2026-10-08)
用户确认已更换电脑,本机 MySQL 为
127.0.0.1:3308,原本尚未初始化goauto。经单独确认,授权创建新的本地goauto库、执行项目初始化及 #364 迁移/专用权限验证。仅本地空库;不涉及线上服务、生产数据、主分支合并、APK 安装或真机抓取。主仓库忽略配置config.yaml仅将数据库端口由旧 3307 调整为 3308;凭据未写入工单、源码或日志。已按用户授权合并并推送main
e450ac28989de6827328b411e4bdc050dded9ab3,正文已整合实现/验证及边界。三单组合Android Debug/Release各564项全部通过,APK构建通过;Server六个受影响包/构建和Web13项mock回归/构建通过。#366只合入②/hint保护,①待证据;#364真机诊断闭环仍待验。本次未部署、未执行线上迁移/重启、未安装手机。各项未验证与基线检查失败已明确记录,工单保持打开。用户在三单合并后确认本地联调方案,并要求“按照你的建议来增加配置”。本轮仅把干净、无运行引用的 D:/OPC/goauto-runtime 更新到已合并main e450ac2,在 D:/supervisord 添加GoAuto前后端两个实例,读取根目录已忽略config.yaml,后端SkipMigration,autostart=false。只做配置/依赖及静态验证,不启动业务服务、不reload全局Supervisor、不触发定时任务、迁移、权限写入或线上操作。作为本单本地联调运行准备记录,不新增产品行为;长期运维路径更新Deployment-and-Operations。
本地 Supervisor 运行准备完成(2026-10-08,用户追加授权)
002ab9b已推送 integration/364-365-366-main(仅文档,未追加合并main)。真机安装记录(2026-10-08)
用户指定192.168.0.226:35977安装集成APK。原0.9.64/77与本机新签名不同,首次覆盖安装被INSTALL_FAILED_UPDATE_INCOMPATIBLE拒绝,未改变旧数据。用户随后明确授权卸载旧Agent并重新安装。
已卸载且重新安装成功:cn.ilapage.goauto.agent,0.9.69/versionCode82;设备回读APK SHA256与已验证构建一致:bf8ed021d2bfcc05d49eda54a7b40240a30eda2d1e93199c8dee408c052b1dbe。包含已合并main的#364/#365/#366集成变更(#366仅已交付范围)。
卸载已清除旧Agent私有配置及本地记录,未备份,不可由本次操作恢复;需重新配置服务器/设备注册及检查无障碍授权。未清除PDD数据、未更改Admin业务数据、未启动采集采购或付款,安装成功不代表真机业务验收通过。