danielraffel/pulp GitHub Actions scorecardPublic GitHub Actions data, last 30 days. Updated 7/11/2026, 5:13:50 AM.
Data sourced from public GitHub. GitSpider is not affiliated with or endorsed by this repository's owners. Request removal.
Biggest wins first, each with the exact config fix.
CoverageConcurrency group has no `cancel-in-progress: true`, so superseded runs queue instead of cancelling. Add it to supersede stale runs.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: truesandbox-e2eSet `cache: 'pip'` on your `actions/setup-python` step, or add an `actions/cache@v4` step keyed on your requirements/lock file.
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'Web PluginsSet `cache: 'npm'` on your `actions/setup-node` step, or add an `actions/cache@v4` step keyed on your lockfile.
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'WebCLAP CloudflareSet `cache: 'npm'` on your `actions/setup-node` step, or add an `actions/cache@v4` step keyed on your lockfile.
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'Android BuildmacOS bills ~10× and Windows ~2× a Linux minute. The cost estimate above assumes Linux, so your real spend is higher. Move any job that doesn't need them to `ubuntu-latest`.
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latestAuto-release watchdogNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15Auto-Release on Version BumpNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15Auto-Release on Version BumpmacOS bills ~10× and Windows ~2× a Linux minute. The cost estimate above assumes Linux, so your real spend is higher. Move any job that doesn't need them to `ubuntu-latest`.
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latestAuto-Release on Version BumpRuns on push, pushes back with a custom token, and has no recursion guard — this shape can trigger itself in a loop. Add `[skip ci]` to the commit, a `paths:` filter, or a `github.actor` gate.
- run: |
git commit -m "chore: update [skip ci]"
git pushBuild and TestNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15Build and TestRuns on every push/PR with no `paths:` filter, so docs-only changes still trigger full CI. Add a `paths:` filter if that's common.
on:
pull_request:
paths:
- 'src/**'
- 'package.json'Build and TestmacOS bills ~10× and Windows ~2× a Linux minute. The cost estimate above assumes Linux, so your real spend is higher. Move any job that doesn't need them to `ubuntu-latest`.
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latestConflict-marker guardNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15CoverageRuns on every push/PR with no `paths:` filter, so docs-only changes still trigger full CI. Add a `paths:` filter if that's common.
on:
pull_request:
paths:
- 'src/**'
- 'package.json'CoveragemacOS bills ~10× and Windows ~2× a Linux minute. The cost estimate above assumes Linux, so your real spend is higher. Move any job that doesn't need them to `ubuntu-latest`.
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latestDocs ConsistencyNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15Docs (Material preview)No job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15Docs (Material preview)checkout fetches the entire git history every run (`fetch-depth: 0`) and nothing in the workflow appears to read it. Remove the line — the default shallow clone is much faster on big repos. Keep it if a step genuinely needs history.
- uses: actions/checkout@v4
# fetch-depth: 0 removed — default shallow clone is enough hereDocs (Material preview)System packages install from the network on every run with no cache. Cache them (cache-apt-pkgs-action) or check whether the runner image already has the tool.
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: <your packages>
version: 1.0Header self-containmentNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15Header self-containmentSystem packages install from the network on every run with no cache. Cache them (cache-apt-pkgs-action) or check whether the runner image already has the tool.
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: <your packages>
version: 1.0Install consumer smokeNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15Install consumer smokemacOS bills ~10× and Windows ~2× a Linux minute. The cost estimate above assumes Linux, so your real spend is higher. Move any job that doesn't need them to `ubuntu-latest`.
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latestInstall consumer smokeSystem packages install from the network on every run with no cache. Cache them (cache-apt-pkgs-action) or check whether the runner image already has the tool.
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: <your packages>
version: 1.0Intent Bump on MergeNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15Intent Bump on MergeRuns on push, pushes back with a custom token, and has no recursion guard — this shape can trigger itself in a loop. Add `[skip ci]` to the commit, a `paths:` filter, or a `github.actor` gate.
- run: |
git commit -m "chore: update [skip ci]"
git pushIWYU advisoryNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15IWYU advisorySystem packages install from the network on every run with no cache. Cache them (cache-apt-pkgs-action) or check whether the runner image already has the tool.
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: <your packages>
version: 1.0License AuditNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15License AuditRuns on every push/PR with no `paths:` filter, so docs-only changes still trigger full CI. Add a `paths:` filter if that's common.
on:
pull_request:
paths:
- 'src/**'
- 'package.json'Live Kernel ConformanceNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15Release-path PR gateNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15Release-path PR gatemacOS bills ~10× and Windows ~2× a Linux minute. The cost estimate above assumes Linux, so your real spend is higher. Move any job that doesn't need them to `ubuntu-latest`.
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latestRelease-path PR gateThis looks like a deploy/release workflow with `cancel-in-progress: true`, which cancels queued runs too — a queued deploy is silently dropped when a newer run arrives. Use a group-only `concurrency:` block on deploys.
concurrency:
group: ${{ github.workflow }}
# queued deploys run in order; none are droppedRelease-path PR gateSystem packages install from the network on every run with no cache. Cache them (cache-apt-pkgs-action) or check whether the runner image already has the tool.
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: <your packages>
version: 1.0sandbox-e2emacOS bills ~10× and Windows ~2× a Linux minute. The cost estimate above assumes Linux, so your real spend is higher. Move any job that doesn't need them to `ubuntu-latest`.
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latestsandbox-e2eSystem packages install from the network on every run with no cache. Cache them (cache-apt-pkgs-action) or check whether the runner image already has the tool.
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: <your packages>
version: 1.0Sanitizer TestsNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15Sanitizer TestsmacOS bills ~10× and Windows ~2× a Linux minute. The cost estimate above assumes Linux, so your real spend is higher. Move any job that doesn't need them to `ubuntu-latest`.
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latestSanitizer TestsSystem packages install from the network on every run with no cache. Cache them (cache-apt-pkgs-action) or check whether the runner image already has the tool.
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: <your packages>
version: 1.0Source-tree pollution checkNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15Source-tree pollution checkcheckout fetches the entire git history every run (`fetch-depth: 0`) and nothing in the workflow appears to read it. Remove the line — the default shallow clone is much faster on big repos. Keep it if a step genuinely needs history.
- uses: actions/checkout@v4
# fetch-depth: 0 removed — default shallow clone is enough hereTracing build (Perfetto opt-in)System packages install from the network on every run with no cache. Cache them (cache-apt-pkgs-action) or check whether the runner image already has the tool.
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: <your packages>
version: 1.0Versioning & Skill-SyncNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15Versioning & Skill-SyncRuns on every push/PR with no `paths:` filter, so docs-only changes still trigger full CI. Add a `paths:` filter if that's common.
on:
pull_request:
paths:
- 'src/**'
- 'package.json'WebCLAP CloudflareNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15WebCLAP Cloudflare`upload-artifact` has no `retention-days`, so artifacts keep up to 90 days (storage cost). Set e.g. `retention-days: 7`.
- uses: actions/upload-artifact@v4
with:
name: build
path: dist/
retention-days: 7WebCLAP CloudflareThe schedule fires at minute :00 — GitHub's peak window, where scheduled runs get delayed or skipped. Shift to any other minute for the same cadence with less contention.
on:
schedule:
- cron: '20 8 * * 1' # was '0 8 * * 1' — any non-:00 minute avoids the herdWeb PluginsNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15Web Plugins`upload-artifact` has no `retention-days`, so artifacts keep up to 90 days (storage cost). Set e.g. `retention-days: 7`.
- uses: actions/upload-artifact@v4
with:
name: build
path: dist/
retention-days: 7Workflow lintNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15# Concurrency without cancel-in-progress — applies to: Coverage
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
# Missing dependency cache (pip) — applies to: sandbox-e2e
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
# Missing dependency cache (npm) — applies to: Web Plugins, WebCLAP Cloudflare
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
# Premium runners (macOS / Windows) — applies to: Android Build, Auto-Release on Version Bump, Build and Test, Coverage, Install consumer smoke, Release-path PR gate, sandbox-e2e, Sanitizer Tests
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latest
# No job timeout — applies to: Auto-release watchdog, Auto-Release on Version Bump, Build and Test, Conflict-marker guard, Docs Consistency, Docs (Material preview), Header self-containment, Install consumer smoke, Intent Bump on Merge, IWYU advisory, License Audit, Live Kernel Conformance, Release-path PR gate, Sanitizer Tests, Source-tree pollution check, Versioning & Skill-Sync, WebCLAP Cloudflare, Web Plugins, Workflow lint
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15
# Workflow can trigger itself — applies to: Auto-Release on Version Bump, Intent Bump on Merge
- run: |
git commit -m "chore: update [skip ci]"
git push
# No path filters on triggers — applies to: Build and Test, Coverage, License Audit, Versioning & Skill-Sync
on:
pull_request:
paths:
- 'src/**'
- 'package.json'
# Full-history clone (fetch-depth: 0) — applies to: Docs (Material preview), Source-tree pollution check
- uses: actions/checkout@v4
# fetch-depth: 0 removed — default shallow clone is enough here
# System packages reinstalled every run — applies to: Docs (Material preview), Header self-containment, Install consumer smoke, IWYU advisory, Release-path PR gate, sandbox-e2e, Sanitizer Tests, Tracing build (Perfetto opt-in)
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: <your packages>
version: 1.0
# cancel-in-progress on a deploy workflow — applies to: Release-path PR gate
concurrency:
group: ${{ github.workflow }}
# queued deploys run in order; none are dropped
# Artifacts at default retention — applies to: WebCLAP Cloudflare, Web Plugins
- uses: actions/upload-artifact@v4
with:
name: build
path: dist/
retention-days: 7
# Scheduled at the top of the hour — applies to: WebCLAP Cloudflare
on:
schedule:
- cron: '20 8 * * 1' # was '0 8 * * 1' — any non-:00 minute avoids the herdEach snippet is representative — merge into the named workflow files rather than pasting wholesale.
This scorecard is a one-time snapshot. Install the free GitHub App to track this repo continuously: new regressions caught as they land, trends over time, on your public and private repos. Team adds the offending commit on the PR + Slack alerts.
Install & monitor this repo →Not ready to install? Get this report by email. No spam, unsubscribe anytime.