triageSAFE
Skills for threat modeling, scanning, triage, patching, plus an autonomous scanning harness you can /customize
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
A Claude Code skill that triages a batch of raw security-scanner findings: verifies each is real, collapses duplicates, re-ranks by derived exploitability, and tags each survivor with a component owner. Turns a raw dump into a short, ranked, owned list. Pairs with /vuln-scan (which generates findings) and this repo's vuln-pipeline (which generates crash reports), but also ingests loosely-structured JSON or markdown from other scanners.
Requirements
- Claude Code CLI installed and authenticated
- A read-only checkout of the target codebase (verification reads source;
it does not build or run anything)
- A file or directory of findings to triage
Installation
Project-scoped (ships with this repo — nothing to do if you cloned it):
ls .claude/skills/triage/SKILL.md
Or user-scoped:
mkdir -p ~/.claude/skills cp -r .claude/skills/triage ~/.claude/skills/
Usage
From a Claude Code session in the target repo:
/triage path/to/findings.json
Interactive mode (the default) opens with a short interview: trust boundary, threat model, scoring standard (HIGH/MED/LOW vs. CVSS vs. your org bug-bar), and whether to bias toward precision or recall on split votes. These answers shape how reachability is judged and how severity is labeled. If you pick CVSS, have the model emit vectors and compute the scores with a tool — see docs/best-practices.md#cvss. To skip the interview and use precision-biased defaults:
/triage path/to/findings.json --auto
Common invocations:
/triage VULN-FINDINGS.json # vuln-scan output, repo = cwd /triage results/mytarget/2026-04-14/ --repo . # vuln-pipeline output /triage scanner_export/ --votes 5 --repo ~/src/app # high-stakes batch, 5-vote verify /triage backlog.md --auto --votes 1 # quick first pass on a markdown report
Output
./TRIAGE.json— every input finding, annotated with `ve
c7f8d948fb02OBSERVED · 2026-10-24Host compatibility
What the documentation claims. We have not run a compatibility test.
| Host | Status | Notes |
|---|---|---|
| claude-code | mentioned |
What it tells the agent
The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.
---
name: triage
description: Triage a batch of raw security findings. Verify each is real,
collapse duplicates, re-rank by derived exploitability, and tag with an
owner. Takes a directory or file of scanner output and writes TRIAGE.json
+ TRIAGE.md sorted by what actually needs engineering attention. Use when
asked to "triage findings", "validate scanner output", "prioritize vulns",
or "review the backlog". Runs interactively by default; pass --auto to
skip the interview.
argument-hint: "<findings-path> [--auto] [--votes N] [--repo PATH] [--fp-rules FILE] [--fresh]"
allowed-tools:
- Read
- Glob
- Grep
- Write
- Task
- AskUserQuestion
- Bash(git log:*)
- Bash(jq:*)
- Bash(find:*)
- Bash(ls:*)
- Bash(wc:*)
- Bash(python3 .claude/skills/_lib/checkpoint.py:*)
---
# triage
Adversarial triage of raw security-scanner output. Does four jobs:
**verify** each finding is real, **deduplicate** across runs and scanners,
**rank** survivors by derived exploitability rather than the scanner's
claimed severity, and **route** each to a component owner. Output is a
short, ranked, owned list instead of a raw dump.
Invoke with `/triage <findings-path> [--auto] [--votes N] [--repo PATH] [--fp-rules FILE]`.
**Arguments** (parse from `$ARGUMENTS`; positional `$1`/`$2` expansion is
not stable across runtimes):
- findings path (first positional, required): a JSON file, a directory of
JSON files, a `VULN-FINDINGS.json`, an `INCIDENTS.json`, a pipeline
`results/<target>/<ts>/` directory, or a markdown report.
- `--auto`: skip the interview and use defaults. Default mode is
**interactive**.
- `--votes N`: verifier votes per finding (default 3; use 1 for a quick
pass, 5 for high-stakes batches).
- `--repo PATH`: path to the target codebase, read-only (default cwd).
Verification needs source access; the skill stops with an error if the
cited files aren't reachable.
- `--fp-rules FILE`: append the contents of FILE to the verifier's
exclusion-rule list (Phase 3a). Use for org-specific precedents: "we use
Prisma ORM everywhere — raw-query SQLi only", "k8s resource limits cover
DoS", etc. Plain text, one rule per line or paragraph.
- `--fresh`: ignore any existing checkpoint in `./.triage-state/` and start
from Phase 0. Without this flag the skill resumes from the last completed
phase if a checkpoint is present.
**Tools:** Read, Glob, Grep, Write, Task, AskUserQuestion. Bash is
permitted only for `git`, `find`, `wc`, `ls`, `jq`, and
`python3 .claude/skills/_lib/checkpoint.py` (checkpoint I/O).
**Do not execute target code.** No building, running, installing
dependencies, or sending requests. A proof-of-concept that accidentally
works against something real is unacceptable, and "couldn't write a working
PoC" is weak evidence of non-exploitability. Every conclusion comes from
reading source. This applies to the orchestrator and every subagent;
include the constraint in every Task prompt. For high-confidence HIGH
findings, recommend a human-built PoC as a follow-up instead.
**Do not reach the network.** No package-registry lookups, CVE-database
queries, or upstream-commit fetches.
---
## Checkpointing (runs before Phase 0 and after every phase)
On large finding batches a full run can exhaust context or hit rate limits
mid-way — particularly Phase 3, which spawns `candidates × votes` verifiers.
Phase state persists to `./.triage-state/` so a fresh `/triage` session can
resume without re-asking the interview or re-spawning verifiers.
All checkpoint I/O goes through `python3 .claude/skills/_lib/checkpoint.py`
(atomic writes, JSON-validated). Never use the Write tool for `progress.json`
directly. Never pass payload via heredoc or stdin; target-derived strings
could collide with the heredoc delimiter and break out to shell. The
Write→`--from` pattern keeps repo-derived bytes out of Bash argv.
State files in `./.triage-state/`:
- `progress.json` — **single source of truth** for resume position:
`{"status": "running"|"complete", "phase_done": N, "shards_done": [...]}`.
Resume decisions read ONLY this file, never a glob of `phase*.json` or
shard files (stale files from a prior run must not be trusted).
- `phaseN.json` — data payload for phase N (schemas at the tail of each phase
section below).
- `_chunk.tmp` — transient payload buffer; overwritten before every
`save`/`shard`/`append` call.
**Start of run — resume check.** Bash:
`python3 .claude/skills/_lib/checkpoint.py load ./.triage-state`
- `status == "absent"` OR `"complete"`, OR `--fresh` in `$ARGUMENTS` →
**fresh start.** Bash:
`python3 .claude/skills/_lib/checkpoint.py reset ./.triage-state`,
then proceed to Phase 0.
- `status == "running"` with `phase_done == N` → **resume.** Read
`./.triage-state/phase0.json` through `phaseN.json` **in order** (and any
`shard_*.json` files listed in `shards_done`), merging keys into working
state (later files override earlier — checkpoints may be deltas). Print
`Resuming from checkpoint: Phase N complete (./.triage-state/phaseN.json)`,
and **skip directly to Phase N+1**.
**End of every phase N.** Two tool calls:
1. Write tool → `./.triage-state/_chunk.tmp` containing the phase's output
JSON (schema at the tail of each phase section).
2. Bash → `python3 .claude/skills/_lib/checkpoint.py save ./.triage-state <N> <name> --from ./.triage-state/_chunk.tmp`
**End of run.** After writing `TRIAGE.json` and `TRIAGE.md`, Bash:
`python3 .claude/skills/_lib/checkpoint.py done ./.triage-state 6`
---
## Phase 0: Mode select and interview
### 0a. Parse arguments
From `$ARGUMENTS`: extract the findings path (first positional), `--auto`
flag, `--votes N` (default 3), `--repo PATH` (default `.`), `--fp-rules
FILE` (default none). If no findings path was given, ask for one and stop.
If `--fp-rules` was given, Read the file now and carry its contents as
`context.extra_fp_rules` for injection into the Phase 3a verifier prompt.
### 0b. Interactive mode (Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | NA |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- none-observed
- Network
- none-observed
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (0)
No findings outside the package's declared scope.
Gates applied: no_behavioural_pass.
c7f8d948fb02full audit observations/trust-audit/skill/anthropics__triage.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-24 | c7f8d948fb02 | SAFE | B | 89 | first audit |
Questions
What does the triage — anthropics/defending-code-reference-harness skill do?
Skills for threat modeling, scanning, triage, patching, plus an autonomous scanning harness you can /customize
Is triage — anthropics/defending-code-reference-harness safe to install?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean skill reads B.
What can triage — anthropics/defending-code-reference-harness access on my machine?
The audit observed no filesystem, network or shell use at all in its source.
Which assistants does triage — anthropics/defending-code-reference-harness work with?
Its documentation mentions claude-code. That is what the text claims, not a compatibility test we ran.
How current is this page?
The grade is for one exact copy of the source (c7f8d948fb02), read on 2026-10-24. The repository is watched, and a new audit runs when it changes — this is the first audit.
Add this badge to your README
Shows this page's audit result and links back to it. It updates when the audit does.
[](https://modelsatlas.com/skills/anthropics/triage/)
Not your listing, or something out of date? Claim or update your listing.