Install the "report-findings" agent skill from https://github.com/openshift-eng/ai-helpers/tree/main/plugins/node-cve/skills/report-findings into .claude/skills/report-findings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "report-findings", then confirm the skill loads.
Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Type this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
skills CLI
$ npx skills add openshift-eng/ai-helpers --skill report-findings -a codex
Project install goes to .agents/skills/; add -g for ~/.codex/skills/.
Install the "report-findings" agent skill from https://github.com/openshift-eng/ai-helpers/tree/main/plugins/node-cve/skills/report-findings into .agents/skills/report-findings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "report-findings", then confirm the skill loads.
Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add openshift-eng/ai-helpers --skill report-findings -a cursor
Project install goes to .agents/skills/; add -g for ~/.cursor/skills/.
Install the "report-findings" agent skill from https://github.com/openshift-eng/ai-helpers/tree/main/plugins/node-cve/skills/report-findings into .cursor/skills/report-findings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "report-findings", then confirm the skill loads.
Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
skills CLI
$ npx skills add openshift-eng/ai-helpers --skill report-findings -a gemini-cli
Project install goes to .agents/skills/; add -g for ~/.gemini/skills/.
Install the "report-findings" agent skill from https://github.com/openshift-eng/ai-helpers/tree/main/plugins/node-cve/skills/report-findings into .gemini/skills/report-findings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "report-findings", then confirm the skill loads.
Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Installs for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
skills CLI
$ npx skills add openshift-eng/ai-helpers --skill report-findings -a github-copilot
Project install goes to .agents/skills/; add -g for ~/.copilot/skills/.
Install the "report-findings" agent skill from https://github.com/openshift-eng/ai-helpers/tree/main/plugins/node-cve/skills/report-findings into .github/skills/report-findings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "report-findings", then confirm the skill loads.
GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add openshift-eng/ai-helpers --skill report-findings -a opencode
OpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
Install the "report-findings" agent skill from https://github.com/openshift-eng/ai-helpers/tree/main/plugins/node-cve/skills/report-findings into .opencode/skills/report-findings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "report-findings", then confirm the skill loads.
OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Facts
Skill name
report-findings
GitHub stars
120
Token cost
~4.9k tokens
SKILL.md length
1,602 words
Files
1
Skills in repo
118
Repo updated
First seen
Licence
Apache-2.0
At a glance
Generate triage reports and post findings to Jira and Slack. An agent skill from openshift-eng/ai-helpers.
Works in 5 steps: Generate markdown report → Post Jira comments (if --notify-jira) → Send Slack notification (if… → …
Tasks that involve Vulnerability scanning
SKILL.md covers When to Use, Prerequisites, Node Team Component Safeguard… and OCP Version Safeguard, plus 3 more sections
Calls curl and jq; reaches redhat.atlassian.net and github.com; needs SLACK_API_TOKEN and JIRA_API_TOKEN
What it does
Report Findings is an agent skill from openshift-eng/ai-helpers. Generate triage reports and post findings to Jira and Slack
Its SKILL.md is about 4.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Security, covering Vulnerability scanning. It works with Jira and Slack. The repository describes itself as: Developer productivity tools for Claude Code & other AI assistants. The licence is Apache-2.0.
When your agent uses it
Tasks that involve Vulnerability scanning
Example prompts
“/report-findings”
Requirements
A credential in JIRA_API_TOKEN
A credential in SLACK_API_TOKEN
Workflow steps
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit a627176. 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:
curl
jq
From the folder's file list and the shell code blocks in SKILL.md.
Network
Hosts in commands or code, which the agent is likely to contact:
redhat.atlassian.net
github.com
slack.com
From URLs in SKILL.md, links to its own repository left out.
Credentials
Names these keys or tokens, usually read from environment variables:
SLACK_API_TOKEN
JIRA_API_TOKEN
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Context cost
Report Findings loads about 4.9k tokens when it runs. Until then it costs about 19 tokens; SKILL.md has 1,602 words of instructions outside code blocks.
Always· name and description, kept in context so the agent knows when to use it
~19
When it runs· the whole SKILL.md, loaded when a task matches
~4.9k
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.
Download SKILL.mdSave it as .claude/skills/report-findings/SKILL.md (or your agent's skills folder).
name
report-findings
description
Generate triage reports and post findings to Jira and Slack
When to Use
Use this skill when Phase 3 of the node-cve:triage command needs to generate the triage report, post comments to Jira tracker issues, and send Slack notifications.
Prerequisites
jira CLI (for --notify-jira)
curl (for --notify-slack)
Environment variables: JIRA_API_TOKEN (for Jira)
For Slack: either SLACK_API_TOKEN + SLACK_CHANNEL (preferred, enables threading) or SLACK_WEBHOOK (simpler, no threading)
Node Team Component Safeguard (CRITICAL)
This skill may ONLY post comments to trackers whose component is a Node team component. Many CVEs (especially Go stdlib and vendored-dependency vulnerabilities) span 50-200+ tracker issues across dozens of OpenShift teams (HyperShift, Storage, Networking, Installer, Monitoring, Cloud providers, etc.). Node-specific reachability analysis is meaningless — and confusing — on another team's tracker.
The canonical Node team component list lives in the node-team shared components reference ("Jira Components (OCPBUGS)" section, plus Driver Toolkit and Machine Config Operator). Do not hardcode or duplicate that list here or anywhere else — always read it from the shared reference so it stays in sync as Node team components change. Note: the shared reference also documents pscomponent: label mappings, but those are for Phase 1 CVE discovery and Phase 2 repo mapping only — the posting-time validation in Step 2 below checks the tracker's COMPONENT field exclusively (see Step 2 for why).
Never do this (this is exactly what caused the 2026-07-15 incident where analysis was posted to ~200 non-Node trackers):
Do NOT run an ad-hoc/one-off Jira search scoped only by CVE ID (e.g. summary ~ "CVE-XXXX-XXXXX") to find trackers to comment on. A CVE ID alone is not enough to scope a search — it will return trackers for every team affected by that CVE.
Do NOT write a separate "batch posting script" that re-queries Jira outside of the tracker_keys produced by the query-open-cves skill in Phase 1.
Do NOT assume that because Phase 1 already filtered by component, it is safe to skip validation here. Always re-validate at posting time (defense in depth) — Phase 1's tracker_keys may have been supplemented, cached from a stale run, or copy-pasted into a manual follow-up.
Only post to tracker keys that are:
Present in the tracker_keys list of the CVE record produced by query-open-cves (Phase 1), AND
Re-validated against the Node team component list immediately before posting (see Step 2 below), AND
Re-validated against the active OCP version filter (see "OCP Version Safeguard" below and Step 2).
OCP Version Safeguard
This skill may ONLY post comments to trackers whose OCP version matches the auto-detected latest version. The OCP sustaining team owns triage and remediation for all versions except the latest in-development release. Posting Node-team reachability analysis to older-version trackers creates noise for the sustaining team and duplicates their work.
The query-open-cves skill (Phase 1) auto-detects the latest OCP version and filters trackers to it, but this skill re-validates at posting time as defense-in-depth — the same principle as the component safeguard above. The auto-detected version is passed through from Phase 1 via the version_filter field in the CVE query results.
At posting time, re-validate each tracker's OCP version (extracted from the tracker summary via regex \[openshift-([^\]]+)\]) against version_filter. If the tracker's version does not match (after stripping .z suffixes from both sides for comparison), skip it and log the reason in the posting audit log.
If you ever find yourself constructing a new JQL query or Jira search specifically to find trackers to comment on, STOP — that is the anti-pattern that caused this incident. Reuse the already-filtered tracker list from Phase 1 instead.
Implementation Steps
Step 1: Generate markdown report
Write the report to .work/node-cve/triage-YYYY-MM-DD/report.md:
markdown
# Node CVE Triage Report - YYYY-MM-DD
**Version scope:** OCP <version> (auto-detected)
## Summary
| Metric | Count |
|--------|-------|
| Total unique CVEs | N |
| Reachable | N |
| Present | N |
| Unaffected | N |
| Uncertain | N |
## Action Required
List CVEs that are Reachable or Uncertain with unassigned owners. These need immediate attention.
## Detailed Findings
### CVE-XXXX-XXXXX: <short description>
| Field | Value |
|-------|-------|
| Component | Node / CRI-O |
| Repository | openshift/cri-o |
| Overall classification | Reachable / Present but not exploitable / Present but not reachable / Unaffected / Uncertain |
| Overall confidence | High / Medium / Low |
| Assignee | <name or Unassigned> |
| OCP version | 5.0 |
| Tracker issues | [OCPBUGS-XXXXX](https://redhat.atlassian.net/browse/OCPBUGS-XXXXX) |
**Analysis result:**
| Branch | OCP Version | Classification | Confidence |
|--------|-------------|----------------|------------|
| release-1.36 | 5.0 | Reachable | High |
**Evidence:**
<source code analysis summary>
<call path if found>
**Recommended action:** <specific action>
---
(repeat for each CVE)
Step 2: Post Jira comments (if --notify-jira)
VALIDATION (MANDATORY, before posting anything): For each unique CVE, take its tracker_keys list from Phase 1 (query-open-cves) and re-validate every tracker against both the component list and the version filter immediately before posting — do not trust cached or upstream filtering alone:
bash
# component_is_node_team() checks the tracker's COMPONENT field against the
# canonical Node team component list from the shared components reference
# (link above), NOT a hardcoded list.
# version_matches_filter() checks the tracker's OCP version (from its summary)
# against version_filter from Phase 1, after stripping .z suffixes from both.
for tracker_key in $TRACKER_KEYS; do
# Single API call per tracker to minimize rate-limiting risk
output=$(jira issue view "$tracker_key" --plain --no-headers --columns COMPONENT,SUMMARY | tail -1)
component=$(echo "$output" | awk -F'\t' '{print $1}')
summary=$(echo "$output" | awk -F'\t' '{print $2}')
ocp_version=$(echo "$summary" | grep -oP '\[openshift-\K[^\]]+')
if ! component_is_node_team "$component"; then
echo "⚠️ SKIPPING $tracker_key: component '$component' is not a Node team component" | tee -a "$SKIPPED_LOG"
sleep 1
continue
fi
if ! version_matches_filter "$ocp_version" "$VERSION_FILTER"; then
echo "⚠️ SKIPPING $tracker_key: OCP version '$ocp_version' does not match version filter '$VERSION_FILTER'" | tee -a "$SKIPPED_LOG"
sleep 1
continue
fi
# Component and version validated — proceed with posting for $tracker_key
sleep 1
done
Component validation: A component is considered a Node team component only if it matches an entry in the "Jira Components (OCPBUGS)" list (plus Driver Toolkit, Machine Config Operator) in the shared components reference. Check the COMPONENT field only — do not treat a pscomponent: label as an alternative pass condition.pscomponent: labels are used in Phase 1/Phase 2 for CVE discovery and repo mapping, not for determining tracker ownership; a non-Node tracker (e.g. component "Security") could incidentally carry a pscomponent:cri-o label, and accepting that as a pass would silently reintroduce the exact cross-team contamination this safeguard exists to prevent.
Version validation: A tracker's OCP version is extracted from its summary using regex \[openshift-([^\]]+)\]. The version must match version_filter from Phase 1, after stripping .z suffixes from both sides for comparison (so tracker version 4.14.z matches filter 4.14, and version_filter itself is already stored in stripped major.minor form).
If a tracker fails either check, skip it and log the reason — never post "just in case." Both checks must run even when --component was explicitly passed, and even if Phase 1 already filtered, since this is the last line of defense before an irreversible write. Rate limit: sleep 1 second between validation calls, same as the posting calls below, since a CVE with N trackers makes N validation calls before posting even starts.
For each unique CVE, post a comment on every validated tracker issue. Each tracker receives the analysis result for the latest OCP version. Use Atlassian wiki markup (not Markdown):
bash
jira issue comment add OCPBUGS-XXXXX "$(cat <<'COMMENT'
h3. Automated CVE Reachability Analysis
||Field||Value||
|CVE|CVE-XXXX-XXXXX|
|Repository|[openshift/cri-o|https://github.com/openshift/cri-o]|
|Branch|release-1.36|
|OCP Version|5.0|
|Classification|Reachable / Present but not exploitable / Present but not reachable / Unaffected / Uncertain|
|Confidence|High / Medium / Low|
h4. Evidence
{noformat}
<source code analysis summary>
{noformat}
h4. Recommended Action
<specific next step>
----
_AI-generated analysis by [node-cve:triage|https://github.com/openshift-eng/ai-helpers/tree/main/plugins/node-cve]. Always review prior to use._
COMMENT
)"
Use the footer line exactly as shown. The "AI-generated" label and review notice are required by Red Hat's medium-risk AI agent controls (TR-01, HU-01). Do not append a date; the Jira comment timestamp already covers that.
Deduplication: Before posting a comment, check for existing node-cve:triage comments on the issue:
bash
jira issue comment list OCPBUGS-XXXXX --plain --no-headers
Search the output for comments containing [node-cve:triage|. This pattern anchors on the Jira wiki-markup link syntax and matches both the current and legacy footer formats. If a prior comment exists:
If the classification or evidence has changed, edit the existing comment rather than adding a new one
If the result is unchanged, skip posting to avoid spam
Important:
Rate limit: sleep 1 second between Jira API calls to avoid HTTP 429 throttling
Post to every validated tracker issue for a CVE
If commenting fails on a specific issue (e.g., permissions), log a warning and continue
POST-POSTING AUDIT (MANDATORY when --notify-jira is used): Write an audit log to .work/node-cve/triage-$(date +%Y-%m-%d)/posting-audit.log summarizing what was posted and what was skipped, so cross-team or cross-version contamination is caught immediately instead of discovered days later:
If any trackers were skipped, print a visible warning in the command summary output (Phase 4) so the operator notices immediately, e.g. "⚠️ Skipped N trackers during posting (K non-Node-component, J wrong version) — see posting-audit.log". A non-zero skip count is expected and healthy — for component skips it means the cross-team safeguard is working as intended, and for version skips it means older-version trackers are being left to the sustaining team as required.
Build the JQL URLs by collecting all tracker keys per classification group. Use key in (OCPBUGS-XXXXX, OCPBUGS-YYYYY, ...) as the filter. For the unassigned link, add AND (assignee is EMPTY OR assignee = "ocp-sustaining-blocked-trackers") to also count placeholder assignees as unassigned. URL-encode the JQL query. Omit the "(M unassigned)" part when M is 0. Omit empty classification lines.
On subsequent runs with cached results, change the header to "Node CVE Triage (N CVEs, M new)" or "Node CVE Triage (N CVEs, M new, K updated)".
Extract ts from the JSON response (jq -r '.ts') to use as thread_ts for the reply.
Both modes: Omit empty classification sections. If the total text exceeds the Slack character limit (3000 chars per text block), split across multiple blocks or truncate with "... and N more. See full report." If Slack returns a non-200 status, log a warning but do not fail the command.
Step 4: Save structured data
Write cves.json to .work/node-cve/triage-YYYY-MM-DD/cves.json containing the full analysis results in machine-readable format:
posting-audit.log is only produced when --notify-jira is used (see Step 2). When present, add it to the artifacts list; omit it entirely on runs without --notify-jira rather than reporting a file that was never written.
Error Handling
Non-Node-team component detected on a tracker: skip that tracker and log it in the audit log (see Step 2). Never post to it. Do not fail the entire command — other trackers for the same CVE may still be valid Node team trackers.
OCP version mismatch detected on a tracker: skip that tracker and log it in the audit log (see Step 2). The sustaining team owns older versions. Do not fail the entire command — this is expected behavior when the auto-detected latest version filters out older trackers.
Jira comment failures: log and continue. Do not fail the entire command because one tracker issue is inaccessible.
Slack failure: log warning. Common causes: invalid token/webhook URL, missing channel permissions, network issues, payload too large (Slack limit: 3000 chars per text block).
If the Slack payload exceeds the character limit, truncate the CVE list and add "... and N more. See full report."
File write failures: these are critical. Exit with error if the work directory is not writable.
Report Findings 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.
Report Findings compared with similar skills
Skill
Stars
Used in
Tokens
Auto-check
Licence
Repo updated
Report Findings this skillopenshift-eng/ai-helpers
Deploy DefectDojo as a centralized vulnerability management dashboard that ingests findings from 200+ security scanners, deduplicates results, tracks remediation metrics, and integrates with CI/CD…
Assess a reported security vulnerability in GAIA and fill a PSIRT / JIRA triage: decide if it is valid & exploitable, whether it needs a CVE + bulletin, and produce the CVSS 4.0 score, CWE, and CVE…
Connect any tool you use at work to your agent — including internal company tools, custom-built systems, deployment portals, incident trackers, internal knowledge bases, HR systems, and commercial…
Points the agent at deepsec's own docs to answer questions about initializing, configuring, resuming, scanning with and extending the vulnerability scanner.
Schema for the autodl JSON data file produced by payload-analysis for database ingestion — you must use this skill whenever generating the autodl JSON file
Generate triage reports and post findings to Jira and Slack. An agent skill from openshift-eng/ai-helpers. Report Findings is an agent skill from openshift-eng/ai-helpers.
When should I use Report Findings?
Report Findings fits situations like: tasks that involve Vulnerability scanning.
How do I install Report Findings in Claude Code?
Run `npx skills add openshift-eng/ai-helpers --skill report-findings -a claude-code`. Or copy the skill folder (plugins/node-cve/skills/report-findings in openshift-eng/ai-helpers) into .claude/skills/report-findings in your project. Claude Code loads it when a task matches its description.
How do I install Report Findings in Codex?
Run `npx skills add openshift-eng/ai-helpers --skill report-findings -a codex`. Or copy the skill folder (plugins/node-cve/skills/report-findings in openshift-eng/ai-helpers) into .agents/skills/report-findings in your project. Codex loads it when a task matches its description.
Can I use Report Findings 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 openshift-eng/ai-helpers --skill report-findings -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/report-findings, .gemini/skills/report-findings, .github/skills/report-findings and .opencode/skills/report-findings in your project.
What does Report Findings need to run?
Going by SKILL.md and its folder, Report Findings needs the command-line tools its instructions call (curl and jq) and credentials named SLACK_API_TOKEN and JIRA_API_TOKEN. Our summary lists: A credential in JIRA_API_TOKEN; A credential in SLACK_API_TOKEN.
Does Report Findings access the network?
SKILL.md names 3 domains. In commands or code: redhat.atlassian.net, github.com and slack.com; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Is Report Findings 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 Report Findings use?
Report Findings is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
How many tokens does Report Findings use?
About 4.9k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
What are the alternatives to Report Findings?
Skills that share tags, products or a category with Report Findings: Building Vulnerability Dashboard With Defectdojo (mukul975/Anthropic-Cybersecurity-Skills, 34k stars), Security Assessment (amd/gaia, 1.6k stars), Hunt Auth Bypass (elementalsouls/Claude-BugHunter, 4.8k stars) and Tool Connector (ZhixiangLuo/10xProductivity, 478 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Who maintains Report Findings?
openshift-eng (a GitHub organization) maintains it in openshift-eng/ai-helpers, which has 120 GitHub stars. The repository holds 118 skills in this directory. The repository was last updated on October 6, 2026.
Source: openshift-eng/ai-helpers on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.