@htekdev/actions-debugger 1.0.8 → 1.0.9

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.
@@ -0,0 +1,145 @@
1
+ id: caching-artifacts-012
2
+ title: "upload-artifact v4 Rejects Duplicate Artifact Names from Multiple Jobs (409 Conflict)"
3
+ category: caching-artifacts
4
+ severity: error
5
+ tags:
6
+ - upload-artifact
7
+ - artifact-v4
8
+ - matrix
9
+ - parallel-jobs
10
+ - 409
11
+ - immutability
12
+ patterns:
13
+ - regex: "Failed to CreateArtifact.*409.*Conflict.*artifact.*already exists"
14
+ flags: "i"
15
+ - regex: "artifact.*already exists.*workflow run|duplicate.*artifact.*name"
16
+ flags: "i"
17
+ - regex: "Received non-retryable error.*409.*Conflict"
18
+ flags: "i"
19
+ error_messages:
20
+ - "Failed to CreateArtifact: Received non-retryable error: Failed request: (409) Conflict: an artifact with this name already exists on the workflow run"
21
+ - "Error: ENOENT: no such file or directory — artifact upload failed with conflict"
22
+ - "Upload failed: 409 Conflict — Artifact 'build-output' already exists"
23
+ root_cause: |
24
+ **actions/upload-artifact v4** (backed by the v2 `@actions/artifact` client) makes
25
+ artifacts **immutable and job-scoped by default**. Once an artifact name is uploaded
26
+ by any job in a workflow run, that name is locked — a second job attempting to upload
27
+ an artifact with the same name will receive a `409 Conflict` error from the Artifact
28
+ API and the upload fails.
29
+
30
+ This is a **breaking behavior change from v3**, which allowed multiple jobs to
31
+ append to the same artifact name. v4 deliberately prevents this to ensure artifact
32
+ content integrity and predictable downloads.
33
+
34
+ **Common scenarios that trigger this:**
35
+
36
+ 1. **Matrix jobs** — all matrix jobs use the same artifact name (e.g., `build-output`)
37
+ and upload in parallel; only the first to complete succeeds.
38
+
39
+ 2. **Retry logic** — a job is retried (manually or via `retry-on-failure`) and the
40
+ original run already uploaded the artifact under the same name.
41
+
42
+ 3. **Split test/build jobs** — multiple parallel jobs each generate and upload an
43
+ artifact with a shared generic name (e.g., `test-results`).
44
+
45
+ 4. **Copy-pasted workflows** — two separate jobs have identical `upload-artifact`
46
+ steps with the same name.
47
+
48
+ The artifact immutability change was introduced to enable the new artifact download
49
+ model where artifacts are uniquely addressable and not corrupted by multiple writers.
50
+ fix: |
51
+ **Use unique artifact names per job.** The standard pattern is to embed job/matrix
52
+ context in the artifact name so each upload is distinct.
53
+
54
+ For matrix jobs, include the matrix value in the name. For parallel jobs, include
55
+ the job name. The v4 `download-artifact` action supports wildcard patterns, so all
56
+ job-scoped artifacts can be downloaded together in a merge step.
57
+ fix_code:
58
+ - language: yaml
59
+ label: "Matrix jobs — include matrix value in artifact name"
60
+ code: |
61
+ jobs:
62
+ build:
63
+ strategy:
64
+ matrix:
65
+ os: [ubuntu-latest, windows-latest, macos-latest]
66
+ runs-on: ${{ matrix.os }}
67
+ steps:
68
+ - uses: actions/checkout@v4
69
+
70
+ - name: Build
71
+ run: make build
72
+
73
+ # ❌ Causes 409: all matrix jobs use same name
74
+ # - uses: actions/upload-artifact@v4
75
+ # with:
76
+ # name: build-output
77
+ # path: dist/
78
+
79
+ # ✅ Unique name per matrix dimension
80
+ - uses: actions/upload-artifact@v4
81
+ with:
82
+ name: build-output-${{ matrix.os }}
83
+ path: dist/
84
+
85
+ package:
86
+ needs: build
87
+ runs-on: ubuntu-latest
88
+ steps:
89
+ # ✅ Download all matrix artifacts with wildcard
90
+ - uses: actions/download-artifact@v4
91
+ with:
92
+ pattern: build-output-*
93
+ merge-multiple: true
94
+ path: dist/
95
+ - language: yaml
96
+ label: "Parallel jobs — unique names with merge step"
97
+ code: |
98
+ jobs:
99
+ test-unit:
100
+ runs-on: ubuntu-latest
101
+ steps:
102
+ - uses: actions/checkout@v4
103
+ - run: npm test -- --reporter=junit --output-file=test-results.xml
104
+ - uses: actions/upload-artifact@v4
105
+ with:
106
+ name: test-results-unit # unique name
107
+ path: test-results.xml
108
+
109
+ test-integration:
110
+ runs-on: ubuntu-latest
111
+ steps:
112
+ - uses: actions/checkout@v4
113
+ - run: npm run test:integration -- --output-file=test-results.xml
114
+ - uses: actions/upload-artifact@v4
115
+ with:
116
+ name: test-results-integration # unique name
117
+ path: test-results.xml
118
+
119
+ report:
120
+ needs: [test-unit, test-integration]
121
+ runs-on: ubuntu-latest
122
+ steps:
123
+ - uses: actions/download-artifact@v4
124
+ with:
125
+ pattern: test-results-*
126
+ merge-multiple: true
127
+ path: all-results/
128
+ prevention:
129
+ - "Always include a unique identifier in artifact names when multiple jobs upload
130
+ artifacts — use `${{ matrix.* }}`, `${{ github.job }}`, or a descriptive suffix."
131
+ - "Treat artifact names like immutable keys: once uploaded in a run, they cannot be
132
+ overwritten; design names accordingly."
133
+ - "Use `download-artifact@v4` with `pattern:` and `merge-multiple: true` to collect
134
+ artifacts from multiple jobs into a single directory in a downstream job."
135
+ - "If your workflow retries jobs automatically, include the attempt number
136
+ (`${{ github.run_attempt }}`) in the artifact name to avoid conflicts on retry."
137
+ docs:
138
+ - url: "https://github.com/actions/upload-artifact/issues/478"
139
+ label: "actions/upload-artifact#478 — 409 Conflict: artifact with this name already exists"
140
+ - url: "https://github.com/actions/upload-artifact/blob/main/RELEASES.md"
141
+ label: "upload-artifact v4 release notes — immutability change"
142
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/storing-and-sharing-data-from-a-workflow"
143
+ label: "GitHub Docs: Storing and sharing data from a workflow"
144
+ - url: "https://github.com/actions/download-artifact?tab=readme-ov-file#download-multiple-artifacts"
145
+ label: "download-artifact: Downloading multiple artifacts with patterns"
@@ -0,0 +1,165 @@
1
+ id: concurrency-timing-009
2
+ title: "Concurrency Group Name Collision Cancels Unrelated Workflows"
3
+ category: concurrency-timing
4
+ severity: silent-failure
5
+ tags:
6
+ - concurrency
7
+ - concurrency-group
8
+ - cancel-in-progress
9
+ - workflow-cancellation
10
+ - naming
11
+ - cross-workflow
12
+ patterns:
13
+ - regex: "concurrency.*group.*cancelled|run.*cancelled.*concurrency"
14
+ flags: "i"
15
+ - regex: "previous run.*same concurrency group.*cancelled"
16
+ flags: "i"
17
+ - regex: "workflow run.*cancelled.*due to.*concurrency"
18
+ flags: "i"
19
+ error_messages:
20
+ - "This workflow run was cancelled because a more recent run with the same concurrency group is in progress."
21
+ - "Workflow cancelled: superseded by a newer run in the same concurrency group."
22
+ - "Run #XXXX was cancelled because run #YYYY (same concurrency group 'deploy') is queued."
23
+ root_cause: |
24
+ GitHub Actions concurrency groups operate **across all workflows** that share the
25
+ same group name string in the same repository. If two different workflows (or two
26
+ jobs in different workflows) declare the same `concurrency.group` name, they compete
27
+ for the same queue — leading to unintended cancellations between completely unrelated
28
+ workflows.
29
+
30
+ **Example of the collision pattern:**
31
+ ```yaml
32
+ # workflow-a.yml — CI pipeline
33
+ concurrency:
34
+ group: deploy
35
+ cancel-in-progress: true
36
+
37
+ # workflow-b.yml — Release pipeline (independent)
38
+ concurrency:
39
+ group: deploy # ← same name! collides with workflow-a
40
+ cancel-in-progress: true
41
+ ```
42
+
43
+ In this example, triggering `workflow-b` cancels any in-progress run of `workflow-a`
44
+ and vice versa, even though they are completely independent processes.
45
+
46
+ **Common sources of collisions:**
47
+ - Copy-pasting a workflow file and forgetting to rename the concurrency group
48
+ - Using generic names like `deploy`, `build`, `ci`, `test`
49
+ - Multiple reusable workflows called from different callers with the same
50
+ `concurrency.group` in the caller
51
+ - Organization-wide template workflows with hardcoded group names
52
+
53
+ **Why this is a silent failure:** The cancellation log message appears in the
54
+ cancelled workflow run, but developers may not notice or may attribute the cancellation
55
+ to an unrelated cause. The triggering workflow (the one that caused the cancellation)
56
+ shows no indication it cancelled another workflow.
57
+
58
+ **Note:** Starting May 2026, GitHub Actions added support for **larger concurrency
59
+ queues** (`queue: max` option), allowing more pending runs instead of cancelling them.
60
+ This reduces pain but does not eliminate collisions caused by shared group names.
61
+ fix: |
62
+ Make concurrency group names unique and descriptive by including the workflow name,
63
+ branch/ref, and optionally the event type. Never use generic single-word names
64
+ like `deploy`, `ci`, or `build` as the sole concurrency group name.
65
+
66
+ A safe pattern is: `${{ github.workflow }}-${{ github.ref }}`
67
+ This scopes the group to the specific workflow and branch combination, preventing
68
+ cross-workflow and cross-branch collisions.
69
+ fix_code:
70
+ - language: yaml
71
+ label: "Use workflow + ref in concurrency group name"
72
+ code: |
73
+ # ✅ Safe pattern: workflow name + branch prevents cross-workflow collisions
74
+ name: Deploy Production
75
+
76
+ on:
77
+ push:
78
+ branches: [main]
79
+
80
+ concurrency:
81
+ # Unique per workflow + branch combination
82
+ group: ${{ github.workflow }}-${{ github.ref }}
83
+ cancel-in-progress: true
84
+
85
+ jobs:
86
+ deploy:
87
+ runs-on: ubuntu-latest
88
+ steps:
89
+ - uses: actions/checkout@v4
90
+ - run: ./deploy.sh
91
+ - language: yaml
92
+ label: "Per-PR concurrency — cancel superseded PR runs only"
93
+ code: |
94
+ # ✅ Scope to PR number — only cancels stale runs of the same PR
95
+ name: CI
96
+
97
+ on:
98
+ pull_request:
99
+
100
+ concurrency:
101
+ group: ${{ github.workflow }}-pr-${{ github.event.pull_request.number }}
102
+ cancel-in-progress: true
103
+
104
+ jobs:
105
+ test:
106
+ runs-on: ubuntu-latest
107
+ steps:
108
+ - uses: actions/checkout@v4
109
+ - run: npm test
110
+ - language: yaml
111
+ label: "Job-level concurrency — scope to specific job, not whole workflow"
112
+ code: |
113
+ name: CI + Deploy
114
+
115
+ on:
116
+ push:
117
+ branches: [main]
118
+
119
+ jobs:
120
+ test:
121
+ runs-on: ubuntu-latest
122
+ # No concurrency on test job — let tests always run
123
+ steps:
124
+ - uses: actions/checkout@v4
125
+ - run: npm test
126
+
127
+ deploy:
128
+ needs: test
129
+ runs-on: ubuntu-latest
130
+ # Concurrency only on deploy, scoped to this specific workflow + job
131
+ concurrency:
132
+ group: ${{ github.workflow }}-deploy-${{ github.ref }}
133
+ cancel-in-progress: false # queue deploys, don't cancel them
134
+ steps:
135
+ - uses: actions/checkout@v4
136
+ - run: ./deploy.sh
137
+ - language: yaml
138
+ label: "Larger queue option (May 2026+) — allow pending runs instead of cancelling"
139
+ code: |
140
+ # ✅ Use larger queues to queue runs instead of cancelling
141
+ # Requires GitHub Actions concurrency queue support (May 2026+)
142
+ concurrency:
143
+ group: ${{ github.workflow }}-${{ github.ref }}
144
+ cancel-in-progress: false # do not cancel; queue instead
145
+ # queue: max # allow maximum pending runs (if supported)
146
+ prevention:
147
+ - "Always include `${{ github.workflow }}` in the concurrency group name to prevent
148
+ cross-workflow collisions — bare names like `deploy` or `build` are collision-prone."
149
+ - "Include the ref (`${{ github.ref }}`) in group names so parallel PRs/branches
150
+ don't cancel each other's runs."
151
+ - "Audit all workflow files for concurrency group names when onboarding new workflows
152
+ into a repository — duplicates cause mysterious cancellations that are hard to trace."
153
+ - "Use job-level concurrency (not workflow-level) when only certain jobs (e.g., deploy)
154
+ need serialization — keep CI/test jobs unrestricted."
155
+ - "Document the concurrency group naming convention in your repository's CONTRIBUTING
156
+ or workflow guidelines so future contributors follow the same pattern."
157
+ docs:
158
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/control-the-concurrency-of-workflows-and-jobs"
159
+ label: "GitHub Docs: Control the concurrency of workflows and jobs"
160
+ - url: "https://github.blog/changelog/2026-05-07-github-actions-concurrency-groups-now-allow-larger-queues"
161
+ label: "GitHub Changelog: Concurrency groups now allow larger queues (May 2026)"
162
+ - url: "https://oneuptime.com/blog/post/2026-01-25-github-actions-concurrency-control/view"
163
+ label: "GitHub Actions Concurrency Control — best practices blog post"
164
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/control-the-concurrency-of-workflows-and-jobs#example-using-concurrency-to-cancel-any-in-progress-job-or-run"
165
+ label: "GitHub Docs: Concurrency examples — cancel in-progress"
@@ -0,0 +1,120 @@
1
+ id: known-unsolved-010
2
+ title: "upload-artifact v4 and download-artifact v4 Not Supported on GitHub Enterprise Server"
3
+ category: known-unsolved
4
+ severity: error
5
+ tags:
6
+ - upload-artifact
7
+ - download-artifact
8
+ - artifact-v4
9
+ - ghes
10
+ - github-enterprise-server
11
+ - compatibility
12
+ - enterprise
13
+ patterns:
14
+ - regex: "@actions/artifact v2\\.0\\.0.*not.*supported.*GHES|upload-artifact@v4.*not.*supported.*GHES"
15
+ flags: "i"
16
+ - regex: "download-artifact@v4.*not currently supported on GHES"
17
+ flags: "i"
18
+ - regex: "requires.*newer.*version.*GHES|GHES.*does not support.*artifact.*v[234]"
19
+ flags: "i"
20
+ error_messages:
21
+ - "Error: @actions/artifact v2.0.0+, upload-artifact@v4+ and download-artifact@v4+ are not currently supported on GHES"
22
+ - "Error: upload-artifact@v4 is not supported on your current GHES version. Use v3 instead."
23
+ - "Failed to create artifact: The artifact service is not available on this instance"
24
+ root_cause: |
25
+ **actions/upload-artifact v4** and **actions/download-artifact v4** depend on a
26
+ new Artifact API (`@actions/artifact` v2+) that uses the Blob service and updated
27
+ artifact storage endpoints introduced in GitHub.com in late 2023. This API is
28
+ **not available on GitHub Enterprise Server (GHES)** instances running versions
29
+ prior to the minimum supported release for the new artifact service.
30
+
31
+ As of mid-2026, artifact v4 support on GHES has a version gate. GHES instances
32
+ that have not been upgraded to the minimum supported version will fail immediately
33
+ when any workflow step uses `upload-artifact@v4` or `download-artifact@v4`, with
34
+ a clear error message indicating the feature is unsupported.
35
+
36
+ **Key facts:**
37
+ - `upload-artifact@v3` and `download-artifact@v3` continue to work on all GHES versions
38
+ - There is no workaround that makes v4 work on unsupported GHES versions
39
+ - Self-hosted runners connected to GHES are subject to the same restriction as
40
+ GitHub-hosted runners on that instance
41
+ - The error is immediate (not a race condition or transient issue) — the artifact
42
+ service API rejects the request at connection time
43
+
44
+ **Impact:** Teams that copy workflows from GitHub.com repositories or follow
45
+ documentation written for GitHub.com find their enterprise CI broken after upgrading
46
+ actions to v4. The fix is to pin back to v3 on GHES or upgrade the GHES instance.
47
+ fix: |
48
+ **Option 1 (recommended for most teams):** Pin `upload-artifact` and
49
+ `download-artifact` to `@v3` on your GHES-connected workflows until your GHES
50
+ instance is upgraded to a version that supports the new artifact service.
51
+
52
+ **Option 2:** Upgrade your GHES instance to the minimum version that supports
53
+ artifact v4. Consult the GHES release notes to find the minimum supported version.
54
+
55
+ **Option 3:** Use conditional version selection based on the `github.server_url`
56
+ context to use v4 on GitHub.com and v3 on GHES.
57
+ fix_code:
58
+ - language: yaml
59
+ label: "Pin to v3 on GHES instances"
60
+ code: |
61
+ jobs:
62
+ build:
63
+ runs-on: self-hosted
64
+ steps:
65
+ - uses: actions/checkout@v4
66
+
67
+ - name: Build
68
+ run: make build
69
+
70
+ # ✅ Use v3 on GHES until your instance supports v4
71
+ - uses: actions/upload-artifact@v3
72
+ with:
73
+ name: build-output
74
+ path: dist/
75
+ retention-days: 7
76
+
77
+ deploy:
78
+ needs: build
79
+ runs-on: self-hosted
80
+ steps:
81
+ # ✅ Match the upload version for download
82
+ - uses: actions/download-artifact@v3
83
+ with:
84
+ name: build-output
85
+ path: dist/
86
+ - language: yaml
87
+ label: "Conditional version — v4 on GitHub.com, v3 on GHES"
88
+ code: |
89
+ jobs:
90
+ build:
91
+ runs-on: ${{ github.server_url == 'https://github.com' && 'ubuntu-latest' || 'self-hosted' }}
92
+ steps:
93
+ - uses: actions/checkout@v4
94
+
95
+ - name: Build
96
+ run: make build
97
+
98
+ # GitHub.com: use v4; GHES: use v3
99
+ - uses: ${{ github.server_url == 'https://github.com' && 'actions/upload-artifact@v4' || 'actions/upload-artifact@v3' }}
100
+ with:
101
+ name: build-output
102
+ path: dist/
103
+ prevention:
104
+ - "Before upgrading to upload-artifact@v4 in a repository, verify whether the
105
+ repository is hosted on GitHub.com or a GHES instance."
106
+ - "For multi-environment repositories (same workflow runs on both GitHub.com and GHES),
107
+ use conditional `uses:` expressions or maintain separate workflow files per environment."
108
+ - "Monitor GHES release notes for artifact v4 support announcements before upgrading
109
+ enterprise workflows."
110
+ - "Pin action versions explicitly in GHES-hosted workflows — avoid floating `@latest`
111
+ tags that may resolve to v4 on GHES before the instance supports it."
112
+ docs:
113
+ - url: "https://stackoverflow.com/questions/79267706/error-actions-artifact-v2-0-0-upload-artifactv4-and-download-artifactv4"
114
+ label: "Stack Overflow: upload-artifact@v4 and download-artifact@v4 not supported on GHES"
115
+ - url: "https://github.com/actions/upload-artifact/blob/main/RELEASES.md"
116
+ label: "upload-artifact v4 release notes — GHES compatibility notes"
117
+ - url: "https://docs.github.com/en/enterprise-server@latest/admin/release-notes"
118
+ label: "GitHub Enterprise Server release notes"
119
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/storing-and-sharing-data-from-a-workflow"
120
+ label: "GitHub Docs: Storing and sharing data from a workflow"
@@ -0,0 +1,121 @@
1
+ id: silent-failures-012
2
+ title: "upload-artifact v4.4.0 Silently Excludes Hidden Files and Directories"
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - upload-artifact
7
+ - artifact-v4
8
+ - hidden-files
9
+ - dotfiles
10
+ - path-patterns
11
+ - silent
12
+ patterns:
13
+ - regex: "upload.*artifact.*no files.*found|artifact.*upload.*0.*bytes"
14
+ flags: "i"
15
+ - regex: "Artifact.*successfully uploaded.*0 files|uploaded 0 item"
16
+ flags: "i"
17
+ - regex: "include-hidden-files"
18
+ flags: "i"
19
+ error_messages:
20
+ - "Warning: No files were found with the provided path: .env.dist"
21
+ - "Artifact upload: 0 items, 0 bytes"
22
+ - "With the provided path, there will be 0 files uploaded"
23
+ - "Uploaded artifact 'dotfiles' (0 bytes)"
24
+ root_cause: |
25
+ Starting with **actions/upload-artifact v4.4.0** (released February 2026), the action
26
+ excludes files and directories whose names begin with `.` (dot/hidden files) **by
27
+ default**. This is a **silent behavior change** — the upload action still reports
28
+ "success" but skips all dotfiles, resulting in an artifact that is missing expected
29
+ content without any error or warning in most cases.
30
+
31
+ **Files and directories affected:**
32
+ - `.env`, `.env.dist`, `.env.example`, `.env.test`
33
+ - `.gitignore`, `.gitattributes`, `.eslintrc`, `.prettierrc`
34
+ - `.docker/`, `.github/`, `.cache/`, `.npm/`
35
+ - Any file or directory with a name starting with `.`
36
+
37
+ **Why this is a silent failure:** The action reports "Artifact uploaded successfully"
38
+ even when all matched files happen to be hidden files and thus are excluded. In cases
39
+ where the path glob matches only hidden files, the artifact is created with 0 bytes
40
+ and no error is thrown. Downstream jobs that download and use the artifact will
41
+ receive an empty directory or encounter missing file errors, far from the upload step.
42
+
43
+ **Historical context:** This change was introduced for security consistency —
44
+ dotfiles often contain secrets (`.env`), credentials, or sensitive configuration that
45
+ developers might accidentally expose through artifacts. The default exclusion prevents
46
+ accidental secret leakage via artifacts.
47
+ fix: |
48
+ Set `include-hidden-files: true` on the `upload-artifact` step to restore the
49
+ previous behavior and include dotfiles in the artifact.
50
+
51
+ **Security note:** Before enabling `include-hidden-files: true`, review whether
52
+ the files being uploaded contain secrets. Consider using GitHub secrets or environment
53
+ variables for sensitive values rather than uploading `.env` files as artifacts.
54
+
55
+ Alternatively, rename configuration files to not start with `.` if they don't
56
+ contain sensitive values (e.g., `env.example` instead of `.env.example`).
57
+ fix_code:
58
+ - language: yaml
59
+ label: "Enable hidden file inclusion with include-hidden-files"
60
+ code: |
61
+ jobs:
62
+ build:
63
+ runs-on: ubuntu-latest
64
+ steps:
65
+ - uses: actions/checkout@v4
66
+
67
+ - name: Build
68
+ run: make build
69
+
70
+ # ❌ v4.4.0+: .env.dist, .config/, etc. are silently excluded
71
+ # - uses: actions/upload-artifact@v4
72
+ # with:
73
+ # name: build-output
74
+ # path: dist/
75
+
76
+ # ✅ Explicitly include hidden files when needed
77
+ - uses: actions/upload-artifact@v4
78
+ with:
79
+ name: build-output
80
+ path: dist/
81
+ include-hidden-files: true # restores pre-v4.4.0 behavior
82
+ - language: yaml
83
+ label: "Targeted upload — avoid hidden files where possible"
84
+ code: |
85
+ jobs:
86
+ build:
87
+ runs-on: ubuntu-latest
88
+ steps:
89
+ - uses: actions/checkout@v4
90
+
91
+ - name: Build
92
+ run: make build
93
+
94
+ # ✅ Better: upload specific file types, not entire directories
95
+ # This avoids accidentally including or excluding hidden files
96
+ - uses: actions/upload-artifact@v4
97
+ with:
98
+ name: build-artifacts
99
+ path: |
100
+ dist/**/*.js
101
+ dist/**/*.css
102
+ dist/**/*.html
103
+ env.example # renamed from .env.example to avoid hiding
104
+ prevention:
105
+ - "Audit workflows that upload artifacts containing dotfiles (`.env.*`, `.config`,
106
+ `.cache/`) — add `include-hidden-files: true` explicitly if those files are needed."
107
+ - "Check artifact sizes after upgrading to v4.4.0+: a 0-byte or unexpectedly small
108
+ artifact often indicates hidden files were silently excluded."
109
+ - "For environment template files that should be shared as artifacts, rename them
110
+ to not start with `.` (e.g., `env.template` instead of `.env.template`)."
111
+ - "Never upload actual `.env` files with real secrets as artifacts — use GitHub
112
+ secrets or OIDC-based secret retrieval instead."
113
+ docs:
114
+ - url: "https://stackoverflow.com/questions/78941839/github-actions-upload-artifactv4-4-0-path-patterns-not-working-after-upgrade"
115
+ label: "Stack Overflow: upload-artifact v4.4.0 path patterns not working (hidden files)"
116
+ - url: "https://github.blog/changelog/2026-02-26-github-actions-now-supports-uploading-and-downloading-non-zipped-artifacts"
117
+ label: "GitHub Changelog: artifact upload/download improvements (Feb 2026)"
118
+ - url: "https://github.com/actions/upload-artifact/blob/main/RELEASES.md"
119
+ label: "upload-artifact v4 release notes"
120
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/storing-and-sharing-data-from-a-workflow"
121
+ label: "GitHub Docs: Storing and sharing data from a workflow"
@@ -0,0 +1,127 @@
1
+ id: yaml-syntax-016
2
+ title: "vars Context Rejected Inside Composite Action Expressions"
3
+ category: yaml-syntax
4
+ severity: error
5
+ tags:
6
+ - composite-actions
7
+ - vars-context
8
+ - expression
9
+ - runner-validation
10
+ - organization-variables
11
+ - repository-variables
12
+ patterns:
13
+ - regex: "Unrecognized named-value.*'?vars'?"
14
+ flags: "i"
15
+ - regex: "Unexpected value.*vars\\.\\w+"
16
+ flags: "i"
17
+ - regex: "inputs\\.\\w+.*\\|\\|.*vars\\.\\w+.*not.*recognized"
18
+ flags: "i"
19
+ error_messages:
20
+ - "Unrecognized named-value: 'vars'. Located at position X within expression: inputs.region || vars.AWS_REGION || 'us-east-1'"
21
+ - "Error: Unrecognized named-value: 'vars'"
22
+ - "Invalid workflow file: .github/actions/my-action/action.yml (Line N, Col M): Unrecognized named-value: 'vars'"
23
+ root_cause: |
24
+ The `vars` context (organization/repository/environment variables) is **not available
25
+ inside composite action definitions** (`action.yml`). Runner validation enforces
26
+ context availability rules per the element type, and composite actions are not
27
+ permitted to reference `vars.*` in their step expressions.
28
+
29
+ This was not always enforced — older runner versions allowed some cross-context
30
+ references in composite actions, but a runner validation tightening (tracked in
31
+ actions/runner#4311) made this a hard error. Workflows that worked before started
32
+ failing after runner updates were rolled out to GitHub-hosted and self-hosted runners.
33
+
34
+ **Why the restriction exists:** Composite actions are designed to be reusable across
35
+ repositories and organizations. The `vars` context is scoped to the calling repository
36
+ or organization — a composite action cannot safely resolve `vars.*` at definition time
37
+ because it would create an implicit dependency on the caller's variable set without
38
+ explicit declaration as an `input`.
39
+
40
+ **Affected expression positions:**
41
+ - `with:` value fields in composite action steps
42
+ - `run:` shell commands using `${{ vars.* }}` syntax
43
+ - `if:` conditions on composite action steps
44
+ - Default values for composite action inputs that fall back to `vars.*`
45
+ fix: |
46
+ Remove `vars.*` references from composite action definitions. Instead, require
47
+ callers to pass variables explicitly as action `inputs`, and reference those inputs
48
+ inside the composite action.
49
+
50
+ **Pattern:**
51
+ 1. Add an explicit `input` to the composite action for any value currently read from
52
+ `vars.*`
53
+ 2. Give it a meaningful name and a default value (empty string or a sensible default)
54
+ 3. In the calling workflow, pass the variable value as `with: my-input: ${{ vars.MY_VAR }}`
55
+ 4. Inside the composite action, replace `${{ vars.MY_VAR }}` with `${{ inputs.my-input }}`
56
+ fix_code:
57
+ - language: yaml
58
+ label: "action.yml — Replace vars.* with an explicit input"
59
+ code: |
60
+ # ❌ BROKEN: vars context not available in composite actions
61
+ # action.yml
62
+ inputs:
63
+ region:
64
+ description: "AWS region"
65
+ required: false
66
+ default: "" # cannot use: ${{ vars.AWS_REGION }}
67
+
68
+ runs:
69
+ using: composite
70
+ steps:
71
+ - name: Deploy
72
+ shell: bash
73
+ run: |
74
+ # ❌ This will fail:
75
+ # REGION="${{ inputs.region || vars.AWS_REGION || 'us-east-1' }}"
76
+
77
+ # ✅ Use only inputs:
78
+ REGION="${{ inputs.region || 'us-east-1' }}"
79
+ echo "Deploying to $REGION"
80
+ - language: yaml
81
+ label: "caller workflow — Pass vars.* as an explicit input"
82
+ code: |
83
+ # ✅ Calling workflow passes vars.* to the composite action explicitly
84
+ jobs:
85
+ deploy:
86
+ runs-on: ubuntu-latest
87
+ steps:
88
+ - uses: ./.github/actions/deploy
89
+ with:
90
+ region: ${{ vars.AWS_REGION }} # resolved in caller, not inside composite
91
+ - language: yaml
92
+ label: "action.yml — Full corrected composite action"
93
+ code: |
94
+ # ✅ CORRECT: composite action with explicit input, no vars.* reference
95
+ name: Deploy to AWS
96
+ description: Deploy application to AWS
97
+
98
+ inputs:
99
+ region:
100
+ description: "AWS region (pass vars.AWS_REGION from caller)"
101
+ required: false
102
+ default: "us-east-1"
103
+
104
+ runs:
105
+ using: composite
106
+ steps:
107
+ - name: Deploy
108
+ shell: bash
109
+ run: echo "Deploying to ${{ inputs.region }}"
110
+ prevention:
111
+ - "Never reference `vars.*`, `secrets.*`, or `env.*` directly inside composite action
112
+ step expressions — these contexts are not available at composite action evaluation time."
113
+ - "Treat composite actions like reusable library functions: all runtime values must
114
+ come in through declared `inputs`."
115
+ - "In the calling workflow, resolve `vars.*` or `secrets.*` at the `with:` level and
116
+ pass resulting values as string inputs."
117
+ - "Run `act` locally or validate with `actionlint` to catch context availability
118
+ errors before pushing to GitHub."
119
+ docs:
120
+ - url: "https://github.com/actions/runner/issues/4311"
121
+ label: "actions/runner#4311 — vars context rejected in composite actions"
122
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/accessing-contextual-information-about-workflow-runs#context-availability"
123
+ label: "GitHub Docs: Context availability by element type"
124
+ - url: "https://docs.github.com/en/actions/sharing-automations/creating-actions/creating-a-composite-action"
125
+ label: "GitHub Docs: Creating a composite action"
126
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/variables#using-the-vars-context-to-access-configuration-variable-values"
127
+ label: "GitHub Docs: Using the vars context"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@htekdev/actions-debugger",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "description": "65+ real GitHub Actions errors, queryable by agents. MCP server + Copilot skills + error database.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",