Actions findings are measured from job timings over the last 30 days, priced per runner type, and only for minutes that should not have been spent.
Superseded pull request runs
actions.superseded
Every push to an open pull request starts a new run. Without a concurrency group, the run for the previous commit keeps going, and bills, until it finishes.
A run is counted when another run of the same workflow, on the same branch, for a different commit, started before it finished. Only its minutes after the newer run started are priced: those are the minutes cancel-in-progress would have saved.
12:00 run A starts (commit 1)
12:05 run B starts (commit 2) ← A is superseded here
12:15 run A ends counted: 10 minutes of A
Workflows that already cancel superseded runs, at the top level or in every job, are never counted.
Action: Open fix PR adds a concurrency group.
Schedules on dormant repositories
actions.dormant_schedules
Scheduled (on: schedule) runs in repositories with no push in 90 days. Every minute of those runs is counted.
Action: Disable calls PUT /repos/{org}/{repo}/actions/workflows/{id}/disable. Enable workflow in the repository's Actions tab turns it back on.
Jobs that hang
actions.hung
GitHub stops a job after six hours unless timeout-minutes says otherwise. A failed or cancelled run longer than 340 minutes is treated as hung.
Only the minutes beyond a cap are counted. The cap is twice the 90th-percentile duration of the same workflow's successful runs, and at least 30 minutes. With fewer than five successful runs to learn from, the cap is 60 minutes.
Action: Open fix PR sets timeout-minutes on each job that lacks one, at the cap rounded up to five minutes.
Runner rates
| Standard runner | $/minute |
|---|---|
| Linux | $0.006 |
| Windows | $0.010 |
| macOS | $0.062 |
Larger, ARM, GPU and macOS rates are in Prices.