AGENTS.md
2026-08-28 以移动端 UA 请求 https://mobile.yangkeduo.com/goods.html?goods_id=971612375909:返回 200、约 64KB,正文中不含任何 thumb_url 等图片地址,商品数据由 JS 异步加载,且页面含 anti / VERIFY 等反爬标识。此前短链解析可行是因为那只是 307 跳转,不涉及取数据。因此「颜色 ↔ 图片」的对应关系只能在设备端、面板已渲染时取得。
https://mobile.yangkeduo.com/goods.html?goods_id=971612375909
thumb_url
anti
VERIFY
每个颜色是一个卡片,结构如下(紫色为例):
ViewGroup desc=" 紫色1700" clickable=true selected=true [36,1188][352,1591] ├ View 选中态背景 ├ ImageView desc=" 紫色1700" clickable=true [36,1188][352,1504] ← 颜色图,316×316 ├ ImageView desc="打开大图" clickable=true [36,1188][147,1299] ← 大图入口(本工单不使用) ├ TextView "74%人选择" └ TextView " 紫色1700"(tv_content)
浅粉卡片同构,图片节点为 [382,1188][698,1504],且在 selected="false" 时同样可用。
[382,1188][698,1504]
selected="false"
由此确认:
content-desc
同一棵树中,规格面板上方存在收货人手机尾号与详细地址文本节点([132,456][993,505] 等)。整屏截图会把这些一并保存,因此只允许保存裁剪后的图片区域,这是本工单的硬约束,也是规则修订必须写清的边界。
[132,456][993,505]
missing
completed
completed_partial
AGENTS.md 第 1 节现表述:
不保存原始控件树和设备截图;只保存结构化任务日志、错误码、任务规则快照和采集结果。
修订为:
不保存原始控件树和整屏设备截图;允许保存按规格值节点边界裁剪的商品图片区域,且裁剪结果不得包含账号、地址、订单、支付及其他个人数据。除此之外只保存结构化任务日志、错误码、任务规则快照和采集结果。
同步更新 Wiki Business-Rules-and-Glossary 的安全边界描述,并在本工单记录用户于 2026-08-28 的确认。
Business-Rules-and-Glossary
AccessibilityService.takeScreenshot()
ImageView
bounds
Bitmap.createBitmap(shot, left, top, width, height)
uploadfile
COLOR_DISCOVERY
cd android && .\gradlew.bat :app:testDebugUnitTest :app:assembleDebug
go test ./app/goauto/...
takeScreenshot()
docs/03-business-rules-and-glossary.md
Architecture-and-Code-Map
docs/02-architecture-and-code-map.md
Android-Agent-API-Contract
docs/08-agent-api-contract.md
sync
sync --check
实现已推送 / 待 PKG110 真机验证(前置 #124 已验收;规则修订与 #133 v1 已获用户确认;追加数据库迁移已按授权实现;提交 6f611a0)。
6f611a0
已核对 #133 正文、#124 前置验收、当前 PDD 商品详情抽屉、服务端上传能力及 Android 颜色发现入口。
v1 标注稿:https://git.ilapage.cn/attachments/2f1c20e2-5234-47a7-b7ea-bbef424a9bfc
覆盖范围:
设计取舍遵循现有 Element Plus 抽屉/表格规范,固定尺寸避免加载跳动,预览不新增独立页面。
当前代码需要新增“PDD 商品 + 颜色值 → 图片路径”的持久记录和唯一约束,因此 #133 确实包含追加数据库迁移。按仓库高风险门禁,尚未收到“授权 #133 按工单方案实施数据库迁移”的明确授权,生产实现暂停在此门禁。
工具说明:Gitea MCP 支持工单更新但不支持上传工单附件,因此仅附件上传回退到 Gitea API;凭据来自本机忽略文件且未输出。当前会话未提供 codebase-memory 图工具,代码发现按规则回退到 rg。
rg
用户于 2026-08-28 明确确认 #133 v1,并授权 #133 按工单方案实施追加数据库迁移。现按已确认范围进入实施:Android 仅内存整屏截图并按颜色卡片内图片节点边界裁剪、结果提交后独立上传;服务端校验并维护“PDD 商品 + 颜色值”最新图片;Admin 复用已确认的 64×64 缩略图/占位/预览设计。图片失败保持可选,不改变采集结果、missing 或任务状态。
提交:6f611a0 feat(goauto): collect cropped color images (#133),已推送 main。
6f611a0 feat(goauto): collect cropped color images (#133)
main
takeScreenshot
POST /api/agent/v1/tasks/{taskId}/color-images
1787885500000
pdd_product_color_image
COLOR_IMAGE
.\scripts\verify.ps1 -Component all
go test ./app/goauto/task ./app/goauto/product ./app/goauto/migrations ./cmd/migrate/migration/version-local
.\gradlew.bat :app:testDebugUnitTest :app:assembleDebug
python dev_scripts/harness.py check --strict
git diff --check
已先更新线上并回读:
Business-Rules-and-Glossary@79bb0b8452c95ca34d3193f0178199614c997edd
Architecture-and-Code-Map@07e1ba0c8ee38e7758cf142a272af95fdd046523
Android-Agent-API-Contract@95b3e58fc27b2332dde630ffa0d1dab7fc905f80
随后执行唯一一轮 harness.py sync 与唯一一轮 sync --check,一致性通过。
harness.py sync
adb devices -l
工单保持打开,不进入待验收。设备重新连接后从“安装 0.9.18 → 应用迁移/启动新服务 → 同商品采集 → Admin 抽查至少一张裁剪图”继续。
2026-08-29 经用户授权执行本机数据库迁移并重启 Admin 时,迁移器同时执行并记录了 #133 的 1787885500000_pdd_color_image。服务端颜色图片表结构已在本机数据库落地,Server/Web 均已正常启动。
1787885500000_pdd_color_image
本次只改变 #133 的“本机迁移尚未执行”事实,不代表 #133 已验收:Agent 0.9.18 尚未安装到 PKG110,仍未完成同商品真机采集、颜色图片对应关系及裁剪不含地址/手机号的人工抽查。
main@f84ea5d
:app:assembleDebug
adb install -r
cn.ilapage.goauto.agent
versionName=0.9.18
versionCode=31
MainActivity
用户在 PKG110 安装 Agent 0.9.18(versionCode 31)后执行了任务 #98。只读核验结果:
0.9.18
COLOR_IMAGE_CAPTURED
COLOR_IMAGE_UPLOAD_FAILED
COLOR_IMAGE_LOCATE_FAILED
因此问题发生在颜色图片节点定位阶段;截图、压缩和上传均未执行,Admin 没有可展示的 colorImages。这不是 Admin 缩略图渲染失败。
colorImages
#98 通过当前页面分享链接识别并提交的商品是:
807914415439
8477
用户人工查看的是 808062345927,它对应旧任务 #97、商品记录 8476。两个商品不能混用审核;即使 #98 上传成功,图片也应显示在 807914415439 的详情中。
808062345927
8476
修复后的真机验收必须同时记录“PDD 当前页 → 分享链接识别 goods_id → 服务端任务 goods_id → Admin 打开的 goods_id”四者一致,避免把商品身份偏差误判为图片展示问题。
PddScreenParser.parse() 在生成规范化可见节点时执行:
PddScreenParser.parse()
node.copy( text = resolved, contentDescription = null, ... )
随后把该规范化节点传给 colorImageBounds(option, visibleNodes)。而 colorImageBounds 的第一步必须从 option.contentDescription 取得期望值:
colorImageBounds(option, visibleNodes)
colorImageBounds
option.contentDescription
val expected = option.contentDescription ?.replace(Regex("\\s+"), "") ?.takeIf(String::isNotEmpty) ?: return null
因此通过完整 parse() 路径进入时,颜色选项的 contentDescription 已经被清空,colorImageBounds 必然返回 null,导致所有颜色系统性记录 COLOR_IMAGE_LOCATE_FAILED。
parse()
contentDescription
null
现有单测只直接调用 colorImageBounds() 并传入未清空的人工节点,绕过了完整 parse() 调用链,所以未发现该缺陷。
colorImageBounds()
SnapshotNode
path
visibleNodes
VisibleSpecValue.imageBounds
提交:9b044ed fix(android): locate color images from raw cards (#133),已推送 main。
9b044ed fix(android): locate color images from raw cards (#133)
PddScreenParser
color
0.9.19
versionCode=32
新增完整 PddScreenParser.parse() 回归,而非只直接测试 colorImageBounds():
imageBounds
pwsh.exe -NoProfile -File scripts/verify.ps1 -Component android
adb install -r android/app/build/outputs/apk/debug/app-debug.apk
versionName=0.9.19
自动化尝试恢复 PDD 最近商品页并从 Agent 触发当前页面采集,但 Agent 的“近期见过 PDD 详情”安全门禁与页面栈状态未稳定满足,未创建新任务;数据库最新任务仍为 #98,不能把本次尝试宣称为图片采集通过。
请在 PKG110 上人工完成一次:
采集
开始采集
随后继续只读核验:任务 goods_id、图片表记录、图片数量/尺寸、无 COLOR_IMAGE_UPLOAD_FAILED,并在 Admin 对应 goods_id 详情人工预览裁剪内容与隐私边界。工单保持打开,尚不进入待验收。
failed
PDD_COPY_LINK_UNAVAILABLE
PAGE_STABILITY/STABLE
SHARE_CLICK/CLICK_SUCCESS
SHARE_PANEL/PANEL_FOUND
分享面板出现后,原实现只做一次:
从快照选择“复制链接” → fresh 重定位 → 点击
PDD 分享面板在首次渲染后会瞬时重排/重建节点,快照中的复制链接节点可在 fresh 点击前失效;原代码把一次 NOT_FOUND/ACTION_CLICK_FALSE 直接转换成失败。分享按钮已有同类有限重试,但复制链接没有。
NOT_FOUND
ACTION_CLICK_FALSE
提交:b453634 fix(android): retry copy-link click after share rerender (#133),已推送 main。
b453634 fix(android): retry copy-link click after share rerender (#133)
分享 → 复制链接 → 复制链接
0.9.20
versionCode=33
请重新在已知多颜色商品详情页触发一次当前页面采集;新任务成功后继续核验 #133 颜色图片记录和裁剪隐私边界。
用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。
No dependencies set.
The note is not visible to the blocked user.
所属与来源
AGENTS.md中「不保存设备截图」这条永久规则。AGENTS.md「Gitea 交互与工单最小读取」记录回退原因。当前事实
服务端解析原图不可行(已实测)
2026-08-28 以移动端 UA 请求
https://mobile.yangkeduo.com/goods.html?goods_id=971612375909:返回 200、约 64KB,正文中不含任何thumb_url等图片地址,商品数据由 JS 异步加载,且页面含anti/VERIFY等反爬标识。此前短链解析可行是因为那只是 307 跳转,不涉及取数据。因此「颜色 ↔ 图片」的对应关系只能在设备端、面板已渲染时取得。控件树证据(用户提供的规格面板 dump)
每个颜色是一个卡片,结构如下(紫色为例):
浅粉卡片同构,图片节点为
[382,1188][698,1504],且在selected="false"时同样可用。由此确认:
content-desc相同,全局查找必然多命中;本工单虽不使用该入口,但同一约束适用于图片节点定位——必须在颜色卡片子树内查找。个人数据风险(必须处理)
同一棵树中,规格面板上方存在收货人手机尾号与详细地址文本节点(
[132,456][993,505]等)。整屏截图会把这些一并保存,因此只允许保存裁剪后的图片区域,这是本工单的硬约束,也是规则修订必须写清的边界。目标
非目标
missing,也不得影响completed/completed_partial判定)。实施方案
一、规则修订(前置,用户已确认)
AGENTS.md第 1 节现表述:修订为:
同步更新 Wiki
Business-Rules-and-Glossary的安全边界描述,并在本工单记录用户于 2026-08-28 的确认。二、Agent 端
AccessibilityService.takeScreenshot()(API 30+)取整屏 Bitmap;设备低于该版本时跳过图片采集,不报错。content-desc的ImageView。禁止全局查找——同名节点必然多命中。bounds裁剪:Bitmap.createBitmap(shot, left, top, width, height);整屏 Bitmap 用后立即回收,不得落盘。三、上传
四、服务端与 Admin
uploadfile静态文件能力,不引入新的对象存储依赖。五、诊断
COLOR_DISCOVERY或新增独立阶段,记录:尝试张数、成功张数、失败原因分类(不支持、定位失败、裁剪失败、压缩失败、上传失败)。诊断不记录图片内容、颜色文案与坐标原文。安全边界
验收标准
AGENTS.md与 Wiki 的规则表述已按第一节修订,并记录用户确认。missing。验证方式
cd android && .\gradlew.bat :app:testDebugUnitTest :app:assembleDebuggo test ./app/goauto/...依赖、并行与风险
takeScreenshot()在部分 ROM 上可能受限或返回失败。缓解:失败即跳过,不影响采集;诊断可区分。文档影响
AGENTS.md:按第一节修订永久规则(仓库规则文件,直接修改提交)。Business-Rules-and-Glossary(docs/03-business-rules-and-glossary.md):安全边界中关于截图的表述。Architecture-and-Code-Map(docs/02-architecture-and-code-map.md):图片采集、上传与存储路径。Android-Agent-API-Contract(docs/08-agent-api-contract.md):新增图片上传接口。sync与一轮sync --check,把页面与 revision 写回本工单。状态
实现已推送 / 待 PKG110 真机验证(前置 #124 已验收;规则修订与 #133 v1 已获用户确认;追加数据库迁移已按授权实现;提交
6f611a0)。开始执行:设计与高风险门禁
已核对 #133 正文、#124 前置验收、当前 PDD 商品详情抽屉、服务端上传能力及 Android 颜色发现入口。
v1 标注稿:https://git.ilapage.cn/attachments/2f1c20e2-5234-47a7-b7ea-bbef424a9bfc
覆盖范围:
设计取舍遵循现有 Element Plus 抽屉/表格规范,固定尺寸避免加载跳动,预览不新增独立页面。
当前代码需要新增“PDD 商品 + 颜色值 → 图片路径”的持久记录和唯一约束,因此 #133 确实包含追加数据库迁移。按仓库高风险门禁,尚未收到“授权 #133 按工单方案实施数据库迁移”的明确授权,生产实现暂停在此门禁。
工具说明:Gitea MCP 支持工单更新但不支持上传工单附件,因此仅附件上传回退到 Gitea API;凭据来自本机忽略文件且未输出。当前会话未提供 codebase-memory 图工具,代码发现按规则回退到
rg。门禁解除,进入实施
用户于 2026-08-28 明确确认 #133 v1,并授权 #133 按工单方案实施追加数据库迁移。现按已确认范围进入实施:Android 仅内存整屏截图并按颜色卡片内图片节点边界裁剪、结果提交后独立上传;服务端校验并维护“PDD 商品 + 颜色值”最新图片;Admin 复用已确认的 64×64 缩略图/占位/预览设计。图片失败保持可选,不改变采集结果、
missing或任务状态。实现已推送,待 PKG110 真机验证
提交:
6f611a0 feat(goauto): collect cropped color images (#133),已推送main。已实现
content-desc的ImageView;API 30+ 使用takeScreenshot,整屏位图仅驻留内存,按节点边界裁剪后压缩 JPEG 85 并立即回收。missing、规格、价格或 SKU。POST /api/agent/v1/tasks/{taskId}/color-images。服务端校验 Device Token、任务归属、终态、精确颜色、JPEG 实际内容、宽高与数量;非图片和超限分别拒绝。1787885500000和pdd_product_color_image,以“PDD 商品 + 颜色”唯一保存最新图片,并关联来源 task/device;替换成功后只清理受控目录中的旧文件。COLOR_IMAGE诊断可区分不支持、定位、裁剪、压缩、上传失败,不保存颜色文案、坐标或图片内容。自动化验证
.\scripts\verify.ps1 -Component all:通过(Server 全量测试/构建、Web lint/生产构建、Android Debug/Release 单测及 Debug APK 构建);Web 为既有 30 warnings、0 errors。go test ./app/goauto/task ./app/goauto/product ./app/goauto/migrations ./cmd/migrate/migration/version-local通过。.\gradlew.bat :app:testDebugUnitTest :app:assembleDebug通过。python dev_scripts/harness.py check --strict与git diff --check通过。Wiki-first
已先更新线上并回读:
Business-Rules-and-Glossary@79bb0b8452c95ca34d3193f0178199614c997eddArchitecture-and-Code-Map@07e1ba0c8ee38e7758cf142a272af95fdd046523Android-Agent-API-Contract@95b3e58fc27b2332dde630ffa0d1dab7fc905f80随后执行唯一一轮
harness.py sync与唯一一轮sync --check,一致性通过。尚未验证 / 未执行
adb devices -l无设备,故未安装 0.9.18 到 PKG110,也未完成同商品真机采集、每颜色对应关系、裁剪不含地址/手机号及 Admin 实际图片抽查;这些结论不作通过声明。missing或任务失败。工单保持打开,不进入待验收。设备重新连接后从“安装 0.9.18 → 应用迁移/启动新服务 → 同商品采集 → Admin 抽查至少一张裁剪图”继续。
部署状态更新(由 #140/#141 Admin 重启触发)
2026-08-29 经用户授权执行本机数据库迁移并重启 Admin 时,迁移器同时执行并记录了 #133 的
1787885500000_pdd_color_image。服务端颜色图片表结构已在本机数据库落地,Server/Web 均已正常启动。本次只改变 #133 的“本机迁移尚未执行”事实,不代表 #133 已验收:Agent 0.9.18 尚未安装到 PKG110,仍未完成同商品真机采集、颜色图片对应关系及裁剪不含地址/手机号的人工抽查。
PKG110 安装状态更新
main@f84ea5d执行:app:assembleDebug,构建成功。adb install -r覆盖安装到已连接设备 PKG110(序列号仅在本机验证,不写入工单)。cn.ilapage.goauto.agent,versionName=0.9.18,versionCode=31。MainActivity启动命令成功;应用数据未清除。真机缺陷分析与修复方案(任务 #98)
现场事实
用户在 PKG110 安装 Agent
0.9.18(versionCode 31)后执行了任务 #98。只读核验结果:0.9.18;completed;pdd_product_color_image中 #98 图片记录:0;COLOR_IMAGE_CAPTURED,也没有COLOR_IMAGE_UPLOAD_FAILED;COLOR_IMAGE_LOCATE_FAILED,对应四个已发现颜色。因此问题发生在颜色图片节点定位阶段;截图、压缩和上传均未执行,Admin 没有可展示的
colorImages。这不是 Admin 缩略图渲染失败。商品身份偏差
#98 通过当前页面分享链接识别并提交的商品是:
8079144154398477用户人工查看的是
808062345927,它对应旧任务 #97、商品记录8476。两个商品不能混用审核;即使 #98 上传成功,图片也应显示在807914415439的详情中。修复后的真机验收必须同时记录“PDD 当前页 → 分享链接识别 goods_id → 服务端任务 goods_id → Admin 打开的 goods_id”四者一致,避免把商品身份偏差误判为图片展示问题。
代码根因
PddScreenParser.parse()在生成规范化可见节点时执行:随后把该规范化节点传给
colorImageBounds(option, visibleNodes)。而colorImageBounds的第一步必须从option.contentDescription取得期望值:因此通过完整
parse()路径进入时,颜色选项的contentDescription已经被清空,colorImageBounds必然返回null,导致所有颜色系统性记录COLOR_IMAGE_LOCATE_FAILED。现有单测只直接调用
colorImageBounds()并传入未清空的人工节点,绕过了完整parse()调用链,所以未发现该缺陷。修复方案
content-desc的ImageView,禁止全局匹配、OCR/VLM、截图落盘或扩大裁剪区域。SnapshotNode属性;可按节点path回查visibleNodes,或在规范化时单独保留原始contentDescription,不得依赖已清空的副本。ImageView结尾;contentDescription与颜色卡片原始值完全一致;PddScreenParser.parse(),断言:VisibleSpecValue.imageBounds为卡片内目标图片;contentDescription时安全返回空”的测试。COLOR_IMAGE_CAPTURED;COLOR_IMAGE_UPLOAD_FAILED;范围与门禁结论
真机定位缺陷修复已推送,待最后一次人工触发采集验收
提交:
9b044ed fix(android): locate color images from raw cards (#133),已推送main。修复
PddScreenParser继续保留规范化 caption/TextView 作为规格点击目标,不改变 #124 的颜色点击安全排序。contentDescription的规范化副本:按规格节点path回查原始SnapshotNode,沿父链寻找原始颜色卡片;只在卡片原始contentDescription与颜色标签完全一致时,在该卡片子树内匹配同contentDescription的ImageView。color维度执行;尺码不产生图片边界。0.9.19/versionCode=32。回归测试
新增完整
PddScreenParser.parse()回归,而非只直接测试colorImageBounds():imageBounds来自同卡片内目标图片;contentDescription时安全返回空,不猜测。自动化与安装验证
pwsh.exe -NoProfile -File scripts/verify.ps1 -Component android:通过。adb install -r android/app/build/outputs/apk/debug/app-debug.apk:成功覆盖安装到 PKG110。cn.ilapage.goauto.agent,versionName=0.9.19,versionCode=32;MainActivity启动成功,应用数据未清除。尚未完成的真机验收
自动化尝试恢复 PDD 最近商品页并从 Agent 触发当前页面采集,但 Agent 的“近期见过 PDD 详情”安全门禁与页面栈状态未稳定满足,未创建新任务;数据库最新任务仍为 #98,不能把本次尝试宣称为图片采集通过。
请在 PKG110 上人工完成一次:
808062345927);采集→开始采集;随后继续只读核验:任务 goods_id、图片表记录、图片数量/尺寸、无
COLOR_IMAGE_UPLOAD_FAILED,并在 Admin 对应 goods_id 详情人工预览裁剪内容与隐私边界。工单保持打开,尚不进入待验收。任务 #99 阻塞修复:分享面板重渲染导致复制链接瞬时点击失败
现场事实
failed;Agent0.9.19;错误码PDD_COPY_LINK_UNAVAILABLE;错误“复制商品链接失败”。PAGE_STABILITY/STABLE、SHARE_CLICK/CLICK_SUCCESS、SHARE_PANEL/PANEL_FOUND,说明商品页、分享按钮和分享面板均已成功;失败发生在面板已出现后对“复制链接”的 fresh 重定位/点击。根因与修复
分享面板出现后,原实现只做一次:
PDD 分享面板在首次渲染后会瞬时重排/重建节点,快照中的复制链接节点可在 fresh 点击前失效;原代码把一次
NOT_FOUND/ACTION_CLICK_FALSE直接转换成失败。分享按钮已有同类有限重试,但复制链接没有。提交:
b453634 fix(android): retry copy-link click after share rerender (#133),已推送main。NOT_FOUND/点击失败,不放宽文本、class、位置和可点击祖先规则;回归与安装
NOT_FOUND,第二次重抓面板并点击成功;断言点击序列为分享 → 复制链接 → 复制链接且身份识别成功。pwsh.exe -NoProfile -File scripts/verify.ps1 -Component android:通过;Debug/Release 单测与 Debug APK 构建成功。0.9.20/versionCode=33。adb install -r覆盖安装到 PKG110,MainActivity启动成功,应用数据未清除。请重新在已知多颜色商品详情页触发一次当前页面采集;新任务成功后继续核验 #133 颜色图片记录和裁剪隐私边界。
用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。