Skip to content

ci: keep the reporting aliases off the shared hosted pool#6446

Merged
shipyard-local[bot] merged 1 commit into
mainfrom
fix/alias-jobs-off-hosted-pool
Jul 22, 2026
Merged

ci: keep the reporting aliases off the shared hosted pool#6446
shipyard-local[bot] merged 1 commit into
mainfrom
fix/alias-jobs-off-hosted-pool

Conversation

@shipyard-local

@shipyard-local shipyard-local Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

The failure this removes

A pull request that shows no check activity at all after a push — not red, not queued, simply nothing. It is not slow CI, and it does not recover on its own.

build.yml groups by build-<ref> with cancel-in-progress. The reporting aliases (macos / linux / windows) are the last jobs in the run: they wait for their matrix leg and echo the outcome. Starve one of a runner and it never starts, so the run never reaches a terminal state. A non-terminal run holds its concurrency group, and every later run on that ref then sits at pending with zero jobs. Pushing again does not help — the new run queues behind the same held group.

This cost #6437 two hours, which is pointed, because #6437 was the fix for the hosted-pool starvation that caused it.

Why linux and windows specifically

macos already resolved its runner through PULP_PREAMBLE_RUNS_ON_JSON so the required gate could not be starved on a pool it does not control. linux and windows were still pinned to ubuntu-latest — meaning two advisory lanes could each strand a pull request indefinitely.

An advisory lane must not be able to do that. Routing them through the same toggle removes the mechanism rather than documenting a recovery for it, and costs nothing: these jobs poll an API and echo a result.

Diagnosis signature (now in the ci skill + local-ci guide)

Unambiguous: run status is pending and its jobs array is empty, while sibling workflows from the same trigger dispatched normally.

ghapp api "repos/.../actions/runs/<id>/jobs" --jq '.jobs|length'   # 0 == wedged
ghapp api -X POST "repos/.../actions/runs/<old_id>/cancel"          # clears it

Verification

tools/scripts/test_windows_runner_policy.py asserts all three aliases resolve through the toggle and none is pinned to a bare ubuntu-latest. Negative control: reverting either job to ubuntu-latest fails the test; 13/13 pass with the change. actionlint clean, gates.sh green.


🔎 Provenance

Agent claude
Machine m3
Tab Set up fleet v3 project with Orchestrate in new workspace
Directory /Volumes/Workshop/Code/pulp-mq
Session 1dd2217d-ca26-4de4-b90e-6360ee343606

Resume

claude --resume 1dd2217d-ca26-4de4-b90e-6360ee343606

Jump to this tab

cmux surface focus 22A04F4D-188B-4306-91D2-ECAEADCC7F13

Relaunch (any agent)

cmux surface resume get --surface 22A04F4D-188B-4306-91D2-ECAEADCC7F13

Restore URLhttps://claude.ai/code/session_01363VPyLiV9Er9DJ1pcmC9c

stamped 2026-07-22 00:41 UTC

An alias job is the last job in the run: it waits for its matrix leg and reports
the outcome. Starve it of a runner and it never starts, so the RUN never reaches
a terminal state. A run that never terminates holds its `concurrency` group, and
build.yml sets `cancel-in-progress` on that group — so the next push's run sits
at status `pending` with ZERO jobs and never dispatches.

The pull request is then wedged: no checks, no failure, nothing to re-run. It
survives further pushes and clears only by cancelling the older run by hand. It
cost #6437 two hours, and #6437 was the fix for the starvation that caused it.

`macos` already resolved its runner through PULP_PREAMBLE_RUNS_ON_JSON so the
required gate could not be starved on a pool it does not control. `linux` and
`windows` were still pinned to `ubuntu-latest` — which means two ADVISORY lanes
could each strand a pull request indefinitely. An advisory lane must not be able
to do that, so they ride the same toggle.

This removes the wedge mechanism rather than documenting a recovery for it, and
it costs nothing: these jobs poll an API and echo a result.

The test asserts all three aliases resolve through the toggle and that none is
pinned to a bare `ubuntu-latest`; reverting either job fails it. The guide records
the diagnosis signature — a `Build and Test` run that is `pending` with an empty
jobs array while its sibling workflows dispatched normally — because that state
is otherwise indistinguishable from ordinary queue latency.
@danielraffel
danielraffel force-pushed the fix/alias-jobs-off-hosted-pool branch from a1272b3 to a85fb5b Compare July 22, 2026 07:47
@shipyard-local
shipyard-local Bot added this pull request to the merge queue Jul 22, 2026
Merged via the queue into main with commit 28eeb4e Jul 22, 2026
18 of 19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant