docs: import wiki at afc651f75a3a

ila
2026-08-07 16:36:23 +08:00
parent ede068de64
commit b0a9495071
+122
@@ -0,0 +1,122 @@
<!-- docs-wiki-sync:docs/tasks/T-101.md@afc651f75a3abc2676bb13aa8a80f6aa6a25a72e -->
> 同步来源:[`docs/tasks/T-101.md`](/chengma/mroubao/src/commit/afc651f75a3abc2676bb13aa8a80f6aa6a25a72e/docs/tasks/T-101.md) · commit `afc651f75a3a`
---
id: T-101
title: 固定任务跑通拼多多关键词搜索
phase: 1
deps:
- T-002
- T-003
status: DONE
created: 2026-07-25
context_ref: 1c1c1581493af2d04433012064f44f58c1f1d56b
work_branch: main
write_paths:
- android-buyer/app/build.gradle.kts
- android-buyer/app/src/main/java/com/roubao/autopilot/MainActivity.kt
- android-buyer/app/src/main/java/com/roubao/autopilot/accessibility/**
- android-buyer/app/src/main/java/com/roubao/autopilot/pinduoduo/**
- android-buyer/app/src/main/java/com/roubao/autopilot/ui/screens/SearchProbeScreen.kt
- android-buyer/app/src/main/java/com/roubao/autopilot/workflow/**
- android-buyer/app/src/test/java/com/roubao/autopilot/pinduoduo/**
- android-buyer/app/src/test/java/com/roubao/autopilot/workflow/WorkflowRunnerTest.kt
- docs/00-ai-start-here.md
- docs/02-requirements.md
- docs/03-tech-stack.md
- docs/04-architecture.md
- docs/05-coding-rules.md
- docs/current-state.md
- docs/tasks/T-101.md
- progress.md
---
## 问题 / 背景
Phase 0 已证明设备、无障碍、workflow 和任务输入可用,但尚未让肉包执行任何真实
拼多多动作。最高风险假设是:在拼多多 8.17.0 上,能否只依赖可访问性语义稳定打开
搜索、输入固定关键词并确认进入结果页,同时对异常页面安全停止。
## 关联需求与交互
- 功能:F-004 的关键词搜索部分、F-007 安全失败。
- 用户故事:US-004、US-006。
- 交互:Android“探针”页,用户显式点击开始和停止。
- 架构:`WorkflowRunner` + `PinduoduoSearchAutomation` + 无障碍 driver。
## 方案
1. 使用固定脱敏关键词,不读取真实订单标题,也不调用 VLM。
2. 把页面文本分类和搜索 workflow adapter 保持为纯 Kotlin 可测边界。
3. 无障碍 driver 只对 `com.xunmeng.pinduoduo` 操作,使用 resource ID、editable、
文本和 content description,不使用屏幕坐标。
4. 步骤为打开 App、进入搜索、输入并提交、验证结果页;每步有 timeout 和最多一次
retry。
5. 登录、验证码、风控、支付边界立即 `BLOCKED`;未知页面连续观察后安全停止。
6. Android“探针”页展示当前步骤、终态和停止按钮;不执行商品点击或下单。
## 验收要点
- [x] 用户显式点击后打开拼多多并提交固定关键词。
- [x] 成功条件是识别到搜索结果页,不以“点击已发出”冒充成功。
- [x] 全流程不用坐标,不进入商品详情、不提交订单、不支付。
- [x] 登录、验证码、风控、未知页和支付边界产生可区分的 `BLOCKED`。
- [x] 每步 timeout、retry 和用户停止由 T-003 runner 执行。
- [x] 页面分类和 adapter 使用 Fake driver 有自动化测试。
- [x] 拼多多 8.17.0 真机 smoke 通过并保存不含私有内容的证据。
- [x] `lintDebug test assembleDebug` 通过。
## 边界
- 不从真实 Shopee 标题生成搜索词;固定词只验证页面自动化。
- 不浏览候选、不点击商品、不滚动结果列表。
- 不使用 Shizuku shell、ADB 坐标、OCR 或 VLM 作为降级。
- 不绕过登录、验证码、风控或平台提示。
## 执行记录
### 2026-07-25:任务开始
- 基于 T-004 提交 `1c1c158` 开始。
- 测试基线为 OnePlus PKG110、Android 16/API 36、拼多多 8.17.0;肉包采购无障碍
已启用并连接。
### 2026-07-25:实现
- 增加纯 Kotlin 页面分类器和 `PinduoduoSearchAutomation`。页面节点必须同时可见、
启用并唯一匹配;结果页必须同时出现精确固定关键词、搜索头和至少 3 个排序控件。
- 增加 Android 无障碍 driver。打开搜索只点击语义节点或其可点击祖先,输入只使用
`ACTION_SET_TEXT`,并从新的根节点重新读取精确文本后才算成功;没有坐标或 shell
降级。
- workflow 固定执行打开 App、输入、提交和验证四步,沿用 T-003 的 timeout、有限
retry、停止和单实例约束。登录、验证码、风控、未知页面及订单/支付边界直接阻塞。
- 新增“拼多多搜索探针”默认工作页,显示固定词、当前步骤、终态和开始/停止操作。
Activity 恢复后延迟复检无障碍连接,避免系统服务晚连接造成按钮状态滞后。
- 修正 Debug fixture 资产与 lint model 的 Gradle 任务依赖,使完整验证不受增量任务
顺序影响。
### 2026-07-25:自动化验证
- `gradlew.bat lintDebug test assembleDebug --no-daemon` 成功。
- App Debug/Release、task contract 和导入器共 12 份报告、62 次测试,0 failure、
0 error、0 skipped。
- 页面分类覆盖首页、输入页、精确结果页、隐藏/禁用伪节点以及登录、验证码、风控、
未知页和订单/支付边界;Fake driver 覆盖成功、瞬态 retry 和安全阻塞。
- 普通 Debug APK 中 `assets/probe-fixtures/` 条目数为 0。
### 2026-07-25:真机 smoke
- 从肉包“开始搜索探针”按钮显式启动;App 使用固定脱敏词执行,未读取或显示私有
蝦皮样本。
- 拼多多 8.17.0 结果页采集到 174 个可访问节点:精确关键词存在、结果页搜索头存在、
4 个排序控件存在、搜索输入框为 0、订单/支付边界为 0。
- `ACTION_SET_TEXT` 后的新根节点精确回读通过,肉包最终显示 `SUCCEEDED` 且四步均
完成;logcat 未发现肉包崩溃或 ANR。
- smoke XML/PNG 只保存在被忽略的 `.local/t101-smoke/`,未纳入 Git。重装后 ColorOS
出现一次系统无障碍“保持开启”确认,确认后服务正常绑定;产品代码没有绕过该权限。
## 后续
- T-102 从当前结果页浏览并采集最多 5 个候选;仍不得无界滚动、点击下单或支付。
- 从不属于已识别首页/输入页/当前固定词结果页的状态启动时,当前实现按
`UNKNOWN_PAGE` 安全阻塞,不猜测返回路径。