Repository navigation
[quality] test.yml runs build-test twice per commit on every PR branch — narrow push to main and add a concurrency group #213
Description
Finding
.github/workflows/test.yml:2 is on: [push, pull_request] and the workflow has no concurrency block. Every same-repo branch that has an open pull request therefore runs build-test twice per commit — once for the push event and once for pull_request, same SHA, same steps, same result — and a new push to a branch never cancels the still-running job for the previous commit.
Evidence, main @ 187c5e3:
- chore(deps-dev): bump the dev-dependencies group across 1 directory with 5 updates #188 head
8656298: run 36255852284 (push, started 16:33:01) and run 36255855092 (pull_request, started 16:33:04) — identical SHA, both fail on the same step. - Of the 30 most recent
Build and test coderuns, 14 head SHAs appear twice (push+pull_request), across 12 branches: 10quality/test-*branches,dependabot/npm_and_yarn/dev-dependencies-520f5d8d0eandtest/e2e-sandbox(two SHAs). Reproduce:gh run list --workflow test.yml --limit 30 --json headSha,event | jq 'group_by(.headSha)|map(select(length>1))|length'. prow-bot.yml:34-36already declares aconcurrencygroup for the bot;test.ymlis the onlypull_requestworkflow in the repository without one.
Each run is ~1 minute on ubuntu-latest, so the cost today is roughly half of all build-test minutes, not wall-clock latency. It becomes latency whenever a burst of PRs (the 19 hold-gated ones currently open, or a dependabot group) queues on the account's concurrent-job limit.
Recommendation
Fire once per commit and let a newer push to a pull request supersede the pending run. Exact replacement — replace lines 1-5 of .github/workflows/test.yml (name: through contents: read) with:
name: Build and test code
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
# One run per branch: a newer push to a pull request supersedes its pending run.
# Runs on main are never cancelled, so every merge keeps its own result.
concurrency:
group: test-${{ github.head_ref || github.ref_name }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}The jobs: map is unchanged.
Notes for the maintainer applying this:
push: branches: [main]removes the duplicate outright: a same-repo PR branch runs only throughpull_request;mainstill runs on every merge. A branch with no open PR gets nobuild-testrun — the check has to be read from the PR, which is where it is consumed anyway.github.head_ref || github.ref_nameresolves to the branch name for both event types, so if thepushnarrowing is not wanted, theconcurrencyblock alone still collapses the pair: thepull_requestrun (started seconds later) cancels thepushrun. That variant leaves acancelledrun on the branch's commit page; the narrowing avoids it.cancel-in-progressisfalseonmainon purpose: two merges in quick succession must each keep their own pass/fail.- Tag pushes currently also run
test.yml;release.ymlownsv*tags and runs aftermainwas already green on the same commit, so they are not restated here. Addtags: ['v*']underpush:if that run is wanted back. - No path filter is added:
build-testbacks the PR merge gate and a filtered-out required check blocks the merge instead of skipping it.
Why no PR: the whole change is inside .github/workflows/. This agent's App token is minted at the contributor tier without the Workflows permission, so GitHub rejects any push touching that directory (the same rejection @castrojo hit on #209). It needs a human or an ISSUES_PRS_MERGE-tier agent to land. No part of the fix lies outside .github/workflows/.
Completion criteria
-
test.ymlrunspushonly formain(or otherwise dedupes thepush/pull_requestpair) -
test.ymlhas aconcurrencygroup that cancels supersededpull_requestruns and never cancelsmain - The next same-repo PR commit produces exactly one
build-testrun
Priority
- Impact: low — ~2×
build-testminutes and slower burst throughput; no correctness effect - Effort: low
Filed by quality agent (hold-gated mode)
🐝 Hive Agent: quality | Instance: hosted-available-lke648397-260827-5q9t | SHA: 187c5e3
— hive: agent=quality backend=copilot model=claude-fable-5.1 copilot=1.0.88
Activity
hivecommons-hive commentedon Sep 28, 2026
/kind cleanup
🐝 Hive Agent:
quality| Instance:hosted-available-lke648397-260827-5q9t| SHA:unknown— hive: agent=quality backend=copilot model=claude-fable-5.1 copilot=1.0.88
ci: run test.yml once per commit and keep a main baseline after bot m…
ci: run test.yml once per commit and keep a main baseline after bot m…