@htekdev/actions-debugger 1.0.33 → 1.0.34

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,115 @@
1
+ id: 'known-unsolved-031'
2
+ title: 'Pushing more than 3 tags simultaneously silently drops workflow runs for excess tags — GitHub platform limit'
3
+ category: known-unsolved
4
+ severity: silent-failure
5
+ tags:
6
+ - push
7
+ - tags
8
+ - bulk-push
9
+ - webhook
10
+ - workflow-trigger
11
+ - limitation
12
+ - monorepo
13
+ patterns:
14
+ - regex: 'push\s+--tags'
15
+ flags: 'i'
16
+ - regex: 'on:\s*\n\s*push:\s*\n\s*tags:'
17
+ flags: 'im'
18
+ error_messages:
19
+ - 'No workflow runs created for some tags in bulk tag push'
20
+ root_cause: |
21
+ GitHub's webhook delivery system has a documented hard limit: when more than 3 tags
22
+ are pushed simultaneously in a single push operation, push webhook events are only
23
+ created for the first 3 matching tags. Workflows for the remaining tags are silently
24
+ never triggered — no warning, no error, no failed run.
25
+
26
+ From the GitHub webhook events and payloads documentation:
27
+ "Events will not be created for tags when more than three tags are pushed at once."
28
+ (A similar limit of 5000 applies to branch pushes in a single operation, making the
29
+ 3-tag threshold unexpectedly low by comparison.)
30
+
31
+ This is a platform-level constraint with no opt-out or configuration setting.
32
+
33
+ Common use cases affected:
34
+ - Monorepo release pipelines that tag multiple packages simultaneously
35
+ (e.g., package-a/v1.2.0, package-b/v1.0.0, package-c/v2.0.0, package-d/v0.5.0)
36
+ - Automated tooling that creates and pushes several version tags in one batch
37
+ - Release scripts using bulk push operations after creating several release tags
38
+ - Any CI pipeline where batch tagging is a normal part of the release flow
39
+
40
+ Source: actions/runner#3644 (7 reactions, Jan 2025, open), GitHub Docs push event.
41
+ fix: |
42
+ No native fix — the 3-tag limit is a GitHub platform constraint. Workarounds:
43
+
44
+ Option 1: Push tags individually one at a time in a loop (slower but reliable).
45
+
46
+ Option 2: After a bulk tag operation, use the GitHub CLI to manually trigger
47
+ workflows for the tags that were silently skipped:
48
+ gh workflow run release.yml --ref tag-name
49
+
50
+ Option 3 (recommended for monorepos): Switch from push:tags triggered workflows to
51
+ repository_dispatch triggered release workflows. Use a coordination script that
52
+ pushes tags and then dispatches one workflow event per tag. This removes the
53
+ 3-tag webhook constraint entirely.
54
+
55
+ Option 4: Use workflow_dispatch with a tag name input parameter and invoke it once
56
+ per tag from a release coordination script.
57
+ fix_code:
58
+ - language: yaml
59
+ label: 'repository_dispatch-based release trigger bypassing the 3-tag limit'
60
+ code: |
61
+ # Release coordination script (run in CI or locally):
62
+ #
63
+ # For each tag you want to release, dispatch a repository_dispatch event:
64
+ #
65
+ # for tag in package-a/v1.2.0 package-b/v1.0.0 package-c/v2.0.0; do
66
+ # gh api repos/{owner}/{repo}/dispatches \
67
+ # --field event_type=release \
68
+ # --field "client_payload[tag]=$tag"
69
+ # done
70
+
71
+ # Workflow triggered per tag via repository_dispatch:
72
+ on:
73
+ repository_dispatch:
74
+ types: [release]
75
+
76
+ jobs:
77
+ release:
78
+ runs-on: ubuntu-latest
79
+ steps:
80
+ - uses: actions/checkout@v4
81
+ with:
82
+ ref: ${{ github.event.client_payload.tag }}
83
+
84
+ - name: Build and publish
85
+ run: |
86
+ echo "Releasing ${{ github.event.client_payload.tag }}"
87
+ # add actual release steps here
88
+ - language: yaml
89
+ label: 'workflow_dispatch with tag input — invoke once per tag from release script'
90
+ code: |
91
+ on:
92
+ workflow_dispatch:
93
+ inputs:
94
+ tag:
95
+ description: 'Tag to release (e.g. package-a/v1.2.0)'
96
+ required: true
97
+ type: string
98
+
99
+ jobs:
100
+ release:
101
+ runs-on: ubuntu-latest
102
+ steps:
103
+ - uses: actions/checkout@v4
104
+ with:
105
+ ref: ${{ inputs.tag }}
106
+ - run: echo "Releasing ${{ inputs.tag }}"
107
+ prevention:
108
+ - 'Never rely on bulk push operations to trigger per-tag workflows in monorepos — push tags individually or use repository_dispatch/workflow_dispatch patterns'
109
+ - 'Audit your release pipeline: if bulk tag operations are used and more than 3 tags are pushed at once, some workflow runs are silently missing'
110
+ - 'Add a post-release verification step that confirms a workflow run exists for each expected tag, alerting if any are missing'
111
+ docs:
112
+ - url: 'https://docs.github.com/en/webhooks/webhook-events-and-payloads#push'
113
+ label: 'GitHub Docs: push webhook — 3-tag limit for simultaneous bulk tag pushes'
114
+ - url: 'https://github.com/actions/runner/issues/3644'
115
+ label: 'actions/runner#3644: Workflow fails to trigger on multiple tags push simultaneously (Jan 2025, open)'
@@ -0,0 +1,104 @@
1
+ id: 'runner-environment-089'
2
+ title: '`actions/checkout` leaves repository in detached HEAD state — subsequent `push` operations fail with "You are not currently on a branch"'
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - checkout
7
+ - detached-head
8
+ - push
9
+ - pull-request
10
+ - branch
11
+ - git-operations
12
+ patterns:
13
+ - regex: 'fatal: You are not currently on a branch\.'
14
+ flags: 'i'
15
+ - regex: 'To push the history leading to the current \(detached HEAD\)'
16
+ flags: 'i'
17
+ - regex: 'detached HEAD.*\d+\].*fatal'
18
+ flags: 'i'
19
+ error_messages:
20
+ - 'fatal: You are not currently on a branch.'
21
+ - 'To push the history leading to the current (detached HEAD) state now, use'
22
+ - ' git push origin HEAD:<name-of-remote-branch>'
23
+ - 'Process completed with exit code 128.'
24
+ root_cause: |
25
+ actions/checkout performs a detached HEAD checkout by default for pull_request events.
26
+ For pull_request triggers, GitHub provides a synthetic merge ref
27
+ (refs/pull/N/merge) rather than a real branch ref, so the action checks out
28
+ this merge commit without creating or tracking a local branch.
29
+
30
+ When subsequent workflow steps attempt to commit and push changes back to the
31
+ repository — for example, auto-formatting, documentation builds, coverage report
32
+ generation, or generated file updates — the operation fails because no remote
33
+ branch can be determined from a detached HEAD state.
34
+
35
+ This affects any workflow step that:
36
+ - Runs push operations after making commits in the workflow
37
+ - Uses tools that internally run push operations (e.g., auto-commit, changelog tools,
38
+ version bumpers)
39
+ - Expects to push back to the PR branch after making modifications
40
+
41
+ On push events, the checkout is also detached if ref: is not specified with the
42
+ branch name, because the default ref is github.sha (a commit SHA, not a branch name).
43
+
44
+ Tracked: actions/checkout#317 (44 reactions, ongoing since 2020, still receiving
45
+ comments in 2025).
46
+ fix: |
47
+ Specify ref: in the checkout step to check out the branch name rather than a
48
+ commit SHA or merge ref. Once on a named branch, push-back operations work normally.
49
+
50
+ For pull_request events: use github.event.pull_request.head.ref
51
+ For push events: use github.ref_name (available since Runner 2.294.0)
52
+ For workflows triggered by multiple event types: branch the ref selection by
53
+ event name as shown in the third example below.
54
+ fix_code:
55
+ - language: yaml
56
+ label: 'Fix for pull_request-triggered workflows that push back to the PR branch'
57
+ code: |
58
+ jobs:
59
+ build:
60
+ runs-on: ubuntu-latest
61
+ steps:
62
+ - uses: actions/checkout@v4
63
+ with:
64
+ # Check out the actual PR branch, not the detached merge ref
65
+ ref: ${{ github.event.pull_request.head.ref }}
66
+ - language: yaml
67
+ label: 'Fix for push-triggered workflows that commit and push back'
68
+ code: |
69
+ jobs:
70
+ build:
71
+ runs-on: ubuntu-latest
72
+ steps:
73
+ - uses: actions/checkout@v4
74
+ with:
75
+ # Checks out the branch name (e.g. main) instead of the commit SHA
76
+ ref: ${{ github.ref_name }}
77
+ - language: yaml
78
+ label: 'Universal fix for workflows triggered by multiple event types'
79
+ code: |
80
+ jobs:
81
+ build:
82
+ runs-on: ubuntu-latest
83
+ steps:
84
+ - name: Checkout (pull_request)
85
+ if: github.event_name == 'pull_request'
86
+ uses: actions/checkout@v4
87
+ with:
88
+ ref: ${{ github.event.pull_request.head.ref }}
89
+
90
+ - name: Checkout (push or workflow_dispatch)
91
+ if: github.event_name != 'pull_request'
92
+ uses: actions/checkout@v4
93
+ with:
94
+ ref: ${{ github.ref_name }}
95
+ prevention:
96
+ - 'Always specify ref: in checkout steps for workflows that push changes back to the repository'
97
+ - 'Use github.ref_name (not github.sha) for push-triggered workflows to get the branch name rather than a detached commit SHA'
98
+ - 'Test push-back workflows on both pull_request and push triggers to detect detached HEAD issues before they reach production'
99
+ - 'If using actions/checkout@v4, prefer explicit ref: values over relying on defaults when the workflow modifies and pushes files'
100
+ docs:
101
+ - url: 'https://github.com/actions/checkout/issues/317'
102
+ label: 'actions/checkout#317: fatal: You are not currently on a branch (44 reactions, 2020–2025)'
103
+ - url: 'https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#pull_request'
104
+ label: 'GitHub Docs: pull_request event — uses synthetic merge ref by default'
@@ -0,0 +1,115 @@
1
+ id: 'silent-failures-040'
2
+ title: '`actions/cache/restore` `fail-on-cache-miss: true` silently does not halt the workflow in v3.3.2–v3.3.3 — subsequent steps execute despite cache miss'
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - cache
7
+ - fail-on-cache-miss
8
+ - cache-restore
9
+ - silent-failure
10
+ - regression
11
+ - cache-v3
12
+ - cache-v4
13
+ patterns:
14
+ - regex: 'Failed to restore cache entry\. Exiting as fail-on-cache-miss is set\.'
15
+ flags: 'i'
16
+ - regex: 'fail-on-cache-miss.*true'
17
+ flags: 'i'
18
+ error_messages:
19
+ - 'Error: Failed to restore cache entry. Exiting as fail-on-cache-miss is set.'
20
+ - 'Warning: Cache not found for keys:'
21
+ root_cause: |
22
+ actions/cache@v3.3.2 and v3.3.3 contain a bug in the actions/cache/restore sub-action
23
+ where fail-on-cache-miss: true does not actually halt the workflow when no cache entry
24
+ is found.
25
+
26
+ The bug has two components (tracked in PR#1327):
27
+
28
+ 1. Logic error: restoreImpl.ts initializes earlyExit to undefined (falsy) regardless
29
+ of whether fail-on-cache-miss is set. The conditional `if (earlyExit)` check always
30
+ evaluates to false, so process.exit(1) is never called on a miss.
31
+
32
+ 2. Exit code conflict: even when process.exit(1) is called, it overwrites the exit
33
+ code previously set by core.setFailed(), causing the runner to record the step
34
+ outcome as 'success' despite the logged error message.
35
+
36
+ Observable behavior in affected versions:
37
+ - The step log shows: "Error: Failed to restore cache entry. Exiting as
38
+ fail-on-cache-miss is set."
39
+ - The step is marked with a red X in the UI but step.outcome is 'success'
40
+ - All subsequent steps execute normally as if no error occurred
41
+ - Jobs that should have stopped at the cache guard proceed to completion
42
+
43
+ This silently undermines workflows that use fail-on-cache-miss to enforce a
44
+ warm-cache-required pattern (e.g., a build artifact must exist from a prior job).
45
+
46
+ Fixed in: actions/cache@v3.3.4 and actions/cache@v4.0.2+ via PR#1327 (merged March 2024).
47
+ Affected: actions/cache@v3.3.2, v3.3.3 and the corresponding actions/cache/restore versions.
48
+
49
+ Source: actions/cache#1265 (11 reactions), actions/cache PR#1327 (merged March 2024).
50
+ fix: |
51
+ Option 1 (recommended): Update to actions/cache@v4 (v4.0.2+) or actions/cache@v3.3.4+
52
+ where the earlyExit logic and exit code handling are corrected.
53
+
54
+ Option 2: Roll back to actions/cache@v3.3.1 — the last version before the regression
55
+ was introduced.
56
+
57
+ Option 3 (belt-and-suspenders, any version): Add an explicit guard step after the
58
+ restore that checks the cache-hit output and exits manually. This works regardless
59
+ of the action version and is the most robust approach.
60
+ fix_code:
61
+ - language: yaml
62
+ label: 'Upgrade to fixed actions/cache version (v3.3.4+ or v4.0.2+)'
63
+ code: |
64
+ jobs:
65
+ downstream:
66
+ needs: build
67
+ runs-on: ubuntu-latest
68
+ steps:
69
+ - uses: actions/checkout@v4
70
+
71
+ # v4.0.2+ correctly fails the step AND stops the job on cache miss
72
+ - name: Restore build artifacts
73
+ uses: actions/cache/restore@v4
74
+ with:
75
+ path: dist/
76
+ key: build-${{ github.sha }}
77
+ fail-on-cache-miss: true
78
+
79
+ - name: Run tests against build
80
+ run: make test-dist
81
+ - language: yaml
82
+ label: 'Belt-and-suspenders explicit guard (works on all cache versions)'
83
+ code: |
84
+ jobs:
85
+ downstream:
86
+ needs: build
87
+ runs-on: ubuntu-latest
88
+ steps:
89
+ - uses: actions/checkout@v4
90
+
91
+ - name: Restore build artifacts
92
+ id: cache-restore
93
+ uses: actions/cache/restore@v4
94
+ with:
95
+ path: dist/
96
+ key: build-${{ github.sha }}
97
+ fail-on-cache-miss: false # Do not rely on this alone
98
+
99
+ - name: Abort if build cache missing
100
+ if: steps.cache-restore.outputs.cache-hit != 'true'
101
+ run: |
102
+ echo "::error::Build artifacts not found in cache — run the build job first."
103
+ exit 1
104
+
105
+ - name: Run tests against build
106
+ run: make test-dist
107
+ prevention:
108
+ - 'Pin actions/cache and actions/cache/restore to v3.3.4+ or v4.0.2+ when using fail-on-cache-miss'
109
+ - 'Add an explicit guard step checking steps.ID.outputs.cache-hit alongside fail-on-cache-miss for critical cache gates'
110
+ - 'Verify that a failed cache restore truly stops downstream steps by running a workflow with a known cache miss before relying on fail-on-cache-miss in production'
111
+ docs:
112
+ - url: 'https://github.com/actions/cache/issues/1265'
113
+ label: 'actions/cache#1265: fail-on-cache-miss not failing the workflow (11 reactions, Oct 2023)'
114
+ - url: 'https://github.com/actions/cache/pull/1327'
115
+ label: 'actions/cache PR#1327: Fix fail-on-cache-miss not working (merged March 2024)'
@@ -0,0 +1,101 @@
1
+ id: 'triggers-028'
2
+ title: 'Converting a draft PR to ready-for-review does not trigger `pull_request` workflow unless `ready_for_review` is explicitly listed in `types:`'
3
+ category: triggers
4
+ severity: silent-failure
5
+ tags:
6
+ - pull-request
7
+ - draft
8
+ - ready-for-review
9
+ - types
10
+ - trigger
11
+ - silent-failure
12
+ patterns:
13
+ - regex: 'ready_for_review'
14
+ flags: 'i'
15
+ - regex: 'pull_request\.draft\s*==\s*false'
16
+ flags: 'i'
17
+ error_messages:
18
+ - 'Workflow not triggered when draft PR converted to ready for review'
19
+ - 'No workflow runs appeared after marking PR as ready for review'
20
+ root_cause: |
21
+ GitHub fires a distinct pull_request event type — ready_for_review — when a draft PR
22
+ is converted to ready. This event type is NOT included in the default types list
23
+ of [opened, synchronize, reopened].
24
+
25
+ Two common misconfigured patterns that silently fail:
26
+
27
+ Pattern 1 — draft filter with default types:
28
+ A workflow uses `if: github.event.pull_request.draft == false` with default types.
29
+ The if: condition filters jobs correctly on synchronize/opened events, but the
30
+ ready_for_review conversion event is never fired because ready_for_review is not
31
+ in the types list. Result: a PR opened as draft, then converted to ready, will
32
+ never have had CI run against its commits.
33
+
34
+ Pattern 2 — only ready_for_review type:
35
+ A workflow lists only `types: [ready_for_review]`. This fires once when the draft
36
+ is converted, but never on subsequent commits to the PR (synchronize is not listed).
37
+
38
+ The correct pattern combines all four types AND adds the draft check condition so
39
+ that draft-state pushes are skipped while draft-to-ready conversion and subsequent
40
+ synchronize events all trigger the workflow.
41
+
42
+ Source: Stack Overflow #73948443 (score 8, 4,466 views), GitHub Docs pull_request
43
+ event types documentation.
44
+ fix: |
45
+ Combine all required event types including ready_for_review in the types: list, and
46
+ add a job-level if: condition to skip workflow runs while the PR is still in draft.
47
+
48
+ This ensures:
49
+ - Draft PRs do not run CI (filtered by the if: condition)
50
+ - Converting a draft to ready fires the workflow against the current HEAD commit
51
+ - Subsequent commits to a ready PR trigger the workflow via synchronize events
52
+ fix_code:
53
+ - language: yaml
54
+ label: 'Correct configuration: all four types plus draft guard condition'
55
+ code: |
56
+ on:
57
+ pull_request:
58
+ types:
59
+ - opened
60
+ - synchronize
61
+ - reopened
62
+ - ready_for_review # Must be explicit — not included in default types
63
+
64
+ jobs:
65
+ ci:
66
+ # Skip while PR is in draft state — fires for all non-draft PR events above
67
+ if: '! github.event.pull_request.draft'
68
+ runs-on: ubuntu-latest
69
+ steps:
70
+ - uses: actions/checkout@v4
71
+ - run: echo "CI running on non-draft PR"
72
+ - language: yaml
73
+ label: 'Alternative: run on all PR events, annotate draft runs as informational'
74
+ code: |
75
+ on:
76
+ pull_request:
77
+ types:
78
+ - opened
79
+ - synchronize
80
+ - reopened
81
+ - ready_for_review
82
+
83
+ jobs:
84
+ ci:
85
+ runs-on: ubuntu-latest
86
+ steps:
87
+ - name: Annotate draft status
88
+ if: github.event.pull_request.draft == true
89
+ run: echo "::notice::Running on draft PR — results are informational"
90
+
91
+ - uses: actions/checkout@v4
92
+ - run: make test
93
+ prevention:
94
+ - 'Always explicitly list all four pull_request types when your workflow must run on draft-to-ready conversions'
95
+ - 'Validate your trigger configuration by: opening a draft PR, pushing a commit to it, then converting to ready — all three events should behave as expected'
96
+ - 'Use github.event.pull_request.draft in job-level if: conditions rather than filtering by type alone, so the same workflow handles draft and non-draft PRs correctly'
97
+ docs:
98
+ - url: 'https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#pull_request'
99
+ label: 'GitHub Docs: pull_request event types including ready_for_review'
100
+ - url: 'https://stackoverflow.com/questions/73948443/github-actions-running-a-workflow-on-non-draft-prs'
101
+ label: 'Stack Overflow #73948443: Running a workflow on non-draft PRs (score 8, 4,466 views)'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@htekdev/actions-debugger",
3
- "version": "1.0.33",
3
+ "version": "1.0.34",
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",