蜂群调度总规划规划态 · 待拍板执行

药材谷自动化运转的顶层设计:Agent 团队 + 蜂群调度。王先生只做甩手掌柜——看结果、拍板;其余(行情录入、详情页、情报、竞品、营销)全部交给蜂群自动跑。

「这个要派咱们的 Agent 啊,咱们的智能体 Agent 要录入行情,这些搞成自动化的……我只做一个甩手掌柜,其他事要交给咱们的 Agent 团队,加咱们的蜂群——蜂是蜜蜂的蜂,群是群体的群。蜂群调度来去调配咱们的 Agent,和系统里其他的 Agent,去看着管理整个系统。把这条记住,这是死命令。」
「让它每天不停的去录入数据,搜索国内国外的网站,不停的去搜索实时的报价。还要让 Agent 和咱们的一千多位员工去做详情页、收集、情报分析、竞品、营销……咱们这个 APP、药材谷要对外怎么推荐、怎么宣传,后面全部要添加上。底座也要规划好。」 —— 王先生 · 2026-10-06 死命令
任务台账完成度: 73 卡 · 73 ✅ 已落地 · 0 张未收口 #195 治理闸门与审计(P0)· ✅ 四项缺口已全收口 #108 数字员工工位化 1390 位(P1)· ✅ 四步走已全收口 ✅ 排版修复 v2 + #196 三页迭代 · 2026-10-07 13:20(看到此标=新版;没有=旧缓存,请 Ctrl+F5 强刷)

一、蜂群调度总架构三层:底座 → 调度 → 蜂群

L0 · 顶层指挥官人 · 只拍板不由人工干活
👤 王先生(甩手掌柜)
只看结果 · 只拍板关键决策(对外发布、资金、口径变更)
不参与日常调度,不手工录数据
L2 · 蜂群调度层(Swarm Orchestrator)系统的"大脑" · 决定谁在什么时间干什么
任务队列
活排好队,断电不丢
优先级路由
急活插队,活派给对的群
并发配额
不让蜂群一拥而上打崩系统
心跳巡检
谁掉线自动补位重派
失败重试 / 熔断
连败自动停 + 告警王先生
审计留痕
每步动作可回溯
L1 · 四大蜂群(干活的)任务由调度层分发,蜂群不自己抢活

🐝 采集蜂群每日跑

  • 国内行情站实时报价抓取
  • 国外行情站报价抓取
  • 去重 / 价格异常校验
  • 三级复核后自动入库

🐝 内容蜂群批量生产

  • 品种详情页批量生成
  • 性味归经功效补全
  • 产地 / 规格 / 图集挂载
  • 行业资讯收集入库

🐝 情报蜂群日 / 周报

  • 竞品平台动向监测
  • 价格异动归因分析
  • 供需缺口识别
  • 政策 / 资讯摘要

🐝 营销蜂群对外推广

  • APP 卖点提炼与文案
  • 海报 / 宣传物料批量生成
  • 渠道投放排期
  • 引流落地页
底座层(已建成 / 待补齐)蜂群跑起来的地基
任务调度中心
✅ 已建(agent_dispatch)
实例监控中心
✅ 已建(agent_instance)
角色权限中心
✅ 已建(agent_role · RBAC)
Agent 任务审计
✅ 已建(agent_audit)
产物归档中心
✅ 已建(artifact_archive)
数据仓 / 接口层
✅ 已建(8979 + 80 反代)
定时调度器
⏳ 待补(自动跑的关键)
采集限速 / 合规
⏳ 待补(防被封 / 守规矩)

二、八大板块任务清单已全部登记进任务栏 #106–#113

#114蜂群技能库✅ 已落地实测P0
王先生 2026-10-07 死命令:「把你的全量技能分配给咱的分群、咱的板块,让蜂群抓取外界情报,技能在手天下无敌。」已建成 routes/swarm_skills.py(/api/skills/*):真实扫描本机技能库(用户级 59 + 插件 68 + 内置 1 = 128 项)→ 按职能挂载五大蜂群 + 通用底座池(采集 10 / 内容 60 / 情报 10 / 营销 11 / 审核 6 / 通用 31),特别标注 30 项「情报抓取」能力;编排层任务自动携带本群技能包下发并留痕。前端「蜂群技能库.html」。
铁律:技能清单全部来自真实磁盘扫描;挂载可人工改派;技能是能力声明,干活仍守四条铁律
#106蜂群调度中枢落地✅ 已落地实测P0
已建成 routes/swarm_orchestrator.py(/api/orchestrator/*):任务队列(待派发→已派发→执行中→完成/失败)· 按职能自动派单(collect→采集蜂 / content→内容蜂 / intel→情报蜂 / market→营销蜂 / audit→审核蜂)· 16 工位心跳巡检(超时判离线+任务回收)· 失败重试(上限 2 次)· 连续失败 3 次熔断(冷却 5 分钟自动恢复)· 调度日志全留痕。前端「蜂群调度中心.html」已可点着测。
铁律已写进代码:对外发布/资金动作 = 人工闸门(待人工确认,王先生放行才执行);无执行器的职能如实标注不假装完成(隔离单测 21/21 + UI 真机 33/33 全绿)
#107行情自动采集流水线(每日跑)✅ 已落地实测P0
蜂群每日搜国内国外行情站 → 抓实时报价 → 去重 → 价格异常校验 → 三级复核(采集 Agent → AI 复核 → 入库) → 自动写入数据仓。已建成采集调度台,实测 4 源抓到 116 条真实报价(天地网×2 + 康美×2),闭环走通。
铁律:抓不到就留空,绝不编价格——抓到的数据先入待复核队列,绝不直入真库;自动开关默认关,待王先生点头
#112自动化运行底座✅ 已落地实测P0
已建成 routes/swarm_pipeline.py(/api/pipeline/*)——甩手掌柜终极形态:把五只蜂串成每日自动流水线(① 采集蜂真抓行情 → ② 复核台统计/阈值内自动采纳 → ③ 内容蜂补详情页草稿 → ④ 情报蜂出日报草稿 → ⑤ 审核蜂合规抽检 → ⑥ 晨报台汇总落盘)。进程内守护线程 + 文件锁(多实例只跑一个),每日定时自动跑,支持错过后当天补跑;每步可独立启停与调参。前端「蜂群自动化底座.html」。
铁律已写进代码:抓到的数据只进待复核队列(自动采纳默认关);对外推送 = 人工闸门(默认关);任一步失败如实记账、不阻断后续。实测:六步 6/6 全绿、4.2 秒跑完一轮(抓到 116 条 → 新增入队 82 条 → 10 页草稿 → 日报 → 审核 99 分 → 晨报),第二轮去重后新增 0 条,trade 真库始终未被自动写入
#195自动化治理闸门与审计✅ 已收口P0
全自动必须有的安全阀:三线裁决纪律固化进 Agent(已裁决不重投 / 创新需实测 / 禁造假)、全动作审计留痕、对外发布与资金类动作强制人工确认门、异常熔断自动停机告警。
✔ 已建成:① 统一治理阀门总面板已上线(#195-①,2026-10-07)——聚合 29 个阀门(模块总闸 21 · 人工闸门 2 · 资金确认门 6)一屏总览,含熔断监控 + 高危事件三源(调度日志 / 预警巡检 / 审核蜂),只读聚合零改业务态;② 统一确认门已上线(#195-②,2026-10-07)——广告位上下架 / 订单退款调解 / 钱包提现 / 收银台聚合支付四类动作由「各页各自实现」收敛为一个共享闸门(/api/fund_gate:登记 → 待人工确认 → 拍板 → SHA256 上链;下游凭 require_approved 放行),总面板 ⑥ 拍板台一屏拍板,只写闸门台账、绝不碰业务库;③ 治理告警自动推送已上线(#195-③,2026-10-07)——把 工位熔断 + 调度日志 error/warn + 预警巡检高危 + 审核蜂问题 汇总成站内信推给管理员(/api/gov_alert,总面板 ⑦ 一屏推送 + 守护巡检),④ 审计中风险处置流转闭环已上线(#195-④,2026-10-07)——Agent 任务审计中心把「写类动作」标为中风险却只列不改,本台补上 审阅 → 处置 → 销号 人工闭环(/api/audit_disp,总面板 ⑧ 一屏处置,误报可一步销号、支持同质条目批量闭环);清单实时派生自审计底座(只读切面),台账只记处置状态 + SHA256 链式留痕,原始审计底座严格只读(既不写也不改——审计者不自记于被审日志);自动推送默认关(开不开由王先生拍板)、跨日去重(业务键指纹)、只写推送台账(不重启工位 / 不自动处置 / 不自动发布);审计留痕——Agent 任务审计库 562 条 / 25 个 Agent / 42 个模块(风险分布 高 0 · 中 184 · 低 378);人工闸门——auto_push 默认关、待复核队列全部待人工、32 味处置「保存结论→预演→执行」三步闸;异常熔断——同工位连续失败 3 次熔断 + 冷却自动恢复(当前 16 工位 0 熔断)。
✅ 四项缺口已全部收口:① 统一「治理阀门总面板」 ✅ #195-①;② 资金类动作的统一强制确认门抽象 ✅ #195-②(统一确认门 /api/fund_gate,6 条登记表 gated 2 / unified 4 / manual 0);③ 熔断 / 高危事件自动告警推送 ✅ #195-③(治理告警推送 /api/gov_alert,总面板 ⑦);④ 审计「中风险 184 条」的处置流转闭环(审阅 → 处置 → 销号) ✅ #195-④(审计处置台 /api/audit_disp,总面板 ⑧;中风险 184 条已可逐条/批量闭环)。本卡 2026-10-07 全收口。
原则:能自动的自动,会伤人的上锁 | 编号说明:原卡号 #113 与「营销蜂执行器」撞号,2026-10-07 改编 #195
#108数字员工工位化(1390 位)✅ 已落地实测P1
把在册一千多位数字员工按职能分群(采集 / 内容 / 情报 / 营销 / 客服 / 审核),注册为可派活的 Agent 实例,支持批量上下线、并行开工。
✔ 现状(live 实测):工位化骨架已跑通——16 个常驻工位 / 5 职能蜂群(采集 4 · 内容 4 · 情报 3 · 营销 3 · 审核 2)全部在线、0 熔断;任务闭环「入队 → 按职能自动派单 → 工位执行 → 心跳巡检 → 失败重试 → 熔断」已通(队列 9 任务:完成 6 · 失败 3 · 待派发 0)。
✔ 四步走第一步已收口(#108-①,2026-10-07):在册落库——1390 位统一花名册已落库(60 专家 + 40 执行岗类 + 168 新岗 + 1122 扩编,编号 / 职能 / 技能 / 状态四要素齐全,30 个集群),技能标签按来源如实取(专家 svc / 岗类 tools+scope / 新岗 type+boundary / 扩编 board+type),并与 agent_instance 心跳注册表打通(6 通道 ↔ 板块映射)。
✔ 四步走第二步已收口(#108-②,2026-10-07):职能分群——1390 位按职能切分到岗,一人一岗 · 岗随技能走;共 23 个职能蜂群 = 派单职能 6(采集 / 内容 / 情报 / 营销 / 投放 / 审核,执行器已接线可派活)+ 业务职能 17(客服 / 劳务 / 质检 / 采购 / 仓储 / 撮合 / 行情 / 溯源 / 农事 / 加工 / 出海 / 知识 / 数据 / 设备 / 包材 / 人才 / 金融,待扩),分群覆盖率 97.4%。关键词只用复合专指词(实测剔除「撮合」这类业务模式泛词——1183 人含该词但职能各异),未命中的 36 人如实归「综合蜂(待定岗)」并给出编制簇分布,绝不硬塞、绝不虚标已接线。前端「数字员工职能分群.html」。
✔ 四步走第三步已收口(#108-③,2026-10-07):弹性工位池——不搞 1390 个常驻进程:常驻骨干 16 位(永不回收)+ 按需弹性扩容到首批 64,忙扩闲收(待派任务积压 → 按压力给各职能群扩弹性工位;空闲 → 回收,忙的工位跳过并如实报)。弹性工位只配给执行器已接线的 6 个职能群(未接线 17 群如实不配),每位弹性工位绑定一位在册员工(owner_emp);只改工位池、绝不碰业务库;dry 预演零写盘;伸缩留 SHA256 链式台账。前端「蜂群调度中心.html」新增弹性工位池面板(实时压力表 + 预演 + 首批扩容 + 自适应 + 收空闲)。
✔ 四步走第四步已收口(#108-④,2026-10-07):精细派单——调度中枢同职能群「最闲优先」是粗派,本层补精细派单:同职能群内按 员工技能标签命中 → 负载 / 工作量均衡 排序(显式标签双倍加权),给出可解释的首选 / 备选 / 理由,并逐条与粗派对照(差异 = 精派与粗派选了不同工位);员工若在弹性工位池绑定了专属工位(owner_emp)则优先派到该工位。标签命中 0 如实退化为「职能 + 负载均衡」并写明理由,绝不伪装成技能匹配;不动调度中枢主流程;真派单必须填派单人(人工闸门),只写本层台账(派单流水 SHA256 链式 + 工作量台账)、绝不碰业务库;dry 预演零写盘。前端「数字员工精细派单.html」。
◇ #108 数字员工工位化 1390 位 · 四步走全收口:① 在册落库(1390 位花名册)→ ② 职能分群(23 职能蜂群 · 一人一岗)→ ③ 弹性工位池(常驻骨干 16 + 按需扩容到 64 · 忙扩闲收)→ ④ 精细派单(技能标签匹配 + 工作量台账)。
依赖:agent_instance 心跳(已建成)
#109品种详情页自动化生成✅ 已落地实测P1
已建成 routes/swarm_content.py(/api/content/*):内容蜂执行器接通蜂群调度——三源组装(728 味药典档案 + 图鉴照片 + 真实行情)批量生成详情页,生成→自检(字段完整度)→草稿→王先生发布(人工闸门)。前端「内容蜂工坊.html」台账化管理。
铁律:字段缺失标「档案待补」、行情没采到写「暂无行情」、档案库没有的品种如实上报跳过——零编造。已实测 11 页(27/27 全绿),已发布样例「三七」
#110情报分析与竞品监测✅ 已落地实测P1
已建成 routes/swarm_intel.py(/api/intel/*):情报蜂执行器接通蜂群调度——三引擎(价格异动雷达 / 跨市场价差·撮合信息费来源 / 市场行情简报)聚合生成情报日报,生成→草稿→王先生拍板推送(人工闸门)。前端「情报蜂中心.html」。
铁律:全部数字来自真实数据源实时计算;同市场不同规格归并不当价差;样本不足如实提示,零编造。已实测 32/32 全绿(47 样本·异动 7·价差 7 组·27 市场)
#115审核蜂执行器(合规抽检)✅ 已落地实测P1
已建成 routes/swarm_audit.py(/api/audit/*)——蜂群的守门人:对对外内容 + 待入库数据做真实规则抽检,11 条在管规则覆盖三域(详情页正文过短 / 已发布无价 / 价格异常 / 档案字段缺失 / 正文命中外部平台名 / 广告法极限词;日报统计不自洽 / 摘要为空 / 已推送无要点;队列同品种同市场重复 / 脏价格)。产出问题清单 + 合规评分(错扣 8 / 警扣 3 / 提扣 1),编排层 audit 职能执行器已接线,任务真跑真出结论。前端「审核蜂中心.html」。
口径:只读不写业务库、只列问题不美化;禁用词表可由王先生配置(data/swarm_audit_terms.json)。已实测:问题 1 条(提示级)、评分 99
#113营销蜂执行器(多渠道文案引擎)✅ 已落地实测P1
已建成 routes/swarm_marketing.py(/api/marketing/*)——五大蜂群最后一块拼图:把内容蜂产出的详情页台账,以真实数据(档案库 + 行情库 + 采集队列)为底座,转成六渠道营销草稿(公众号长文 / 小红书种草 / 短视频口播 / 朋友圈 / 短信 / 行情播报)。编排层 market 职能执行器已接线,任务真跑真出草稿。前端「营销蜂工坊.html」。
铁律:只产草稿、绝不自动发布;数字全来自真实数据源,无价如实写「行情待补」零编造;外部平台名模糊化;推送站内信走人工闸门(仅已审核草稿)。已实测 29/29 全绿。#117:营销步已纳入每日流水线第七步(实测一轮 7/7 全绿,36 条草稿入账);审核蜂新增 market 域(AUD-401~404)
#118采集蜂 · 品种深度源 + 浏览器抓取通道✅ 已落地实测P1
①品种深度源:从列表页自动发现品种 ID 池(data/swarm_herb_pool.json)→ 轮转抓单品种公开价格页——同一品种多规格 × 多市场报价 + 周/月/年三档涨跌,比列表页细一个量级;实测单轮 10 品种页真抓 74 条 / 40 个品种×市场组合。②浏览器抓取通道(tools/browser_fetch.py,playwright+Edge 无头独立进程):供 JS 渲染/反爬站,源配置 engine 字段切换;实测与 http 通道同解析器同结果,现有站服务端渲染故默认关。
口径调整如实说明:原「不抓详情页」收紧为「不绕登录墙、不抓会员墙内容」——品种公开价格页(无登录)允许;去重键补入规格(与审核蜂 AUD-301 口径一致,修复同市场不同规格互相吞并的真问题)
#119采集蜂 · 品种池大扩容(728 味铺开)✅ 已落地实测P1
破解品种池硬顶(列表页一次只能发现 10 个品种 ID、分页无效):改用天地网搜索接口(/search?keyword=品种名)把 728 味档案库逐个换成品种 ID,分批建池、游标持久化。新增端点 /api/swarm/pool/build(limit/rounds 可调)与 /api/swarm/pool(进度查询);采集调度台新增品种池进度 KPI(已建 N / 728 味)与「⚡ 扩建品种池」按钮。另建通用浏览器翻页工具(tools/browser_paginate.py,点击"下一页"合并多页表格行)。
实测:搜索接口 20 味100% 命中;分批扩建至已建 117 / 728 味(池内 ID 119 个)后连跑 4 轮采集——覆盖品种 61 → 126(翻倍)、26 市场、每轮新增 72~91 条;真库 trade 始终 31 条未被自动写入(铁律)。如实报告——康美「今日价格」56 页分页为纯 JS 驱动、headless 下分页模块未生效,翻页暂受阻(工具已备,待换 JS 站启用),故康美源仍只取第一页
#111晨报/日报站内信推送✅ 已落地实测P1
晨报生成后可一键推到本站站内信(复用平台消息通知通道),甩手掌柜早上打开消息中心即见昨日战果。端点 /api/pipeline/push_brief,支持重推;「蜂群自动化底座」页晨报区一键触发。
人工闸门:只进本站消息中心,不连外部平台;重复推送自动拦挡。已实测站内信真增 1 条
#116投放蜂执行器(物料批量生成 + 引流落地页)✅ 已落地实测P1
在 #113 文案引擎基础上打通投放侧:把「待审文案草稿」转成三类可投放物料——海报卡(1080×1440)、图文长图(1080×1920)、引流落地页(响应式单页),全部落盘为自包含 HTML(零外链、可直接看/转发/截图),分区入 投放物料/ 与 引流落地页/。新增前端「投放蜂工坊」页(KPI / 选品种选类型一键生成 / 物料墙 iframe 预览 / 三级闸门批量操作);编排层新增 投放蜂 职能(executor=swarm_ads,human_gate=True)。守住口径:去外部厂商名、不碰金融板块。
实测:真跑一批 4 品种 × 3 类型 = 12 件物料落盘(带真实行情价:三七 102 元/kg、三棱 12 元/kg;无价品种如实写「行情待补」);离线单测 23/23 全绿、UI 取证 15/15 全绿(渲染/Tab/预览弹层/Esc 关闭/零控制台错误)。人工闸门:物料一律「待审」→ 审核通过 → 登记投放;绝不自动投放,真实外投须人工执行
#121采集蜂 · 品种池每日自动补建✅ 已落地实测P1
把 #119 的「手动反复点扩建」升级为流水线自持:每日采集步开跑前自动补建一批(默认每批 20 味,游标续接、铺满 728 后自动停),配置项 collect.pool_auto / pool_batch 可调。采集调度台数据源区新增自动补建状态标(读流水线配置显示「每日 06:30 自动补建 20 味 / 已配置未开启 / 关闭」)。
实测:/api/swarm/pool 已返回 real auto_build{on,batch,enabled,run_at};流水线采集步新增 ctx.collect.pool 明细并在步骤消息里追加「品种池自动补建 +N 味」。口径不变:补建只换 ID、不抓详情,抓取仍只入待复核队列
#122情报蜂 · 竞品监测引擎✅ 已落地实测P1
把 #110 的「竞品监测」从一句话变成真引擎:以真实多市场报价刻画竞品姿态,输出四块——①竞品市场活跃度榜(各市场报价条数/覆盖品种/涨跌倾向/均价)、②报价压力榜(各市场报价相对「同品种中位价」的平均偏离:负值=低价方/采购窗口,正值=高价方/销售窗口)、③竞品争抢品种(被 ≥2 个不同市场同时报价 + 价差/涨跌)、④资讯竞品动向(从真实资讯抽「收购/压价/断货/扩产/出口」等关键词信号)。新增 intel_rivals.json 快照台账、端点 /api/intel/rivals + /rivals/scan,且并入每日流水线情报步 + 情报日报。
实测:真数据覆盖 36 个市场 / 62 条报价 / 42 品种,争抢品种 7 个(当归跨 3 市场价差 116%)、资讯信号 7 条;UI 取证全绿、零控制台错误。不造假:无会员数据故不臆造竞品公司名,样本不足如实提示「暂无报价数据」
#123投放蜂 · 投放排期与回收台账✅ 已落地实测P1
补齐 #116 投放侧的后半环:投放排期(ads_schedule.json,仅「已审核通过」物料可排期,状态 待投放→已投放→已完成/已取消)+ 投放回收台账(ads_recycle.json,人工回填真实曝光/点击/转化/花费,自动派生 CTR/CPC/CVR/CPA)+ ROI 看板(/api/ads/roi,总体 + 按渠道 + Top 物料)。投放蜂工坊新增排期表 / ROI 概览 / 回收登记表单。
实测:端到端真跑(审核 3 → 排期 3 → 登记投放 1 → 回收 1 条:1200 曝光/48 点击/6 转化/80 元 → CTR 4.0% / CPC ¥1.67 / CPA ¥13.33)全对;离线单测 23/23。双保险闸门:指定 material_ids 也无法绕过审核(未审核物料拒绝排期);缺项/零值一律留空不编造;「已投放」仅登记,真实外投须人工执行
#124竞品监测并入晨报 KPI 明细✅ 已落地实测P1
把 #122 竞品监测从「单独一页」变成每日晨报的一部分:情报步落盘的竞品快照(市场数 / 品种数 / 争夺品种 / 资讯信号 / 采购窗口与销售窗口极值市场)自动并入晨报 KPI 与正文;build_rivals 新增 extremes 极值字段(在完整压力榜上取,不用截断值当极值),晨报推送站内信时同步带上竞品明细。
实测:晨报 KPI 出 竞品市场 36 · 争夺品种 7 · 资讯信号 7 · 采购窗口 甘肃兰州市场 −43.21% · 销售窗口 陇西首阳市场 +43.21%;修复了一处真 bug(首版取截断后第 20 位当「高价方」→ 显示 0.0%,已改为完整榜取极值)。离线单测 32/32、UI 全绿
#125投放蜂 · 排期到点提醒(站内信)✅ 已落地实测P1
排期不再「定了就忘」:due_reminders() 扫「待投放」且已填计划时间的排期,plan_time − now ≤ 提前量(默认 60 分钟,含已到点)即推站内信内部提醒;同一排期只提醒一次(写 reminded_at 去重),落 ads_reminders.json 台账。端点 /api/ads/reminders + /remind_check;流水线守护线程每轮顺带检查(与总闸解耦,总闸关也照常提醒)。投放蜂工坊新增「投放到点提醒」区块(24h 内待投放 / 提醒台账 / 立即检查 / 仅预览)。
实测:真推一次 → 站内信入消息中心(id 16)、台账落盘、reminded_at 去重生效(重跑 count=0);预览命中 2 条(三七 1911 分钟后到点)。离线单测 32/32、UI 17/17。口径:提醒只是内部通知,系统绝不自动投放,真实外投须人工执行;未填时间的排期不猜、跳过
#126情报蜂 · 竞品趋势跨期对比✅ 已落地实测P1
竞品监测从「单张快照」升级为「跨期趋势」:build_rival_trend(limit) 把最近 N 份快照按时间排成序列,输出 ① 市场活跃度变化榜(报价条数 首→末,态势 上升/下降/新进/退出)② 报价压力漂移榜(avg_dev 变化,更低价/更高价)③ 争抢品种进出(首末两期集合差)④ 极值市场漂移(采购/销售窗口是否换人 + pt 变化)⑤ 汇总结论句。端点 GET /api/intel/rivals/trend;analyze(task="trend") 已接入调度中枢。情报蜂中心新增「竞品趋势(跨期对比)」区块。
实测:真累积 4 份快照跑通(同批行情 → 如实显示 36→36、报价 ±0,不制造假变化);低/高价方漂移、争抢进出、口径提示均正确渲染。离线单测 43/43 含 21 项趋势断言、UI 17/17。截断纪律:序列点与极值市场走全量口径,活跃度/压力变化只覆盖各期 top12 并已在 scope 里显式标注;快照 <2 份如实提示「样本不足」,绝不编造趋势
#127投放蜂 · 回收数据批量导入✅ 已落地实测P1
回收从「一条条手填」变成「整表粘贴」:recycle_import(text, channel, date, dry) 解析粘贴文本(英文/中文逗号、制表符、分号、竖线均可),表头行与 # 注释自动跳过,空列保留占位(三七,,1200,48,6,80);未给物料ID 时按品种自动关联已审核物料并在备注留痕 [自动关联物料]。端点 POST /api/ads/recycle/import(dry=true 先预览不落盘)。投放蜂工坊回收区新增「批量导入」文本框 + 粘贴示例 + 预览解析。
实测:4 行正常 + 2 行异常(非数字列 / 首列非品种名)逐行报出行号与原因,落盘 4 条且派生 CTR/CPA 正确。离线单测 43/43(含 dry 不落盘、自动关联、制表符/中文逗号、全空指标拒绝)控台零错误。铁律:解析异常行绝不静默丢弃、绝不把非数字当 0,如实回报每一行
#128情报蜂 · 竞品趋势并入每日晨报✅ 已落地实测P1
竞品趋势从「单独一页」变成每天晨报的一部分:情报步扫完快照后自动取 build_rival_trend() 结论写入 KPI(rivals_trend_snaps / mkt_up / mkt_down / mkt_new / mkt_out / quotes_delta / hot_delta / hot_enter / hot_exit),晨报 headline 自动生成趋势句,推送站内信正文同步带趋势段。蜂群自动化底座晨报区新增竞品趋势行。
实测:真跑流水线 intel+brief 两步 2/2 全绿,KPI 落 6 份快照、极值市场沿用全量口径。离线单测 31/31、UI 12/12。纪律:快照 <2 份时不写趋势字段、不输出趋势句(如实提示样本不足);零变化如实写「市场活跃度与上期持平」,不为好看制造波动
#129投放蜂 · 回收台账导出与排期对账✅ 已落地实测P1
补上投放的后半环闭环:① 导出 recycle_export() 把真台账导出为 CSV(带 BOM,Excel 中文友好;支持日期区间 + 渠道筛选),落盘到「回收导出/」;② 对账 recycle_reconcile() 核对「排期 vs 回收」,四类问题逐条列出——投放未回收(已投放/已完成却无回收数据)、未投先收(还没投放就有回收)、游离回收(回收未关联任何排期)、指标待补(缺曝光/点击/花费)。端点 GET /api/ads/recycle/export、GET /api/ads/reconcile;投放蜂工坊新增「台账导出 · 排期对账」区块(日期/渠道筛选 + 预览 + 导出 + 一键对账)。
实测:真台账导出 1 行落盘「回收导出/回收台账_20261007_012438.csv」;对账真数据「排期 3 条 / 回收 1 条 / 已闭环 1 条 / 账账相符」。离线单测 31/31(含 BOM、整数不带 .0、缺项留空不填 0、dry 不落盘、渠道与日期筛选)、UI 12/12 零控制台错误。口径:CSV 空值一律留空不填 0;导出的是真台账本体,不是演练数据
#130投放蜂 · 对账缺口一键回填与催办✅ 已落地实测P1
把 #129 的「发现缺口」推进到「处置缺口」:① 一键回填 reconcile_fix() 针对投放未回收的缺口,按排期预填「回收补录骨架」——品种 / 渠道 / 物料ID / 日期取真值,曝光 / 点击 / 转化 / 花费一律留空,骨架入台账后自然归入「指标待补」等人工核实填写;② 一键催办 reconcile_dispatch() 汇总四类缺口推一条站内信给运营管理员。未投先收 / 游离回收 / 指标待补 一律只催办、不改数据。端点 POST /api/ads/reconcile/fix、POST /api/ads/reconcile/remind、GET /api/ads/reconcile/log;投放蜂工坊对账区块新增「🩹 一键回填骨架 / 📣 一键催办」与处置留痕。
实测:真库对账「账账相符」无缺口 → 回填幂等返回「无缺口可回填」、催办如实返回「无需催办」(不为演示造缺口);离线单测覆盖有缺口场景——生成 1 条骨架且四项指标全为 None、缺口 1→0 转入指标待补 1、重复回填幂等、早投/游离不改数据。离线单测 33/33、UI 16/16 零控制台错误。纪律:系统只搬运排期已知事实,绝不编造回收数字;数据修正一律人工执行
#131情报蜂 · 竞品多市场预警阈值✅ 已落地实测P1
竞品监测从「看榜单」升级为「超阈值报警」:build_alerts() 在全量压力榜 / 争抢榜上按阈值产出三类预警——低价方(采购窗口)报价偏离同品种中位价 ≤ -15%、高价方(销售窗口)≥ +15%、争抢品种价差 ≥ 50%;达阈值 2 倍记高危。① 落账 scan_alerts() 写 intel_alerts.json,同日内 (类型,对象) 去重防重复告警;② 并入流水线:情报步扫完自动挂 rivals_alerts,晨报 KPI 落 6 个预警字段 + headline 预警句 + 推送正文【竞品预警】段。端点 GET /api/intel/alerts、POST /api/intel/alerts/scan;情报蜂中心新增「竞品多市场预警」区块(当前命中 + 台账留痕)。
实测(真库):命中 10 条(高危 7)——黄芪价差 240%、百合 152.17%、当归 116.41%;低价方甘肃兰州市场 -43.21%(采购窗口)、高价方陇西首阳市场 +43.21%(销售窗口);落账 10 条,同日再扫新增 0(去重生效);真跑流水线 intel+brief 2/2,晨报 KPI 与正文预警句齐备。离线单测 33/33、UI 16/16 零控制台错误。口径:预警一律在全量榜上算(截断 top20 会漏真实极值),无命中时整段不写、不为好看制造预警
#132情报蜂 · 预警阈值可配置化(持久化)✅ 已落地实测P1
把 #131 写死的阈值变成页面可调、落盘持久:alert_config() / save_alert_config() 读写 intel_alert_cfg.json——报价偏离阈值(1–90%)、争抢价差阈值(5–300%)、自动推送开关、推送级别(仅高危 / 高危+达标)、接收人五项;坏值一律夹到合法区间并如实回显(不静默吞掉)。阈值解析优先级:显式传参 → 配置 → 默认(传 0/None 视为用配置)。端点 GET/POST /api/intel/alerts/config(reset:true 回默认);情报蜂中心「竞品多市场预警」新增配置行(保持数值 + 保存 / 恢复默认)。
实测(真库):配 12%/40% 后命中由 10 条 增到 12 条(高危 7→8,阈值真生效,非摆设);990→夹 90、-5→夹 5、非法级别保持原值;reset 回 15%/50% 且 customized 归位。离线单测 44/44 覆盖默认 / 持久化 / 夹取 / reset / 传参优先 / 传 0 用法。修一处真实缺口:customized 原以「文件是否存在」判定,reset 后仍误报已自定义 → 改为文件内显式标记(修实现不改断言)
#133情报蜂 · 预警并入站内信自动推送✅ 已落地实测P1
阈值命中的预警不再「只看不通知」:push_alerts() 把达级别预警汇总成一条站内信推给指定受众(默认运营管理员),正文含级别筛选口径、逐条明细、阈值口径,并声明「系统仅告警,不自动调价、不自动投放」。跨日去重按 (日期, 级别口径, 命中集合指纹) 判定,同日同批只推一次。受配置 auto_push 控制:开则 scan_alerts() 与流水线情报步顺带推,关则如实返回「未开启」。端点 POST /api/intel/alerts/push、GET /api/intel/alerts/push/log;情报蜂中心新增「📣 推送站内信」按钮 + 推送台账状态条;晨报 KPI 落推送条数 / 去重标记 + 正文推送句。
实测(真库):真推 8 条高危给「王先生」(消息已推送至「王先生」);同批再推 pushed=False·duplicate=True「今日已推送过同一批(8 条),跨日去重生效」,站内信未重复调用;不同批指纹不同可再推。流水线集成:配置开 → rivals_alert_push.pushed=True + KPI 落条数 + 正文「已推站内信 8 条(跨日去重)」;配置关 → disabled 如实留痕、KPI 不写推送字段。离线单测 44/44、UI 23/23 零控制台错误。交付后配置已 reset 回默认(自动推送关)——不替王先生开自动推送
#134投放蜂 · 回收台账导出 Excel 多表(按渠道分页签)✅ 已落地实测P1
单表 CSV 升级为 Excel 多表:recycle_export_xlsx()(openpyxl)产出 首表「总览」(导出时间/筛选条件/记录数/全量合计 CTR·CPC·CVR·CPA + 按渠道的汇总分布)+ 每个渠道一个分页签列明细(含表头冻结、列宽、暗金表头)。端点 /api/ads/recycle/export?fmt=xlsx(csv 走原路);投放蜂工坊新增「📊 导出 Excel 多表」按钮 + 结果面板(分页签 / 渠道分布 / 合计 / 可下载链接)。口径与 CSV 完全一致:空值一律留空不填 0;汇总比率为各列求和后重算(非逐行比率求平均),分母为 0 时留空;分页签名按 Excel 规则净化(去非法字符、截断、防撞名)。环境缺 openpyxl 时自动降级 CSV 并如实标注,绝不假成功。
实测(真库):导出 1 行 / 1 分页签(公众号长文)落盘「回收导出/回收台账_多表_20261007_015105.xlsx」,openpyxl 读回校验——分页签 ['总览','公众号长文']、总览第 9 行真值 公众号长文 1200/48/6/80/CTR 4%/CPC 1.6667/CVR 12.5%/CPA 13.3333、明细备注空值读回 None(留空不填 0)、冻结窗格 A2。离线单测 55/55(含纯空值渠道汇总全留空、降级路径、sheet 名净化)、UI 28/28 零控制台错误
#135情报蜂 · 预警推送接入定时巡检(无人值守)✅ 已落地实测P1
预警从「跑流水线才扫」升级为到点自动巡检:alert_patrol() 按配置 patrol_min(默认 30 分钟,区间 5–1440)判到点则 scan_alerts() 落账(同日 (类型,对象) 幂等去重),auto_push 开时顺带推站内信。守护线程 _loop() 新增 _intel_alert_tick(),与流水线总闸解耦(总闸关也照常巡检,与 #125 到点提醒同哲学)。纪律:巡检只做「扫描入台账 + 受开关约束的可选推送」,绝不改任何业务数据、绝不自动调价/投放;推送仍由 auto_push 单独把关(默认关)。端点 POST /api/intel/alerts/patrol(force/dry)、GET /api/intel/alerts/patrol/log;情报蜂中心新增「⏱ 定时巡检」配置行(开关 + 间隔 + ⚡ 立即巡检 + 下次时刻状态标)+ 巡检台账表。
实测(真库):默认开启·每 30 分钟;force 真跑 → 命中 10 条(高危 7),「自动推送关(仅落账)」;同日再跑 新增 0(幂等去重);开 auto_push 再跑 → 走推送分支并被跨日去重拦下(未重复骚扰);巡检台账留痕 4 条。离线单测 55/55(含未开启/未到点/dry 三态跳过、坏值夹取、_patrol_next 计算)、UI 28/28。交付后已 reset 回默认(巡检开 / 自动推送关)——开不开自动推送仍由王先生拍板
#136投放蜂 · 回收导出 Excel 加「对账」分页签✅ 已落地实测P1
#134 的多表导出再加一页:recycle_export_xlsx(include_recon=True) 落「对账」分页签 —— 四类缺口(投放未回收 / 未投先收 / 游离回收 / 指标待补)各一区块(区块标题 + 暗金表头 + 逐条明细),首部有汇总行(排期 / 回收 / 已闭环 / 缺口合计)与对账结论句;无缺口的区块显式写「(无)」。口径:对账页走全量口径(不受上方日期/渠道筛选影响,因为对账是「排期 vs 回收」的账账核对),页内 A3 明示;导出是可开可关的(include_recon=0)。端点 GET /api/ads/recycle/export?fmt=xlsx&include_recon=1;投放蜂工坊导出区新增「带对账页」勾选框(默认勾选)+ 结果面板对账摘要。
实测(真库):导出 回收台账_多表_20261007_020008.xlsx(分页签 总览 / 公众号长文 / 对账),openpyxl 读回对账页 —— A1 标题、A3 全量口径声明、A4「排期 3 / 回收 1 / 已闭环 1 / 缺口合计 0」、A5「账账相符」,四个区块按四类缺口逐块列出。离线单测 36/36(含 dry 也带对账页、渠道筛选下对账仍全量、include_recon=False 关闭、全闭环 4 个「(无)」)、UI 全绿。空值一律留空、不编造缺口
#137情报蜂 · 预警巡检结果并入每日晨报✅ 已落地实测P1
巡检不再「只在自己页面看得见」:流水线情报步读 patrol_log() 台账留痕,抽取「累计巡检 N 次 / 今日 M 次 / 最近一次命中 X 条(高危 Y)/ 下次巡检时刻 / 巡检开关态」并入晨报 —— KPI 落 7 个 rivals_patrol_* 字段 + headline 出「预警巡检」句 + 人工推送正文出【预警巡检】段。口径:今日次数按台账 date 比对当日,跨日不混算;无巡检记录时整段不写、绝不编造(B4 已验证)。
实测(真库):流水线 intel+brief 2/2 全绿;intel 步 msg 出「预警巡检累计 5 次(今日 5 次,最近命中 10 条)」;晨报 KPI 落 rivals_patrol_total=5 / today=5 / last_total=10 / last_high=7 / next=2026-10-07 02:23:12;headline「预警巡检:今日已巡检 5 次(累计 5 次),最近一次命中 10 条(高危 7),下次 …(每 30 分钟)」。离线单测 36/36(含无记录不写、巡检关时明示「未开启」)、UI 全绿。蜂群自动化底座新增巡检行
#138情报蜂 · 预警阈值按市场/品种分级覆盖✅ 已落地实测P1
在 #132 全局阈值之上加「分级覆盖表」:dev_overrides 按市场覆盖报价偏离阈值、spread_overrides 按品种覆盖争抢价差阈值 —— 不同品种/市场可各设各的(如黄芪价差阈值 30%、陇西药市偏离 8%)。逐条解析:命中覆盖用覆盖值(标 thr_src=override),否则回全局(global);写入走增量合并 + 定向删除(dev_override_del / spread_override_del),reset 一并清空;坏键 / 坏值一律丢弃(绝不臆造),越界值夹取。页面 datalist 提供真实市场 / 品种候选(取自当前压力榜 / 争抢榜,不编造)。端点 POST /api/intel/alerts/config(带 overrides 字段);情报蜂中心新增「🎯 分级覆盖」区(市场 / 品种两行 + 添加覆盖 + 逐项 × 移除)。
实测(真库 8979):基线命中 10 条 / 高危 7 / override_hits 0;可选候选市场 36 个 · 品种 7 个(取自真实压力榜 / 争抢榜)。选「甘肃兰州市场(-43.21%,high)」写覆盖 14.4% → 回读命中 thr=14.4 / thr_src=override、override_hits=1、dev_ov=1;定向删除后配置回 {};reset 后两张表清空、auto_push 仍为关。离线单测 45/45(含坏值丢弃 / 越界夹取 / 非 dict 容错 / 分级改变命中档位)、UI 取证 16/16 零控制台错误;回归 168 全绿
#139投放蜂 · 对账页加「处置建议」列✅ 已落地实测P1
把 #130 的处置动作写进对账表:Excel「对账」分页签四类缺口各加一列「处置建议」——【一】投放未回收 →「点🩹一键回填生成补录骨架(指标留空人工填)」;【二】未投先收 /【三】游离回收 /【四】指标待补 →「人工核对 / 补排期 / 补齐指标(走📣一键催办)」。页内 A6 补处置入口指路(投放蜂工坊 → 台账导出·排期对账);无缺口区块显式写「(无)/(无需处置)」。口径不变:只写「下一步该做什么」,绝不动任何业务数据。
实测(真库 8979):导出 回收台账_多表_20261007_020658.xlsx,读回分页签 ['总览','公众号长文','对账'];对账页「处置建议」表头出现 4 次、四区块建议文案齐备,A6 处置入口指路落地;当前真库账账相符(缺口 0)时四区块写「(无)」+ 建议列写「(无需处置)」,recon.advice_col=true。离线单测 45/45(含全闭环场景)、UI 取证 16/16;回归 168 全绿
#140情报蜂 · 分级覆盖批量导入 / 导出✅ 已落地实测P1
把 #138 的「一项一项加」升级为整表批量配:新增 POST /api/intel/alerts/config/import(scope=market/herb 选表、mode=merge 增量合并 / replace 整表替换)+ GET /api/intel/alerts/overrides/export(导出当前覆盖为 CSV,含注释首行,可直接编辑后回导)。解析层 _parse_override_text 支持逗号 / 等号 / 制表符 / 冒号 / 空格五种分隔与 # 注释行。口径铁律:坏行丢弃并如实回显行号与原因、越界夹取、未知 scope 明确报错——绝不臆造。情报蜂中心新增「⇅ 批量」行(导入 / 导出市场 / 导出品种 + 示例填充 + 确认导入)。
实测(真库 8979):基线命中 10 / 高危 7;批量导入 5 行 → imported=4 / skipped=1(坏值 abc)/ 夹取 1 项(999→上限 90),落库 {"甘肃兰州市场":6,"陇西首阳市场":8,"陇西药市":25,"越界市场":90};覆盖真生效——thr_src=override 三条:甘肃兰州 thr=6→高危、陇西首阳 thr=8→高危、陇西药市 thr=25→关注;导出市场块 count=4、CSV 带注释行与真值;replace 整表替换 deleted=3;导出 CSV 回导幂等;未知 scope 如实 ok=False。离线单测 56/56(含五分隔解析 / 注释行 / 坏行 / 别名 / replace / 坏值 / 空文本)、UI 取证 16/16(含 CSV 真下载捕获)零控制台错误;回归 213 全绿
#141情报蜂 · 巡检「近 7 日趋势」行✅ 已落地实测P1
在 #135 巡检台账 / #137 并入晨报之上加时间维度:patrol_trend(days=7) 按日期聚合台账(次数 / 命中 / 高危 / 新增 / 推送),产出 7 个日桶 + headline;无记录的日期如实留空(runs=0),绝不插值;days 参数 None→默认 7、0/负→夹到 1、>30→夹到 30(不把 0 当默认,语义更诚实)。接线:patrol_log() / alert_board() 内嵌 trend;端点 GET /api/intel/alerts/patrol/trend;流水线 _step_intel 写 rivals_patrol_trend → _step_brief 落 6 个 KPI + headline 句 + 人工推送正文段。前端情报蜂中心巡检区加柱状趋势条(红=含高危 / 金=仅关注 / 灰=无巡检),底座晨报区加趋势 KPI 行。
实测(真库 8979):days=7 → total_runs=5、active_days=1、total_hits=50、today_runs=5、today_hits=50、max_hits=50;7 个日桶中 10-01~10-06 如实 0、10-07 = 5 次 / 命中 50 / 高危 35。流水线 intel+brief 2/2 全绿;KPI 落 rivals_patrol_trend_days=7 / _runs=5 / _hits=50 / _active_days=1 / _today_hits=50 / _max_hits=50;headline「预警巡检趋势:近 7 日共 5 次(覆盖 1 天),累计命中 50 条,单日峰值 50 条。」。离线单测 56/56(含空台账 / 按日期聚合 / days 夹取 / 非 dict 台账容错)、UI 取证 16/16;回归 213 全绿
#142情报蜂 · 预警分级与推送级别联动✅ 已落地实测P1
在 #138 分级覆盖之上加推送级别联动:某市场 / 品种可单独指定推送级别,覆盖全局 push_min_level —— force=该目标的预警无条件纳入推送(哪怕全局只推高危、它只是达标);silent=该目标预警永久排除推送(哪怕它是高危);未配=default 跟随全局。落 intel_alert_cfg.json 的 dev_push_overrides(按市场)/ spread_push_overrides(按品种),值域严格限定 force/silent、坏值一律丢弃。解析 _push_level_for(key, ov),build_alerts 每条标 push_level;push_alerts 先按全局 min_level 取基线,再 force 补推 / silent 剔除,指纹含联动口径 #fN#sM(联动变化不会被同日去重误拦);端点 POST /api/intel/alerts/push/link(level=default 删除该项)。前端情报蜂中心每条覆盖项右侧加推送级别下拉(跟随全局 / 强制推 / 静默)。
实测(真库 8979):命中 10 条(高危 7);设 silent ← 甘肃兰州市场(高危) + force ← 连翘(未达高危) → 两者 push_level 分别回显 silent/force;真推 min_level=high → pushes_forced=1 / pushes_silenced=1,推送集 7 条中 甘肃兰州市场被排除、连翘被补推;导出 market_push/herb_push 块 CSV「键,级别」;非法 level / 未知 scope 如实报错。离线单测 54/54(含 force 补推、silent 高危剔除、指纹联动、端点三态)、UI 取证 12/12 零控制台错误;回归 269 全绿。交付后配置 reset 回默认(两张推送级别表空 / customized false)
#143情报蜂 · 巡检趋势「环比箭头」✅ 已落地实测P1
在 #141 趋势行之上加环比维度:patrol_trend 增加 dod(今日 vs 昨日:巡检次数 / 命中 / 高危三项 prev/cur/diff/dir)与 dod_text,按真值做差、方向由 diff 符号决定(0 记 flat)、绝不插值;无昨日桶(如 days=1)如实按 0 比对。接线:_step_brief 落 7 个环比 KPI(dod_text + 三项 diff/dir)+ headline 句尾追加 + 推送正文行。前端情报蜂中心趋势区加「⚖ 环比昨日」行(红升=变多、绿降=变少、灰=持平,带「昨 X → 今 Y」真值),底座晨报区加环比 KPI 行。
实测(真库 8979):days=7 → dod = 次数 ↑5(昨 0→今 5)/ 命中 ↑50(昨 0→今 50)/ 高危 ↑35(昨 0→今 35);dod_text「环比昨日:次数 ↑5 / 命中 ↑50 / 高危 ↑35」;流水线 intel+brief 2/2,KPI 落 rivals_patrol_dod_text + _runs/_hits/_high_diff·dir 共 7 项;headline 尾追加「…单日峰值 50 条;环比昨日:次数 ↑5 / 命中 ↑50 / 高危 ↑35。」。离线单测 54/54(含 up/down/flat 三向、days=1 无昨日桶、空台账 flat)、UI 取证 12/12;回归 269 全绿
#144情报蜂 · 覆盖建议「按阈值区间一键生成」✅ 已落地实测P1
在 #138/#140 之上加建议生成器:suggest_overrides(scope, obs_min, obs_max, thr, top_n) 先扫全量观测池(_obs_pool 取 pressure_all / hot_all,不截断,否则真实极值会漏),再按 |观测值| 区间筛选 + TopN 取前 N;只出建议、绝不落库(确认后走 #140 导入)。阈值未指定时自动 = 本批最小 |观测值| 向下取整 −1(确保本批全部仍触发);未给任何筛选条件时默认聚焦「已达全局阈值的对象」——否则全量池里的微小偏离(如 0.0x%)会把建议值一路拉到区间下限,建议失去意义;该默认行为如实回显 default_focus + thr_basis。返回 candidates(带当前阈值 / 是否已覆盖)+ 可直接导入的 text。端点 POST /api/intel/alerts/overrides/suggest;前端「🔎 按区间生成」行(观测区间 / TopN / 建议阈值)+「✔ 采用为导入内容」一键填入导入框。
实测(真库 8979):池 36 项 → 无筛选默认聚焦 5 项、建议阈值 24.0%(依据「默认聚焦已达全局阈值 15% 的对象;本批最小观测 25.71%」);obs_min=30 → 4 项 / thr=30.0;品种 top_n=3 → 池 7 选中 3 / thr=115.0,text 走 #140 导入后 3 条 thr_src=override 生效(黄芪 240 / 百合 152.17 / 当归 116.41 仍触发);空池如实「无可生成对象」、未知 scope 报错。离线单测 52/52(含区间 / TopN / 自动阈值 / 夹取 / 只出建议不落库 / 默认聚焦)、UI 取证 22/22 零控制台错误;回归 323 全绿
#145情报蜂 · 推送级别「按目标批量设」✅ 已落地实测P1
在 #142 之上加批量入口:bulk_push_level(scope, level, keys, from_alerts, obs_min, obs_max, mode),取键三来源并集(显式 keys / 当前命中预警 / 观测区间),mode 分 merge(增量合并)/ replace(整表重设),level=default 等价清除;只写推送级别表,不动阈值覆盖表、不动业务数据;未选中任何目标时不改配置并如实返回。端点 POST /api/intel/alerts/push/bulk;前端「⚡ 批量设级别」行(scope / 级别 / 三来源 / 模式 / 执行)。
实测(真库 8979):来源=当前命中 → 市场 5 项设 force(甘肃兰州 / 陇西首阳 / 陇西药市 / 岷县药市 / 山西市场);来源=区间 |偏离|≥30 → silent 4 项、再 default 清除 4 项(表内剩 山西市场);交叉校验:批量设级别后品种阈值覆盖表原样保留(黄芪/百合/当归 115.0);非法 level / 未知 scope / 空来源三态如实。流水线 intel+brief 2/2。离线单测 52/52、UI 取证 22/22;交付后 reset 回默认(覆盖与级别双清空 / auto_push 仍关)
#146情报蜂 · 巡检趋势「近 3 日均值对比」✅ 已落地实测P1
在 #141/#143 之上加均值视角:patrol_trend 增 avg3——近 3 日(含今日)vs 前 3 日各自按「有记录天数」摊平后做差(无记录日不参与平均、不插值);两侧都要有样本才判 comparable,否则 dir=na 并如实标注「无法对比」。单日环比易被一次抖动带偏,3 日均更稳。返回 avg3(recent / prev / diff / dir / 窗口区间)+ avg3_text;流水线写 rivals_patrol_avg3_* KPI 并在晨报正文落「预警巡检均值对比」句。前端情报蜂中心趋势区 + 底座 KPI 区同步渲染。
实测(真库 8979):真跑巡检后近 3 日 = 73 条/日(有效 1 天)、前 3 日无记录 → comparable=False、dir=na、文案「前 3 日无巡检记录,无法对比(如实标注,不臆造)」;dod 与 avg3 并存互不影响(环比 ↑7 次 / ↑73 命中 / ↑50 高危)。构造样本验证:近 3 日 18 条/3 天=6.0 vs 前 3 日 6 条/2 天=3.0 → diff +3.0 up;仅 1 天有记录时 日均按 1 天算(9.0)而非按 3 天摊;days=3 窗口不足 → prev 空、如实不可比。离线单测 38/38(含 8 组 avg3 用例)、UI 13/13;流水线 intel+brief 已带 KPI + 正文句
#147情报蜂 · 覆盖建议「按分位自动生成」✅ 已落地实测P1
在 #144 之上加分位筛选:suggest_overrides(..., quantile) 按 |观测值| 升序取 q 分位值为筛选下界(如 0.8 → 约保留前 20%);与 obs_min 同时给时取更严者(max)。仅接受 0<q≤1,坏值忽略并如实回显 quantile_error(不静默);分位下界高于显式上限时如实标注「筛选区间为空」(quantile_empty_note)。仍只出建议不落库,确认后走 #140 导入。返回 quantile / quantile_value / quantile_basis;前端「🔎 按区间生成」行加分位输入框(0~1)。
实测(真库 8979):市场池 36 → q=0.8 分位值 10.24% → 命中 8 项(兰州 43.21 / 首阳 43.21 / 陇西 36.19 / 岷县 31.88 / 山西 25.71 / 新疆 12.50 / 当归城 10.42 / 安国 10.24),text 走 #140 导入后 8 条 thr_src=override 生效;obs_min=30 + q=0.5 → 取更严者 下界 30 → 4 项;q=1.5 → 忽略 + 如实回显 + 回落默认聚焦 5 项;q=0.8 + obs_max=1 → 0 项 + 文案「分位下界 10.24% 已高于上限 1.00%,筛选区间为空」。离线单测 38/38、UI 13/13;回归 413 全绿;交付后 reset 归位(覆盖清空 / auto_push 仍关)
#148情报蜂 · 巡检趋势「多窗口均值对比」✅ 已落地实测P1
把 #146 的「3 日」单窗口泛化为多窗口:patrol_trend(days, wins) 支持任意窗口列表(默认 (3,7,30)),每窗口为「近 n 日 vs 前 n 日」,分母仍只算有记录天数;台账不足 2n 天 → 该窗口 comparable=False 并如实标注 need_days(绝不臆造对比)。days 上限由 30 提到 90(30 日窗口的对比需 60 天台账,原上限根本喂不满)。返回 wins / avgs(逐窗口 recent/prev/diff/dir/text)+ avgN_text(仅在 ≥2 个可比窗口时非空,否则留空,免得与 #146 单窗口句在晨报里重复);avg3 保留为 avgs["3"] 向后兼容。端点支持 ?wins=3,7,30;pipeline 写 7/30 日 KPI(只写可比窗口,不可比绝不编造)+ 多窗口正文句;前端趋势区逐窗口渲染(可比显示箭头与日均、不可比如实显示「台账不足 N 天」)。
实测(真库 8979):days=7 → wins=[3,7,30] 全渲染;台账仅 1 天有记录 → 三窗口 comparable=False,文案分别为「前 3 日无巡检记录,无法对比」「对比需 ≥14 天台账,当前仅 7 天」「对比需 ≥60 天台账,当前仅 7 天」;days=999 夹到 90;wins=5 → avgs 只含 '5'。构造样本(14 天台账)验证:近 7 日 10/日 vs 前 7 日 4/日 → diff +6.0 up、avgN_text 汇总两窗口;单窗口时 avgN_text 留空(晨报只出 #146 句,不重复)。离线单测 48/48、UI 13/13 零控制台错误
#149情报蜂 · 批量设级别「按预警类型一次设」✅ 已落地实测P1
在 #145 之上加按预警类型一次设:bulk_push_level(..., types) 支持 price_low 低价方(采购窗口)/ price_high 高价方(销售窗口)/ spread 争抢价差,兼容别名(low / high / 低价 / 高价 / 价差 / 采购 / 销售…,大小写无关);勾选类型即等价于开启「当前命中」并按类型筛。类型与 scope 不匹配时(如按市场却选「价差」)→ 取交集为空,如实提示「类型 spread 与 scope 不匹配(该 scope 只认 低价/高价)」而非静默返回空;无法识别的类型单独回显 types_bad 并忽略。仍只写推送级别表、不动阈值覆盖表。端点 types 支持数组或逗号串;前端「⚡ 批量设级别」行加低价 / 高价 / 价差三个复选。
实测(真库 8979):按市场 + types=["low"] → 2 家(甘肃兰州 / 山西市场)force;["high"] → 3 家(陇西首阳 / 陇西药市 / 岷县药市)silent;按品种 + 别名 ["价差"] → 5 个(黄芪 / 百合 / 当归 / 连翘 / 金银花);按市场 + ["spread"] → 0 项 + 明确提示不匹配;["低价","乱七八糟"] → 生效 2 家 + types_bad 回显。交叉校验:设级别后阈值覆盖表原样保留(陇西药市 8.0 / 岷县药市 6.0)。离线单测 48/48、UI 13/13;回归 461 全绿;交付后 reset 归位
#150情报蜂 · 巡检趋势「周同比(本周 vs 上周同星期)」✅ 已落地实测P1
单日环比(#143)易被一次抖动带偏、N 日均值(#146/#148)又只看连续窗口,本轮补按星期对齐的周同比:patrol_trend().week 给出「本周至今(周一~今日)vs 上周同期(上周一~上周同一个星期几)」,分母只算有记录天数;另附「今日 vs 上周同一星期几」点对点对比(same_dow)。为能回溯上周,把按日聚合提为全量 by_date(不受 days 窗口限制,桶结构与原实现完全一致)。上周同期无记录 → comparable=false 并如实标注不可比,绝不臆造对比。流水线写 rivals_patrol_week_* KPI 并在晨报落「预警巡检周同比」句。
实测(真库 8979):真库台账仅今日有记录 → 本周 143 条/日(有效 1 天)、上周同期无记录 → 如实「不可比」;临时注入 14 天合成台账验证可比路径 → 本周 10.0/日 vs 上周 4.0/日 → diff +6.0 ↑,点对点今日 10 条 vs 上周周三 4 条,随后台账即时复原(12 条真实记录、零污染);days=3 时窗口只有 3 天但周同比仍可比(全量回溯生效)。流水线 intel+brief 7/7,KPI 带 rivals_patrol_week_cur/dow、晨报含周同比句。离线单测 50/50、UI 11/11
#151情报蜂 · 批量设级别「按趋势方向一次设」✅ 已落地实测P1
与 #149 的「预警类型」是不同维度:#149 是横向偏离(相对同品种中位价,低价方/高价方),#151 是纵向涨跌(对象自身报价的时间方向)。bulk_push_level(..., dirs):market 取市场活跃榜的涨跌家数(up>down 走高 / down>up 走低 / 相等持平);herb 取跨市场平均涨跌幅 avg_trend。无涨跌数据的对象计入 dir_unknown 如实回显、绝不当持平;build_rivals 新增 market_activity_all 全量榜(截断会漏市场,沿用 #131 pressure_all 范式)。dirs 与 types 取并集;仍只写推送级别表、不动阈值覆盖表。前端「⚡ 批量设级别」行加走高 / 走低 / 持平三个复选。
实测(真库 8979):按市场「走高」→ 8 家(甘肃陇西 / 云南 / 山东平邑 / 甘肃岷县 / 甘肃庆阳 / 海南 / 浙江 / 山东平阴)、「走低」(别名归一)→ 11 家、「持平」→ 4 家,13 个无涨跌数据的市场如实回显未纳入;按品种 ["up","down"] → 6 个;坏方向 xyz → 0 项 + dirs_bad 回显。dir_basis 回带真实涨跌家数(如「涨 2 / 跌 0 / 平 2」)。交叉校验:设级别后阈值覆盖表原样保留(陇西药市 8.0)。离线单测 50/50、UI 11/11(零控制台错误)
#152情报蜂 · 覆盖建议「分位 + 双向区间」✅ 已落地实测P1
#147 的分位只做下界(升序取 q 分位值,约保留前 1−q)。#152 新增 quantile_hi 上界分位:取 q_hi 分位值为上界,剔除最高端 1−q_hi 的极端值;两者同给即成 双向分位区间 [q_lo_val, q_hi_val]。与显式 obs_min / obs_max 各取更严者(下界 max、上界 min)。单给上界也算给了筛选条件(不再回落默认聚焦)。分位与区间冲突(实际下界 > 实际上界)→ 0 项 + 如实说明并点名是哪一侧,绝不静默返回空。坏值单侧忽略不影响另一侧。quantile_mode 回显 分位 / 分位上界 / 双向分位区间。前端「🔎 按区间生成」行由单框扩为「分位区间 下界~上界」双框。
实测(真库 8979):单下界 q=0.5 兼容旧行为(quantile_hi=None);单上界 q_hi=0.6 → 候选全 ≤ 上界值;双向 0.3~0.85 → 0.00%~12.50% 命中 31/36 项(严格窄于全池)、quantile_basis 回显「约保留中段 55%」;obs_min=5 与分位下界取更严 → 下界 5.0;冲突 0.8 > 0.2 → 0 项 + 如实说明;坏值 1.9 → 忽略回显且下界仍生效;导入后 31 条 thr_src=override 生效。离线单测 44/44、UI 16/16(零控制台错误)
#153情报蜂 · 巡检趋势「月同比(本月 vs 上月同期)」✅ 已落地实测P1
把 #150 的「按星期对齐」范式扩到按日号对齐:month = 本月至今(本月 1 号~今日)vs 上月同期(上月 1 号~上月同日),分母只算有记录天数;另附「今日 vs 上月同日」点对点对比。今日日号超上月天数时(如 3-31 → 2 月仅 28 天)夹到上月月末并回显 clamped、文案如实标注「已夹到月末」,绝不越界取到再上月的数据。复用 _range_stat 区间统计,by_date 全量回溯不受 days 窗口限制。顺带修掉 #150 就存在的晨报词重复(原拼出「预警巡检月同比:月同比:…」)——四类对比句统一只加「预警巡检」前缀。
实测(真库 8979):台账仅今日有记录 → 本月 189.0 条/日(有效 1 天)、上月同期无记录 → 如实标注不可比、不臆造;临时注入跨月合成台账 → 本月 20.0 vs 上月 4.0 → diff +16.0 ↑、点对点 30 vs 4 → +26 ↑,days=3 窄窗口下仍可比(全量回溯生效),台账即时复原零污染。流水线 intel+brief 7/7,KPI 带 rivals_patrol_month_*、晨报含月同比句且无词重复。离线单测 44/44、UI 16/16;回归 555 全绿
#154情报蜂 · 批量设级别「按周期(本周/上周)一次设」✅ 已落地实测P1
「⚡ 批量设级别」行新增周期复选(本周 / 上周,二选一):从推送台账取该周期内推送过的 targets 并集(本周=周一~今日,上周=上周一~上周日),按 scope 过滤类型(market → 低价/高价方,herb → 价差品种);勾了 types 时台账 targets 同步按类型筛(意图一致:本周推送过的低价方)。与 keys / 当前命中 / 观测区间 / 方向五路取并集。周期内无推送记录 → period_info.empty 如实标注「取 0 项」并说明区间,绝不臆造;坏别名(如「明天」)period_bad 回显且配置不动。
实测(真库 8979):本周台账 5 条记录 23 个 targets → 按市场取并集 6 家 force(兰州/首阳/陇西/岷县/山西/新疆),阈值覆盖表未被牵动;按品种 + 上周 → 区间 2026-09-28~10-04 无推送记录 → 如实取 0 项 + 配置未改动;坏周期「明天」→ period_bad 回显。离线单测 41/41(含 types×period 组合、五路并集、别名大小写)
#155情报蜂 · 覆盖建议导出「逐条来源标注」✅ 已落地实测P1
建议结果可追溯:逐条 candidate 带 src(quantile_lo/hi=分位值 / obs_min/max=显式区间 / default_focus=自动聚焦 / pool),前端候选 pill 直接展示并放 title;text 头部加「# 来源」注释行(scope + 分位 + thr_basis + 池/选中数 + 生成时间)——#140 解析器本就跳过 # 注释 → 带来源备档、可直接回导两不误。default_focus 是自动聚焦不是显式 obs_min → 单独标注不伪装。
实测(真库 8979):q=0.8 → 分位值 10.24% → 命中 8 项、逐条 quantile_lo=10.24;text 头注释含 scope+分位+时间 → 直接喂 #140 导入 8 项 / 跳过 0 / 零报错,thr_src=override 全生效;默认聚焦 → 逐条 default_focus。UI 7/7(零控制台错误);回归 13 文件 596 全绿;交付后 reset 归位(四表空、auto_push 仍关)
#156采集蜂 · 康美「真 JS 站」翻页验证 → URL 翻页 10 页✅ 已落地实测P1
候选「康美翻页换真 JS 站验证 browser_paginate」实测两步定案:①探针监听网络——数据服务端渲染(http 就能抓全第 1 页 20 品种×6 市场=113 行,此前 grep -c 单行 HTML 误判空壳);翻页是 URL 参数 ?pageNum=N(点下一页=location.href 跳转,共 56 页,第 2 页与第 1 页品种零重叠)→ http 直翻更稳;②browser_paginate 引擎点击翻页在该站不生效(pages=1)→ 引擎保留给真无 URL 翻页站备用。落地:源级 page_tpl({page} 占位)+ max_pages(上限 60)+ _fetch_paged()(总页数截断 / 页间去重同品种+规格+市场+同价 / 首页失败=整源失败、后续页失败如实记录不炸)+ results 带 pages 元信息;升级合并给存量同名源补缺失新字段(不覆盖用户已改);前端源卡「URL翻页 N 页」标签。
实测(live 8979 dry 试抓):10 页 490 条 / 14.8s(此前单页 56 条,8.75 倍),pages={fetched:10, total:56};单测 24/24、UI 4/4、回归 19 文件全绿(累计 620 断言);dry 不入队零污染。同轮 #157 池续建推进中
#158采集蜂 · 天地网列表页「URL 后缀翻页」接入 _fetch_paged✅ 已落地实测P1
#156 康美翻页范式直接复用:实测天地网两源翻页均为 URL 后缀(1-0-0-{page}.html / 8-0-0-{page}.html,真实 href、分页条「1 / 122」格式)→ 市场源 + 产地源都接 page_tpl + max_pages=5;_total_pages() 扩展兼容天地网「<span>1 / 122</span>」格式(康美「共 56 页」不回退);升级合并改「空值即未配置」——历史 setdefault 写盘的空串/1 占位也要被内置默认补齐(live 抓到 page_tpl="" 空键骗过合并的真 bug)。
live 实测(dry 试抓):市场源翻 5 页实抓、total_pages=122 实抓;产地源翻 5 页、total_pages=32 实抓;页间去重后 got 23/22 条(解析器每页 20 行核对无误);前端采集调度台两源显示「URL翻页 5 页」标签
#160采集蜂 · miss 65 味「别名补搜」✅ 已落地实测P1
内置可审计别名表 _HERB_ALIAS(只写有把握的常用别名/炮制品基原映射,如 当归身→当归、生地炭→生地黄、紫芝/赤芝→灵芝、棕榈炭→棕榈/棕板;保护动物类/食品杂类/矿物类不硬凑);新端点 POST /pool/retry_miss:对仍无 ID 的品种依次试别名,别名全败再试一次原名兜底(应对上次跑批网络抖动假阴性);命中写入 name_map 扩池,仍搜不到如实留空;dry 试跑不写盘;前端采集调度台加「🔍 别名补搜」按钮带结果明细。
live 实测:65 味试搜 116 秒 → 别名命中 27 + 原名兜底 6 = +33 味(仙鹤草/佩兰/伸筋草等 6 味确系上次抖动假阴被救回);池 696/728 已建、650 个可用 ID;仍缺 32 味(熊胆/犀角/穿山甲/羚羊角/虎骨等保护动物、梨/粳米/饴糖/麻油等食品、京墨/黑铅等矿物)如实留空不造假;单测抓到 len(tried) 计数器真 bug 修复
#162情报蜂 · export_overrides 备档块「来源标注」✅ 已落地实测P1
推送级别表每次设置(bulk 五渠道 / link 单条联动)同步记来源 meta:{level, via, ts}——via 为渠道摘要(keys/当前命中/观测区间/趋势方向/周期 + 类型·方向·周期·replace 参数);save_alert_config 加 dev_push_meta / spread_push_meta 增量合并(None 删);alert_config() 读取透传(**真 bug:重建 dict 丢未知键,meta 写进盘读出来就没了**);default 回落删值同步删 meta;reset 一并清空。export_overrides 推送级别块 CSV 头带「# 来源标注」头行 + 逐键「# 键 ← 渠道·级别 @ 时间」注释行(**# 注释行回导自动跳过,备档/回导两不误**);来源未记录项如实标注(#162 之前设置或回导导入);前端导出 toast 带来源标注统计。
实测:单测 22/22(含必失败冒烟锁参数序);live 全链路:bulk force 2 键 → export CSV「# 亳州LIVE ← keys·force @ 2026-10-07 08:14:00」→ items 带 meta → default 回落值与 meta 同步删 → 归位零污染;注释行回导零坏行;UI 5/5 零 JS 错误;回归 24 文件 rc 全 0
#163采集蜂 · 天地网品种深度源「单品种页翻页」验证✅ 定案:无需翻页P1
实测 8/8 品种 ID(含池内 5 个):单品种页(1-{id}-0.html)分页条恒 1/1、上一页/下一页全 disabled(javascript:void(0))——全部报价(多规格×多市场 + 周/月/年涨跌)单页服务端渲染;页内 5 列涨跌榜小表是全站排行非该品种数据,不进主解析属合理设计。9 列主表解析器覆盖零漏抓(黄芪 6 规格×市场行全吃到、价格/趋势/涨跌全对)。结论:池源的「翻页」语义即多品种轮转(pool 机制已覆盖),_fetch_paged 不适用;结论固化进池源 note。
live:dry 试抓池源 24 品种轮转 37.4 秒收 64 行(dry 不入队零污染);单测 B 组固化 9 列表解析覆盖断言(3/3 行全解析、市场/规格/价/周涨跌/趋势全对);排查中先用错键名(market vs market_name)误判漏抓——**先用 repr 打印真实返回结构再下结论**
#164采集蜂 · max_pages 扩容全量覆盖(天地网 122/32 · 康美 56)✅ 已落地实测P1
内置默认调大:天地网市场 5→122 页、产地 5→32 页、康美今日 10→56 页(全量覆盖,_fetch 同域限速 1.6s,全量约 3.3 分钟);升级合并改「只升不降」地板语义——盘上值 < 内置默认抬到默认(扩容令落地),用户自己调得更大绝不压回;翻页 clamp 上限 60→200(容纳 122 页全量)。
实测:live dry 试抓天地网市场 122/122 页全抓 2334 条零错误(dry 零污染,last_got 不动);单测 15→19 条(地板抬升/用户调大不压/clamp 200 边界/None 空串未配置补齐);回归抓到 2 处旧断言与新语义冲突(C4b 期望 10 页、E5 期望 5 页)→ 按新口径更新
#165情报蜂 · 推送台账 targets 明细前端展示✅ 已落地验证P1
巡检台账区新增「推送台账 · targets 明细」面板:每次推送一行(时间/触发/级别/命中/强推·静默/结果),点行展开该次推送完整 targets 明细(类型 · 对象 · 数值 · 推送级别),取数 /alerts/push/log?limit=20;无推送如实显示空(台账只留真实记录)。
验证:UI live 20/20(前端元素齐全/接口结构四键 type·target·value·push_level 齐全/真实台账 5 次推送可渲染/输出转义防注入);两页 script 块 node --check 语法全过
#166采集蜂 · 源健康度一览看板✅ 已落地验证P1
采集调度台新增「源健康度一览」只读表格:源 / 上次运行 / 状态 / 抓到 / 新增 / 覆盖页(fetched/total_pages) / 耗时 / 错误摘要,顶部汇总「N 源 · 正常 x · 失败 y · 未跑过 z」;后端 RUNTIME_KEYS 增 last_pages,真实采集才落盘(dry 试抓零污染不动 last_got/last_pages),无翻页源如实显示「—」。
验证:UI live 12/12(含 B4/B5 dry 零污染反断言——首版误期待 dry 更新 last_got=2334,按铁律改回「不动旧值才是对的」);三源 max_pages 122/32/56 live 确认
#167情报蜂 · 巡检趋势柱状图 hover 升级✅ 已落地验证P2
原生 title(延迟约 1s、样式朴素)升级为暗金主题浮动明细卡:即时跟随、自动左右夹取不出界,显示日期/巡检次数/命中/高危(高危红色标注)/推送;柱体 hover 高亮(亮度 1.45 + 金色光晕)。事件委托到 wrap 且绑定在最终 innerHTML 之后(首版中途赋值被 headline 段重写覆盖——绑定时机必须放最后一行拼接之后)。
验证:alPtBar/alPtTip/alPtBarsWrap 元素计数正确、残留原生 title 提示已清零、两页 script 块 node --check 语法全过
#174采集蜂 · 待复核队列按来源筛选✅ 已落地实测P1
/pending 端点加 source 参数(source_id 精确匹配,空=全部);采集台状态 tab 旁加「全部来源」下拉(选项随 /sources 自动填充、保留当前选中、change 即筛),1164 条存量人工复核可按源分批审。
live 实测:无筛选 1161 条 → 按康美 today 筛 71 条、按天地网市场筛 45 条,首条 source_name 回显正确;node --check 语法过
#175晨报台 · 品种池覆盖 KPI 注入✅ 已落地实测P1
晨报 KPI 增四键:pool_total/pool_built/pool_ids/pool_coverage(读真实池台账,读不到如实不加键)。实现坑:_step_brief 内无 swarm_collect 引用 → 直用 sc 会 NameError 被 try 吞成静默失效(假通过)→ 改 try 双路 import _sc。
实测:单步 dry 直调注入 pool_total=728 / pool_built=696 / pool_ids=650 / pool_coverage=95.6;MORNING 落盘拦到临时文件真库零污染;venv 导入 OK
#178~#179采集蜂 · 缺口32味审阅处置台(排版重做=卡片式交互)✅ 已落地P1
王先生反馈旧版报告「纯文字、排版没排好」→ 整页重做为卡片式:每味一卡(品名+预分类 tag+背景提示+处置下拉+人工别名输入+备注),grid 自适应布局;人工闸门三步:逐味选择 → 「保存结论」(=拍板记录入 swarm_pool_review.json)→ 「预演执行」核对 → 「正式执行」落盘(no_pool→池台账 excluded 如实标记;manual→人工别名入 swarm_pool_review_alias.json 并试搜,搜不到如实留空)。
单测 34/34:保存合法 action 校验 / 预演零写盘 / excluded 标记 / 手补命中写 name_map / 手补未中不臆造 / 已有ID跳过 / 无结论拒绝;_retry_miss_pool 尊重 excluded 不重搜、人工别名排内置之后
#181~#182采集蜂 · 健康度近5次成功率 + 待复核台账导出✅ 已落地P1
#181 源记录加 last_runs(近5次 时间/状态/抓到,真实采集才记录、dry 不入),健康度表新增「近5次成功率」列(全绿金色、有败红色);#182 /pending/export 与 #174 同套筛选(status+source)导出 CSV,带来源标注注释行 + BOM(Excel 中文直开),采集台一键「⬇ 导出台账」按当前视图导出。
单测 A 组5条(滚动截5/残条过滤)+ E 组5条(筛选/表头/BOM);_push_last_runs 独立函数可测;三页 node --check 全过
#180采集蜂 · 第一次全量真跑(王先生亲自点单授权)✅ 已执行P0
POST /collect/run 全源真跑:新行情入待复核队列(人工闸门内)、last_pages/last_runs 真值首次落盘。此前 122 页全量仅 dry 验证过,本轮为首次真跑入队。
实测 6 分 13 秒 5 源全 ok:天地网市场 122/122 页 2334 条(新增 1365)· 产地 32/32 页 538 条(新增 516)· 康美今日 56/56 页 2659 条(新增 2351)· 排行 20 条 · 品种页 64 条(新增 2);last_pages/last_runs 真值首次落盘;待复核队列 1164→5398(新增 4231 条全部待王先生人工复核,零越闸)
#183~#184采集蜂 · 分批复核辅助 + 晨报 dry 零落盘修复✅ 已落地实测P1
#183 /pending/stats(按来源统计条数、降序)+ /pending/decide_filter(按状态+来源批量采纳/驳回,确认弹窗展示筛选与条数=人工闸门,服务端硬顶 2000 防误伤);采集台新增各源条数 chips(点击即筛选)与「⚡✓ 按筛选采纳 / ⚡✕ 按筛选驳回」按钮——5395 条存量不必再一页页勾。#184 修真坑:_step_brief dry 也写晨报台账(零污染违规)→ dry 改预演不落盘、msg 标注。
live 实测:stats=康美今日 2422/天地网市场 1410/品种深度 970/产地 556/排行 37;dry 晨报预演 pool KPI 728/696/650/95.6 注入、台账 33 条前后零变化。单测 15 条(F/G/H 组),全量回归 26 文件 rc 全 0 累计 781 断言
#185~#186晨报全链真跑 + 复核进度追踪✅ 已落地实测P1
#185 第一次全链真跑(7 步 dry=False):collect→review→content(详情页草稿)→market(营销草稿绝不发布)→intel(受 auto_push 闸门约束)→audit→brief,全链 KPI 真值入晨报台账。#186 /pending/stats 升级三态:by_source 各源带 pending/committed/rejected 计数(三态按全队列口径、count 按当前筛选视图)+ by_status 汇总;采集台 chips 加已采纳(金)/已驳回(红)占比条与队列汇总。
单测 I/J 组 10 条(59/59);全量回归累计 791 断言全绿;真跑结果见工作日志。踩坑:同步长接口被重启打断(第二次)→ 真跑结果改落盘 JSON 文件不依赖 curl 进程存活
#187~#189复核三态进晨报 + 审阅结论导出 + 铺开进度看板✅ 已落地实测P1
#187 _step_review 增全队列三态统计(须在 auto 改写前采样);晨报 KPI 加 review_committed/review_rejected/review_queued_total 三键,正文加复核进度句(零处置不占篇幅)。#188 审阅处置台加「⬇ 导出结论 CSV」(七列:分类/品名/背景预判/处置/补搜别名/备注/结论时间,带 BOM + 来源标注注释行 + 引号转义)+ 结论统计条(不建池/手动补ID/维持留空/未填)。#189 内容蜂工坊加「📈 档案库铺开进度」看板:全库 728 味覆盖进度条 + 剩余数 + 活跃日均速 + 按速 ETA(活跃日不足 2 天不给估算,如实显示 —)+ 近 N 日速率柱 + 未铺品类缺口 chips;后端 /api/content/spread。
live 实测:#187 三态真值 5395/3/0/5398 入晨报台账(35 条)、headline 含进度句;#189 spread=728/160/568/22.0%、均速 80 页/日、ETA≈7 天、未铺 top3 果实籽仁 151/全草 90/动物 65。单测新增 27 条(_test_content_spread.py)+ K/L 组 18 条;全量回归 27 文件 rc 全 0 累计 834 断言全绿
#190~#191复核进度条进晨报推送 + 审阅页批量填别名 + 铺开看板一键生成✅ 已落地实测P1
#190 复核进度可视化进晨报推送文案:新增 _rbar(pct,n=10) 纯文本进度条(非零进度至少 1 格,避免 0.1% 渲染全空、看起来像「一条都没处置」;None/非法值按 0、夹取 0~100、未满 100% 不显示全满),复核进度句升级为「已采纳…已驳回…待复核…(队列共 N)|█░░░░░░░░░ 已处置 3/5398(0.1%)」,KPI 落 review_done / review_done_pct / review_bar 三键;推送正文 = "\n".join(headline),站内信正文同步带进度条;零处置仍不占篇幅(保持 #187 口径)。前端底座晨报区加可视化进度条行(宽度=已处置占比,>0 时最小 1.5% 可见)。#191 ①审阅处置台加「🧩 批量填别名」:贴多行「品名=挂牌名」(宽容分隔符 = : : , , 制表符,空格兜底;# 注释行跳过),一键填入各卡片并自动切「手动补 ID」,清单外/格式未识别行如实报出(结果区汇总 + 明细 + 底部提示),可折叠;②工坊铺开看板未铺品类 chip 加「→生成」直达(点即按该品类建草稿,单次 ≤100,草稿非对外发布故不涉人工闸门,已生成默认跳过)。
live 实测:POST /api/pipeline/run {"steps":["review","brief"]} → KPI review_done=3 / review_done_pct=0.1 / review_bar=█░░░░░░░░░,晨报台账 35→36 条,推送正文抽检含「已处置 3/5398(0.1%)」且零重复前缀;POST /api/content/generate {"cat":"动物类","limit":3} → created=3,spread 覆盖 160→163 味、剩余 568→565、动物类缺口 65→62(真值闭环)。单测新增 29/29(_test_reviewbar.py);UI 取证 19/19 零控制台错误;全量回归 28 文件 rc 全 0 累计 969 断言全绿
#192审阅页预判填充二次确认 + 铺开看板批量排队生成 + 调度台复核进度条✅ 已落地实测P1
① 审阅处置台「按预判填充 A/B 类→不建池」加二次确认:先算影响范围(共 N 味)与会被覆盖的清单(逐味列出现值:维持留空 / 手动补ID / 未填),确认后才执行;取消则如实提示「本页未作任何改动」;已全为「不建池」时提示重复填充无副作用。② 工坊铺开看板加「⚡ 批量排队生成」:把未铺品类按缺口升序(低优先级=易清先跑)排成队列,人工确认(展示品类数 + 每类上限 + 预估页数)后串行逐个建草稿,实时显示「第 i/N:品类…已生成 X 页」并可「⏹ 停止队列」(当前这类跑完即止);明确手动触发一轮、不做无人值守定时(是否开自动留王先生拍板)。③ 采集调度台队列区加复核进度条(金=已采纳 / 红=已驳回,分母=全队列 by_status),与底座晨报口径一致。
live 实测:/api/swarm/pending/stats by_status=5395/3/0、全队列 5398、已处置 0%;串行队列 其他类/菌藻类/根及根茎类 各 limit=1 → created 各 1,spread 覆盖 163→166、剩余 565→562、三类缺口各 -1(真值闭环)。UI 取证 19/19(Playwright 真机:弹窗文案 / dismiss 零改动 / accept 生效 / 覆盖清单现值 / 队列取消不启动 / 进度条可见)零控制台错误;单测新增 40/40(_test_round21.py,含 C5 抓到的「极小占比整条不可见」真缺陷 → 已修 数量>0 保底 1% 可见);全量回归 29 文件 rc 全 0 累计 1009 断言全绿
#193审阅页一键填内置候选名 + 队列每类上限可调记忆 + 情报蜂中心复核进度条✅ 已落地实测P1
① 后端新增 POST /api/swarm/pool/alias_candidates:传品种名清单 → 返回内置别名表 _HERB_ALIAS(35 条)里有候选的映射,每味附池状态(has_id / excluded / no_id);表内没有的一律不返回(无候选=留空,绝不硬凑)。审阅页加「🎯 一键填内置候选名」:一键把命中味切「手动补 ID」并填首候选,结果区如实报「命中 N 味 · 无候选 M 味」+ 状态标注 + 无候选清单;填完仍需「保存结论」才落盘(人工闸门未改)。② 工坊队列加「每类上限」输入框(1~100,越界 clamp),值以 localStorage(ygg_q_cap) 记忆、进页面回填,替代原先生成台的 fLimit。③ 情报蜂中心推送台账区加复核进度条(与采集调度台 / 底座晨报同源 /api/swarm/pending/stats,金=已采纳 / 红=已驳回,数量>0 保底 1% 可见)。
live 实测:alias_candidates 传审阅页 32 味真清单 → 命中 7 味(芫荽 / 松子仁 / 木芙蓉花 / 木芙蓉叶 / 石楠 / 天竺子 / 枸橘,与页面 hint 的「内置别名已试未中」完全一致)、25 味如实无候选、坏入参(names 非数组)返回 ok=False 防护。UI 取证 20/20(真机 Playwright:一键填 7 味切手动 / 别名值对 / 无候选如实 / 统计条同步;上限 999→100、0→1 clamp + localStorage 写入 + reload 回填;情报蜂中心进度条三态 + 金红段)零控制台错误;单测新增 50/50(_test_round22.py:A 后端接口 16 条含确定性假池三态 + 真池冒烟,B/C/D 契约 27 条,E/F 语法与配平 6 条);全量回归 30 文件 rc 全 0 累计 1059 断言全绿
#194审阅页按池状态筛选 + 队列指定品类清单 + 复核进度按来源分解✅ 已落地实测P1
① 审阅页加「按池状态筛选」:后端 pool_alias_candidates 新增 states(对每个非空请求名据池给出 has_id / excluded / no_id,别名候选仍只取 _HERB_ALIAS 真表),前端加筛选下拉(全部 / 池内无 ID / 已有 ID / 已标不建池),只隐藏显示不动结论(统计与保存范围不变),取状态失败如实提示不静默。② 工坊队列加「指定品类」输入:逗号/顿号分隔、保序去重,只对填入品类排队(按您输入顺序)、未匹配项(已铺完或名称不符)如实报出跳过,留空则回退全量缺口升序;闸门弹窗标明清单来源与排队品类。③ 情报蜂中心复核进度条加「按来源分解」折叠面板:复用 by_source 三态,每源一行显示待复核/已采纳/已驳回 + 迷你金红占比条(数量>0 保底 1% 可见)。
live 实测:alias_candidates 传 32 味 → states 32/32 全返回(分布 no_id=32,与「32 味均为池内空缺」一致)、候选仍 7 味未变。UI 取证 30/30(真机 Playwright:筛「池内无 ID」可见=真值计数 32、「已有 ID」「已标不建池」可见=0、统计条筛选前后文本一致、显示全部还原 32;工坊指定「动物类,菌藻类」闸门文案含「指定品类 2 个 · 按您指定顺序」+ 品类缺口、取消零生成、未匹配品类如实 toast、留空回退全量缺口升序;情报蜂中心折叠展开行数=5 源且每行三态)零控制台错误;单测 52/52(_test_round23.py:A 后端 states 假池三态 + 真池冒烟,B/C/D 契约 32 条,E 语法与配平 6 条);全量回归 31 文件 rc 全 0 累计 1111 断言全绿。重构 queueGen 后同步修 _test_round21 两条锚旧文案的断言(B6/B11),非实现错
#161情报蜂 · 批量设级别扩展「本月/上月」周期✅ 已落地实测P1
#154 周期四选一:本月=1号~今日、上月=上月1号~真实月末(calendar.monthrange 取真实月末,2 月/闰月自动对);别名表扩 month/prev_month/本月/上月;三处「本周/上周」三元硬编码改 _PERIOD_LABEL 查表(新增周期不再漏改文案);坏周期提示更新为四周期;无推送记录如实 empty;前端周期复选加本月/上月、互斥提示同步。
实测:单测 29/29(本月 1号~今日 / 上月真实月末 / FakeDateTime 跨年:1月→上年12-01~12-31 / 台账按月命中与类型过滤 / 无记录如实 / 坏周期回显 / 原路径本周不回退);live 真台账:本月 10-01~10-07 命中 5 条、上月 09 月 0 条如实、本周回归 5 条不回退(default 级别零污染);UI 6/6 零页面错误;回归 23 文件 rc 全 0
#159情报蜂 · 巡检趋势「季同比 + 自定义起止日对比」✅ 已落地实测P1
季同比:本季至今 vs 上季同期,按「季内第 d 天」位置对齐;本季已过天数超上季总天数(如 Q2 第 91 天 vs Q1 90 天)夹到上季季末并如实标注 clamped(#153 月末夹取同纪律);另附今日 vs 上季同位置点对点。自定义区间对比:range_from/range_to + 可选基期(缺省自动等长前移并回显 auto_base);坏日期/起止倒序/基期倒序/无记录一律如实回显绝不臆造;两参全空 → 空壳不校验不误报(单测 B5 抓到「空参被当坏日期」真 bug)。week/month 原路径文本一字未动(#152 规矩)。前端趋势区加季同比行 + 区间对比表单(日期四框 + 对比按钮)。
实测:单测 42/42(FakeDateTime(2026-06-30) 触发夹取路径 q=2 d=91→夹 3-31);live 合成台账可比路径 ↓18.57、点对点 20 vs 30、显式基期/自动基期/倒序全路径绿、台账复原 25 条零污染;live 真库如实标注不可比;UI 18/18 零页面错误;回归 22 文件 rc 全 0(累计 663 断言)
#196审阅页「筛选结果一键全选不建池」+ 工坊指定品类记忆 + 复核来源分解点源跳转✅ 已落地实测P1
① 审阅页在「按池状态筛选」行加 🏷 当前可见 N 味→不建池:范围严格等于当前筛选可见集合(与 applyFilter 同判定 (!f)||(s===f)),被隐藏的味一律不动;走人工闸门(confirm 列出范围 + 条数 + 会被覆盖的逐味清单与当前处置),取消即零改动,改完仍需点「保存结论」才落盘;空可见集不弹窗、如实提示。② 工坊「指定品类」加 localStorage 记忆(同 #qCap 范式):change 即按排队解析同一口径(保序去重)规范化回写并落本地,进页面自动回填,清空即删记忆,全程 try/catch 兜底。③ 情报蜂中心「按来源分解」每源加「→ 查看该源」:跳采集调度台 ?src=<源ID>,调度台在源清单加载完成后自动选中该源并筛选;源 ID 不在清单时如实提示并回落「全部来源」(不静默失败)。
实测:单测 48/48(含类名↔CSS 守卫校准:自动豁免 JS 钩子类/内联样式类,并跑「伪造裸奔类必须被抓到」自测防守卫变橡皮图章);真机 UI 取证 27/27 零控制台错误——含核心闸门断言「confirm 取消后 32 味处置值零改动」、接受后 32 味全置不建池且结论统计同步、工坊 reload 后回填 + 清空删记忆(测后恢复原值)、调度台 ?src= 命中选中 / 未命中如实回落。未落盘取证:审阅页批量置不建池仅改页面状态,真库(swarm_herb_pool.json / swarm_pool_review.json)未被写入

三、一只蜂群的一天#112 底座已建成 · 七步已串联自动跑,时刻可配

00:30
采集蜂群开工采集蜂群

按品种清单依次抓取国内、国外行情站实时报价,带限速与重试

02:00
清洗校验调度层

去重、价格离群值剔除、单位归一(元/公斤)、来源标记;抓不到的数据如实留空

03:00
三级复核后入库调度层 + 内容蜂群

AI 复核 → 异常项挂起待人工抽检 → 合格数据批量落仓,自动触发大屏刷新

06:00
情报分析情报蜂群

价格异动归因、竞品动向、供需缺口,写成日报;同步产出可发布的详情页/资讯草稿

08:00
晨报推送调度层

王先生一睁眼看到:昨天抓到多少条、入库多少条、哪些品种异动、哪些要拍板

注:时段为规划建议。#112 自动化底座已按上表口径建成——现为「每日一个时刻一次串联跑完七步」(采集→复核→内容→营销→情报→审核→晨报,默认 06:30,可在「蜂群自动化底座」页随时改),错过后当天自动补跑;原则仍是"夜里跑数据、早上看结果",白天不占用系统资源做重活。采集侧已加品种深度源(自动发现品种 ID 池轮转抓单品种页:同品种多规格×多市场 + 周/月/年涨跌)与浏览器抓取通道(playwright 备用,供 JS 渲染/反爬站)。

四、必须守死的四条纪律自动化不放松治理

① 不造假

抓不到就留空、数据不足就拒出结论。预测门槛(≥3 个不同日期)由后端裁决,蜂群无权绕过。

② 已裁决不重投

已定项不得换载体回流,Agent 不得重复提交已驳回产物。

③ 创新需实测

任何新能力上线前必须有真机跑出的证据,不接受"应该可以"。

④ 人工闸门

对外发布、资金动作、口径变更三类,蜂群只能准备材料,必须王先生拍板才能落地。

药材谷 · 蜂群调度总规划 · 2026-10-06 立 · 2026-10-07 更新(#112/#113/#115/#116/#117/#118/#119/#121/#122/#123/#124/#125/#126/#127/#128/#129/#130/#131/#132/#133/#134/#135/#136/#137/#138/#139/#140/#141/#142/#143/#144/#145/#146/#147/#148/#149/#150/#151/#152/#153/#154/#155/#156/#158/#159/#160/#161/#162/#163/#164/#165/#166/#167/#174/#175/#178/#179/#180/#181/#182/#183/#184/#185/#186/#187/#188/#189/#190/#191/#192/#193/#194/#196/#195-①/#195-②/#195-③/#195-④/#108-①/#108-②/#108-③/#108-④ 落地 · #195 治理闸门与审计四项缺口已全收口 · #108 数字员工工位化 1390 位四步走已全收口 · 全部 73 卡收口) 配套页面:治理阀门总面板 · 数字员工花名册 · 自动化底座 · 营销蜂工坊 · 审核蜂中心 · 数据大屏 · 行情录入台 · 后台门户
合规与数据: 受保护动植物药材合规公示 | 图鉴实拍图补拍清单 | 报告文档中心
药材谷平台 · 涉保护物种药材一律不提供交易入口与价格信息