cc74901761
- concurrency: cancel in-progress runs on new pushes (non-tag only); tag runs are never cancelled so releases can't kill themselves - permissions: contents: read default, packages: write scoped to build - docker build: explicit cache-from/cache-to against :cache tag so BuildKit warmth survives local runner cleanup - lint: pipx install ruff instead of --break-system-packages - actions/cache@v3 → @v4 - triggers main branch pushes for gate runs (build stays dev/tag only) - comments added on the non-obvious bits (http-ece isolation, docker prune two-step, registry cache mode=max)