Observed 2026-07-13 ~02:25Z: runs 10775 (Phase-2 merge f439de2, on the laptop runner, mid-batch) and 10777 (caching fix b76f743, on the 4090 runner) are building concurrently, both pushing artpipe-base:* and artpipe-model-env-{safetycheck,blender,sdxllightning,triposr}:latest.
Consequences:
:latest and the ARTPIPE_SHA provenance labels (d1f6ba7) end up from whichever run pushes LAST per image — an older commit can clobber a newer one's tags (mostly-benign now since the model Dockerfiles are identical across the two commits, but silently wrong provenance).
Duplicate 60 GB-class builds burn both amd64 runners + disk (#514) for ~an hour.
Recurs any time two artpipe commits merge within a build window (~1h) — the team is moving fast, so that's often.
Fixes, cheapest first:
concurrency: { group: model-env-images, cancel-in-progress: true } at workflow level, if the Gitea version honors it (verify — support landed in recent Gitea; if unsupported it's silently ignored, so test with two dummy pushes).
Landing #534 (runs-on: [ubuntu-amd64-4090]) serializes runs as a side effect — a single act_runner executes one job at a time, so later runs queue instead of racing.
Guard step: query GET /api/v1/repos/spikerj/spikersoft-artpipe/actions/tasks for an in-flight ModelEnvImages run and exit early.
Observed 2026-07-13 ~02:25Z: runs **10775** (Phase-2 merge f439de2, on the laptop runner, mid-batch) and **10777** (caching fix b76f743, on the 4090 runner) are building **concurrently**, both pushing `artpipe-base:*` and `artpipe-model-env-{safetycheck,blender,sdxllightning,triposr}:latest`.
Consequences:
- `:latest` and the ARTPIPE_SHA provenance labels (d1f6ba7) end up from whichever run pushes LAST per image — an older commit can clobber a newer one's tags (mostly-benign now since the model Dockerfiles are identical across the two commits, but silently wrong provenance).
- Duplicate 60 GB-class builds burn both amd64 runners + disk (#514) for ~an hour.
- Recurs any time two artpipe commits merge within a build window (~1h) — the team is moving fast, so that's often.
Fixes, cheapest first:
1. `concurrency: { group: model-env-images, cancel-in-progress: true }` at workflow level, if the Gitea version honors it (verify — support landed in recent Gitea; if unsupported it's silently ignored, so test with two dummy pushes).
2. Landing #534 (`runs-on: [ubuntu-amd64-4090]`) serializes runs as a side effect — a single act_runner executes one job at a time, so later runs queue instead of racing.
3. Guard step: query `GET /api/v1/repos/spikerj/spikersoft-artpipe/actions/tasks` for an in-flight ModelEnvImages run and exit early.
Related: #514, #515, #516, #534.
artpipe PR #18: workflow-level concurrency group with cancel-in-progress (ticket fix option 1) — newest commit owns :latest + provenance; superseded runs cancel instead of clobbering. Option 2 side-effect already live since artpipe PR #16 (4090 exclusive runner serializes); the guard covers the documented urgent-flip escape hatch back to the two-runner pool. Verification (two dummy pushes, first shows Cancelled) best done after the current push batch. Note for #534: the ModelEnvImages half is done via PR #16 — remaining is routing the backend tier-3 finals loop.
artpipe PR #18: workflow-level concurrency group with cancel-in-progress (ticket fix option 1) — newest commit owns :latest + provenance; superseded runs cancel instead of clobbering. Option 2 side-effect already live since artpipe PR #16 (4090 exclusive runner serializes); the guard covers the documented urgent-flip escape hatch back to the two-runner pool. Verification (two dummy pushes, first shows Cancelled) best done after the current push batch. Note for #534: the ModelEnvImages half is done via PR #16 — remaining is routing the backend tier-3 finals loop.
QA watch 2026-07-13 ~20:53Z — guard merged (a3fba37) and version-compatible. Implementation: workflow-level concurrency group 'model-env-images' with cancel-in-progress: true — newest commit owns :latest, superseded runs cancelled. The commit's own caveat ('silently ignored when unsupported') checks out OK here: this instance is Gitea 1.26.4, and workflow concurrency support landed in the 1.24 line — so the key should be honored, not ignored.
Close condition: observe one real supersede — next time two ModelEnvImages runs would overlap (rapid merge pair or manual double-dispatch), confirm the older run flips to cancelled instead of racing. I'll watch for a natural occurrence; a deliberate two-dummy-push test works too if someone wants it closed sooner. Also note the 4090 single-runner routing (#534) currently serializes these runs anyway, so the guard is the backstop for future pool changes rather than a live-fire mechanism today.
QA watch 2026-07-13 ~20:53Z — guard merged (a3fba37) and version-compatible. Implementation: workflow-level concurrency group 'model-env-images' with cancel-in-progress: true — newest commit owns :latest, superseded runs cancelled. The commit's own caveat ('silently ignored when unsupported') checks out OK here: this instance is Gitea 1.26.4, and workflow concurrency support landed in the 1.24 line — so the key should be honored, not ignored.
Close condition: observe one real supersede — next time two ModelEnvImages runs would overlap (rapid merge pair or manual double-dispatch), confirm the older run flips to cancelled instead of racing. I'll watch for a natural occurrence; a deliberate two-dummy-push test works too if someone wants it closed sooner. Also note the 4090 single-runner routing (#534) currently serializes these runs anyway, so the guard is the backstop for future pool changes rather than a live-fire mechanism today.
Tonight's runs add the live evidence on top of the version check: build_env_images run 6612 (the #537 weight-patterns merge) ran to success under the guard — built + pushed env-sdxllightning AND env-triposr, cascade dispatched, no interference. And the cancel semantics of the exact same stanza were exercised for real on the backend fleet tonight (see #548: superseded arm64v8 runs cancelled at 20:44Z rather than racing :latest). Between Gitea 1.26.4 support confirmed, a green run under the guard, and the stanza's cancel path proven fleet-wide, I'd call the two-dummy-push ceremony redundant — recommend closing.
— macbook-claude-session
Tonight's runs add the live evidence on top of the version check: `build_env_images` run [6612](https://git.spikersoft.com/spikerj/spikersoft-artpipe/actions/runs/6612) (the #537 weight-patterns merge) ran to **success under the guard** — built + pushed env-sdxllightning AND env-triposr, cascade dispatched, no interference. And the cancel semantics of the exact same stanza were exercised for real on the backend fleet tonight (see #548: superseded arm64v8 runs cancelled at 20:44Z rather than racing :latest). Between Gitea 1.26.4 support confirmed, a green run under the guard, and the stanza's cancel path proven fleet-wide, I'd call the two-dummy-push ceremony redundant — recommend closing.
— macbook-claude-session
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Observed 2026-07-13 ~02:25Z: runs 10775 (Phase-2 merge f439de2, on the laptop runner, mid-batch) and 10777 (caching fix b76f743, on the 4090 runner) are building concurrently, both pushing
artpipe-base:*andartpipe-model-env-{safetycheck,blender,sdxllightning,triposr}:latest.Consequences:
:latestand the ARTPIPE_SHA provenance labels (d1f6ba7) end up from whichever run pushes LAST per image — an older commit can clobber a newer one's tags (mostly-benign now since the model Dockerfiles are identical across the two commits, but silently wrong provenance).Fixes, cheapest first:
concurrency: { group: model-env-images, cancel-in-progress: true }at workflow level, if the Gitea version honors it (verify — support landed in recent Gitea; if unsupported it's silently ignored, so test with two dummy pushes).runs-on: [ubuntu-amd64-4090]) serializes runs as a side effect — a single act_runner executes one job at a time, so later runs queue instead of racing.GET /api/v1/repos/spikerj/spikersoft-artpipe/actions/tasksfor an in-flight ModelEnvImages run and exit early.Related: #514, #515, #516, #534.
artpipe PR #18: workflow-level concurrency group with cancel-in-progress (ticket fix option 1) — newest commit owns :latest + provenance; superseded runs cancel instead of clobbering. Option 2 side-effect already live since artpipe PR #16 (4090 exclusive runner serializes); the guard covers the documented urgent-flip escape hatch back to the two-runner pool. Verification (two dummy pushes, first shows Cancelled) best done after the current push batch. Note for #534: the ModelEnvImages half is done via PR #16 — remaining is routing the backend tier-3 finals loop.
QA watch 2026-07-13 ~20:53Z — guard merged (a3fba37) and version-compatible. Implementation: workflow-level concurrency group 'model-env-images' with cancel-in-progress: true — newest commit owns :latest, superseded runs cancelled. The commit's own caveat ('silently ignored when unsupported') checks out OK here: this instance is Gitea 1.26.4, and workflow concurrency support landed in the 1.24 line — so the key should be honored, not ignored.
Close condition: observe one real supersede — next time two ModelEnvImages runs would overlap (rapid merge pair or manual double-dispatch), confirm the older run flips to cancelled instead of racing. I'll watch for a natural occurrence; a deliberate two-dummy-push test works too if someone wants it closed sooner. Also note the 4090 single-runner routing (#534) currently serializes these runs anyway, so the guard is the backstop for future pool changes rather than a live-fire mechanism today.
Tonight's runs add the live evidence on top of the version check:
build_env_imagesrun 6612 (the #537 weight-patterns merge) ran to success under the guard — built + pushed env-sdxllightning AND env-triposr, cascade dispatched, no interference. And the cancel semantics of the exact same stanza were exercised for real on the backend fleet tonight (see #548: superseded arm64v8 runs cancelled at 20:44Z rather than racing :latest). Between Gitea 1.26.4 support confirmed, a green run under the guard, and the stanza's cancel path proven fleet-wide, I'd call the two-dummy-push ceremony redundant — recommend closing.— macbook-claude-session