关于 why
why 是一项代码调查技能,用于查明实现选择背后的动机与约束。它结合代码历史和可用证据来源,并区分已记录的发现、合理推断与未知信息。
主要功能
- 01调查代码与提交历史
- 02并行调用不同证据来源
- 03明确区分结论与推断
- 04追踪可用来源的覆盖情况
- 05按结构汇报发现与来源
适用场景
- 01调查防御性代码的由来
- 02追溯设计选择背后的原因
- 03修改代码前评估相关证据
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cursor/ plugins --skill why安装后在 Claude Code 中输入/why确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/epistemics.mdinvestigator-prompt.mdsource-playbook.mdsynthesizer-prompt.mdreferences/sources/code-archaeology.mddatabricks.mddatadog.mdincident-postmortem.mdlinear.mdnotion.mdsentry.mdslack.md详细介绍
为什么
在 Claude Code 中,每个会话开始时,请先阅读Claude Code 适配器,再遵循本技能。它会将 pstack 技能中的 Cursor 名称映射到 Claude Code。
探究代码背后的动机和意图。配套的 how 技能回答代码做什么以及如何运作。why 则回答是什么因素塑造了代码的当前形态。
下面每个生成任务都指定了 pstack-models.mdc 规则中的一个角色行及默认值。将 model 设为该行的值;如果规则或该行缺失,则使用默认值。如果值为 auto 或 inherit-parent,则不设置 model。如果 Task 工具拒绝某个 slug,请使用默认值并说明这一点。如果默认值也被拒绝,则根据错误消息,选择同一系列中最接近的有效 slug。根据 poteto-mode 技能的 Subagents 部分,为每个子 Agent 选择适合任务的推理级别以及快速或标准速度。
每次生成的类型都是 generalPurpose,并设置 readonly: false(Agent 模式)。**不要使用 readonly/Ask 模式。**它会剥除 MCP 访问权限,从而禁用依赖 MCP 的调查工具和综合者的引文抽查。调查者仍不应写入任何内容。
工作姿态
以谨慎、审慎且准确的调查者姿态开展工作。诚实区分已知信息与推断。完整的置信度框架和措辞指南见 references/epistemics.md。综合者必须遵循该指南。
第 1 步:理解目标和问题
目标通常是一段代码、一种模式、一项功能或一个具名设计决策。问题通常涉及设计理由、权衡、促成因素的边缘情况、外部约束、死代码或广泛的历史追溯。
如果目标含糊不清(例如“我们为什么要这样做?”但没有明确指代),请根据对话上下文做出最佳判断(打开的文件、最近的编辑、光标位置、刚才讨论的内容)。简要说明你的理解,以便用户在你理解有误时纠正,然后继续。
第 2 步:确立代码锚点
启动调查者之前,先在线程中建立种子上下文:文件路径和行范围、关键符号(函数、类、常量)、涉及目标的最近几次提交、合并提交中的 PR 编号(主题行中符合 (#1234) 模式的编号),以及任何关联的工单 ID。运行 git blame -L <start>,<end> <file> 获取最后修改提交,运行 git log --follow -p -- <file> 获取包含重命名在内的完整补丁历史,运行 git log --oneline -20 -- <file> 查看带有 PR 编号的近期提交,并运行 git log -1 --format=%B <commit> 提取 PR 编号。然后,获取每个实质性提交对应 PR 的正文和讨论:gh pr view <number> --json title,body,author,createdAt,mergedAt,labels,closingIssuesReferences,comments,reviews。将此锚点提供给每位调查者和综合者。
第 3 步:并行启动调查者
**默认进行完整的并行调查。**目标是建立完整的覆盖图,而不是尽量精简。记录空结果,不要跳过搜索。
发现
在启动调查 Agent 之前,先列出 Cursor 环境中可用的 MCP。如果存在可用工具映射,请使用它。否则,检查 Cursor 暴露的 mcps/ 目录,找出已启用的 MCP 服务。
将每个可用的 MCP 映射到一个证据类别:
- 源代码管理历史
- 问题/工单跟踪
- 长篇文档
- 实时团队聊天
- 基础设施可观测性
- 错误/异常跟踪
- 产品分析数据仓库
源代码管理始终可通过 git 和 gh 使用。对于其他六类,根据 MCP 名称、服务说明、工具名称和资源描述进行分类。如果某个 MCP 可能属于多个类别,请选择最符合其主要证据的类别。在覆盖范围映射中记录有歧义的情况。
针对每个有匹配 MCP 的类别启动一名调查 Agent,并在同一条消息中发起,以便它们并发运行;每名 Agent 只负责一个工具或 MCP。不要让一名 Agent 覆盖多个 MCP。model:采用“why investigators”行中的模型,默认为 grok-4.7-xhigh-fast。
每名调查 Agent 的提示词为填充后的 references/investigator-prompt.md,另加:
- 所选 MCP 对应的类别手册
references/sources/<source>.md,根据references/source-playbook.md中的示例进行调整 - 如果目标代码看起来具有防御性(空值检查、重试逻辑、超时处理、速率限制、功能标志、出口防护、OOM 处理程序),则加入
references/sources/incident-postmortem.md - 代码锚点和用户的原始问题
调查 Agent 名单:每个可用证据类别一名
以下每个类别都有独特的优势,能够揭示一种“为什么”,说明见“最擅长”。据此判断预期结果、类别无结果时指出的缺口,以及仅在极少数能够明确证明无关的情况下说明跳过理由。
- 源代码管理(git 历史、用于 PR 的
gh、代码注释、测试)。始终启动,这是唯一有保障的来源。最擅长发现审查过程中记录的实现时决策依据。 - 问题/工单跟踪(例如 Linear、Jira、GitHub Issues、Plane、Shortcut MCP)。最擅长发现产品或业务层面的驱动因素。当“为什么”来自工程之外时,最有价值。
- 长篇文档(例如 Notion、Confluence、Google Docs、Coda MCP)。最擅长发现在实现成代码之前写下的长篇设计依据。
- 实时团队聊天(例如 Slack、Discord、Microsoft Teams、Mattermost MCP)。最擅长发现未曾记录到文档中的实时讨论。当源代码管理、工单和文档中的线索较少时,尤其重要。
- 基础设施可观测性(例如 Datadog、New Relic、Honeycomb、Grafana、Splunk MCP)。最擅长发现促使代码改动的基础设施与运行时实际情况。当目标代码会响应基础设施信号(超时、重试、速率限制、熔断器)时,最有价值。
- 错误/异常跟踪(例如 Sentry、Rollbar、Bugsnag、Airbrake MCP)。最擅长发现促使防御性或纠正性代码出现的具体异常和错误轨迹。对于 catch 块、空值保护、类型检查、重试及其他防御措施,最有价值。
- 产品分析数据仓库(例如 Databricks、Snowflake、BigQuery、ClickHouse、dbt、Redshift MCP)。最擅长发现影响代码的产品和数据实际情况。对于受功能标志控制的代码、由实验驱动的发布、数据迁移,以及“这个数字是从哪儿来的”这类问题,最有价值。
何时跳过调查者
只有在最终的 Sources Consulted 中提供明确的书面理由时才能跳过。以下是两个有效理由:
- 此环境中没有适用于该类别的 MCP。应将其标记为缺口,而非选择:“跳过实时团队聊天。没有匹配的 MCP 可用,因此无法搜索对话记录。”
- 已证实该来源无关,而非“可能无关”。标准很高:“跳过错误/异常跟踪。目标是一个构建时脚本,不存在运行时代码路径。”
如果范围评估表明目标只是一个单提交的简单目标,且 PR 描述已包含完整答案,那么只有在确认所有七类可用搜索都属于冗余之后,才可以直接回答。请明确说明这一点。这种情况应当很少见。
第 4 步:综合
启动一位综合者。model:why synthesizer 行中的值,默认为 claude-opus-5-5-xhigh。向其提供:
- 调查者的发现,包括任何空结果,以及有理由跳过的类别
- 代码锚点
- 用户的原始问题
references/epistemics.md中的认识论框架references/synthesizer-prompt.md中的综合者提示词模板
第 5 步:呈现
向用户呈现综合者的输出。可以为清晰起见稍作编辑,或补充对话中的背景信息,但不要改写置信度措辞。
输出格式
结构应遵循 references/synthesizer-prompt.md:问题、相关代码、我们的发现、我们可以合理推断的内容、相互竞争的假设、我们不知道的内容、Sources Consulted、置信度摘要。可酌情调整,但必须保持置信度层次清晰;Sources Consulted 中每位调查者占一行,包括没有返回结果或被跳过的调查者,并注明原因。
如果用户的 why 问题是修改此代码的前置步骤,则在 Sources Consulted 之后,将代码沿革发现转化为用于规划修改的 Preserve / Change / Avoid / Risk 约束集。
常见失败模式
- 近因偏差。假定最近的提交最具权威性。当前代码形态往往是许多早期决策逐渐累积的结果。应追溯其沿革。