@htekdev/actions-debugger 1.0.113 → 1.0.114

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/errors/caching-artifacts/cache-corrupt-on-cancel-during-restore-save-always.yml +136 -0
  2. package/errors/caching-artifacts/restore-keys-asterisk-literal-not-glob.yml +107 -0
  3. package/errors/concurrency-timing/pull-request-review-shared-concurrency-cancels-ci.yml +131 -0
  4. package/errors/known-unsolved/github-script-esm-not-supported.yml +111 -0
  5. package/errors/known-unsolved/job-outputs-string-only-no-array-object.yml +142 -0
  6. package/errors/permissions-auth/oidc-immutable-sub-claim-new-repo-trust-policy-mismatch.yml +122 -0
  7. package/errors/permissions-auth/permissions-auth-064.yml +122 -0
  8. package/errors/permissions-auth/permissions-auth-065.yml +97 -0
  9. package/errors/permissions-auth/permissions-auth-066.yml +129 -0
  10. package/errors/runner-environment/arc-kubernetes-checkout-circular-json-container-hook.yml +101 -0
  11. package/errors/runner-environment/cache-restore-windows-runner-silent-crash.yml +130 -0
  12. package/errors/runner-environment/git-248-fetch-tags-shallow-clone-regression.yml +100 -0
  13. package/errors/runner-environment/javascript-actions-alpine-arm64-not-supported.yml +121 -0
  14. package/errors/runner-environment/runner-environment-188.yml +96 -0
  15. package/errors/runner-environment/runner-environment-191.yml +147 -0
  16. package/errors/runner-environment/runner-environment-192.yml +144 -0
  17. package/errors/runner-environment/runner-environment-193.yml +136 -0
  18. package/errors/runner-environment/runner-environment-194.yml +86 -0
  19. package/errors/silent-failures/checkout-v6-clean-false-deletes-workspace-on-repo-change.yml +119 -0
  20. package/errors/silent-failures/queue-max-silently-ignored-with-cancel-in-progress.yml +109 -0
  21. package/errors/silent-failures/silent-failures-102.yml +141 -0
  22. package/errors/silent-failures/silent-failures-104.yml +119 -0
  23. package/errors/yaml-syntax/yaml-syntax-068.yml +137 -0
  24. package/errors/yaml-syntax/yaml-syntax-069.yml +118 -0
  25. package/package.json +1 -1
@@ -0,0 +1,144 @@
1
+ id: runner-environment-192
2
+ title: 'ubuntu-24.04 Kernel 6.17.0-1015-azure Oops in ublk_drv — User Block Device Workflows Hang'
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - ubuntu-24.04
7
+ - kernel
8
+ - ublk
9
+ - io-uring
10
+ - runner-image
11
+ - regression
12
+ patterns:
13
+ - regex: 'ublk_init_queues.*Oops|RIP.*ublk_init_queues'
14
+ flags: 'i'
15
+ - regex: 'ublk_ctrl_add_dev|UBLK_U_CMD_ADD_DEV.*hang|ublk_drv.*kernel.*oops'
16
+ flags: 'i'
17
+ - regex: 'note: iou-wrk-.*exited with irqs disabled'
18
+ flags: 'i'
19
+ - regex: 'modprobe ublk_drv.*ublk.*add.*dev.*timeout|ublk.*command.*never completes'
20
+ flags: 'i'
21
+ error_messages:
22
+ - 'RIP: 0010:ublk_init_queues+0x4e/0x1e0 [ublk_drv]'
23
+ - 'note: iou-wrk-* exited with irqs disabled'
24
+ - 'ublk_ctrl_add_dev+0x31a/0x5e0 [ublk_drv]'
25
+ - 'Oops: general protection fault, probably for non-canonical address'
26
+ root_cause: |
27
+ The ubuntu-24.04 runner image released 2026-05-26 (version 20260525.161.1) ships
28
+ Linux kernel 6.17.0-1015-azure (upgraded from 6.17.0-1013-azure). This kernel
29
+ contains an upstream bug in the `ublk_drv` module: calling `UBLK_U_CMD_ADD_DEV`
30
+ once via io_uring triggers a kernel Oops in `ublk_init_queues+0x4e/0x1e0`.
31
+
32
+ **Affected call chain:**
33
+ ```
34
+ ublk_init_queues
35
+ ublk_ctrl_add_dev
36
+ ublk_ctrl_uring_cmd
37
+ io_uring_cmd
38
+ io_wq_submit_work
39
+ io_wq_worker
40
+ ```
41
+
42
+ After the Oops, the ADD_DEV io_uring command never receives a completion event
43
+ (CQE), so the userspace program waits indefinitely. The GitHub Actions job hangs
44
+ until it hits the workflow timeout.
45
+
46
+ **Affected environments:**
47
+ - ubuntu-24.04 amd64 hosted runners with kernel 6.17.0-1015-azure
48
+ - Any workflow that calls `modprobe ublk_drv` and then performs `UBLK_U_CMD_ADD_DEV`
49
+
50
+ **Unaffected environments:**
51
+ - ubuntu-22.04 runners (kernel 6.8.0-1052-azure — not affected)
52
+ - ubuntu-24.04 self-hosted runners still on kernel 6.17.0-1013-azure or earlier
53
+
54
+ This is an upstream `linux-azure` kernel bug (not a runner-images regression).
55
+ GitHub does not pin the kernel — it is delivered from Canonical's HWE channel.
56
+ A kernel SRU fix from Canonical will be picked up automatically in future
57
+ ubuntu-24.04 runner image releases.
58
+ fix: |
59
+ **Workaround: pin ublk-based jobs to ubuntu-22.04 until the kernel SRU is deployed.**
60
+
61
+ ```yaml
62
+ ublk-test:
63
+ runs-on: ubuntu-22.04 # kernel 6.8.0 — ublk_drv works correctly
64
+ steps:
65
+ - uses: actions/checkout@v6
66
+ - run: |
67
+ sudo modprobe ublk_drv || {
68
+ sudo apt-get install -y --no-install-recommends \
69
+ "linux-modules-extra-$(uname -r)"
70
+ sudo modprobe ublk_drv
71
+ }
72
+ # your ublk test here
73
+ ```
74
+
75
+ **Alternative: install `linux-modules-extra` and test kernel version at runtime:**
76
+
77
+ ```bash
78
+ KERNEL=$(uname -r)
79
+ if [[ "$KERNEL" == "6.17.0-1015-azure" ]]; then
80
+ echo "::warning::Kernel 6.17.0-1015-azure has a ublk_drv bug. Skipping ublk tests."
81
+ exit 0
82
+ fi
83
+ ```
84
+
85
+ Track the upstream kernel SRU at Canonical:
86
+ https://bugs.launchpad.net/ubuntu/+source/linux-azure/
87
+ fix_code:
88
+ - language: yaml
89
+ label: 'Pin ublk-dependent jobs to ubuntu-22.04 as workaround'
90
+ code: |
91
+ jobs:
92
+ ublk-integration:
93
+ # Workaround: ubuntu-24.04 kernel 6.17.0-1015-azure has a ublk_drv bug.
94
+ # Pin to ubuntu-22.04 until a fixed kernel SRU lands in ubuntu-24.04.
95
+ runs-on: ubuntu-22.04
96
+ steps:
97
+ - uses: actions/checkout@v6
98
+ - name: Load ublk_drv
99
+ run: |
100
+ sudo modprobe ublk_drv || {
101
+ sudo apt-get update -qq
102
+ sudo apt-get install -y --no-install-recommends \
103
+ "linux-modules-extra-$(uname -r)"
104
+ sudo modprobe ublk_drv
105
+ }
106
+ - name: Run ublk tests
107
+ run: make test-ublk
108
+
109
+ - language: yaml
110
+ label: 'Matrix with runtime kernel guard to skip known-broken kernel'
111
+ code: |
112
+ jobs:
113
+ ublk-test:
114
+ strategy:
115
+ matrix:
116
+ runner: [ubuntu-22.04, ubuntu-24.04]
117
+ runs-on: ${{ matrix.runner }}
118
+ steps:
119
+ - uses: actions/checkout@v6
120
+ - name: Check kernel for ublk_drv bug
121
+ run: |
122
+ KERNEL=$(uname -r)
123
+ echo "Kernel: $KERNEL"
124
+ if [[ "$KERNEL" == "6.17.0-1015-azure" ]]; then
125
+ echo "::warning::Skipping ublk tests on $KERNEL (known ublk_drv Oops)"
126
+ echo "SKIP_UBLK=true" >> "$GITHUB_ENV"
127
+ fi
128
+ - name: Run ublk tests
129
+ if: env.SKIP_UBLK != 'true'
130
+ run: make test-ublk
131
+ prevention:
132
+ - 'Monitor ubuntu-24.04 kernel version in release notes before running ublk/io_uring block device tests.'
133
+ - 'Add a kernel version gate in ublk-dependent CI steps to skip on known-bad kernels.'
134
+ - 'Subscribe to or monitor `actions/runner-images` issues for kernel regression reports on Ubuntu runners.'
135
+ - 'Consider pinning ublk integration tests to ubuntu-22.04 as a long-term stable baseline for kernel-intensive work.'
136
+ docs:
137
+ - url: 'https://github.com/actions/runner-images/issues/14175'
138
+ label: 'runner-images #14175 — ubuntu-24.04 kernel 6.17.0-1015-azure Oops in ublk_drv (open)'
139
+ - url: 'https://github.com/e2b-dev/ublk-adddev-repro'
140
+ label: 'Minimal ublk UBLK_U_CMD_ADD_DEV repro repo'
141
+ - url: 'https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260525.161'
142
+ label: 'Ubuntu 24.04 runner image 20260525.161.1 — kernel 6.17.0-1015-azure'
143
+ - url: 'https://bugs.launchpad.net/ubuntu/+source/linux-azure/'
144
+ label: 'Canonical linux-azure bug tracker (for SRU status)'
@@ -0,0 +1,136 @@
1
+ id: runner-environment-193
2
+ title: 'ubuntu-24.04-arm64 GitHub-Managed Image Ships Ruby 3.2.3 vs x64 Ruby 4.0 — Matrix Builds Fail'
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - ubuntu-24.04
7
+ - arm64
8
+ - ruby
9
+ - matrix
10
+ - runner-image
11
+ - version-mismatch
12
+ patterns:
13
+ - regex: 'Your Ruby version is 3\.2\.[0-9], but your Gemfile specified.*[~>].*4\.'
14
+ flags: 'i'
15
+ - regex: 'bundler.*RUBY_VERSION.*3\.2.*expected.*4\.|incompatible.*ruby.*3\.2.*4\.'
16
+ flags: 'i'
17
+ - regex: 'LoadError.*incompatible library version.*ruby.*3\.2|\.bundle.*built for Ruby 3\.2.*running.*4\.'
18
+ flags: 'i'
19
+ - regex: 'ubuntu-24\.04-arm.*ruby.*3\.2|arm64.*ruby.*version.*mismatch'
20
+ flags: 'i'
21
+ error_messages:
22
+ - 'Your Ruby version is 3.2.3, but your Gemfile specified ~> 4.0'
23
+ - 'LoadError: incompatible library version - /path/to/native.bundle'
24
+ - "An error occurred while installing nokogiri (1.x.x), and Bundler cannot continue."
25
+ - 'Gem::RuntimeRequirementNotMetError: ruby 4.0 is required'
26
+ root_cause: |
27
+ The first GitHub-managed Ubuntu 24.04 ARM64 runner image (ubuntu24-arm64/
28
+ 20260531.15.1, released 2026-06-03) ships Ruby 3.2.3 as the default system Ruby.
29
+ In contrast, the Ubuntu 24.04 x86-64 runner image (ubuntu24/20260525.161.1) ships
30
+ Ruby 4.0.5. This version gap was introduced when GitHub took over ARM64 image
31
+ maintenance from Arm Limited in May–June 2026; the ARM64 image was rebuilt with a
32
+ different baseline software set.
33
+
34
+ **Affected workflows — any that run a Ruby matrix over both platforms:**
35
+ ```yaml
36
+ strategy:
37
+ matrix:
38
+ os: [ubuntu-24.04, ubuntu-24.04-arm]
39
+ ```
40
+
41
+ Failure modes:
42
+ 1. **Gemfile Ruby version constraint** — if the Gemfile (or `.ruby-version`) pins
43
+ `ruby ~> 4.0` (or uses Ruby 4.0 syntax features), the ARM64 run fails immediately
44
+ with "Your Ruby version is 3.2.3, but your Gemfile specified ~> 4.0".
45
+
46
+ 2. **Native extension ABI mismatch** — if the workflow restores a gem cache built
47
+ on the x64 runner (Ruby 4.0 ABI), native extension `.bundle` files are
48
+ incompatible with Ruby 3.2 on ARM64, producing a `LoadError` at test time.
49
+
50
+ 3. **Ruby 4.0 language/stdlib differences** — Ruby 4.0 removed several deprecated
51
+ methods that exist in Ruby 3.2 (e.g., Kernel#binding). Code that uses 4.0-only
52
+ APIs silently succeeds on x64 but may have unexpected behaviour differences on
53
+ ARM64.
54
+
55
+ 4. **setup-ruby without an explicit ruby-version** — if no version is pinned, the
56
+ action resolves "system ruby" differently per platform, producing Ruby 3.2 on
57
+ ARM64 and Ruby 4.0 on x64.
58
+
59
+ Ubuntu ARM64 runners maintained by Arm Limited previously matched x64 Ruby
60
+ versions more closely. The GitHub-managed ARM64 baseline is younger and will
61
+ converge with x64 over subsequent image releases.
62
+ fix: |
63
+ **Explicit Ruby version with ruby/setup-ruby** on all platforms to override the
64
+ system Ruby and get a consistent version:
65
+
66
+ ```yaml
67
+ - uses: ruby/setup-ruby@v1
68
+ with:
69
+ ruby-version: '3.3' # or whatever version your project supports on both arches
70
+ bundler-cache: true
71
+ ```
72
+
73
+ **Separate cache keys per OS/arch** to avoid cross-ABI gem cache poisoning:
74
+
75
+ ```yaml
76
+ - uses: actions/cache@v4
77
+ with:
78
+ path: vendor/bundle
79
+ key: ${{ runner.os }}-${{ runner.arch }}-ruby-${{ hashFiles('Gemfile.lock') }}
80
+ ```
81
+
82
+ **Guard Gemfile ruby version** to accept both 3.x and 4.x on the arm64 matrix:
83
+
84
+ ```ruby
85
+ # Gemfile
86
+ ruby '>= 3.2' # instead of ~> 4.0, to allow both ubuntu-24.04 and ubuntu-24.04-arm
87
+ ```
88
+ fix_code:
89
+ - language: yaml
90
+ label: 'Pin Ruby version with setup-ruby across all matrix platforms'
91
+ code: |
92
+ jobs:
93
+ test:
94
+ strategy:
95
+ matrix:
96
+ os: [ubuntu-24.04, ubuntu-24.04-arm]
97
+ runs-on: ${{ matrix.os }}
98
+ steps:
99
+ - uses: actions/checkout@v6
100
+
101
+ # Explicitly pin Ruby to get the same version on x64 AND ARM64.
102
+ # Without this, x64 gets Ruby 4.0.x and ARM64 gets Ruby 3.2.x.
103
+ - uses: ruby/setup-ruby@v1
104
+ with:
105
+ ruby-version: '3.3' # consistent across both architectures
106
+ bundler-cache: true
107
+
108
+ - run: bundle exec rspec
109
+
110
+ - language: yaml
111
+ label: 'Per-arch gem cache key to prevent ABI mismatch on cache restore'
112
+ code: |
113
+ - name: Cache gems
114
+ uses: actions/cache@v4
115
+ with:
116
+ path: vendor/bundle
117
+ # Include runner.arch so ARM64 and x64 don't share native extension builds
118
+ key: >-
119
+ ${{ runner.os }}-${{ runner.arch }}-gems-
120
+ ${{ hashFiles('Gemfile.lock') }}
121
+ restore-keys: |
122
+ ${{ runner.os }}-${{ runner.arch }}-gems-
123
+ prevention:
124
+ - 'Always use `ruby/setup-ruby` with an explicit `ruby-version` in cross-arch matrix jobs — never rely on the system Ruby.'
125
+ - 'Include `runner.arch` in gem cache keys to prevent native extension ABI mismatches between x64 and ARM64 runs.'
126
+ - 'Set Gemfile Ruby version constraint to `>= 3.2` instead of `~> 4.0` when the matrix includes ubuntu-24.04-arm.'
127
+ - 'Check the ubuntu24-arm64 runner release notes for software version differences vs ubuntu-24.04 x64 before adding ARM64 to your CI matrix.'
128
+ docs:
129
+ - url: 'https://github.com/actions/runner-images/releases/tag/ubuntu24-arm64%2F20260531.15'
130
+ label: 'ubuntu24-arm64/20260531.15 — first GitHub-managed ARM64 image (Ruby 3.2.3)'
131
+ - url: 'https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260525.161'
132
+ label: 'ubuntu24/20260525.161.1 — Ubuntu 24.04 x64 image (Ruby 4.0.5)'
133
+ - url: 'https://github.com/actions/runner-images/issues/14100'
134
+ label: 'runner-images #14100 — ARM64 runner images now maintained by GitHub'
135
+ - url: 'https://github.com/ruby/setup-ruby'
136
+ label: 'ruby/setup-ruby — install a consistent Ruby version on any runner'
@@ -0,0 +1,86 @@
1
+ id: runner-environment-194
2
+ title: 'Job Blocked at Queue: "recent account payments have failed or your spending limit needs to be increased"'
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - billing
7
+ - spending-limit
8
+ - payments
9
+ - job-blocked
10
+ - queue
11
+ - account
12
+ patterns:
13
+ - regex: 'recent account payments have failed'
14
+ flags: 'i'
15
+ - regex: 'spending limit needs to be increased'
16
+ flags: 'i'
17
+ - regex: 'The job was not started because recent account'
18
+ flags: 'i'
19
+ error_messages:
20
+ - "The job was not started because recent account payments have failed or your spending limit needs to be increased."
21
+ root_cause: |
22
+ GitHub Actions computes minutes and storage usage against the account or organization's
23
+ spending limit. When either of the following conditions is true, queued jobs are never
24
+ assigned a runner and remain stuck indefinitely:
25
+
26
+ 1. **Billing failure** — the payment method on file was declined or has expired. GitHub
27
+ cannot charge for overages and blocks new job starts as a safeguard.
28
+
29
+ 2. **Spending limit reached** — the account spending limit for Actions minutes (or
30
+ artifact/package storage) has been hit. The default spending limit for paid plans is
31
+ $0 of overage; once included minutes are exhausted, jobs are blocked unless the limit
32
+ is raised.
33
+
34
+ The error message appears in the workflow run summary and the job queue-wait log — NOT in
35
+ step output, because no step ever runs. Jobs remain at "Queued" and eventually time out
36
+ (typically 6 hours) with this message.
37
+
38
+ Common triggers:
39
+ - End of billing cycle — included minutes exhausted, spending limit at $0
40
+ - Payment method expired (credit card expiry, bank decline, insufficient funds)
41
+ - Free plan runner-minutes exhausted mid-month with no spending limit override
42
+ - Organization suspended or billing contact unreachable
43
+ fix: |
44
+ **For payment failure:**
45
+ 1. Navigate to Settings → Billing and plans → Payment information
46
+ 2. Update or replace the payment method
47
+ 3. Re-run failed workflow jobs after billing resolves
48
+
49
+ **For spending limit exhaustion:**
50
+ 1. Navigate to Settings → Billing and plans → Spending limits
51
+ 2. Set a non-zero spending limit for Actions (or increase the existing limit)
52
+ 3. Alternatively, migrate expensive workloads to self-hosted runners to eliminate
53
+ billed minute consumption
54
+
55
+ **Check current usage:**
56
+ - Settings → Billing and plans → View usage this month → Actions
57
+ fix_code:
58
+ - language: yaml
59
+ label: "Route expensive jobs to self-hosted runner to avoid billed minutes"
60
+ code: |
61
+ jobs:
62
+ build:
63
+ # Self-hosted runners consume $0 of GitHub-hosted Actions minutes
64
+ runs-on: self-hosted
65
+ steps:
66
+ - uses: actions/checkout@v4
67
+ - run: npm run build
68
+ - language: yaml
69
+ label: "Reduce billed minutes with cancel-in-progress concurrency"
70
+ code: |
71
+ # Cancel stale runs on new push — saves minutes on abandoned branches
72
+ concurrency:
73
+ group: ${{ github.workflow }}-${{ github.ref }}
74
+ cancel-in-progress: true
75
+ prevention:
76
+ - "Set a non-zero spending limit or configure spending alerts in Settings → Billing to receive email warnings before jobs are blocked"
77
+ - "Monitor Actions usage in Settings → Billing and plans → Usage this month on a regular cadence"
78
+ - "Use `cancel-in-progress: true` concurrency groups to cancel stale workflow runs automatically and reduce minute consumption"
79
+ - "For high-parallelism CI, use self-hosted runners or larger runner credits (Teams/Enterprise) to avoid mid-month exhaustion"
80
+ docs:
81
+ - url: "https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-github-actions/about-billing-for-github-actions"
82
+ label: "About billing for GitHub Actions"
83
+ - url: "https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-github-actions/managing-your-spending-limit-for-github-actions"
84
+ label: "Managing your spending limit for GitHub Actions"
85
+ - url: "https://github.com/orgs/community/discussions/151956"
86
+ label: "GitHub Community Discussion #151956 — jobs not starting due to spending limit"
@@ -0,0 +1,119 @@
1
+ id: silent-failures-105
2
+ title: 'checkout@v6 clean: false still deletes workspace when remote URL changes between checkouts'
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - checkout
7
+ - clean
8
+ - workspace
9
+ - multi-checkout
10
+ - v6
11
+ - remote-url
12
+ patterns:
13
+ - regex: 'Deleting the contents of.*work.*\n.*Initializing the repository'
14
+ flags: 'i'
15
+ - regex: 'clean:\s*false[\s\S]{0,500}Deleting the contents of'
16
+ flags: 'i'
17
+ - regex: 'git config --local --get remote\.origin\.url[\s\S]{0,200}Deleting the contents'
18
+ flags: 'i'
19
+ error_messages:
20
+ - 'Deleting the contents of ''/home/runner/work/myrepo/myrepo'''
21
+ - 'Deleting the contents of ''/home/runner/work/_temp/...'
22
+ root_cause: |
23
+ actions/checkout's `clean: false` option prevents `git clean -ffdx` (removing untracked
24
+ files) but does NOT prevent the action from deleting and reinitializing the entire
25
+ workspace directory when it detects that the existing `remote.origin.url` does not match
26
+ the target repository being checked out.
27
+
28
+ When multiple checkout steps run in the same job and the second checkout targets a
29
+ different repository (different org, different repo name, or different URL), the action
30
+ reads the current `git config --local --get remote.origin.url`, compares it against the
31
+ target repository URL, and — on mismatch — deletes the entire workspace directory before
32
+ reinitializing. This deletion happens regardless of `clean: false`.
33
+
34
+ Common scenarios that trigger this:
35
+ 1. First step checks out a support/config repo (sparse-checkout of a different repo for
36
+ shared config), then a second step checks out the main repo with `clean: false`.
37
+ 2. Checking out the main repo first, then a second checkout of a different repo for
38
+ reading shared scripts, assuming `clean: false` preserves the main workspace.
39
+ 3. Re-using runner workspace across jobs via `clean: false` where the prior job checked
40
+ out a different repository.
41
+
42
+ The log shows the silent deletion in plain text ("Deleting the contents of '...'") but
43
+ users commonly miss it because the step still succeeds and subsequent steps may not
44
+ immediately error if they only use the freshly-checked-out content.
45
+
46
+ checkout@v5 has the same behavior — this is not a v6 regression. It is documented as
47
+ expected behavior but is frequently unexpected by users.
48
+ fix: |
49
+ Option 1 (recommended): Specify `path:` to checkout each repository into a distinct
50
+ subdirectory, preventing the remote URL mismatch from triggering deletion.
51
+
52
+ Option 2: Reverse the order — checkout the main repo last so the deletion (if any)
53
+ happens to the support repo's files rather than the main workspace.
54
+
55
+ Option 3: Accept that `clean: false` cannot preserve workspace contents across
56
+ checkouts of different repositories sharing the same path, and restructure the workflow
57
+ to avoid this pattern.
58
+
59
+ Option 4: For reading shared scripts/config from another repo, use curl/gh api to fetch
60
+ specific files rather than a full checkout step.
61
+ fix_code:
62
+ - language: yaml
63
+ label: 'Use path: to isolate each checkout to its own directory'
64
+ code: |
65
+ jobs:
66
+ build:
67
+ runs-on: ubuntu-latest
68
+ steps:
69
+ # Checkout support config into a subdirectory
70
+ - name: Checkout shared config
71
+ uses: actions/checkout@v6
72
+ with:
73
+ repository: myorg/shared-config
74
+ ref: v1
75
+ sparse-checkout: |
76
+ nginx/nginx.conf
77
+ path: .shared-config # <-- isolated path, no URL conflict
78
+
79
+ # Checkout main repo into workspace root (or another path)
80
+ - name: Checkout source
81
+ uses: actions/checkout@v6
82
+ with:
83
+ fetch-depth: 0
84
+ # clean: false is now safe — different paths, no URL mismatch
85
+
86
+ - name: Use shared config
87
+ run: cp .shared-config/nginx/nginx.conf ./nginx.conf
88
+
89
+ - language: yaml
90
+ label: 'Fetch individual files without a full checkout to avoid URL conflict'
91
+ code: |
92
+ jobs:
93
+ build:
94
+ runs-on: ubuntu-latest
95
+ steps:
96
+ - uses: actions/checkout@v6
97
+ with:
98
+ fetch-depth: 0
99
+
100
+ # Fetch a single file from another repo without a second checkout
101
+ - name: Fetch shared nginx config
102
+ env:
103
+ GH_TOKEN: ${{ github.token }}
104
+ run: |
105
+ gh api repos/myorg/shared-config/contents/nginx/nginx.conf \
106
+ --jq '.content' | base64 -d > ./nginx.conf
107
+
108
+ prevention:
109
+ - 'Use path: on every checkout step when multiple repositories are checked out in the same job'
110
+ - 'Do not rely on clean: false to preserve workspace content across checkouts of different repositories'
111
+ - 'Watch for "Deleting the contents of..." lines in checkout step logs — this confirms workspace was reset even with clean: false'
112
+ - 'When using sparse-checkout for a support repo followed by a main repo checkout, always isolate them into separate path: directories'
113
+ docs:
114
+ - url: 'https://github.com/actions/checkout/issues/2348'
115
+ label: 'actions/checkout#2348 — v6 clean: false still deletes workspace files from prior checkout (Feb 2026)'
116
+ - url: 'https://github.com/actions/checkout#usage'
117
+ label: 'actions/checkout — clean input documentation'
118
+ - url: 'https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/storing-workflow-data-as-artifacts'
119
+ label: 'Storing workflow data — alternative to multi-repo checkout for sharing files'
@@ -0,0 +1,109 @@
1
+ id: silent-failures-103
2
+ title: "concurrency queue: max silently ignored when cancel-in-progress: true is also set"
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - concurrency
7
+ - queue
8
+ - cancel-in-progress
9
+ - silent-failure
10
+ - deployment
11
+ - serialization
12
+ patterns:
13
+ - regex: 'This run has been cancelled'
14
+ flags: 'i'
15
+ - regex: 'Canceling since a higher priority waiting run was found'
16
+ flags: 'i'
17
+ - regex: 'queue:\s*max'
18
+ flags: 'i'
19
+ error_messages:
20
+ - "This run has been cancelled."
21
+ - "Canceling since a higher priority waiting run was found"
22
+ root_cause: |
23
+ GitHub Actions introduced `queue: max` in May 2026 as a way to allow up to 100
24
+ pending runs to wait in a concurrency group instead of being cancelled and
25
+ replaced. Adding `queue: max` to an existing concurrency block without removing
26
+ `cancel-in-progress: true` results in the `queue: max` setting being silently
27
+ ignored — no validation error is raised, no warning is emitted.
28
+
29
+ The concurrency group continues to cancel pending runs exactly as it did before.
30
+ The developer believes their deployment queue is now buffering up to 100 runs,
31
+ but every third commit or concurrent PR merge still cancels the previously queued
32
+ run, dropping deployments silently.
33
+
34
+ The language services editor plugin (VS Code Actions extension) does report a
35
+ lint error for this combination, but:
36
+ - Not all teams have the extension installed or enabled.
37
+ - The Actions UI and `gh` CLI do not surface the conflict at run time.
38
+ - The workflow file passes schema validation and runs without a reported error.
39
+
40
+ The practical symptom is identical to having no `queue: max` at all: runs are
41
+ still cancelled, the queue never grows beyond one pending run, and deployments
42
+ are dropped during high-frequency push periods — exactly the problem `queue: max`
43
+ was supposed to solve.
44
+ fix: |
45
+ Remove `cancel-in-progress: true` (or omit it entirely, since `false` is the
46
+ default) when using `queue: max`. These two options are mutually exclusive:
47
+
48
+ - `cancel-in-progress: true` — cancel the pending run when a newer run arrives.
49
+ - `queue: max` — hold up to 100 pending runs in order.
50
+
51
+ If you need both semantics (cancel old pending runs for feature branches but queue
52
+ for main), split into separate concurrency group expressions per ref:
53
+
54
+ ```yaml
55
+ concurrency:
56
+ group: deploy-${{ github.ref }}
57
+ cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
58
+ # Do NOT add queue: max when cancel-in-progress may be true
59
+ ```
60
+
61
+ For the main branch where ordered deploys matter, use `queue: max` alone:
62
+
63
+ ```yaml
64
+ concurrency:
65
+ group: deploy-production
66
+ queue: max
67
+ # cancel-in-progress must be omitted or set to false
68
+ ```
69
+ fix_code:
70
+ - language: yaml
71
+ label: "WRONG — queue: max silently ignored when cancel-in-progress: true"
72
+ code: |
73
+ concurrency:
74
+ group: deploy-${{ github.repository }}-${{ github.ref }}
75
+ cancel-in-progress: true # ← PROBLEM: negates queue: max
76
+ queue: max # ← silently ignored, no error shown
77
+ - language: yaml
78
+ label: "CORRECT — use queue: max without cancel-in-progress"
79
+ code: |
80
+ concurrency:
81
+ group: deploy-${{ github.repository }}-${{ github.ref }}
82
+ queue: max # ← up to 100 pending runs queued
83
+ # cancel-in-progress is false by default — omit it entirely
84
+ - language: yaml
85
+ label: "ADVANCED — cancel-in-progress for branches, queue for main"
86
+ code: |
87
+ concurrency:
88
+ group: deploy-${{ github.repository }}-${{ github.ref }}
89
+ # Dynamic cancel: cancel feature branch runs (fast feedback), queue
90
+ # main branch deploys (preserve ordering).
91
+ cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
92
+ # Note: queue: max cannot be combined with cancel-in-progress.
93
+ # For main branch serialization without cancel, omit cancel-in-progress
94
+ # and rely on queue: max in a separate workflow targeting only main.
95
+ prevention:
96
+ - "When adding `queue: max` to an existing concurrency block, always audit the
97
+ block for a `cancel-in-progress: true` setting and remove it."
98
+ - "Install the GitHub Actions VS Code extension — it reports a lint error for
99
+ `queue: max` + `cancel-in-progress: true` combinations before you push."
100
+ - "After enabling `queue: max`, verify it works by triggering two rapid pushes
101
+ and confirming both runs appear in the Actions UI as 'Queued' rather than one
102
+ being cancelled."
103
+ docs:
104
+ - url: "https://github.blog/changelog/2026-05-07-github-actions-concurrency-groups-now-allow-larger-queues/"
105
+ label: "GitHub Changelog: GitHub Actions concurrency groups now allow larger queues (May 7, 2026)"
106
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/using-concurrency"
107
+ label: "Using concurrency — GitHub Actions documentation"
108
+ - url: "https://github.com/actions/languageservices/pull/355"
109
+ label: "actions/languageservices#355: Add queue property to concurrency, validate queue+cancel-in-progress conflict"