@htekdev/actions-debugger 1.0.0 → 1.0.1

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.
Files changed (53) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +108 -108
  3. package/errors/_schema.json +89 -89
  4. package/errors/caching-artifacts/artifact-storage-quota-exceeded.yml +118 -0
  5. package/errors/caching-artifacts/cache-miss.yml +56 -56
  6. package/errors/caching-artifacts/cache-save-cancelled-job.yml +82 -0
  7. package/errors/caching-artifacts/cache-v3-to-v4-breaking-changes.yml +95 -0
  8. package/errors/caching-artifacts/cross-repo-artifacts-not-supported.yml +102 -0
  9. package/errors/caching-artifacts/upload-artifact-no-files-found.yml +92 -0
  10. package/errors/caching-artifacts/upload-artifact-v4-breaking.yml +67 -67
  11. package/errors/concurrency-timing/cancel-in-progress-deploy-drops.yml +97 -0
  12. package/errors/concurrency-timing/jobs-cancelled-unexpectedly.yml +60 -60
  13. package/errors/concurrency-timing/skipped-needs-cascade.yml +103 -0
  14. package/errors/concurrency-timing/workflow-run-conclusion-unchecked.yml +100 -0
  15. package/errors/known-unsolved/composite-input-env-vars-missing.yml +91 -0
  16. package/errors/known-unsolved/composite-nested-outputs-null.yml +101 -0
  17. package/errors/known-unsolved/no-dynamic-secret-access.yml +111 -0
  18. package/errors/known-unsolved/no-step-level-rerun.yml +94 -0
  19. package/errors/known-unsolved/no-step-retry.yml +53 -53
  20. package/errors/permissions-auth/checkout-submodule-private-auth.yml +91 -0
  21. package/errors/permissions-auth/fork-pr-secrets-unavailable.yml +97 -0
  22. package/errors/permissions-auth/github-token-403.yml +64 -64
  23. package/errors/permissions-auth/github-token-protected-branch-push.yml +109 -0
  24. package/errors/permissions-auth/oidc-aws-failure.yml +85 -85
  25. package/errors/permissions-auth/oidc-azure-subject-mismatch.yml +91 -0
  26. package/errors/runner-environment/disk-space.yml +57 -57
  27. package/errors/runner-environment/docker-buildx-not-setup.yml +106 -0
  28. package/errors/runner-environment/macos-homebrew-path.yml +90 -0
  29. package/errors/runner-environment/node-runtime-deprecation.yml +56 -56
  30. package/errors/runner-environment/npm-ci-lockfile-mismatch.yml +112 -0
  31. package/errors/runner-environment/self-hosted-stale-toolcache.yml +73 -0
  32. package/errors/runner-environment/setup-node-version-file-missing.yml +105 -0
  33. package/errors/runner-environment/windows-execution-policy.yml +83 -0
  34. package/errors/silent-failures/add-mask-no-retroactive-masking.yml +75 -0
  35. package/errors/silent-failures/composite-boolean-inputs-as-strings.yml +110 -0
  36. package/errors/silent-failures/conditional-output-null-downstream.yml +82 -0
  37. package/errors/silent-failures/continue-on-error-masks-failure.yml +86 -0
  38. package/errors/silent-failures/github-token-no-trigger.yml +57 -57
  39. package/errors/silent-failures/reusable-workflow-env-secrets-empty.yml +90 -0
  40. package/errors/silent-failures/scheduled-workflow-disabled.yml +59 -59
  41. package/errors/triggers/cron-schedule-late.yml +59 -59
  42. package/errors/triggers/pull-request-target-rce-risk.yml +117 -0
  43. package/errors/triggers/workflow-not-triggering.yml +60 -60
  44. package/errors/triggers/workflow-run-default-branch-requirement.yml +78 -0
  45. package/errors/yaml-syntax/anchors-not-supported.yml +95 -0
  46. package/errors/yaml-syntax/dynamic-matrix-fromjson-failure.yml +99 -0
  47. package/errors/yaml-syntax/if-always-true.yml +52 -52
  48. package/errors/yaml-syntax/missing-expression-wrapper.yml +67 -0
  49. package/errors/yaml-syntax/needs-indirect-outputs.yml +91 -0
  50. package/errors/yaml-syntax/secrets-in-if.yml +55 -55
  51. package/errors/yaml-syntax/unexpected-yaml-key.yml +69 -69
  52. package/errors/yaml-syntax/working-directory-ignored-on-uses.yml +66 -0
  53. package/package.json +70 -67
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Hector Flores (htekdev)
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Hector Flores (htekdev)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,108 +1,108 @@
1
- # @htekdev/actions-debugger
2
-
3
- [![CI](https://github.com/htekdev/actions-debugger/actions/workflows/ci.yml/badge.svg)](https://github.com/htekdev/actions-debugger/actions/workflows/ci.yml)
4
- [![npm](https://img.shields.io/npm/v/@htekdev/actions-debugger)](https://www.npmjs.com/package/@htekdev/actions-debugger)
5
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
-
7
- > 65+ real GitHub Actions errors, queryable by agents. MCP server + Copilot skills + error database.
8
-
9
- **Stop debugging the same CI failures over and over.** This repo packages 65+ real-world GitHub Actions error scenarios — with regex-matchable patterns, root causes, and copy-paste fixes — into formats that both humans and AI agents can consume.
10
-
11
- ## What's Inside
12
-
13
- ```
14
- errors/ → Structured YAML error database (65+ entries)
15
- src/ → MCP server (TypeScript + @modelcontextprotocol/sdk)
16
- .github/skills/ → Copilot CLI skills for CI debugging
17
- .github/agents/ → Copilot agent definition
18
- ```
19
-
20
- ## Quick Start
21
-
22
- ### As an MCP Server (Claude Desktop, Copilot CLI, Cursor, etc.)
23
-
24
- ```bash
25
- npx @htekdev/actions-debugger
26
- ```
27
-
28
- Add to your MCP client config:
29
-
30
- ```json
31
- {
32
- "mcpServers": {
33
- "actions-debugger": {
34
- "command": "npx",
35
- "args": ["@htekdev/actions-debugger"]
36
- }
37
- }
38
- }
39
- ```
40
-
41
- **Client config locations:**
42
- - **Claude Desktop**: `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) / `%APPDATA%\Claude\claude_desktop_config.json` (Windows)
43
- - **Cursor**: `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global)
44
- - **VS Code (Copilot Chat)**: `.vscode/mcp.json`
45
- - **Copilot CLI**: `.github/mcp.json` (repo-level)
46
- - **Windsurf**: `~/.codeium/windsurf/mcp_config.json`
47
-
48
- ### As a Copilot CLI Skill (No MCP Required)
49
-
50
- Copy `.github/skills/actions-debugging/SKILL.md` to your repo's `.github/skills/` directory. Reference it in your agent:
51
-
52
- ```markdown
53
- > **Skill reference:** For CI debugging, use the `actions-debugging` skill.
54
- ```
55
-
56
- ### Programmatic (npm Package)
57
-
58
- ```typescript
59
- import { loadErrorDatabase, lookupError, diagnoseWorkflow } from "@htekdev/actions-debugger";
60
-
61
- const db = await loadErrorDatabase();
62
-
63
- // Lookup by error message
64
- const matches = lookupError(db, "Permission to org/repo.git denied");
65
- console.log(matches[0].fix);
66
-
67
- // Analyze a workflow
68
- const issues = diagnoseWorkflow(db, workflowYamlString);
69
- ```
70
-
71
- ## MCP Tools
72
-
73
- | Tool | Description |
74
- |------|-------------|
75
- | `lookup_error` | Match an error message against 65+ known issues |
76
- | `diagnose_workflow` | Static analysis of workflow YAML for common mistakes |
77
- | `suggest_fix` | Contextual fix suggestions from error context |
78
- | `search_errors` | Full-text search by keyword, category, severity |
79
- | `list_categories` | Browse error categories with counts |
80
-
81
- ## Error Categories
82
-
83
- | Category | Description |
84
- |----------|-------------|
85
- | `yaml-syntax` | YAML validation, key typos, expression errors |
86
- | `silent-failures` | No error shown, but wrong behavior |
87
- | `runner-environment` | Runner issues, disk space, Docker, PATH |
88
- | `permissions-auth` | GITHUB_TOKEN, OIDC, secrets, 403s |
89
- | `caching-artifacts` | Cache misses, artifact v4 changes, corruption |
90
- | `triggers` | Workflow not running, cron issues, dispatch |
91
- | `concurrency-timing` | Job cancellation, matrix, timeouts |
92
- | `known-unsolved` | Platform limitations with no fix |
93
-
94
- ## Contributing
95
-
96
- See [CONTRIBUTING.md](docs/CONTRIBUTING.md) for how to add new error entries. It's easy:
97
-
98
- 1. Create a YAML file in the appropriate `errors/{category}/` directory
99
- 2. Follow the schema in `errors/_schema.json`
100
- 3. Open a PR — CI validates your entry automatically
101
-
102
- ## Source
103
-
104
- All error scenarios sourced from: **[The Definitive GitHub Actions Debugging Guide](https://htek.dev/articles/github-actions-debugging-guide)**
105
-
106
- ## License
107
-
108
- MIT — [Hector Flores](https://htek.dev) (htekdev)
1
+ # @htekdev/actions-debugger
2
+
3
+ [![CI](https://github.com/htekdev/actions-debugger/actions/workflows/ci.yml/badge.svg)](https://github.com/htekdev/actions-debugger/actions/workflows/ci.yml)
4
+ [![npm](https://img.shields.io/npm/v/@htekdev/actions-debugger)](https://www.npmjs.com/package/@htekdev/actions-debugger)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+
7
+ > 65+ real GitHub Actions errors, queryable by agents. MCP server + Copilot skills + error database.
8
+
9
+ **Stop debugging the same CI failures over and over.** This repo packages 65+ real-world GitHub Actions error scenarios — with regex-matchable patterns, root causes, and copy-paste fixes — into formats that both humans and AI agents can consume.
10
+
11
+ ## What's Inside
12
+
13
+ ```
14
+ errors/ → Structured YAML error database (65+ entries)
15
+ src/ → MCP server (TypeScript + @modelcontextprotocol/sdk)
16
+ .github/skills/ → Copilot CLI skills for CI debugging
17
+ .github/agents/ → Copilot agent definition
18
+ ```
19
+
20
+ ## Quick Start
21
+
22
+ ### As an MCP Server (Claude Desktop, Copilot CLI, Cursor, etc.)
23
+
24
+ ```bash
25
+ npx @htekdev/actions-debugger
26
+ ```
27
+
28
+ Add to your MCP client config:
29
+
30
+ ```json
31
+ {
32
+ "mcpServers": {
33
+ "actions-debugger": {
34
+ "command": "npx",
35
+ "args": ["@htekdev/actions-debugger"]
36
+ }
37
+ }
38
+ }
39
+ ```
40
+
41
+ **Client config locations:**
42
+ - **Claude Desktop**: `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) / `%APPDATA%\Claude\claude_desktop_config.json` (Windows)
43
+ - **Cursor**: `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global)
44
+ - **VS Code (Copilot Chat)**: `.vscode/mcp.json`
45
+ - **Copilot CLI**: `.github/mcp.json` (repo-level)
46
+ - **Windsurf**: `~/.codeium/windsurf/mcp_config.json`
47
+
48
+ ### As a Copilot CLI Skill (No MCP Required)
49
+
50
+ Copy `.github/skills/actions-debugging/SKILL.md` to your repo's `.github/skills/` directory. Reference it in your agent:
51
+
52
+ ```markdown
53
+ > **Skill reference:** For CI debugging, use the `actions-debugging` skill.
54
+ ```
55
+
56
+ ### Programmatic (npm Package)
57
+
58
+ ```typescript
59
+ import { loadErrorDatabase, lookupError, diagnoseWorkflow } from "@htekdev/actions-debugger";
60
+
61
+ const db = await loadErrorDatabase();
62
+
63
+ // Lookup by error message
64
+ const matches = lookupError(db, "Permission to org/repo.git denied");
65
+ console.log(matches[0].fix);
66
+
67
+ // Analyze a workflow
68
+ const issues = diagnoseWorkflow(db, workflowYamlString);
69
+ ```
70
+
71
+ ## MCP Tools
72
+
73
+ | Tool | Description |
74
+ |------|-------------|
75
+ | `lookup_error` | Match an error message against 65+ known issues |
76
+ | `diagnose_workflow` | Static analysis of workflow YAML for common mistakes |
77
+ | `suggest_fix` | Contextual fix suggestions from error context |
78
+ | `search_errors` | Full-text search by keyword, category, severity |
79
+ | `list_categories` | Browse error categories with counts |
80
+
81
+ ## Error Categories
82
+
83
+ | Category | Description |
84
+ |----------|-------------|
85
+ | `yaml-syntax` | YAML validation, key typos, expression errors |
86
+ | `silent-failures` | No error shown, but wrong behavior |
87
+ | `runner-environment` | Runner issues, disk space, Docker, PATH |
88
+ | `permissions-auth` | GITHUB_TOKEN, OIDC, secrets, 403s |
89
+ | `caching-artifacts` | Cache misses, artifact v4 changes, corruption |
90
+ | `triggers` | Workflow not running, cron issues, dispatch |
91
+ | `concurrency-timing` | Job cancellation, matrix, timeouts |
92
+ | `known-unsolved` | Platform limitations with no fix |
93
+
94
+ ## Contributing
95
+
96
+ See [CONTRIBUTING.md](docs/CONTRIBUTING.md) for how to add new error entries. It's easy:
97
+
98
+ 1. Create a YAML file in the appropriate `errors/{category}/` directory
99
+ 2. Follow the schema in `errors/_schema.json`
100
+ 3. Open a PR — CI validates your entry automatically
101
+
102
+ ## Source
103
+
104
+ All error scenarios sourced from: **[The Definitive GitHub Actions Debugging Guide](https://htek.dev/articles/github-actions-debugging-guide)**
105
+
106
+ ## License
107
+
108
+ MIT — [Hector Flores](https://htek.dev) (htekdev)
@@ -1,89 +1,89 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-07/schema#",
3
- "title": "Actions Debugger Error Entry",
4
- "description": "Schema for GitHub Actions error database entries",
5
- "type": "object",
6
- "required": ["id", "title", "category", "severity", "patterns", "root_cause", "fix"],
7
- "properties": {
8
- "id": {
9
- "type": "string",
10
- "pattern": "^[a-z-]+-\\d{3}$",
11
- "description": "Unique ID: {category}-{number}"
12
- },
13
- "title": {
14
- "type": "string",
15
- "description": "Human-readable error title"
16
- },
17
- "category": {
18
- "type": "string",
19
- "enum": [
20
- "yaml-syntax",
21
- "silent-failures",
22
- "runner-environment",
23
- "permissions-auth",
24
- "caching-artifacts",
25
- "triggers",
26
- "concurrency-timing",
27
- "known-unsolved"
28
- ]
29
- },
30
- "severity": {
31
- "type": "string",
32
- "enum": ["error", "warning", "silent-failure", "limitation"]
33
- },
34
- "tags": {
35
- "type": "array",
36
- "items": { "type": "string" }
37
- },
38
- "patterns": {
39
- "type": "array",
40
- "items": {
41
- "type": "object",
42
- "required": ["regex"],
43
- "properties": {
44
- "regex": { "type": "string" },
45
- "flags": { "type": "string", "default": "i" }
46
- }
47
- }
48
- },
49
- "error_messages": {
50
- "type": "array",
51
- "items": { "type": "string" },
52
- "description": "Exact error message strings for full-text search"
53
- },
54
- "root_cause": { "type": "string" },
55
- "fix": { "type": "string" },
56
- "fix_code": {
57
- "type": "array",
58
- "items": {
59
- "type": "object",
60
- "properties": {
61
- "language": { "type": "string" },
62
- "label": { "type": "string" },
63
- "code": { "type": "string" }
64
- }
65
- }
66
- },
67
- "prevention": {
68
- "type": "array",
69
- "items": { "type": "string" }
70
- },
71
- "docs": {
72
- "type": "array",
73
- "items": {
74
- "type": "object",
75
- "properties": {
76
- "url": { "type": "string", "format": "uri" },
77
- "label": { "type": "string" }
78
- }
79
- }
80
- },
81
- "source": {
82
- "type": "object",
83
- "properties": {
84
- "article": { "type": "string", "format": "uri" },
85
- "section": { "type": "string" }
86
- }
87
- }
88
- }
89
- }
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Actions Debugger Error Entry",
4
+ "description": "Schema for GitHub Actions error database entries",
5
+ "type": "object",
6
+ "required": ["id", "title", "category", "severity", "patterns", "root_cause", "fix"],
7
+ "properties": {
8
+ "id": {
9
+ "type": "string",
10
+ "pattern": "^[a-z-]+-\\d{3}$",
11
+ "description": "Unique ID: {category}-{number}"
12
+ },
13
+ "title": {
14
+ "type": "string",
15
+ "description": "Human-readable error title"
16
+ },
17
+ "category": {
18
+ "type": "string",
19
+ "enum": [
20
+ "yaml-syntax",
21
+ "silent-failures",
22
+ "runner-environment",
23
+ "permissions-auth",
24
+ "caching-artifacts",
25
+ "triggers",
26
+ "concurrency-timing",
27
+ "known-unsolved"
28
+ ]
29
+ },
30
+ "severity": {
31
+ "type": "string",
32
+ "enum": ["error", "warning", "silent-failure", "limitation"]
33
+ },
34
+ "tags": {
35
+ "type": "array",
36
+ "items": { "type": "string" }
37
+ },
38
+ "patterns": {
39
+ "type": "array",
40
+ "items": {
41
+ "type": "object",
42
+ "required": ["regex"],
43
+ "properties": {
44
+ "regex": { "type": "string" },
45
+ "flags": { "type": "string", "default": "i" }
46
+ }
47
+ }
48
+ },
49
+ "error_messages": {
50
+ "type": "array",
51
+ "items": { "type": "string" },
52
+ "description": "Exact error message strings for full-text search"
53
+ },
54
+ "root_cause": { "type": "string" },
55
+ "fix": { "type": "string" },
56
+ "fix_code": {
57
+ "type": "array",
58
+ "items": {
59
+ "type": "object",
60
+ "properties": {
61
+ "language": { "type": "string" },
62
+ "label": { "type": "string" },
63
+ "code": { "type": "string" }
64
+ }
65
+ }
66
+ },
67
+ "prevention": {
68
+ "type": "array",
69
+ "items": { "type": "string" }
70
+ },
71
+ "docs": {
72
+ "type": "array",
73
+ "items": {
74
+ "type": "object",
75
+ "properties": {
76
+ "url": { "type": "string", "format": "uri" },
77
+ "label": { "type": "string" }
78
+ }
79
+ }
80
+ },
81
+ "source": {
82
+ "type": "object",
83
+ "properties": {
84
+ "article": { "type": "string", "format": "uri" },
85
+ "section": { "type": "string" }
86
+ }
87
+ }
88
+ }
89
+ }
@@ -0,0 +1,118 @@
1
+ id: caching-artifacts-006
2
+ title: "Artifact Upload Fails: Storage Quota Exceeded or 413 Request Too Large"
3
+ category: caching-artifacts
4
+ severity: error
5
+ tags:
6
+ - artifacts
7
+ - upload-artifact
8
+ - storage-quota
9
+ - 413
10
+ - size-limit
11
+ patterns:
12
+ - regex: "Artifact storage quota has been hit"
13
+ flags: "i"
14
+ - regex: "Unable to upload any new artifacts"
15
+ flags: "i"
16
+ - regex: "413 Request Entity Too Large"
17
+ flags: "i"
18
+ - regex: "Create Artifact Container failed"
19
+ flags: "i"
20
+ - regex: "No space left on device"
21
+ flags: "i"
22
+ - regex: "Status Code: 500 Internal Server Error"
23
+ flags: "i"
24
+ error_messages:
25
+ - "Create Artifact Container failed: Artifact storage quota has been hit. Unable to upload any new artifacts"
26
+ - "413 Request Entity Too Large"
27
+ - "Unexpected response. Unable to upload chunk to pipelines.actions.githubusercontent.com... Status Code: 500 Internal Server Error"
28
+ - "Unhandled exception. System.IO.IOException: No space left on device"
29
+ root_cause: |
30
+ Artifact upload failures in GitHub Actions have three distinct root causes:
31
+
32
+ 1. **Repository/org storage quota exceeded** (`Artifact storage quota has been hit`):
33
+ GitHub includes a limited amount of artifact storage per plan (e.g., 500 MB for
34
+ free, 2 GB for Teams, 50 GB for Enterprise). When the cumulative size of all stored
35
+ artifacts crosses this limit, the backend refuses to create new artifact containers
36
+ and every new upload fails immediately.
37
+
38
+ 2. **Upload chunk too large / server error** (`413 Request Entity Too Large` or `500`):
39
+ GitHub Actions uploads artifacts in chunks. If a single artifact or its chunk
40
+ exceeds the backend's per-request limits, the server returns 413 or 500. This
41
+ typically happens with artifacts larger than ~2 GB in a single upload call.
42
+
43
+ 3. **Runner disk space exhausted** (`No space left on device`):
44
+ The hosted runner's ephemeral disk (typically ~14 GB on ubuntu-latest) fills up
45
+ during artifact packaging/compression. This is common when building large binaries,
46
+ Docker images, or test results that accumulate over a long job.
47
+
48
+ Old or unretained artifacts accumulate silently — developers rarely clean up artifacts
49
+ manually, so quota errors often appear suddenly after months of builds.
50
+ fix: |
51
+ **For storage quota errors:**
52
+ - Delete old artifacts via the GitHub UI (Actions → Artifacts) or the REST API.
53
+ - Lower artifact retention days using the `retention-days` parameter on upload-artifact
54
+ so old artifacts expire automatically.
55
+ - If quota is still consistently exceeded, upgrade the plan or add Actions storage.
56
+
57
+ **For 413 / chunk errors:**
58
+ - Split the artifact into smaller logical pieces using multiple upload-artifact steps.
59
+ - Compress before uploading (zip/tar the directory first) to reduce payload size.
60
+
61
+ **For runner disk exhaustion:**
62
+ - Use a self-hosted runner with more disk, or add a disk-cleanup step early in the job.
63
+ - Upload intermediate artifacts (e.g., build outputs) before running additional steps
64
+ that generate more disk usage.
65
+ fix_code:
66
+ - language: yaml
67
+ label: "Set retention to auto-expire artifacts and avoid quota buildup"
68
+ code: |
69
+ - uses: actions/upload-artifact@v4
70
+ with:
71
+ name: build-output
72
+ path: dist/
73
+ retention-days: 7 # Delete after 7 days; default is 90
74
+ - language: yaml
75
+ label: "Split large artifacts into logical pieces"
76
+ code: |
77
+ - uses: actions/upload-artifact@v4
78
+ with:
79
+ name: binaries-linux
80
+ path: dist/linux/
81
+ retention-days: 3
82
+
83
+ - uses: actions/upload-artifact@v4
84
+ with:
85
+ name: binaries-windows
86
+ path: dist/windows/
87
+ retention-days: 3
88
+ - language: yaml
89
+ label: "Free up runner disk space before large uploads"
90
+ code: |
91
+ - name: Free disk space
92
+ run: |
93
+ df -h
94
+ sudo apt-get clean
95
+ sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc
96
+ df -h
97
+ - language: yaml
98
+ label: "Delete all artifacts older than N days via API"
99
+ code: |
100
+ - name: Delete old artifacts
101
+ uses: c-hive/gha-remove-artifacts@v1
102
+ with:
103
+ age: '1 week'
104
+ skip-recent: 3
105
+ prevention:
106
+ - "Always set `retention-days` on upload-artifact — the 90-day default accumulates quota quickly in active repos."
107
+ - "Monitor Actions storage usage in your org settings (Settings → Billing → Actions) before you hit the limit."
108
+ - "Add a disk-space check step (`df -h`) at the start of jobs that produce large build outputs."
109
+ - "Split artifacts by purpose (binaries, test results, logs) so each part stays below chunk limits."
110
+ docs:
111
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/storing-and-sharing-data-from-a-workflow"
112
+ label: "Storing and sharing data from a workflow (artifacts)"
113
+ - url: "https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-github-actions/about-billing-for-github-actions#included-storage-and-minutes"
114
+ label: "About billing for GitHub Actions — included storage"
115
+ - url: "https://stackoverflow.com/questions/70730786/github-actions-create-artifact-container-failed-artifact-storage-quota-has-b"
116
+ label: "Stack Overflow: Artifact storage quota has been hit"
117
+ - url: "https://github.com/actions/upload-artifact/issues/9"
118
+ label: "upload-artifact#9 — chunk upload failures and size limits"