diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7ab228faf4d..162d804141e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ permissions: contents: read concurrency: - group: ${{ github.event_name == 'pull_request' && format('{0}-{1}', github.workflow, github.event.pull_request.number) || (github.repository == 'openclaw/openclaw' && format('{0}-{1}', github.workflow, github.ref) || format('{0}-{1}-{2}', github.workflow, github.ref, github.sha)) }} + group: ${{ github.event_name == 'pull_request' && format('{0}-v2-{1}', github.workflow, github.event.pull_request.number) || (github.repository == 'openclaw/openclaw' && format('{0}-v2-{1}', github.workflow, github.ref) || format('{0}-v2-{1}-{2}', github.workflow, github.ref, github.sha)) }} cancel-in-progress: true env: diff --git a/docs/ci.md b/docs/ci.md index bd98546072d..19c13cc2bd4 100644 --- a/docs/ci.md +++ b/docs/ci.md @@ -54,6 +54,7 @@ On pushes, the `checks` matrix adds the push-only `compat-node22` lane. On pull The slowest Node test families are split into include-file shards so each job stays small: channel contracts split registry and core coverage into eight weighted shards each, auto-reply reply command tests split into four include-pattern shards, and the other large auto-reply reply prefix groups split into two shards each. `check-additional` also separates package-boundary compile/canary work from runtime topology gateway/architecture work. GitHub may mark superseded jobs as `cancelled` when a newer push lands on the same PR or `main` ref. Treat that as CI noise unless the newest run for the same ref is also failing. Aggregate shard checks use `!cancelled() && always()` so they still report normal shard failures but do not queue after the whole workflow has already been superseded. +The CI concurrency key is versioned (`CI-v2-*`) so a GitHub-side zombie in an old queue group cannot indefinitely block newer main runs. ## Runners