131 lines
19 KiB
Markdown
131 lines
19 KiB
Markdown
# GYXX Flow 全工作流验收测试需求
|
||
|
||
测试日期:2026-08-03
|
||
测试时区:Asia/Shanghai
|
||
测试顺序:供应链 → 店铺 → 商品 → 内容
|
||
|
||
## 1. 验收目标与范围
|
||
|
||
当前架构的验收分母是 21 个定时工作流并全部启用,按模块分为内容 8、商品 7、店铺 3、供应链 3。原先独立调度的 `product.main_image.jd.weekly` 已与原单平台 `product.main_image.weekly` 合并为一个两节点工作流;合并前两个 dated `run_id` 只作为子链历史证据,不得冒充新图实跑。原目录中的另外 7 个可执行项现归类为手动命令/历史验收场景,不进入当前分母;`content.self_operated.weekly` 和 `product.weekly_aggregate.documented_missing` 继续仅保留历史证据。
|
||
|
||
验收覆盖工作流注册、LangGraph 编排、业务日期、浏览器状态、数据采集、云端 PostgreSQL、文件落盘、Hermes、飞书隔离和副作用账本。真实外部链路只在安全门禁允许时执行;失败、超时、权限阻塞和安全跳过必须如实保留,不能用 dry-run 冒充业务通过。
|
||
|
||
## 2. 强制隔离与数据标准
|
||
|
||
1. PostgreSQL 只允许使用运行时注入的云端 DSN;回环数据库立即失败,源码、报告和示例文件不得保存真实凭据。
|
||
2. 开始供应链工作流前,先验证云端目标库的连接、schema、读写权限和事务回滚能力;测试数据必须使用唯一 run_id,避免覆盖既有业务记录。
|
||
3. 飞书 Base、Bitable、Sheets 的新增、更新、删除全部物理跳过并留证;飞书读取可以执行。
|
||
4. 通知收件人只允许王云龙;不得向原业务群、原收件人或其他用户发送。通用 `production_sink` 只能证明进入副作用边界,不能据此推断消息正文或投递回执。
|
||
5. 每个浏览器入口保留独立 CDP、Profile、Cookie 和 storage state。登录策略固定为“本项目状态 → 已复制的来源状态 → 受支持的账号密码回退 → 安全跳过”;不弹出二维码、不人工通过验证码。
|
||
6. 本机 Hermes 分析端和采集端只通过回环地址访问,不得回退到远程 AI。
|
||
7. JSON、Markdown、CSV、Excel、图片、日志和 journal 必须按模块、工作流、业务日期落入 `GYXX_DATA_ROOT`;来源目录只读且不得成为运行时依赖。
|
||
8. 凭据只允许运行时注入。历史遗留 `db.env`、`analyze.env` 必须删除,仓库和验收报告不得记录账号、密码、Cookie、token 或密钥。
|
||
|
||
## 3. 状态与打勾规则
|
||
|
||
| 状态 | 含义 | 打勾 |
|
||
|---|---|---|
|
||
| `PASS` | 原逻辑、采集、处理和本轮允许的本地写入成功;允许出现业务空结果 | 是 |
|
||
| `PASS_WITH_SKIPS` | 已验证的主链路成功,本轮禁止或无需执行的外部副作用被明确跳过 | 是 |
|
||
| `SKIPPED_COOKIE` | 状态复用和受支持的非交互登录均不能建立有效登录态,且按规则安全退出 | 是,但不代表生产采集通过 |
|
||
| `NOT_EXECUTABLE` | 确认没有脚本、注册项或调度入口;仅用于已废弃历史证据 | 是,但不计当前工作流分母 |
|
||
| `PENDING_RETEST_AFTER_MERGE` | 合并后的工作流结构、调度和失败传播已完成工程验证,但新拓扑尚无受控业务实跑证据 | 否 |
|
||
| `FAIL_AUTH_OR_UI` | 登录、授权、配置或目标页面控件不满足,业务链路未完成 | 否 |
|
||
| `PARTIAL_FAILED` | 部分子链路已有有效结果,但至少一个必要子链路明确失败 | 否 |
|
||
| `PARTIAL_TIMEOUT` | 部分子链路已有有效结果,但整体在有界等待内未收敛 | 否 |
|
||
| `BLOCKED_EXTERNAL_PERMISSION` | 登录成功后,外部系统明确拒绝目标菜单或资源权限 | 否 |
|
||
| `EXCLUDED_BY_REQUEST` | 用户明确排除,本轮没有执行;仅用于手动命令历史场景 | 否,不计当前工作流分母 |
|
||
|
||
打勾表示“本轮验收计划已得到规则允许的确定结论”,不等同于生产链路全部无条件成功。当前 21 个定时工作流中,业务通过仅包括 `PASS` 和 `PASS_WITH_SKIPS`;`PENDING_RETEST_AFTER_MERGE` 不计业务通过或规则完成。`SKIPPED_COOKIE` 和 `NOT_EXECUTABLE` 在本文仍可用于历史证据,但当前结果表没有这两类状态。
|
||
|
||
## 4. 执行计划与验收方法
|
||
|
||
1. 冻结来源与验收范围:核对工作流清单、调度、入口、业务日期和源文件基线,来源目录保持只读。
|
||
2. 建立数据基线:确认云端目标库、schema、表数量和读权限,并使用可回滚事务验证写权限。
|
||
3. 建立安全门禁:统一云端 PG、本地 Hermes、唯一浏览器绑定、Cookie 复用、飞书写隔离、收件人白名单和 effect ledger。
|
||
4. 按“供应链 → 店铺 → 商品 → 内容”逐项执行;为每项保存 `run_id`、节点结果、退出码、产物、数据库变化和副作用证据。
|
||
5. 对超时任务执行有界观察;已经成功的独立下游只作为局部证据,不把部分成功升级为整体通过。
|
||
6. 汇总分类时分别核对“21 个定时工作流”“7 个手动命令场景”“2 个已删除/废弃历史证据”和“2 条合并前主图子链实跑证据”;最后一类只作非加总追溯,不进入任何当前状态分母。
|
||
|
||
## 5. 供应链工作流
|
||
|
||
- [x] `supply.purchase_confirmation.daily`:采购确认采集、分析和通知。`PASS`;run_id `supply.purchase_confirmation.daily__20260729__20260801T092309Z__5daace`,ERP 采集、原始 Excel、汇总 CSV 和本地 PG `workflow_runs=completed` 均成功。journal 仅记录通用 `production_sink`,不扩展解释其消息内容或回执。
|
||
- [ ] `supply.replenishment.weekly`:按销量、库存和在途生成补货建议。`BLOCKED_EXTERNAL_PERMISSION`;run_id `supply.replenishment.weekly__20260728__20260801T094413Z__743f4a`,账号登录成功后 ERP 明确拒绝“普通商品资料”权限,exit 1,阻断前外部写入为空。
|
||
- [ ] `supply.replenishment_alert.daily`:指定 SKU 库存阈值预警。`BLOCKED_EXTERNAL_PERMISSION`;主要 run_id `supply.replenishment_alert.daily__20260727__20260801T094546Z__500e91`,复现 run_id `supply.replenishment_alert.daily__20260728__20260801T094100Z__4b2da2`;均在登录后被同一菜单权限阻断,外部写入为空。
|
||
|
||
## 6. 店铺工作流
|
||
|
||
- [x] `shop.metrics.weekly`:并行采集京东、抖音、天猫店铺经营指标。`PASS`;run_id `shop.metrics.weekly__20260804__20260804T065204Z__bb3b69`,京东、抖音、天猫 3/3 节点成功,产物落盘并写入云端 PostgreSQL;京东和抖音按原逻辑真实更新飞书 Base,天猫按原逻辑不写店铺表。抖音销售额采用确认后的净销售额 `294,892.98`,毛销售额保留在原始产物和 PostgreSQL。
|
||
- [x] `shop.competitor.weekly`:并行采集京东、抖音竞店指标;当前没有天猫竞店采集任务。`PASS`;run_id `shop.competitor.weekly__20260804__20260804T075530Z__4fd7c1`,京东和抖音 2/2 节点成功,分别 upsert 49/24 行;飞书 Base 分别更新 7/9 条品牌记录,无法排名的类目只在页面明确显示“暂无数据”时记为未上榜。
|
||
- [x] `shop.jd_self_operated.daily`:按前一业务日依次采集京东自营品牌和商品。`PASS`;run_id `shop.jd_self_operated.daily__20260801__20260804T082226Z__255cfc`,品牌和商品 2/2 节点成功,分别采集 1/50 行,收入合计均为 `19,974.27`。Cookie 复用时从京东 `pin` 识别账号 `gyxx2022`,云端 PostgreSQL 按 `account + data_date + brand/product_code` UPSERT;同日真实重跑 `shop.jd_self_operated.daily__20260801__20260804T082722Z__0ced7e` 再次 2/2 成功且产物仍为 1/50 行,CDP 22132/22133 均已关闭。
|
||
|
||
## 7. 商品工作流
|
||
|
||
- [ ] `product.persona.daily`:并行采集天猫、抖音、京东商品人群画像。`PARTIAL_FAILED`;run_id `product.persona.daily__20260815__20260801T103908Z__2d6028`。天猫缺少 DMP 入口,抖音缺少搜索控件,京东完成 19/30 后浏览器崩溃,部分结果不能代表三平台完成。
|
||
- [ ] `product.daily`:ERP 与三平台采集、分析、导出和入库。`PARTIAL_TIMEOUT`;run_id `product.daily__20260731__20260801T113513Z__b59304`。ERP、京东、天猫完成,抖音超时;保留 257 个 raw 文件。独立下游验证完成分析、32 条导出、本地 PG upsert 和 32 次飞书写跳过,但不把下游成功升级为整体通过。
|
||
- [x] `product.alert.daily`:读取商品数据并检测销量异常、按条件通知。`PASS`;实际入口 run_id `script.product_commerce.955b1dfb0cdf__20260801__20260801T085614Z__4fefb3`。本地库读取成功,当次无符合阈值的异常,因此没有告警新增或通知。
|
||
- [x] `product.import.daily`:把三平台商品日报幂等导入本地 PG。`PASS`;实际入口 run_id `script.product_commerce.9137239938d5__20260727__20260801T085541Z__59c16c`。抖音、京东、天猫分别处理 163、90、173 行,无重复。
|
||
- [x] `product.style_analysis.interval`:使用本地 Hermes 分析到期款式。`PASS_WITH_SKIPS`;workflow run_id `product.style_analysis.interval__20260801__20260801T084137Z__952204`。数据库表/权限与 Hermes 健康检查通过,单款实现入口内部 dry-run 成功,未写外部副作用目标。
|
||
- [ ] `product.main_image.weekly`:周日 08:30 并行启动 JD、Tmall 两个无依赖且资源隔离的主图分支,两个子链均独立执行本地 PG 入库与飞书插入逻辑。`PENDING_RETEST_AFTER_MERGE`;当前没有可归属于合并后新图的业务 run_id。工程结构要求为:任一分支受控失败时,另一分支仍完成自己的采集和双 sink 写入;全部结束后整体聚合为失败,并在错误摘要中标明具体平台和错误。下一轮需在现有飞书零写门禁下完成受控业务复测。
|
||
- [ ] `product.market_rank`:并行采集天猫、京东、抖音三平台周市场排行。`FAIL_AUTH_OR_UI`;run_id `product.market_rank__20260814__20260801T103628Z__5a9024`。天猫认证失败、京东缺配置类目、抖音目标控件缺失;目标脚本与来源哈希一致,当前证据不支持判定为迁移改坏。
|
||
|
||
## 8. 内容工作流
|
||
|
||
- [ ] `content.metrics.daily`:采集合作达人、自营 B 站、蝉妈妈数据并同步指标。`PARTIAL_FAILED`;run_id `content.metrics.daily__20260813__20260801T101312Z__28d505`,运行 71 分 05 秒后完整度检查失败;已完成子链和飞书写跳过证据保留,但必要采集链未全部完成。
|
||
- [x] `content.marketing_report.daily`:从本地数据生成营销日报并按条件通知。`PASS_WITH_SKIPS`;实际入口 run_id `script.content_marketing.62b3b647254f__20260804__20260801T091245Z__f20319`。真实读取本地 PG、调用本地 Hermes,生成 Markdown/PNG;未启用发送参数。
|
||
- [x] `content.relogin.weekly`:并行刷新内容平台登录态。`PASS_WITH_SKIPS`;run_id `content.relogin.weekly__20260811__20260801T100706Z__45a8db`。LangGraph 和验收门禁按设计阻止二维码/交互登录并安全记录跳过;没有扫码、没有覆盖 Cookie 或来源状态。
|
||
- [x] `content.creator_report.monthly`:生成达人月报。`PASS_WITH_SKIPS`;workflow run_id `content.creator_report.monthly__20260801__20260801T084140Z__bd9fdd`。本地数据库检查和实现入口 dry-run 成功,飞书表写入关闭。
|
||
- [x] `content.summary.monthly`:生成内容月度汇总。`PASS_WITH_SKIPS`;workflow run_id `content.summary.monthly__20260801__20260801T084142Z__9d73c1`。本地数据库检查和实现入口 dry-run 成功,外部写入关闭。
|
||
- [x] `content.cooperations.daily`:刷新映射并同步合作记录。`PASS_WITH_SKIPS`;workflow run_id `content.cooperations.daily__20260801__20260801T084143Z__02b89a`。真实完成飞书读取和本地数据库读取,内部 dry-run 阻止数据库/飞书写入。
|
||
- [ ] `content.comments.weekly`:并行补采 B 站、小红书、抖音评论并汇总。`PARTIAL_TIMEOUT`;run_id `content.comments.weekly__20260812__20260801T100904Z__530989`,运行 60 分 56 秒。B 站完成,小红书/抖音有界停止;保留 229 个 CSV、229 个 JSON,合计约 5.45 MB。
|
||
- [x] `content.summary.weekly`:生成内容周度汇总。`PASS_WITH_SKIPS`;workflow run_id `content.summary.weekly__20260801__20260801T084145Z__7e6081`。本地数据库检查和实现入口 dry-run 成功,外部写入关闭。
|
||
|
||
## 9. 手动命令与历史验收场景
|
||
|
||
下列 7 项保留手动执行能力和既有验收证据,但不再注册为定时工作流,也不进入 21 个工作流分母。
|
||
|
||
| 旧验收标识 | 合并后的入口与用途 | 历史状态、run_id 与关键证据 |
|
||
|---|---|---|
|
||
| `supply.purchase_order_update` | `supply.workflow.run`;受保护的 ERP 更新命令,默认参数自动选择 `mcp-run purchase-order-update` | `EXCLUDED_BY_REQUEST`;无 run_id,按要求未测试、未访问 ERP |
|
||
| `shop.jd_self_operated.history` | `shop.jd_self_operated.collect_brand`;`--date` 经 `{business_date}` 自动渲染起止日期 | `PASS`;`shop.jd_self_operated.history__20260728__20260801T103803Z__22f456`;约 43 秒,生成 533 B 品牌 JSON,本地库新增 1 条 |
|
||
| `product.backfill` | `product.backfill.run`;`--date` 经 `{business_date}` 自动渲染 `--from/--to` | `PARTIAL_TIMEOUT`;`product.backfill__20260730__20260801T112223Z__af7f00`;抖音第二轮等待未收敛,保留已完成平台证据 |
|
||
| `product.review_collection` | `product.review.orchestrate`;`--date` 经 `{business_date}` 自动渲染目标日期 | `PASS`(空结果);`product.review_collection__20260731__20260801T111838Z__e99652`;约 92 秒,JSON/Markdown 产物成功,当日数据库新增 0 条 |
|
||
| `content.mapping.refresh` | `content.mapping.rebuild`;读取内容/款式映射并生成本地 JSON | `PASS`;`content.mapping.refresh__20260818__20260801T112822Z__917ed7`;约 25 秒,35 张表、117,505 B 本地映射文件,飞书只读 |
|
||
| `content.retry_failed` | `content.failed.retry`;按失败清单重试采集并汇总 | `PARTIAL_TIMEOUT`;`content.retry_failed__20260820__20260801T113412Z__e0c8af`;20 分 56 秒,B 站 4/4、蒲公英 14/22、星图 0 |
|
||
| `content.metrics.backfill` | `gyxx backfill content.metrics.daily`;合并到标准日报图并按日期范围重跑 | `PARTIAL_TIMEOUT`;`content.metrics.backfill__20260821__20260801T115644Z__1cb626`;15 分 30 秒,采集有界停止、同步成功,133/133 条验收证据完整 |
|
||
|
||
手动场景历史分类为:`PASS` 3、`PARTIAL_TIMEOUT` 3、`EXCLUDED_BY_REQUEST` 1,合计 7。
|
||
|
||
## 10. 当前分母外的历史证据
|
||
|
||
### 已删除/废弃项
|
||
|
||
- `content.self_operated.weekly`:原禁用兼容工作流与 `content.metrics.daily` 的自营链重复,现已删除工作流和调度定义;底层自营脚本仍由日报工作流调用。历史结论为 `PASS_WITH_SKIPS`,run_id `content.self_operated.weekly__20260819__20260801T113119Z__b71197`,仅作追溯。
|
||
- `product.weekly_aggregate.documented_missing`:历史文档中的商品周聚合说明项。`NOT_EXECUTABLE`;无 run_id;已确认来源和目标均不存在脚本、注册项或调度入口。该项不进入当前工作流或手动命令分母。
|
||
|
||
### 合并前主图子链实跑证据
|
||
|
||
| 合并前工作流/版本 | 历史状态、run_id 与关键证据 |
|
||
|---|---|
|
||
| `product.main_image.jd.weekly` | `PASS`;`product.main_image.jd.weekly__20260812__20260801T102149Z__b2d3b7`;京东旧独立工作流生成 120 个文件、约 15.5 MB,本地 PG 记录 288,82 个飞书写动作由验收门禁跳过 |
|
||
| `product.main_image.weekly`(合并前单平台版本) | `SKIPPED_COOKIE`;`product.main_image.weekly__20260813__20260801T103413Z__b48e34`;天猫旧独立工作流无法建立有效非交互会话,exit 75 安全退出,未扫码、未覆盖来源状态 |
|
||
|
||
这两个 dated `run_id` 只能说明合并前京东、天猫子链各自的历史表现,不是合并后 JD、Tmall 并行两节点图的实跑结果,也不参与当前 21 项状态统计。
|
||
|
||
## 11. 合并口径与旧→新映射
|
||
|
||
- 当前 21 条有效调度定义对应 21 个顶层 LangGraph 工作流并全部启用,模块分布为内容 8、商品 7、店铺 3、供应链 3;重复且禁用的 `content.self_operated.weekly` 已删除,其主要采集链继续由 `content.metrics.daily` 执行。
|
||
- 原 `product.main_image.jd.weekly` 与原单平台 `product.main_image.weekly` 已收敛为当前 `product.main_image.weekly`:周日 08:30 并行启动 JD、Tmall 两个独立分支,两边均进入各自 PG 与飞书写入边界;受控失败不阻断另一边,末尾聚合失败状态和平台级具体错误。当前仅工程结构验证完成,业务状态保持 `PENDING_RETEST_AFTER_MERGE`。
|
||
- `shop.jd_self_operated.history`、`product.backfill`、`product.review_collection` 使用命令层 `default_args` 与 `{business_date}` 渲染日期;`supply.purchase_order_update` 使用固定默认子命令,调用者无需重复传日期范围或固定子命令。`content.metrics.backfill` 合并为标准日报工作流的 `gyxx backfill` 入口,其余内容项为显式维护/补偿命令。
|
||
- `content.self_operated.weekly` 和 `product.weekly_aggregate.documented_missing` 仅作为历史审计证据保存,不再出现在工作流注册、调度或当前数量统计中。
|
||
|
||
## 12. 最终验收标准与完成度
|
||
|
||
- 21/21 个定时工作流均有用途和状态;20 项保留既有 dated 业务证据,合并后的主图工作流尚无新图 run_id,明确列为待受控业务复测。当前调度全部启用。
|
||
- 当前工作流结果分类:`PASS` 4、`PASS_WITH_SKIPS` 9、`FAIL_AUTH_OR_UI` 1、`PARTIAL_FAILED` 2、`PARTIAL_TIMEOUT` 2、`BLOCKED_EXTERNAL_PERMISSION` 2、`PENDING_RETEST_AFTER_MERGE` 1,合计 21。
|
||
- 当前工作流业务通过和规则完成均为 13/21;未通过或待复测为 8/21。
|
||
- 7 个手动命令历史场景、2 个已删除/废弃历史证据和 2 条合并前主图子链实跑证据均单列保存,不进入当前工作流分母;主图历史证据是非加总 run 记录,不能机械增加目录项数量。
|
||
- 店铺复测中曾因一次命令漏设验收总开关误建 1 条京东周数据记录;已按精确 record id 删除并回读确认不存在,除此之外飞书业务表写入均由门禁跳过。通知策略唯一允许王云龙,但供应链通用 `production_sink` 没有独立消息正文或投递回执,不作过度结论。
|
||
- 云端快照迁移、旧库/dump 回滚、本地读写、Hermes、浏览器状态复制、来源只读、凭据清理和 secret scan 证据必须在最终报告中单列。
|
||
- 当前工作流未通过或待复测项保留真实边界:2 项外部 ERP 权限、1 项认证/UI、2 项部分失败、2 项部分超时、1 项合并后受控业务复测;手动命令另有 3 项部分超时、1 项用户排除。主图项是由拓扑合并产生的明确复测要求,不沿用旧的模糊“待浏览器复测”表述。
|