auditor-skill is a markdown security-audit corpus plus a small amount of tooling. Contributions are welcome — new known vectors, checklist items, protocol methodologies, fixes to wording, and tooling improvements. This document is the short version of "how a change gets in".
- Nothing lands on
maindirectly. Every change — maintainers included — goes through a branch and a pull request that is reviewed by someone other than its author.mainis protected. - One theme per PR. A PR adds one coherent thing (a vector, a methodology, a checklist section, a tooling change). Split unrelated changes; reviewers cannot meaningfully review a 3,000-line mixed diff.
- Counts must stay consistent. Item and vector totals are hardcoded in several files (see §4). CI runs
scripts/check-corpus.shand fails the PR if any of them disagree with the files on disk. - No AI-attribution trailers in commits or PRs. Commits and PR descriptions must not carry
Co-Authored-By: … Claude/Anthropic, "Generated with …", or similar trailers. Acommit-msghook that enforces this ships inscripts/hooks/(enable it with the command in §2) and CI re-checks every commit in the PR range. Using AI tooling to help write a contribution is fine; the author of record is the human who opens the PR and takes responsibility for the content. - Security issues in this repository (install script, Rust tools, workflows, or corpus content that could mislead an auditor into a dangerous action) go through SECURITY.md, not a public issue.
git clone https://github.com/solanabr/auditor-skill.git
cd auditor-skill
git config core.hooksPath scripts/hooks # enables the attribution-trailer commit-msg hook
bash scripts/check-corpus.sh # should print "ok" lines and exit 0 on a clean treeOptional: git submodule update --init --recursive for the vendored Trail of Bits tooling and
cd tools/auditor-tools && cargo build --release for the Rust CLIs. Neither is needed for corpus PRs.
- Branch from an up-to-date
main:git switch -c feat/<topic>-<dd-mm-yyyy>(prefixes in use:feat/,fix/,docs/,perf/,chore/). - Make the change. Run
bash scripts/check-corpus.shbefore every commit that toucheschecklists/,known-vectors/,references/methodologies/, or any file that quotes a count. - Commit with a conventional-style subject and a body that says what and why:
feat(corpus): <what> — <why>,fix(vector): …,docs(readme): …,chore(release): bump version to X.Y.Z. - Push the branch and open a PR against
mainusing the template. Fill in every section; "n/a" is an acceptable answer, an empty section is not. - Address review. Prefer new commits over force-pushes during review so reviewers can see what changed.
- A maintainer merges. Stacked PRs (a branch based on another open PR branch) are fine — say so in the description and merge them in order.
Version bumps are their own chore(release) PR (or the last commit of a release PR) — content PRs update
counts but leave the version alone, so several content PRs can be open at once without conflicting on the
version line.
- Create
known-vectors/NNN-short-name.mdwith the next free number. Never renumber existing vectors — ranges likeKV-001..NNNare quoted across the corpus and third-party reports reference the ids. - Follow the existing format exactly (see any recent file, e.g.
131-…or134-…): YAML frontmatter (id,title,severity,category) →### NNN — Title→**Severity: N** | **Real: …**→ description → cross-ref block →#### Verification Procedurewith numbered steps, each with a grep / check and ✅ PASS / ❌ FAIL lines →**Overall verdict:**with ✅ /⚠️ / ❌ / N/A. - Add a row to
known-vectors/INDEX.mdin the right section with a Load when (markers) cell (default toalways (<phase>)unless the vector is provably feature-specific), and update the totals at the bottom of the index (Total vector files,Distinct concepts, the per-version tally). - Bump the vector count in every file that quotes it:
SKILL.md(description + header + "up to N"),README.md,FULL-AUDIT.md,COSTS.md,OUTPUT-RULES.md,templates/report-template.md,docs/README.md,docs/getting-started.md,.claude-plugin/plugin.json.scripts/check-corpus.shtells you which ones you missed. - If the vector is feature-gated, add a row to the advisory table in
references/orchestration/pre-scan.mdand, when useful, a grep block indiscovery/grep-commands.md.
- Append to the relevant
checklists/NN-*.mdusing the file's id prefix and the next sequential number (ids are never reused, even if an item is removed). New sections get the nextNN.xheading. - Update the per-checklist counts in
SKILL.md(Checklists Reference table) andREADME.md(Supported Languages table and the folder-structure listing), the totals everywhere the item total is quoted (SKILL.md,README.md,COSTS.md,docs/README.md,templates/audit-report.md,templates/report-template.md,.claude-plugin/plugin.json), and the...through XX-NNNline for that checklist intemplates/report-template.md.
- Create
references/methodologies/<name>.mdfollowing the shape of the existing playbooks: a Load when block with grep markers, a Purpose paragraph, numbered sections (classify first → threat model / per-mechanism table → invariant catalog → worksheets → high-density surfaces → detection recipes → test / PoC strategy) and a fast-pass checklist at the end. - Register it: a row in the
SKILL.mdreference-loading table, a row in the pre-scan advisory table, the methodology count and list inREADME.md(two places) anddocs/README.md, and — if it adds invariants a harness can assert — a section inreferences/invariant-catalog.md.
- Every claim of a real incident must be a public, verifiable one (post-mortem, audit report, advisory). Say "class of bug" when you cannot cite an incident. Do not invent dollar figures.
- Items are verification steps, not advice: an auditor must be able to mark each one PASS / FAIL / N/A from the code. If it cannot be checked, it does not belong in a checklist.
- Prefer grep-able markers and exact identifiers over prose.
tools/auditor-tools (Rust) and scripts/ have their own conventions: keep cargo build --release
warning-free, add or extend a fixture under the tool's test directory for any parser change, and document
new flags in docs/power-tools.md. Workflow files pin third-party actions to a full commit SHA with the
version in a trailing comment.
- Does the change do one thing, and is that thing described accurately in the PR?
- Do all counts, index rows, and reference-table rows agree (
scripts/check-corpus.shgreen)? - Are new vectors / items checkable from code, with a PASS / FAIL shape and a grep?
- Are cited incidents real and public?
- No attribution trailers, no secrets, no
.env/ state / local assistant files tracked.