@htekdev/actions-debugger 1.0.66 → 1.0.67

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,73 @@
1
+ id: known-unsolved-042
2
+ title: 'Job queues indefinitely when no self-hosted runner matches labels — no automatic queue-wait timeout'
3
+ category: known-unsolved
4
+ severity: limitation
5
+ tags:
6
+ - self-hosted
7
+ - queued
8
+ - runner-labels
9
+ - timeout
10
+ - stuck-job
11
+ patterns:
12
+ - regex: 'Waiting for a runner to pick up this job'
13
+ flags: 'i'
14
+ - regex: 'Job is waiting for a hosted runner to come online'
15
+ flags: 'i'
16
+ error_messages:
17
+ - 'Waiting for a runner to pick up this job'
18
+ - 'Job is waiting for a hosted runner to come online'
19
+ root_cause: |
20
+ When a job specifies runs-on: self-hosted (or a label array containing self-hosted),
21
+ GitHub places the job in a queue and waits for a matching runner to become available.
22
+ If no registered runner matches all required labels — because the runner is offline,
23
+ deregistered, at capacity, or the labels are mistyped — the job remains in "Queued"
24
+ state indefinitely with the message "Waiting for a runner to pick up this job."
25
+
26
+ GitHub does not apply an automatic queue-wait timeout. The only enforced limit is the
27
+ overall workflow timeout-minutes (default 360 minutes, maximum 35 days for self-hosted
28
+ runners). Runner labels are matched case-sensitively, so [self-hosted, Linux] does not
29
+ match a runner registered as [self-hosted, linux].
30
+
31
+ This is a recurring GitHub Community request: developers frequently discover queued jobs
32
+ hours or days later after expecting fast CI feedback.
33
+ fix: |
34
+ There is no GitHub-native queue-wait timeout distinct from job runtime. Mitigations:
35
+ 1. Add timeout-minutes at the job level to cap total job time including queue wait
36
+ 2. Verify runner label spellings exactly match labels registered on the runner
37
+ (Settings → Actions → Runners shows registered labels)
38
+ 3. Ensure at least one runner with all required labels is online and idle
39
+ 4. Use ephemeral (JIT) runners with auto-scaling to prevent capacity exhaustion
40
+ fix_code:
41
+ - language: yaml
42
+ label: 'Add timeout-minutes to fail fast when no runner is available'
43
+ code: |
44
+ jobs:
45
+ build:
46
+ runs-on: [self-hosted, linux, x64]
47
+ timeout-minutes: 30 # job fails if no runner picks it up within 30 minutes
48
+ steps:
49
+ - uses: actions/checkout@v4
50
+ - run: make build
51
+ - language: yaml
52
+ label: 'Fallback to GitHub-hosted runner when self-hosted is unavailable'
53
+ code: |
54
+ jobs:
55
+ build:
56
+ runs-on: ${{ vars.USE_SELF_HOSTED == 'true' && fromJSON('["self-hosted","linux","x64"]') || 'ubuntu-latest' }}
57
+ timeout-minutes: 60
58
+ steps:
59
+ - uses: actions/checkout@v4
60
+ - run: make build
61
+ prevention:
62
+ - 'Always set timeout-minutes on self-hosted runner jobs to prevent indefinite queuing'
63
+ - 'Verify runner labels match exactly — labels are case-sensitive (Linux vs linux)'
64
+ - 'Monitor runner pool health at Settings → Actions → Runners and alert on all-offline conditions'
65
+ - 'Use ephemeral (JIT) runners with auto-scaling to ensure available capacity on demand'
66
+ - 'Consider GitHub-hosted runner fallback for critical workflows'
67
+ docs:
68
+ - url: 'https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners#self-hosted-runner-labels'
69
+ label: 'Self-hosted runner labels — GitHub Docs'
70
+ - url: 'https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes'
71
+ label: 'jobs.<job>.timeout-minutes — GitHub Docs'
72
+ - url: 'https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/autoscaling-with-self-hosted-runners'
73
+ label: 'Autoscaling with self-hosted runners — GitHub Docs'
@@ -0,0 +1,62 @@
1
+ id: silent-failures-066
2
+ title: 'ACTIONS_RUNNER_DEBUG and ACTIONS_STEP_DEBUG must be repository secrets, not variables'
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - debug-logging
7
+ - ACTIONS_RUNNER_DEBUG
8
+ - ACTIONS_STEP_DEBUG
9
+ - secrets
10
+ - variables
11
+ - troubleshooting
12
+ patterns:
13
+ - regex: 'ACTIONS_RUNNER_DEBUG|ACTIONS_STEP_DEBUG'
14
+ flags: 'i'
15
+ error_messages:
16
+ - 'No additional debug output despite ACTIONS_RUNNER_DEBUG=true'
17
+ - 'Debug logging not enabled even though variable is set to true'
18
+ root_cause: |
19
+ GitHub Actions checks ACTIONS_RUNNER_DEBUG and ACTIONS_STEP_DEBUG only when they are
20
+ set as repository or organization secrets. Setting them as repository variables
21
+ (Settings → Secrets and variables → Actions → Variables tab) has no effect whatsoever.
22
+ The runner bootstrap reads debug flags from the secrets store before variable contexts
23
+ are available, so a vars.ACTIONS_RUNNER_DEBUG reference inside the workflow YAML is
24
+ also ineffective. No warning is emitted when the variable exists but the corresponding
25
+ secret does not — the runner simply operates in non-debug mode silently.
26
+ fix: |
27
+ Set ACTIONS_RUNNER_DEBUG and/or ACTIONS_STEP_DEBUG as repository secrets (not variables)
28
+ with the value "true":
29
+
30
+ Settings → Secrets and variables → Actions → Secrets tab → New repository secret
31
+ Name: ACTIONS_RUNNER_DEBUG
32
+ Value: true
33
+
34
+ Alternatively, use the "Re-run jobs" UI button and check "Enable debug logging" for a
35
+ one-time debug run without creating a permanent secret.
36
+ fix_code:
37
+ - language: yaml
38
+ label: 'Debug flags require repository secrets — no workflow YAML change needed'
39
+ code: |
40
+ # Create these as repository SECRETS (not Variables):
41
+ # ACTIONS_RUNNER_DEBUG = true (verbose runner diagnostic logs)
42
+ # ACTIONS_STEP_DEBUG = true (verbose step-level output including set-output calls)
43
+ #
44
+ # Setting them under the Variables tab has NO effect.
45
+ # For one-off debugging use "Re-run jobs" → check "Enable debug logging".
46
+
47
+ jobs:
48
+ build:
49
+ runs-on: ubuntu-latest
50
+ steps:
51
+ - uses: actions/checkout@v4
52
+ - run: echo "Runner debug active when ACTIONS_RUNNER_DEBUG secret = true"
53
+ prevention:
54
+ - 'Set ACTIONS_RUNNER_DEBUG and ACTIONS_STEP_DEBUG as Secrets, not Variables'
55
+ - 'Use the Re-run with debug logging checkbox for temporary one-off debugging'
56
+ - 'Check the Secrets tab — not the Variables tab — under Settings → Secrets and variables → Actions'
57
+ - 'Remember: debug flags are read during runner bootstrap before the vars context is available'
58
+ docs:
59
+ - url: 'https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/troubleshooting-workflows/enabling-debug-logging'
60
+ label: 'Enabling debug logging — GitHub Docs'
61
+ - url: 'https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions'
62
+ label: 'Using secrets in GitHub Actions — GitHub Docs'
@@ -0,0 +1,80 @@
1
+ id: silent-failures-067
2
+ title: 'working-directory on a uses: step is silently ignored — only applies to run: steps'
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - working-directory
7
+ - uses
8
+ - composite-action
9
+ - run
10
+ - path
11
+ - configuration
12
+ patterns:
13
+ - regex: 'Error.*ENOENT.*no such file or directory'
14
+ flags: 'i'
15
+ - regex: 'No such file or directory'
16
+ flags: 'i'
17
+ error_messages:
18
+ - 'Action runs from workspace root instead of specified working-directory'
19
+ - 'ENOENT: no such file or directory — action ignoring working-directory set on uses: step'
20
+ root_cause: |
21
+ The step-level working-directory property only affects run: steps that execute shell
22
+ commands. Steps that use the uses: keyword to invoke an action — whether a JavaScript
23
+ action, Docker action, or composite action — silently ignore working-directory. The
24
+ property is discarded with no warning logged. The action runs from GITHUB_WORKSPACE
25
+ (the repository root) or from the action's own directory, not the directory specified
26
+ on the step.
27
+
28
+ This is a documented GitHub Actions limitation that surprises many developers who expect
29
+ working-directory to behave like a cd command applied to the entire step, regardless of
30
+ step type. It is one of the most common "action runs in wrong directory" reports on GitHub
31
+ Community Discussions.
32
+ fix: |
33
+ Pass the desired directory as an explicit input to the action. For run: steps in the same
34
+ job, use defaults.run.working-directory at the job level. Do not set working-directory on
35
+ uses: steps — it is silently discarded.
36
+ fix_code:
37
+ - language: yaml
38
+ label: 'Use job-level defaults.run for run steps; pass input for uses steps'
39
+ code: |
40
+ jobs:
41
+ build:
42
+ runs-on: ubuntu-latest
43
+ defaults:
44
+ run:
45
+ working-directory: ./packages/my-app # applies to all run: steps only
46
+
47
+ steps:
48
+ - uses: actions/checkout@v4
49
+
50
+ - run: npm install # runs in ./packages/my-app ✓
51
+
52
+ # For uses: steps, pass the directory as an explicit action input:
53
+ - uses: ./.github/actions/my-action
54
+ with:
55
+ working-directory: ./packages/my-app # action must accept this input
56
+ - language: yaml
57
+ label: 'Composite action: declare working-directory as an input'
58
+ code: |
59
+ # In .github/actions/my-action/action.yml:
60
+ inputs:
61
+ working-directory:
62
+ description: 'Directory to run in'
63
+ default: '.'
64
+ runs:
65
+ using: composite
66
+ steps:
67
+ - run: npm test
68
+ shell: bash
69
+ working-directory: ${{ inputs.working-directory }}
70
+ prevention:
71
+ - 'Never set working-directory on steps that use uses: — it is silently ignored'
72
+ - 'For composite actions that need a target directory, declare an explicit working-directory input'
73
+ - 'Use defaults.run.working-directory at job level to apply a directory to all run: steps'
74
+ docs:
75
+ - url: 'https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsworking-directory'
76
+ label: 'steps[*].working-directory — GitHub Docs'
77
+ - url: 'https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#defaultsrun'
78
+ label: 'defaults.run — GitHub Docs'
79
+ - url: 'https://docs.github.com/en/actions/sharing-automations/creating-actions/creating-a-composite-action'
80
+ label: 'Creating a composite action — GitHub Docs'
@@ -0,0 +1,58 @@
1
+ id: triggers-047
2
+ title: 'pull_request default types exclude ready_for_review — draft-to-ready conversion skips CI'
3
+ category: triggers
4
+ severity: warning
5
+ tags:
6
+ - pull_request
7
+ - draft
8
+ - ready_for_review
9
+ - types
10
+ - required-status-checks
11
+ patterns:
12
+ - regex: 'on:\s*\n\s*pull_request\s*:'
13
+ flags: 'im'
14
+ - regex: 'pull_request\s*:\s*\n(?!\s*types)'
15
+ flags: 'im'
16
+ error_messages:
17
+ - 'CI not triggered after converting draft pull request to ready for review'
18
+ - 'Required status check never ran after marking PR ready — branch protection blocking merge'
19
+ root_cause: |
20
+ The pull_request event with no explicit types: list defaults to the activity types
21
+ [opened, synchronize, reopened]. When a contributor converts a draft PR to ready
22
+ for review, GitHub fires the ready_for_review activity type, which is absent from
23
+ the default set. The workflow never executes for this state transition, leaving the
24
+ PR without the required CI status checks. Branch protection rules then block merging
25
+ until the next push re-triggers CI.
26
+
27
+ This is one of the most frequently reported CI surprises in GitHub Community discussions,
28
+ particularly for teams that rely on draft PRs for work-in-progress reviews.
29
+ fix: |
30
+ Explicitly declare the types list on the pull_request trigger and add ready_for_review:
31
+ fix_code:
32
+ - language: yaml
33
+ label: 'Add ready_for_review to pull_request types'
34
+ code: |
35
+ on:
36
+ pull_request:
37
+ types:
38
+ - opened
39
+ - synchronize
40
+ - reopened
41
+ - ready_for_review # fires when a draft PR is marked ready for review
42
+
43
+ jobs:
44
+ ci:
45
+ runs-on: ubuntu-latest
46
+ steps:
47
+ - uses: actions/checkout@v4
48
+ - run: npm test
49
+ prevention:
50
+ - 'Always explicitly list pull_request types when your team uses draft PRs'
51
+ - 'Add ready_for_review when branch protection requires CI to pass before merge'
52
+ - 'Include converted_to_draft to re-trigger (or block) CI when PRs return to draft'
53
+ - 'Review required status check names after adding new trigger types to confirm they register'
54
+ docs:
55
+ - url: 'https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#pull_request'
56
+ label: 'pull_request event types — GitHub Docs'
57
+ - url: 'https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-stage-of-a-pull-request'
58
+ label: 'Changing the stage of a pull request — GitHub Docs'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@htekdev/actions-debugger",
3
- "version": "1.0.66",
3
+ "version": "1.0.67",
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",