@htekdev/actions-debugger 1.0.23 → 1.0.24

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 (57) hide show
  1. package/errors/caching-artifacts/artifact-minimum-retention-one-day.yml +153 -0
  2. package/errors/caching-artifacts/cache-api-propagation-delay-post-save.yml +128 -0
  3. package/errors/caching-artifacts/cache-backend-internal-error-skipped.yml +75 -0
  4. package/errors/caching-artifacts/cache-hit-step-id-case-sensitive-mismatch.yml +95 -0
  5. package/errors/caching-artifacts/cache-save-post-step-skipped-on-failure.yml +114 -0
  6. package/errors/concurrency-timing/deploy-pages-in-progress-deployment-wedged.yml +70 -0
  7. package/errors/concurrency-timing/deployment-review-timeout-expired.yml +88 -0
  8. package/errors/concurrency-timing/job-concurrency-scope-per-run-not-global.yml +81 -0
  9. package/errors/concurrency-timing/merge-queue-concurrency-cancel-blocks-all.yml +86 -0
  10. package/errors/concurrency-timing/reusable-workflow-github-workflow-context-cancel.yml +124 -0
  11. package/errors/concurrency-timing/runner-scale-set-jobs-never-start.yml +123 -0
  12. package/errors/concurrency-timing/runner-temp-dir-race-concurrent-workers.yml +90 -0
  13. package/errors/known-unsolved/artifact-download-url-unauthenticated-404.yml +98 -0
  14. package/errors/known-unsolved/checkout-v6-credentials-docker-run-manual.yml +105 -0
  15. package/errors/known-unsolved/concurrency-groups-repo-scoped-only.yml +138 -0
  16. package/errors/known-unsolved/matrix-256-job-limit.yml +142 -0
  17. package/errors/known-unsolved/merge-group-paths-filter-not-supported.yml +137 -0
  18. package/errors/known-unsolved/no-job-allow-failure.yml +73 -0
  19. package/errors/known-unsolved/schedule-cron-hours-long-queue-drift.yml +101 -0
  20. package/errors/permissions-auth/checkout-persist-credentials-token-write.yml +90 -0
  21. package/errors/permissions-auth/create-github-app-token-cross-job-token-revoked.yml +95 -0
  22. package/errors/permissions-auth/github-token-contents-write-missing-git-push.yml +117 -0
  23. package/errors/permissions-auth/org-actions-policy-blocks-unapproved-action.yml +106 -0
  24. package/errors/runner-environment/codeql-action-v2-deprecated.yml +110 -0
  25. package/errors/runner-environment/macos-26-openssl-3-system-library-breaking.yml +114 -0
  26. package/errors/runner-environment/macos-26-ruby-34-default-upgrade.yml +114 -0
  27. package/errors/runner-environment/macos-26-xcode-default-265-pin-required.yml +99 -0
  28. package/errors/runner-environment/macos-latest-label-switches-to-macos26.yml +127 -0
  29. package/errors/runner-environment/node20-removed-toolcache-default-node22.yml +104 -0
  30. package/errors/runner-environment/powershell-74-76-threadjob-module-rename.yml +124 -0
  31. package/errors/runner-environment/self-hosted-runner-not-found.yml +134 -0
  32. package/errors/runner-environment/self-hosted-runner-selinux-service-exec-failure.yml +116 -0
  33. package/errors/runner-environment/service-container-no-healthcheck.yml +158 -0
  34. package/errors/runner-environment/setup-node-v5-corepack-pnpm-not-found.yml +101 -0
  35. package/errors/runner-environment/setup-node-yarn-not-installed-self-hosted.yml +76 -0
  36. package/errors/runner-environment/setup-python-externally-managed-env-error.yml +95 -0
  37. package/errors/runner-environment/windows-2019-runner-retired-june2025.yml +118 -0
  38. package/errors/runner-environment/windows-2022-docker-daemon-not-started.yml +108 -0
  39. package/errors/silent-failures/cache-hit-output-string-not-boolean.yml +96 -0
  40. package/errors/silent-failures/checkout-lfs-pointer-not-content.yml +105 -0
  41. package/errors/silent-failures/reusable-workflow-output-skipped-contains-secret.yml +115 -0
  42. package/errors/silent-failures/setup-node-silent-download-exit-zero.yml +105 -0
  43. package/errors/silent-failures/setup-python-truncated-manifest-silent-exit.yml +111 -0
  44. package/errors/silent-failures/undefined-env-expression-empty-string-silent.yml +115 -0
  45. package/errors/silent-failures/windows-powershell-github-output-bash-syntax.yml +118 -0
  46. package/errors/triggers/fork-pr-first-time-contributor-approval-required.yml +142 -0
  47. package/errors/triggers/on-push-branches-glob-star-no-slash-match.yml +78 -0
  48. package/errors/triggers/pull-request-target-env-protection-default-branch-eval.yml +117 -0
  49. package/errors/triggers/required-status-check-renamed-never-passes.yml +87 -0
  50. package/errors/triggers/schedule-cron-self-hosted-runner-not-triggered.yml +107 -0
  51. package/errors/yaml-syntax/composite-action-run-shell-missing.yml +90 -0
  52. package/errors/yaml-syntax/composite-action-secrets-context-unavailable.yml +99 -0
  53. package/errors/yaml-syntax/github-script-octokit-renamed-to-github.yml +130 -0
  54. package/errors/yaml-syntax/labeler-v5-config-format-breaking.yml +67 -0
  55. package/errors/yaml-syntax/runs-on-expression-array-syntax-error.yml +121 -0
  56. package/errors/yaml-syntax/setup-go-matrix-version-float-coercion.yml +69 -0
  57. package/package.json +1 -1
@@ -0,0 +1,76 @@
1
+ id: runner-environment-074
2
+ title: "setup-node Does Not Install Yarn on Self-Hosted Runners"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - setup-node
7
+ - yarn
8
+ - self-hosted-runner
9
+ - package-manager
10
+ - corepack
11
+ patterns:
12
+ - regex: "yarn.*command not found|command not found.*yarn"
13
+ flags: "i"
14
+ - regex: "yarn: not found|sh.*yarn.*127"
15
+ flags: "i"
16
+ error_messages:
17
+ - "yarn: command not found"
18
+ - "/bin/sh: 1: yarn: not found"
19
+ - "Process completed with exit code 127"
20
+ root_cause: |
21
+ `actions/setup-node` does NOT install Yarn on self-hosted runners. On GitHub-hosted runners,
22
+ Yarn is pre-installed as part of the runner image (included in ubuntu-22.04, ubuntu-24.04,
23
+ macOS, and Windows hosted images). When migrating to self-hosted runners, workflows that call
24
+ `yarn install` fail with `yarn: command not found` (exit code 127) because the binary is absent.
25
+
26
+ The action provides `cache: 'yarn'` to restore cached modules and registry URL configuration,
27
+ but does NOT bootstrap the Yarn binary itself. As of Node.js 16+, Yarn v2+ (Berry) is distributed
28
+ via Corepack, but Corepack shims are disabled by default in Node.js — setup-node@v4 requires
29
+ explicit `enable-corepack: true` to activate them.
30
+
31
+ 159 reactions on actions/setup-node#182 (open since Dec 2021).
32
+ fix: |
33
+ Option A (Yarn v1): Install Yarn explicitly via npm in a dedicated step before using it.
34
+ Option B (Yarn v2/v3/v4 Berry): Enable Corepack via setup-node's `enable-corepack: true`
35
+ input together with a `packageManager` field in package.json specifying the exact Yarn version.
36
+ Option C: Use `volta-cli/action` or a custom self-hosted runner image with Yarn pre-installed.
37
+ fix_code:
38
+ - language: yaml
39
+ label: "Option A: install Yarn v1 explicitly (compatible with all self-hosted runners)"
40
+ code: |
41
+ steps:
42
+ - uses: actions/checkout@v4
43
+ - uses: actions/setup-node@v4
44
+ with:
45
+ node-version: '20'
46
+ cache: 'yarn'
47
+ - name: Install Yarn
48
+ run: npm install -g yarn@1
49
+ - name: Install dependencies
50
+ run: yarn install --frozen-lockfile
51
+
52
+ - language: yaml
53
+ label: "Option B: enable Corepack for Yarn v2+ (requires packageManager in package.json)"
54
+ code: |
55
+ # Requires package.json to include: "packageManager": "yarn@4.x.x"
56
+ steps:
57
+ - uses: actions/checkout@v4
58
+ - uses: actions/setup-node@v4
59
+ with:
60
+ node-version: '20'
61
+ enable-corepack: true # activates Corepack shims including the yarn binary
62
+ cache: 'yarn'
63
+ - name: Install dependencies
64
+ run: yarn install --immutable
65
+ prevention:
66
+ - "On self-hosted runners, never assume GitHub-hosted image tools are pre-installed — audit all tool dependencies."
67
+ - "Explicitly install or activate package managers (yarn, pnpm, bun) in workflow setup steps."
68
+ - "Use enable-corepack: true in setup-node@v4 for Yarn v2+ projects with packageManager in package.json."
69
+ - "Consider maintaining a custom self-hosted runner image with required package managers pre-installed."
70
+ docs:
71
+ - url: "https://github.com/actions/setup-node/issues/182"
72
+ label: "actions/setup-node #182 — Yarn not installed on self-hosted runners (159 reactions)"
73
+ - url: "https://github.com/actions/setup-node#corepack"
74
+ label: "setup-node — Corepack support documentation"
75
+ - url: "https://yarnpkg.com/corepack"
76
+ label: "Yarn — Corepack installation guide"
@@ -0,0 +1,95 @@
1
+ id: "runner-environment-073"
2
+ title: "pip install fails with externally-managed-environment on Ubuntu 22.04/24.04"
3
+ category: "runner-environment"
4
+ severity: "error"
5
+ tags:
6
+ - "python"
7
+ - "pip"
8
+ - "ubuntu-2204"
9
+ - "ubuntu-2404"
10
+ - "pep668"
11
+ - "virtualenv"
12
+ patterns:
13
+ - regex: "error: externally-managed-environment"
14
+ flags: "i"
15
+ - regex: "This environment is externally managed"
16
+ flags: "i"
17
+ - regex: "To install Python packages system-wide, try apt-get install"
18
+ flags: "i"
19
+ error_messages:
20
+ - "error: externally-managed-environment"
21
+ - "× This environment is externally managed"
22
+ - "╰─> To install Python packages system-wide, try apt-get install python3-xyz"
23
+ - "hint: See PEP 668 for the detailed specification of this behavior."
24
+ root_cause: |
25
+ PEP 668 (adopted in Python 3.11) marks system-managed Python installations as
26
+ "externally managed" to prevent pip from overwriting OS package manager state.
27
+ Ubuntu 22.04 and 24.04 runner images ship with a system Python 3.10/3.12 that
28
+ carries this marker, and newer versions of pip (>=22.3) enforce it.
29
+
30
+ Workflows that run bare `pip install` or `pip install -r requirements.txt` against
31
+ the system interpreter fail with this error. The issue did not exist on ubuntu-20.04
32
+ (Python 3.8) and began appearing when teams migrated to ubuntu-22.04 or ubuntu-latest
33
+ (which moved to ubuntu-24.04 in May 2025).
34
+
35
+ Even when setup-python is used, if the step that runs pip install activates the wrong
36
+ interpreter (e.g., the system Python instead of the toolcache one), the same error
37
+ occurs. This often happens when shell scripts or Makefiles call `python3` directly.
38
+ fix: |
39
+ Option 1 (preferred): Use a virtual environment so pip installs into an isolated,
40
+ non-system directory that is not subject to the externally-managed restriction.
41
+
42
+ Option 2: Pin setup-python@v5 to your required version; its toolcache interpreter
43
+ is not marked as externally managed and accepts pip installs freely.
44
+
45
+ Option 3 (quick fix, not recommended for production): Pass --break-system-packages.
46
+ fix_code:
47
+ - language: yaml
48
+ label: "Use a virtual environment (recommended)"
49
+ code: |
50
+ - uses: actions/setup-python@v5
51
+ with:
52
+ python-version: '3.12'
53
+
54
+ - name: Create virtualenv and install
55
+ run: |
56
+ python -m venv .venv
57
+ source .venv/bin/activate # Linux/macOS
58
+ # .venv\Scripts\activate # Windows
59
+ pip install -r requirements.txt
60
+
61
+ - name: Run with virtualenv active
62
+ run: |
63
+ source .venv/bin/activate
64
+ pytest
65
+
66
+ - language: yaml
67
+ label: "Use setup-python toolcache interpreter (pip installs without restriction)"
68
+ code: |
69
+ - uses: actions/setup-python@v5
70
+ with:
71
+ python-version: '3.12'
72
+ cache: 'pip'
73
+
74
+ - name: Install dependencies
75
+ run: pip install -r requirements.txt # uses toolcache Python, not system Python
76
+
77
+ - language: yaml
78
+ label: "Quick fix: --break-system-packages (not recommended)"
79
+ code: |
80
+ - name: Install dependencies
81
+ run: pip install --break-system-packages -r requirements.txt
82
+ prevention:
83
+ - "Always activate setup-python before any pip install call to use the toolcache interpreter instead of system Python."
84
+ - "Use virtual environments in CI workflows, especially when migrating from ubuntu-20.04 to 22.04/24.04."
85
+ - "Audit Makefiles and shell scripts that call 'python3' directly — they may bypass setup-python's PATH manipulation."
86
+ - "Run your workflow on ubuntu-22.04 or ubuntu-24.04 in a test branch before migrating from ubuntu-20.04."
87
+ docs:
88
+ - url: "https://peps.python.org/pep-0668/"
89
+ label: "PEP 668 — Marking Python base environments as externally managed"
90
+ - url: "https://github.com/actions/setup-python/issues/1280"
91
+ label: "actions/setup-python#1280 — externally-managed-environment discussion"
92
+ - url: "https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software"
93
+ label: "GitHub Docs — Supported software on GitHub-hosted runners"
94
+ - url: "https://github.com/actions/runner-images/issues/11101"
95
+ label: "runner-images#11101 — Ubuntu 20.04 retirement tracking issue"
@@ -0,0 +1,118 @@
1
+ id: runner-environment-065
2
+ title: "Windows 2019 Runner Retired — Jobs Fail After June 30, 2025"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - windows-2019
7
+ - runner-retirement
8
+ - deprecated
9
+ - windows
10
+ - runner-label
11
+ - brownout
12
+ patterns:
13
+ - regex: "windows-2019.*no longer supported"
14
+ flags: "i"
15
+ - regex: "runs-on.*windows-2019.*deprecated"
16
+ flags: "i"
17
+ - regex: "The windows-2019 runner image is no longer supported"
18
+ flags: "i"
19
+ - regex: "Error.*windows-2019.*not available"
20
+ flags: "i"
21
+ error_messages:
22
+ - "Error: The windows-2019 runner image is no longer supported. Migrate to windows-2022 or windows-2025."
23
+ - "##[error]Job failed: The runner image 'windows-2019' is deprecated and no longer supported."
24
+ - "Windows Server 2019 is no longer supported as a GitHub Actions runner image."
25
+ root_cause: |
26
+ The `windows-2019` runner image was retired by GitHub Actions on June 30, 2025
27
+ (runner-images#12045). Deprecation brownouts began June 1, 2025, during which
28
+ jobs using `windows-2019` would temporarily fail during scheduled brownout
29
+ windows (June 3, 10, 17, 24 — 13:00–21:00 UTC). After June 30, 2025, the
30
+ image was fully unsupported and jobs using `runs-on: windows-2019` fail
31
+ immediately with no runner available.
32
+
33
+ Windows Server 2019 reached End of Mainstream Support from Microsoft on
34
+ January 9, 2024, making it untenable as a CI runner image for security
35
+ and support reasons.
36
+
37
+ Key differences that may require migration work:
38
+ - Windows 2022 and 2025 use Visual Studio 2022 and VS 2026 respectively
39
+ (windows-2019 had Visual Studio 2019). MSBuild project compatibility,
40
+ compiler toolset versions, and SDK paths differ.
41
+ - Some pre-installed tools (e.g., specific .NET Framework versions, MSVC
42
+ compiler toolsets, legacy SDK components) were present on windows-2019
43
+ but not on windows-2022 or windows-2025.
44
+ - Windows Server 2025 images include Windows PowerShell 5.1 and
45
+ PowerShell 7.x; path behaviors for Windows-specific paths may differ.
46
+ fix: |
47
+ Migrate runs-on: windows-2019 to runs-on: windows-2022 or windows-2025:
48
+
49
+ 1. **windows-2022** (recommended for most teams): Includes VS 2022,
50
+ .NET 6/7/8 LTS, and the same tool catalog as windows-2019 minus
51
+ legacy VS 2019 components. Most projects migrate with no changes.
52
+
53
+ 2. **windows-2025** (latest, includes VS 2026): Best for projects
54
+ requiring the latest MSVC toolchain, Windows 11 APIs, or ARM64
55
+ development. Note that windows-latest now points to this image.
56
+
57
+ 3. **Check MSBuild ToolsVersion**: If your project uses MSBuild with
58
+ explicit ToolsVersion="15.0" or "16.0" references, update to
59
+ ToolsVersion="Current" or leave it unspecified to use the
60
+ installed version.
61
+
62
+ 4. **Verify .NET SDK availability**: Confirm the .NET SDK version your
63
+ project needs is available on the target image by checking the
64
+ published software inventory for windows-2022 or windows-2025.
65
+ fix_code:
66
+ - language: yaml
67
+ label: "Migrate from windows-2019 to windows-2022"
68
+ code: |
69
+ jobs:
70
+ build:
71
+ # windows-2019 is RETIRED as of June 30, 2025
72
+ # runs-on: windows-2019 ← no longer supported
73
+ runs-on: windows-2022 # VS 2022, .NET 8 LTS pre-installed
74
+ steps:
75
+ - uses: actions/checkout@v4
76
+ - name: Build
77
+ run: msbuild MyProject.sln /p:Configuration=Release
78
+ - language: yaml
79
+ label: "Migrate to windows-2025 with VS 2026 (latest)"
80
+ code: |
81
+ jobs:
82
+ build:
83
+ runs-on: windows-2025 # Windows Server 2025, VS 2026
84
+ steps:
85
+ - uses: actions/checkout@v4
86
+ - name: Setup .NET
87
+ uses: actions/setup-dotnet@v4
88
+ with:
89
+ dotnet-version: '8.x'
90
+ - name: Build
91
+ run: dotnet build --configuration Release
92
+ - language: yaml
93
+ label: "Matrix to test windows-2022 and windows-2025 before committing"
94
+ code: |
95
+ jobs:
96
+ build:
97
+ strategy:
98
+ matrix:
99
+ os: [windows-2022, windows-2025]
100
+ fail-fast: false
101
+ runs-on: ${{ matrix.os }}
102
+ steps:
103
+ - uses: actions/checkout@v4
104
+ - run: msbuild MyProject.sln
105
+ prevention:
106
+ - "Avoid pinning to specific OS-versioned runner labels (windows-2019, ubuntu-20.04) in long-lived workflows — add a review calendar reminder every 12 months to check for upcoming deprecations."
107
+ - "Subscribe to GitHub notifications for the actions/runner-images repository to receive deprecation announcements months before retirement."
108
+ - "Use `windows-latest` for flexibility where VS version compatibility isn't critical — it automatically tracks the current supported image."
109
+ - "After migrating, run the full test suite and check compiler/toolchain version outputs in CI to catch any implicit behavior differences."
110
+ docs:
111
+ - url: "https://github.com/actions/runner-images/issues/12045"
112
+ label: "runner-images #12045: Windows 2019 deprecation announcement (June 2025)"
113
+ - url: "https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md"
114
+ label: "Windows Server 2022 runner software inventory"
115
+ - url: "https://github.com/actions/runner-images/blob/main/images/windows/Windows2025-Readme.md"
116
+ label: "Windows Server 2025 runner software inventory"
117
+ - url: "https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners"
118
+ label: "GitHub Docs: About GitHub-hosted runners — available images"
@@ -0,0 +1,108 @@
1
+ id: runner-environment-069
2
+ title: "Windows 2022 Runner Docker Engine Named Pipe Not Found on Start"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - windows
7
+ - docker
8
+ - runner-image
9
+ - intermittent
10
+ - named-pipe
11
+ patterns:
12
+ - regex: "failed to connect to the docker API at npipe:////\\.?/pipe/docker_engine"
13
+ flags: "i"
14
+ - regex: "open //\\.?/pipe/docker_engine.*The system cannot find the file specified"
15
+ flags: "i"
16
+ - regex: "error during connect.*pipe/docker_engine.*daemon running"
17
+ flags: "i"
18
+ - regex: "Docker Engine.*Stopped|docker.*service.*not running"
19
+ flags: "i"
20
+ error_messages:
21
+ - "failed to connect to the docker API at npipe:////./pipe/docker_engine; check if the path is correct and if the daemon is running: open //./pipe/docker_engine: The system cannot find the file specified."
22
+ - "error during connect: Get \"http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.45/info\": open //./pipe/docker_engine: The system cannot find the file specified."
23
+ root_cause: |
24
+ On GitHub-hosted `windows-2022` runners, the Docker Engine service occasionally
25
+ fails to start before the workflow job begins. The Docker Engine runs as a Windows
26
+ service (`docker`) and the runner sometimes starts executing job steps before the
27
+ service has fully initialized and opened its named pipe at `//./pipe/docker_engine`.
28
+
29
+ This is an intermittent race condition between the runner agent startup and the
30
+ Docker Engine service startup sequence. The issue was reported in February 2026
31
+ (runner-images#13729) and confirmed to affect `windows-2022` at ~50% frequency
32
+ for some users. The `windows-2025` image is less affected.
33
+
34
+ The Docker Engine service shows `Status: Stopped` when queried immediately after
35
+ the runner starts. Manually starting the service (via `Start-Service docker`)
36
+ resolves the issue for that run. Job reruns also frequently succeed because they
37
+ land on a fresh host with Docker already running.
38
+ fix: |
39
+ Add a step early in your job to verify Docker is running and start it if not:
40
+
41
+ ```yaml
42
+ - name: Ensure Docker Engine is running
43
+ shell: pwsh
44
+ run: |
45
+ $service = Get-Service -Name docker -ErrorAction SilentlyContinue
46
+ if ($service.Status -ne 'Running') {
47
+ Start-Service docker
48
+ $timeout = 60
49
+ $elapsed = 0
50
+ while ((Get-Service docker).Status -ne 'Running' -and $elapsed -lt $timeout) {
51
+ Start-Sleep -Seconds 2
52
+ $elapsed += 2
53
+ }
54
+ }
55
+ docker info
56
+ ```
57
+
58
+ If the issue is sporadic, a simpler retry on job failure may suffice. You can
59
+ also switch to `windows-2025` which has a lower incidence of this race condition.
60
+ fix_code:
61
+ - language: yaml
62
+ label: "Guard step — ensure Docker service is running before use"
63
+ code: |
64
+ jobs:
65
+ build:
66
+ runs-on: windows-2022
67
+ steps:
68
+ - uses: actions/checkout@v4
69
+
70
+ - name: Ensure Docker Engine is running
71
+ shell: pwsh
72
+ run: |
73
+ $svc = Get-Service docker -ErrorAction SilentlyContinue
74
+ if ($null -eq $svc -or $svc.Status -ne 'Running') {
75
+ Write-Host "Docker service not running — starting..."
76
+ Start-Service docker
77
+ $deadline = (Get-Date).AddSeconds(60)
78
+ while ((Get-Service docker).Status -ne 'Running') {
79
+ if ((Get-Date) -gt $deadline) { throw "Docker failed to start in 60s" }
80
+ Start-Sleep -Seconds 2
81
+ }
82
+ Write-Host "Docker service started."
83
+ }
84
+ docker info
85
+
86
+ - name: Build Docker image
87
+ run: docker build -t myimage .
88
+ - language: yaml
89
+ label: "Alternative — switch to windows-2025 (less affected)"
90
+ code: |
91
+ jobs:
92
+ build:
93
+ # windows-2025 has a lower frequency of this race condition
94
+ runs-on: windows-2025
95
+ steps:
96
+ - uses: actions/checkout@v4
97
+ - name: Build Docker image
98
+ run: docker build -t myimage .
99
+ prevention:
100
+ - "Add a Docker health-check step before any `docker` commands on Windows runners."
101
+ - "Consider using `windows-2025` which has fewer reports of this race condition."
102
+ - "Enable job reruns — this race condition is intermittent and reruns usually succeed."
103
+ - "Subscribe to runner-images announcements; GitHub is tracking this as a runner startup issue."
104
+ docs:
105
+ - url: "https://github.com/actions/runner-images/issues/13729"
106
+ label: "GitHub Issue: windows-2022 docker not available when runner starts"
107
+ - url: "https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources"
108
+ label: "About GitHub-hosted runners"
@@ -0,0 +1,96 @@
1
+ id: silent-failures-031
2
+ title: "cache-hit Output Is a String Not a Boolean — Bare true Comparison Always False"
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - actions/cache
7
+ - cache-hit
8
+ - string-comparison
9
+ - boolean-coercion
10
+ - conditional
11
+ - step-outputs
12
+ patterns:
13
+ - regex: "cache-hit\\s*[!=]=\\s*true(?!')"
14
+ flags: "i"
15
+ - regex: "if:\\s+steps\\.\\w+\\.outputs\\.cache-hit\\s*$"
16
+ flags: "im"
17
+ error_messages:
18
+ - "steps.cache.outputs.cache-hit == true"
19
+ - "steps.cache.outputs.cache-hit != true"
20
+ root_cause: |
21
+ The `cache-hit` output from `actions/cache` and `actions/cache/restore` is a **string** value
22
+ (`'true'` or `'false'`), not a native boolean. GitHub Actions expression syntax uses strict
23
+ equality for `==` — there is no implicit type coercion between strings and booleans.
24
+
25
+ This means:
26
+ - `steps.cache.outputs.cache-hit == true` → ALWAYS false (string 'true' ≠ boolean true)
27
+ - `steps.cache.outputs.cache-hit != true` → ALWAYS true (install step always runs)
28
+ - `if: steps.cache.outputs.cache-hit` → ALWAYS true ('false' is a non-empty string)
29
+
30
+ The most destructive case: `if: steps.cache.outputs.cache-hit != true` is intended to
31
+ skip the install step on cache hit, but it always evaluates to `true` (runs every time),
32
+ so the install always runs even after a successful cache restore. Build times remain
33
+ unchanged, no error is shown, and the caching appears to be broken.
34
+
35
+ This applies to ALL GitHub Actions step outputs — they are always strings. A separate
36
+ but related issue is `cache-hit-restore-keys-misleading` (cache-hit is 'true' on partial
37
+ key match); this entry covers the unquoted boolean comparison pattern specifically.
38
+ fix: |
39
+ Always compare `cache-hit` to the string `'true'` with single quotes:
40
+
41
+ - Skip install on cache hit: `if: steps.cache.outputs.cache-hit != 'true'`
42
+ - Confirm cache was used: `if: steps.cache.outputs.cache-hit == 'true'`
43
+
44
+ Do NOT use bare `true` / `false` (without quotes) in comparisons with step outputs.
45
+ Do NOT use `if: steps.cache.outputs.cache-hit` as a truthy check — the string 'false'
46
+ is truthy in most contexts and will always pass.
47
+ fix_code:
48
+ - language: yaml
49
+ label: "Correct string comparison for cache-hit (single quotes required)"
50
+ code: |
51
+ - name: Cache node_modules
52
+ id: cache
53
+ uses: actions/cache@v4
54
+ with:
55
+ path: node_modules
56
+ key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
57
+
58
+ # ❌ WRONG: string 'true' != boolean true → always runs (never skips on cache hit)
59
+ - name: Install (broken — always runs)
60
+ if: steps.cache.outputs.cache-hit != true
61
+ run: npm ci
62
+
63
+ # ✅ CORRECT: compare to string 'true' with single quotes
64
+ - name: Install (correct — skips on cache hit)
65
+ if: steps.cache.outputs.cache-hit != 'true'
66
+ run: npm ci
67
+ - language: yaml
68
+ label: "Full cache-then-install pattern with correct comparisons"
69
+ code: |
70
+ - uses: actions/cache@v4
71
+ id: npm-cache
72
+ with:
73
+ path: ~/.npm
74
+ key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
75
+ restore-keys: |
76
+ ${{ runner.os }}-npm-
77
+
78
+ - name: Install dependencies
79
+ if: steps.npm-cache.outputs.cache-hit != 'true'
80
+ run: npm ci
81
+
82
+ - name: Confirm cache was used
83
+ if: steps.npm-cache.outputs.cache-hit == 'true'
84
+ run: echo "Cache hit — install skipped"
85
+ prevention:
86
+ - "Always compare step outputs to string literals with quotes: `== 'true'` not `== true`."
87
+ - "Remember: ALL GitHub Actions step outputs are strings — never native booleans or numbers."
88
+ - "Use `actionlint` to lint workflow YAML; it detects boolean vs string type mismatches in conditionals."
89
+ - "Verify caching is working by observing run time reduction — a successful cache hit noticeably speeds up installs."
90
+ docs:
91
+ - url: "https://github.com/actions/cache#outputs"
92
+ label: "actions/cache README: outputs — cache-hit is a string"
93
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/contexts#steps-context"
94
+ label: "GitHub Docs: steps context — all outputs are strings"
95
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/evaluate-expressions-in-workflows-and-actions#operators"
96
+ label: "GitHub Docs: Expression operators — == uses strict equality"
@@ -0,0 +1,105 @@
1
+ id: silent-failures-033
2
+ title: "actions/checkout lfs: true Leaves LFS Pointer Metadata Instead of Actual File Content"
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - checkout
7
+ - git-lfs
8
+ - lfs
9
+ - pointer-file
10
+ - large-file-storage
11
+ - self-hosted
12
+ patterns:
13
+ - regex: "version https://git-lfs\\.github\\.com/spec/v1"
14
+ flags: "i"
15
+ - regex: "oid\\s+sha256:[0-9a-f]{64}"
16
+ flags: "i"
17
+ - regex: "lfs:\\s*true"
18
+ flags: "i"
19
+ error_messages:
20
+ - "version https://git-lfs.github.com/spec/v1"
21
+ - "oid sha256:f23e4c2b1244bc93085dbccf17c447e54..."
22
+ - "size 58951008"
23
+ root_cause: |
24
+ When actions/checkout runs with lfs: true, it configures LFS credentials and
25
+ attempts to download actual file content for LFS-tracked files. However, the
26
+ step can exit 0 (success) while leaving LFS pointer metadata files on disk
27
+ instead of the actual binary or text content.
28
+
29
+ This happens silently in several situations:
30
+
31
+ - Self-hosted runners without git-lfs installed: the LFS fetch is skipped
32
+ because the binary is not present. No error is emitted.
33
+ - LFS bandwidth quota exhausted: GitHub's LFS bandwidth limit (1 GB/month
34
+ free tier) is silently hit; pointer files remain without a clear warning.
35
+ - Private cross-repo LFS: checking out a different repository with lfs: true
36
+ using a token may fail LFS authentication without surfacing an error.
37
+ - Fork pull requests: LFS objects contributed from fork branches may not be
38
+ accessible to the base repository workflow.
39
+
40
+ The result: downstream tools receive a text file starting with
41
+ "version https://git-lfs.github.com/spec/v1" instead of actual content,
42
+ causing opaque failures in build tools, image processors, or test suites.
43
+ fix: |
44
+ Add an explicit LFS fetch step after checkout. On GitHub-hosted runners,
45
+ lfs: true is generally sufficient if LFS is configured on the repository.
46
+ For self-hosted runners, ensure git-lfs is installed before the checkout
47
+ step runs:
48
+ - Ubuntu/Debian: sudo apt-get install git-lfs
49
+ - macOS: brew install git-lfs
50
+ - Windows: winget install GitHub.GitLFS
51
+
52
+ After installation, run the LFS initialization command (git lfs install)
53
+ once per runner to configure the global LFS hooks.
54
+
55
+ To detect unfetched pointer files, add a validation step that checks for
56
+ the LFS pointer header string in files that should contain real content.
57
+ fix_code:
58
+ - language: yaml
59
+ label: "Self-hosted runner — install git-lfs before checkout"
60
+ code: |
61
+ steps:
62
+ - name: Ensure git-lfs is installed
63
+ run: |
64
+ sudo apt-get update -qq
65
+ sudo apt-get install -y git-lfs
66
+ shell: bash
67
+
68
+ - uses: actions/checkout@v4
69
+ with:
70
+ lfs: true
71
+
72
+ - name: Verify LFS content downloaded
73
+ run: |
74
+ if grep -rl "version https://git-lfs.github.com/spec/v1" . \
75
+ --include="*.bin" --include="*.png" --include="*.zip" 2>/dev/null | head -1 | grep -q .; then
76
+ echo "ERROR: LFS pointer files found — actual content was not downloaded"
77
+ exit 1
78
+ fi
79
+ echo "LFS check passed — no pointer files found"
80
+ shell: bash
81
+
82
+ - language: yaml
83
+ label: "GitHub-hosted runner — explicit lfs: true with verification"
84
+ code: |
85
+ steps:
86
+ - uses: actions/checkout@v4
87
+ with:
88
+ lfs: true
89
+ # lfs: true is usually sufficient on GitHub-hosted runners
90
+ # if LFS quota is not exhausted
91
+ prevention:
92
+ - "Verify git-lfs is installed on all self-hosted runners before running checkout workflows."
93
+ - "Monitor GitHub LFS bandwidth usage in repository Settings > Billing to avoid silent quota exhaustion."
94
+ - "Add a post-checkout verification step that confirms LFS-tracked files contain real content, not pointer metadata."
95
+ - "For fork PRs from external contributors, be aware that LFS objects may not be accessible — consider disabling LFS-dependent tests for fork builds."
96
+ - "Use GitHub-hosted runners for LFS-heavy workflows to avoid manual git-lfs installation and configuration."
97
+ docs:
98
+ - url: "https://stackoverflow.com/questions/61463578/github-actions-actions-checkoutv2-lfs-true-flag-not-converting-pointers-to-actual-files"
99
+ label: "Stack Overflow: actions/checkout lfs:true not converting pointers to actual files (Score: 48, 21K views)"
100
+ - url: "https://github.com/actions/checkout#usage"
101
+ label: "actions/checkout: lfs input documentation"
102
+ - url: "https://docs.github.com/en/repositories/working-with-files/managing-large-files/about-git-large-file-storage"
103
+ label: "GitHub Docs: About Git Large File Storage"
104
+ - url: "https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-git-large-file-storage/about-billing-for-git-large-file-storage"
105
+ label: "GitHub Docs: About billing for Git LFS"