Default pipeline scrutineer runs when a repository is added.

MITAuto-check passedSecurity

Install Triage

skills CLI
$ npx skills add alpha-omega-security/scrutineer --skill triage -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install alpha-omega-security/scrutineer triage --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/alpha-omega-security/scrutineer.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/triage .claude/skills/triage && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
triage
GitHub stars
239
Token cost
~2.9k tokens
SKILL.md length
1,478 words
Files
3 (incl. references)
Skills in repo
48
Repo updated
First seen
Licence
MIT

At a glance

Default pipeline scrutineer runs when a repository is added.

  • A standard set of other skills in parallel
  • SKILL.md covers Workspace, Classify the repository, The scan set and Re-verify reported findings, plus 2 more sections
  • Calls git
  • Then writes a short summary of what was enqueued

What it does

Triage is an agent skill from alpha-omega-security/scrutineer. Default pipeline scrutineer runs when a repository is added. Triggers a standard set of other skills in parallel, then writes a short summary of what was enqueued. Edit the list below to change the default scan coverage without touching scrutineer's Go code.

Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/modes.md` and `schema.json`). Compatibility notes: Needs network access to the scrutineer API (http://host:port/api). Uses brief (github.com/git-pkgs/brief) for language and dependency gates; falls back to the…

It sits in Security. It works with C++. The repository describes itself as: Security through scrutiny. The licence is MIT.

When your agent uses it

  • A standard set of other skills in parallel
  • Then writes a short summary of what was enqueued

Example prompts

  • “/triage”

Requirements

  • Python 3
  • Compatibility (from SKILL.md): Needs network access to the scrutineer API (http://host:port/api). Uses `brief` (github.com/git-pkgs/brief) for language and dependency gates; falls back to the general code and package scans if brief is unavailable. Repository modes use source evidence independently.

What it can do on your machine

Read from SKILL.md and the folder at commit f3407bf. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    Needs network access to the scrutineer API (http://host:port/api). Uses `brief` (github.com/git-pkgs/brief) for language and dependency gates; falls back to the general code and package scans if brief is unavailable. Repository modes use source evidence independently.

    From compatibility in the SKILL.md frontmatter.

Context cost

Triage loads about 2.9k tokens when it runs, and up to ~4.2k if it reads all its reference files. Until then it costs about 66 tokens; SKILL.md has 1,478 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~66
When it runs · the whole SKILL.md, loaded when a task matches
~2.9k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~4.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from alpha-omega-security/scrutineer at commit f3407bf, republished under its MIT licence (© alpha-omega-security). 1,478 words, ~2,893 tokens.

Download SKILL.mdSave it as .claude/skills/triage/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.
name
triage
description
Default pipeline scrutineer runs when a repository is added. Triggers a standard set of other skills in parallel, then writes a short summary of what was enqueued. Edit the list below to change the default scan coverage without touching scrutineer's Go code.
compatibility
Needs network access to the scrutineer API (http://host:port/api). Uses `brief` (github.com/git-pkgs/brief) for language and dependency gates; falls back to the general code and package scans if brief is unavailable. Repository modes use source evidence independently.
license
MIT
metadata.scrutineer.version
1
metadata.scrutineer.output_file
report.json
metadata.scrutineer.output_kind
freeform

triage

Scrutineer automatically queues reflect after a successful root default-branch triage invocation and waits for this invocation's child scans before running it. Do not enqueue reflect yourself or wait for it. It records operational lessons only and does not change scan selection or finding dispositions.

Kick off the standard set of scans against a freshly-added repository.

Workspace

  • ./context.json — has scrutineer.api_base, scrutineer.token, and scrutineer.repository_id. Required.
  • ./report.json — write a short summary of what you enqueued.

Classify the repository

Run brief --json ./src and read its JSON. These fields decide which scans are worth queueing:

  • languages — programming languages detected; null or empty means no source
  • package_managers — manifest/lockfile ecosystems detected; null or empty means nothing publishes or consumes packages here

From those, set two flags:

  • has_packages = package_managers is present and non-empty
  • has_code = languages is present and non-empty

A docs repo (markdown only) has neither. Anything with detected source gets the code scans, whether it is an application, a library, infra scripts, or a flat-layout package. The cost of running semgrep on a stray shell script is far lower than missing a real library because brief failed to populate layout.source_dirs. Do not gate on layout.source_dirs; it is a heuristic and routinely empty for legitimate codebases.

Set has_embedded_native when Brief reports any of these signals:

  • tools.native_extension is non-empty
  • tools.dependency_bot contains Git Submodules
  • the detected languages include at least one of C, C++, Objective-C, Objective-C++, Rust, Go, Fortran, Zig, Assembly, or CUDA, and either another language or a CMake, Meson, or Autotools build tool is also present

This covers native extensions and mixed-language repositories without assuming that native code means C or C++. If brief is not on PATH or exits non-zero, set has_code, has_packages, and has_embedded_native true and carry on so the follow-up scan can retry Brief after source preparation.

languages also decides one language-specific scanner:

  • has_python = languages contains Python, matched case-insensitively

This gates bandit, which reads Python and nothing else. It follows has_code: when brief is unavailable it is true too, since a missed Python codebase costs more than a scan that finds nothing.

brief does not report CI configuration, so set a fourth flag from a direct filesystem check:

  • has_workflows = ./src/.github/workflows exists and is a directory

This gates zizmor, which only audits GitHub Actions workflows; with no workflows directory its scan immediately no-ops, so skipping it at triage avoids enqueueing a scan that can do nothing. Unlike the code/package flags this is a definitive check, not a heuristic, so do not default it true on error — if the directory is absent, has_workflows is false.

The scan set

Read references/modes.md in this skill's directory and check each listed repository type against the source. Record matching modes and their file-level evidence in modes. Several modes can apply to one repository. Mode detection is independent of Brief's language and dependency detection, including when Brief fails.

Add each matching mode's skills to the scan set below. Put skills belonging only to unmatched modes in gated. Apply the same skip set, request scope, and error handling to mode skills as to the standard scans, and enqueue each skill at most once. Mode scans are additive: keep the standard scans and the threat-model-driven deep dives.

Before enqueueing anything, check what already ran so a re-trigger does not double-enqueue work that is already current.

Get the commit you are running at: git -C ./src rev-parse HEAD. Then fetch GET {api_base}/repositories/{repository_id}/scans, which returns every scan on this repository with skill_name, status, commit, ref and sub_path. If that fetch fails, treat the skip set as empty and carry on. Consider only scans whose ref and sub_path match the current scrutineer.scan_ref and scrutineer.scan_subpath, treating absent fields as empty. Otherwise a scan of a sibling subproject could suppress this scope's audit. Build a set of skill names to skip: a skill goes in the skip set if it has a compatible scan with status in {queued, running}, or a compatible scan with status="done" whose commit equals the current HEAD. A done scan at any other commit does not count; the repository has moved since then and the skill should run again. failed scans are re-enqueued.

Classify each skill in the list below into exactly one bucket, checking in this order and stopping at the first match: gated (its has_code/has_packages/has_python/has_workflows/has_embedded_native flag is false), already_done (it is in the skip set), triggered (enqueue it). Enqueue with POST {api_base}/repositories/{id}/skills/{name}/run and an Authorization: Bearer {token} header. Order does not matter; the scrutineer worker runs them as they come in. A 404 response moves the skill from triggered to skipped.

If scrutineer.scan_ref is set in context.json, include it in the POST body as {"ref": "<value>"} so child scans clone the same branch. If scrutineer.scan_subpath is set, also include "sub_path": "<value>" in the same body so every child stays scoped to the same monorepo sub-package — a scan submitted as repo#sub/dir (or a /tree/<branch>/<sub/dir> URL) sets this, and without forwarding it the pipeline would silently widen back to the whole repository. Combine them when both are present, e.g. {"ref": "main", "sub_path": "activesupport"}. When both are empty, send an empty JSON body or omit it. Verify runs (below) always send {}; they are finding-scoped and take neither.

Always:

  • metadata
  • repo-overview
  • packages
  • advisories

Only when has_workflows:

  • zizmor

Only when has_python:

  • bandit

Only when has_packages:

  • dependencies
  • sbom

packages and advisories query ecosyste.ms by repository URL rather than reading local manifests, so they run unconditionally even though they sound package-related.

Only when has_code:

  • subprojects
  • recon
  • history
  • threat-model
  • semgrep
  • betterleaks

Only when has_embedded_native:

  • embedded-native

After threat-model finishes, Scrutineer reads its durable scan_config and enqueues one security-deep-dive per focus area. Do not enqueue security-deep-dive here: starting it before the threat model is complete would create an unscoped repository-wide audit and defeat the partition.

For one third of eligible triage runs, Scrutineer also schedules at most one exploratory security-deep-dive after a successful threat model has queued a planned audit. Do not request this extra scan yourself. When the threat model names a usable out-of-scope source directory, half of selected root scans challenge that exclusion with an adversarial sweep; other selected scans use a context-free random dig. Both keep explicit path exclusions and subproject scope. Repeated completion notifications do not select another extra audit.

If a skill name comes back 404 skill not found or inactive, skip it and note which one in your report; the operator may have disabled it on purpose.

Show full SKILL.md (426 more words)Show less

Re-verify reported findings

If this repository has been scanned before there may be findings already reported to the maintainer that have since been fixed upstream. For each of status=reported and status=acknowledged, fetch GET {api_base}/repositories/{repository_id}/findings?status={status} and collect the returned id values. For every finding id, enqueue a verify run: POST {api_base}/findings/{id}/skills/verify/run with the bearer header and an empty JSON body. Record the ids you enqueued in the verify field of your report; if there are none, write an empty list. If the verify endpoint returns 404 skill not found or inactive, leave verify empty and carry on.

Do not verify findings in new, enriched, triaged, ready, published, rejected, or duplicate states. The audit skills re-running above handle the first four; the last three are closed.

Watch fixed findings for an upstream release

When a finding reaches fixed the maintainer has landed a patch, but consumers cannot pin to a commit — they need a tagged release. For findings in status=fixed, enqueue release-watch the same way: POST {api_base}/findings/{id}/skills/release-watch/run. Record the ids in a release_watch field of your report; if there are none, write an empty list. If the endpoint returns 404 skill not found or inactive, write an empty list and carry on. Release-watch is idempotent: a finding that already has a release recorded re-confirms the existing value rather than flapping.

Output

Write ./report.json as:

json
{
  "has_code": true,
  "has_packages": true,
  "has_python": false,
  "has_workflows": false,
  "has_embedded_native": true,
  "modes": [],
  "brief": {"languages": ["Ruby", "Rust"], "package_managers": ["Bundler", "Cargo"], "native_signals": ["native_extension:rb-sys", "language:Rust"]},
  "triggered": ["packages", "advisories", ...],
  "skipped":   ["semgrep"],
  "gated":     ["zizmor"],
  "already_done": ["metadata"],
  "verify":        [12, 34],
  "release_watch": [55, 56],
  "errors":        []
}

gated lists skills that were not enqueued because has_code, has_packages, has_python, has_workflows, or has_embedded_native was false. already_done holds skills that were skipped because a scan is currently running or already completed at this commit. skipped is for skills that came back 404 skill not found or inactive. brief is the subset of brief's output the gates were derived from, including short native_signals entries for the embedded-native decision, so an operator can see why a repo got the short treatment and re-run triage manually if the classification was wrong.

Do not wait for any of the scans to finish. The API returns a scan id immediately; your job is to fire them off and exit.

Each modes entry has a name and a non-empty evidence list of source paths with short explanations. For example, a package-manager match should cite the install command and its implementation. An empty list means no mode matched; record unreadable source or inconclusive classification in errors. gated also includes skills whose repository type did not match.

Do not fabricate scans or invent skill names. If the api_base or token is missing from context.json, write {"error": "context.json missing scrutineer block"} and exit 0 so the failure is visible on the scan page.

© alpha-omega-security, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 2 other files (references) in skills/triage of alpha-omega-security/scrutineer.

  • SKILL.md
  • references/modes.md
  • schema.json

Open the folder on GitHubat commit f3407bf

Compare with similar skills

Triage next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Triage compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Triage this skillalpha-omega-security/scrutineer239—~2.9kAutomated safety check: PassMIT
No Way To Prevent This Memory SafetyXe/site732—~816Automated safety check: PassZlib
Cpp StyleLuisaGroup/LuisaCompute1.1k—~1.1kAutomated safety check: PassApache-2.0
C Reviewtrailofbits/skills7.4k—~3.3kAutomated safety check: NotesCC-BY-SA-4.0
Clangmohitmishra786/low-level-dev-skills253—~1.4kAutomated safety check: PassMIT
Static AnalysisLeoKemp223/embed-ai-tool987—~402Automated safety check: PassNone

Similar skills

  • A skill your agent uses when asked to generate a "no way to prevent this" / no-way-to-prevent-this satire post for a memory-safety CVE (out-of-bounds write/read, buffer/heap overflow…

    732 GitHub stars~816 tokensUpdated yesterday
    SecurityAuto-check passed
  • Cpp Style

    LuisaGroup/LuisaCompute

    C++ naming, formatting, static analysis, and RTTI rules for LuisaCompute.

    1.1k GitHub stars~1.1k tokensUpdated today
    SecurityAuto-check passed
  • C Review

    trailofbits/skills

    Official

    Performs comprehensive C/C++ security review for memory corruption, integer overflows, race conditions, and platform-specific vulnerabilities.

    7.4k GitHub stars~3.3k tokensUpdated 2 days ago
    SecurityAuto-check: notes
  • Clang

    mohitmishra786/low-level-dev-skills

    Clang/LLVM compiler skill for C/C++ projects. An agent skill from mohitmishra786/low-level-dev-skills.

    253 GitHub stars~1.4k tokensUpdated 3 mo ago
    SecurityAuto-check passed
  • Static Analysis

    LeoKemp223/embed-ai-tool

    当需要对嵌入式 C/C++ 代码运行 cppcheck、clang-tidy 或 GCC analyzer 静态分析,或进行 MISRA-C 合规检查时使用。

    987 GitHub stars~402 tokensUpdated 1 mo ago
    SecurityAuto-check passed
  • Official

    Finds and fixes out-of-range output writes in ONNX Runtime operator shape-inference functions where a getNumOutputs guard admits too few outputs.

    22k GitHub stars~3.3k tokensUpdated today
    SecurityAuto-check passed

More from alpha-omega-security/scrutineer

All 48 skills in this repo
  • Zizmor

    alpha-omega-security/scrutineer

    Audit GitHub Actions workflows with zizmor and explain reported hits using bundled trust-boundary references.

    239 GitHub stars~1.2k tokensUpdated today
    Auto-check passed
  • Bandit

    alpha-omega-security/scrutineer

    Run bandit against the Python source in the repository and map its hits into the findings shape.

    239 GitHub stars~615 tokensUpdated today
    Auto-check: notes
  • Compliance

    alpha-omega-security/scrutineer

    Audit the repository against the OpenSSF Baseline with darnit, resolve the controls darnit defers to LLM analysis or could not verify, and record per-control verdicts plus the attained Baseline level.

    239 GitHub stars~1.4k tokensUpdated today
    Auto-check: notes
  • Dependencies

    alpha-omega-security/scrutineer

    Run git-pkgs list and sbom against the repository and emit one envelope with per-section status.

    239 GitHub stars~596 tokensUpdated today
    Auto-check passed
  • History

    alpha-omega-security/scrutineer

    Mine repository history for security fixes that were never published as advisories, producing a cached worklist for threat-model and advisory-deep-dive.

    239 GitHub stars~2.9k tokensUpdated today
    Auto-check: notes
  • Maintainers

    alpha-omega-security/scrutineer

    Identify the real maintainers of a repository and the best way to contact them about a security issue.

    239 GitHub stars~1.2k tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about Triage

What does Triage do?

Default pipeline scrutineer runs when a repository is added. Triage is an agent skill from alpha-omega-security/scrutineer. Default pipeline scrutineer runs when a repository is added.

When should I use Triage?

Triage fits situations like: A standard set of other skills in parallel; then writes a short summary of what was enqueued.

How do I install Triage in Claude Code?

Run `npx skills add alpha-omega-security/scrutineer --skill triage -a claude-code`. Or copy the skill folder (skills/triage in alpha-omega-security/scrutineer) into .claude/skills/triage in your project. Claude Code loads it when a task matches its description.

How do I install Triage in Codex?

Run `npx skills add alpha-omega-security/scrutineer --skill triage -a codex`. Or copy the skill folder (skills/triage in alpha-omega-security/scrutineer) into .agents/skills/triage in your project. Codex loads it when a task matches its description.

Can I use Triage in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add alpha-omega-security/scrutineer --skill triage -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/triage, .gemini/skills/triage, .github/skills/triage and .opencode/skills/triage in your project.

What does Triage need to run?

Going by SKILL.md and its folder, Triage needs the command-line tools its instructions call (git). Our summary lists: Python 3. Compatibility (from SKILL.md): Needs network access to the scrutineer API (http://host:port/api). Uses `brief` (github.com/git-pkgs/brief) for language and dependency gates; falls back to the general code and package scans if brief is unavailable. Repository modes use source evidence independently..

Does Triage access the network?

SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Triage safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Triage use?

Triage is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Triage use?

About 2.9k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.3k tokens, read only when the agent opens those files.

What are the alternatives to Triage?

Skills that share tags, products or a category with Triage: No Way To Prevent This Memory Safety (Xe/site, 732 stars), Cpp Style (LuisaGroup/LuisaCompute, 1.1k stars), C Review (trailofbits/skills, 7.4k stars) and Clang (mohitmishra786/low-level-dev-skills, 253 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Triage?

alpha-omega-security (a GitHub organization) maintains it in alpha-omega-security/scrutineer, which has 239 GitHub stars. The repository holds 48 skills in this directory. The repository was last updated on October 9, 2026.

Source: alpha-omega-security/scrutineer on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.