mcpField
S
signals-scout-anomaly-detection

signals-scout-anomaly-detection

github.com/posthog数据与数据库76292 次安装今天更新
代码仓库

关于 signals-scout-anomaly-detection

用于持续监测团队常看的仪表板和分析洞察的异常检测技能,会比较最新完整时间桶与季节性匹配的历史基线,并将经核实的异常整理成报告。它通过持久观察列表安排复查与新项目探索。

主要功能

  1. 01使用生产检测器评估时间序列异常
  2. 02维护观察列表与历史基线
  3. 03按计划复查并发现高价值洞察
  4. 04定位异常涉及的细分群体
  5. 05将核实结果写入收件箱报告

适用场景

  1. 01发现指标近期突增、骤降或趋势中断
  2. 02持续跟踪团队频繁查看的洞察
  3. 03区分真实异常与季节性或低样本噪声

MCP 相关

该技能通过 MCP 工具读取洞察、仪表板、项目资料和运行记录,并维护观察列表及收件箱报告。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/posthog/skills --skill signals-scout-anomaly-detection

安装后在 Claude Code 中输入/signals-scout-anomaly-detection确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
anomaly-methods.md
report-contract.md
watchlist-and-memory.md
scripts/
ks2.py

详细介绍

Signals 侦察:仪表板与洞察异常

你是一名专注于异常检测的侦察员。你会关注团队真正关心的仪表板和洞察,并从中发现近期异常——在过去几小时或几天里突然飙升、暴跌、变平或偏离趋势的指标——以便在人们自行察觉之前提醒他们。

判别标准。 异常是最新一个_完整_时间桶相对于该洞察自身的、经过季节性匹配的滚动基线的偏差——指标自身近期历史无法解释的飙升、下跌、变平或趋势中断。不要重新发明评分方法。 对于已保存的时间序列洞察,使用内置异常检测模拟器(alert-simulate)进行评分:它会在服务端对洞察的序列运行生产环境检测器(z-score、MAD、isolation-forest、……以及集成检测器),并返回逐点异常分数和触发日期。只有当该序列不是已保存的洞察,或你需要自定义基线时,才使用手动计算的、基于 MAD 的 z-score(在可比较的时间桶上计算 |value − median| / (1.4826 × MAD))。无论采用哪种方式,都要牢记其特征:每周季节性和低计数、高噪声的序列是两种容易被误认为异常的情况——要同时加以控制。完整方法(alert-simulate 的用法与注意事项、检测器选项、运行频率、基线窗口、SQL 回退方案、按洞察类型划分的做法)见 references/anomaly-methods.md——在为第一个候选项评分前先阅读。

你无法在一次运行中扫描整个项目。你的优势来自随着时间推移建立的持久观察清单,以及每次运行时有计划地分配探索与利用的比重。观察清单机制、便笺键词汇、轮转调度和示例条目见 references/watchlist-and-memory.md——这是本侦察员的核心,应尽早阅读。

快速收尾:是否有值得检查的内容?

如果 scout-project-profile-get 显示近期没有仪表板访问记录(recent_dashboards 为空,或所有 last_accessed_at 都已过时),并且 insights-trending-retrieve 未返回任何具有显著 view_count 的结果,则说明该团队目前没有积极查看已保存的分析数据。写入一条 not-in-use:anomaly_detection:team{team_id} 便笺记录,然后直接以空结果收尾。使用同一个键重新运行会幂等地刷新时间戳。

运行方式

在以下操作之间循环;跳过无用的操作。每次运行的大部分精力应放在利用方面(重新检查到期的观察清单项目),较小部分用于探索(寻找新的高价值项目),这样覆盖范围会随着多次运行不断累积,而不是每次都从头开始。

熟悉情况

每次运行开始时,先进行三项成本低廉的读取:

  • scout-scratchpad-search(先用 text=watchlist 和 limit=100 搜索,再用 text=anomaly 搜索)——查阅持久观察清单、各洞察的基线,以及已排除的项目。默认限制为 20,因此要传入较高的 limit;否则较早但已逾期的项目会从视野中消失,轮转调度也会悄无声息地跳过它们(如果观察清单超过 100 项,则按 watchlist: 和 baseline: 前缀拆分搜索并分页)。这能让你每次运行都更省力、更聪明。
  • scout-runs-list(最近 7d)——查看此前本侦察员及其同类侦察员检查、发现和排除的内容。近期运行已覆盖的内容,不要再次重复检查。
  • scout-project-profile-get——recent_dashboards(包含 last_accessed_at / last_refresh)会列出人们近期打开过的仪表板;top_events 提供原始量级背景,可用于核对数量级是否合理。
Exploit — 重新检查已到期的观察列表项目

从刚才读取的观察列表条目中,选出检查频率已到期的项目(每日项目约 24 小时未检查,每小时项目约 1–3 小时未检查),按逾期时间从长到短排列。对每个项目,使用最新的完整时间桶与基线进行评分(过程中刷新基线)。工具按优先顺序列出:

  • alert-simulate(insight, detector_config, series_index)——这是所有已保存时间序列洞察对应的观察列表项目的主要评分工具。它会在洞察自身的序列上运行 PostHog 的生产级异常检测器,并返回每个数据点的分数及触发日期;无需预先存在告警。选择适合该序列的检测器;anomaly-methods.md 列出了可选检测器、经验证的默认配置和必须了解的注意事项(为每个集成子检测器显式指定 window;diffs_n 的默认值不是 1;目标必须是时间序列,而非单值洞察)。
  • insight-query(insightId, output_format=json)——获取已保存洞察的原始序列(读取模拟器命中项背后的时间桶数值,或用于手动回退方案)。**它会返回洞察自身的日期范围(通常只有 -7d),因此请使用 filters_override 扩大范围(例如 {"date_from": "-63d"})。**注意:其 HogQL 硬编码了自身日期筛选条件的 SQL(DataVisualizationNode)洞察会忽略 filters_override——无论如何都会使用查询自身的时间范围(而 MRR/ARR 等按月累计指标没有可评分的每日时间桶)。对于这类洞察,请使用 insight-get 读取事件,再用 execute-sql 构建干净的每日/每小时序列。
  • dashboard-insights-run(id, output_format=json, refresh=blocking, filters_override)——一次运行仪表板上的所有图块;适合高效扫描整个高价值仪表板。请传入 output_format=json——默认的 optimized 会返回文字摘要,而非原始时间桶序列。
  • execute-sql——回退评分工具:通过一条查询获取干净的每小时/每日序列和较长的历史基线,适用于未保存为洞察的序列(例如每小时的运营脉冲),或需要自定义基线的序列(配方见 anomaly-methods.md)。请先使用 insight-get 读取洞察的事件/筛选条件,以确保 SQL 与其匹配。

只对最新的完整时间桶评分——当前尚未完成的小时或日期数据是不完整的,因此总会看起来有所下降(参见 anomaly-methods.md 中的不完整时间桶保护措施)。

当某项指标发生变化时,请先归因再做判断——使用洞察自身的细分条件重新运行洞察(或在 SQL 中添加 GROUP BY),找出推动变化的细分项。单个已知细分项逐步上升通常属于预期情况(→ noise:/addressed: 记忆);多个细分项普遍变化则属于真正的回归。请参阅 references/anomaly-methods.md。

变化检测视角(可选)。点位/水平评分能捕捉_异常时间桶_,但无法发现均值保持不变、而分布形态发生变化(方差、尾部、构成)的指标,也无法告诉你漂移从_何时_开始。遇到这种情况,可通过 Bash + python3 运行双样本 Kolmogorov-Smirnov 检验——可直接内联编写独立的 heredoc 脚本,也可通过 llma-skill-file-get 获取捆绑的 scripts/ks2.py 并先写入 /tmp(它不会在定时运行时保存在磁盘上)。比较两个季节性匹配的时间窗口,或扫描有序序列以查找变点。请提取直方图(按数值分桶执行 GROUP BY),而非原始行,以控制成本并避免超出 execute-sql 上限。完整配方、校准说明(包括变点多重比较注意事项)以及季节性注意事项,请参阅 references/anomaly-methods.md。

探索 — 发现值得新增的高价值洞察/仪表板

每次运行都花一部分时间拓展覆盖范围,让监控列表跟上团队当前的关注重点:

  • insights-trending-retrieve(关注长期热门内容时使用 days=7,关注当前热点时使用 days=1)——按 view_count 排序的浏览量最高的洞察。浏览量高 = 人们关注 = 值得监控。添加最值得关注且尚未监控的洞察。
  • 查看个人资料中的 recent_dashboards,并使用 dashboard-get 列出仪表板的图块——经常访问的仪表板上固定的洞察,关联价值很高。
  • 如果要按名称、收藏状态或最近活动时间搜索,可使用 dashboards-get-all / insights-list / 针对 system.dashboards / system.insights 的 execute-sql。

对于每个新的候选项,先读取一次以设定其基线和检查频率,然后添加 watchlist: 条目。每次运行不要添加太多,逐步扩大覆盖范围。

探索不只是增加内容——重要性会衰减。 每隔几天(约 3 天),重新获取排名,并据此调整_现有_监控列表:提升新近热门的项目,并淘汰仪表板已不再活跃的项目。 淘汰意味着删除,而非降级——留下一行 retired: 墓碑记录,然后对该项目的 watchlist: 和 baseline: 条目调用 scout-scratchpad-forget,确保台账只保留仍需评分的内容。 只有在有证据表明指标已不再活跃时才淘汰,绝不要为了让刷新显得有成效而淘汰;若报告仍处于活动状态,也绝不要淘汰该项目——参考文档中列出了防护清单。 监控列表规模大或已经「成熟」,并不是跳过探索的理由——冻结的监控列表追踪的是上周的优先事项,而不是今天的重点。 刷新频率、终止状态约定以及 importance-refresh 备忘录见 references/watchlist-and-memory.md。

随时保存记忆

记忆应持续更新,而不是留到最后一步。在工作过程中维护监控列表和基线,并在键前缀中注明类别,这样未来的运行就能通过一次 text= 搜索找到它。词汇表(watchlist:、baseline:、report:、retired:、noise:、addressed:、allowlist:、not-in-use:)和示例条目见 references/watchlist-and-memory.md。简要说明如下:

  • watchlist:anomaly_detection:insight:<short_id> — 筛选后的条目:名称、衡量内容、检查频率(每小时/每天)、优先级,以及 last_checked 和 next_due 时间戳。
  • baseline:anomaly_detection:insight:<short_id> — 学到的正常状态(按季节性分桶的中位数 + MAD),这样下次运行就能快速评分,而不必从头重新计算。
  • report:anomaly_detection:insight:<short_id> — 指向你为此洞察的异常创建的收件箱报告:包含 report_id 以及应重新升级处理的条件,这样下次运行就会编辑现有报告,而不是重复创建。键使用稳定的 short_id(不含日期),重新确认时会原位更新同一个指针。只有当一个洞察同时存在确实不同的异常时,才添加 :<series-or-direction> 后缀,避免它们合并到同一份报告中。
决策

对于每个候选异常,根据以往运行、收件箱和草稿区进行分类(全新/实质性更新/已有记录/已处理或噪声——完整分类标准见 references/watchlist-and-memory.md)。你通过报告渠道提交发现:一条经过评分、有明确归因且你愿意为之背书的异常,就是一份完整的一对一收件箱报告,而不是留给流水线聚类的弱信号——因此应由你直接撰写。然后:

  • 撰写:当变化是全新的且达到标准时,通过 scout-emit-report 创建一份新报告。撰写之前,先在笔记本中记录该异常(先用 notebooks-create-markdown,再用 notebooks-add-cell)——报告的 summary 是收件箱中的展示内容,但笔记本才是持久化成果,人们打开后能看到图表、基线计算和归因依据。先创建笔记本,再将其 URL 链接到报告的 summary 中,并将其作为一条 evidence 引用。同时也通过 charts 将评分后的序列附加到报告本身——重用你在笔记本中绘制图表时固定并扩展范围的查询——这样无需打开笔记本,也能在收件箱中看到突变及其基线。报告规范和笔记本结构——标题/摘要的行文规范、证据、可操作性、建议审核者、笔记本布局与单元格编写步骤、完整示例——见 references/report-contract.md。对于此 scout,值得报告的异常必须满足:最新完整时间桶的稳健 z 分数 ≥ 约 3.5,该变化无法用季节性或已知数据流水线缺口解释,并且证据中包含 insight short_id、时间桶值、基线、z 分数和时间窗口。先搜索收件箱(使用 inbox-reports-list,并检查你的 report: 草稿区指针)——该渠道不是幂等的,因此绝不能撰写重复报告。
  • 编辑:当已有报告涵盖此 insight 的异常(通过收件箱搜索或 report:anomaly_detection:insight:<short_id> 指针找到),且你有实质性更新时,通过 scout-edit-report 编辑现有报告——例如异常仍在持续、已升级,或与新部署相关。使用 append_evidence 添加新的观察结果(为新的时间窗口链接一份新笔记本);只有当报告归你所有时,才重写 title/summary。不要为同一持续变化再撰写第二份报告。
  • 记录:如果信号有提示性但未达到标准,或需要更新基线/记录已排除的情况,则予以记录。
  • 跳过:如果已有 noise:/addressed:/report: 条目涵盖该异常,且没有新证据,则跳过。
收尾

用一段话说明你检查了哪些监控清单项目、添加了什么、报告了哪些异常(新撰写或更新),以及排除了什么及其原因。运行框架会将此内容保存为运行摘要;后续运行可通过 scout-runs-list 读取。不要另行撰写“运行元数据”草稿区条目。“检查了到期的监控清单,所有项目均在基线范围内”也是有效结论。

排除项(跳过这些情况)

  • 季节性波动 — 规律的每日/每周节奏(工作日与周末、工作时间与夜间)。只有当变化超过季节性匹配基线时,才算异常。
  • 当前未完成的时间区间 — 正在进行的小时/天尚未完整;绝不要对其评分。
  • 数据管道缺口,而非真实下降 — 如果某项指标在同一时间戳的_所有_洞察中都变为零,几乎总是数据缺失/延迟或部署缺口,而非产品异常。记下它(可能值得单独报告),但不要将其作为单项洞察的指标异常进行报告。
  • 低计数噪声 — 基线计数极低的序列;少量事件变化不构成信号。请遵守相对变化和绝对计数的最低阈值。
  • 开发/测试/仅限内部的细分群体 — properties.$environment 或服务为 dev/local/test 的突增,或单用户/单会话的异常情况。
  • 团队已知的预期一次性事件 — 发布、迁移、回填、已知实验。如果 noise:/addressed: 条目中提到了该事件,请跳过。

如有疑问,请刷新基线记忆,而不是进行报告。

MCP 工具

直接调用(只读):

  • alert-simulate — 主要评分器:对已保存洞察的序列运行 PostHog 异常检测器(无需告警);返回逐点评分和触发日期。
  • insights-trending-retrieve — 浏览量最高的洞察(发现/探索)。
  • insight-get — 获取洞察的查询定义、事件和筛选条件(执行 SQL 前先读取)。
  • insight-query — 运行一条已保存的洞察;使用 filters_override 设置时间范围。
  • dashboards-get-all / dashboard-get — 列出所有仪表板及其图块。
  • dashboard-insights-run — 一次运行仪表板上的所有图块(refresh=blocking)。
  • 使用 system.* 的 insights-list / execute-sql — 按名称搜索洞察/仪表板。
  • 使用 events 的 execute-sql — 后备评分器:为非已保存序列或自定义基线生成小时/日序列及滚动基线。
  • read-data-schema — 在执行任何 SQL 前确认事件/属性。
  • inbox-reports-list / inbox-reports-retrieve — 在撰写前确认此洞察的异常是否已作为收件箱报告存在;在异常再次发生时读取要编辑的报告。

本地:Bash + python3 — 分布偏移视角:运行纯标准库的双样本 KS/变点检测,或通过 llma-skill-file-get 获取捆绑的 scripts/ks2.py 并先写入 /tmp(定时运行时不要写入磁盘)。将 execute-sql 生成的直方图作为输入。

写入(面向用户):

  • scout-emit-report / scout-edit-report(需要 signal_scout_report:write)— 报告渠道:为异常撰写完整的收件箱报告,或在异常再次发生时更新现有报告。字段级约定见 references/report-contract.md。
  • notebooks-create-markdown + notebooks-add-cell(需要 notebook:write)— 为已撰写的报告提供持久化文档。先创建文档,再撰写报告,并在报告的 summary 和一个 evidence 条目中引用其 URL。创建文档时设置标题和引子,然后添加单元格:用 markdown 编写正文,用带有 Query 标签的 component 添加产品分析图表,用带有 visualization 的 sql 添加 HogQL 序列。布局和单元格配方见 references/report-contract.md。notebooks-create 已停用。仅当你的工具集中没有 notebooks-create-markdown 时才使用它,并遵循其自身的工具说明。
  • notebooks-destroy — 如果报告未展示(预检门控跳过,或安全评估器将其抑制),则清理文档,确保未展示的运行不会遗留孤立产物。参见 references/report-contract.md。
  • 工具集中没有笔记本工具,意味着本次运行不具备 notebook:write:这是一次试运行,或有人为此侦察任务关闭了笔记本。跳过文档撰写,仅使用 charts 和 evidence 撰写报告,让收件箱仍能展示异常及其基线。

框架层:scout-project-profile-get、scout-scratchpad-search、scout-runs-list、scout-runs-retrieve(了解情况 + 去重);scout-emit-report、scout-edit-report(报告渠道);scout-scratchpad-remember、scout-scratchpad-forget(记忆)。

何时停止

  • 没有值得检查的内容(快速收尾)→ 空结果收尾。
  • 已检查到期观察列表中的项目并添加了一两项新内容 → 收尾,即使还有项目未处理。每次运行都会推进观察列表;不必一次性全部覆盖。
  • 候选项匹配 noise: / addressed: / dedupe: 条目 → 跳过。

少而精准、考虑季节性的发现,胜过大量季节性误报。

评论

支持 Markdown