Bili Tech Pipeline 发现链路重构与脚本归档
把 bili-tech-pipeline 的发现链路从 7 个并列的 run_actual_task 脚本收口到统一入口 python -m src.scripts.run --strategy <name>,按 broad_sample / stable_sample / keyword_only 三个 DiscoveryStrategy 实现切分;同步把 UP 池评分、健康检查、目标选择、ROI 跟踪从老脚本里抽到 src.domain.up_pool 模块。Review Console 切到新入口后通过完整链路验证:API 触发后真实抓取并写入审核库与飞书去重命中。归档阶段把 23 个一次性历史脚本下沉到 src/scripts/legacy/,12 个探针脚本下沉到 src/scripts/probes/,旧 run_actual_task_*.py 全部退化为带 DeprecationWarning 的薄壳转发。13 个测试全部通过,回滚通道保留 BRC_USE_LEGACY_BROAD_SAMPLE feature flag 与备份 tarball。当前发现链路是单一权威路径,老路径仅用于兼容观察。
新增 discovery 策略不要再写新的 run_actual_task_xxx.py,而是在 src/orchestration/discovery_strategies/ 下继承 DiscoveryStrategy 基类,实现 build_targets、build_source_entities、post_run_hook 三个方法,再到 src/scripts/run.py 的 STRATEGY_REGISTRY 注册名字即可。Review Console 默认走新入口,不需要改 runtime_adapter.py。一周观察期到 2026-06-24,没有 deprecation 命中再批量删除薄壳。
第一,发现链路的 7 个老脚本 run_actual_task / broad_sample / stable_sample / 10 / 10_ai_compute / 10_new_queries / 10_whitelist 在 discover 闭包内重复 UP 池过滤、目标选择、source_entity 构造逻辑,每改一处都要改 7 份;统一基类后 broad_sample 等价替换并通过 tests/test_discovery_strategies.py::test_broad_sample_strategy_targets_match_legacy 完成行为对齐。第二,Review Console 的 API 触发 mode=broad_sample 在归档前后各跑一次:归档前候选 323、publishable 79、入审 7;归档后候选 X、入审 4 加飞书去重 8 命中,去重命中证明前几次跑出的内容已真实进入飞书表。第三,所有 13 个测试在两个阶段都跑通,包括基于 importlib 加载老脚本的 test_broad_sample_selection.py,因为薄壳通过 re-export 兼容老 import 路径。
先把已验证方案当成稳定基线:保留当前 schedule / deliver / workdir,不急着继续扩面;新增候选先读源码、看 output、做 run-now 验证,再决定是否转 script-only。
证据摘要
- 第一,发现链路的 7 个老脚本 run_actual_task / broad_sample / stable_sample / 10 / 10_ai_compute / 10_new_queries / 10_whitelist 在 discover 闭包内重复 UP 池过滤、目标选择、source_entity 构造逻辑,每改一处都要改 7 份;统一基类后 broad_sample 等价替换并通过 tests/test_discovery_strategies.py::test_broad_sample_strategy_targets_match_legacy 完成行为对齐。第二,Review Console 的 API 触发 mode=broad_sample 在归档前后各跑一次:归档前候选 323、publishable 79、入审 7;归档后候选 X、入审 4 加飞书去重 8 命中,去重命中证明前几次跑出的内容已真实进入飞书表。第三,所有 13 个测试在两个阶段都跑通,包括基于 importlib 加载老脚本的 test_broad_sample_selection.py,因为薄壳通过 re-export 兼容老 import 路径。
行动清单
边界 / 风险
BRC_USE_LEGACY_BROAD_SAMPLE 环境变量回滚通道写在 runtime_adapter.py 里但没有跑过完整一次回滚演练。如果新入口在某个未覆盖场景下产出回退到老版本,需要先确认 systemd unit 加载环境变量的位置,再 systemctl --user restart brc-backend brc-worker。建议这周内做一次模拟回滚验证。
10_whitelist 脚本有一套独立的"sources.yaml + UP 池交叉过滤"逻辑,247 行没有迁到 strategy 基类下。当前通过 re-export 让它依赖 src.domain.up_pool 的函数,但脚本本身还在顶层。如果业务确认这个白名单冒烟流程仍在用,应做成 WhitelistStrategy;如果不再用,应一起归档。需要决策。
7 个 run_actual_task 薄壳保留一周观察期。期间任何 cron job、定时任务、外部脚本如果还在调用这些路径,会打印 DeprecationWarning 但不会中断;但如果观察期内没有任何调用方暴露出来,删除后才发现就需要紧急修复。建议在 ~/.hermes/cron/jobs.json 与系统 crontab 全文 grep 一次确认没有 run_actual_task 直调。
完整记录
Bili Tech Pipeline 发现链路重构与脚本归档
结论
把 bili-tech-pipeline 的发现链路从 7 个并列的 run_actual_task 脚本收口到统一入口 python -m src.scripts.run --strategy <name>,按 broad_sample / stable_sample / keyword_only 三个 DiscoveryStrategy 实现切分;同步把 UP 池评分、健康检查、目标选择、ROI 跟踪从老脚本里抽到 src.domain.up_pool 模块。Review Console 切到新入口后通过完整链路验证:API 触发后真实抓取并写入审核库与飞书去重命中。归档阶段把 23 个一次性历史脚本下沉到 src/scripts/legacy/,12 个探针脚本下沉到 src/scripts/probes/,旧 run_actual_task_*.py 全部退化为带 DeprecationWarning 的薄壳转发。13 个测试全部通过,回滚通道保留 BRC_USE_LEGACY_BROAD_SAMPLE feature flag 与备份 tarball。当前发现链路是单一权威路径,老路径仅用于兼容观察。
推荐路径
新增 discovery 策略不要再写新的 run_actual_task_xxx.py,而是在 src/orchestration/discovery_strategies/ 下继承 DiscoveryStrategy 基类,实现 build_targets、build_source_entities、post_run_hook 三个方法,再到 src/scripts/run.py 的 STRATEGY_REGISTRY 注册名字即可。Review Console 默认走新入口,不需要改 runtime_adapter.py。一周观察期到 2026-06-24,没有 deprecation 命中再批量删除薄壳。
关键依据
第一,发现链路的 7 个老脚本 run_actual_task / broad_sample / stable_sample / 10 / 10_ai_compute / 10_new_queries / 10_whitelist 在 discover 闭包内重复 UP 池过滤、目标选择、source_entity 构造逻辑,每改一处都要改 7 份;统一基类后 broad_sample 等价替换并通过 tests/test_discovery_strategies.py::test_broad_sample_strategy_targets_match_legacy 完成行为对齐。第二,Review Console 的 API 触发 mode=broad_sample 在归档前后各跑一次:归档前候选 323、publishable 79、入审 7;归档后候选 X、入审 4 加飞书去重 8 命中,去重命中证明前几次跑出的内容已真实进入飞书表。第三,所有 13 个测试在两个阶段都跑通,包括基于 importlib 加载老脚本的 test_broad_sample_selection.py,因为薄壳通过 re-export 兼容老 import 路径。
落地方式
阶段一已经完成生产路径切换:BroadSampleStrategy 等三个策略文件落地、runner 接收 strategy 参数与 post_run_hook、统一入口 run.py 暴露 --strategy 与 --keywords 参数、Review Console runtime_adapter.py 切到新命令。阶段二完成脚本归档:legacy/ 与 probes/ 各有 README 说明分类与用法,README.md 项目结构反映新目录。阶段三 UP 池存储升级暂缓,741 profiles 单文件读写仍可承受,等规模超 1000 或并发出现再启动。后续新增策略按上面推荐路径走;如果一周内 deprecation warning 没被业务流程命中,把 7 个薄壳脚本一并删除并更新 legacy/README.md。
风险与边界
风险 1:feature flag 回滚未做日终演练
BRC_USE_LEGACY_BROAD_SAMPLE 环境变量回滚通道写在 runtime_adapter.py 里但没有跑过完整一次回滚演练。如果新入口在某个未覆盖场景下产出回退到老版本,需要先确认 systemd unit 加载环境变量的位置,再 systemctl --user restart brc-backend brc-worker。建议这周内做一次模拟回滚验证。
风险 2:run_actual_task_10_whitelist 仍有独立逻辑
10_whitelist 脚本有一套独立的"sources.yaml + UP 池交叉过滤"逻辑,247 行没有迁到 strategy 基类下。当前通过 re-export 让它依赖 src.domain.up_pool 的函数,但脚本本身还在顶层。如果业务确认这个白名单冒烟流程仍在用,应做成 WhitelistStrategy;如果不再用,应一起归档。需要决策。
风险 3:薄壳删除时机依赖业务感知
7 个 run_actual_task 薄壳保留一周观察期。期间任何 cron job、定时任务、外部脚本如果还在调用这些路径,会打印 DeprecationWarning 但不会中断;但如果观察期内没有任何调用方暴露出来,删除后才发现就需要紧急修复。建议在 ~/.hermes/cron/jobs.json 与系统 crontab 全文 grep 一次确认没有 run_actual_task 直调。
验证
第一类是单元测试:python3 -m pytest tests/ -v 在阶段 1 与阶段 2 各跑一次,13/13 全部通过,覆盖 broad_sample 选源等价、stable_sample 默认目标、keyword_only 关键词回退、runner strategy 参数透传等关键路径。第二类是端到端 API 触发:curl -X POST http://127.0.0.1:2333/api/videos/crawl with mode=broad_sample,阶段 1 的 task_id video_crawl_8a4b2c1d9e3f 与阶段 2 后的 task_id video_crawl_089c3e1d13d2 全部 succeeded,落 SQLite 与 review_items 表。第三类是 import 兼容性:python3 -c 'from src.scripts.run_actual_task_broad_sample import compute_profile_score' 验证薄壳的 re-export 不破坏老 import。第四类是 Review Console 前端:curl http://127.0.0.1:3000/ 返回 200 并包含 Bili Review Console 标题。
后续推荐
短期一周内做三件事:第一是把 cron 与系统定时任务里搜索 run_actual_task 的直调,确认没有外部依赖再删薄壳;第二是 10_whitelist 脚本的去留决策,要么做成 WhitelistStrategy,要么和薄壳一起归档;第三是 feature flag 模拟回滚演练,确认 systemd unit 能正确加载 BRC_USE_LEGACY_BROAD_SAMPLE。中期等规模超 1000 profiles 或并发需求出现,再启动阶段 3 UP 池存储升级,迁到 SQLite 或 jsonl-per-profile。长期当前 src/orchestration/discovery_strategies/ 是 discovery 的扩展点,后续新增 candidate_pool、observe-only 等策略都从这里走,不再回到老脚本路径。