test:triage – 测试失败智能分诊 Skill

3周前更新 7 0 0 0

testtriage 是用于指导 AI Agent 对 Antithesis 测试平台产生的失败测试结果进行排查与分类的 Skill,帮助判断失败是真实缺陷、环境抖动还是用例本身问题,适合在持续测试流程中快速定位并归类问题。

Skill 安装

多 Agent 安装
npx skills add https://github.com/antithesishq/antithesis-skills --skill testtriage

使用 npx skills 快速安装,支持将 Skill 添加到多个兼容的 AI Agent。

Skill 调研报告

Skill 详细介绍

antithesishq/antithesis-skills#testtriage 是 Antithesis 官方 Skills 仓库中的一个 Skill,名称可识别为 testtriage。它面向的是测试结果分析这一环节,核心目标是帮助 AI Agent 对测试运行后产生的失败、异常或不确定结果进行归类、判断和优先级排序,从而让开发者更快定位真正需要处理的问题。

它不是一个独立运行的软件,也不是一个测试执行框架。它更像是一套面向 AI Agent 的工作方法或指令集:当你把测试输出、日志、失败用例、CI 结果交给 Agent,并要求它做分流判断时,这个 Skill 会引导 Agent 按照测试分诊的思路,区分阻塞性问题、偶发失败、环境问题、已知缺陷、需要进一步调查的项,并给出相对结构化的处理建议。

核心用途大致包括:

– 对一批测试失败结果做分类和优先级排序
– 区分真正由代码变更引起的问题与噪声、环境或基础设施问题
– 从失败信息中提炼关键线索,帮助缩小排查范围
– 产出更适合直接跟进的分诊结论,而不是把原始日志原样抛回给用户

它解决的主要问题是:测试数量一多,失败输出往往又长又杂,人工逐条看不现实,全丢给 Agent 又容易得到笼统总结。testtriage 的价值在于让 Agent 用更接近工程实践的判断逻辑处理测试失败,输出更有可操作性的结论。

适合的使用者包括:日常维护较大测试套件、经常面对 CI 失败、需要对失败结果快速定级的工程师和测试人员。不适合的需求是:把它当成测试框架来跑测试,或期望它自动修复失败代码。它处理的是测试结果的判断和分流,不是测试的执行,也不是缺陷的自动修复。

关于它的具体实现细节、依赖以及是否调用第三方平台,当前公开资料未明确说明,建议以该 Skill 在 Antithesis 官方仓库中的当前说明为准。

Skill 安全评估

总体判断:作为一个测试结果分诊类 Skill,它本身的主要行为是读取和分析测试相关输入并给出判断,通常不涉及主动执行破坏性操作。风险高低更多取决于你所在的 Agent 环境给它开放了哪些权限。

需要关注的点:

– 来源可信度:该 Skill 来自 Antithesis 官方 Skills 仓库,来源相对明确。使用前仍建议确认仓库当前状态。
– 文件读取:测试分诊需要读取测试输出、日志、失败用例等文件。这是它的正常用途,属于合理读取范围。如果你不希望它接触敏感目录,应限制可访问路径。
– Shell 执行:如果 Agent 具备自动执行 Shell 的权限,它可能运行测试或收集日志的命令。与分诊用途相关的读取类命令属于正常范围;如果不需要,可以关闭 Agent 自动执行 Shell 的能力,改由你手动运行并把结果交给它。
– 网络访问:如果它需要拉取 CI 结果或远程日志,可能涉及网络访问。是否需要,取决于你的测试数据存放位置。
– 凭证泄露:如果测试日志中混有 Token、API Key、Cookie 等内容,把这些日志交给 Agent 时存在敏感信息暴露的风险。这是使用此类 Skill 时最实际的风险点,建议在提供测试数据前先做清理。
– 供应链风险:任何来自外部仓库的 Skill 都应关注其后续更新是否引入新行为。

降低风险的建议:

1. 只提供必要的测试输出,避免整目录无差别投喂。
2. 提交日志前清除或脱敏凭证信息。
3. 如果只需要它做判断,关闭 Agent 自动执行和自动写入权限。
4. 对生产环境相关的测试数据保持谨慎。

没有可靠依据表明它是 100% 安全,也不宜把它描述成完全无风险。按用途开放权限即可。

Skill 使用要求

一、Agent / 客户端

该 Skill 来自 Antithesis 的 Skills 仓库。当前官方没有提供完整的第三方 Agent 兼容列表。

从 Agent Skill 的一般工作方式看,在支持 Skills、自定义 Skill 或类似指令加载机制的环境中通常可以尝试使用,例如 Claude Code、Codex、Cursor、Trae、OpenClaw、WorkBuddy。不同 Agent 的 Skill 加载方式和兼容程度可能不同,具体以对应 Agent 当前版本为准。

请把“官方支持”和“通常兼容”区分开:该 Skill 的官方定位不等于对上述所有 Agent 的官方认证。

二、运行环境 / 依赖

| 项目 | 要求 |
|—|—|
| Agent | 支持 Skills 或类似指令加载机制的 Agent 优先 |
| 测试数据 | 需要提供测试输出、日志或失败用例等分诊输入 |
| 其他工具 | 是否依赖特定测试框架或 CLI,当前官方资料未明确说明 |

是否需要 Node.js、Python、Docker 等具体环境,取决于该 Skill 当前官方说明,建议以官方仓库为准,不要预先假设。

三、权限

– 文件读取:通常需要,用于读取测试输出和日志
– 文件写入:视实现而定,可选
– Shell:视实现而定,可选;若不需要自动执行,可关闭
– 网络:仅当需要拉取远程测试结果时可能用到,可选

这些权限本身并不等于危险。是否开放,应以你的实际使用场景为判断依据。

四、账号 / API Key

– Skill 本身是否需要账号或 API Key:当前公开资料未明确说明。
– 后续处理的测试项目是否需要凭证:取决于你的测试环境和数据来源,与 Skill 本身是两回事。

最小使用条件

1. 一个支持 Skill 加载机制的 Agent 环境。
2. 一份可提供的测试输出或失败结果。
3. 按需授予的文件读取权限,其他权限可先关闭。

Skill 安装、使用与卸载教程

一、安装

本页面已提供该 Skill 的安装指令,直接复制并粘贴到对应 Agent 或终端执行即可。

如果你不确定当前 Agent 如何安装,可以直接向它提问:

如何安装 antithesishq/antithesis-skills#testtriage?

如何在 Claude Code 中安装 antithesishq/antithesis-skills#testtriage?

如何在 Codex 中安装 antithesishq/antithesis-skills#testtriage?

如何在 Cursor 中安装 antithesishq/antithesis-skills#testtriage?

让当前 Agent 根据自己的 Skill 加载和管理机制来指导安装,通常比套用通用命令更稳妥。

如果官方对该 Skill 有额外安装要求,请以官方仓库说明为准。

二、安装后如何使用

安装后,当任务涉及测试失败结果的分析、分类和优先级判断时,可以显式点名该 Skill。适合交给它的任务是:对一批测试失败做分诊、区分噪声与真问题、梳理需要优先跟进的项。

用户描述需求时,最好直接给出测试输出或日志,并说明你最关心什么,例如“哪些是阻塞性的”“哪些可能是环境问题”。自然语言示例:

使用 testtriage,帮我给这批失败的测试用例分一下类,标出哪些需要优先处理。

使用 testtriage,分析这份 CI 失败的日志,区分代码问题、环境问题和偶发失败。

使用 testtriage,从这组测试失败结果里提炼出最关键的几条线索,帮我缩小排查范围。

三、卸载

不同 Agent 的 Skill 安装位置和管理方式可能不同。一般做法是:

– 使用对应 Agent 或 Skill 管理器提供的删除方式移除该 Skill;
– 或直接询问当前 Agent:如何卸载 antithesishq/antithesis-skills#testtriage?

如果没有统一的卸载命令,让当前 Agent 协助移除通常更稳妥。具体以对应 Agent 的说明为准。

常见问题

它需要联网吗?
如果测试结果存放在本地,通常不需要。只有当你要从远程 CI 或远程日志服务拉取数据时,才可能涉及网络访问。具体以官方说明为准。

它可以自动跑测试吗?
它的定位是测试结果的分诊判断,不是测试执行框架。能否顺带运行收集命令取决于赋予 Agent 的权限,但这不是它的核心用途。

可以同时安装到多个 Agent 吗?
通常可以分别安装到不同 Agent。各 Agent 的 Skill 目录互不影响,但兼容程度可能不同,建议逐个验证是否被正确加载。

安装后 Agent 没有识别到怎么办?
先确认安装路径是否符合当前 Agent 的 Skill 规范,再确认 Agent 版本是否支持 Skill 加载机制。也可以直接问当前 Agent 是否已经能使用该 Skill,让它自行检查。

Skill 更新后需要重新安装吗?
取决于你的安装方式。如果是引用仓库持续更新,可能无需重装;如果是本地复制,则需要手动更新。具体以你的安装方式为准。

是否适合生产环境?
它处理的是测试结果分析,本身不直接改动生产系统。是否在生产相关流程中使用,主要看你对测试数据中敏感信息的处理是否到位。

和直接让 Agent 总结测试日志有什么区别?
直接总结容易停留在复述层面。testtriage 引导 Agent 按分诊逻辑做分类和优先级判断,输出更贴近工程排查需求,这是它和泛泛总结的主要差异。

Skill 更新日志

版本列表
无版本号
更新 PR #204 的技能版本
无版本号
更新 PR #204 的变更日志
无版本号
fix: 澄清测试模板不需要驱动程序 (#204) Co-authored-by: Carl Sverre Co-authored-by: Claude Opus 5.5
无版本号
更新 PR #198 的技能版本
无版本号
更新 PR #198 的变更日志
无版本号
feat: 添加 antithesis-feature-workload 技能 (#198)
无版本号
fix: 在 README 中为 antithesis-review-inputs 添加起始提示 (#203)
无版本号
更新 PR #201 的技能版本
无版本号
更新 PR #201 的变更日志
无版本号
feat: 添加 antithesis-review-inputs 技能 (#201) 该技能审查工作负载的输入生成,以评估状态空间探索——即它如何利用随机性将被测系统驱动到多样化的行为区域。
无版本号
更新 PR #200 的技能版本
无版本号
更新 PR #200 的变更日志
无版本号
feat: 添加 antithesis-mutation-testing 技能 (#200) * feat: 添加 antithesis-mutation-testing 技能 验证的是 oracle 而非 SUT:一个每次运行都通过的属性可能是一个永远不会失败的属性。对于每个安全类属性(Always、AlwaysOrUnreachable、Unreachable),该技能注入一个真实的 bug,在 Antithesis 下运行它,并确认目标属性触发——然后将每个幸存者诊断为坏变异体、坏 oracle、坏工作负载或坏属性,并将修复路由到工作负载或研究技能。 工作原理:变异体仅作为补丁存在于用户代码树的临时 git fork 中——工作树永远不会被修改,clean.sh 会验证这一点。每个变异体构建为自己的镜像(在 fork 的 compose 中交换标签),携带一个启动公告以证明部署了正确的构建,以及一个标记以证明有缺陷的代码被执行,并在花费任何运行之前先在本地验证。运行以 --ephemeral 在专用的 --source 下启动,因此故意失败永远不会进入真实的属性历史。证伪要求标记与目标的反例出现在同一历史中,而不是两次运行范围的计数。 组件: - SKILL.md:先决条件、绿色基线门禁、开场访谈(预算上限、并发、自主性、树写入权限)、范围规则、三个工作流、自审清单 - references/:测试框架机制、变异体设计(三部分补丁)、静态杀伤链验证、扫描 + 判定阶梯 + 归因、证据工件(访谈/状态/历史/报告)、缺失 scratchbook 的目录重建、恢复协议 - assets/mutation-testing/:六个 bash 脚本(fork、sync-patches、select-mutant、build-mutants、verify-mutant、clean)以及一个记录工作目录的 AGENTS.md 另外:triage 在全绿运行中建议该技能,工作负载的迭代文档在绿色运行后指向它,README 记录了用法和成本。 对于审查,承重部分是判定阶梯和同历史归因规则(sweep-and-verdicts.md)、预算和停止规则(上限、尝试次数上限、无进展停止)、以 fork 的 base_tree 指纹为键的双分支重扫描规则,以及脚本 INTENT/ASSUMES/GUARANTEES 头中的 fork 隔离保证。已针对真实租户进行端到端验证,由三代理小组审查交叉引用和一致性缺陷,并用 make validate 检查。 * 将 mutatable 添加到拼写错误字典,并将 mis-implemented 替换为 incorrectly implemented * 工作负载技能:简化变异测试的解释 Co-authored-by: Carl Sverre * README:澄清变异测试成本 --------- Co-authored-by: Carl Sverre
无版本号
更新 PR #195 的技能版本
无版本号
更新 PR #195 的变更日志
无版本号
feat: 优先使用调用方提供的启动参数而非技能默认值 (#195)
无版本号
更新 README.md 中的安装说明
无版本号
更新 PR #199 的技能版本
无版本号
更新 PR #199 的变更日志
无版本号
澄清 Antithesis 断言不会结束时间线 (#199) 工作负载技能的断言参考中没有提到 SDK 断言是非致命的。根据此文档编写断言的模型可能会从训练中引入断言失败 = 崩溃/中止的假设,导致断言不足或围绕断言调用编写防御性代码。
无版本号
在 README 中添加模型指导部分 (#196) 大多数用户不需要前沿模型来使用这些技能。像 Opus 4.6 这样的中端模型是一个很好的起点,而像 research 这样 token 密集型的技能使成本差异变得有意义。
无版本号
更新 PR #194 的技能版本
无版本号
更新 PR #194 的变更日志
无版本号
fix: reach 声明必须断言前置条件,而不是违规 (#194) * fix: reach 声明必须断言前置条件,而不是违规 遵循 antithesis-workload,一个代理将每个 Sometimes reach 声明写为同一位置 Always 的精确否定。这样的配对不携带任何信息:Sometimes 仅在 Always 失败时触发,而在固定构建上它永远不会触发,Antithesis 会将其报告为失败。该代理还将未触发的 reach 声明解读为覆盖缺口,并称两个绿色安全属性是空洞的。 将规则添加到 references/assertions.md,将检查添加到 references/iteration.md 中的 triage 循环,并在 SKILL.md 中添加一个自审项。 fixes #193 Co-Authored-By: Claude * docs: 将 reach 声明指导精简为简化技术英语 Co-Authored-By: Claude * docs: 分别断言前置条件的每一部分 Co-Authored-By: Claude --------- Co-authored-by: Carl Sverre Co-authored-by: Claude
无版本号
更新 PR #191 的技能版本
无版本号
更新 PR #191 的变更日志
无版本号
fix: 将 podman compose 指导替换为 Docker Compose v2 (#191) * fix: 将 podman compose 指导替换为 Docker Compose v2 Antithesis 针对 podman 运行独立的 docker-compose 二进制文件。它从不运行 `podman compose`。snouty 以相同方式驱动 Docker Compose v2:独立的 `docker-compose` 二进制文件,或来自 snouty 0.7.0 的 `docker compose` CLI 插件。这些技能告诉代理优先使用 `podman compose`,而没有任何版本的 snouty 支持它。 compose CLI 和容器引擎是两个独立的选择。这些技能现在说明了这一点,列出了两种受支持的组合,并引导代理使用 `snouty doctor` 来读取 snouty 在此机器上选择的组合。 snouty 从不构建镜像,也从不拉取镜像,因此构建必须落在 snouty 选择的引擎的镜像存储中。设置和启动技能现在包含两种引擎的构建命令,包括使 podman 支持独立二进制的 DOCKER_HOST 接线,以及用于在同时装有 podman 的机器上进行 docker 构建的 SNOUTY_CONTAINER_ENGINE 覆盖。 PREREQUISITES.md 从两个平台部分中删除了 `podman-compose`。在 Debian 上,`docker-compose-v2` 包仅提供 CLI 插件,因此 podman 组合改为下载独立二进制文件。 Co-Authored-By: Claude * docs: 审查后精简 compose 指导 将构建指导从 docker-compose.md(该文件涵盖编写 yaml)移到 submit-and-test.md(代理在此运行构建)。这消除了两次指针跳转。 删除 snouty 版本注意事项、README.md 中重复的段落,以及重复的“不要使用 podman compose”行。现在一条正面指令承载该规则:运行 `snouty doctor` 并使用它指定的组合进行构建。 引导代理查看 `snouty doctor` 的检查项,而不是其解析后的设置。检查项打印 `Container runtime: docker detected`,而设置行打印 `auto-detect`。 在启动技能和 README 中恢复 `docker compose build` 作为可运行命令,并将 PREREQUISITES.md 中的 `snouty doctor` 步骤移到安装 snouty 之后。 Co-Authored-By: Claude * 更新 SKILL.md 以提供更清晰的先决条件说明 澄清了运行 'snouty doctor' 的说明,并删除了先决条件中的冗余内容。 * docs: 每个文件只说明一次 compose CLI 选择 这些技能在每个命令处重复“或 `docker-compose`”。来自 `snouty doctor` 的一次观察即可为整个运行确定 CLI,因此每个文件现在只说明一次,然后直接写 `docker compose`。 Co-Authored-By: Claude * docs: 删除脆弱的 podman socket 单行命令 Compose 默认使用 Docker 守护进程 socket,因此代理自己的构建在 podman 机器上需要 DOCKER_HOST。snouty 为其自己的 compose 调用设置它,而不是为构建设置。 不过,macOS 命令是错误的,不应交出。podman 从当前 TMPDIR 推导 socket 路径,而 socket 是在 `podman machine start` 时绑定到该 TMPDIR 下的,因此 `podman machine inspect` 可能报告一个不存在的路径。snouty 正是出于这个原因探测同级位置。改为说明该要求和 macOS 陷阱。 Co-Authored-By: Claude * docs: podman 需要启动其 API socket 在全新的 podman 4.9.3 安装上验证。`podman info` 报告一个 socket 路径,而 `RemoteSocket.Exists` 为 false,并且 `snouty doctor` 仍打印“Container runtime: podman detected”。将 DOCKER_HOST 导出到该路径会给 compose 一个死 socket。 将检查和 `systemctl --user enable --now podman.socket` 修复添加到构建指导以及 podman 安装步骤中。 Co-Authored-By: Claude * docs: 在 podman 引擎上使用 `podman compose` 构建 `podman compose` 是一个包装器,而不是 `podman-compose`。它针对 podman 的 API socket 执行 Docker Compose v2 二进制文件,因此它自己完成 DOCKER_HOST 接线,镜像落在 podman 的存储中。在 podman 4.9.3 上以独立二进制文件和 CLI 插件作为提供程序进行了验证。 用它替换手动 DOCKER_HOST 导出,并删除 `podman compose` 不是替代品的说法。socket 检查保留:当 podman 未监听时,构建无论如何都会失败并显示“Cannot connect to the Docker daemon”。 snouty 仍然需要 PATH 上的独立 `docker-compose`。在 podman 且没有 `docker` CLI 的情况下,`snouty doctor` 报告“no usable Docker Compose”,而 `podman compose` 可以工作。 Co-Authored-By: Claude * docs: 构建前检查 podman compose 提供程序 podman 从 ["docker-compose", "podman-compose"] 解析其 compose 提供程序,并回退到 podman-compose Python 工具,而它不是 Docker Compose。`podman compose version` 会指出运行的是哪一个:对于 Compose v2 提供程序,stdout 显示“Docker Compose version ...”,对于回退则显示“podman-compose version ...”。在 podman 4.9.3 上验证了两者。 将 stderr 提供程序行的建议替换为该命令,与 socket 检查并列。 Co-Authored-By: Claude * docs: 应用 PR 191 的审查建议 从安装步骤中删除 podman socket 检查和 `snouty doctor` 行,将 `systemctl --user enable --now podman.socket` 保留在安装命令本身中。将 podman 构建提升为启动技能中的顶级项目符号,并缩短引擎覆盖子项目符号。说明 `podman-compose` Python 工具与测试框架所需的 docker-compose 功能不兼容。 Co-Authored-By: Claude --------- Co-authored-by: Carl Sverre Co-authored-by: Claude
无版本号
更新 PR #189 的技能版本
无版本号
更新 PR #189 的变更日志
无版本号
使用 Sometimes 断言验证工作负载可达性 工作负载技能已经教授用于活性和语义状态的 Sometimes 断言,并教授在 triage 后进行迭代。缺失的是:有意将 Sometimes 断言写为关于工作负载应达到什么的声明,然后将未触发的断言用作工作负载驱动需要改进的证据。 将该实践添加到 assertions.md,将其连接到 iteration.md 中的迭代循环,并在 SKILL.md 中添加一个工作流步骤和自审标准。

暂无评论

none
暂无评论...