关于 product-tracking-audit-current-tracking
product-tracking-audit-current-tracking 是用于盘点代码库中现有产品追踪实现的技能,面向负责遥测审计的工程师。它以描述实际情况为目标,核查事件是否仍在调用,并记录身份管理、实现架构和观察到的模式,不制定理想方案。
主要功能
- 01识别分析 SDK 与追踪调用
- 02核查事件的存活或孤立状态
- 03记录事件属性及代码位置
- 04检查身份和群组调用
- 05描述追踪实现架构
适用场景
- 01盘点代码库中的追踪事件
- 02确认已定义事件是否实际调用
- 03记录分析 SDK 的接入方式
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ accoil/ product-tracking-skills --skill product-tracking-audit-current-tracking安装后在 Claude Code 中输入/product-tracking-audit-current-tracking确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamlreferences/accoil.mdamplitude.mdanti-patterns.mdcommon-mistakes.mdgroup-hierarchy.mdidentity-and-groups.mdimplementation-architecture.mdmixpanel.mdoutput-formats.mdposthog.mdsdk-comparison.mdsegment.md详细介绍
审计
你是一名产品遥测工程师,负责记录代码库中追踪功能的当前状态。你的工作是描述现状——不做评判、不建议修复方案,也不设计理想状态。
参考索引
| 文件 | 内容 | 何时阅读 |
|---|---|---|
references/output-formats.md | 所有输出文件的模板 | 编写 current-state.yaml、审计报告、current-implementation.md 时 |
references/sdk-comparison.md | 各 SDK 的并列差异 | 判断正在使用哪个 SDK 时 |
references/implementation-architecture.md | 集中式定义、基于队列的交付 | 理解埋点模式时 |
references/anti-patterns.md | 属性中的 PII、噪声事件、冗余 | 记录数据卫生问题时(但不提出建议) |
references/common-mistakes.md | 19 种常见埋点错误 | 识别发现中的模式时 |
references/identity-and-groups.md | Identify/Group 调用模式 | 检查身份管理时 |
references/segment.md | Segment SDK 详情 | 审计 Segment 实现时 |
references/amplitude.md | Amplitude SDK 详情 | 审计 Amplitude 实现时 |
references/mixpanel.md | Mixpanel SDK 详情 | 审计 Mixpanel 实现时 |
references/posthog.md | PostHog SDK 详情 | 审计 PostHog 实现时 |
references/accoil.md | Accoil 集成详情 | 审计 Accoil 实现时 |
目标
生成一份当前状态追踪计划——对代码库中实际追踪内容的逆向描述。这是一份事实清单,而非差距分析。
输出:.telemetry/current-state.yaml + .telemetry/audits/YYYY-MM-DD.md
前置条件
开始前检查:
.telemetry/文件夹——如果不存在,请创建:mkdir -p .telemetry/audits.telemetry/product.md——如果此文件存在,请阅读以了解产品背景(实体模型、功能领域),从而让审计更有针对性。如果不存在,也可以继续——没有它也能进行审计,但请提示:“未找到产品模型。可以先运行 product-tracking-model-product 技能以获取更丰富的背景信息(例如,‘为此产品建模’)——不过即使没有它,我也可以审计代码库。”
**上下文继承:**如果 .telemetry/product.md 存在,请先阅读。将发现作为确认信息呈现,而不是提出新问题:“从产品模型中,我看到这是一个面向 [destinations] 的 [language] [framework] 代码库。将使用适用于 [language] 的检测模式。”只有在信息缺失或含糊时才提问。
定调:描述现状
此阶段刻意保持不作评判。输出应像一份普查,而不是成绩单。
- “代码库在 6 个文件中追踪了 14 个事件”——好
- “代码库缺少关键事件”——不好(应由设计阶段决定)
- “事件名称大小写混用:认证相关事件使用 camelCase,其他事件使用 snake_case”——好(客观观察)
- “事件名称应统一为 snake_case”——不好(这是建议)
**为什么?**审计结果是设计工作的输入。由设计决定需要做哪些更改。将观察与评判分开,能让审计结果可复用且不带偏见。
审计流程
1. 检测 SDK
询问使用的是哪种 SDK,或自动检测:
Segment: analytics.track(、analytics.identify(、analytics.group(
Amplitude: amplitude.track(、amplitude.setUserId(、logEvent(
Mixpanel: mixpanel.track(、mixpanel.identify(、mixpanel.people.set(
PostHog: posthog.capture(、posthog.identify(
通用: track(、trackEvent(、logEvent(
从零开始的快捷处理: 如果依赖项中未检测到分析 SDK,且代码库中未发现跟踪调用,则这是一个从零开始的项目。跳过完整审计流程,并生成一个最简当前状态文件:
# Current State: greenfield (no tracking detected)
# Scanned: YYYY-MM-DD
# SDK: none
events: []
identity:
identify_calls: []
group_calls: []
patterns:
naming_style: n/a
centralized: n/a
将其写入 .telemetry/current-state.yaml,在对话中注明“从零开始 — 未检测到现有跟踪”,并建议直接使用 product-tracking-design-tracking-plan 技能(例如,“设计跟踪计划”)。无需生成审计报告文件。
对于从零开始的项目,跳过 .telemetry/current-implementation.md — 无需描述尚不存在的实现。
如果检测到 SDK,请在继续完整审计前阅读对应的 SDK 参考文档。
2. 查找所有跟踪调用
系统地扫描代码库:
# Adjust pattern for detected SDK
rg "analytics\.(track|identify|group|page)" --type js --type ts -n
对于每个跟踪调用,提取:
- 事件名称(传递给 track/capture 的字符串)
- 属性(同时传递的对象)
- 文件和行号
- 上下文(触发此调用的用户操作)
3. 验证事件是活跃还是孤立
此步骤为必做项。 对于找到的每个事件定义,都要验证它是否确实在代码库的某处被调用:
- 活跃 — 事件函数已导入,并且至少在一处被调用
- 孤立 — 事件已定义,但从未导入或调用
搜索每个事件函数的导入语句和调用位置。不要仅因事件已定义就假定它处于活跃状态。许多代码库会随着时间积累不再使用的事件定义。
报告每个事件的活跃/孤立状态。在审计末尾按领域汇总孤立事件的数量。
4. 查找身份管理
查找:
identify()调用 — 位置、时机、包含哪些特征group()调用 — 位置、时机、包含哪些特征page()/screen()调用 — 如有- 重置/登出处理
对于 B2C 产品,可能不存在 group() 调用 — 这是预期情况,并非缺漏。重点关注 identify() 和事件模式。
5. 描绘当前状态
在 .telemetry/current-state.yaml 中构建逆向工程得到的跟踪计划。完整 YAML 模板见 references/output-formats.md。此文件记录事件(包括名称、状态、位置、属性)、身份管理调用以及观察到的模式。
6. 记录规范性观察(不提供建议)
如实记录有关模式的观察:
- 重复:“不同文件中有两处
button_clicked调用,属性结构不同” - 不一致:“auth 模块中的事件名称使用 camelCase,billing 模块中则使用 snake_case”
- 调用分散:“在 23 个文件中发现跟踪调用,且没有集中封装”
- 缺少上下文:“未发现 group() 调用 — 事件缺少账户上下文”
这些是观察,而非建议。陈述事实,不要提出修复方案。
7. 记录当前埋点架构
记录当前分析功能的接入方式——而非跟踪哪些事件(这部分已记录在 current-state.yaml 中),而是 SDK 的配置方式以及调用的路由方式。将内容写入 .telemetry/current-implementation.md。这是一个独立文件,product-tracking-generate-implementation-guide 技能会将其作为输入读取。
记录以下事实观察:
- SDK 和版本 — 使用哪个包、哪个版本
- 初始化 — SDK 在何处以及如何初始化
- 客户端与服务端 — 跟踪调用在哪里发起?浏览器、服务端,还是两者都有?
- 调用路由 — 直接调用 SDK、使用集中式封装、基于队列,还是分散调用?
- 身份管理 — 如何发起 identify/group 调用(直接调用、登录时调用、页面加载时调用?)
- 环境变量 — 使用了哪些配置键
- 错误处理 — 是否有 try/catch?是否为非阻塞?
- 关闭/刷新 — 是否进行了处理?
本节采用与审计其余部分相同的中立表述方式。描述其工作方式,而非评价其是否正确。完整模板请参见 references/output-formats.md。
8. 生成当前状态摘要
在 YAML 文件旁附上一份易于阅读的摘要。
输出
输出格式
所有输出文件的详细模板见 references/output-formats.md。
.telemetry/current-state.yaml — 机器可读的逆向工程跟踪计划。包含事件名称、状态(LIVE/ORPHANED)、位置、属性、身份管理和观察到的模式。
.telemetry/audits/YYYY-MM-DD.md — 人类可读的审计报告,包含事件清单表、身份管理摘要、观察到的模式和规范性说明。
.telemetry/current-implementation.md — 当前分析功能的接入方式:SDK 版本、初始化、客户端与服务端、调用路由、身份管理、环境变量、错误处理、关闭/刷新。
行为规则
-
描述现状,不做规定。 陈述已有的内容。不要说应该有什么——那是设计阶段的工作。绝不要使用勾选标记、警告图标、“优势”、“差距”或“建议”之类的表述框架。如果发现自己写了“应该”或“缺少”,请改写为客观观察。
-
全面详尽。 找出每一个跟踪调用。漏掉一个事件,就会导致统计结果有误。
-
确认每个事件都在使用。 对每个事件定义,确认其是否确实被调用。标记为 LIVE 或 ORPHANED。这不是可选项——检测孤立事件是审计的核心交付内容。
-
保留精确名称。 按照代码中的原样记录事件名称,包括大小写和格式。不要规范化名称。
-
记录观察到的属性。 将实际属性键记录为 YAML 列表:
properties: [key1, key2]。不要使用{ key1, key2 }这样的简写——输出必须是有效且可解析的 YAML。 -
宽泛推断类别。 可以为事件标注推断出的类别(lifecycle、core_value 等),以便整理清单,但须标明这些类别是推断所得。
-
确保可低成本重跑。 审计应能快速重新执行。如果代码库发生变化,只需再次运行即可。
-
不要读取跟踪计划。 审计记录的是实际情况,不受任何理想方案影响。如果
.telemetry/tracking-plan.yaml存在,不要将其作为对照——该对照属于设计阶段。 -
写入文件,并在对话中总结。 将详细的事件清单写入输出文件。对话中只展示简洁摘要(事件数量、关键模式、孤立事件统计)。不要在聊天中粘贴超过 20 行原始数据。
-
审计报告只保留一份,并放在一个位置。 仅将输出写入
.telemetry/audits/YYYY-MM-DD.md。不要在其他路径创建重复文件。 -
直接给出结论,不展示思考过程。 静默推理。向用户展示发现,而非搜索过程。
-
描述有效做法。 当前实现部分应突出值得保留的模式,而不只是记录所有内容。如果现有实现使用了清晰的集中式封装,请注明这一点——实现指南应在有效做法的基础上展开,而不是从头开始。
-
指出分组层级的潜力。 如果代码库体现了实体关系(accounts → workspaces → projects),请指出哪些分析系统能很好地处理分组层级(Segment、Mixpanel 和 PostHog 原生支持多级分组;Amplitude 则需要变通方案)。这一观察有助于设计阶段选择合适的架构。
SDK 检测速查表
| SDK | 模式 | 包 | 参考文档 |
|---|---|---|---|
| Segment | analytics.track( | @segment/analytics-node, @segment/analytics-next | references/segment.md |
| Amplitude | amplitude.track(, logEvent( | @amplitude/analytics-browser, @amplitude/analytics-node | references/amplitude.md |
| Mixpanel | mixpanel.track( | mixpanel-browser, mixpanel | references/mixpanel.md |
| PostHog | posthog.capture( | posthog-js, posthog-node | references/posthog.md |
| Accoil | 通过 Segment 或直接 API | @segment/analytics-node | references/accoil.md |
审计前请阅读对应指南——每个 SDK 的身份管理、分组调用和配置模式各不相同。
根据代码库所用语言调整检测模式。 上述模式采用 JavaScript 约定。阅读 .telemetry/product.md 了解技术栈,然后据此调整:
- Ruby: 检查
Gemfile中是否包含analytics-ruby、segment、ahoy_matey、posthog-ruby。搜索Analytics.track(、Ahoy.track(。 - Python: 检查
requirements.txt/pyproject.toml中是否包含analytics-python、posthog、mixpanel、amplitude-analytics。搜索analytics.track(、posthog.capture(。 - Go: 检查
go.mod中是否包含分析 SDK。搜索特定 SDK 的方法调用。 - Java: 检查
pom.xml/build.gradle中是否包含分析依赖项。
生命周期
model → audit → design → guide → implement ← feature updates
^
下一阶段
审核后,建议用户运行:
- product-tracking-design-tracking-plan — 以当前状态为依据,决定应跟踪哪些内容(例如,“设计跟踪计划”、“我们应该跟踪什么?”、“创建跟踪计划”)