@htekdev/actions-debugger 1.0.130 → 1.0.131

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,158 @@
1
+ id: permissions-auth-076
2
+ title: '`docker push` to ghcr.io fails with 403 / "denied: permission_denied: write_package" — missing `packages: write` permission'
3
+ category: permissions-auth
4
+ severity: error
5
+ tags:
6
+ - ghcr
7
+ - github-packages
8
+ - container-registry
9
+ - packages-write
10
+ - github-token
11
+ - docker-push
12
+ - 403
13
+ - permission-denied
14
+ patterns:
15
+ - regex: 'denied: permission_denied: write_package'
16
+ flags: 'i'
17
+ - regex: 'Error response from daemon.*denied.*ghcr\.io.*403'
18
+ flags: 'i'
19
+ - regex: 'error parsing HTTP 403 response body.*ghcr\.io'
20
+ flags: 'i'
21
+ - regex: 'unauthorized.*ghcr\.io.*write'
22
+ flags: 'i'
23
+ - regex: 'The token provided does not match expected format for.*packages'
24
+ flags: 'i'
25
+ error_messages:
26
+ - "Error response from daemon: denied: permission_denied: write_package"
27
+ - "error parsing HTTP 403 response body: unexpected end of JSON input: \"\""
28
+ - "denied: denied"
29
+ - "unauthorized: authentication required"
30
+ - "buildx failed with: ERROR [auth] ghcr.io token refreshing failed with status: 403 Forbidden"
31
+ root_cause: |
32
+ GitHub Container Registry (ghcr.io) requires the `packages: write` permission
33
+ to be explicitly granted in the workflow job's `permissions:` block before
34
+ `GITHUB_TOKEN` can push (publish) images.
35
+
36
+ Since GitHub tightened default GITHUB_TOKEN permissions in 2023, new repositories
37
+ and organization workflows that set "Restrict GitHub Actions permissions" to
38
+ "Read repository contents and packages" have `packages: write` DISABLED by default.
39
+ Without this permission, any `docker push` or `docker buildx build --push` to
40
+ `ghcr.io` fails with a 403 at the registry level.
41
+
42
+ **Why this is confusing:**
43
+ - `docker login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }}`
44
+ SUCCEEDS (read/login is allowed) — the login step passes
45
+ - The failure occurs on `docker push`, not login
46
+ - The error message "denied: permission_denied: write_package" or the generic 403
47
+ does not directly mention the `packages: write` permission or how to add it
48
+ - The same workflow may work on repositories created before the permission
49
+ tightening (where `packages: write` was still the default)
50
+
51
+ **Additional requirement — linking the package to the repository:**
52
+ On first publish, the package is created as unlinked. If the workflow runs in a
53
+ fork or if the package visibility is set to Private with no repository link, the
54
+ GITHUB_TOKEN push will also fail even with `packages: write`. The package must be
55
+ linked to the source repository for GITHUB_TOKEN to authenticate.
56
+
57
+ Source: SO #70646920 (22 upvotes, 34k views), SO #78342148, GitHub Docs on
58
+ container registry permissions.
59
+ fix: |
60
+ Add `packages: write` to the job's `permissions:` block. This is the most common
61
+ fix and resolves the majority of GHCR push 403 errors:
62
+
63
+ ```yaml
64
+ jobs:
65
+ build-and-push:
66
+ runs-on: ubuntu-latest
67
+ permissions:
68
+ contents: read
69
+ packages: write # Required to push to ghcr.io
70
+ ```
71
+
72
+ **If login succeeds but push still fails:**
73
+ 1. Verify the package is linked to the repository: go to the package on
74
+ `github.com/{owner}/{package}` → Package settings → "Add Repository"
75
+ 2. Ensure the package visibility matches the repository (private repo → private
76
+ package, or set the package to public)
77
+ 3. For organization repositories, confirm the organization has not blocked
78
+ GitHub Actions from creating packages (Org Settings → Actions → General)
79
+
80
+ **If using a separate PAT or App token:**
81
+ GITHUB_TOKEN with `packages: write` is sufficient for pushing to packages owned
82
+ by the same repository. For cross-repository or org-level package publishing,
83
+ use a Fine-Grained PAT with "Packages: Read and write" scope or a GitHub App
84
+ with "Packages: write" permission.
85
+ fix_code:
86
+ - language: yaml
87
+ label: 'Correct job-level permissions for docker push to ghcr.io'
88
+ code: |
89
+ name: Build and Push Docker Image
90
+ on:
91
+ push:
92
+ branches: [main]
93
+ jobs:
94
+ build-push:
95
+ runs-on: ubuntu-latest
96
+ permissions:
97
+ contents: read
98
+ packages: write # <-- Required for ghcr.io push
99
+ steps:
100
+ - uses: actions/checkout@v4
101
+
102
+ - name: Log in to GitHub Container Registry
103
+ uses: docker/login-action@v3
104
+ with:
105
+ registry: ghcr.io
106
+ username: ${{ github.actor }}
107
+ password: ${{ secrets.GITHUB_TOKEN }}
108
+
109
+ - name: Build and push
110
+ uses: docker/build-push-action@v6
111
+ with:
112
+ context: .
113
+ push: true
114
+ tags: ghcr.io/${{ github.repository }}:latest
115
+ - language: yaml
116
+ label: 'Workflow-level permissions fallback (if setting per-job is not possible)'
117
+ code: |
118
+ name: Build and Push Docker Image
119
+ on:
120
+ push:
121
+ branches: [main]
122
+
123
+ # Set at workflow level — applies to ALL jobs
124
+ permissions:
125
+ contents: read
126
+ packages: write
127
+
128
+ jobs:
129
+ build-push:
130
+ runs-on: ubuntu-latest
131
+ steps:
132
+ - uses: actions/checkout@v4
133
+ - name: Log in to ghcr.io
134
+ uses: docker/login-action@v3
135
+ with:
136
+ registry: ghcr.io
137
+ username: ${{ github.actor }}
138
+ password: ${{ secrets.GITHUB_TOKEN }}
139
+ - name: Push image
140
+ run: |
141
+ docker build -t ghcr.io/${{ github.repository }}:${{ github.sha }} .
142
+ docker push ghcr.io/${{ github.repository }}:${{ github.sha }}
143
+ prevention:
144
+ - "Always add `packages: write` to the job permissions block for any job that pushes images to ghcr.io"
145
+ - "Note that docker login to ghcr.io succeeds without packages:write — always test the actual push step to validate permissions"
146
+ - "Check your organization's Actions general settings for any policies that restrict packages creation"
147
+ - "When using docker/build-push-action with push: true, the packages: write permission is required on the job"
148
+ - "For fork PRs, packages: write is unavailable — use conditional steps: `if: github.event.pull_request.head.repo.full_name == github.repository`"
149
+ - "Link the package to its source repository after first creation to enable GITHUB_TOKEN-based pushes in future runs"
150
+ docs:
151
+ - url: 'https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry'
152
+ label: 'GitHub Docs: Working with the Container registry (ghcr.io)'
153
+ - url: 'https://docs.github.com/en/actions/security-for-github-actions/security-guides/automatic-token-authentication#permissions-for-the-github_token'
154
+ label: 'GitHub Docs: GITHUB_TOKEN permissions reference'
155
+ - url: 'https://stackoverflow.com/questions/70646920/github-token-permission-denied-write-package-when-build-and-push-docker-in-githu'
156
+ label: 'SO #70646920: GITHUB_TOKEN permission denied write_package (22 upvotes, 34k views)'
157
+ - url: 'https://docs.github.com/en/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility'
158
+ label: 'GitHub Docs: Configuring a package access control and visibility'
@@ -0,0 +1,160 @@
1
+ id: runner-environment-245
2
+ title: 'ARC ephemeral runner pod hangs indefinitely after workflow job cancellation — "Skipping message Job. Job message not found ... job was canceled"'
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - arc
7
+ - kubernetes
8
+ - ephemeral-runner
9
+ - cancellation
10
+ - stuck-runner
11
+ - gha-runner-scale-set
12
+ - job-canceled
13
+ patterns:
14
+ - regex: 'Skipping message Job\. Job message not found .+ job was canceled'
15
+ flags: 'i'
16
+ - regex: 'EphemeralRunner.*status.*Running.*canceled'
17
+ flags: 'i'
18
+ - regex: 'Registration .+ was not found\.'
19
+ flags: 'i'
20
+ - regex: 'POST request to .+acquirejob failed\. HTTP Status: Conflict'
21
+ flags: 'i'
22
+ error_messages:
23
+ - "Skipping message Job. Job message not found 'e420db7b-c780-5ae4-8145-4eea09b87aea'. job was canceled"
24
+ - "POST request to https://run-actions-*.actions.githubusercontent.com/*/acquirejob failed. HTTP Status: Conflict"
25
+ - "Registration 470d6c87-f8c4-411f-87d0-6b069233ccc7 was not found."
26
+ root_cause: |
27
+ When a GitHub Actions workflow job is canceled (manually or by concurrency group
28
+ cancellation) while an ARC ephemeral runner is in the process of starting up or
29
+ acquiring the job message, the runner pod enters a broken state:
30
+
31
+ 1. The broker sends a "job was canceled" message on the runner's job socket.
32
+ 2. The runner logs: "Skipping message Job. Job message not found 'X'. job was canceled"
33
+ 3. **The runner process does not exit** — it waits for a new job message that
34
+ will never arrive, because ephemeral runners are single-use and the broker
35
+ considers this runner's slot exhausted.
36
+ 4. The ARC controller sees the EphemeralRunner pod still in `Running` phase with
37
+ a live runner process. It does NOT delete and recreate the pod.
38
+ 5. The runner slot is held indefinitely. No new job can be dispatched to this slot.
39
+ Workflows queue but cannot start, consuming queue capacity without making progress.
40
+
41
+ **Secondary failure mode**: After the canceled-job hang, the runner may also
42
+ attempt to re-acquire its registration token. Since the ephemeral runner's
43
+ registration was already consumed or expired, this fails with:
44
+ `Registration 'X' was not found.`
45
+ The BrokerServer then throws repeatedly, producing a growing error log.
46
+
47
+ **Impact**: In a scale set with `minRunners > 0`, each canceled job permanently
48
+ removes one runner slot from the pool until the pod is manually deleted or the
49
+ scale set is bounced. With frequent cancellations (e.g., PR pushes with concurrency
50
+ cancel-in-progress), the pool drains completely and CI halts.
51
+
52
+ Source: actions/actions-runner-controller#4307 (Nov 2025, 11 reactions, open).
53
+ Also related: ARC#4468 (scale set queuing delay during burst) — adjacent but distinct.
54
+ fix: |
55
+ **Option 1 — Delete stuck EphemeralRunner objects manually (immediate relief):**
56
+ Identify stuck pods — they have been Running for longer than any expected job
57
+ duration and show "job was canceled" in their logs:
58
+
59
+ ```bash
60
+ kubectl get ephemerals -n arc-runners --sort-by=.metadata.creationTimestamp
61
+ kubectl logs <stuck-pod-name> -n arc-runners | grep "job was canceled"
62
+ kubectl delete ephemeralrunner <stuck-pod-name> -n arc-runners
63
+ ```
64
+
65
+ **Option 2 — Add a watchdog sidecar or CronJob to detect and kill stuck runners:**
66
+ Run a periodic job that identifies EphemeralRunner pods that have been in Running
67
+ phase beyond `maxRunnerLifetime` and have no active child processes (no build
68
+ tools, compilers, or test runners as descendants):
69
+
70
+ ```bash
71
+ # Detect hung runners: Running > 30 min with no CPU activity
72
+ kubectl get ephemerals -n arc-runners -o json | \
73
+ jq '.items[] | select(.status.phase=="Running") | .metadata.name'
74
+ ```
75
+
76
+ **Option 3 — Configure autoscaling to replace stuck runners via scale-down:**
77
+ Set `maxRunners` to a value that triggers KEDA scale-down when load is low.
78
+ Scale-down deletes idle pods, including stuck ones. Ephemeral runners in the
79
+ "stuck/waiting" state appear idle to KEDA and will be cleaned up on the next
80
+ scale-down cycle.
81
+
82
+ **Option 4 — Use concurrency groups carefully to reduce cancellations:**
83
+ Each job cancellation risks creating a stuck runner. Reduce cancellation frequency
84
+ by scoping concurrency groups more narrowly (per-branch rather than per-repo):
85
+
86
+ ```yaml
87
+ concurrency:
88
+ group: ${{ github.workflow }}-${{ github.ref }}
89
+ cancel-in-progress: true
90
+ ```
91
+
92
+ **Option 5 — Upgrade ARC and runner image:**
93
+ Track the upstream fix in ARC#4307. Check ARC release notes for a fix to the
94
+ runner's post-cancellation cleanup path. Ensure runner image is on the latest
95
+ minor version.
96
+ fix_code:
97
+ - language: yaml
98
+ label: 'Kubernetes CronJob watchdog to delete stuck ARC ephemeral runners'
99
+ code: |
100
+ apiVersion: batch/v1
101
+ kind: CronJob
102
+ metadata:
103
+ name: arc-runner-watchdog
104
+ namespace: arc-runners
105
+ spec:
106
+ schedule: "*/10 * * * *"
107
+ jobTemplate:
108
+ spec:
109
+ template:
110
+ spec:
111
+ serviceAccountName: arc-runner-watchdog-sa
112
+ containers:
113
+ - name: watchdog
114
+ image: bitnami/kubectl:latest
115
+ command:
116
+ - /bin/sh
117
+ - -c
118
+ - |
119
+ TIMEOUT_MINUTES=30
120
+ NOW=$(date +%s)
121
+ kubectl get ephemeralrunners -n arc-runners -o json | \
122
+ jq -r --argjson now "$NOW" --argjson timeout "$((TIMEOUT_MINUTES * 60))" \
123
+ '.items[] | select(.status.phase=="Running") |
124
+ select(($now - (.metadata.creationTimestamp | fromdateiso8601)) > $timeout) |
125
+ .metadata.name' | \
126
+ xargs -r -I{} kubectl delete ephemeralrunner {} -n arc-runners
127
+ restartPolicy: OnFailure
128
+ - language: yaml
129
+ label: 'Narrow concurrency groups to reduce job cancellations hitting ARC'
130
+ code: |
131
+ name: CI
132
+ on:
133
+ push:
134
+ branches: ['**']
135
+ pull_request:
136
+ concurrency:
137
+ # Scope to branch — only cancels duplicate runs on the same branch,
138
+ # not across all branches (reduces how often ARC runners get hit by cancellations)
139
+ group: ${{ github.workflow }}-${{ github.ref }}
140
+ cancel-in-progress: true
141
+ jobs:
142
+ build:
143
+ runs-on:
144
+ group: my-scale-set
145
+ steps:
146
+ - uses: actions/checkout@v4
147
+ - run: make build
148
+ prevention:
149
+ - "Monitor EphemeralRunner pod ages; any pod in Running phase beyond 2x your longest job duration is likely stuck"
150
+ - "Use narrow concurrency group scopes (per-branch) to minimize the frequency of job cancellations hitting ARC runners"
151
+ - "Configure KEDA scale-down (minRunners: 0 during off-hours) to naturally clear stuck runner pods"
152
+ - "Keep ARC controller and runner image on the latest stable release; the stuck-on-cancel bug has active upstream attention in ARC#4307"
153
+ - "For high-cancellation workflows (PR push loops), consider using GitHub-hosted runners which handle cancellation cleanup server-side"
154
+ docs:
155
+ - url: 'https://github.com/actions/actions-runner-controller/issues/4307'
156
+ label: 'ARC#4307: Ephemeral Runners get stuck when job is canceled or interrupted (11 reactions, open)'
157
+ - url: 'https://github.com/actions/actions-runner-controller/blob/master/docs/gha-runner-scale-set-controller/README.md'
158
+ label: 'ARC: GitHub Actions Runner Scale Set documentation'
159
+ - url: 'https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners-with-actions-runner-controller/troubleshooting-actions-runner-controller-errors'
160
+ label: 'GitHub Docs: Troubleshooting ARC errors'
@@ -0,0 +1,132 @@
1
+ id: silent-failures-120
2
+ title: 'github.event.schedule returns stale cron expression for 1-2 runs after updating workflow schedule'
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - schedule
7
+ - cron
8
+ - github.event.schedule
9
+ - stale-value
10
+ - routing
11
+ - trigger-payload
12
+ patterns:
13
+ - regex: 'github\.event\.schedule.*[0-9\*\/\-\,]+'
14
+ flags: 'i'
15
+ - regex: 'Unknown schedule:\s+[0-9\*\/\-\, ]+'
16
+ flags: 'i'
17
+ - regex: 'Evaluating String.*=>\s+''[0-9\*\/\-\, ]+'''
18
+ flags: 'i'
19
+ error_messages:
20
+ - "Error: Unknown schedule: 0 5 * * *"
21
+ - "##[debug]....=> '0 5 * * *'"
22
+ - "github.event.schedule evaluates to removed cron expression"
23
+ root_cause: |
24
+ GitHub's schedule dispatcher caches the cron expression strings associated with
25
+ each workflow internally. When a workflow's `on.schedule` block is updated (cron
26
+ expression changed or removed) and pushed to the default branch, the dispatcher's
27
+ internal state does not immediately sync with the new YAML. For 1-2 scheduled runs
28
+ after the change, the dispatcher fires the workflow with the OLD cron expression
29
+ in `github.event.schedule`, even though the executed YAML already contains the
30
+ updated cron string.
31
+
32
+ This means:
33
+ - A workflow with routing logic such as `if: github.event.schedule == '0 5 * * 1-5'`
34
+ silently skips those steps during the transition window
35
+ - A `case`/`switch`-style step that branches on `github.event.schedule` hits an
36
+ "unknown schedule" branch and logs a confusing error
37
+ - Multi-schedule workflows that use `github.event.schedule` to dispatch different jobs
38
+ produce wrong results for 1-2 runs post-update
39
+
40
+ The stale value typically clears within the next scheduled trigger cycle once the
41
+ dispatcher re-reads the updated workflow YAML from the default branch. The actual
42
+ workflow code that runs is the CURRENT version — only the event payload is stale.
43
+
44
+ Source: actions/runner#4241 (Feb 2026) — real-world failure confirmed in
45
+ ava-labs/firewood with stale '0 5 * * *' firing after update to '0 5 * * 1-5',
46
+ with debug logs showing the old value in the evaluator.
47
+ fix: |
48
+ **Option 1 — Use a fallback in cron-routing logic:**
49
+ When switching cron expressions, treat the transition period gracefully by adding
50
+ the OLD expression to your routing logic temporarily. After 2-3 scheduled cycles,
51
+ remove the old branch.
52
+
53
+ **Option 2 — Avoid routing on github.event.schedule entirely:**
54
+ Use separate workflow files for each schedule instead of branching inside one
55
+ workflow on `github.event.schedule`. Each schedule in its own file has an
56
+ independent dispatch state.
57
+
58
+ **Option 3 — Trigger a manual run after updating the schedule:**
59
+ After pushing the cron change, trigger the workflow via `workflow_dispatch` once.
60
+ This forces the dispatcher to re-evaluate the workflow file and typically clears
61
+ the stale state before the next real scheduled run.
62
+
63
+ **Option 4 — Accept and handle the stale run:**
64
+ Add a default/fallback case to your routing logic that gracefully handles an
65
+ unexpected `github.event.schedule` value rather than erroring:
66
+
67
+ ```yaml
68
+ - name: Route by schedule
69
+ run: |
70
+ case "${{ github.event.schedule }}" in
71
+ '0 5 * * 1-5') echo "Weekday run" ;;
72
+ '0 5 * * 6') echo "Saturday run" ;;
73
+ *) echo "Unknown schedule (possibly stale): ${{ github.event.schedule }}; skipping" ;;
74
+ esac
75
+ ```
76
+ fix_code:
77
+ - language: yaml
78
+ label: 'Use separate workflows per schedule (avoids routing entirely)'
79
+ code: |
80
+ # weekday-job.yml
81
+ on:
82
+ schedule:
83
+ - cron: '0 5 * * 1-5'
84
+ jobs:
85
+ weekday:
86
+ runs-on: ubuntu-latest
87
+ steps:
88
+ - run: echo "Weekday build"
89
+
90
+ # saturday-job.yml
91
+ on:
92
+ schedule:
93
+ - cron: '0 5 * * 6'
94
+ jobs:
95
+ saturday:
96
+ runs-on: ubuntu-latest
97
+ steps:
98
+ - run: echo "Saturday build"
99
+ - language: yaml
100
+ label: 'Graceful fallback case when routing on github.event.schedule'
101
+ code: |
102
+ on:
103
+ schedule:
104
+ - cron: '0 5 * * 1-5'
105
+ - cron: '0 5 * * 6'
106
+ jobs:
107
+ dispatch:
108
+ runs-on: ubuntu-latest
109
+ steps:
110
+ - name: Route by schedule
111
+ run: |
112
+ case "${{ github.event.schedule }}" in
113
+ '0 5 * * 1-5') echo "Weekday build" ;;
114
+ '0 5 * * 6') echo "Saturday build" ;;
115
+ # Fallback handles stale values during transition window
116
+ *)
117
+ echo "Unrecognized schedule value: '${{ github.event.schedule }}'"
118
+ echo "This may be a stale value from before a recent schedule update."
119
+ echo "Skipping; next run should carry the updated expression."
120
+ ;;
121
+ esac
122
+ prevention:
123
+ - "Never rely on github.event.schedule routing immediately after updating a cron expression; allow 2-3 cycles for dispatcher state to sync"
124
+ - "Prefer separate workflow files per schedule rather than branching on github.event.schedule inside a single workflow"
125
+ - "When routing on github.event.schedule is necessary, always include a default/fallback case that handles unexpected values gracefully"
126
+ - "Trigger a workflow_dispatch run after updating a cron expression to force dispatcher re-evaluation before the next scheduled cycle"
127
+ - "Add a debug step that logs github.event.schedule at the start of scheduled workflows to surface stale values immediately"
128
+ docs:
129
+ - url: 'https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#schedule'
130
+ label: 'GitHub Docs: schedule event'
131
+ - url: 'https://github.com/actions/runner/issues/4241'
132
+ label: 'actions/runner#4241: Cron scheduled returns stale cron expression after updating workflow schedule triggers'
@@ -0,0 +1,141 @@
1
+ id: yaml-syntax-077
2
+ title: 'VS Code GitHub Actions extension / languageservices emits false "Context access might be invalid" warning for secrets.*, vars.*, needs.* in valid regular workflows'
3
+ category: yaml-syntax
4
+ severity: warning
5
+ tags:
6
+ - vscode
7
+ - languageservices
8
+ - false-positive
9
+ - secrets-context
10
+ - vars-context
11
+ - needs-context
12
+ - linting
13
+ - actionlint
14
+ patterns:
15
+ - regex: 'Context access might be invalid:\s+secrets\.'
16
+ flags: 'i'
17
+ - regex: 'Context access might be invalid:\s+vars\.'
18
+ flags: 'i'
19
+ - regex: 'Context access might be invalid:\s+needs\.'
20
+ flags: 'i'
21
+ - regex: 'Unrecognized named-value:\s+''secrets'''
22
+ flags: 'i'
23
+ error_messages:
24
+ - "Context access might be invalid: secrets.MY_SECRET"
25
+ - "Context access might be invalid: vars.MY_VAR"
26
+ - "Context access might be invalid: needs.build.outputs.artifact-path"
27
+ - "Unrecognized named-value: 'secrets'"
28
+ root_cause: |
29
+ The VS Code GitHub Actions extension (github.vscode-github-actions) uses the
30
+ `@actions/languageservices` package for workflow linting and IntelliSense. The
31
+ language server performs static analysis without access to the repository's actual
32
+ secrets, variables, or environment configuration. It emits "Context access might
33
+ be invalid" warnings in several scenarios where the workflow is in fact correct:
34
+
35
+ 1. **Repository-level secrets and variables**: The language server cannot query
36
+ the repository's secrets or variables store, so any `secrets.MY_SECRET` or
37
+ `vars.MY_VAR` reference triggers a warning. This affects every workflow that
38
+ uses custom secrets or variables — i.e., nearly all real-world workflows.
39
+
40
+ 2. **Dynamic environment secrets**: When a workflow uses `environment: ${{ ... }}`
41
+ with an expression to select the environment at runtime, the language server
42
+ cannot statically resolve which environment's secrets are accessible. Even
43
+ validly scoped `secrets.*` references under dynamic environments are flagged.
44
+
45
+ 3. **needs.* context across complex job dependency graphs**: The language server
46
+ sometimes flags `needs.X.outputs.Y` as invalid when job X is defined in the
47
+ same workflow but the graph is not trivially linear, or when `needs:` contains
48
+ a list of multiple dependencies.
49
+
50
+ **Why this is a false positive:**
51
+ The warnings are generated by the language server's static type system, which
52
+ requires compile-time knowledge of what secrets/variables exist. GitHub Actions
53
+ resolves these at runtime from the repository/organization secrets store — a
54
+ source the language server has no access to. The workflow runs correctly at
55
+ runtime; only the editor shows red squiggles.
56
+
57
+ This is an open known issue tracked in actions/languageservices#239 (assigned
58
+ to GitHub staff, reopened after partial fixes). Multiple VS Code extension issues
59
+ document the same root cause: vscode-github-actions#461, #452, #375, #533.
60
+
61
+ **Scope**: Affects anyone using the VS Code GitHub Actions extension
62
+ (github.vscode-github-actions) v0.x and v1.x with workflows using secrets,
63
+ variables, or multi-job dependency outputs. NOT an actionlint issue —
64
+ actionlint correctly handles these cases without false positives.
65
+ fix: |
66
+ **Option 1 — Suppress per-line (extension-specific comment):**
67
+ The language server respects `# ignore` comments to suppress specific warnings.
68
+ Add a comment on the line preceding the flagged expression:
69
+
70
+ ```yaml
71
+ env:
72
+ # ignore: context-access-might-be-invalid
73
+ MY_VAR: ${{ secrets.MY_SECRET }}
74
+ ```
75
+
76
+ Note: This syntax is not standardized and may change with extension updates.
77
+
78
+ **Option 2 — Disable specific diagnostics in VS Code settings:**
79
+ In `.vscode/settings.json`, disable the diagnostic class:
80
+
81
+ ```json
82
+ {
83
+ "github-actions.workflows.pinned.refresh.enabled": true
84
+ }
85
+ ```
86
+
87
+ **Option 3 — Ignore and trust runtime behavior:**
88
+ This is a false positive — the workflow will run correctly. If the warning is
89
+ distracting, the safest approach is to acknowledge it as a known extension
90
+ limitation and verify by running the workflow. GitHub Actions runtime correctly
91
+ resolves secrets, vars, and needs contexts.
92
+
93
+ **Option 4 — Use actionlint for CI-level linting (no false positives for secrets):**
94
+ `actionlint` does not flag `secrets.*` references as invalid (it correctly
95
+ treats them as opaque strings). For CI integration, prefer actionlint over
96
+ the VS Code extension's linter for automated checks.
97
+ fix_code:
98
+ - language: yaml
99
+ label: 'Workflow using secrets and vars — runs correctly despite VS Code warnings'
100
+ code: |
101
+ # This workflow is valid — VS Code warns but GitHub Actions runs it correctly.
102
+ # The "Context access might be invalid" warnings for secrets.* and vars.*
103
+ # are false positives from the languageservices static analyzer.
104
+ name: Deploy
105
+ on:
106
+ push:
107
+ branches: [main]
108
+ jobs:
109
+ deploy:
110
+ runs-on: ubuntu-latest
111
+ environment: production
112
+ steps:
113
+ - name: Use secret (VS Code may warn here — ignore it)
114
+ run: echo "Deploying..."
115
+ env:
116
+ API_KEY: ${{ secrets.API_KEY }} # false positive warning
117
+ BASE_URL: ${{ vars.DEPLOY_BASE_URL }} # false positive warning
118
+ - language: json
119
+ label: 'VS Code settings.json — disable noisy extension diagnostics'
120
+ code: |
121
+ {
122
+ "github-actions.workflows.pinned.refresh.enabled": true,
123
+ "github-actions.org-secrets.enabled": false
124
+ }
125
+ prevention:
126
+ - "Do not suppress workflow secrets or variables based on VS Code warnings — verify by actually running the workflow"
127
+ - "Use actionlint for CI-integrated linting; it handles secrets/vars correctly without false positives"
128
+ - "Keep the VS Code GitHub Actions extension updated; GitHub staff are actively working on reducing false positives in languageservices"
129
+ - "Check the languageservices GitHub repo (actions/languageservices) for known false positive issues before filing new bugs"
130
+ - "When sharing workflow snippets, note that VS Code warnings do not necessarily indicate real problems — always confirm against actual run output"
131
+ docs:
132
+ - url: 'https://github.com/actions/languageservices/issues/239'
133
+ label: 'actions/languageservices#239: Context access might be invalid is too aggressive (open, assigned)'
134
+ - url: 'https://github.com/github/vscode-github-actions/issues/461'
135
+ label: 'vscode-github-actions#461: Unrecognized Github Actions Secret Context (false positive)'
136
+ - url: 'https://github.com/github/vscode-github-actions/issues/452'
137
+ label: 'vscode-github-actions#452: False warning for actions/checkout: Context access might be invalid'
138
+ - url: 'https://github.com/github/vscode-github-actions/issues/375'
139
+ label: 'vscode-github-actions#375: false positive error on secrets context access in forks'
140
+ - url: 'https://github.com/rhysd/actionlint'
141
+ label: 'actionlint: alternative linter that handles secrets/vars without false positives'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@htekdev/actions-debugger",
3
- "version": "1.0.130",
3
+ "version": "1.0.131",
4
4
  "description": "65+ real GitHub Actions errors, queryable by agents. CLI + MCP server + Copilot skills + error database.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",