
dd-unblock-pr
โ 940by datadog-labs ยท part of datadog-labs/pup
Load when investigating a failing PR CI pipeline or checking PR health. Attributes each CI failure as flaky, infra, or regression, proposes a targeted action, and reports code coverage.
This is the playbook your agent receives when the skill activates โ you don't need to read it to use the skill, but it's here to audit before installing.
Unblock PR
One-line summary: Investigate a failing PR CI pipeline โ attribute each failure as flaky, infra, or regression and propose a targeted action.
Requires: dd-pup skill (pup CLI installed and authenticated), dd-triage-flaky-test skill (for flaky failure deep investigation).
Input
| Parameter | Description |
|---|---|
| PR branch | The branch under investigation (e.g. my-feature-branch) |
| Repository | Lowercase, no-schema URL (e.g. github.com/org/repo). Derive from git remote get-url origin if not provided. |
Workflow
STEP 0 โ Parse Input
Derive repository ID and default branch from git if not provided:
# Repository ID: fully lowercase, no-schema URL (the API rejects mixed-case)
git remote get-url origin
# Strip protocol and trailing .git, then lowercase the result
# e.g. https://github.com/DataDog/my-repo.git โ github.com/datadog/my-repo
# Default branch
git symbolic-ref refs/remotes/origin/HEAD
# Strip refs/remotes/origin/ prefix โ fall back to main if unsetSTEP 1 โ Get PR CI Summary (run both in parallel)
Pipeline failures (job level):
pup cicd events search \
--query "@ci.status:error @git.branch:<branch> @git.repository.id_v2:\"<repo>\"" \
--level job \
--from 24h \
--limit 50Test failures:
pup cicd tests search \
--query "@test.status:fail @git.branch:<branch> @git.repository.id_v2:\"<repo>\"" \
--from 24h \
--limit 50Run both queries in parallel. Collect all distinct @test.service values from test event results. If more than one distinct service is found, note each separately in the triage brief โ do not collapse them into a single service filter. If pipeline results contain only infrastructure job types (build, lint, deploy) with no test-runner output, discard test search results and skip to STEP 3.
STEP 1.5 โ Fetch Code Coverage (run in parallel with STEP 1)
This step runs unconditionally โ coverage context is valuable whether CI is red or green.
The --repo value must be fully lowercase (the API rejects mixed-case). Normalize before calling:
repo_lower=$(echo "<repo>" | tr '[:upper:]' '[:lower:]')
pup code-coverage branch-summary \
--repo "$repo_lower" \
--branch "<branch>"If the command returns no data or exits with an error, report "No data available" for Coverage in the PR Health section.
Note: Code quality and security violation counts are not available in pup โ those lines always show "No data available".
STEP 2 โ Blame Guard per Failing Job
First check whether @error_classification.domain / @error_classification.type are present on job events from STEP 1 โ if populated, use them as primary classification signals.
For each failing job where classification is still needed, run both checks in parallel:
Default branch check โ was this job already failing before this PR?
pup cicd events aggregate \
--query "@ci.status:error @ci.job.name:\"<job>\" @git.branch:<default-branch> @git.repository.id_v2:\"<repo>\"" \
--compute count \
--from 24hBlast radius check โ is this job failing on other branches too?
pup cicd events aggregate \
--query "@ci.status:error @ci.job.name:\"<job>\" @git.repository.id_v2:\"<repo>\"" \
--compute count \
--group-by "@git.branch" \
--from 24hPerformance fallback: if the blast radius query is slow or times out, skip it and rely on the default branch check alone.
STEP 3 โ Classify Each Failure
Priority order:
- If
@error_classification.domain/@error_classification.typepresent โ use as primary signal - If test failure AND test appears in flaky tests with
flaky_test_state:active:โ flakypup cicd flaky-tests search \ --query "flaky_test_state:active @test.name:\"<test-name>\" @git.repository.id_v2:\"<repo>\"" - Use blame guard results:
| Failing on default branch? | Failing on โฅ3 other branches? | Classification |
|---|---|---|
| Yes | Yes | infra (pre-existing, widespread) |
| Yes | No | infra (pre-existing on default branch) |
| No | No | regression (introduced by this PR) |
| No | Yes | flaky (intermittent, cross-branch) |
| Insufficient data | โ | unknown |
STEP 4 โ Produce Triage Brief
One entry per failing job:
PR CI Triage Brief
==================
Branch: <branch>
Repo: <repo>
Job: <job-name>
Classification: <flaky | infra | regression | unknown>
Evidence: <1 key data point โ error message, pipeline count, or test result>
Confidence: <high | medium | low>
Recommended: <action>
[repeat for each failing job]
Overall: <N> failures โ <e.g. "1 regression, 1 flaky, 1 infra">
PR Health
=========
Coverage: <X>% on <branch> | No data available
Quality: No data available
Security: No data availableAll three lines always appear.
STEP 5 โ Propose Actions
regression โ Prompt user to investigate their code changes. No write action available.
flaky โ Load dd-triage-flaky-test skill for deep investigation. That skill will:
- Attempt an agent-native fix using
flaky_category+ stack trace - Propose quarantine via
pup test-optimization flaky-tests updateif a quick fix isn't possible
infra โ Before proposing a retry, assess whether the failure is transient:
- Check
@error_classification.typeand error message for signals liketimeout,runner unavailable,network error,quota exceededโ these indicate transient failures where a retry is likely to help - If the error is deterministic (build misconfiguration, missing secret, explicit test assertion failure), a retry is unlikely to help โ note this and suggest investigating the root cause
- If the failure is pre-existing on the default branch, inform the user โ a retry will likely fail again; await the upstream fix instead
If transient and GitHub Actions: extract the run ID from @ci.pipeline.url (e.g. https://github.com/org/repo/actions/runs/<run_id>):
gh run rerun <run_id> --failedFor other providers, share @ci.pipeline.url and direct to the provider UI for retry.
unknown โ Suggest checking raw job logs via the CI provider UI or @ci.pipeline.url from the pipeline event.
npx skills add https://github.com/datadog-labs/pup --skill dd-unblock-prRun this in your project โ your agent picks the skill up automatically.
No common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.
Licensed under Apache-2.0โ you can use, modify, and redistribute it under that license's terms.
View the full license file on GitHub โ