threat-model
Build a threat model for a target codebase. Three modes: "interview" walks an application owner through the four-question…
Triage a batch of raw security findings. Verify each is real,
$ npx -y skills add Q00/ouroboros --skill triage --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/triageContext preview
The summary Claude sees to decide when to auto-load this skill.
Triage a batch of raw security findings. Verify each is real,
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:*)
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):
JSON files, a `VULN-FINDINGS.json`, an `INCIDENTS.json`, a pipeline `results/<target>/<ts>/` directory, or a markdown report.
**interactive**.
pass, 5 for high-stakes batches).
Verification needs source access; the skill stops with an error if the cited files aren't reachable.
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.
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.
---
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/`:
`{"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).
section below).
**Start of run — resume check.** Bash: `python3 .claude/skills/_lib/checkpoint.py load ./.triage-state`
**fresh start.** Bash: `python3 .claude/skills/_lib/checkpoint.py reset ./.triage-state`, then proceed to Phase 0.
`./.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`
---
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
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.
Build a threat model for a target codebase. Three modes: "interview" walks an application owner through the four-question…
Static source-code vulnerability scan. Reads a target directory (and THREAT_MODEL.md if present), spawns parallel review…
Use when the work spans several files or replaces a framework, language, auth, storage, or API layer (rewrites and migrations…
Scan and manage brownfield repository/worktree defaults for interviews
Open or drive the Ouroboros settings GUI (browser, TUI, or conversational fallback)