Agent skill

Report Findings

by openshift-eng in openshift-eng/ai-helpers

Generate triage reports and post findings to Jira and Slack. An agent skill from openshift-eng/ai-helpers.

Apache-2.0Auto-check passedSecurity

Install Report Findings

skills CLI
$ npx skills add openshift-eng/ai-helpers --skill report-findings -a claude-code

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

GitHub CLI
$ gh skill install openshift-eng/ai-helpers report-findings --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/openshift-eng/ai-helpers.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/node-cve/skills/report-findings .claude/skills/report-findings && 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
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.

  1. Generate markdown report
  2. Post Jira comments (if --notify-jira)
  3. Send Slack notification (if --notify-slack)
  4. Save structured data
  5. Verify artifacts

What it can do on your machine

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.

SKILL.md

The full file from openshift-eng/ai-helpers at commit a627176, republished under its Apache-2.0 licence (© openshift-eng). 1,602 words, ~4,926 tokens.

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:

  1. Present in the tracker_keys list of the CVE record produced by query-open-cves (Phase 1), AND
  2. Re-validated against the Node team component list immediately before posting (see Step 2 below), AND
  3. 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:

bash
{
  echo "=== Node CVE Triage Posting Audit — $(date +%Y-%m-%d) ==="
  echo "Version filter: $VERSION_FILTER (auto-detected)"
  echo "CVEs processed: $CVE_COUNT"
  echo "Trackers commented: $POSTED_COUNT"
  echo "Trackers skipped (non-Node component): $SKIPPED_COMPONENT_COUNT"
  echo "Trackers skipped (version mismatch): $SKIPPED_VERSION_COUNT"
  echo ""
  echo "Skipped trackers (tracker, component/version, reason):"
  cat "$SKIPPED_LOG"
} > ".work/node-cve/triage-$(date +%Y-%m-%d)/posting-audit.log"

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.

Show full SKILL.md (470 more words)Show less
Step 3: Send Slack notification (if --notify-slack)

Two modes are supported depending on which credentials are available:

Mode A: Slack API ($SLACK_API_TOKEN + $SLACK_CHANNEL) - enables threaded messages.

Step 3a: Post summary (main message)

bash
RESPONSE=$(curl -s -X POST "https://slack.com/api/chat.postMessage" \
  -H "Authorization: Bearer $SLACK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$(cat <<'SLACK'
{
  "channel": "$SLACK_CHANNEL",
  "blocks": [
    {
      "type": "header",
      "text": {
        "type": "plain_text",
        "text": "Node CVE Triage (N CVEs analyzed)"
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": ":red_circle: Reachable: <https://redhat.atlassian.net/issues/?jql=key%20in%20(OCPBUGS-XXXXX)|N> (<https://redhat.atlassian.net/issues/?jql=key%20in%20(OCPBUGS-XXXXX)%20AND%20assignee%20is%20EMPTY|M> unassigned)\n:large_yellow_circle: Present: <https://redhat.atlassian.net/issues/?jql=key%20in%20(OCPBUGS-XXXXX)|N> (<https://redhat.atlassian.net/issues/?jql=key%20in%20(OCPBUGS-XXXXX)%20AND%20assignee%20is%20EMPTY|M> unassigned)\n:large_green_circle: Unaffected: <https://redhat.atlassian.net/issues/?jql=key%20in%20(OCPBUGS-XXXXX)|N>\n:grey_question: Uncertain: <https://redhat.atlassian.net/issues/?jql=key%20in%20(OCPBUGS-XXXXX)|N>"
      }
    },
    {
      "type": "context",
      "elements": [
        {
          "type": "mrkdwn",
          "text": ":robot_face: AI-generated by node-cve:triage. Always review prior to use."
        }
      ]
    }
  ]
}
SLACK
)"

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.

Step 3b: Post detailed findings (thread reply)

bash
curl -s -X POST "https://slack.com/api/chat.postMessage" \
  -H "Authorization: Bearer $SLACK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$(cat <<'SLACK'
{
  "channel": "$SLACK_CHANNEL",
  "thread_ts": "<ts-from-step-3a>",
  "blocks": [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*Reachable (action required):*\n• <https://redhat.atlassian.net/issues/?jql=key%20in%20(OCPBUGS-XXXXX%2COCPBUGS-YYYYY)|CVE-XXXX-XXXXX> - <short description>. (CRI-O, high confidence, N trackers[, M unassigned])\n\n*Present (no action needed):*\n• <https://redhat.atlassian.net/browse/OCPBUGS-XXXXX|CVE-XXXX-XXXXX> - <short description>. (kubernetes, high confidence, 1 tracker)\n\n*Unaffected:*\n• ...\n\n*Uncertain:*\n• ..."
      }
    },
    {
      "type": "context",
      "elements": [
        {
          "type": "mrkdwn",
          "text": ":robot_face: AI-generated by node-cve:triage. Always review prior to use."
        }
      ]
    }
  ]
}
SLACK
)"

Mode B: Webhook ($SLACK_WEBHOOK) - simpler setup, no threading.

Post a single message containing both summary and detailed findings:

bash
curl -s -X POST "$SLACK_WEBHOOK" \
  -H "Content-Type: application/json" \
  -d "$(cat <<'SLACK'
{
  "blocks": [
    {
      "type": "header",
      "text": {
        "type": "plain_text",
        "text": "Node CVE Triage (N CVEs analyzed)"
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": ":red_circle: Reachable: <https://redhat.atlassian.net/issues/?jql=key%20in%20(OCPBUGS-XXXXX)|N> (<https://redhat.atlassian.net/issues/?jql=key%20in%20(OCPBUGS-XXXXX)%20AND%20assignee%20is%20EMPTY|M> unassigned)\n:large_yellow_circle: Present: <https://redhat.atlassian.net/issues/?jql=key%20in%20(OCPBUGS-XXXXX)|N>\n:large_green_circle: Unaffected: <https://redhat.atlassian.net/issues/?jql=key%20in%20(OCPBUGS-XXXXX)|N>"
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*Reachable (action required):*\n• <https://redhat.atlassian.net/issues/?jql=key%20in%20(OCPBUGS-XXXXX%2COCPBUGS-YYYYY)|CVE-XXXX-XXXXX> - <short description>. (CRI-O, high confidence, N trackers[, M unassigned])\n\n*Present (no action needed):*\n• ...\n\n*Unaffected:*\n• ..."
      }
    },
    {
      "type": "context",
      "elements": [
        {
          "type": "mrkdwn",
          "text": ":robot_face: AI-generated by node-cve:triage. Always review prior to use."
        }
      ]
    }
  ]
}
SLACK
)"

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:

json
{
  "date": "YYYY-MM-DD",
  "version_filter": "5.0",
  "total_cves": 6,
  "cves": [
    {
      "cve_id": "CVE-XXXX-XXXXX",
      "summary": "...",
      "components": ["Node / CRI-O"],
      "repo": "https://github.com/openshift/cri-o",
      "overall_classification": "REACHABLE",
      "overall_confidence": "HIGH",
      "assignee": "...",
      "tracker_keys": ["OCPBUGS-XXXXX"],
      "affected_versions": ["5.0"],
      "branch": "release-1.36",
      "ocp_version": "5.0",
      "evidence_summary": "...",
      "recommended_action": "..."
    }
  ]
}
Step 5: Verify artifacts

Ensure all generated files exist under .work/node-cve/triage-YYYY-MM-DD/:

  • report.md - full report
  • cves.json - structured CVE data (for programmatic consumption)
  • posting-audit.log - only when --notify-jira was used (see Step 2); do not expect this file otherwise
  • <CVE-ID>-<branch>-analysis.md - per-CVE per-branch source code analysis (from Phase 2)

Return Value

json
{
  "skill": "report-findings",
  "status": "success",
  "version_filter": "5.0",
  "report_path": ".work/node-cve/triage-2026-05-20/report.md",
  "jira_comments_posted": 6,
  "jira_comments_failed": 0,
  "jira_trackers_skipped_non_node_component": 0,
  "jira_trackers_skipped_version_mismatch": 0,
  "slack_notified": true,
  "artifacts": [
    ".work/node-cve/triage-2026-05-20/report.md",
    ".work/node-cve/triage-2026-05-20/cves.json",
    ".work/node-cve/triage-2026-05-20/posting-audit.log"
  ]
}

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.

© openshift-eng, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in plugins/node-cve/skills/report-findings of openshift-eng/ai-helpers.

Open the folder on GitHubat commit a627176

Compare with similar skills

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
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Report Findings this skillopenshift-eng/ai-helpers120—~4.9kAutomated safety check: PassApache-2.0
Building Vulnerability Dashboard With Defectdojomukul975/Anthropic-Cybersecurity-Skills34k—~2kAutomated safety check: PassApache-2.0
Security Assessmentamd/gaia1.6k—~1.8kAutomated safety check: PassMIT
Hunt Auth Bypasselementalsouls/Claude-BugHunter4.8k—~8.2kAutomated safety check: PassMIT
Tool ConnectorZhixiangLuo/10xProductivity478—~925Automated safety check: PassMIT
Sentry Alert TunerLeoYeAI/openclaw-master-skills2.2k—~7.3kAutomated safety check: PassMIT

Similar skills

  • Building Vulnerability Dashboard With Defectdojo

    mukul975/Anthropic-Cybersecurity-Skills

    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…

    34k GitHub stars~2k tokensUpdated 1 mo ago
    DevOps & CloudAuto-check passed
  • 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…

    1.6k GitHub stars~1.8k tokensUpdated yesterday
    SecurityAuto-check passed
  • Hunt Auth Bypass

    elementalsouls/Claude-BugHunter

    Hunting skill for auth bypass vulnerabilities. An agent skill from elementalsouls/Claude-BugHunter.

    4.8k GitHub stars~8.2k tokensUpdated yesterday
    SecurityAuto-check passed
  • Tool Connector

    ZhixiangLuo/10xProductivity

    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…

    478 GitHub stars~925 tokensUpdated 2 mo ago
    DevOps & CloudAuto-check passed
  • Sentry Alert Tuner

    LeoYeAI/openclaw-master-skills

    Reduce Sentry alert fatigue by surgically tuning issue grouping, fingerprint rules, severity mapping, sample rates, before-send filters, sourcemap pipelines, and release-health gates.

    2.2k GitHub stars~7.3k tokensUpdated 2 mo ago
    DevOps & CloudAuto-check passed
  • Deepsec Documentation Guide

    vercel-labs/deepsec

    Official

    Points the agent at deepsec's own docs to answer questions about initializing, configuring, resuming, scanning with and extending the vulnerability scanner.

    8.1k GitHub stars~956 tokensUpdated 10 days ago
    SecurityAuto-check passed

More from openshift-eng/ai-helpers

All 118 skills in this repo
  • Investigate CI Reliability

    openshift-eng/ai-helpers

    Find and independently validate actionable reliability defects across OpenShift release jobs and presubmits, then export portable issue handoffs.

    120 GitHub stars~1.9k tokensUpdated 3 days ago
    Auto-check passed
  • Address Review PR

    openshift-eng/ai-helpers

    Fetch and address all PR review comments — categorize by priority, make code changes, post replies, and push.

    120 GitHub stars~2.9k tokensUpdated 3 days ago
    Auto-check passed
  • Categorize Activity Types

    openshift-eng/ai-helpers

    Categorize Jira issues into Red Hat Sankey Activity Type categories using MCP Jira tools.

    120 GitHub stars~2.4k tokensUpdated 3 days ago
    Auto-check passed
  • Has Review Work

    openshift-eng/ai-helpers

    Decide whether a GitHub PR has unanswered authorized review comments or new required CI failures worth a follow-up agent.

    120 GitHub stars~1.9k tokensUpdated 3 days ago
    Auto-check passed
  • Must Gather Analyzer

    openshift-eng/ai-helpers

    Analyze OpenShift must-gather diagnostic data including cluster operators, pods, nodes, and network components.

    120 GitHub stars~2.3k tokensUpdated 3 days ago
    Auto-check passed
  • Payload Autodl JSON

    openshift-eng/ai-helpers

    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

    120 GitHub stars~2.6k tokensUpdated 3 days ago
    Auto-check passed

Works with

Categories

Questions about Report Findings

What does Report Findings do?

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.