fix(ci): stop test.yml racing release.yml's identical gate on main #1118

Merged
coilyco-ops merged 1 commit from fix/test-yml-duplicate-main-gate into main 2026-07-11 23:11:11 +00:00
Member

test.yml and release.yml both fired on push to main with a byte-identical test job: same container, same steps, same timeout. On every push the runner started two copies in the same second against the same checkout, and they raced.

On ee69336 one went green in 36s while its twin died in 42s. That is what turned main red.

Why it is not a code failure

  • The 10 minute timeout was never reached (the job died in 42s).
  • go vet, go test, and golangci-lint all pass clean inside agentic-os:latest, the same container CI uses.
  • Decisively: the same steps on the same commit passed in the sibling job. A real code break would have reddened both.

It is intermittent, as expected of a race. Runs 1811 and 1812 also started in the same second and both happened to survive.

The fix

release.yml already gates release behind that same test job with needs: test, so main keeps full coverage. test.yml goes PR-only and stays the branch-protection status context. This drops the race and halves the Go CI work on every push to main.

The GitHub file is the mirror source, so .forgejo/workflows/test.yml is regenerated with make lint-workflows ARGS=--fix (ward#214). The mirror check passes.

`test.yml` and `release.yml` both fired on push to main with a **byte-identical** `test` job: same container, same steps, same timeout. On every push the runner started two copies **in the same second** against the same checkout, and they raced. On `ee69336` one went green in 36s while its twin died in 42s. That is what turned main red. ## Why it is not a code failure * The 10 minute timeout was never reached (the job died in 42s). * `go vet`, `go test`, and `golangci-lint` all pass clean inside `agentic-os:latest`, the same container CI uses. * Decisively: **the same steps on the same commit passed in the sibling job**. A real code break would have reddened both. It is intermittent, as expected of a race. Runs 1811 and 1812 also started in the same second and both happened to survive. ## The fix `release.yml` already gates `release` behind that same test job with `needs: test`, so **main keeps full coverage**. `test.yml` goes PR-only and stays the branch-protection status context. This drops the race and halves the Go CI work on every push to main. The GitHub file is the mirror source, so `.forgejo/workflows/test.yml` is regenerated with `make lint-workflows ARGS=--fix` (ward#214). The mirror check passes.
fix(ci): stop test.yml racing release.yml identical gate on main
All checks were successful
test / test (pull_request) Successful in 29s
5d3019804f
test.yml and release.yml both fired on push to main with a byte-identical
`test` job: same container, same steps, same timeout. On every push the
runner started two copies in the same second against the same checkout,
and they raced. On ee69336 one went green in 36s while its twin died in
42s, which is what turned main red. The 10 minute timeout was never
reached, and go vet, go test, and golangci-lint all pass clean inside
agentic-os:latest, so the failure was never in the code. The same steps
on the same commit passed in the sibling job, which rules out a code
break: a real one would have reddened both.

release.yml already gates `release` behind that same test job with
needs:, so main keeps full coverage. test.yml goes PR-only and stays the
branch-protection status context. That drops the race and halves the Go
CI work on every push to main.

The GitHub file is the mirror source, so .forgejo/workflows/test.yml is
regenerated with `make lint-workflows ARGS=--fix` (ward#214).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No description provided.