修复 Agent 当前页面分享点击竞争并增加轻量诊断 #106

Closed
opened 2026-08-27 11:44:46 +08:00 by ila · 3 comments
Owner

所属与来源

  • 关联工单:#101 Agent 当前 PDD 商品页临时采集、#104 页面恢复、#105 剪贴板异步写入等待。
  • 来源:用户于 2026-08-27 反馈最新 APK 当前页面采集失败:PDD_SHARE_UNAVAILABLE:无法打开商品分享;确认采用“页面稳定后有限重试分享点击,并在 Agent 保存轻量结构化诊断信息,尽量不影响采集流程”的方案,要求建独立工单实施。
  • 类型:Android Agent / 当前页面采集 / 分享点击时序与可观测性缺陷。
  • 设计证据:不新增或调整页面、组件、导航与用户流程;诊断仅写入 Agent 本地受限存储并用于 ADB 排错,复用 #101 已审核交互,因此不另做原型。

当前事实与根因

一加 PKG110、Agent 0.9.2、任务 #70:

  • 任务于 11:30:06.185 开始把 Agent 任务移到后台;PDD NewPageActivity 已恢复并绘制,但系统任务切换动画约到 11:30:06.872 才结束。
  • 当前页面采集在过渡期间已开始;第一份快照能找到唯一“分享”入口。
  • clickFresh 随后用文字、类名和中心点 ±32px 重新定位一次;重新定位不到或 ACTION_CLICK 返回 false 时立即失败。
  • 当前实现把 NOT_FOUND 与 FAILED 合并为“无法打开商品分享”,没有保存足以区分分支的结构化诊断。
  • 若分享动作成功但面板未出现,应返回 PDD_COPY_LINK_UNAVAILABLE;任务 #70 未进入该阶段。#105 的剪贴板轮询未被执行,不是本次根因。
  • 任务 #68 曾在同一规则下通过分享和复制入口,说明规则别名本身可用,更符合页面切换/控件变化的瞬时时序竞争。

目标

  1. 恢复 PDD 后,只有商品页与唯一顶部“分享”目标稳定,才尝试点击。
  2. 目标在点击前瞬时变化时,在短时间、有限次数内重新捕获并重试,不立即失败。
  3. Agent 本地保存与 taskId 关联的轻量结构化诊断,用于区分重新定位失败、歧义、无可点击父级、ACTION_CLICK 失败和面板未出现。
  4. 诊断旁路不得改变采集成功/失败判定;诊断写入失败不得中断或拖慢正常采集。

非目标

  • 不保存分享文案、剪贴板正文、URL 原文、控件树或截图。
  • 不增加盲目坐标点击,不点击兄弟节点、相似文字或未知窗口。
  • 不修改 Server、数据库、规则格式、Admin 或 Agent UI。
  • 不修改采购、地址、创建订单或支付能力。
  • 不解决商品无效、相似商品选择或图片搜索。

实施方案

分享稳定与有限重试

  1. 在当前页面身份确认中,要求包名、精确 Activity、页面强证据及唯一顶部分享目标连续两次稳定;稳定条件使用语义身份和足够容忍系统过渡的目标区域重叠,不仅依赖瞬时中心点。
  2. 分享动作在约 1 秒总预算内有限重试:
    • 每次重新捕获页面并重新计算唯一顶部分享目标;
    • 只调用现有安全 clickFresh,仍只允许目标自身或最近可点击父容器;
    • AMBIGUOUS 立即失败,不因重试选择任意候选;
    • NOT_FOUND / FAILED 只在页面仍为可信商品详情时短暂重试;
    • 包名、Activity、页面证据变化或预算耗尽时明确失败。
  3. 分享动作成功后仍使用现有“等待唯一复制链接面板”逻辑;不重复点击已成功的分享动作。
  4. 将最终错误细分为普通人可理解的提示,同时保留稳定内部阶段/原因枚举。

Agent 本地结构化诊断

  1. 复用 Agent 现有本地 SQLite,新增受限诊断记录或等价本地存储;每条至少关联 taskId、阶段、原因、时间、Agent 版本及耗时。
  2. 允许记录的结构化字段仅包括:
    • package/activity 是否匹配;
    • 分享候选数量;
      -目标类名、是否可点击、最近可点击父级层数、受限坐标/区域摘要;
    • 页面稳定次数、重试次数;
    • NOT_FOUND / AMBIGUOUS / NO_CLICKABLE_PARENT / ACTION_CLICK_FALSE / SUCCESS / PANEL_TIMEOUT;
    • 剪贴板轮询次数、MIME 是否合格、条目数量、长度、时间戳新鲜度和超时结果,不含正文。
  3. 诊断写入使用 runCatching 等旁路保护;写入失败只允许写不含敏感数据的系统日志,绝不能改变任务结果或阻塞采集。
  4. 每台设备最多保留最近 50 条或最近 7 天,写入时顺带清理;不新增后台清理线程。
  5. 本工单不增加 UI;通过受控 ADB/开发排错读取。后续若要在任务详情展示,另建 UI 工单和设计证据。

安全边界

  • 不保存原始分享内容、剪贴板内容、商品 URL、控件树和截图。
  • 日志与数据库不写 Token、账号、地址或个人数据。
  • 分享候选必须唯一;歧义立即失败。
  • 不使用 OCR/VLM,不猜测商品身份。
  • 不采购、不修改地址、不创建订单、不支付。

验收标准

  • PDD 任务切换动画期间不立即点击;页面与唯一分享目标稳定后才执行。
  • 分享目标瞬时变化时在约 1 秒预算内有限重新捕获,成功后只点击一次并继续复制链接。
  • 分享候选歧义、页面变化或预算耗尽时明确失败,不点击相似节点。
  • 本地诊断能区分目标未找到、歧义、无可点击父级、ACTION_CLICK 失败、面板超时和成功。
  • 诊断不含分享/剪贴板原文、URL、控件树或截图,并按 50 条/7 天限制清理。
  • 人为模拟诊断写入失败时,采集流程的原结果不变。
  • 普通采集、采购、#105 剪贴板轮询无回归。
  • Android 单元测试和 APK 构建通过;安装到一加后保持无障碍启用。
  • 真机业务回归由用户让 PDD 停留在商品详情页后触发,不执行采购或支付。

验证计划

  • 单元测试:页面/目标稳定判定、有限重试、歧义立即失败、页面变化终止、诊断异常旁路、保留上限与脱敏字段。
  • 构建:.\gradlew.bat testDebugUnitTest assembleDebug。
  • 静态检查:git diff --check、python dev_scripts/harness.py check --strict。
  • 真机:覆盖安装一加,核对版本和无障碍状态;由用户触发当前页面采集后读取结构化诊断验证。
  • 文档影响:不改变长期业务/API/数据契约,只修复 #101 既定行为并增加开发侧本地诊断;在工单说明原因并跳过 Wiki。
## 所属与来源 - 关联工单:#101 Agent 当前 PDD 商品页临时采集、#104 页面恢复、#105 剪贴板异步写入等待。 - 来源:用户于 2026-08-27 反馈最新 APK 当前页面采集失败:`PDD_SHARE_UNAVAILABLE:无法打开商品分享`;确认采用“页面稳定后有限重试分享点击,并在 Agent 保存轻量结构化诊断信息,尽量不影响采集流程”的方案,要求建独立工单实施。 - 类型:Android Agent / 当前页面采集 / 分享点击时序与可观测性缺陷。 - 设计证据:不新增或调整页面、组件、导航与用户流程;诊断仅写入 Agent 本地受限存储并用于 ADB 排错,复用 #101 已审核交互,因此不另做原型。 ## 当前事实与根因 一加 PKG110、Agent 0.9.2、任务 #70: - 任务于 11:30:06.185 开始把 Agent 任务移到后台;PDD `NewPageActivity` 已恢复并绘制,但系统任务切换动画约到 11:30:06.872 才结束。 - 当前页面采集在过渡期间已开始;第一份快照能找到唯一“分享”入口。 - `clickFresh` 随后用文字、类名和中心点 ±32px 重新定位一次;重新定位不到或 `ACTION_CLICK` 返回 false 时立即失败。 - 当前实现把 `NOT_FOUND` 与 `FAILED` 合并为“无法打开商品分享”,没有保存足以区分分支的结构化诊断。 - 若分享动作成功但面板未出现,应返回 `PDD_COPY_LINK_UNAVAILABLE`;任务 #70 未进入该阶段。#105 的剪贴板轮询未被执行,不是本次根因。 - 任务 #68 曾在同一规则下通过分享和复制入口,说明规则别名本身可用,更符合页面切换/控件变化的瞬时时序竞争。 ## 目标 1. 恢复 PDD 后,只有商品页与唯一顶部“分享”目标稳定,才尝试点击。 2. 目标在点击前瞬时变化时,在短时间、有限次数内重新捕获并重试,不立即失败。 3. Agent 本地保存与 taskId 关联的轻量结构化诊断,用于区分重新定位失败、歧义、无可点击父级、ACTION_CLICK 失败和面板未出现。 4. 诊断旁路不得改变采集成功/失败判定;诊断写入失败不得中断或拖慢正常采集。 ## 非目标 - 不保存分享文案、剪贴板正文、URL 原文、控件树或截图。 - 不增加盲目坐标点击,不点击兄弟节点、相似文字或未知窗口。 - 不修改 Server、数据库、规则格式、Admin 或 Agent UI。 - 不修改采购、地址、创建订单或支付能力。 - 不解决商品无效、相似商品选择或图片搜索。 ## 实施方案 ### 分享稳定与有限重试 1. 在当前页面身份确认中,要求包名、精确 Activity、页面强证据及唯一顶部分享目标连续两次稳定;稳定条件使用语义身份和足够容忍系统过渡的目标区域重叠,不仅依赖瞬时中心点。 2. 分享动作在约 1 秒总预算内有限重试: - 每次重新捕获页面并重新计算唯一顶部分享目标; - 只调用现有安全 `clickFresh`,仍只允许目标自身或最近可点击父容器; - `AMBIGUOUS` 立即失败,不因重试选择任意候选; - `NOT_FOUND` / `FAILED` 只在页面仍为可信商品详情时短暂重试; - 包名、Activity、页面证据变化或预算耗尽时明确失败。 3. 分享动作成功后仍使用现有“等待唯一复制链接面板”逻辑;不重复点击已成功的分享动作。 4. 将最终错误细分为普通人可理解的提示,同时保留稳定内部阶段/原因枚举。 ### Agent 本地结构化诊断 1. 复用 Agent 现有本地 SQLite,新增受限诊断记录或等价本地存储;每条至少关联 taskId、阶段、原因、时间、Agent 版本及耗时。 2. 允许记录的结构化字段仅包括: - package/activity 是否匹配; - 分享候选数量; -目标类名、是否可点击、最近可点击父级层数、受限坐标/区域摘要; - 页面稳定次数、重试次数; - `NOT_FOUND / AMBIGUOUS / NO_CLICKABLE_PARENT / ACTION_CLICK_FALSE / SUCCESS / PANEL_TIMEOUT`; - 剪贴板轮询次数、MIME 是否合格、条目数量、长度、时间戳新鲜度和超时结果,不含正文。 3. 诊断写入使用 `runCatching` 等旁路保护;写入失败只允许写不含敏感数据的系统日志,绝不能改变任务结果或阻塞采集。 4. 每台设备最多保留最近 50 条或最近 7 天,写入时顺带清理;不新增后台清理线程。 5. 本工单不增加 UI;通过受控 ADB/开发排错读取。后续若要在任务详情展示,另建 UI 工单和设计证据。 ## 安全边界 - 不保存原始分享内容、剪贴板内容、商品 URL、控件树和截图。 - 日志与数据库不写 Token、账号、地址或个人数据。 - 分享候选必须唯一;歧义立即失败。 - 不使用 OCR/VLM,不猜测商品身份。 - 不采购、不修改地址、不创建订单、不支付。 ## 验收标准 - [ ] PDD 任务切换动画期间不立即点击;页面与唯一分享目标稳定后才执行。 - [ ] 分享目标瞬时变化时在约 1 秒预算内有限重新捕获,成功后只点击一次并继续复制链接。 - [ ] 分享候选歧义、页面变化或预算耗尽时明确失败,不点击相似节点。 - [ ] 本地诊断能区分目标未找到、歧义、无可点击父级、ACTION_CLICK 失败、面板超时和成功。 - [ ] 诊断不含分享/剪贴板原文、URL、控件树或截图,并按 50 条/7 天限制清理。 - [ ] 人为模拟诊断写入失败时,采集流程的原结果不变。 - [ ] 普通采集、采购、#105 剪贴板轮询无回归。 - [ ] Android 单元测试和 APK 构建通过;安装到一加后保持无障碍启用。 - [ ] 真机业务回归由用户让 PDD 停留在商品详情页后触发,不执行采购或支付。 ## 验证计划 - 单元测试:页面/目标稳定判定、有限重试、歧义立即失败、页面变化终止、诊断异常旁路、保留上限与脱敏字段。 - 构建:`.\gradlew.bat testDebugUnitTest assembleDebug`。 - 静态检查:`git diff --check`、`python dev_scripts/harness.py check --strict`。 - 真机:覆盖安装一加,核对版本和无障碍状态;由用户触发当前页面采集后读取结构化诊断验证。 - 文档影响:不改变长期业务/API/数据契约,只修复 #101 既定行为并增加开发侧本地诊断;在工单说明原因并跳过 Wiki。
Author
Owner

开始实施(2026-08-27)

已核对任务 #70、PDD/系统窗口时间线、当前页面识别器、无障碍点击实现和 Agent 本地存储。按工单范围:

  • 当前页面身份阶段增加连续稳定确认与约 1 秒有限分享重试;
  • 无障碍点击返回细分原因,歧义立即失败;
  • 新增独立、受限的 Agent 本地诊断库,避免与采购 Outbox 耦合;
  • 诊断写入使用旁路保护,最多 50 条且最多 7 天,不新增 UI;
  • 不保存分享/剪贴板原文、URL、控件树或截图。

不修改 Server、规则契约、Admin 或采购能力。

## 开始实施(2026-08-27) 已核对任务 #70、PDD/系统窗口时间线、当前页面识别器、无障碍点击实现和 Agent 本地存储。按工单范围: - 当前页面身份阶段增加连续稳定确认与约 1 秒有限分享重试; - 无障碍点击返回细分原因,歧义立即失败; - 新增独立、受限的 Agent 本地诊断库,避免与采购 Outbox 耦合; - 诊断写入使用旁路保护,最多 50 条且最多 7 天,不新增 UI; - 不保存分享/剪贴板原文、URL、控件树或截图。 不修改 Server、规则契约、Admin 或采购能力。
Author
Owner

实现与自动化验证完成,等待真机业务回归

实现

  • 当前页面采集先等待 PDD 包名、精确 Activity、页面强证据及唯一顶部“分享”目标连续稳定约 300ms。
  • 分享点击使用约 1 秒总预算有限重试;每次重新捕获页面和唯一目标:
    • 歧义立即失败;
    • 页面证据变化立即停止;
    • NOT_FOUND / 无可点击父级 / ACTION_CLICK=false 仅在可信详情页内短暂重试;
    • 成功后不重复点击,继续沿用唯一“复制链接”面板等待。
  • clickFreshDetailed 区分 ROOT_UNAVAILABLE、TARGET_NOT_FOUND、TARGET_AMBIGUOUS、NO_CLICKABLE_ANCESTOR 和 ACTION_CLICK_FALSE;其他采集/采购调用仍保留原 clickFresh 结果契约。
  • 新增独立 goauto_diagnostics.db,固定字段只保存 taskId、阶段、原因、次数、耗时、页面匹配布尔值、候选数量、控件类型/可点击性/父级深度/区域,以及剪贴板轮询的 MIME、条目数、长度和新鲜度元数据。
  • 不保存分享原文、剪贴板正文、商品 URL、控件树、截图、Token、账号或地址。
  • 诊断通过独立后台单线程写入;调度或 SQLite 异常均旁路,不改变任务结果。每次写入顺带保留最近 50 条且最多 7 天,不新增清理线程。
  • 本工单不新增 UI,不修改 Server、数据库、规则或采购能力。
  • Agent 版本更新为 0.9.3(versionCode 16)。
  • 无长期业务/API/数据契约变化,按工单约定跳过 Wiki。

验证

  • cd android && .\gradlew.bat testDebugUnitTest assembleDebug:通过。
  • 单元测试覆盖:稳定等待、首次重新定位失败后成功、歧义停止、结构化点击/剪贴板诊断、诊断写入异常不外溢、50 条/7 天保留策略,以及 #105 剪贴板策略回归。
  • python dev_scripts/harness.py check --strict:通过。
  • git diff --check:通过。
  • 本地提交:1d1618c fix(agent): stabilize PDD share action (#106)。
  • APK 已覆盖安装到一加 PKG110:0.9.3 / versionCode 16;无障碍服务仍启用。

待真机业务回归

请让 PDD 停留在商品详情页,切回 Agent 点击“采集”并确认。本次不自动触发采集,避免在用户未准备页面时创建无效任务。触发后可通过受控 ADB 只读取结构化诊断字段;不会读取或保存原始控件树、截图或剪贴板正文。工单保持待验收。

## 实现与自动化验证完成,等待真机业务回归 ### 实现 - 当前页面采集先等待 PDD 包名、精确 Activity、页面强证据及唯一顶部“分享”目标连续稳定约 300ms。 - 分享点击使用约 1 秒总预算有限重试;每次重新捕获页面和唯一目标: - 歧义立即失败; - 页面证据变化立即停止; - `NOT_FOUND` / 无可点击父级 / `ACTION_CLICK=false` 仅在可信详情页内短暂重试; - 成功后不重复点击,继续沿用唯一“复制链接”面板等待。 - `clickFreshDetailed` 区分 ROOT_UNAVAILABLE、TARGET_NOT_FOUND、TARGET_AMBIGUOUS、NO_CLICKABLE_ANCESTOR 和 ACTION_CLICK_FALSE;其他采集/采购调用仍保留原 `clickFresh` 结果契约。 - 新增独立 `goauto_diagnostics.db`,固定字段只保存 taskId、阶段、原因、次数、耗时、页面匹配布尔值、候选数量、控件类型/可点击性/父级深度/区域,以及剪贴板轮询的 MIME、条目数、长度和新鲜度元数据。 - 不保存分享原文、剪贴板正文、商品 URL、控件树、截图、Token、账号或地址。 - 诊断通过独立后台单线程写入;调度或 SQLite 异常均旁路,不改变任务结果。每次写入顺带保留最近 50 条且最多 7 天,不新增清理线程。 - 本工单不新增 UI,不修改 Server、数据库、规则或采购能力。 - Agent 版本更新为 0.9.3(versionCode 16)。 - 无长期业务/API/数据契约变化,按工单约定跳过 Wiki。 ### 验证 - `cd android && .\gradlew.bat testDebugUnitTest assembleDebug`:通过。 - 单元测试覆盖:稳定等待、首次重新定位失败后成功、歧义停止、结构化点击/剪贴板诊断、诊断写入异常不外溢、50 条/7 天保留策略,以及 #105 剪贴板策略回归。 - `python dev_scripts/harness.py check --strict`:通过。 - `git diff --check`:通过。 - 本地提交:`1d1618c fix(agent): stabilize PDD share action (#106)`。 - APK 已覆盖安装到一加 PKG110:0.9.3 / versionCode 16;无障碍服务仍启用。 ### 待真机业务回归 请让 PDD 停留在商品详情页,切回 Agent 点击“采集”并确认。本次不自动触发采集,避免在用户未准备页面时创建无效任务。触发后可通过受控 ADB 只读取结构化诊断字段;不会读取或保存原始控件树、截图或剪贴板正文。工单保持待验收。
Author
Owner

用户于 2026-08-28 明确确认本工单验收通过。按项目流程记录验收结论并关闭工单;本次仅更新工单状态,无新增长期文档事实,不重复同步 Wiki。

用户于 2026-08-28 明确确认本工单验收通过。按项目流程记录验收结论并关闭工单;本次仅更新工单状态,无新增长期文档事实,不重复同步 Wiki。
ila closed this issue 2026-08-28 15:07:12 +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#106