Files
Adam Daley 1420584f6d Add security-advisory-triage skill (#4232)
* Add security-advisory-triage skill

Codifies the two-stage workflow for handling a reported GitHub Security
Advisory: verify it against current code with file:line evidence, then
refine its title/description/CVSS/CWE metadata to match this repo's
actual publish conventions before applying it. Includes a living
house-style reference derived from this repo's own published advisories.

Lives at .agents/skills/ with .claude/skills symlinked to it, matching
the existing AGENTS.md/.claude/CLAUDE.md convention for cross-tool
agent support.

* Fix spellcheck: add GHSA/macrovector/rubygems, ignore skills reference dir

The skills reference file legitimately contains GHSA advisory IDs as
provenance examples; those are opaque identifiers, not real words, and
new ones will keep appearing as more advisories get referenced there
over time, so excluding the directory from spellcheck avoids repeated
dictionary churn rather than fixing it once.

* Address CodeRabbit review on security-advisory-triage skill

- Stage 1's current-code check now requires an exact revision match
  (fetch + clean worktree + exact rev-parse comparison) instead of only
  an ancestor check, which could pass against a stale or divergent base.
- Stage 1's related-history step now queries each advisory state
  explicitly with --method GET, and calls out that gh api silently
  sends a POST (hitting the advisory-creation endpoint) when -f is used
  without --method GET. Verified directly against this repo: an
  unfiltered call does return every state for a maintainer-authenticated
  token, but explicit per-state queries are more portable.
- Confidentiality note broadened to cover chat/review/tool output, not
  just committed artifacts.
- CVSS guidance now distinguishes the nested read path
  (cvss_severities.cvss_v3/cvss_v4) from the flat write field
  (cvss_vector_string), and notes severity/cvss_vector_string are
  mutually exclusive on write.
- The live-advisory PATCH checklist now lists the actual top-level
  fields (summary, description, cwe_ids, cvss_vector_string/severity)
  instead of vaguely saying 'the description body', notes
  vulnerabilities is an array rather than assuming index [0] is
  everything, and says to PATCH the complete object per entry rather
  than a partial one.
- Added language tags to two fenced code blocks (shell, markdown) per
  markdownlint MD040.

* Fix data-loss gap in vulnerabilities PATCH guidance

The 'send the complete object' instruction added last round listed only
four fields (package.ecosystem/name, vulnerable_version_range,
patched_versions) and omitted vulnerable_functions, which is a real
field on the object (confirmed: this session's own successful PATCH
sent it as an empty array). Following that guidance literally on an
advisory where vulnerable_functions is actually populated would erase
it. Added the missing field.
2026-08-28 19:38:14 +01:00

Symbolic link
1 line
17 B
Plaintext