Labsco
DataDog logo

dd-unblock-pr

โ˜… 940

by DataDog ยท part of DataDog/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.

๐Ÿงฐ Not standalone. This skill ships with DataDog/pup and only works together with that tool โ€” install the tool first, then add this skill.

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

ParameterDescription
PR branchThe branch under investigation (e.g. my-feature-branch)
RepositoryLowercase, 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 unset

STEP 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 50

Test failures:

pup cicd tests search \
  --query "@test.status:fail @git.branch:<branch> @git.repository.id_v2:\"<repo>\"" \
  --from 24h \
  --limit 50

Run 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 24h

Blast 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 24h

Performance 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:

  1. If @error_classification.domain / @error_classification.type present โ†’ use as primary signal
  2. If test failure AND test appears in flaky tests with flaky_test_state:active:
    pup cicd flaky-tests search \
      --query "flaky_test_state:active @test.name:\"<test-name>\" @git.repository.id_v2:\"<repo>\""
    โ†’ flaky
  3. Use blame guard results:
Failing on default branch?Failing on โ‰ฅ3 other branches?Classification
YesYesinfra (pre-existing, widespread)
YesNoinfra (pre-existing on default branch)
NoNoregression (introduced by this PR)
NoYesflaky (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 available

All 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 update if a quick fix isn't possible

infra โ†’ Before proposing a retry, assess whether the failure is transient:

  • Check @error_classification.type and error message for signals like timeout, 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> --failed

For 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.