patchrail 0.1.0__tar.gz → 0.1.1__tar.gz

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 (479) hide show
  1. {patchrail-0.1.0 → patchrail-0.1.1}/CHANGELOG.md +18 -0
  2. {patchrail-0.1.0 → patchrail-0.1.1}/PKG-INFO +49 -4
  3. {patchrail-0.1.0 → patchrail-0.1.1}/README.md +48 -3
  4. patchrail-0.1.1/docs/assets/ci-explain-demo.gif +0 -0
  5. patchrail-0.1.1/docs/assets/ci-explain-demo.png +0 -0
  6. patchrail-0.1.1/docs/fix/README.md +45 -0
  7. patchrail-0.1.1/docs/fix/artifact-or-cache-failure.md +42 -0
  8. patchrail-0.1.1/docs/fix/browser-test-failure.md +42 -0
  9. patchrail-0.1.1/docs/fix/ci-job-timeout.md +41 -0
  10. patchrail-0.1.1/docs/fix/code-coverage-threshold.md +42 -0
  11. patchrail-0.1.1/docs/fix/cpp-build-failure.md +42 -0
  12. patchrail-0.1.1/docs/fix/docker-build-failure.md +42 -0
  13. patchrail-0.1.1/docs/fix/dotnet-build-failure.md +42 -0
  14. patchrail-0.1.1/docs/fix/git-checkout-failure.md +42 -0
  15. patchrail-0.1.1/docs/fix/git-merge-conflict.md +42 -0
  16. patchrail-0.1.1/docs/fix/github-actions-workflow.md +41 -0
  17. patchrail-0.1.1/docs/fix/go-lint.md +42 -0
  18. patchrail-0.1.1/docs/fix/go-test-failure.md +41 -0
  19. patchrail-0.1.1/docs/fix/java-build-failure.md +42 -0
  20. patchrail-0.1.1/docs/fix/javascript-lint.md +41 -0
  21. patchrail-0.1.1/docs/fix/network-transient-failure.md +42 -0
  22. patchrail-0.1.1/docs/fix/node-dependency-install.md +42 -0
  23. patchrail-0.1.1/docs/fix/node-test-failure.md +42 -0
  24. patchrail-0.1.1/docs/fix/php-composer-failure.md +42 -0
  25. patchrail-0.1.1/docs/fix/python-dependency-resolution.md +42 -0
  26. patchrail-0.1.1/docs/fix/python-lint.md +42 -0
  27. patchrail-0.1.1/docs/fix/python-test-failure.md +41 -0
  28. patchrail-0.1.1/docs/fix/python-type-check.md +42 -0
  29. patchrail-0.1.1/docs/fix/release-publish-failure.md +42 -0
  30. patchrail-0.1.1/docs/fix/ruby-bundle-failure.md +42 -0
  31. patchrail-0.1.1/docs/fix/runner-resource-exhaustion.md +42 -0
  32. patchrail-0.1.1/docs/fix/rust-lint.md +41 -0
  33. patchrail-0.1.1/docs/fix/rust-test-failure.md +41 -0
  34. patchrail-0.1.1/docs/fix/secrets-or-permissions-failure.md +42 -0
  35. patchrail-0.1.1/docs/fix/security-scan-failure.md +42 -0
  36. patchrail-0.1.1/docs/fix/terraform-iac-failure.md +42 -0
  37. patchrail-0.1.1/docs/fix/typescript-typecheck.md +42 -0
  38. {patchrail-0.1.0 → patchrail-0.1.1}/docs/pilot-guide.md +3 -2
  39. {patchrail-0.1.0 → patchrail-0.1.1}/docs/pilot-request-package.md +3 -2
  40. {patchrail-0.1.0 → patchrail-0.1.1}/docs/quickstart.md +8 -3
  41. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/demo-output.md +1 -0
  42. {patchrail-0.1.0 → patchrail-0.1.1}/pyproject.toml +1 -1
  43. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/__init__.py +1 -1
  44. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/ci/classify.py +21 -0
  45. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/cli.py +1225 -2
  46. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/funded_issues/__init__.py +4 -0
  47. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/funded_issues/store.py +340 -0
  48. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/ci-result.v1.schema.json +1 -0
  49. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/web_metrics.py +17 -13
  50. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_ci_classify_expansion.py +28 -0
  51. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_ci_cli.py +78 -1
  52. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_algora_board.py +2 -6
  53. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_blocklist.py +1 -3
  54. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_cli.py +2210 -0
  55. patchrail-0.1.1/tests/test_funded_issues_store.py +1276 -0
  56. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_public_workflows.py +32 -14
  57. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_web_metrics_cli.py +10 -10
  58. {patchrail-0.1.0 → patchrail-0.1.1}/uv.lock +1 -1
  59. patchrail-0.1.0/tests/test_funded_issues_store.py +0 -313
  60. {patchrail-0.1.0 → patchrail-0.1.1}/.agents/skills/patchrail-ci-triage/SKILL.md +0 -0
  61. {patchrail-0.1.0 → patchrail-0.1.1}/.agents/skills/patchrail-release-captain/SKILL.md +0 -0
  62. {patchrail-0.1.0 → patchrail-0.1.1}/.agents/skills/patchrail-review-guardrails/SKILL.md +0 -0
  63. {patchrail-0.1.0 → patchrail-0.1.1}/.gitignore +0 -0
  64. {patchrail-0.1.0 → patchrail-0.1.1}/ADOPTERS.md +0 -0
  65. {patchrail-0.1.0 → patchrail-0.1.1}/AGENTS.md +0 -0
  66. {patchrail-0.1.0 → patchrail-0.1.1}/CODE_OF_CONDUCT.md +0 -0
  67. {patchrail-0.1.0 → patchrail-0.1.1}/CONTRIBUTING.md +0 -0
  68. {patchrail-0.1.0 → patchrail-0.1.1}/ETHICS.md +0 -0
  69. {patchrail-0.1.0 → patchrail-0.1.1}/GOVERNANCE.md +0 -0
  70. {patchrail-0.1.0 → patchrail-0.1.1}/LICENSE +0 -0
  71. {patchrail-0.1.0 → patchrail-0.1.1}/SECURITY.md +0 -0
  72. {patchrail-0.1.0 → patchrail-0.1.1}/docs/agent-control-plane.md +0 -0
  73. {patchrail-0.1.0 → patchrail-0.1.1}/docs/agent-workflows.md +0 -0
  74. {patchrail-0.1.0 → patchrail-0.1.1}/docs/api-reference.md +0 -0
  75. {patchrail-0.1.0 → patchrail-0.1.1}/docs/ci-failure-zoo.md +0 -0
  76. {patchrail-0.1.0 → patchrail-0.1.1}/docs/ci-janitor.md +0 -0
  77. {patchrail-0.1.0 → patchrail-0.1.1}/docs/codex-workflows.md +0 -0
  78. {patchrail-0.1.0 → patchrail-0.1.1}/docs/funded-issues-ethics.md +0 -0
  79. {patchrail-0.1.0 → patchrail-0.1.1}/docs/github-action.md +0 -0
  80. {patchrail-0.1.0 → patchrail-0.1.1}/docs/metrics.md +0 -0
  81. {patchrail-0.1.0 → patchrail-0.1.1}/docs/open-source-program-evidence.md +0 -0
  82. {patchrail-0.1.0 → patchrail-0.1.1}/docs/openai-open-source-evidence.md +0 -0
  83. {patchrail-0.1.0 → patchrail-0.1.1}/docs/public-workflow-ledger.md +0 -0
  84. {patchrail-0.1.0 → patchrail-0.1.1}/docs/release-process.md +0 -0
  85. {patchrail-0.1.0 → patchrail-0.1.1}/docs/release-v0.1.0-evidence.md +0 -0
  86. {patchrail-0.1.0 → patchrail-0.1.1}/docs/release-v0.2.0-evidence.md +0 -0
  87. {patchrail-0.1.0 → patchrail-0.1.1}/docs/release-v0.3.0-evidence.md +0 -0
  88. {patchrail-0.1.0 → patchrail-0.1.1}/docs/release-v0.4.0-evidence.md +0 -0
  89. {patchrail-0.1.0 → patchrail-0.1.1}/docs/roadmap.md +0 -0
  90. {patchrail-0.1.0 → patchrail-0.1.1}/docs/threat-model.md +0 -0
  91. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/browser-playwright-navigation-timeout.expected.json +0 -0
  92. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/browser-playwright-navigation-timeout.log +0 -0
  93. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/browser-playwright-webserver-timeout.expected.json +0 -0
  94. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/browser-playwright-webserver-timeout.log +0 -0
  95. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/cypress-browser-launch.expected.json +0 -0
  96. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/cypress-browser-launch.log +0 -0
  97. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dependency-failure.expected.json +0 -0
  98. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dependency-failure.log +0 -0
  99. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-base-image-manifest-not-found.expected.json +0 -0
  100. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-base-image-manifest-not-found.log +0 -0
  101. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-buildkit-missing-context.expected.json +0 -0
  102. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-buildkit-missing-context.log +0 -0
  103. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-buildkit-missing-stage.expected.json +0 -0
  104. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-buildkit-missing-stage.log +0 -0
  105. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-compose-healthcheck.expected.json +0 -0
  106. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-compose-healthcheck.log +0 -0
  107. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-compose-missing-env-file.expected.json +0 -0
  108. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-compose-missing-env-file.log +0 -0
  109. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-csharp-compile-error.expected.json +0 -0
  110. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-csharp-compile-error.log +0 -0
  111. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-nuget-package-downgrade.expected.json +0 -0
  112. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-nuget-package-downgrade.log +0 -0
  113. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-nuget-version-conflict.expected.json +0 -0
  114. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-nuget-version-conflict.log +0 -0
  115. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-sdk-target-framework-mismatch.expected.json +0 -0
  116. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-sdk-target-framework-mismatch.log +0 -0
  117. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-xunit-assertion.expected.json +0 -0
  118. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-xunit-assertion.log +0 -0
  119. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-bad-shell.expected.json +0 -0
  120. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-bad-shell.log +0 -0
  121. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-invalid-workflow.expected.json +0 -0
  122. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-invalid-workflow.log +0 -0
  123. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-matrix-expression.expected.json +0 -0
  124. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-matrix-expression.log +0 -0
  125. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-missing-workflow-ref.expected.json +0 -0
  126. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-missing-workflow-ref.log +0 -0
  127. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-permission-id-token.expected.json +0 -0
  128. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-permission-id-token.log +0 -0
  129. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-permission.expected.json +0 -0
  130. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-permission.log +0 -0
  131. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-token-permission.expected.json +0 -0
  132. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-token-permission.log +0 -0
  133. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-unresolved-action.expected.json +0 -0
  134. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-unresolved-action.log +0 -0
  135. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-unresolved-checkout.expected.json +0 -0
  136. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-unresolved-checkout.log +0 -0
  137. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-yaml-syntax.expected.json +0 -0
  138. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-yaml-syntax.log +0 -0
  139. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-assertion-fail.expected.json +0 -0
  140. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-assertion-fail.log +0 -0
  141. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-compile-failure.expected.json +0 -0
  142. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-compile-failure.log +0 -0
  143. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-compile-interface.expected.json +0 -0
  144. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-compile-interface.log +0 -0
  145. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-data-race-test.expected.json +0 -0
  146. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-data-race-test.log +0 -0
  147. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-module-missing-symbol.expected.json +0 -0
  148. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-module-missing-symbol.log +0 -0
  149. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-panic-in-test.expected.json +0 -0
  150. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-panic-in-test.log +0 -0
  151. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-timeout-race.expected.json +0 -0
  152. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-timeout-race.log +0 -0
  153. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-timeout.expected.json +0 -0
  154. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-timeout.log +0 -0
  155. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-undefined-function.expected.json +0 -0
  156. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-undefined-function.log +0 -0
  157. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-undefined-symbol.expected.json +0 -0
  158. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-undefined-symbol.log +0 -0
  159. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-dependency-resolution.expected.json +0 -0
  160. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-dependency-resolution.log +0 -0
  161. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-no-tests-found.expected.json +0 -0
  162. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-no-tests-found.log +0 -0
  163. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-toolchain-version.expected.json +0 -0
  164. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-toolchain-version.log +0 -0
  165. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-unsupported-major-version.expected.json +0 -0
  166. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-unsupported-major-version.log +0 -0
  167. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-maven-compilation.expected.json +0 -0
  168. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-maven-compilation.log +0 -0
  169. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-biome-format.expected.json +0 -0
  170. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-biome-format.log +0 -0
  171. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-a11y.expected.json +0 -0
  172. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-a11y.log +0 -0
  173. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-config-parser-drift.expected.json +0 -0
  174. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-config-parser-drift.log +0 -0
  175. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-import-order.expected.json +0 -0
  176. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-import-order.log +0 -0
  177. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-no-undef.expected.json +0 -0
  178. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-no-undef.log +0 -0
  179. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-react-hooks.expected.json +0 -0
  180. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-react-hooks.log +0 -0
  181. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-unused-vars.expected.json +0 -0
  182. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-unused-vars.log +0 -0
  183. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint.expected.json +0 -0
  184. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint.log +0 -0
  185. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-prettier-format.expected.json +0 -0
  186. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-prettier-format.log +0 -0
  187. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-prettier-generated-client-drift.expected.json +0 -0
  188. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-prettier-generated-client-drift.log +0 -0
  189. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-prettier.expected.json +0 -0
  190. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-prettier.log +0 -0
  191. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-lockfile-drift.expected.json +0 -0
  192. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-lockfile-drift.log +0 -0
  193. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-ci-lock-outdated.expected.json +0 -0
  194. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-ci-lock-outdated.log +0 -0
  195. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-engine-mismatch.expected.json +0 -0
  196. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-engine-mismatch.log +0 -0
  197. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-eresolve-react.expected.json +0 -0
  198. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-eresolve-react.log +0 -0
  199. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-missing-lockfile.expected.json +0 -0
  200. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-missing-lockfile.log +0 -0
  201. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-missing-package-lock.expected.json +0 -0
  202. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-missing-package-lock.log +0 -0
  203. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-workspace-lock-drift.expected.json +0 -0
  204. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-workspace-lock-drift.log +0 -0
  205. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-peer-dependency.expected.json +0 -0
  206. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-peer-dependency.log +0 -0
  207. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-catalog-drift.expected.json +0 -0
  208. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-catalog-drift.log +0 -0
  209. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-frozen-lockfile.expected.json +0 -0
  210. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-frozen-lockfile.log +0 -0
  211. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-lockfile-config-drift.expected.json +0 -0
  212. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-lockfile-config-drift.log +0 -0
  213. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-peer-conflict-react.expected.json +0 -0
  214. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-peer-conflict-react.log +0 -0
  215. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-peer-optional.expected.json +0 -0
  216. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-peer-optional.log +0 -0
  217. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-workspace-protocol.expected.json +0 -0
  218. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-workspace-protocol.log +0 -0
  219. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-constraints-peer-drift.expected.json +0 -0
  220. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-constraints-peer-drift.log +0 -0
  221. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-immutable-cache-drift.expected.json +0 -0
  222. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-immutable-cache-drift.log +0 -0
  223. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-immutable-install.expected.json +0 -0
  224. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-immutable-install.log +0 -0
  225. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-peer-dependency.expected.json +0 -0
  226. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-peer-dependency.log +0 -0
  227. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-peer-version.expected.json +0 -0
  228. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-peer-version.log +0 -0
  229. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-composer-lock-drift.expected.json +0 -0
  230. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-composer-lock-drift.log +0 -0
  231. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-composer-missing-package.expected.json +0 -0
  232. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-composer-missing-package.log +0 -0
  233. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-composer-platform-version.expected.json +0 -0
  234. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-composer-platform-version.log +0 -0
  235. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-phpunit-autoload-class-not-found.expected.json +0 -0
  236. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-phpunit-autoload-class-not-found.log +0 -0
  237. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-phpunit-failure.expected.json +0 -0
  238. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-phpunit-failure.log +0 -0
  239. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/playwright-missing-browsers.expected.json +0 -0
  240. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/playwright-missing-browsers.log +0 -0
  241. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/playwright-selector-timeout.expected.json +0 -0
  242. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/playwright-selector-timeout.log +0 -0
  243. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-hatch-build-dependency.expected.json +0 -0
  244. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-hatch-build-dependency.log +0 -0
  245. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-module-import.expected.json +0 -0
  246. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-module-import.log +0 -0
  247. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-conflicting-constraints.expected.json +0 -0
  248. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-conflicting-constraints.log +0 -0
  249. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-constraint-marker-drift.expected.json +0 -0
  250. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-constraint-marker-drift.log +0 -0
  251. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-constraint-pin-drift.expected.json +0 -0
  252. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-constraint-pin-drift.log +0 -0
  253. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-extra-conflict.expected.json +0 -0
  254. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-extra-conflict.log +0 -0
  255. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-index-timeout-backtrack.expected.json +0 -0
  256. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-index-timeout-backtrack.log +0 -0
  257. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-marker-py310.expected.json +0 -0
  258. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-marker-py310.log +0 -0
  259. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-missing-musllinux-wheel.expected.json +0 -0
  260. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-missing-musllinux-wheel.log +0 -0
  261. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-no-matching-distribution.expected.json +0 -0
  262. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-no-matching-distribution.log +0 -0
  263. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-platform-arm64-wheel.expected.json +0 -0
  264. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-platform-arm64-wheel.log +0 -0
  265. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-platform-wheel.expected.json +0 -0
  266. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-platform-wheel.log +0 -0
  267. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-prerelease-range.expected.json +0 -0
  268. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-prerelease-range.log +0 -0
  269. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-python-version-marker.expected.json +0 -0
  270. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-python-version-marker.log +0 -0
  271. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-tools-backtracking.expected.json +0 -0
  272. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-tools-backtracking.log +0 -0
  273. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-tools-conflict.expected.json +0 -0
  274. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-tools-conflict.log +0 -0
  275. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-tools-extra-marker-conflict.expected.json +0 -0
  276. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-tools-extra-marker-conflict.log +0 -0
  277. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-yanked-only-candidate.expected.json +0 -0
  278. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-yanked-only-candidate.log +0 -0
  279. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-yanked-release.expected.json +0 -0
  280. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-yanked-release.log +0 -0
  281. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-poetry-python-range-drift.expected.json +0 -0
  282. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-poetry-python-range-drift.log +0 -0
  283. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-poetry-solver-conflict.expected.json +0 -0
  284. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-poetry-solver-conflict.log +0 -0
  285. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-poetry-transitive-conflict.expected.json +0 -0
  286. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-poetry-transitive-conflict.log +0 -0
  287. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pytest-env-token-redacted.expected.json +0 -0
  288. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pytest-env-token-redacted.log +0 -0
  289. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-assert-json.expected.json +0 -0
  290. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-assert-json.log +0 -0
  291. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-failure.expected.json +0 -0
  292. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-failure.log +0 -0
  293. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-fixture-timeout.expected.json +0 -0
  294. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-fixture-timeout.log +0 -0
  295. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-import-mode.expected.json +0 -0
  296. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-import-mode.log +0 -0
  297. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-module-not-found.expected.json +0 -0
  298. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-module-not-found.log +0 -0
  299. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-parametrize-regression.expected.json +0 -0
  300. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-parametrize-regression.log +0 -0
  301. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-snapshot-diff.expected.json +0 -0
  302. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-snapshot-diff.log +0 -0
  303. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-tox-constraint-conflict.expected.json +0 -0
  304. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-tox-constraint-conflict.log +0 -0
  305. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-constraint-backtrack-fail.expected.json +0 -0
  306. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-constraint-backtrack-fail.log +0 -0
  307. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-extra-marker-conflict.expected.json +0 -0
  308. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-extra-marker-conflict.log +0 -0
  309. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-extra-python-marker-drift.expected.json +0 -0
  310. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-extra-python-marker-drift.log +0 -0
  311. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-resolution-no-solution.expected.json +0 -0
  312. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-resolution-no-solution.log +0 -0
  313. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-bundler-conflict.expected.json +0 -0
  314. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-bundler-conflict.log +0 -0
  315. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-bundler-missing-gem.expected.json +0 -0
  316. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-bundler-missing-gem.log +0 -0
  317. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-bundler-platform-lock.expected.json +0 -0
  318. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-bundler-platform-lock.log +0 -0
  319. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-gem-native-extension.expected.json +0 -0
  320. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-gem-native-extension.log +0 -0
  321. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-rake-aborted.expected.json +0 -0
  322. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-rake-aborted.log +0 -0
  323. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-rspec-failure.expected.json +0 -0
  324. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-rspec-failure.log +0 -0
  325. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-ruby-version-lock.expected.json +0 -0
  326. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-ruby-version-lock.log +0 -0
  327. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-yanked-gem.expected.json +0 -0
  328. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-yanked-gem.log +0 -0
  329. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-compile-error.expected.json +0 -0
  330. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-compile-error.log +0 -0
  331. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0277-trait-bound.expected.json +0 -0
  332. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0277-trait-bound.log +0 -0
  333. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0308-mismatched-types.expected.json +0 -0
  334. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0308-mismatched-types.log +0 -0
  335. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0382-moved-value.expected.json +0 -0
  336. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0382-moved-value.log +0 -0
  337. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0502-borrow-checker.expected.json +0 -0
  338. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0502-borrow-checker.log +0 -0
  339. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0599-method-not-found.expected.json +0 -0
  340. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0599-method-not-found.log +0 -0
  341. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-panic-thread.expected.json +0 -0
  342. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-panic-thread.log +0 -0
  343. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-snapshot-failure.expected.json +0 -0
  344. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-snapshot-failure.log +0 -0
  345. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-test-failure.expected.json +0 -0
  346. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-test-failure.log +0 -0
  347. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-trait-bound-error.expected.json +0 -0
  348. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-trait-bound-error.log +0 -0
  349. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-cargo-audit-rustsec.expected.json +0 -0
  350. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-cargo-audit-rustsec.log +0 -0
  351. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-gosec-findings.expected.json +0 -0
  352. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-gosec-findings.log +0 -0
  353. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-npm-audit-critical.expected.json +0 -0
  354. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-npm-audit-critical.log +0 -0
  355. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-pip-audit-vulnerability.expected.json +0 -0
  356. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-pip-audit-vulnerability.log +0 -0
  357. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-trivy-container-critical.expected.json +0 -0
  358. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-trivy-container-critical.log +0 -0
  359. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-generated-client-schema-drift.expected.json +0 -0
  360. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-generated-client-schema-drift.log +0 -0
  361. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-import-type-drift.expected.json +0 -0
  362. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-import-type-drift.log +0 -0
  363. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-jsx-prop-mismatch.expected.json +0 -0
  364. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-jsx-prop-mismatch.log +0 -0
  365. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-missing-name.expected.json +0 -0
  366. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-missing-name.log +0 -0
  367. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-path-alias-drift.expected.json +0 -0
  368. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-path-alias-drift.log +0 -0
  369. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-route-param-mismatch.expected.json +0 -0
  370. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-route-param-mismatch.log +0 -0
  371. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-schema-drift.expected.json +0 -0
  372. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-schema-drift.log +0 -0
  373. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2304-missing-global.expected.json +0 -0
  374. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2304-missing-global.log +0 -0
  375. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2322-prop.expected.json +0 -0
  376. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2322-prop.log +0 -0
  377. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2345-route-param.expected.json +0 -0
  378. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2345-route-param.log +0 -0
  379. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2416-class-override.expected.json +0 -0
  380. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2416-class-override.log +0 -0
  381. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2551-import-name.expected.json +0 -0
  382. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2551-import-name.log +0 -0
  383. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2741-required-prop.expected.json +0 -0
  384. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2741-required-prop.log +0 -0
  385. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2769-overload.expected.json +0 -0
  386. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2769-overload.log +0 -0
  387. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts7006-implicit-any.expected.json +0 -0
  388. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts7006-implicit-any.log +0 -0
  389. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-tsconfig-lib-drift.expected.json +0 -0
  390. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-tsconfig-lib-drift.log +0 -0
  391. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-typecheck.expected.json +0 -0
  392. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-typecheck.log +0 -0
  393. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-vite-env-drift.expected.json +0 -0
  394. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-vite-env-drift.log +0 -0
  395. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-zod-schema-drift.expected.json +0 -0
  396. {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-zod-schema-drift.log +0 -0
  397. {patchrail-0.1.0 → patchrail-0.1.1}/examples/control-plane-demo/README.md +0 -0
  398. {patchrail-0.1.0 → patchrail-0.1.1}/examples/control-plane-demo/demo-output.md +0 -0
  399. {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/README.md +0 -0
  400. {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/client-profile-python.json +0 -0
  401. {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/competition-observations.json +0 -0
  402. {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/demo-summary.expected.json +0 -0
  403. {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/issues.json +0 -0
  404. {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/payout-effort-observations.json +0 -0
  405. {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/provider-github-export.json +0 -0
  406. {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/run_demo.py +0 -0
  407. {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/staleness-observations.json +0 -0
  408. {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/testability-observations.json +0 -0
  409. {patchrail-0.1.0 → patchrail-0.1.1}/examples/github-action/README.md +0 -0
  410. {patchrail-0.1.0 → patchrail-0.1.1}/examples/github-action/patchrail-ci-triage-artifact/ci-report.md +0 -0
  411. {patchrail-0.1.0 → patchrail-0.1.1}/examples/github-action/patchrail-ci-triage-artifact/ci-result.json +0 -0
  412. {patchrail-0.1.0 → patchrail-0.1.1}/examples/github-action/patchrail-ci-triage-artifact/doctor.json +0 -0
  413. {patchrail-0.1.0 → patchrail-0.1.1}/examples/github-action/patchrail-ci-triage-artifact/fixture-benchmark-summary.md +0 -0
  414. {patchrail-0.1.0 → patchrail-0.1.1}/examples/github-action/patchrail-ci-triage-artifact/fixture-benchmark.json +0 -0
  415. {patchrail-0.1.0 → patchrail-0.1.1}/examples/local-agent-queue/README.md +0 -0
  416. {patchrail-0.1.0 → patchrail-0.1.1}/examples/local-agent-queue/demo-summary.expected.json +0 -0
  417. {patchrail-0.1.0 → patchrail-0.1.1}/examples/local-agent-queue/run_demo.py +0 -0
  418. {patchrail-0.1.0 → patchrail-0.1.1}/examples/pilot-outcome/README.md +0 -0
  419. {patchrail-0.1.0 → patchrail-0.1.1}/examples/pilot-outcome/patchrail-own-repo-20260603.md +0 -0
  420. {patchrail-0.1.0 → patchrail-0.1.1}/examples/pilot-outcome/patchrail-own-repo-20260603.summary.json +0 -0
  421. {patchrail-0.1.0 → patchrail-0.1.1}/schemas/application_dossier.schema.json +0 -0
  422. {patchrail-0.1.0 → patchrail-0.1.1}/schemas/ci_result.schema.json +0 -0
  423. {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_audit_event.schema.json +0 -0
  424. {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_audit_summary.schema.json +0 -0
  425. {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_gate_report.schema.json +0 -0
  426. {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_policy_resolution.schema.json +0 -0
  427. {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_policy_scan.schema.json +0 -0
  428. {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_proposal.schema.json +0 -0
  429. {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_review.schema.json +0 -0
  430. {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_status.schema.json +0 -0
  431. {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_work_item.schema.json +0 -0
  432. {patchrail-0.1.0 → patchrail-0.1.1}/schemas/reviewer_quick_check_artifacts.schema.json +0 -0
  433. {patchrail-0.1.0 → patchrail-0.1.1}/scripts/release_readiness.py +0 -0
  434. {patchrail-0.1.0 → patchrail-0.1.1}/scripts/reviewer_quick_check.py +0 -0
  435. {patchrail-0.1.0 → patchrail-0.1.1}/scripts/update_ci_evidence_reference.py +0 -0
  436. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/__main__.py +0 -0
  437. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/ci/__init__.py +0 -0
  438. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/funded_issues/algora_board.py +0 -0
  439. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/funded_issues/blocklist.py +0 -0
  440. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/funded_issues/discovery.py +0 -0
  441. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/funded_issues/importers.py +0 -0
  442. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/funded_issues/source_noise.py +0 -0
  443. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/queue/__init__.py +0 -0
  444. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/queue/server.py +0 -0
  445. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/queue/status.py +0 -0
  446. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/queue/store.py +0 -0
  447. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/reviewer_quick_check.py +0 -0
  448. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/__init__.py +0 -0
  449. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/application-dossier.v1.schema.json +0 -0
  450. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/ci-benchmark.v1.schema.json +0 -0
  451. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/ci-fixture-check.v1.schema.json +0 -0
  452. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/ci-pilot-metrics.v1.schema.json +0 -0
  453. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/ci-pilot-summary.v1.schema.json +0 -0
  454. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/funded-issues-client-report.v1.schema.json +0 -0
  455. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/funded-issues-recheck-queue.v1.schema.json +0 -0
  456. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/funded-issues-recheck-summary.v1.schema.json +0 -0
  457. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/funded-issues-report.v1.schema.json +0 -0
  458. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/funded-issues-shortlist.v1.schema.json +0 -0
  459. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/funded-issues-store-status.v1.schema.json +0 -0
  460. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/funded-issues-store.v1.schema.json +0 -0
  461. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-audit-event.v1.schema.json +0 -0
  462. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-audit-summary.v1.schema.json +0 -0
  463. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-gate-report.v1.schema.json +0 -0
  464. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-policy-resolution.v1.schema.json +0 -0
  465. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-policy-scan.v1.schema.json +0 -0
  466. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-proposal.v1.schema.json +0 -0
  467. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-review.v1.schema.json +0 -0
  468. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-status.v1.schema.json +0 -0
  469. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-work-item.v1.schema.json +0 -0
  470. {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/reviewer-quick-check-artifacts.v1.schema.json +0 -0
  471. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_apply_recheck.py +0 -0
  472. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_client_report.py +0 -0
  473. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_competition.py +0 -0
  474. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_payout_effort.py +0 -0
  475. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_source_noise.py +0 -0
  476. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_staleness.py +0 -0
  477. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_testability.py +0 -0
  478. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_queue_cli.py +0 -0
  479. {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_queue_http_api.py +0 -0
@@ -1,7 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.1 - 2026-06-12
4
+
5
+ - `ci explain` now ends text and Markdown reports with a `Guide:` link to the
6
+ matching getpatchrail.com `/fix` remediation page; unknown or unpublished
7
+ failure classes fall back to the `/fix` index without a network call.
8
+ - Added `funded-issues fresh`, a local read-only radar over the tracker store
9
+ that surfaces recently posted or recently labeled funded issues for fast
10
+ solver-side triage.
11
+ - Added `pre_commit_hook_failure` CI classification so pre-commit hook output is
12
+ recognized directly while the CLI still avoids linking to a missing `/fix`
13
+ page until that guide exists.
14
+
3
15
  ## 0.2.0 - draft
4
16
 
17
+ - `ci explain` now ends every report with a `Guide:` link to the matching
18
+ remediation write-up on getpatchrail.com (`/fix/<failure-class>`, with
19
+ `utm_source=cli`). Unknown or unlisted failure classes link to the `/fix`
20
+ guide index instead. The link appears in both the text and Markdown formats;
21
+ JSON output is unchanged. Classification stays fully local -- the URL is
22
+ constructed from the failure class, with no network call.
5
23
  - Added a permanent source-level blocklist to the funded-issues tracker:
6
24
  owners manually verified as fake-bounty sources are dropped at the
7
25
  `merge_into_store` choke point (counted as `blocked` in the merge summary)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: patchrail
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: Local-first maintainer automation for open-source CI triage
5
5
  Project-URL: Homepage, https://github.com/patchrail/patchrail
6
6
  Project-URL: Documentation, https://github.com/patchrail/patchrail/tree/main/docs
@@ -39,10 +39,27 @@ PatchRail does not auto-submit pull requests, claim funded issues, or comment on
39
39
  third-party repositories. It produces evidence and reviewable suggestions so
40
40
  maintainers stay in control.
41
41
 
42
+ ## Companion guide
43
+
44
+ **CI Failure Triage Patterns** — a field guide covering 31 CI failure classes
45
+ with the signals that distinguish them and the narrow fix for each. It pairs
46
+ directly with the `patchrail ci explain` classifier in this repo:
47
+ [patchrail.gumroad.com/l/ci-failure-triage](https://patchrail.gumroad.com/l/ci-failure-triage).
48
+
49
+ Read the per-class fixes here: **[docs/fix/](docs/fix/README.md)** — each page lists
50
+ the literal log signatures, what actually happened, and the step-by-step fix.
51
+
42
52
  ## Quickstart
43
53
 
44
54
  ### 10-second reviewer demo
45
55
 
56
+ ![patchrail ci explain reading a failed CI log and emitting root cause, confidence, reproduce command, and a fix Guide URL](docs/assets/ci-explain-demo.gif)
57
+
58
+ `patchrail ci explain` reads a failed CI log and prints the root cause, a
59
+ confidence score, a one-line reproduce command, and a `Guide:` link to the
60
+ matching fix page. The screenshot above is real output from the bundled
61
+ `examples/ci-triage/typescript-import-type-drift.log` fixture.
62
+
46
63
  No install is required to inspect the current behavior. The versioned demo at
47
64
  [examples/ci-triage/demo-output.md](examples/ci-triage/demo-output.md) is real
48
65
  CLI output from the bundled `examples/ci-triage/dependency-failure.log` fixture,
@@ -69,8 +86,13 @@ The versioned no-install transcript is available at
69
86
  [examples/control-plane-demo/demo-output.md](examples/control-plane-demo/demo-output.md),
70
87
  and tests regenerate it to prevent drift.
71
88
 
72
- PyPI publishing is pending, so do not use `pipx install patchrail` yet. Until
73
- the package is on PyPI, run the public GitHub source directly:
89
+ PatchRail is published on PyPI, so the fastest install is:
90
+
91
+ ```bash
92
+ pipx install patchrail
93
+ ```
94
+
95
+ You can also run the latest source directly without installing:
74
96
 
75
97
  ```bash
76
98
  uvx --from git+https://github.com/patchrail/patchrail patchrail --help
@@ -78,7 +100,7 @@ printf 'python -m pytest -q\nFAILED tests/test_app.py::test_ok - AssertionError\
78
100
  | uvx --from git+https://github.com/patchrail/patchrail patchrail ci explain
79
101
  ```
80
102
 
81
- That pre-PyPI smoke test prints:
103
+ That smoke test prints:
82
104
 
83
105
  ```markdown
84
106
  # PatchRail CI Report
@@ -88,6 +110,7 @@ That pre-PyPI smoke test prints:
88
110
  - Subsystem: Python tests
89
111
  - Reproduce: `python -m pytest -q`
90
112
  - Suggested action: Reproduce the failing test, patch the narrow behavior drift, and rerun the focused pytest node before broad test runs.
113
+ - Guide: https://getpatchrail.com/fix/python-test-failure?utm_source=cli&utm_campaign=python-test-failure
91
114
 
92
115
  ## Evidence signals
93
116
 
@@ -141,6 +164,28 @@ Example output:
141
164
  - Reproduce: `python -m pip install -r requirements.txt`
142
165
  - Suggested action: Pin or relax the conflicting dependency range, then rerun
143
166
  the same install command and the affected tests.
167
+ - Guide: https://getpatchrail.com/fix/python-dependency-resolution?utm_source=cli&utm_campaign=python-dependency-resolution
168
+ ```
169
+
170
+ Every `ci explain` report ends with a `Guide:` link to the matching
171
+ [getpatchrail.com/fix](https://getpatchrail.com/fix?utm_source=cli) remediation
172
+ page (the guide index when the failure class is `unknown`), so the same command
173
+ that classifies a failure also points to the full write-up.
174
+
175
+ ## GitHub Action
176
+
177
+ Drop the same triage into any workflow with
178
+ [`patchrail/ci-triage-action`](https://github.com/patchrail/ci-triage-action).
179
+ On a red run it classifies the log locally and links the matching
180
+ [getpatchrail.com/fix](https://getpatchrail.com/fix) guide — no PR, no comment,
181
+ nothing leaves the runner:
182
+
183
+ ```yaml
184
+ - name: PatchRail CI triage
185
+ if: failure()
186
+ uses: patchrail/ci-triage-action@v1
187
+ with:
188
+ log-path: test.log
144
189
  ```
145
190
 
146
191
  ## Why maintainers use PatchRail
@@ -9,10 +9,27 @@ PatchRail does not auto-submit pull requests, claim funded issues, or comment on
9
9
  third-party repositories. It produces evidence and reviewable suggestions so
10
10
  maintainers stay in control.
11
11
 
12
+ ## Companion guide
13
+
14
+ **CI Failure Triage Patterns** — a field guide covering 31 CI failure classes
15
+ with the signals that distinguish them and the narrow fix for each. It pairs
16
+ directly with the `patchrail ci explain` classifier in this repo:
17
+ [patchrail.gumroad.com/l/ci-failure-triage](https://patchrail.gumroad.com/l/ci-failure-triage).
18
+
19
+ Read the per-class fixes here: **[docs/fix/](docs/fix/README.md)** — each page lists
20
+ the literal log signatures, what actually happened, and the step-by-step fix.
21
+
12
22
  ## Quickstart
13
23
 
14
24
  ### 10-second reviewer demo
15
25
 
26
+ ![patchrail ci explain reading a failed CI log and emitting root cause, confidence, reproduce command, and a fix Guide URL](docs/assets/ci-explain-demo.gif)
27
+
28
+ `patchrail ci explain` reads a failed CI log and prints the root cause, a
29
+ confidence score, a one-line reproduce command, and a `Guide:` link to the
30
+ matching fix page. The screenshot above is real output from the bundled
31
+ `examples/ci-triage/typescript-import-type-drift.log` fixture.
32
+
16
33
  No install is required to inspect the current behavior. The versioned demo at
17
34
  [examples/ci-triage/demo-output.md](examples/ci-triage/demo-output.md) is real
18
35
  CLI output from the bundled `examples/ci-triage/dependency-failure.log` fixture,
@@ -39,8 +56,13 @@ The versioned no-install transcript is available at
39
56
  [examples/control-plane-demo/demo-output.md](examples/control-plane-demo/demo-output.md),
40
57
  and tests regenerate it to prevent drift.
41
58
 
42
- PyPI publishing is pending, so do not use `pipx install patchrail` yet. Until
43
- the package is on PyPI, run the public GitHub source directly:
59
+ PatchRail is published on PyPI, so the fastest install is:
60
+
61
+ ```bash
62
+ pipx install patchrail
63
+ ```
64
+
65
+ You can also run the latest source directly without installing:
44
66
 
45
67
  ```bash
46
68
  uvx --from git+https://github.com/patchrail/patchrail patchrail --help
@@ -48,7 +70,7 @@ printf 'python -m pytest -q\nFAILED tests/test_app.py::test_ok - AssertionError\
48
70
  | uvx --from git+https://github.com/patchrail/patchrail patchrail ci explain
49
71
  ```
50
72
 
51
- That pre-PyPI smoke test prints:
73
+ That smoke test prints:
52
74
 
53
75
  ```markdown
54
76
  # PatchRail CI Report
@@ -58,6 +80,7 @@ That pre-PyPI smoke test prints:
58
80
  - Subsystem: Python tests
59
81
  - Reproduce: `python -m pytest -q`
60
82
  - Suggested action: Reproduce the failing test, patch the narrow behavior drift, and rerun the focused pytest node before broad test runs.
83
+ - Guide: https://getpatchrail.com/fix/python-test-failure?utm_source=cli&utm_campaign=python-test-failure
61
84
 
62
85
  ## Evidence signals
63
86
 
@@ -111,6 +134,28 @@ Example output:
111
134
  - Reproduce: `python -m pip install -r requirements.txt`
112
135
  - Suggested action: Pin or relax the conflicting dependency range, then rerun
113
136
  the same install command and the affected tests.
137
+ - Guide: https://getpatchrail.com/fix/python-dependency-resolution?utm_source=cli&utm_campaign=python-dependency-resolution
138
+ ```
139
+
140
+ Every `ci explain` report ends with a `Guide:` link to the matching
141
+ [getpatchrail.com/fix](https://getpatchrail.com/fix?utm_source=cli) remediation
142
+ page (the guide index when the failure class is `unknown`), so the same command
143
+ that classifies a failure also points to the full write-up.
144
+
145
+ ## GitHub Action
146
+
147
+ Drop the same triage into any workflow with
148
+ [`patchrail/ci-triage-action`](https://github.com/patchrail/ci-triage-action).
149
+ On a red run it classifies the log locally and links the matching
150
+ [getpatchrail.com/fix](https://getpatchrail.com/fix) guide — no PR, no comment,
151
+ nothing leaves the runner:
152
+
153
+ ```yaml
154
+ - name: PatchRail CI triage
155
+ if: failure()
156
+ uses: patchrail/ci-triage-action@v1
157
+ with:
158
+ log-path: test.log
114
159
  ```
115
160
 
116
161
  ## Why maintainers use PatchRail
@@ -0,0 +1,45 @@
1
+ <!-- Canonical: https://getpatchrail.com/fix -->
2
+
3
+ # CI Failure Triage — fix index
4
+
5
+ A red build usually fails for one of a small number of reasons. Find the class that matches the error in your log, and follow the narrow fix for it. Each page lists the literal log signatures, what actually happened, and a step-by-step playbook.
6
+
7
+ Canonical, formatted versions live at **[getpatchrail.com/fix](https://getpatchrail.com/fix)**.
8
+
9
+ | Failure class | Top signature |
10
+ | --- | --- |
11
+ | [Runner resource exhaustion](runner-resource-exhaustion.md) | `Process completed with exit code 137` |
12
+ | [Transient network failures](network-transient-failure.md) | `getaddrinfo EAI_AGAIN` |
13
+ | [Job timeouts and cancellations](ci-job-timeout.md) | `has exceeded the maximum execution time of 360 minutes` |
14
+ | [Python dependency resolution](python-dependency-resolution.md) | `Could not find a version that satisfies the requirement` |
15
+ | [Coverage threshold failures](code-coverage-threshold.md) | `Required test coverage of 80% not reached` |
16
+ | [Python type checking](python-type-check.md) | `Found 12 errors in 4 files` |
17
+ | [Python lint and formatting](python-lint.md) | `F401 imported but unused` |
18
+ | [Python test failures](python-test-failure.md) | `FAILED tests/test_x.py::test_name` |
19
+ | [Node package installation](node-dependency-install.md) | `npm ci can only install packages when your package.json and package-lock.json` |
20
+ | [TypeScript type checking](typescript-typecheck.md) | `error TS2339: Property 'x' does not exist on type` |
21
+ | [JavaScript and TypeScript lint](javascript-lint.md) | `error 'x' is defined but never used no-unused-vars` |
22
+ | [Broken workflow wiring](github-actions-workflow.md) | `Invalid workflow file` |
23
+ | [Artifact and cache failures](artifact-or-cache-failure.md) | `No files were found with the provided path` |
24
+ | [Publish and release conflicts](release-publish-failure.md) | `You cannot publish over the previously published versions` |
25
+ | [Checkout, clone, submodule, and LFS failures](git-checkout-failure.md) | `fatal: Authentication failed` |
26
+ | [Merge and rebase conflicts](git-merge-conflict.md) | `Automatic merge failed; fix conflicts and then commit the result` |
27
+ | [Missing secrets and insufficient permissions](secrets-or-permissions-failure.md) | `Error: Input required and not supplied` |
28
+ | [Security scan failures](security-scan-failure.md) | `found 3 high severity vulnerabilities` |
29
+ | [.NET build failures](dotnet-build-failure.md) | `error NU1605: Detected package downgrade` |
30
+ | [Java build failures](java-build-failure.md) | `Unsupported class file major version 65` |
31
+ | [Docker image build failures](docker-build-failure.md) | `failed to solve` |
32
+ | [C/C++ native build failures](cpp-build-failure.md) | `fatal error: foo.h: No such file or directory` |
33
+ | [Browser end-to-end test failures](browser-test-failure.md) | `Executable doesn't exist at /ms-playwright/chromium` |
34
+ | [Rust test failures](rust-test-failure.md) | `error[E0308]: mismatched types` |
35
+ | [Ruby Bundler failures](ruby-bundle-failure.md) | `Bundler could not find compatible versions for gem` |
36
+ | [PHP Composer failures](php-composer-failure.md) | `Your requirements could not be resolved to an installable set of packages` |
37
+ | [Go test failures](go-test-failure.md) | `--- FAIL: TestName` |
38
+ | [Node test runner failures](node-test-failure.md) | `Tests: 2 failed, 18 passed` |
39
+ | [Rust lint (clippy)](rust-lint.md) | `error: this `if` has identical blocks` |
40
+ | [Go lint (golangci-lint)](go-lint.md) | `main.go:12:6: Error return value is not checked (errcheck)` |
41
+ | [Terraform and IaC failures](terraform-iac-failure.md) | `Error acquiring the state lock` |
42
+
43
+ ---
44
+
45
+ **Want all of them in one place, offline?** The [*CI Failure Triage Patterns* pack ($19)](https://patchrail.gumroad.com/l/ci-failure-triage?utm_source=github&utm_campaign=index) bundles every class with downloadable playbooks plus the `patchrail` CLI.
@@ -0,0 +1,42 @@
1
+ <!-- Canonical: https://getpatchrail.com/fix/artifact-or-cache-failure -->
2
+
3
+ # Artifact and cache failures — No files were found with the provided path
4
+
5
+ > Part of the **CI Failure Triage** field guide. The canonical, formatted version of this page lives at **[getpatchrail.com/fix/artifact-or-cache-failure](https://getpatchrail.com/fix/artifact-or-cache-failure)**.
6
+
7
+ ## Log signatures
8
+
9
+ These are the literal strings to search for in the failed log:
10
+
11
+ ```text
12
+ No files were found with the provided path
13
+ an artifact with this name already exists
14
+ Failed to CreateArtifact
15
+ Cache service responded with 503
16
+ reserveCache failed
17
+ ```
18
+
19
+ ## What actually happened
20
+
21
+ The artifact/cache storage layer failed, for one of four reasons: a wrong path ("No files were found with the provided path" — the build put output somewhere else, or the build silently produced nothing), a name collision ("an artifact with this name already exists" — classic in matrix jobs all uploading "build"), a stale action version (v3→v4 of the artifact actions changed naming semantics and broke many pipelines), or a transient storage outage ("Cache service responded with 503"). Crucially, cache restore failures are non-fatal by design — a failed restore should slow the build down, never break it. If a failed restore breaks your build, the build has a hidden dependency on cache contents, and that's the real bug.
22
+
23
+ ## Fix it
24
+
25
+ 1. Identify which of the four causes you have from the signature.
26
+ 2. Wrong path: add ls -laR <path> just before the upload step. Nine times out of ten the build output simply isn't where the workflow thinks it is.
27
+ 3. Name collision in a matrix: suffix the artifact name with matrix variables — name: build-${{ matrix.os }}-${{ matrix.version }}.
28
+ 4. Storage 5xx: retry. It's their outage, not your bug.
29
+ 5. Bump pinned actions/upload-artifact / actions/download-artifact / actions/cache versions if they're more than a major behind. Do not change application code for this class.
30
+
31
+ ## Prevent it
32
+
33
+ - Treat cache as an optimization, never a dependency: every job must pass from a cold cache. Test it occasionally by changing the cache key prefix.
34
+
35
+ ---
36
+
37
+ **Get all 31 failure classes + the offline classifier.** The complete *CI Failure Triage Patterns* pack ($19) covers every class with downloadable step-by-step playbooks, and pairs with the `patchrail` CLI that classifies a red build locally: [patchrail.gumroad.com/l/ci-failure-triage](https://patchrail.gumroad.com/l/ci-failure-triage?utm_source=github&utm_campaign=artifact-or-cache-failure)
38
+
39
+ ```bash
40
+ pipx install patchrail
41
+ patchrail ci explain --log build.log
42
+ ```
@@ -0,0 +1,42 @@
1
+ <!-- Canonical: https://getpatchrail.com/fix/browser-test-failure -->
2
+
3
+ # Browser end-to-end test failures — Executable doesn't exist / Timeout exceeded
4
+
5
+ > Part of the **CI Failure Triage** field guide. The canonical, formatted version of this page lives at **[getpatchrail.com/fix/browser-test-failure](https://getpatchrail.com/fix/browser-test-failure)**.
6
+
7
+ ## Log signatures
8
+
9
+ These are the literal strings to search for in the failed log:
10
+
11
+ ```text
12
+ Executable doesn't exist at /ms-playwright/chromium
13
+ browserType.launch:
14
+ Timeout 30000ms exceeded
15
+ browser exited unexpectedly
16
+ CypressError
17
+ ```
18
+
19
+ ## What actually happened
20
+
21
+ E2E failures split into environment and test problems. Environment: "Executable doesn't exist" / "browserType.launch" errors mean the browser binary isn't installed in CI — for Playwright the classic miss is running npm ci but never npx playwright install --with-deps; "browser exited unexpectedly" is usually missing system libraries (headless Chrome needs a long list) or sandbox/SHM issues in containers. Test problems: "Timeout ...ms exceeded" on a locator(...) means the element never reached the expected state — either the app actually broke, the selector drifted from the DOM, or the test is racing the app (asserting before a network response settles).
22
+
23
+ ## Fix it
24
+
25
+ 1. Environment first: if the browser didn't launch, nothing else in the log matters. Add npx playwright install --with-deps (or the Cypress image) to CI and rerun.
26
+ 2. For locator timeouts, get artifacts before theorizing: Playwright traces (--trace on), screenshots and videos on failure. The trace shows the DOM at timeout — the answer is usually visible.
27
+ 3. Distinguish "element never appeared" (app or selector issue) from "element appeared then detached" (re-render race). The trace timeline tells you which.
28
+ 4. Fix races with web-first assertions that auto-wait (await expect(locator).toBeVisible()), never waitForTimeout(3000) — fixed sleeps are why the suite is flaky and slow.
29
+ 5. Selector drift: prefer role/test-id selectors (getByRole, data-testid) over CSS paths coupled to layout.
30
+
31
+ ## Prevent it
32
+
33
+ - Run E2E against deterministic backends (seeded data, mocked third parties). Most "flaky E2E" is actually nondeterministic test data, not the browser.
34
+
35
+ ---
36
+
37
+ **Get all 31 failure classes + the offline classifier.** The complete *CI Failure Triage Patterns* pack ($19) covers every class with downloadable step-by-step playbooks, and pairs with the `patchrail` CLI that classifies a red build locally: [patchrail.gumroad.com/l/ci-failure-triage](https://patchrail.gumroad.com/l/ci-failure-triage?utm_source=github&utm_campaign=browser-test-failure)
38
+
39
+ ```bash
40
+ pipx install patchrail
41
+ patchrail ci explain --log build.log
42
+ ```
@@ -0,0 +1,41 @@
1
+ <!-- Canonical: https://getpatchrail.com/fix/ci-job-timeout -->
2
+
3
+ # Job timeouts and cancellations — exceeded the maximum execution time
4
+
5
+ > Part of the **CI Failure Triage** field guide. The canonical, formatted version of this page lives at **[getpatchrail.com/fix/ci-job-timeout](https://getpatchrail.com/fix/ci-job-timeout)**.
6
+
7
+ ## Log signatures
8
+
9
+ These are the literal strings to search for in the failed log:
10
+
11
+ ```text
12
+ has exceeded the maximum execution time of 360 minutes
13
+ The operation was canceled
14
+ Too long with no output
15
+ ERROR: Job failed: execution took longer than
16
+ ran longer than the maximum time of 60 minutes
17
+ ```
18
+
19
+ ## What actually happened
20
+
21
+ Three distinct causes share these signatures, and telling them apart matters: a real time limit ("exceeded the maximum execution time") — the job is genuinely too slow, or it hung; matrix fail-fast cancellation ("The operation was canceled" on a job that was passing) — a sibling matrix job failed and CI killed the rest, so your job was innocent; output stall ("Too long with no output") — the process is alive but silent, usually a hung subprocess or a prompt waiting for input that will never come.
22
+
23
+ ## Fix it
24
+
25
+ 1. Check whether this job failed or was canceled because a sibling failed. If sibling: triage the sibling, ignore this log.
26
+ 2. If it's a real timeout, compare this run's step durations against the last green run. A step that went from 4 to 40 minutes is a hang, not slowness — look for an interactive prompt, a deadlock, or an unbounded retry loop inside it.
27
+ 3. If it's genuinely slow: cache dependencies, split the job, or parallelize the slowest step.
28
+ 4. Raise timeout-minutes only deliberately, with a comment saying why. A raised limit without a reason is a future 60-minute hang.
29
+
30
+ ## Prevent it
31
+
32
+ - Set explicit timeout-minutes per job at a value just above normal duration (e.g. p95 × 2). The default (360 minutes on GitHub Actions) means a hang costs you six hours of runner time before anyone notices.
33
+
34
+ ---
35
+
36
+ **Get all 31 failure classes + the offline classifier.** The complete *CI Failure Triage Patterns* pack ($19) covers every class with downloadable step-by-step playbooks, and pairs with the `patchrail` CLI that classifies a red build locally: [patchrail.gumroad.com/l/ci-failure-triage](https://patchrail.gumroad.com/l/ci-failure-triage?utm_source=github&utm_campaign=ci-job-timeout)
37
+
38
+ ```bash
39
+ pipx install patchrail
40
+ patchrail ci explain --log build.log
41
+ ```
@@ -0,0 +1,42 @@
1
+ <!-- Canonical: https://getpatchrail.com/fix/code-coverage-threshold -->
2
+
3
+ # Coverage threshold failures — Required test coverage of N% not met
4
+
5
+ > Part of the **CI Failure Triage** field guide. The canonical, formatted version of this page lives at **[getpatchrail.com/fix/code-coverage-threshold](https://getpatchrail.com/fix/code-coverage-threshold)**.
6
+
7
+ ## Log signatures
8
+
9
+ These are the literal strings to search for in the failed log:
10
+
11
+ ```text
12
+ Required test coverage of 80% not reached
13
+ fail_under
14
+ Coverage for project (74%) does not meet
15
+ is below the expected minimum coverage
16
+ SimpleCov failed
17
+ ```
18
+
19
+ ## What actually happened
20
+
21
+ All tests passed. The build failed because the coverage percentage fell under a configured threshold (fail_under, jest's coverageThreshold, SimpleCov's minimum, a coverage bot's project target). Mechanically this happens in two ways that feel unfair: you added well-tested code but it shifted file-level percentages, or — more often — you added a small amount of untested code to a small file, where one uncovered branch moves the percentage points. Occasionally the threshold breaks with no code change: a test that silently stopped running (collection error, renamed file not matching the test glob) lowers coverage too — check the test count against the last green run.
22
+
23
+ ## Fix it
24
+
25
+ 1. Confirm tests are green and only the threshold tripped. Compare total test count with the previous green build — a drop means tests went missing, which is the real bug.
26
+ 2. Get the uncovered lines, not just the percentage: pytest --cov --cov-report=term-missing or open the HTML report. The gate's summary names files; the report names lines.
27
+ 3. Write focused tests for the uncovered branches your PR introduced. Error paths are usually what's uncovered — and error paths are exactly where untested code hurts.
28
+ 4. Code that genuinely shouldn't count (debug helpers, platform-specific branches): exclude explicitly (# pragma: no cover with a reason, or config-level exclusions) — visible and reviewable.
29
+ 5. Lower the threshold only as a deliberate, stated decision in its own commit — never silently inside a feature PR.
30
+
31
+ ## Prevent it
32
+
33
+ - Gate on patch/diff coverage (new lines covered) rather than absolute project percentage where your tooling allows it — it measures what the PR author actually controls and ends the ratchet fights.
34
+
35
+ ---
36
+
37
+ **Get all 31 failure classes + the offline classifier.** The complete *CI Failure Triage Patterns* pack ($19) covers every class with downloadable step-by-step playbooks, and pairs with the `patchrail` CLI that classifies a red build locally: [patchrail.gumroad.com/l/ci-failure-triage](https://patchrail.gumroad.com/l/ci-failure-triage?utm_source=github&utm_campaign=code-coverage-threshold)
38
+
39
+ ```bash
40
+ pipx install patchrail
41
+ patchrail ci explain --log build.log
42
+ ```
@@ -0,0 +1,42 @@
1
+ <!-- Canonical: https://getpatchrail.com/fix/cpp-build-failure -->
2
+
3
+ # C/C++ native build failures — undefined reference / No such file
4
+
5
+ > Part of the **CI Failure Triage** field guide. The canonical, formatted version of this page lives at **[getpatchrail.com/fix/cpp-build-failure](https://getpatchrail.com/fix/cpp-build-failure)**.
6
+
7
+ ## Log signatures
8
+
9
+ These are the literal strings to search for in the failed log:
10
+
11
+ ```text
12
+ fatal error: foo.h: No such file or directory
13
+ undefined reference to `symbol'
14
+ collect2: error: ld returned 1 exit status
15
+ CMake Error
16
+ use of undeclared identifier
17
+ ```
18
+
19
+ ## What actually happened
20
+
21
+ Triage by phase, which the signatures encode: configure (CMake Error) — CMake couldn't find a dependency, compiler, or generator; nothing compiled at all. Compile ("fatal error: foo.h: No such file or directory", "was not declared in this scope" / "use of undeclared identifier" — GCC and Clang dialects of the same thing) — a missing header is almost always a missing system package or include path on the CI image, not a code bug. Link ("undefined reference to", "collect2: error: ld returned", "undefined symbols for architecture") — every object compiled, but a symbol is missing: an unlinked library, wrong link order, a missing extern "C", or an architecture mismatch (common since CI fleets went multi-arch).
22
+
23
+ ## Fix it
24
+
25
+ 1. Find the first error; make/ninja with parallel jobs interleave output and the bottom of the log is rarely the cause. "ninja: build stopped" and "make: *** [target] Error N" are just the messengers.
26
+ 2. Configure phase: read the CMake error — it names the missing package; install its dev package on the runner or pass the right -D<PKG>_ROOT.
27
+ 3. Missing header: map header → system package (pg_config.h → libpq-dev etc.) and add it to the CI image. Don't vendor the header to "fix" it.
28
+ 4. Linker undefined reference: demangle the symbol (c++filt), find which library provides it, ensure it's in the link line after the objects that use it.
29
+ 5. undefined symbols for architecture: print the arch of every linked artifact (lipo -info / file *.o) — clean and rebuild any stale ones from the other architecture.
30
+
31
+ ## Prevent it
32
+
33
+ - Build in a pinned container image with all dev packages explicit. "The runner image updated" is the top non-code cause of native build breakage.
34
+
35
+ ---
36
+
37
+ **Get all 31 failure classes + the offline classifier.** The complete *CI Failure Triage Patterns* pack ($19) covers every class with downloadable step-by-step playbooks, and pairs with the `patchrail` CLI that classifies a red build locally: [patchrail.gumroad.com/l/ci-failure-triage](https://patchrail.gumroad.com/l/ci-failure-triage?utm_source=github&utm_campaign=cpp-build-failure)
38
+
39
+ ```bash
40
+ pipx install patchrail
41
+ patchrail ci explain --log build.log
42
+ ```
@@ -0,0 +1,42 @@
1
+ <!-- Canonical: https://getpatchrail.com/fix/docker-build-failure -->
2
+
3
+ # Docker image build failures — failed to solve / failed to compute cache key
4
+
5
+ > Part of the **CI Failure Triage** field guide. The canonical, formatted version of this page lives at **[getpatchrail.com/fix/docker-build-failure](https://getpatchrail.com/fix/docker-build-failure)**.
6
+
7
+ ## Log signatures
8
+
9
+ These are the literal strings to search for in the failed log:
10
+
11
+ ```text
12
+ failed to solve
13
+ failed to compute cache key
14
+ target stage could not be found
15
+ manifest unknown: manifest not found
16
+ service db is unhealthy
17
+ ```
18
+
19
+ ## What actually happened
20
+
21
+ BuildKit's "failed to solve" is a wrapper — the real cause is the line after it. The recurring four: (1) "failed to compute cache key" + "/x: not found" — a COPY source doesn't exist in the build context, usually because .dockerignore excludes it or CI builds from a different context directory than you do locally; (2) "target stage ... could not be found" — a typo'd or renamed FROM ... AS <stage> vs --target <stage>; (3) "manifest ... not found" — the base image tag doesn't exist (deleted upstream, or no build for your platform — check --platform on multi-arch); (4) "service ... is unhealthy" — compose-specific: the image built fine but a healthcheck never went green, so the real log is the service's log, not the build log.
22
+
23
+ ## Fix it
24
+
25
+ 1. Read the line after failed to solve — that's the actual error.
26
+ 2. COPY failures: print the context as CI sees it (ls -la in the same directory the build runs from) and check .dockerignore. The file exists in the repo; it doesn't exist in the context.
27
+ 3. manifest not found: confirm the tag exists for your platform (docker manifest inspect <image>); pin a digest if the tag churns.
28
+ 4. service is unhealthy: get the service's own output (docker compose logs <service>) and triage that — the compose error is just the timeout notification. Check the healthcheck timing.
29
+ 5. Reproduce locally with the same context dir, same --target, same --platform as CI before touching the Dockerfile.
30
+
31
+ ## Prevent it
32
+
33
+ - Pin base images by digest (FROM image@sha256:...) for anything that ships; tags are mutable and latest is a time bomb.
34
+
35
+ ---
36
+
37
+ **Get all 31 failure classes + the offline classifier.** The complete *CI Failure Triage Patterns* pack ($19) covers every class with downloadable step-by-step playbooks, and pairs with the `patchrail` CLI that classifies a red build locally: [patchrail.gumroad.com/l/ci-failure-triage](https://patchrail.gumroad.com/l/ci-failure-triage?utm_source=github&utm_campaign=docker-build-failure)
38
+
39
+ ```bash
40
+ pipx install patchrail
41
+ patchrail ci explain --log build.log
42
+ ```
@@ -0,0 +1,42 @@
1
+ <!-- Canonical: https://getpatchrail.com/fix/dotnet-build-failure -->
2
+
3
+ # .NET build failures — NU1605 / NETSDK / CS errors
4
+
5
+ > Part of the **CI Failure Triage** field guide. The canonical, formatted version of this page lives at **[getpatchrail.com/fix/dotnet-build-failure](https://getpatchrail.com/fix/dotnet-build-failure)**.
6
+
7
+ ## Log signatures
8
+
9
+ These are the literal strings to search for in the failed log:
10
+
11
+ ```text
12
+ error NU1605: Detected package downgrade
13
+ error NETSDK1045: The current .NET SDK does not support targeting
14
+ error CS0246: The type or namespace name could not be found
15
+ Version conflict detected
16
+ Build FAILED
17
+ ```
18
+
19
+ ## What actually happened
20
+
21
+ The error code prefix tells you the layer, and that's the triage: NU____ (NuGet) — restore-time dependency problems; NU1605 package downgrade and Version conflict detected mean two projects in the solution pin different versions of one package. NETSDK____ — SDK/target-framework mismatch, the CI image's .NET SDK can't build the project's TargetFramework (e.g. project targets net9.0, image has SDK 8). CS____ (C# compiler) — a real compile error in your code. Xunit.Sdk / "Failed! - Failed:" — compilation succeeded; a test failed, a different problem entirely.
22
+
23
+ ## Fix it
24
+
25
+ 1. Grep the log for the first NU, NETSDK, or CS code and route accordingly.
26
+ 2. NETSDK errors: check global.json vs the SDK installed in CI (dotnet --list-sdks). Align one of them deliberately.
27
+ 3. NU conflicts: consolidate the package version across projects — central package management (Directory.Packages.props) makes the whole class structurally impossible.
28
+ 4. CS errors: ordinary compile fix; look up the code (they're well documented) and fix the narrowest site.
29
+ 5. Test failures: reproduce with dotnet test --filter "FullyQualifiedName~<TestName>" and treat as a test failure.
30
+
31
+ ## Prevent it
32
+
33
+ - Commit a global.json pinning the SDK major, and adopt central package management. Both convert "mysterious CI drift" into explicit, reviewable diffs.
34
+
35
+ ---
36
+
37
+ **Get all 31 failure classes + the offline classifier.** The complete *CI Failure Triage Patterns* pack ($19) covers every class with downloadable step-by-step playbooks, and pairs with the `patchrail` CLI that classifies a red build locally: [patchrail.gumroad.com/l/ci-failure-triage](https://patchrail.gumroad.com/l/ci-failure-triage?utm_source=github&utm_campaign=dotnet-build-failure)
38
+
39
+ ```bash
40
+ pipx install patchrail
41
+ patchrail ci explain --log build.log
42
+ ```
@@ -0,0 +1,42 @@
1
+ <!-- Canonical: https://getpatchrail.com/fix/git-checkout-failure -->
2
+
3
+ # Checkout, clone, submodule, and LFS failures — Authentication failed
4
+
5
+ > Part of the **CI Failure Triage** field guide. The canonical, formatted version of this page lives at **[getpatchrail.com/fix/git-checkout-failure](https://getpatchrail.com/fix/git-checkout-failure)**.
6
+
7
+ ## Log signatures
8
+
9
+ These are the literal strings to search for in the failed log:
10
+
11
+ ```text
12
+ fatal: Authentication failed
13
+ fatal: repository not found
14
+ fatal: reference is not a tree
15
+ Failed to clone submodule
16
+ smudge filter lfs failed
17
+ ```
18
+
19
+ ## What actually happened
20
+
21
+ Four distinct failures share this class: auth (could not read Username, Authentication failed, Repository not found — which is what private repos return to unauthorized callers, deliberately indistinguishable from "doesn't exist") — the checkout token can't see the repo, classic with private submodules; missing ref (reference is not a tree, pathspec did not match) — the commit you're trying to check out doesn't exist anymore, from a force-push during a run, or a shallow clone (fetch-depth: 1) that doesn't contain the ref a tool needs; submodule drift (Failed to clone/fetch submodule) — the parent repo pins a submodule commit that was rebased away, or the URL moved; LFS (smudge filter lfs failed, error downloading object) — a pointer file references an object the LFS store doesn't have, or LFS bandwidth quota ran out.
22
+
23
+ ## Fix it
24
+
25
+ 1. Classify into one of the four above from the first error line.
26
+ 2. Auth: confirm what token the checkout uses and what it can see. For private submodules pass an explicit token to the checkout step (with: token: / submodules: recursive).
27
+ 3. Missing ref: was the branch force-pushed mid-run? Re-trigger on the new head. If a tool needs history or tags, set fetch-depth: 0.
28
+ 4. Submodule drift: in the parent repo, git submodule update --remote, commit the new pin, push.
29
+ 5. LFS: git lfs fetch --all locally to find the missing object; check the LFS bandwidth quota before assuming corruption.
30
+
31
+ ## Prevent it
32
+
33
+ - If you don't strictly need submodules, replace them with package dependencies or vendoring — submodules are the single most failure-prone link between repos. If you keep them, document the token each CI consumer needs.
34
+
35
+ ---
36
+
37
+ **Get all 31 failure classes + the offline classifier.** The complete *CI Failure Triage Patterns* pack ($19) covers every class with downloadable step-by-step playbooks, and pairs with the `patchrail` CLI that classifies a red build locally: [patchrail.gumroad.com/l/ci-failure-triage](https://patchrail.gumroad.com/l/ci-failure-triage?utm_source=github&utm_campaign=git-checkout-failure)
38
+
39
+ ```bash
40
+ pipx install patchrail
41
+ patchrail ci explain --log build.log
42
+ ```