Agent skill

Manage Symptoms

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

Create, update, or delete Sippy Symptoms — known CI failure signatures that automatically label job runs — via the authenticated Sippy API

Apache-2.0Auto-check passedTesting & QA

Install Manage Symptoms

skills CLI
$ npx skills add openshift-eng/ai-helpers --skill manage-symptoms -a claude-code

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

GitHub CLI
$ gh skill install openshift-eng/ai-helpers manage-symptoms --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/ci/skills/manage-symptoms .claude/skills/manage-symptoms && 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
manage-symptoms
GitHub stars
120
Token cost
~3.1k tokens
SKILL.md length
1,402 words
Files
3
Skills in repo
118
Repo updated
First seen
Licence
Apache-2.0

At a glance

Create, update, or delete Sippy Symptoms — known CI failure signatures that automatically label job runs — via the authenticated Sippy API

  • Works in 9 steps: Check for Duplicates → Verify the Target Labels Exist → Obtain Authentication Token → …
  • Tasks that involve Failing and flaky tests
  • SKILL.md covers When to Use This Skill, Prerequisites, Implementation Steps and API Details, plus 2 more sections
  • Runs Python scripts from its folder; calls python3; reaches api.cr.j7t7.p1.openshiftapps.com and sippy-auth.dptools.openshift.org; needs SIPPY_TOKEN

What it does

Manage Symptoms is an agent skill from openshift-eng/ai-helpers. Create, update, or delete Sippy Symptoms — known CI failure signatures that automatically label job runs — via the authenticated Sippy API

Its SKILL.md is about 3.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `manage_symptoms.py` and `test_manage_symptoms.py`).

It sits in Testing & QA, covering Failing and flaky tests. 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 Failing and flaky tests

Example prompts

  • “/manage-symptoms”

Requirements

  • Python 3
  • A credential in SIPPY_TOKEN

Workflow steps

9 steps, taken from the step headings in SKILL.md.

  1. Check for Duplicates
  2. Verify the Target Labels Exist
  3. Obtain Authentication Token
  4. Confirm the Payload with the User
  5. Create a Symptom
  6. Update a Symptom
  7. Delete a Symptom
  8. Apply the Label to Job Runs (Required after Create/Update)
  9. Verify

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

    Ships script files (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • python3

    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:

    • api.cr.j7t7.p1.openshiftapps.com
    • sippy-auth.dptools.openshift.org
    • prow.ci.openshift.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • SIPPY_TOKEN

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Manage Symptoms loads about 3.1k tokens when it runs. Until then it costs about 39 tokens; SKILL.md has 1,402 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~39
When it runs · the whole SKILL.md, loaded when a task matches
~3.1k

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,402 words, ~3,101 tokens.

Download SKILL.mdSave it as .claude/skills/manage-symptoms/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.
name
manage-symptoms
description
Create, update, or delete Sippy Symptoms — known CI failure signatures that automatically label job runs — via the authenticated Sippy API

Manage Symptoms

Sippy Symptoms are known-failure signatures for OpenShift CI. A symptom is a rule made of a file pattern (a glob over a CI job run's artifact files, e.g. **/build-log.txt) and a matcher (string = substring, regex = regular expression, none = file merely exists, cel = a compound CEL expression over other label names). When a symptom matches a job run's artifacts, Sippy applies one or more Labels — human-readable tags like InfraFailure — to that run. Labels appear in the Sippy UI and Spyglass and help everyone quickly recognize known failure modes without re-debugging them. You do not need any prior Sippy knowledge to use this skill.

Every symptom must always have at least one label. A symptom exists to label matching runs, so a symptom without a label serves no purpose. Even when the label reads the same string as another field (e.g. the summary), a label is still required — always supply --label-ids. Creating or updating a symptom with no labels is rejected by client-side validation.

Creating or updating a symptom does NOT apply its label to job runs that already finished. Symptom detection only runs automatically as new artifacts arrive, so a brand-new or changed symptom leaves already-completed runs unlabeled until you retroactively reevaluate them. After every create or update you MUST apply the label to the affected runs with the reevaluate-job-runs skill (see Step 8) — otherwise the label you defined never shows up in the Sippy UI or Spyglass, which is the most common reason a symptom "has a label but nothing is labeled."

When to Use This Skill

Use this skill when you need to:

  • Auto-label a recurring failure pattern you found in CI logs, so future runs are recognized without re-debugging
  • Correct an existing symptom's matcher, file pattern, or match string
  • Retire an obsolete symptom that no longer applies

Prerequisites

  1. OpenShift CLI Authentication: Required for authenticating to the sippy-auth API

    • Must be logged into the DPCR cluster via oc login
    • Cluster API: https://api.cr.j7t7.p1.openshiftapps.com:6443
    • Use the oc-auth skill to obtain the Bearer token
  2. Python 3: Python 3.6 or later

    • Check: python3 --version
    • Uses only standard library (no external dependencies)

Implementation Steps

Step 1: Check for Duplicates

Before creating a symptom, search the existing catalog to avoid duplicates:

bash
python3 plugins/ci/skills/list-symptoms/list_symptoms.py --search "AuthFailure" --format summary

If an equivalent symptom already exists, prefer updating it instead of creating a new one.

Step 2: Verify the Target Labels Exist

Symptoms can only reference labels that already exist:

bash
python3 plugins/ci/skills/list-symptoms/list_symptoms.py --labels --format summary

If a label is missing, create it first with the manage-labels skill. (The script also verifies label IDs against the labels API before submitting; use --skip-label-check only if the labels API is unreachable.)

Step 3: Obtain Authentication Token

Use the oc-auth skill to obtain a Bearer token from the DPCR cluster:

bash
# Get token from the DPCR cluster context
# The oc-auth skill's curl_with_token.sh uses this cluster for sippy-auth
DPCR_CLUSTER="https://api.cr.j7t7.p1.openshiftapps.com:6443"

# Find the oc context for the DPCR cluster and get the token
CONTEXT=$(oc config get-contexts -o name 2>/dev/null | while read -r ctx; do
  server=$(oc config view -o jsonpath="{.clusters[?(@.name=='$(oc config view -o jsonpath="{.contexts[?(@.name=='$ctx')].context.cluster}" 2>/dev/null)')].cluster.server}" 2>/dev/null || echo "")
  server_clean=$(echo "$server" | sed -E 's|^https?://||')
  if [ "$server_clean" = "api.cr.j7t7.p1.openshiftapps.com:6443" ]; then
    echo "$ctx"
    break
  fi
done)

if [ -z "$CONTEXT" ]; then
  echo "Error: Not logged into DPCR cluster. Please run: oc login $DPCR_CLUSTER"
  exit 1
fi

export SIPPY_TOKEN=$(oc whoami -t --context="$CONTEXT" 2>/dev/null)
if [ -z "$SIPPY_TOKEN" ]; then
  echo "Error: Failed to get token. Please re-authenticate to DPCR cluster."
  exit 1
fi

Prefer exporting SIPPY_TOKEN as above rather than passing --token on the command line — command-line arguments are visible in process listings. --token still works and takes precedence over the environment variable.

Step 4: Confirm the Payload with the User

Before any create or update, show the user the full payload that will be sent (summary, matcher type, file pattern, match string, label IDs) and get their confirmation. Before delete, you MUST show the symptom (list-symptoms --id <id> --format summary) and get explicit confirmation — never run delete without the user confirming the specific symptom.

A create or update is only complete once the label is applied to the affected runs (Step 8). Treat create/update + reevaluate as a single workflow, not two optional steps.

Step 5: Create a Symptom
bash
python3 plugins/ci/skills/manage-symptoms/manage_symptoms.py create \
  --summary "AWS could not validate access credentials" \
  --matcher-type string \
  --file-pattern "build-log.txt" \
  --match-string "api error AuthFailure: AWS was not able to validate the provided access credentials" \
  --label-ids InfraFailure

The symptom id is generated by the server from the summary — do not pass --id on create. --label-ids is required: every symptom must apply at least one label. If no suitable label exists yet, create one first with the manage-labels skill.

Step 6: Update a Symptom

Only pass the flags you want to change — the script fetches the existing symptom and merges, because the API's PUT is a full replacement:

bash
python3 plugins/ci/skills/manage-symptoms/manage_symptoms.py update \
  --id AWSCouldNotValidateAccessCredentials \
  --match-string "api error AuthFailure"

To change a symptom's labels on update, pass --label-ids with the new comma-separated list (omitting the flag preserves the existing labels). You cannot remove all labels — a symptom must always keep at least one label, so passing --label-ids "" (or any empty list) is rejected by validation. To retire a symptom entirely, delete it instead (Step 7).

Step 7: Delete a Symptom

Delete is a soft delete on the server side. Requires explicit user confirmation first (see Step 4):

bash
python3 plugins/ci/skills/manage-symptoms/manage_symptoms.py delete \
  --id AWSCouldNotValidateAccessCredentials
Step 8: Apply the Label to Job Runs (Required after Create/Update)

Defining a symptom with a label is not enough — the label is only applied to a run when the symptom is evaluated against it. New/completed runs won't get the label until you retroactively reevaluate them with the reevaluate-job-runs skill. After every create or update, apply the label to the affected runs — do not stop at Step 7.

  1. Preview first with --dry-run to confirm the symptom matches the runs you expect (writes nothing):

    bash
    python3 plugins/ci/skills/reevaluate-job-runs/reevaluate_job_runs.py \
      https://prow.ci.openshift.org/view/gs/test-platform-results-public/logs/<job>/<build_id> --dry-run --format summary
  2. Rerun without --dry-run to actually write the labels, and confirm each run's response shows the label under labels_applied:

    bash
    python3 plugins/ci/skills/reevaluate-job-runs/reevaluate_job_runs.py <build_id> [<build_id> ...] --format summary

To label every run behind a triage or regression, collect the prowjob_run_ids (via the fetch-regression-details skill) and pass them all to reevaluate-job-runs — see that skill's "Bulk workflow" section. Reevaluation is idempotent, so it is safe to rerun.

Show full SKILL.md (537 more words)Show less
Step 9: Verify

After create/update, verify the symptom itself:

bash
python3 plugins/ci/skills/list-symptoms/list_symptoms.py --id <new-id> --format summary

Then confirm the label actually landed on a run — either from the labels_applied field in the Step 8 response, or with the diagnose-job-run-symptoms skill on a known-affected run. A symptom that lists a label but shows no labels_applied after reevaluation means the matcher/file-pattern is not matching — revisit Step 6.

Arguments:

  • action: create, update, or delete (positional, required)

Options:

  • --token <token>: Bearer token from the oc-auth skill (optional if the SIPPY_TOKEN environment variable is set, which is preferred — argv is visible in process listings; --token takes precedence)
  • --id <id>: Symptom ID (required for update/delete; server-generated on create)
  • --summary <text>: Short unique description (required for create, max 200 characters)
  • --matcher-type string|regex|none|cel: How the match string is interpreted
  • --file-pattern <glob>: Artifact glob, e.g. **/build-log.txt (required for non-CEL matchers)
  • --match-string <text>: Substring, regex, or CEL expression
  • --label-ids <list>: Comma-separated label IDs to apply on match (required — a symptom must always apply at least one label)
  • --skip-label-check: Skip verifying label IDs against the labels API
  • --format json|summary: Output format (default: json)

API Details

Base URL (writes): https://sippy-auth.dptools.openshift.org/api/jobs/symptoms

  • Create: POST /api/jobs/symptoms
  • Update: PUT /api/jobs/symptoms/{id} (full replacement — the script fetches the existing symptom and merges your changes, so only pass flags you want to change)
  • Delete: DELETE /api/jobs/symptoms/{id} (soft delete)

Authentication: Authorization: Bearer <token> from the DPCR cluster.

Symptom fields:

FieldDescription
idImmutable identifier, generated from the summary on create
summaryRequired, unique, max 200 characters
matcher_typeOne of string, regex, none, cel
file_patternArtifact glob; required for all matcher types except cel
match_stringRequired for string/regex/cel; not used by none (file merely exists)
label_idsLabel IDs applied on match; required (at least one) and must reference existing labels
created_by, updated_by, timestampsMetadata set by the server

Matcher-type rules:

  • string / regex: require both file_pattern and match_string
  • none: requires only file_pattern (matches when the file exists)
  • cel: requires only match_string (a CEL expression over other label names)

Error Handling

  • Client-side validation: Missing summary, over-long summary, invalid matcher type, missing file_pattern/match_string for the chosen matcher, or missing labels (every symptom must have at least one) are caught locally before any request (exit 1).
  • Label not found: If a --label-ids value does not exist, validation fails and points you to the manage-labels skill to create it first.
  • 401/403: Token missing or expired — refresh it via the oc-auth skill.
  • 501: You hit the read-only Sippy instance with a write; make sure the sippy-auth base URL is used (the script already does).
  • 400: Server-side validation failure — the server's message is shown in the detail field of the output.
  • Concurrent edits: The update flow is read-merge-replace with no server-side concurrency control, so near-simultaneous edits can overwrite each other — re-check the symptom after updating if others may be editing.

Exit Codes:

  • 0: Success
  • 1: Validation error, API error, or network error

See Also

  • Related Skill: oc-auth (provides authentication tokens for sippy-auth)
  • Related Skill: list-symptoms (search/inspect symptoms and labels, no auth needed)
  • Related Skill: manage-labels (create labels before symptoms reference them)
  • Related Skill: reevaluate-job-runs (required after create/update to apply the label to already-completed runs; also previews with --dry-run)
  • Related Skill: fetch-regression-details (source of prowjob_run_ids when applying a symptom across a triage or regression)
  • Related Skill: diagnose-job-run-symptoms (explain which symptoms matched a run)

© 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

SKILL.md and 2 other files in plugins/ci/skills/manage-symptoms of openshift-eng/ai-helpers.

  • SKILL.md
  • manage_symptoms.py
  • test_manage_symptoms.py

Open the folder on GitHubat commit a627176

Compare with similar skills

Manage Symptoms 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.

Manage Symptoms compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Manage Symptoms this skillopenshift-eng/ai-helpers120—~3.1kAutomated safety check: PassApache-2.0
Swig Testswig/swig6.3k—~2.3kAutomated safety check: PassCustom licence
Triage CI FailureDataDog/datadog-agent3.8k—~2.3kAutomated safety check: PassApache-2.0
Dynamo Jira TicketDynamoDS/Dynamo2k—~1.1kAutomated safety check: PassApache-2.0
Fix Ready PRsfastrepl/anarlog9.5k—~1.4kAutomated safety check: PassMIT
Trx Analysismicrosoft/vstest969—~1.8kAutomated safety check: PassMIT

Similar skills

  • Swig Test

    swig/swig

    Run SWIG test suite for specific languages. An agent skill from swig/swig.

    6.3k GitHub stars~2.3k tokensUpdated 4 days ago
    Testing & QAAuto-check passed
  • Triage CI Failure

    DataDog/datadog-agent

    Official

    Classify a failed CI as either caused by an active incident, flakiness, or a true code regression.

    3.8k GitHub stars~2.3k tokensUpdated today
    Testing & QAAuto-check passed
  • Dynamo Jira Ticket

    DynamoDS/Dynamo

    Create structured Jira tickets for Dynamo from bug reports, failing tests, or feature requests.

    2k GitHub stars~1.1k tokensUpdated yesterday
    Testing & QAAuto-check passed
  • Fix Ready PRs

    fastrepl/anarlog

    Inspect every open non-draft PR for CI failures and unresolved Cursor Bugbot findings, then fix them on the existing PR branches.

    9.5k GitHub stars~1.4k tokensUpdated today
    Testing & QAAuto-check passed
  • Trx Analysis

    microsoft/vstest

    Official

    Parse and analyze Visual Studio TRX test result files. An agent skill from microsoft/vstest.

    969 GitHub stars~1.8k tokensUpdated yesterday
    Testing & QAAuto-check passed
  • Wio

    workersio/skills

    Testing workflow skill for finding high-value test candidates, writing focused tests, generating realistic workloads, reviewing test value, and diagnosing test-suite health.

    204 GitHub stars~5.8k tokensUpdated 2 mo ago
    Testing & QAAuto-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 4 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 4 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 4 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 4 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 4 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 4 days ago
    Auto-check passed

Categories

Questions about Manage Symptoms

What does Manage Symptoms do?

Create, update, or delete Sippy Symptoms — known CI failure signatures that automatically label job runs — via the authenticated Sippy API. Manage Symptoms is an agent skill from openshift-eng/ai-helpers.

When should I use Manage Symptoms?

Manage Symptoms fits situations like: tasks that involve Failing and flaky tests.

How do I install Manage Symptoms in Claude Code?

Run `npx skills add openshift-eng/ai-helpers --skill manage-symptoms -a claude-code`. Or copy the skill folder (plugins/ci/skills/manage-symptoms in openshift-eng/ai-helpers) into .claude/skills/manage-symptoms in your project. Claude Code loads it when a task matches its description.

How do I install Manage Symptoms in Codex?

Run `npx skills add openshift-eng/ai-helpers --skill manage-symptoms -a codex`. Or copy the skill folder (plugins/ci/skills/manage-symptoms in openshift-eng/ai-helpers) into .agents/skills/manage-symptoms in your project. Codex loads it when a task matches its description.

Can I use Manage Symptoms 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 manage-symptoms -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/manage-symptoms, .gemini/skills/manage-symptoms, .github/skills/manage-symptoms and .opencode/skills/manage-symptoms in your project.

What does Manage Symptoms need to run?

Going by SKILL.md and its folder, Manage Symptoms needs Python for the scripts in its folder, the command-line tools its instructions call (python3) and credentials named SIPPY_TOKEN. Our summary lists: Python 3; A credential in SIPPY_TOKEN.

Does Manage Symptoms access the network?

SKILL.md names 3 domains. In commands or code: api.cr.j7t7.p1.openshiftapps.com, sippy-auth.dptools.openshift.org and prow.ci.openshift.org; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.

Is Manage Symptoms 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 Manage Symptoms use?

Manage Symptoms 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 Manage Symptoms use?

About 3.1k tokens (SKILL.md is roughly 12k 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 Manage Symptoms?

Skills that share tags, products or a category with Manage Symptoms: Swig Test (swig/swig, 6.3k stars), Triage CI Failure (DataDog/datadog-agent, 3.8k stars), Dynamo Jira Ticket (DynamoDS/Dynamo, 2k stars) and Fix Ready PRs (fastrepl/anarlog, 9.5k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Manage Symptoms?

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.