@htekdev/actions-debugger 1.0.69 → 1.0.71

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,103 @@
1
+ id: known-unsolved-044
2
+ title: 'Copilot code review consumes GitHub Actions minutes on private repositories — unexpected billing from June 1, 2026'
3
+ category: known-unsolved
4
+ severity: limitation
5
+ tags:
6
+ - copilot
7
+ - copilot-code-review
8
+ - billing
9
+ - actions-minutes
10
+ - private-repos
11
+ - spending-limit
12
+ patterns:
13
+ - regex: 'copilot.*code.*review.*actions.*minutes'
14
+ flags: 'i'
15
+ - regex: 'spending limit.*github actions'
16
+ flags: 'i'
17
+ - regex: 'exceeded.*spending limit.*copilot'
18
+ flags: 'i'
19
+ error_messages:
20
+ - 'GitHub Actions minutes unexpectedly consumed by Copilot code review jobs'
21
+ - 'Actions billing spike after enabling Copilot code review on private repositories'
22
+ root_cause: |
23
+ Starting June 1, 2026, GitHub Copilot code review shifted to an agentic tool-calling
24
+ architecture that runs on GitHub Actions using GitHub-hosted runners. As a result, each
25
+ Copilot code review on a private repository now consumes GitHub Actions minutes in addition
26
+ to Copilot AI Credits (under the new usage-based billing model).
27
+
28
+ This is not an error in your workflow — your existing workflows are unaffected. The issue
29
+ is an invisible, automatic Actions workflow that GitHub creates and runs internally for
30
+ each Copilot code review request on your private repos. The runner time shows up in your
31
+ Actions billing dashboard as unexpected consumption.
32
+
33
+ Affected plans:
34
+ - GitHub Copilot Pro
35
+ - GitHub Copilot Pro+
36
+ - GitHub Copilot Business
37
+ - GitHub Copilot Enterprise
38
+ This also includes Copilot code reviews from non-licensed users billed via direct org billing.
39
+
40
+ The behavior is by design and cannot be disabled — if Copilot code review is active on
41
+ private repos, Actions minutes will be consumed. The rate depends on the runner type:
42
+ - Standard GitHub-hosted runners: standard per-minute Actions rates apply
43
+ - Larger runners: billed at the larger runner rate
44
+ - Self-hosted runners: no additional Actions minute charges (self-hosted runner costs apply)
45
+
46
+ Organizations that had spending limits set low for Actions (or spending limits set to $0)
47
+ may find that Copilot code reviews start being blocked when the Actions spending limit is hit,
48
+ causing the review to fail or not run at all — without a clear error message explaining why.
49
+
50
+ There is no way to separate "Copilot code review Actions minutes" from regular workflow
51
+ Actions minutes in the billing dashboard — they are aggregated together.
52
+ fix: |
53
+ There is no way to opt out of Actions minute consumption for Copilot code review on private
54
+ repos while keeping Copilot code review enabled. The available mitigations are:
55
+
56
+ 1. **Use self-hosted runners**: Configure Copilot code review to use self-hosted runners.
57
+ Self-hosted runner usage does not count toward your GitHub Actions minute allowance.
58
+ This is the only way to eliminate the per-review Actions minute charge.
59
+
60
+ 2. **Increase the Actions spending limit**: Review your organization's Actions spending limit
61
+ in Settings → Billing & Plans → Spending limits. Ensure the limit covers the expected
62
+ volume of Copilot code reviews in addition to your regular Actions usage.
63
+
64
+ 3. **Set up budget controls**: Use GitHub's usage-based billing budget controls to set
65
+ per-user or organization-wide spending caps for Actions to prevent surprise overages.
66
+
67
+ 4. **Monitor proactively**: Use GitHub Actions metrics and the Billing Usage Report to
68
+ track combined Actions + Copilot consumption before the end of the billing cycle.
69
+
70
+ 5. **Public repositories**: Copilot code review on public repositories does not consume
71
+ Actions minutes (Actions minutes remain free for public repos).
72
+ fix_code:
73
+ - language: yaml
74
+ label: 'No workflow change needed — this is a billing configuration issue, not a workflow error'
75
+ code: |
76
+ # There is no workflow YAML to change.
77
+ # To use self-hosted runners for Copilot code review, configure the runner
78
+ # in your organization or repository settings:
79
+ # Settings → Actions → Runners → Add runner
80
+ # Then configure Copilot code review to use that runner label.
81
+ #
82
+ # To check your Actions spending limit:
83
+ # Settings → Billing & Plans → Spending limits → GitHub Actions
84
+ #
85
+ # Example: setting up a budget alert for Actions usage
86
+ # (done in GitHub UI or via REST API, not workflow YAML)
87
+ #
88
+ # Regular workflows are unaffected — no changes needed to existing .yml files.
89
+ prevention:
90
+ - 'Before enabling Copilot code review on private repositories, review your current GitHub Actions spending limit and adjust if needed'
91
+ - 'Monitor Actions usage in the first billing cycle after enabling Copilot code review to calibrate expected consumption'
92
+ - 'Configure self-hosted runners for Copilot code review to eliminate per-review Actions minute charges'
93
+ - 'Set an explicit Actions spending limit (not $0) to avoid Copilot reviews silently failing when the limit is hit'
94
+ - 'Public repositories are exempt — Copilot code review on public repos does not consume Actions minutes'
95
+ docs:
96
+ - url: 'https://github.blog/changelog/2026-04-27-github-copilot-code-review-will-start-consuming-github-actions-minutes-on-june-1-2026/'
97
+ label: 'GitHub Changelog: Copilot code review will start consuming Actions minutes on June 1, 2026'
98
+ - url: 'https://github.blog/changelog/2026-06-01-updates-to-github-copilot-billing-and-plans/'
99
+ label: 'GitHub Changelog: Copilot billing updates — usage-based billing is active (June 1, 2026)'
100
+ - url: 'https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-github-actions/about-billing-for-github-actions'
101
+ label: 'GitHub Docs: About billing for GitHub Actions'
102
+ - url: 'https://docs.github.com/en/copilot/github-copilot-enterprise/copilot-code-review/using-github-copilot-code-review'
103
+ label: 'GitHub Docs: Using GitHub Copilot code review'
@@ -0,0 +1,114 @@
1
+ id: known-unsolved-045
2
+ title: 'ubuntu-24.04-arm and ubuntu-22.04-arm runner images paused during GitHub Arm64 takeover — no package updates during transition'
3
+ category: known-unsolved
4
+ severity: limitation
5
+ tags:
6
+ - arm64
7
+ - ubuntu-arm
8
+ - runner-images
9
+ - partner-runner-images
10
+ - package-updates
11
+ - security-updates
12
+ patterns:
13
+ - regex: 'ubuntu-24\.04-arm'
14
+ flags: 'i'
15
+ - regex: 'ubuntu-22\.04-arm'
16
+ flags: 'i'
17
+ - regex: 'partner-runner-images'
18
+ flags: 'i'
19
+ error_messages:
20
+ - 'No recent runner-images release notes for ubuntu-24.04-arm during migration period'
21
+ - 'Package version pinned to stale ubuntu-arm runner image during GitHub transition'
22
+ root_cause: |
23
+ In May 2026, GitHub announced it was taking ownership of the Arm64 runner images for
24
+ GitHub Actions hosted runners, transitioning them away from Arm Limited, LLC (previously
25
+ maintained in the actions/partner-runner-images repository).
26
+
27
+ During this transition period:
28
+ - ubuntu-24.04-arm and ubuntu-22.04-arm images WILL NOT receive updates
29
+ - No new release notes appear in actions/runner-images for these images during migration
30
+ - The actions/partner-runner-images repository is being archived
31
+ - All open issues and future support are moving to actions/runner-images
32
+
33
+ This means workflows running on ubuntu-24.04-arm or ubuntu-22.04-arm during the
34
+ transition period (May 2026 until migration completes) are running on stale images that
35
+ may have:
36
+ - Unpatched security vulnerabilities (CVEs disclosed after the freeze date)
37
+ - Missing package versions that were released after the freeze date
38
+ - Outdated tool versions (e.g., Docker, Node.js, Python) compared to the x86 equivalents
39
+
40
+ The exact duration of the freeze is not published — GitHub states "during the transition."
41
+ Developers who pin specific package or tool versions that are only available in newer
42
+ releases may find those versions unavailable on arm runners while they are available on
43
+ the x86 equivalents.
44
+
45
+ This is a known, intentional operational decision by GitHub during the infrastructure
46
+ migration. There is no error message — workflows simply run on stale images silently.
47
+ fix: |
48
+ There is no immediate fix since the image freeze is a deliberate infrastructure choice
49
+ during the migration. Available mitigations:
50
+
51
+ 1. **Track the migration status**: Monitor the actions/runner-images repository for
52
+ announcements about when the Ubuntu Arm64 images resume updates. GitHub has indicated
53
+ the partner-runner-images repo will be archived after the transition completes.
54
+
55
+ 2. **Report critical issues directly**: For CVEs or critical vulnerabilities in the arm
56
+ images during the transition, open an issue in actions/runner-images (NOT
57
+ actions/partner-runner-images, which is being archived).
58
+
59
+ 3. **Avoid pinning to specific recent package versions on arm runners**: If your workflow
60
+ installs packages with exact version pinning, add a fallback or use the latest available
61
+ version rather than a specific recent release that may not be in the frozen image.
62
+
63
+ 4. **Use self-hosted Arm64 runners**: If the image freeze causes unacceptable security or
64
+ tool-version risk, consider switching to self-hosted Arm64 runners where you control
65
+ the image update cadence.
66
+
67
+ 5. **Test cross-architecture differences**: If workflows behave differently on x86 vs arm
68
+ during this period, check whether the discrepancy is due to the arm image being stale
69
+ rather than a genuine architecture difference.
70
+ fix_code:
71
+ - language: yaml
72
+ label: 'Use self-hosted Arm64 runner to bypass the frozen GitHub-hosted arm image'
73
+ code: |
74
+ jobs:
75
+ arm-build:
76
+ # Temporarily use a self-hosted arm runner if the GitHub-hosted arm image
77
+ # is missing security patches or required packages during the migration period.
78
+ # Replace with ubuntu-24.04-arm once GitHub resumes image updates.
79
+ runs-on: self-hosted-arm64
80
+
81
+ steps:
82
+ - uses: actions/checkout@v4
83
+
84
+ - name: Build on Arm64
85
+ run: make build
86
+
87
+ - language: yaml
88
+ label: 'Avoid pinning exact recent package versions on arm runners during the transition'
89
+ code: |
90
+ jobs:
91
+ arm-build:
92
+ runs-on: ubuntu-24.04-arm
93
+ steps:
94
+ - uses: actions/checkout@v4
95
+
96
+ # AVOID: pinning to a very recent package version that may not be in frozen image
97
+ # - run: apt-get install -y libexample=2.6.3-1
98
+
99
+ # PREFER: install latest available version from the frozen image's apt cache
100
+ - run: |
101
+ sudo apt-get update
102
+ sudo apt-get install -y libexample
103
+ prevention:
104
+ - 'Monitor actions/runner-images (not actions/partner-runner-images) for Ubuntu Arm64 image update resumption announcements'
105
+ - 'For security-sensitive workloads on arm runners, track CVE advisories against the frozen image versions until the transition completes'
106
+ - 'Avoid cross-architecture version pinning assumptions — package versions on arm images may lag x86 images during the transition period'
107
+ - 'Open issues for Arm64 runner image problems in actions/runner-images — the partner-runner-images repository is being archived and will no longer receive support'
108
+ docs:
109
+ - url: 'https://github.blog/changelog/2026-05-14-github-actions-upcoming-image-migrations/'
110
+ label: 'GitHub Changelog: GitHub Actions Upcoming image migrations — Arm64 takeover (May 2026)'
111
+ - url: 'https://github.com/actions/runner-images'
112
+ label: 'actions/runner-images — new home for all runner image issues including Arm64'
113
+ - url: 'https://github.com/actions/partner-runner-images'
114
+ label: 'actions/partner-runner-images — being archived after Arm64 transition completes'
@@ -0,0 +1,124 @@
1
+ id: permissions-auth-046
2
+ title: 'actions/create-github-app-token output token expires after 1 hour — long-running jobs hit 401 Unauthorized'
3
+ category: permissions-auth
4
+ severity: error
5
+ tags:
6
+ - github-app
7
+ - installation-token
8
+ - token-expiry
9
+ - create-github-app-token
10
+ - long-running-jobs
11
+ patterns:
12
+ - regex: '401 Unauthorized'
13
+ flags: 'i'
14
+ - regex: 'Bad credentials'
15
+ flags: 'i'
16
+ - regex: 'installation.*token.*expired'
17
+ flags: 'i'
18
+ - regex: 'HttpError: Bad credentials'
19
+ flags: 'i'
20
+ error_messages:
21
+ - '401 Unauthorized'
22
+ - 'Bad credentials'
23
+ - 'HttpError: Bad credentials'
24
+ - 'Installation tokens expire one hour from the time you create them'
25
+ root_cause: |
26
+ GitHub App installation tokens — generated by actions/create-github-app-token — have a fixed
27
+ 1-hour expiry enforced by the GitHub platform. The token is generated once at the step where
28
+ the action runs, stored as a step output, and typically exported to an env var. If subsequent
29
+ steps take longer than 60 minutes to reach the point where the token is used, all GitHub API
30
+ calls and authenticated git operations will return 401 Unauthorized or "Bad credentials".
31
+
32
+ From GitHub's REST API docs:
33
+ "Installation tokens expire one hour from the time you create them. Using an expired token
34
+ produces a status code of 401 - Unauthorized, and requires creating a new installation token."
35
+
36
+ Common affected patterns:
37
+ - Long test suites (>60 min) where a GitHub App token is generated upfront for a final
38
+ PR comment or status check post at the end.
39
+ - Build pipelines that generate an app token for private package registry authentication
40
+ at the start, then run a multi-hour compilation and upload step at the end.
41
+ - Self-hosted runners on slow networks where upload + deploy sequences exceed 60 minutes.
42
+ - Jobs that poll or sleep mid-run (e.g., waiting for an external deployment to stabilize).
43
+
44
+ Important: The built-in GITHUB_TOKEN is NOT subject to this expiry — it remains valid for
45
+ the entire job duration (up to the job's timeout-minutes). Only tokens from
46
+ actions/create-github-app-token or direct GitHub App JWT exchanges expire after 1 hour.
47
+ fix: |
48
+ Generate a fresh GitHub App token immediately before the step that needs it rather than
49
+ once at the beginning of the job. For jobs that have multiple distinct phases requiring
50
+ the token, generate a separate token for each phase. Alternatively, split long-running
51
+ work into shorter jobs — each job generates its own fresh token on startup.
52
+ fix_code:
53
+ - language: yaml
54
+ label: 'Generate token immediately before the step that needs it (not at job start)'
55
+ code: |
56
+ jobs:
57
+ long-build:
58
+ runs-on: ubuntu-latest
59
+ steps:
60
+ - name: Checkout
61
+ uses: actions/checkout@v4
62
+
63
+ - name: Run long test suite
64
+ # This may run for over an hour
65
+ run: make test
66
+
67
+ # Generate a fresh token just before the API call — never stale
68
+ - name: Generate GitHub App token
69
+ id: app-token
70
+ uses: actions/create-github-app-token@v2
71
+ with:
72
+ app-id: ${{ vars.APP_ID }}
73
+ private-key: ${{ secrets.APP_PRIVATE_KEY }}
74
+
75
+ - name: Post PR comment
76
+ env:
77
+ GH_TOKEN: ${{ steps.app-token.outputs.token }}
78
+ run: |
79
+ gh pr comment ${{ github.event.pull_request.number }} \
80
+ --body "Tests completed successfully"
81
+
82
+ - language: yaml
83
+ label: 'Split into sub-jobs so each job generates its own short-lived token'
84
+ code: |
85
+ jobs:
86
+ long-tests:
87
+ runs-on: ubuntu-latest
88
+ steps:
89
+ - uses: actions/checkout@v4
90
+ - run: make test
91
+
92
+ notify:
93
+ runs-on: ubuntu-latest
94
+ needs: [long-tests]
95
+ steps:
96
+ # Each job generates a token on startup — always fresh
97
+ - name: Generate GitHub App token
98
+ id: app-token
99
+ uses: actions/create-github-app-token@v2
100
+ with:
101
+ app-id: ${{ vars.APP_ID }}
102
+ private-key: ${{ secrets.APP_PRIVATE_KEY }}
103
+
104
+ - name: Post PR comment
105
+ env:
106
+ GH_TOKEN: ${{ steps.app-token.outputs.token }}
107
+ run: |
108
+ gh pr comment ${{ github.event.pull_request.number }} \
109
+ --body "Tests completed successfully"
110
+ prevention:
111
+ - "Never store a GitHub App installation token at job start assuming it stays valid — generate it immediately before use"
112
+ - "For jobs expected to run longer than 45 minutes, split into sub-jobs so each generates its own fresh token"
113
+ - "Prefer the built-in GITHUB_TOKEN for operations within the same repository — it is valid for the entire job duration"
114
+ - "Set job-level timeout-minutes to catch unexpectedly long jobs and keep total runtime well under the 1-hour token expiry"
115
+ - "The actions/create-github-app-token README prominently warns: 'An installation access token expires after 1 hour'"
116
+ docs:
117
+ - url: 'https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app'
118
+ label: 'Generating an installation access token — expires after 1 hour (GitHub Docs)'
119
+ - url: 'https://github.com/actions/create-github-app-token'
120
+ label: 'actions/create-github-app-token — README warning about 1-hour expiry'
121
+ - url: 'https://github.com/actions/create-github-app-token/issues/128'
122
+ label: 'actions/create-github-app-token#128 — token only lasts 1 hour, long-running jobs fail'
123
+ - url: 'https://docs.github.com/en/actions/security-for-github-actions/security-guides/automatic-token-authentication'
124
+ label: 'GITHUB_TOKEN automatic token authentication — valid for entire job duration'
@@ -0,0 +1,136 @@
1
+ id: runner-environment-131
2
+ title: '@actions/core 3.0.0 is ESM-only — custom JavaScript actions using require() fail with ERR_REQUIRE_ESM'
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - esm
7
+ - commonjs
8
+ - actions-core
9
+ - custom-action
10
+ - javascript
11
+ - toolkit
12
+ patterns:
13
+ - regex: 'ERR_REQUIRE_ESM'
14
+ flags: 'i'
15
+ - regex: 'No "exports" main defined in @actions/core'
16
+ flags: 'i'
17
+ - regex: 'require\(\) of ES Module.*@actions/core'
18
+ flags: 'i'
19
+ - regex: 'Must use import to load ES Module'
20
+ flags: 'i'
21
+ error_messages:
22
+ - 'Error [ERR_REQUIRE_ESM]: require() of ES Module .../node_modules/@actions/core/lib/core.js not supported'
23
+ - 'No "exports" main defined in @actions/core/package.json @v3'
24
+ - 'Must use import to load ES Module: .../node_modules/@actions/core/lib/core.js'
25
+ root_cause: |
26
+ @actions/core version 3.0.0 (published January 29, 2026) converted the package from CommonJS
27
+ to ESM-only. Before v3, the package shipped as CommonJS and was consumable with:
28
+
29
+ const core = require('@actions/core');
30
+
31
+ With v3.0.0 and later, the package is ESM-only. CommonJS callers that use require() receive
32
+ one of these errors at runtime:
33
+
34
+ - ERR_REQUIRE_ESM: Node.js refuses to require() an ES module
35
+ - "No 'exports' main defined in @actions/core/package.json @v3" — the ESM package.json
36
+ exports map does not expose a CommonJS entry point
37
+
38
+ This affects any custom JavaScript or TypeScript action that:
39
+ 1. Uses require('@actions/core') — e.g., const core = require('@actions/core');
40
+ 2. Uses TypeScript compiled to CommonJS (the default 'module': 'commonjs' in tsconfig.json)
41
+ even when source code uses import syntax — the compiled output uses require() calls
42
+ 3. Bundles with webpack/ncc in CommonJS mode without transpiling the ESM dependency
43
+
44
+ The actions/typescript-action template and thousands of published community actions that
45
+ were written for @actions/core v1–v2 are affected when their dependencies are updated.
46
+
47
+ Note: This is a Node.js runtime error — the workflow definition is valid YAML. The failure
48
+ appears in the step log when Node.js tries to load the bundled action.
49
+ fix: |
50
+ There are two approaches depending on whether you control the action source code:
51
+
52
+ Option A — Migrate the action to ESM (recommended for new actions):
53
+ Update the action's package.json to "type": "module", convert all require() calls to
54
+ import statements, and recompile/rebundle. Use "module": "ESNext" or "module": "NodeNext"
55
+ in tsconfig.json for TypeScript actions.
56
+
57
+ Option B — Pin @actions/core to v2.x (quick fix for existing actions):
58
+ Pin to the last CommonJS-compatible version: @actions/core@^2.0.3 in package.json.
59
+ This avoids the ESM migration but misses v3 improvements (new APIs, performance).
60
+
61
+ For third-party community actions you don't control: check if the action maintainer has
62
+ published an updated version. If not, pin the action to the last working version tag
63
+ (before they upgraded to @actions/core v3).
64
+ fix_code:
65
+ - language: yaml
66
+ label: 'Pin @actions/core to v2 in package.json (quick fix for existing CommonJS actions)'
67
+ code: |
68
+ # In the action's package.json, pin to v2 (last CommonJS-compatible release)
69
+ # {
70
+ # "dependencies": {
71
+ # "@actions/core": "^2.0.3"
72
+ # }
73
+ # }
74
+ jobs:
75
+ build-action:
76
+ runs-on: ubuntu-latest
77
+ steps:
78
+ - uses: actions/checkout@v4
79
+
80
+ - uses: actions/setup-node@v4
81
+ with:
82
+ node-version: '20'
83
+
84
+ - name: Install pinned dependencies
85
+ run: npm ci
86
+
87
+ - name: Bundle action
88
+ run: npm run build
89
+
90
+ - language: yaml
91
+ label: 'Migrate action to ESM — update tsconfig and entry point for @actions/core v3'
92
+ code: |
93
+ # tsconfig.json for ESM TypeScript action:
94
+ # {
95
+ # "compilerOptions": {
96
+ # "module": "NodeNext",
97
+ # "moduleResolution": "NodeNext",
98
+ # "target": "ES2020"
99
+ # }
100
+ # }
101
+ #
102
+ # package.json:
103
+ # {
104
+ # "type": "module",
105
+ # "dependencies": { "@actions/core": "^3.0.0" }
106
+ # }
107
+ #
108
+ # In source, use ESM imports (not require):
109
+ # import * as core from '@actions/core';
110
+ jobs:
111
+ build-esm-action:
112
+ runs-on: ubuntu-latest
113
+ steps:
114
+ - uses: actions/checkout@v4
115
+ - uses: actions/setup-node@v4
116
+ with:
117
+ node-version: '20'
118
+ - name: Build ESM action
119
+ run: npm ci && npm run build
120
+ prevention:
121
+ - 'Always check the @actions/core RELEASES.md when upgrading — v3.0.0 is an ESM-only breaking change requiring migration'
122
+ - 'TypeScript actions compiled with "module": "commonjs" in tsconfig.json will produce require() calls even if source uses import — set "module": "NodeNext" for ESM compatibility'
123
+ - 'Use Dependabot or Renovate with a major version constraint so @actions/core upgrades are reviewed before merging'
124
+ - 'Bundle your action with ncc using --esm flag or use esbuild with format=esm to produce ESM-compatible bundles'
125
+ - 'Test bundled actions locally with node dist/index.js before publishing to catch ERR_REQUIRE_ESM before CI fails'
126
+ docs:
127
+ - url: 'https://github.com/actions/toolkit/blob/main/packages/core/RELEASES.md'
128
+ label: '@actions/core RELEASES.md — v3.0.0 ESM-only breaking change'
129
+ - url: 'https://github.com/actions/toolkit/issues/2294'
130
+ label: 'actions/toolkit #2294 — No "exports" main defined in @actions/core/package.json @v3 (8 reactions)'
131
+ - url: 'https://github.com/actions/toolkit/issues/2287'
132
+ label: 'actions/toolkit #2287 — Outdated require() docs for ESM packages (5 reactions)'
133
+ - url: 'https://github.com/actions/typescript-action/issues/1165'
134
+ label: 'actions/typescript-action #1165 — Example for @actions/core >= 3 migration'
135
+ - url: 'https://nodejs.org/api/esm.html#interoperability-with-commonjs'
136
+ label: 'Node.js docs — ESM/CommonJS interoperability'
@@ -0,0 +1,90 @@
1
+ id: silent-failures-068
2
+ title: 'steps.<id>.conclusion is always success when continue-on-error: true — using conclusion to detect step failure never triggers'
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - continue-on-error
7
+ - steps-context
8
+ - outcome
9
+ - conclusion
10
+ - if-condition
11
+ - step-failure
12
+ patterns:
13
+ - regex: 'steps\.\w+\.conclusion\s*==\s*[''"]failure[''"]'
14
+ flags: 'i'
15
+ - regex: 'continue-on-error.*true'
16
+ flags: 'i'
17
+ error_messages:
18
+ - 'steps.<id>.conclusion == ''failure'' never evaluates to true'
19
+ - 'cleanup step silently skipped despite step failure'
20
+ root_cause: |
21
+ GitHub Actions provides two properties on the `steps` context for inspecting a completed step:
22
+
23
+ - `steps.<id>.outcome` — the raw result BEFORE `continue-on-error` is applied. Values:
24
+ `success`, `failure`, `cancelled`, `skipped`.
25
+ - `steps.<id>.conclusion` — the final result AFTER `continue-on-error` is applied. When
26
+ `continue-on-error: true` and the step fails, `conclusion` is `success` (not `failure`).
27
+
28
+ When a step has `continue-on-error: true` set, a step failure does NOT propagate to
29
+ `conclusion`. Developers who write:
30
+
31
+ if: steps.my-step.conclusion == 'failure'
32
+
33
+ expecting to detect when `my-step` failed will find that this condition is NEVER true — even
34
+ when the step actually failed — because `continue-on-error` overwrites the conclusion to
35
+ `success`. The downstream step silently never runs.
36
+
37
+ This commonly affects:
38
+ - Cleanup steps that should run when a flaky test step fails (continue-on-error: true)
39
+ - Notification steps that should alert on specific step failures in a pipeline
40
+ - Conditional logic that differentiates between "step was skipped" and "step failed"
41
+ fix: |
42
+ Use `steps.<id>.outcome` (not `conclusion`) to detect the raw result of a step that has
43
+ `continue-on-error: true`. The `outcome` property reflects the actual step result before
44
+ the error suppression is applied and correctly returns `failure` even when the final
45
+ conclusion is `success`.
46
+ fix_code:
47
+ - language: yaml
48
+ label: 'WRONG: conclusion is always success when continue-on-error is true — cleanup never runs'
49
+ code: |
50
+ steps:
51
+ - name: Run flaky tests
52
+ id: tests
53
+ continue-on-error: true
54
+ run: pytest tests/
55
+
56
+ - name: Send failure notification
57
+ # NEVER RUNS — conclusion is 'success' even when tests fail
58
+ if: steps.tests.conclusion == 'failure'
59
+ run: echo "Tests failed — notifying team"
60
+
61
+ - language: yaml
62
+ label: 'CORRECT: use outcome to detect the raw step result before continue-on-error'
63
+ code: |
64
+ steps:
65
+ - name: Run flaky tests
66
+ id: tests
67
+ continue-on-error: true
68
+ run: pytest tests/
69
+
70
+ - name: Send failure notification
71
+ # CORRECT — outcome reflects the raw result before continue-on-error override
72
+ if: steps.tests.outcome == 'failure'
73
+ run: echo "Tests failed — notifying team"
74
+
75
+ - name: Always-run cleanup
76
+ # For cleanup that must run regardless, use always() + outcome check
77
+ if: always() && steps.tests.outcome != 'success'
78
+ run: echo "Running cleanup after non-success outcome"
79
+ prevention:
80
+ - "When a step has continue-on-error: true, always use steps.<id>.outcome (not conclusion) to detect failures in downstream if conditions"
81
+ - "steps.<id>.conclusion == 'success' is always true when continue-on-error: true — it is safe for 'did this step not skip?' checks only"
82
+ - "The failure() status function is also bypassed by continue-on-error — use steps.<id>.outcome != 'success' instead"
83
+ - "Review GitHub Docs context reference table to understand outcome vs conclusion semantics before writing conditional cleanup steps"
84
+ docs:
85
+ - url: 'https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/accessing-contextual-information-about-workflow-runs#steps-context'
86
+ label: 'steps context — outcome vs conclusion properties with continue-on-error (GitHub Docs)'
87
+ - url: 'https://github.com/actions/runner/blob/main/docs/adrs/0274-step-outcome-and-conclusion.md'
88
+ label: 'actions/runner ADR: outcome vs conclusion design — why two separate properties exist'
89
+ - url: 'https://stackoverflow.com/questions/71433926/how-do-to-run-the-next-github-action-step-even-if-the-previous-step-failed-whil'
90
+ label: 'Stack Overflow: using steps.outcome vs steps.conclusion with continue-on-error'
@@ -0,0 +1,106 @@
1
+ id: triggers-049
2
+ title: 'on.release types: [published] fires for pre-release creation AND pre-release-to-full promotion — deploy workflows run twice'
3
+ category: triggers
4
+ severity: silent-failure
5
+ tags:
6
+ - release
7
+ - published
8
+ - prerelease
9
+ - on-release
10
+ - double-trigger
11
+ - deploy
12
+ patterns:
13
+ - regex: 'github\.event\.action.*prereleased'
14
+ flags: 'i'
15
+ - regex: 'github\.event\.release\.prerelease.*true'
16
+ flags: 'i'
17
+ error_messages:
18
+ - 'github.event.action: prereleased'
19
+ - 'github.event.action: released'
20
+ - 'github.event.release.prerelease: true'
21
+ root_cause: |
22
+ The GitHub `release` event supports multiple activity types: `created`, `published`,
23
+ `prereleased`, `released`, `edited`, `deleted`, and `unpublished`. The `published` type
24
+ is frequently misunderstood:
25
+
26
+ - `published` fires whenever ANY release is made public — this includes both pre-releases
27
+ (action=prereleased) and full releases (action=released). It is a superset, not a
28
+ specific activity type for "final" releases.
29
+
30
+ A typical release lifecycle that triggers `on.release.types: [published]` twice:
31
+ 1. Developer creates a pre-release (e.g., v1.2.0-rc.1) and clicks "Publish release"
32
+ → workflow fires (github.event.action=prereleased, github.event.release.prerelease=true)
33
+ 2. Developer edits the release and unchecks "Set as a pre-release" to promote it to a
34
+ full release → workflow fires again (github.event.action=released, github.event.release.prerelease=false)
35
+
36
+ Additionally, the GitHub docs note that `prereleased` does NOT fire for pre-releases
37
+ published from a draft release, but `published` DOES fire — creating another asymmetry.
38
+
39
+ Workflows using `on.release.types: [published]` for deployment, package publishing,
40
+ or Docker image tagging will run twice for the same version tag, potentially creating
41
+ duplicate deployments, duplicate npm/PyPI publishes, or conflicting artifact versions.
42
+ fix: |
43
+ For production deploy workflows that should only run on final (non-pre-release) releases,
44
+ add an `if:` condition to check `github.event.release.prerelease == false`. Alternatively,
45
+ use `types: [released]` — which fires only when a stable release is published directly
46
+ or when a pre-release is promoted to full release, but NOT on initial pre-release creation.
47
+
48
+ To target pre-releases explicitly, use `types: [prereleased]`, but note it does not fire
49
+ for pre-releases published from drafts (use `published` + `if: github.event.release.prerelease == true`
50
+ in that case).
51
+ fix_code:
52
+ - language: yaml
53
+ label: 'Guard with if condition to skip pre-release publishes'
54
+ code: |
55
+ on:
56
+ release:
57
+ types: [published]
58
+
59
+ jobs:
60
+ deploy:
61
+ runs-on: ubuntu-latest
62
+ # Only deploy for final (non-pre-release) releases
63
+ if: github.event.release.prerelease == false
64
+ steps:
65
+ - name: Deploy release
66
+ run: echo "Deploying ${{ github.event.release.tag_name }}"
67
+
68
+ - language: yaml
69
+ label: 'Use released type to target only final releases (not pre-release creation)'
70
+ code: |
71
+ on:
72
+ release:
73
+ # released: fires when a release is published as final, OR when a pre-release
74
+ # is promoted to a full release. Does NOT fire on initial pre-release creation.
75
+ types: [released]
76
+
77
+ jobs:
78
+ deploy:
79
+ runs-on: ubuntu-latest
80
+ steps:
81
+ - name: Deploy release
82
+ run: echo "Deploying ${{ github.event.release.tag_name }}"
83
+
84
+ - language: yaml
85
+ label: 'Log release event fields at the start of release workflows for debugging'
86
+ code: |
87
+ jobs:
88
+ release-info:
89
+ runs-on: ubuntu-latest
90
+ steps:
91
+ - name: Debug release event
92
+ run: |
93
+ echo "action: ${{ github.event.action }}"
94
+ echo "prerelease: ${{ github.event.release.prerelease }}"
95
+ echo "tag: ${{ github.event.release.tag_name }}"
96
+ echo "draft: ${{ github.event.release.draft }}"
97
+ prevention:
98
+ - "Prefer types: [released] over types: [published] for production deployment workflows"
99
+ - "Always guard release deploy steps with: if: github.event.release.prerelease == false"
100
+ - "Make deployment and publish workflows idempotent so accidental double-runs cannot cause irreversible side effects"
101
+ - "Log github.event.action and github.event.release.prerelease at workflow start when debugging unexpected runs"
102
+ docs:
103
+ - url: 'https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#release'
104
+ label: 'release event activity types — published fires for both prereleased and released (GitHub Docs)'
105
+ - url: 'https://stackoverflow.com/questions/78085080/how-to-limit-a-github-action-to-fire-only-once-on-a-release-trigger'
106
+ label: 'Stack Overflow: release action triggered 3 times for pre-release — limit using types and if conditions'
@@ -0,0 +1,97 @@
1
+ id: yaml-syntax-045
2
+ title: 'Using paths and paths-ignore together on the same event trigger causes a workflow validation error'
3
+ category: yaml-syntax
4
+ severity: error
5
+ tags:
6
+ - paths
7
+ - paths-ignore
8
+ - trigger-filter
9
+ - on-push
10
+ - validation-error
11
+ patterns:
12
+ - regex: "You can't use both 'paths' and 'paths-ignore'"
13
+ flags: 'i'
14
+ - regex: 'Invalid workflow file.*paths.*paths-ignore'
15
+ flags: 'i'
16
+ - regex: 'paths.*and.*paths-ignore.*cannot.*same event'
17
+ flags: 'i'
18
+ error_messages:
19
+ - "Invalid workflow file: You can't use both 'paths' and 'paths-ignore' for the same event trigger"
20
+ - "You can't use both 'paths' and 'paths-ignore' for the same event trigger"
21
+ - "Path and Path-ignore cannot be added in the same event"
22
+ root_cause: |
23
+ GitHub Actions enforces a mutual exclusivity rule: `paths` and `paths-ignore` cannot be
24
+ specified simultaneously for the same event trigger. The same rule applies to:
25
+ - `branches` and `branches-ignore`
26
+ - `tags` and `tags-ignore`
27
+
28
+ `paths` is an allowlist — the trigger only fires when at least one of the listed patterns
29
+ matches a changed file. `paths-ignore` is a denylist — the trigger is suppressed when ALL
30
+ changed files match patterns in the list. Because their semantics are complementary, GitHub
31
+ disallows combining them to avoid ambiguous filter behavior.
32
+
33
+ Attempting to use both results in a validation error at workflow parse time:
34
+ "Invalid workflow file: You can't use both 'paths' and 'paths-ignore' for the same event trigger"
35
+
36
+ Developers commonly hit this when they want to trigger on a specific directory but exclude
37
+ documentation or test-only changes within that directory, assuming both filters can be
38
+ stacked like CSS selectors.
39
+
40
+ Example of the problematic pattern:
41
+ on:
42
+ push:
43
+ paths:
44
+ - 'src/**'
45
+ paths-ignore: # INVALID: cannot combine with paths
46
+ - 'src/**/*.md'
47
+ fix: |
48
+ Use only one of `paths` or `paths-ignore`. To achieve both include and exclude behavior
49
+ within a single filter:
50
+ - Use the `paths` filter with `!` negation patterns to explicitly exclude paths from an
51
+ allowlist. List all positive patterns before negative patterns — order matters.
52
+ - Alternatively, use `paths-ignore` alone if you just need to exclude a small set of paths
53
+ and want the workflow to run for everything else.
54
+ fix_code:
55
+ - language: yaml
56
+ label: 'WRONG: paths and paths-ignore combined (validation error)'
57
+ code: |
58
+ # This is INVALID — causes "You can't use both" validation error
59
+ on:
60
+ push:
61
+ paths:
62
+ - 'src/**'
63
+ paths-ignore:
64
+ - 'src/**/*.md'
65
+
66
+ - language: yaml
67
+ label: 'CORRECT: use paths with negation pattern to exclude within an allowlist'
68
+ code: |
69
+ # Use ! negation in paths to exclude specific sub-paths from the allowlist
70
+ on:
71
+ push:
72
+ paths:
73
+ - 'src/**' # include all changes under src/
74
+ - '!src/**/*.md' # but exclude markdown files within src/
75
+
76
+ - language: yaml
77
+ label: 'CORRECT: use only paths-ignore to suppress trigger for specific paths'
78
+ code: |
79
+ # If the workflow should run for everything EXCEPT docs, use paths-ignore alone
80
+ on:
81
+ push:
82
+ paths-ignore:
83
+ - 'docs/**'
84
+ - '**/*.md'
85
+ - '**/*.txt'
86
+ prevention:
87
+ - "Never combine paths with paths-ignore (or branches/branches-ignore, or tags/tags-ignore) for the same event"
88
+ - "To include a directory but exclude sub-paths: use paths with ! negation entries"
89
+ - "Use actionlint to validate workflow YAML locally before pushing — it catches this misconfiguration"
90
+ - "The same mutual exclusivity rule applies to branches/branches-ignore and tags/tags-ignore"
91
+ docs:
92
+ - url: 'https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpaths'
93
+ label: 'on.push.paths — cannot be used with paths-ignore for the same event (GitHub Docs)'
94
+ - url: 'https://stackoverflow.com/questions/64896276/github-action-trigger-pipeline-for-root-folder-except-one-sub-folder'
95
+ label: 'Stack Overflow: "Path and Path-ignore cannot be added in the same event" — use ! negation in paths instead'
96
+ - url: 'https://github.com/rhysd/actionlint'
97
+ label: 'actionlint — static checker for GitHub Actions workflow files'
@@ -0,0 +1,135 @@
1
+ id: yaml-syntax-046
2
+ title: 'on.schedule timezone field causes actionlint and third-party parsers to report "expected cron key" syntax error'
3
+ category: yaml-syntax
4
+ severity: warning
5
+ tags:
6
+ - schedule
7
+ - cron
8
+ - timezone
9
+ - actionlint
10
+ - linting
11
+ - scorecard-action
12
+ patterns:
13
+ - regex: 'expected "cron" key for element of "schedule" section but got "timezone"'
14
+ flags: 'i'
15
+ - regex: 'unable to parse github workflow.*timezone'
16
+ flags: 'i'
17
+ - regex: 'workflow verification failed.*timezone.*syntax-check'
18
+ flags: 'i'
19
+ - regex: '\[syntax-check\].*timezone'
20
+ flags: 'i'
21
+ error_messages:
22
+ - 'expected "cron" key for element of "schedule" section but got "timezone" [syntax-check]'
23
+ - 'error sending scorecard results to webapp: http response 400, status: 400 Bad Request, error: {"code":400,"message":"workflow verification failed: unable to parse github workflow: [:9:7: expected \"cron\" key for element of \"schedule\" section but got \"timezone\" [syntax-check]]"}'
24
+ - 'on.schedule[0]: unexpected key "timezone"'
25
+ root_cause: |
26
+ GitHub Actions added IANA timezone support for scheduled workflows in March 2026
27
+ (announced in the Late March 2026 changelog). The new syntax allows specifying a timezone
28
+ alongside the cron expression:
29
+
30
+ on:
31
+ schedule:
32
+ - cron: '30 5 * * 1-5'
33
+ timezone: "America/New_York"
34
+
35
+ However, this feature was not immediately recognized by external workflow-parsing tools:
36
+
37
+ 1. **actionlint** — The widely-used GitHub Actions linting tool (used in many CI pipelines
38
+ as a pre-commit or CI check) did not support the timezone key until version 0.7.4
39
+ (released March 30, 2026). Earlier versions report the error:
40
+ expected "cron" key for element of "schedule" section but got "timezone" [syntax-check]
41
+ This causes actionlint-based CI checks to fail even though the workflow is valid.
42
+
43
+ 2. **ossf/scorecard-action** — The OpenSSF Scorecard action verifies workflow structure
44
+ using an internal parser that did not recognize the timezone key. When scorecard-action
45
+ runs on a workflow that contains `timezone:`, it returns HTTP 400 from the Scorecard API:
46
+ workflow verification failed: unable to parse github workflow: [...timezone [syntax-check]]
47
+ This causes the scorecard CI job to fail on otherwise-valid workflows.
48
+
49
+ 3. **GitHub VS Code extension** — The vscode-github-actions extension (v0.29.1 and earlier)
50
+ marks timezone as an "unexpected value" in the schema validation overlay, producing
51
+ squiggly underlines even though the workflow runs correctly.
52
+
53
+ The root issue is that the new timezone key was added to GitHub's workflow syntax faster
54
+ than third-party tooling could update their schema definitions.
55
+ fix: |
56
+ Upgrade the affected tools to versions that support the timezone key:
57
+
58
+ 1. **actionlint**: Upgrade to version 0.7.4 or later. Pin the actionlint version in your
59
+ CI workflow to avoid surprise failures on future schema changes.
60
+
61
+ 2. **ossf/scorecard-action**: Upgrade to the latest version. The Scorecard API was updated
62
+ to recognize the timezone key. If you cannot upgrade, temporarily remove the timezone
63
+ field from your schedule — or use the @latest tag to stay on the most recent release.
64
+
65
+ 3. **GitHub VS Code extension**: Upgrade to the latest version from the VS Code marketplace.
66
+ The false-positive schema warning has no runtime effect and does not affect workflow
67
+ execution.
68
+
69
+ If you are blocked from upgrading tools (e.g., in a corporate environment), you can work
70
+ around the linting error by keeping the cron in UTC and removing the timezone field,
71
+ adjusting the cron expression offset manually for the desired local time.
72
+ fix_code:
73
+ - language: yaml
74
+ label: 'Pin actionlint to v0.7.4+ in CI to support the timezone key'
75
+ code: |
76
+ jobs:
77
+ lint:
78
+ runs-on: ubuntu-latest
79
+ steps:
80
+ - uses: actions/checkout@v4
81
+
82
+ # Pin actionlint to v0.7.4+ which supports timezone in on.schedule
83
+ - name: Lint GitHub Actions workflows
84
+ uses: rhysd/actionlint@v0.7.4
85
+ with:
86
+ shellcheck: 'false'
87
+
88
+ - language: yaml
89
+ label: 'Valid on.schedule with timezone (requires actionlint 0.7.4+ and updated scorecard-action)'
90
+ code: |
91
+ on:
92
+ schedule:
93
+ # Run at 9 AM Eastern (UTC-5 in winter, UTC-4 in summer)
94
+ # With timezone support: specify local time directly
95
+ - cron: '0 9 * * 1-5'
96
+ timezone: "America/New_York"
97
+
98
+ jobs:
99
+ scheduled-job:
100
+ runs-on: ubuntu-latest
101
+ steps:
102
+ - uses: actions/checkout@v4
103
+ - run: echo "Running at 9 AM Eastern"
104
+
105
+ - language: yaml
106
+ label: 'Workaround — use UTC offset in cron expression (no timezone key, works with all tool versions)'
107
+ code: |
108
+ on:
109
+ schedule:
110
+ # 9 AM Eastern Standard Time = 14:00 UTC (winter)
111
+ # Adjust manually for DST when needed
112
+ - cron: '0 14 * * 1-5'
113
+
114
+ jobs:
115
+ scheduled-job:
116
+ runs-on: ubuntu-latest
117
+ steps:
118
+ - uses: actions/checkout@v4
119
+ - run: echo "Running at approximately 9 AM Eastern"
120
+ prevention:
121
+ - 'When adopting new GitHub Actions syntax features, check that your CI linting tools (actionlint, mega-linter, super-linter) support the new key before adding it to workflows'
122
+ - 'Pin actionlint to a specific version in CI and bump intentionally — use rhysd/actionlint@v0.7.4 or later for timezone support'
123
+ - 'The vscode-github-actions extension schema squiggly-underline for "timezone" is cosmetic only — the workflow runs correctly on GitHub regardless'
124
+ - 'If using ossf/scorecard-action, always pin to a tagged release rather than @main to avoid unexpected parser failures from scorecard API schema changes'
125
+ docs:
126
+ - url: 'https://github.blog/changelog/2026-03-19-github-actions-late-march-2026-updates/#github-actions-timezone-support-for-scheduled-workflows'
127
+ label: 'GitHub Changelog: Timezone support for scheduled workflows (March 2026)'
128
+ - url: 'https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#onschedule'
129
+ label: 'GitHub Docs: on.schedule syntax including timezone field'
130
+ - url: 'https://github.com/rhysd/actionlint/issues/638'
131
+ label: 'actionlint #638 — Add support for timezone for schedule triggers (13 reactions, fixed in 0.7.4)'
132
+ - url: 'https://github.com/ossf/scorecard-action/issues/1645'
133
+ label: 'scorecard-action #1645 — Upload fails if schedule:timezone is used in a workflow'
134
+ - url: 'https://github.com/github/vscode-github-actions/issues/577'
135
+ label: 'vscode-github-actions #577 — schedule timezone marked as unknown in VS Code extension'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@htekdev/actions-debugger",
3
- "version": "1.0.69",
3
+ "version": "1.0.71",
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",