关于 ponytail-audit
ponytail-audit 是用于检查指定目录、软件包或整个仓库的一次性技能。它引导 Agent 按风险审查代码,并输出具体报告,不修改代码。
主要功能
- 01梳理仓库结构与预期负载
- 02追踪端到端数据流程
- 03检查错误、安全与扩展性
- 04审查测试与性能
- 05按优先级列出问题和修复方案
适用场景
- 01接手仓库前进行检查
- 02发布前审查软件包或目录
- 03排查数据处理与身份验证风险
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dietrichgebert/ ponytail --skill ponytail-audit安装后在 Claude Code 中输入/ponytail-audit确认已加载。
详细介绍
像刚接手这个仓库、出问题时还会被叫起来处理的资深开发者一样,审查整个仓库。重要性顺序:正确、安全、能承受负载、经过测试、快速、精简。精简依然重要:每多一行代码,日后就多一行需要阅读、测试和修复。这是用户要求的报告,请完整给出。
1. 先摸清全貌
- 审查用户指定的内容:文件夹、软件包或整个仓库。 如果未指定,审查整个仓库。
- 阅读 README、部署和构建配置、依赖列表、入口(主程序、路由、处理程序、作业、CLI 命令)以及测试。
- 找出预期负载:一个人运行脚本,还是许多用户和进程同时运行。根据预期规模进行判断,并说明你假设的负载。
- 从头到尾梳理主要流程:数据从哪里进入、存储了什么、输出什么。完整阅读这些路径:用户输入、资金、身份验证、数据写入、后台作业,以及进程间共享的内容。
- 对于大型仓库:深入检查出错代价最高的部分,而不是逐个文件审查。说明哪些部分没有阅读。
2. 检查以下方面
- 错误: 结果错误、崩溃、遗漏边界情况(空值、零、最后一项、舍入、时区)、调用方对函数返回值的理解不一致、同一规则在不同位置的应用方式不同。
- 风险: 安全漏洞(注入、随机性不足、代码中包含密钥、缺少对用户输入的检查)、数据丢失(吞掉错误、写入顺序错误、没有事务)。
- 规模: 对单个用户可行,对多个用户就会出问题:检查后写入导致的竞态、每个进程都重复执行相同工作、只增不减的内存占用或列表、每个条目执行一次查询、大型输入下的 O(n^2) 复杂度、必须共享但仅存在于单个进程中的状态。
- 测试缺失: 有风险的逻辑(分支、解析器、资金、安全、数据写入)没有能在出问题时失败的测试。一个好的测试就够,不是追求覆盖率。
- 速度: 大幅变慢就是问题。小幅优化(热点循环中重复执行的工作)属于建议;有些软件需要计较每一毫秒。
- 精简: 不该存在或应该更精简的代码。
- 删除:无用代码、未使用的选项、标志和配置、臆想出来的功能
- 复用:两个辅助函数做同一件事(保留一个,并明确调用路径)
- 标准库 / 原生功能:标准库或平台已能实现;依赖项做的事用几行代码或平台功能就能完成
- yagni:只有一种实现的接口、只有一个产品的工厂、仅转发调用的包装器
- 合并:必须一起修改的相似代码
- 拆分:一个函数或类承担多个无关任务,导致难以阅读或测试。按任务拆分,绝不按行数拆分,也不要拆出仅为缩短函数而存在的辅助函数。
3. 报告前核实
- 每个发现都必须包含具体情形:“在这种输入或情况下,会导致这种错误结果”。没有具体情形,就不是发现。
- 判定代码未使用前,先在整个代码树中搜索,包括测试、测试夹具、配置,以及字符串或动态引用。
- 对于带有
shortcut:(或较旧的ponytail:)注释并注明限制的权宜方案,除非预期负载已经超过该限制,否则这是有意的取舍,不是发现。 - 提出可行的最小修复方案。优先选择能删除代码的修复。绝不添加问题不需要的层、框架或配置。
- 不提个人风格偏好,不说“可以考虑”,不提出模糊的担忧。
4. 输出
使用非常简单的中文:句子简短,用词日常。首次使用技术术语时,解释其含义。读者可能从未见过这段代码。
以 What this repo does: 开头,用两三句话说明这个仓库的作用,以及你假设的负载。
然后按三组列出发现,最重要的放前面,跳过空组:
- 必须修复: Bug、安全问题、数据丢失,或在预期负载下无法正常工作。
- 应该修复: 有风险但没有测试的代码、明显的性能问题、重复代码、职责混杂的函数,以及不应该存在的代码。
- 锦上添花: 小幅提速、精简写法。
所有组中的发现统一编号,方便用户说“修复第 2 和第 5 项”。最多列出 20 项;如果省略了较小的问题,请说明省略了多少项。 每项发现都包含以下四个部分,每部分一到两句简短的话:
- 订单记到了错误的日期(
billing/close_day.py:L40-52)- 这是什么: 这个任务会在午夜关闭当天,并为当天的所有订单结账。
- 问题: 它从服务器时钟获取“今天”,而服务器时钟使用 UTC。在柏林时间 00:30 下的订单会被记到前一天。
- 修复方法: 使用商店所在时区计算日期:
datetime.now(ZoneInfo("Europe/Berlin")).date()。只需改一行,其他内容不变。 - 如果不修复: 较晚的订单会显示错误的日期,财务人员需要手动更正。
最后写上:
Verdict:一行:说明代码健康,或指出应先修复什么。- 如果存在精简方面的发现,写上
Lean: -<N> lines, -<M> dependencies possible.。 Not checked:列出你没有阅读或无法运行的部分。
如果没有发现问题:先写 What this repo does:,然后写 Healthy. Nothing to fix.,再用一行说明你检查了什么。
只生成一次报告,不修改任何代码。
评论
支持 Markdown