vsadov/satori/ci-pipeline-monitor
Claude Code and agent skill by vsadov/satori
- community
Checking that the SKILL.md file is still in the repository.
Monitors .NET runtime CI test pipelines on Azure DevOps. Use this skill when asked to monitor CI pipeline test results, triage CI test failures across ADO pipelines, or generate CI test monitoring reports.
Install
npx vskill@latest install vsadov/satori/ci-pipeline-monitorSKILL.md
CI Pipeline Monitor
Overview
This skill automates monitoring CI test pipelines on Azure DevOps (dnceng-public/public), triaging failures, and coordinating with GitHub dotnet/runtime issue tracking.
Pipelines to Monitor
The list of pipelines and their cached definition IDs is maintained in `pipelines.md` in this skill directory.
Architecture
Deterministic steps are scripted. Agent does triage.
- Python scripts (
scripts/) handle all deterministic work: DB setup,
build fetching, test failure extraction (including errorMessage and stackTrace from the ADO API), Helix log downloading, and report generation.
- Agent handles all non-deterministic work: reading console log files for
failures where the API returned no useful error (crashes, timeouts), enriching/completing error messages and stack traces, classifying failures, grouping by root cause, searching GitHub for matching issues, writing analysis, and populating the triage tables in monitor.db.
Scripts
Use these scripts — do NOT write ad-hoc replacements. Do NOT create new files in scripts/ — only the committed scripts below belong there. For ad-hoc queries during triage (e.g., DB lookups, grouping), prefer python -c '...' inline. If a query is too complex for inline (escaping issues, multi-line), write a temp file under temp/ (e.g., temp/_query.py). The temp/ directory is gitignored; the user will clean it up when no longer needed.
| Script | Step | What it does | |
|---|---|---|---|
setup_and_fetch_builds.py | 2 | Creates monitor.db (including test_results table), fetches latest build for every pipeline, populates pipelines table. | |
extract_failed_tests.py | 3 | Reads failing pipelines from DB. Calls AzDO Test Results API for each failing build. INSERTs one row per failed test method into test_results (test_name, run_name, pipeline_name, Helix info, console URL, error_message, stack_trace from API). Strips .WorkItemExecution suffix. Skips generic "Helix Work Item failed" messages (stores empty — agent fills from console log). Requires ADO_TOKEN env var or az cli. | |
fetch_helix_logs.py | 3 | Fetches Helix console logs, saves full log files to helix-logs/ directory, UPDATEs each test_results row with exit_code and console_log_path. No auth needed. | |
validate_results.py | 5 | Validates monitor.db completeness and integrity. 24 checks: data completeness, referential integrity, data quality, content accuracy, debug log completeness. Exits 1 on failure. | |
generate_report.py | 6 | Reads monitor.db, generates report to logs/ directory. Pure formatting — no judgment. Run only after DB validation passes. |
End-to-end pipeline:
Database Schema
Created by setup_and_fetch_builds.py. Populated by scripts (Steps 2-3) and agent (Step 4). Validated by validate_results.py (Step 5). Read by generate_report.py (Step 6).
Workflow
Debug Log
All output goes in logs/ (sibling of scripts/).
- Debug Log (
logs/ci-pipeline-monitor-<timestamp>.log) — always generated.
⚠️ Write incrementally by appending after each API call and decision. Do NOT compose the log from memory at the end of the run — this defeats the crash-recovery purpose. If the process crashes mid-run, the log must contain everything up to the crash point. Use file append operations (Python open(..., 'a') or PowerShell Add-Content) to write each log entry immediately after the action it describes. Follow `log-template.md`. Log every API call URL + response summary, every decision with reasoning, timestamps, and errors.
- Test Report (
logs/test-report-<timestamp>.md) — always generated
via generate_report.py.
Step 0: Prerequisites (agent)
Run before anything else. See `references/prerequisites.md` for full details.
pip install requests- Ensure
ADO_TOKENenv var is set (required for Step 3).
⚠️ Do NOT proceed to Step 3 without a valid `ADO_TOKEN`. The Test Results API returns 203 (sign-in HTML) without auth, even on dnceng-public.
Step 1: Resolve Pipeline Definitions (agent)
Compare the Pipeline Details table (source of truth) against the Cached Definition ID Mapping table in pipelines.md:
- For each pipeline in Pipeline Details that is not marked Private or
skip in its Notes column:
- If it already has a row with a numeric Def ID in the Cached Mapping table,
do nothing (already resolved).
- If it has no row in the Cached Mapping table, or its row has
—as the
Def ID, resolve it via the AzDO Definitions API: `` GET https://dev.azure.com/dnceng-public/public/_apis/build/definitions?name={pipeline_name}&api-version=7.1 ``
- If the API returns a match, add or update the row in the Cached Mapping
table with the resolved Def ID.
- If the API returns no match, log a warning and skip that pipeline.
- For pipelines in the Cached Mapping table that are **no longer in Pipeline
Details**, leave them (stale rows are harmless — the script only processes pipelines present in the Cached Mapping table).
Do NOT re-resolve IDs that are already populated with a numeric value.
Step 2: Fetch Latest Builds (deterministic — scripted)
Creates DB, fetches latest build per pipeline, populates pipelines table, outputs failing build IDs.
Step 3: Extract Failed Tests and Fetch Logs (deterministic — scripted)
Extracts individual failed test methods and downloads their full Helix console logs to disk.
⚠️ Every individual failure must be INSERT'd into `test_results` immediately.
extract_failed_tests.py: inserts one row per failed test method (test_name,
run_name, pipeline_name, helix_job_id, helix_work_item, console_log_url, error_message, stack_trace from the ADO API). The API provides useful error/stack for most xUnit assertion failures. For crashes and timeouts, the API returns a generic "Helix Work Item failed" message — these are stored as empty so the agent can extract the real error from the console log.
fetch_helix_logs.py: downloads the full console log tohelix-logs/
(a separate directory — NOT mixed with logs/) and UPDATEs the corresponding test_results row with exit_code and console_log_path. Uses console_log_path IS NULL as the sentinel for unprocessed rows.
- After Step 3,
test_resultscontains the complete raw inventory of every
failure with its exit code, a path to the full console log on disk, and API-provided error/stack where available. failure_id is NULL — it is populated by the agent in Step 4.
Step 4: Triage Failures (agent — non-deterministic)
See `references/triage-workflow.md` for full instructions.
⚠️ INSERT into `failures` table immediately after triaging each failure group.
Step 5: Validate DB (deterministic — scripted)
Runs 24 checks across data completeness, referential integrity, data quality, and content accuracy. Exits 1 on failure.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryChecking.github/skills/ci-pipeline-monitor/SKILL.md
Popularity
- 7-day trend score
- 5
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/vsadov/satori/ci-pipeline-monitor)