opsenDocs
Findings

Actions minutes

.md

Superseded pull request runs, schedules on dormant repositories, and jobs that hang.

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.

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