A reusable pattern for automating the operational layer of vulnerability management. Covers reporting, metrics, triage routing, exception tracking, and program hygiene. Keeps human judgment where it belongs and automates the memory.
↓ Download SKILL.mdmkdir -p .claude/skills/vuln-ops-playbook
cp SKILL.md .claude/skills/vuln-ops-playbook/SKILL.mdOnce installed, Claude will reference these patterns whenever you mention reporting, metrics, triage routing, exceptions, or vulnerability program operations. It handles the operational scaffolding so you can focus on the decisions that require human judgment.
Scheduled status reports with severity breakdown, SLA tracking, deadline warnings, and recognition for completed remediations. Drafted automatically, sent after human approval.
Reconstruct the full history from timestamps already in the issue tracker. Open vs. closed, inflow vs. outflow, time to remediate, and SLA compliance from day one.
Match orphaned findings to owners using code-ownership data. Route on strong signal only. When evidence is unclear, escalate to the team manager instead of guessing.
Automate the creation of exception records when findings breach their SLA. Bounded risk windows with expiration dates. Approval stays with a human who has the authority.
Retire lapsed exceptions, deduplicate findings across scans, surface quiet cancellations, and flag items closed without a fix. The register stays trustworthy because it cleans up after itself.
Anything that puts a person's name on a finding or moves work between teams starts as a suggestion a human approves. Flagging is automatic. Commitment is reviewed until the logic earns trust.
The system proposes an owner when the evidence is clear and stays silent when it is not. Silence with a flag beats a confident wrong answer that people learn to ignore.
Automation can open a record, set a reminder, and route it. It should not grant itself authority it does not have. Creating a record and approving a risk are two different actions with two different permission levels.
Deduplicate, retire stale items, and surface decisions. A register no one trusts is worse than no register. Every automated change includes a reason. Every quiet decision gets surfaced.
A reusable pattern for automating the operational layer of vulnerability management. Covers reporting, metrics, triage routing, exception tracking, and program hygiene. Keeps human judgment where it belongs and automates the memory.
Treat the issue tracker as the system of record and automate everything around it. The scanner files each finding as an issue. Reporting, metrics, routing, and exceptions all read from and write back to those issues on a schedule. People make the decisions that require judgment. The system handles the mechanical work and, more importantly, the memory.
The memory part matters most. Programs fail less because people cannot fix vulnerabilities and more because no one remembers which deadline is approaching, who owns an unowned finding, or which exception is about to lapse.
A scheduled job reads the live issue set and produces the same status summary a human would write each week: active count, severity breakdown, deadlines approaching and breached, and recognition for work completed. The job drafts the message and a person approves it before it sends.
One rule prevents the most common error: credit completed work since the last report, not since the start of the month, so a skipped week never double-counts.
Report structure:
Operational rules:
Trend reporting usually stalls on the belief that you must start collecting snapshots and wait months. You do not. Open versus closed, inflow versus outflow, time to remediate, and deadline compliance can all be reconstructed from the create and close timestamps already attached to every issue. The full history is available the day you start.
Available from day one:
Implementation notes: Query the issue tracker for all issues with a vulnerability label/tag. Use created_at and closed_at timestamps to reconstruct any historical window. Store nothing new. The data already exists; you are just querying it differently.
Findings that the scanner cannot map to an owner pile up in a default queue. Resolve them using the code-ownership file the engineering org already maintains, narrowed to the person who actually commits to the affected path.
Routing logic:
Two guardrails: Route only on strong signal. If the mapping is ambiguous, say so and escalate. Silence with a flag beats a confident wrong answer that people learn to ignore.
When a finding breaches its deadline without being fixed, the choice is binary: fix it now or formally accept the risk for a bounded window. Automating the creation of that exception record forces the decision into the open.
Exception workflow:
The line: Creating the exception record is mechanical and safe to automate. Approving the risk is a human decision that belongs to someone with the authority to make it. Never let automation grant itself permission to extend deadlines.
The register stays trustworthy only if it cleans up after itself.
Anything that puts a person's name on a finding or moves work between teams starts as a suggestion a human approves. Flagging is automatic; commitment is reviewed until the logic earns trust.
The system proposes an owner when the evidence is clear and stays silent when it is not. Silence with a flag beats a confident wrong answer that people learn to ignore.
Automation can open a record, set a reminder, and route it. It should not grant itself authority it does not have. Creating a record and approving a risk are two different actions with two different permission levels.
Deduplicate, retire stale items, and surface decisions. A register no one trusts is worse than no register. Every automated change includes a reason. Every quiet decision gets surfaced.
This playbook is tool-agnostic. It assumes only that findings become trackable items in an issue tracker, each item has an owner (or lacks one), a severity, and a deadline, the issue tracker exposes an API or query interface, and a chat tool exists for report distribution and notifications.
Replace the tool names with your own. The patterns stay the same whether your tracker is Linear, Jira, GitHub Issues, or a spreadsheet. The reporting channel can be Slack, Teams, email, or any destination that accepts formatted text. The code-ownership source can be a CODEOWNERS file, a service catalog, or a team directory.
This playbook covers the operational layer between the scanner and the humans who fix things. It assumes the scanner is already running and the remediation knowledge already exists within the engineering team.