Skip to content

/triage

Triage a batch of raw security findings. Verify each is real,

BOOST
From plugin
ouroboros
6.3k25 skills22 agents3 hooks1 MCP
Install
$ npx -y skills add Q00/ouroboros --skill triage --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/triage

Context preview

The summary Claude sees to decide when to auto-load this skill.

Triage a batch of raw security findings. Verify each is real,

SKILL.md

triage.SKILL.md
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.

Every `<payload-file>` below means a fresh file for that chunk, selected under the [trusted payload staging contract](../README.md#trusted-payload-staging). Never stage with Write in a checkpoint directory or at a reused fixed path.

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).

**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 → `<payload-file>` 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 <payload-file>`

**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 con

Read more
Ships withouroboros

Agent OS: the agent gets smarter on its own. We just hold the line: Interview-gated, staged evaluation, budgeted evolution loop. MCP server, 14 runtimes: Claude Code, Codex CLI, Gemini CLI, OpenCode, Copilot, Kiro and more.

Get the whole plugin, auto-invoked

Other skills on ouroboros.

auto
SkillAuto-invoked

auto

Use when the work spans several files or replaces a framework, language, auth, storage, or API layer (rewrites and migrations…

@q00@q00Install Skill