Files
gyxx-flow/docs/workflow-acceptance-test-requirements.md
T

131 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 项用户排除。主图项是由拓扑合并产生的明确复测要求,不沿用旧的模糊“待浏览器复测”表述。