plugins/ci/skills/fetch-regression-details/SKILL.md
Fetch detailed information about a Component Readiness regression from the Sippy API
npx skillsauth add openshift-eng/ai-helpers fetch-regression-detailsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill fetches detailed regression information from the Component Readiness API. It retrieves comprehensive data about a specific regression including test name, affected variants, release information, triage status, and related metadata.
Use this skill when you need to retrieve complete details about a Component Readiness regression, such as:
Network Access: Must be able to reach the Sippy API
curl -s https://sippy.dptools.openshift.org/api/healthPython 3: Python 3.6 or later
python3 --versionThe skill uses a Python script to fetch and parse regression data (including sample failed jobs):
# Path to the Python script
script_path="plugins/ci/skills/fetch-regression-details/fetch_regression_details.py"
# Fetch regression data in JSON format (includes failed jobs)
python3 "$script_path" <regression_id> --format json
# Or fetch as human-readable summary
python3 "$script_path" <regression_id> --format summary
The script outputs structured JSON data that can be further processed:
# Store JSON output in a variable for processing
regression_data=$(python3 "$script_path" 34446 --format json)
# Extract specific fields using jq if needed
test_name=$(echo "$regression_data" | jq -r '.test_name')
component=$(echo "$regression_data" | jq -r '.component')
jira_keys=$(echo "$regression_data" | jq -r '.triages[].jira_key')
# Extract failed job URLs for analysis
failed_job_urls=$(echo "$regression_data" | jq -r '.sample_failed_jobs | to_entries[] | .value.failed_runs[] | .job_url')
The structured data includes all necessary regression details:
{
"regression_id": 34446,
"test_name": "[sig-builds][Feature:Builds] custom build with buildah...",
"test_id": "openshift-tests:71c053c318c11cfc47717b9cf711c326",
"release": "4.22",
"base_release": "4.21",
"component": "Build",
"capability": "Builds",
"view": "4.22-main",
"opened": "2026-01-28T08:02:45.127153Z",
"closed": null,
"status": "open",
"last_failure": "2026-01-30T07:03:46Z",
"variants": [
"Architecture:amd64",
"Platform:metal",
"Network:ovn",
"Upgrade:none"
],
"max_failures": 18,
"triages": [
{
"id": 344,
"url": "https://redhat.atlassian.net/browse/OCPBUGS-74651",
"jira_key": "OCPBUGS-74651",
"type": "product",
"description": "RHCOS 10 metal ipv4 job permafailing on ipv6 network access",
"bug_id": 17817794,
"resolved": false,
"created_at": "2026-01-29T17:58:20.858051Z",
"updated_at": "2026-01-30T13:28:33.429963Z"
}
],
"analysis_status": -2,
"analysis_explanations": [
"Test is failing consistently across multiple job runs",
"Regression detected compared to baseline release"
],
"sample_failed_jobs": {
"periodic-ci-openshift-release-master-nightly-4.22-e2e-metal-ipi-ovn-ipv4-rhcos10-techpreview": {
"pass_sequence": "FFFFFFFFFFFFFFFFFF",
"label_summary": {
"ErrImagePullQuay502BadGateway": 3
},
"failed_runs": [
{
"job_url": "https://prow.ci.openshift.org/view/gs/test-platform-results/logs/...",
"job_run_id": "2017184460591599616",
"start_time": "2026-01-30T10:33:47",
"test_failures": 3,
"job_labels": ["ErrImagePullQuay502BadGateway"]
}
]
},
"periodic-ci-openshift-release-master-nightly-4.22-e2e-metal-ipi-ovn-techpreview": {
"pass_sequence": "SSFSSSSSSSS",
"label_summary": {},
"failed_runs": [
{
"job_url": "https://prow.ci.openshift.org/view/gs/test-platform-results/logs/...",
"job_run_id": "2016460830022832128",
"start_time": "2026-01-28T10:37:27",
"test_failures": 1,
"job_labels": []
}
]
}
},
"job_runs": [
{
"id": 2600,
"regression_id": 34446,
"prowjob_run_id": "2044678206610477056",
"prowjob_name": "periodic-ci-openshift-release-master-nightly-4.22-e2e-metal-ipi-ovn-ipv4-rhcos10-techpreview",
"prowjob_url": "https://prow.ci.openshift.org/view/gs/test-platform-results/logs/periodic-ci-openshift-release-master-nightly-4.22-e2e-metal-ipi-ovn-ipv4-rhcos10-techpreview/2044678206610477056",
"start_time": "2026-04-16T07:23:39Z",
"test_failures": 3
}
],
"test_details_url": "https://sippy.dptools.openshift.org/api/component_readiness/test_details?...",
"api_url": "https://sippy.dptools.openshift.org/api/component_readiness/regressions/34446"
}
Note:
analysis_status: Integer status code from the regression analysis. Negative numbers indicate problems, with lower numbers representing more severe issues.analysis_explanations: List of human-readable explanations describing the status of the regression.sample_failed_jobs: Dictionary keyed by job name. Each job contains:
pass_sequence: Chronological success/fail pattern for this specific job (newest to oldest). "S" = successful run, "F" = failing run. Example: "FFFFFSSS" shows 5 recent failures, then 3 older successes.label_summary: Dictionary of {label: count} aggregated across all failed runs for this job. A label appearing in many/all failed runs is a strong signal that the labelled symptom is the root cause. Labels are human-defined: a team member wrote a regex that matches specific artifact content and named the symptom (e.g., "ErrImagePullQuay502BadGateway"). If many or all failed runs share a label, prioritize investigating that symptom.failed_runs: List of failed runs for this job, sorted by start_time (newest first). Each run includes:
test_failures: Total number of tests failing in the entire job run (not just the regressed test). High values (>10) indicate a mass failure run where the regressed test may be collateral damage rather than the primary problem.job_labels: List of symptom labels applied to this specific run. Labels are precise — they fire only when a human-defined regex matches job artifacts. An empty list means no known symptom was detected for this run.job_runs: Complete list of all job runs where the failure was observed throughout the entire life of the regression (not just the last reporting period). Sorted by start_time (newest first). Each entry contains:
id: Unique ID for this job run recordregression_id: The regression this run belongs toprowjob_run_id: The Prow job run IDprowjob_name: The Prow job nameprowjob_url: Direct URL to the Prow job runstart_time: ISO 8601 timestamp when the job startedtest_failures: Integer — total number of test failures in this job run. High values (e.g., >10) indicate a mass failure run where the regressed test may just be caught up in a larger issue rather than being the primary problemfetch_related_triages API to find regressions with shared job runs.The Python script handles common error cases automatically:
python3 fetch_regression_details.py 99999999
# Error: Regression ID 99999999 not found.
# Verify the regression ID exists in Component Readiness.
python3 fetch_regression_details.py abc
# Error: Regression ID must be a positive integer, got 'abc'
python3 fetch_regression_details.py 34446
# Error: Failed to connect to Sippy API: [Errno -2] Name or service not known
# Check network connectivity and VPN settings.
python3 fetch_regression_details.py
# Usage: fetch_regression_details.py <regression_id> [--format json|summary]
Exit Codes:
0: Success1: Error (invalid input, API error, network error, etc.)The API returns a JSON object with the following structure:
{
"id": 34446,
"view": "4.22-main",
"release": "4.22",
"base_release": "4.21",
"component": "Build",
"capability": "Builds",
"test_id": "openshift-tests:71c053c318c11cfc47717b9cf711c326",
"test_name": "[sig-builds][Feature:Builds] custom build with buildah...",
"variants": [
"Upgrade:none",
"Architecture:amd64",
"Platform:metal",
"Network:ovn"
],
"opened": "2026-01-28T08:02:45.127153Z",
"closed": {
"Time": "0001-01-01T00:00:00Z",
"Valid": false
},
"triages": [
{
"id": 344,
"created_at": "2026-01-29T17:58:20.858051Z",
"updated_at": "2026-01-30T13:28:33.429963Z",
"url": "https://redhat.atlassian.net/browse/OCPBUGS-74651",
"description": "Description of the triage",
"type": "product",
"bug_id": 17817794,
"resolved": {
"Time": "0001-01-01T00:00:00Z",
"Valid": false
}
}
],
"last_failure": {
"Time": "2026-01-30T07:03:46Z",
"Valid": true
},
"max_failures": 18,
"job_runs": [
{
"id": 2600,
"regression_id": 34446,
"prowjob_run_id": "2044678206610477056",
"prowjob_name": "periodic-ci-openshift-release-master-nightly-4.22-e2e-metal-ipi-ovn-ipv4-rhcos10-techpreview",
"prowjob_url": "https://prow.ci.openshift.org/view/gs/test-platform-results/logs/...",
"start_time": "2026-04-16T07:23:39Z",
"test_failures": 3
}
],
"links": {
"self": "https://sippy.dptools.openshift.org/api/component_readiness/regressions/34446",
"test_details": "https://sippy.dptools.openshift.org/api/component_readiness/test_details?..."
}
}
Key Fields:
id: Regression IDtest_name: Full test name with signature groupsrelease: Sample release (e.g., "4.22")base_release: Baseline release for comparison (e.g., "4.21")component: Component owning the testcapability: Higher-level capability areavariants: Array of variant key:value pairs (e.g., "Platform:metal", "Network:ovn")opened: ISO 8601 timestamp when regression was first detectedclosed: Object with Valid boolean and Time (valid if regression is closed)triages: Array of triage objects with JIRA URL, type, and resolution statusjob_runs: Array of all job runs where the failure was observed throughout the regression's entire life. Each entry includes prowjob_run_id, prowjob_name, prowjob_url, start_time, and test_failures (total failures in the run — high values indicate mass failure runs where the regression may be collateral damage)links.test_details: Direct URL to Sippy test details page with sample failures# Fetch regression 34446 in JSON format (includes failed jobs)
python3 plugins/ci/skills/fetch-regression-details/fetch_regression_details.py 34446 --format json
Expected Output:
{
"regression_id": 34446,
"test_name": "[sig-builds][Feature:Builds] custom build with buildah...",
"test_id": "openshift-tests:71c053c318c11cfc47717b9cf711c326",
"release": "4.22",
"base_release": "4.21",
"component": "Build",
"capability": "Builds",
"status": "open",
"variants": ["Architecture:amd64", "Platform:metal", "Network:ovn"],
"triages": [
{
"jira_key": "OCPBUGS-74651",
"type": "product",
"resolved": false
}
],
"analysis_status": -2,
"analysis_explanations": [
"Test is failing consistently across multiple job runs",
"Regression detected compared to baseline release"
],
"sample_failed_jobs": {
"periodic-ci-openshift-release-master-nightly-4.22-e2e-metal-ipi-ovn-ipv4-rhcos10-techpreview": {
"pass_sequence": "FFFFFFFFFFFFFFFFFF",
"failed_runs": [
{
"job_url": "https://prow.ci.openshift.org/view/gs/test-platform-results/logs/...",
"job_run_id": "2017184460591599616",
"start_time": "2026-01-30T10:33:47"
}
]
}
}
}
# Fetch regression 34446 as formatted summary
python3 plugins/ci/skills/fetch-regression-details/fetch_regression_details.py 34446 --format summary
Expected Output:
Regression #34446 Details:
============================================================
Test Name: [sig-builds][Feature:Builds] custom build with buildah...
Release: 4.22 (baseline: 4.21)
Component: Build
Status: Open (opened: 2026-01-28)
Max Failures: 19
Triages:
- OCPBUGS-74651 (product, active): Description of the issue
Sample Failed Jobs (19 runs):
- periodic-ci-openshift-release-master-nightly-4.22-e2e-metal-ipi-ovn-ipv4-rhcos10-techpreview
Run ID: 2017184460591599616
Started: 2026-01-30
URL: https://prow.ci.openshift.org/view/gs/test-platform-results/logs/...
# Get all failed job URLs for analysis
script_path="plugins/ci/skills/fetch-regression-details/fetch_regression_details.py"
data=$(python3 "$script_path" 34446 --format json)
# Extract failed job URLs
echo "$data" | jq -r '.sample_failed_jobs | to_entries[] | .value.failed_runs[] | .job_url'
Expected Output:
https://prow.ci.openshift.org/view/gs/test-platform-results/logs/periodic-ci-openshift-release-master-nightly-4.22-e2e-metal-ipi-ovn-ipv4-rhcos10-techpreview/2017184460591599616
https://prow.ci.openshift.org/view/gs/test-platform-results/logs/periodic-ci-openshift-release-master-nightly-4.22-e2e-metal-ipi-ovn-ipv4-rhcos10-techpreview/2017131608699572224
...
The script supports two output formats:
Returns structured JSON data with all regression fields:
{
"regression_id": 34446,
"test_name": "...",
"test_id": "...",
"release": "4.22",
"base_release": "4.21",
"component": "Build",
"capability": "Builds",
"view": "4.22-main",
"opened": "2026-01-28T08:02:45.127153Z",
"closed": null,
"status": "open",
"last_failure": "2026-01-30T07:03:46Z",
"variants": [...],
"max_failures": 19,
"triages": [...],
"analysis_status": -2,
"analysis_explanations": ["...", "..."],
"sample_failed_jobs": {...},
"test_details_url": "...",
"api_url": "..."
}
Returns human-readable formatted summary:
Regression #34446 Details:
============================================================
Test Name: [sig-builds][Feature:Builds] custom build with buildah...
Release: 4.22 (baseline: 4.21)
Component: Build
Capability: Builds
Status: Open (opened: 2026-01-28)
Last Failure: 2026-01-30
Max Failures: 19
Analysis Status: -2
(Negative status indicates a problem - lower is more severe)
Analysis Explanations:
- Test is failing consistently across multiple job runs
- Regression detected compared to baseline release
Affected Variants:
- Architecture:amd64
- Platform:metal
- Network:ovn
- Upgrade:none
Triages:
- OCPBUGS-74651 (product, active): Description...
Test Details: https://sippy.dptools.openshift.org/...
API URL: https://sippy.dptools.openshift.org/api/...
test_details_url provides links to sample job failures for further analysisstatus: "closed" and a non-null closed timestampvariants array shows all platform/topology combinations where the test is failing--format summary for human-readable outputanalysis_status is an integer where negative values indicate problems (lower = more severe)analysis_explanations provides human-readable context for the analysis statussample_failed_jobs is a dictionary keyed by job name, containing only jobs with at least one failed runpass_sequence string (newest to oldest) with "S" for successful runs and "F" for failed runslabel_summary dict aggregating job_labels across all failed runs for that job. This is the first place to look for a shared root cause: if most or all failed runs share a label, that symptom is almost certainly the root cause. Labels are human-defined and precise — they only fire when a regex written by a team member matches specific artifact content.test_failures (total tests failing in the job run) and job_labels (symptom labels for that specific run). Use test_failures > 10 as a signal for mass failure runs where the regressed test may be collateral damage.job_runs contains the complete history of all job runs where the failure was observed across the regression's entire lifetime, sorted by start_time (newest first). Use this to determine when failures started, how common they were, and which jobs are most affected. The test_failures field shows the total failure count in each run — high values (e.g., >10) indicate mass failure runs where the regression may just be caught up in a larger issue rather than being the primary problemci:analyze-prow-job-test-failure (for analyzing individual test failures)/ci:analyze-regression (uses this skill)testing
Snapshot OpenShift payload data (release controller, PR diffs, comments, CI jobs, JUnit results, regression tracking) to a local directory for offline analysis
research
Shared engine for analyzing Jira issue activity and generating status summaries
tools
This skill should be used before any Snowflake command to verify MCP connectivity, guide users through access provisioning, and set the session context. Invoke this skill proactively whenever a command needs Snowflake data access.
development
Analyze a payload snapshot to identify root causes of blocking job failures, score candidate PRs, and produce an HTML report with revert recommendations