# GYXX Flow 全工作流验收测试报告 测试日期:2026-08-03 测试时区:Asia/Shanghai 测试顺序:供应链 → 店铺 → 商品 → 内容 ## 1. 最终结论 当前架构共有 21 个定时工作流并全部启用,模块分布为内容 8、商品 7、店铺 3、供应链 3。13 项达到 `PASS` 或 `PASS_WITH_SKIPS`,合并后的 `product.main_image.weekly` 已完成工程结构验证但尚无新两节点图的业务实跑,因此业务通过和规则完成均为 13/21,未通过或待复测为 8/21。7 个手动入口、2 个已删除/废弃项以及 2 条合并前主图子链实跑证据均单列,不进入当前工作流分母。 | 结果 | 数量 | 打勾 | 解释 | |---|---:|---|---| | `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 | 13 项业务通过且规则完成,8 项未通过或待复测 | 手动命令历史场景另计:`PASS` 3、`PARTIAL_TIMEOUT` 3、`EXCLUDED_BY_REQUEST` 1,共 7 项;`content.self_operated.weekly` 和 `product.weekly_aggregate.documented_missing` 仅作为已删除/废弃历史证据保存。合并前京东 `PASS` 和天猫 `SKIPPED_COOKIE` 的 dated run 只作子链历史追溯,不能计入上表。 ## 2. 云端数据库迁移与本地数据基线 云端 `8.148.185.119/data_hub` 已在 2026-08-01 16:31(Asia/Shanghai)完成一致性快照恢复到本地 `127.0.0.1:5432/gyxx_super_data`,本地所有者和运行角色均为 `gyxx_flow`。迁移凭据只在进程环境中临时注入,没有写入仓库、dump 元数据或报告。 - 云端 PostgreSQL 17.6,本地 PostgreSQL 17.10;源端和目标端均为 359 张业务表。 - 恢复后校验到 5,815 个可见列、606 个索引、433 个约束、337 个序列、7 个触发器、1 个业务函数,语义结构一致。 - 359 张表全部完成行数和双指纹校验:357 张与云端实时状态完全匹配;`qrtz_scheduler_state` 的调度心跳、`system_oauth2_access_token` 及其序列的新增属于一致性 dump 完成后的正常在线漂移,不是恢复丢失。 - 本机没有 PostGIS,迁移只排除了扩展自有表;359 张业务表均无 PostGIS 列,因此不影响业务数据完整性。 - 云端一致性 dump 保存在 `var/migrations/cloud_data_hub_to_gyxx_super_data_20260801T162327/cloud_data_hub.dump`;恢复前本地库 dump 保存在同目录的 `local_gyxx_super_data_before.dump`。 - 恢复前数据库仍保留为 `gyxx_super_data_before_20260801_162327`,已禁止新连接;旧库和两个 custom dump 共同构成可回滚点。 - 恢复使用单事务;临时 `pg_hba.conf` 规则已恢复。连接、schema usage/create 及“建表 → 插入 → 读取 → 更新 → 回滚”探针全部通过,探针未持久化。 - 会产生本地验收写入的实际工作流均在上述迁移和一致性校验完成后才执行;因此 357+2 的迁移结论没有被后续验收数据污染。 权威迁移证据为 `var/migrations/cloud_data_hub_to_gyxx_super_data_20260801T162327/migration-report.json`。 ## 3. 隔离、安全与运行环境结论 ### 飞书与通知 - 店铺复测中曾因一次命令漏设验收总开关误建 1 条京东周数据记录;随后通过飞书 Base 精确读取核对后只删除该 record id,并回读确认 `record_not_found`。除此之外飞书 Base/Bitable/Sheets 写动作均由验收门禁记录为 `feishu_write_skipped`,最终业务表未留下本轮测试记录。 - 通知策略只允许王云龙作为收件人,其他收件人和业务群在验收态被拒绝。 - 商品告警因无符合阈值的数据没有通知;营销日报未启用发送参数。采购确认 journal 仅记录通用 `step:collect_analyze_notify:production_sink`,没有独立消息正文或投递回执,因此不声称该通用副作用的具体内容或投递结果。 ### Hermes - 分析端 `127.0.0.1:8642`、采集端 `127.0.0.1:8643` 均保持本机回环绑定,项目没有回退到远程 AI。店铺指标采集的分析端请求因当前运行进程未注入 `GYXX_HERMES_API_KEY` 返回 401,AI 分析结果为空,但采集、文件与 PostgreSQL 主链路均成功。 - 营销日报已真实调用本地分析 Hermes 并生成 Markdown/PNG。 - 项目客户端全部使用回环地址;两个 Hermes 进程当前仍监听 `0.0.0.0`,服务器部署前应通过服务配置或防火墙收紧。这是部署风险,不改变本轮本地调用结论。 ### 浏览器、Cookie 与来源只读 - 136 个运行绑定保留各自唯一的 CDP/Profile/Cookie/storage-state/state-key 组合。 - 15/15 个已识别的来源状态映射已复制到本项目独立目录,共 5,037,233,753 B、31,213 个文件;运行配置不引用来源路径。 - 实跑先复用本项目/已复制状态,再使用脚本明确支持的账号密码回退;仍不可用才 exit 75。验收过程中未扫码、未人工过验证码、未覆盖来源 Cookie。 - 来源项目和来源浏览器状态保持只读,未被本轮命令写入;来源清单检查为 233/233 `in_sync`。 - JSON、Markdown、CSV、Excel、图片、日志和 journal 均落入本项目 `GYXX_DATA_ROOT` 分层目录;没有把来源目录当运行时依赖。 ### 凭据清理 - 历史遗留的实际 `db.env`、`analyze.env` 已删除;项目只保留无凭据示例和统一运行时环境变量入口。 - 全仓 secret scan 结果为 0;报告、验收事件和迁移清单均未记录账号、密码、Cookie、token 或密钥。 ## 4. 框架安全修复(6 项) 以下为框架层修复,与下一节业务逻辑对齐分开统计: 1. `CommandStep` 超时时完整终止进程树:Windows 使用 Job Object,POSIX 使用 process group,避免父进程退出后浏览器或子脚本继续产生副作用。 2. secret scanner 收紧动态引用、`getenv` fallback 和 lambda 边界;最终全仓扫描命中 0。 3. 商品配置路径优先级固定为 `GYXX_PRODUCT_CONFIG > AUTO_FLOW_CONFIG > AUTOFLOW_CONFIG_PATH > canonical`,避免旧兼容变量覆盖显式配置。 4. `NamedResourceLock` 增加原子发布、PID create-time/lease 校验和 OS reclaim guard,对陈旧锁采取保守恢复,避免误夺仍存活进程的锁。 5. acceptance evidence 增加跨线程/跨进程文件锁:Windows 使用 `msvcrt`、POSIX 使用 `flock`;`register_at_fork` 后重置状态,锁等待超时按 fail-closed 处理。 6. `_safe_details` 对 `Mapping`、`list`、`tuple` 递归脱敏并检测循环引用,避免嵌套验收细节泄露敏感值或因自引用崩溃。 ## 5. 业务逻辑与编排对齐 - 商品日报显式下传 `--target-date {business_date}`,08:40 定时任务使用前一业务日;评价采集同样显式下传目标日期。 - 内容评论恢复 B 站、小红书、抖音三平台并发、全部等待和最终聚合失败语义。 - 内容指标回补恢复“采集失败仍执行同步、最后返回聚合失败”的原逻辑。 - 商品主图收敛为 `product.main_image.weekly`:周日 08:30 并行启动 JD、Tmall 两个独立资源分支,两个子链均执行本地 PG 入库与飞书插入逻辑;任一受控节点失败都不阻断另一平台完成采集和写入,末尾聚合工作流失败状态和平台级具体错误。 - 蝉妈妈保留分页兜底、逐页异常处理及“获取数据 → 最长等待 10 分钟 → 重新进入导出”。 - 商品告警使用统一通知配置,验收态只允许王云龙。 - 供应链补货输出先写本轮目录再归档,停产 SKU 状态改为项目路径;批处理只消费本轮 Excel,空补货结果按合法业务结果处理。 - 供应链外层增加 Cookie/CDP 和 ERP 修改门禁,修复 PowerShell 在 Python 防护前启动浏览器的窗口。 - 21 个定时 `workflow_id` 均编译为 LangGraph `StateGraph`,模块分布为内容 8、商品 7、店铺 3、供应链 3;手动命令继续通过 `config/commands.json` 显式注册,不再混入定时工作流目录,也没有恢复递归脚本发现或 Windows 定时任务。 ## 6. 逐定时工作流最终结果 ### 供应链 | 完成 | 工作流 | 调度 | 用途 | 最终状态、run_id 与关键证据 | |---|---|---|---|---| | ✅ | `supply.purchase_confirmation.daily` | 每天 08:00 | 采购确认采集、分析和通知 | `PASS`;`supply.purchase_confirmation.daily__20260729__20260801T092309Z__5daace`;约 443 秒,ERP 原始 Excel、汇总 CSV、本地 PG 状态均成功。通用 `production_sink` 不作为消息内容/回执证明 | | ⬜ | `supply.replenishment.weekly` | 周一 08:00 | 计算并输出补货建议 | `BLOCKED_EXTERNAL_PERMISSION`;`supply.replenishment.weekly__20260728__20260801T094413Z__743f4a`;登录成功后 ERP 拒绝“普通商品资料”,exit 1、外部写入为空 | | ⬜ | `supply.replenishment_alert.daily` | 每天 07:00 | 指定 SKU 库存阈值预警 | `BLOCKED_EXTERNAL_PERMISSION`;`supply.replenishment_alert.daily__20260727__20260801T094546Z__500e91`,复现 `supply.replenishment_alert.daily__20260728__20260801T094100Z__4b2da2`;同一 ERP 权限阻断 | ### 店铺 | 完成 | 工作流 | 调度 | 用途 | 最终状态、run_id 与关键证据 | |---|---|---|---|---| | ✅ | `shop.metrics.weekly` | 周一 12:00 | 并行采集京东、抖音、天猫店铺指标 | `PASS`;`shop.metrics.weekly__20260804__20260804T065204Z__bb3b69`;三节点 3/3 成功,产物与云端 PG 写入完成;京东、抖音真实更新飞书 Base,天猫按原逻辑不写店铺表;抖音采用确认后的净销售额 `294,892.98` | | ✅ | `shop.competitor.weekly` | 周一 12:30 | 并行采集京东、抖音竞店指标 | `PASS`;`shop.competitor.weekly__20260804__20260804T075530Z__4fd7c1`;京东/抖音 2/2 成功并分别 upsert 49/24 行,飞书 Base 分别更新 7/9 条品牌记录 | | ✅ | `shop.jd_self_operated.daily` | 每天 16:00,业务日 -1 | 京东自营品牌后接商品采集 | `PASS`;`shop.jd_self_operated.daily__20260801__20260804T082226Z__255cfc`;品牌/商品 2/2 成功并分别采集 1/50 行,收入合计均为 `19,974.27`;同日真实重跑 `shop.jd_self_operated.daily__20260801__20260804T082722Z__0ced7e` 再次 2/2 成功且仍为 1/50 行,CDP 22132/22133 均关闭 | ### 商品 | 完成 | 工作流 | 调度 | 用途 | 最终状态、run_id 与关键证据 | |---|---|---|---|---| | ⬜ | `product.persona.daily` | 每天 10:00 | 三平台商品人群画像采集 | `PARTIAL_FAILED`;`product.persona.daily__20260815__20260801T103908Z__2d6028`;天猫缺 DMP、抖音缺搜索控件、京东完成 19/30 后浏览器崩溃 | | ⬜ | `product.daily` | 每天 08:40,业务日 -1 | ERP/三平台采集、原始日报入库、分析、导出、飞书写入 | `PARTIAL_TIMEOUT`;`product.daily__20260731__20260801T113513Z__b59304`;ERP/JD/TM 完成,DY 超时,raw 257;独立下游完成分析、导出 32、本地 upsert 与 32 个飞书写跳过;原 `product.import.daily` 已并入 `product.daily` 的 `import` 阶段 | | ✅ | `product.alert.daily` | 每天 23:00 | 商品异常检测和条件通知 | `PASS`;`script.product_commerce.955b1dfb0cdf__20260801__20260801T085614Z__4fefb3`;真实读取本地库,无符合阈值异常,未产生通知 | | ✅ | `product.style_analysis.interval` | 每 3 天 11:00 | 直连 MiniMax 分析到期款式 | `PASS_WITH_SKIPS`;历史基线 `product.style_analysis.interval__20260801__20260801T084137Z__952204` 保留;本次 `星云2` 2026-08-26~2026-08-28 真实直连 MiniMax、飞书、Base、PostgreSQL 均成功 | | ⬜ | `product.main_image.weekly` | 周日 08:30 | JD、Tmall 主图并行采集,两边独立 PG 入库与飞书插入 | `PENDING_RETEST_AFTER_MERGE`;尚无合并后新图的业务 run_id。工程结构要求为两个无依赖且资源隔离的分支;任一分支受控失败不阻断另一分支,全部结束后整体失败并报告平台级具体错误。合并前 run 仅见下方历史证据表 | | ⬜ | `product.market_rank` | 周一 10:00 | 三平台周市场排行采集、归档 | `FAIL_AUTH_OR_UI`;`product.market_rank__20260814__20260801T103628Z__5a9024`;天猫认证、京东类目配置、抖音控件分别失败;目标与来源脚本哈希一致 | ### 内容 | 完成 | 工作流 | 调度 | 用途 | 最终状态、run_id 与关键证据 | |---|---|---|---|---| | ⬜ | `content.metrics.daily` | 每天 22:00 | 达人/自营/B 站/蝉妈妈采集和指标同步 | `PARTIAL_FAILED`;`content.metrics.daily__20260813__20260801T101312Z__28d505`;71 分 05 秒后完整度检查失败,已完成证据和飞书写跳过保留 | | ✅ | `content.marketing_report.daily` | 每天 10:00 | 从本地数据生成营销日报 | `PASS_WITH_SKIPS`;`script.content_marketing.62b3b647254f__20260804__20260801T091245Z__f20319`;真实 PG + 本地 Hermes,生成 Markdown/PNG,未启用发送 | | ✅ | `content.relogin.weekly` | 周五 10:00 | 并行刷新内容平台登录态 | `PASS_WITH_SKIPS`;`content.relogin.weekly__20260811__20260801T100706Z__45a8db`;验收态按设计禁止 QR/交互登录并留跳过证据,未修改 Cookie | | ✅ | `content.creator_report.monthly` | 每月 1 日 08:30 | 生成达人月报 | `PASS_WITH_SKIPS`;`content.creator_report.monthly__20260801__20260801T084140Z__bd9fdd`;数据库检查和入口 dry-run 成功,飞书写关闭 | | ✅ | `content.summary.monthly` | 每月 1 日 08:00 | 内容月度汇总 | `PASS_WITH_SKIPS`;`content.summary.monthly__20260801__20260801T084142Z__9d73c1`;数据库检查和入口 dry-run 成功,外部写关闭 | | ✅ | `content.cooperations.daily` | 每天 09:00 | 刷新映射并同步合作记录 | `PASS_WITH_SKIPS`;`content.cooperations.daily__20260801__20260801T084143Z__02b89a`;真实飞书读取与本地 PG 读取,内部 dry-run 禁止写入 | | ⬜ | `content.comments.weekly` | 周日 12:00 | 三平台评论并行补采和汇总 | `PARTIAL_TIMEOUT`;`content.comments.weekly__20260812__20260801T100904Z__530989`;60 分 56 秒,B 站完成,XHS/DY 有界停止,229 CSV + 229 JSON、约 5.45 MB | | ✅ | `content.summary.weekly` | 周二 10:00 | 内容周度汇总 | `PASS_WITH_SKIPS`;`content.summary.weekly__20260801__20260801T084145Z__7e6081`;数据库检查和入口 dry-run 成功,外部写关闭 | ### 手动命令/历史验收场景(不计当前工作流分母) | 旧验收标识 | 合并后的入口与用途 | 历史状态、run_id 与关键证据 | |---|---|---| | `supply.purchase_order_update` | `supply.workflow.run`;默认参数自动选择 `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 秒,品牌 JSON 533 B,本地库 +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`;飞书只读并生成本地内容/款式映射 | `PASS`;`content.mapping.refresh__20260818__20260801T112822Z__917ed7`;约 25 秒,35 张表、117,505 B 本地 JSON | | `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 项;这些状态不改变当前 21 个定时工作流的统计。 ### 已废弃历史证据(不计任何当前分母) - `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 条有效调度定义对应 21 个顶层 LangGraph 工作流并全部启用;原两个主图调度已合并为一个周日 08:30 的 `product.main_image.weekly`,旧 run 仅作非加总历史证据。 - `shop.jd_self_operated.history`、`product.backfill`、`product.review_collection` 由命令声明的 `default_args` 和 `{business_date}` 自动渲染日期,`supply.purchase_order_update` 自动注入固定子命令;调用者无需重复传日期范围或 `mcp-run purchase-order-update`。 - `content.metrics.backfill` 收敛为 `gyxx backfill content.metrics.daily`;`content.mapping.refresh`、`content.retry_failed` 分别映射到 `content.mapping.rebuild`、`content.failed.retry`。 - `product.weekly_aggregate.documented_missing` 不再注册、不再调度,只保留上述历史证据。 ## 7. 证据与自动化校验 - 现行 21 个定时工作流均已通过隔离 `GYXX_DATA_ROOT` 下的 LangGraph 注册/编排验证;合并主图的 JD、Tmall 并行启动、独立资源、失败隔离、成功写入保留和最终错误聚合已通过工程测试,但尚未完成受控业务实跑。7 个手动命令保留原实跑或排除证据;真实验收状态以第 6 节为准,工程验证或 dry-run 不替代业务实跑。 - 数据库阻塞已解除:8 个原数据库阻塞工作流均完成表/列/权限检查和事务回滚探针;商品导入、商品告警、营销日报随后执行了真实安全分支。 - 本次合并后的最终全量回归数量由交付汇总统一更新;Ruff、构建、`gyxx doctor --json` 和来源状态检查仍是必验项,不在此预写新的工程测试数量。 - 全仓 secret scan 命中 0;飞书误建的 1 条记录已精确删除并确认不存在,其余业务表写入均跳过;来源项目实际写入 0。 主要证据位置: - 数据库迁移:`var/migrations/cloud_data_hub_to_gyxx_super_data_20260801T162327/` - 浏览器状态复制:`var/migrations/browser-state/20260801T085006Z-5c217b14/` - 验收事件:`var/reports/workflow-acceptance/evidence.jsonl` - 店铺实跑:`var/reports/workflow-acceptance/shop-live-20260801.jsonl` - 店铺指标三平台复测:`var/reports/workflow-acceptance/shop-metrics-full-20260909/` - 店铺竞店两平台复测:`var/reports/workflow-acceptance/shop-competitor-full-20260913/` - 京东自营日采集复测:`var/reports/workflow-acceptance/shop-jd-self-operated-full-20260729/` - 商品京东主图(合并前子链证据):`var/reports/workflow-acceptance/product-main-image-jd-20260812.jsonl` - 商品日报下游复核:`var/reports/workflow-acceptance/product-daily-downstream-20260731-retry.jsonl` - 内容长任务:`var/reports/workflow-acceptance/runs/` - 工作流 journal:`var/runs////run.json` - 逐项执行清单:`docs/workflow-acceptance-test-requirements.md` ## 8. 未通过项的下一步 1. 为供应链测试账号授予 ERP“普通商品资料”权限后,只复测补货周任务和补货告警;采购单更新仍保持排除,除非另行授权并提供可回滚测试数据。 2. 服务器运行店铺指标工作流前注入有效 `GYXX_HERMES_API_KEY`,复核可选 AI 分析输出;该项不阻塞三个店铺工作流的采集、文件和云端 PostgreSQL 验收结论。 3. 补齐商品天猫 DMP、京东类目配置,更新抖音页面控件定位;处理京东画像浏览器崩溃与抖音采集未收敛。 4. 为天猫万相提供有效且可复用的非交互登录态后,对合并后的主图两节点工作流执行受控业务复测:验证周日 08:30 并行启动、两个分支资源隔离、两边 PG/飞书边界,以及任一受控失败时另一边完成写入、整体失败并给出平台级具体错误;仍不得弹出扫码流程,飞书保持零写门禁。 5. 对内容完整度、评论、失败重试和指标回补设置可分段续跑的检查点,复测时继续保持飞书表零写入和唯一通知收件人策略。 最终结论是:工作流框架、数据库迁移、本地服务绑定和安全隔离已达到验收要求;当前 21 个定时工作流中,13 项业务通过且规则完成,7 项未通过,1 项合并后待受控业务复测。另有 7 个手动命令历史场景、2 个已删除/废弃历史证据和 2 条合并前主图子链实跑证据单列追溯,不能表述为“全部生产链路通过”。