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.
- {patchrail-0.1.0 → patchrail-0.1.1}/CHANGELOG.md +18 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/PKG-INFO +49 -4
- {patchrail-0.1.0 → patchrail-0.1.1}/README.md +48 -3
- patchrail-0.1.1/docs/assets/ci-explain-demo.gif +0 -0
- patchrail-0.1.1/docs/assets/ci-explain-demo.png +0 -0
- patchrail-0.1.1/docs/fix/README.md +45 -0
- patchrail-0.1.1/docs/fix/artifact-or-cache-failure.md +42 -0
- patchrail-0.1.1/docs/fix/browser-test-failure.md +42 -0
- patchrail-0.1.1/docs/fix/ci-job-timeout.md +41 -0
- patchrail-0.1.1/docs/fix/code-coverage-threshold.md +42 -0
- patchrail-0.1.1/docs/fix/cpp-build-failure.md +42 -0
- patchrail-0.1.1/docs/fix/docker-build-failure.md +42 -0
- patchrail-0.1.1/docs/fix/dotnet-build-failure.md +42 -0
- patchrail-0.1.1/docs/fix/git-checkout-failure.md +42 -0
- patchrail-0.1.1/docs/fix/git-merge-conflict.md +42 -0
- patchrail-0.1.1/docs/fix/github-actions-workflow.md +41 -0
- patchrail-0.1.1/docs/fix/go-lint.md +42 -0
- patchrail-0.1.1/docs/fix/go-test-failure.md +41 -0
- patchrail-0.1.1/docs/fix/java-build-failure.md +42 -0
- patchrail-0.1.1/docs/fix/javascript-lint.md +41 -0
- patchrail-0.1.1/docs/fix/network-transient-failure.md +42 -0
- patchrail-0.1.1/docs/fix/node-dependency-install.md +42 -0
- patchrail-0.1.1/docs/fix/node-test-failure.md +42 -0
- patchrail-0.1.1/docs/fix/php-composer-failure.md +42 -0
- patchrail-0.1.1/docs/fix/python-dependency-resolution.md +42 -0
- patchrail-0.1.1/docs/fix/python-lint.md +42 -0
- patchrail-0.1.1/docs/fix/python-test-failure.md +41 -0
- patchrail-0.1.1/docs/fix/python-type-check.md +42 -0
- patchrail-0.1.1/docs/fix/release-publish-failure.md +42 -0
- patchrail-0.1.1/docs/fix/ruby-bundle-failure.md +42 -0
- patchrail-0.1.1/docs/fix/runner-resource-exhaustion.md +42 -0
- patchrail-0.1.1/docs/fix/rust-lint.md +41 -0
- patchrail-0.1.1/docs/fix/rust-test-failure.md +41 -0
- patchrail-0.1.1/docs/fix/secrets-or-permissions-failure.md +42 -0
- patchrail-0.1.1/docs/fix/security-scan-failure.md +42 -0
- patchrail-0.1.1/docs/fix/terraform-iac-failure.md +42 -0
- patchrail-0.1.1/docs/fix/typescript-typecheck.md +42 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/pilot-guide.md +3 -2
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/pilot-request-package.md +3 -2
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/quickstart.md +8 -3
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/demo-output.md +1 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/pyproject.toml +1 -1
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/__init__.py +1 -1
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/ci/classify.py +21 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/cli.py +1225 -2
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/funded_issues/__init__.py +4 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/funded_issues/store.py +340 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/ci-result.v1.schema.json +1 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/web_metrics.py +17 -13
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_ci_classify_expansion.py +28 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_ci_cli.py +78 -1
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_algora_board.py +2 -6
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_blocklist.py +1 -3
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_cli.py +2210 -0
- patchrail-0.1.1/tests/test_funded_issues_store.py +1276 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_public_workflows.py +32 -14
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_web_metrics_cli.py +10 -10
- {patchrail-0.1.0 → patchrail-0.1.1}/uv.lock +1 -1
- patchrail-0.1.0/tests/test_funded_issues_store.py +0 -313
- {patchrail-0.1.0 → patchrail-0.1.1}/.agents/skills/patchrail-ci-triage/SKILL.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/.agents/skills/patchrail-release-captain/SKILL.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/.agents/skills/patchrail-review-guardrails/SKILL.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/.gitignore +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/ADOPTERS.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/AGENTS.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/CODE_OF_CONDUCT.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/CONTRIBUTING.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/ETHICS.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/GOVERNANCE.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/LICENSE +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/SECURITY.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/agent-control-plane.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/agent-workflows.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/api-reference.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/ci-failure-zoo.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/ci-janitor.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/codex-workflows.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/funded-issues-ethics.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/github-action.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/metrics.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/open-source-program-evidence.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/openai-open-source-evidence.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/public-workflow-ledger.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/release-process.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/release-v0.1.0-evidence.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/release-v0.2.0-evidence.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/release-v0.3.0-evidence.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/release-v0.4.0-evidence.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/roadmap.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/docs/threat-model.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/browser-playwright-navigation-timeout.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/browser-playwright-navigation-timeout.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/browser-playwright-webserver-timeout.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/browser-playwright-webserver-timeout.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/cypress-browser-launch.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/cypress-browser-launch.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dependency-failure.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dependency-failure.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-base-image-manifest-not-found.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-base-image-manifest-not-found.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-buildkit-missing-context.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-buildkit-missing-context.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-buildkit-missing-stage.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-buildkit-missing-stage.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-compose-healthcheck.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-compose-healthcheck.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-compose-missing-env-file.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/docker-compose-missing-env-file.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-csharp-compile-error.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-csharp-compile-error.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-nuget-package-downgrade.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-nuget-package-downgrade.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-nuget-version-conflict.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-nuget-version-conflict.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-sdk-target-framework-mismatch.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-sdk-target-framework-mismatch.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-xunit-assertion.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/dotnet-xunit-assertion.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-bad-shell.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-bad-shell.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-invalid-workflow.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-invalid-workflow.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-matrix-expression.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-matrix-expression.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-missing-workflow-ref.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-missing-workflow-ref.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-permission-id-token.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-permission-id-token.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-permission.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-permission.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-token-permission.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-token-permission.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-unresolved-action.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-unresolved-action.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-unresolved-checkout.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-unresolved-checkout.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-yaml-syntax.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/github-actions-yaml-syntax.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-assertion-fail.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-assertion-fail.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-compile-failure.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-compile-failure.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-compile-interface.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-compile-interface.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-data-race-test.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-data-race-test.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-module-missing-symbol.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-module-missing-symbol.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-panic-in-test.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-panic-in-test.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-timeout-race.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-timeout-race.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-timeout.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-timeout.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-undefined-function.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-undefined-function.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-undefined-symbol.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/go-undefined-symbol.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-dependency-resolution.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-dependency-resolution.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-no-tests-found.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-no-tests-found.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-toolchain-version.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-toolchain-version.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-unsupported-major-version.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-gradle-unsupported-major-version.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-maven-compilation.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/java-maven-compilation.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-biome-format.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-biome-format.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-a11y.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-a11y.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-config-parser-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-config-parser-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-import-order.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-import-order.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-no-undef.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-no-undef.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-react-hooks.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-react-hooks.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-unused-vars.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint-unused-vars.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-eslint.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-prettier-format.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-prettier-format.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-prettier-generated-client-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-prettier-generated-client-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-prettier.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/javascript-prettier.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-lockfile-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-lockfile-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-ci-lock-outdated.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-ci-lock-outdated.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-engine-mismatch.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-engine-mismatch.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-eresolve-react.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-eresolve-react.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-missing-lockfile.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-missing-lockfile.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-missing-package-lock.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-missing-package-lock.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-workspace-lock-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-npm-workspace-lock-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-peer-dependency.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-peer-dependency.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-catalog-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-catalog-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-frozen-lockfile.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-frozen-lockfile.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-lockfile-config-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-lockfile-config-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-peer-conflict-react.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-peer-conflict-react.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-peer-optional.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-peer-optional.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-workspace-protocol.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-pnpm-workspace-protocol.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-constraints-peer-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-constraints-peer-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-immutable-cache-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-immutable-cache-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-immutable-install.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-immutable-install.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-peer-dependency.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-peer-dependency.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-peer-version.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/node-yarn-peer-version.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-composer-lock-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-composer-lock-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-composer-missing-package.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-composer-missing-package.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-composer-platform-version.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-composer-platform-version.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-phpunit-autoload-class-not-found.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-phpunit-autoload-class-not-found.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-phpunit-failure.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/php-phpunit-failure.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/playwright-missing-browsers.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/playwright-missing-browsers.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/playwright-selector-timeout.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/playwright-selector-timeout.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-hatch-build-dependency.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-hatch-build-dependency.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-module-import.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-module-import.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-conflicting-constraints.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-conflicting-constraints.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-constraint-marker-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-constraint-marker-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-constraint-pin-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-constraint-pin-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-extra-conflict.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-extra-conflict.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-index-timeout-backtrack.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-index-timeout-backtrack.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-marker-py310.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-marker-py310.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-missing-musllinux-wheel.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-missing-musllinux-wheel.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-no-matching-distribution.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-no-matching-distribution.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-platform-arm64-wheel.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-platform-arm64-wheel.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-platform-wheel.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-platform-wheel.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-prerelease-range.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-prerelease-range.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-python-version-marker.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-python-version-marker.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-tools-backtracking.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-tools-backtracking.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-tools-conflict.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-tools-conflict.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-tools-extra-marker-conflict.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-tools-extra-marker-conflict.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-yanked-only-candidate.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-yanked-only-candidate.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-yanked-release.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pip-yanked-release.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-poetry-python-range-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-poetry-python-range-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-poetry-solver-conflict.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-poetry-solver-conflict.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-poetry-transitive-conflict.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-poetry-transitive-conflict.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pytest-env-token-redacted.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-pytest-env-token-redacted.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-assert-json.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-assert-json.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-failure.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-failure.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-fixture-timeout.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-fixture-timeout.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-import-mode.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-import-mode.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-module-not-found.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-module-not-found.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-parametrize-regression.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-parametrize-regression.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-snapshot-diff.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-test-snapshot-diff.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-tox-constraint-conflict.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-tox-constraint-conflict.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-constraint-backtrack-fail.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-constraint-backtrack-fail.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-extra-marker-conflict.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-extra-marker-conflict.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-extra-python-marker-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-extra-python-marker-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-resolution-no-solution.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/python-uv-resolution-no-solution.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-bundler-conflict.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-bundler-conflict.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-bundler-missing-gem.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-bundler-missing-gem.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-bundler-platform-lock.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-bundler-platform-lock.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-gem-native-extension.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-gem-native-extension.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-rake-aborted.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-rake-aborted.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-rspec-failure.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-rspec-failure.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-ruby-version-lock.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-ruby-version-lock.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-yanked-gem.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/ruby-yanked-gem.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-compile-error.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-compile-error.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0277-trait-bound.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0277-trait-bound.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0308-mismatched-types.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0308-mismatched-types.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0382-moved-value.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0382-moved-value.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0502-borrow-checker.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0502-borrow-checker.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0599-method-not-found.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-e0599-method-not-found.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-panic-thread.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-panic-thread.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-snapshot-failure.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-snapshot-failure.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-test-failure.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-test-failure.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-trait-bound-error.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/rust-trait-bound-error.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-cargo-audit-rustsec.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-cargo-audit-rustsec.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-gosec-findings.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-gosec-findings.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-npm-audit-critical.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-npm-audit-critical.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-pip-audit-vulnerability.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-pip-audit-vulnerability.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-trivy-container-critical.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/security-trivy-container-critical.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-generated-client-schema-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-generated-client-schema-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-import-type-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-import-type-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-jsx-prop-mismatch.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-jsx-prop-mismatch.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-missing-name.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-missing-name.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-path-alias-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-path-alias-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-route-param-mismatch.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-route-param-mismatch.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-schema-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-schema-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2304-missing-global.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2304-missing-global.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2322-prop.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2322-prop.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2345-route-param.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2345-route-param.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2416-class-override.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2416-class-override.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2551-import-name.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2551-import-name.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2741-required-prop.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2741-required-prop.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2769-overload.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts2769-overload.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts7006-implicit-any.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-ts7006-implicit-any.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-tsconfig-lib-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-tsconfig-lib-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-typecheck.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-typecheck.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-vite-env-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-vite-env-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-zod-schema-drift.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/ci-triage/typescript-zod-schema-drift.log +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/control-plane-demo/README.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/control-plane-demo/demo-output.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/README.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/client-profile-python.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/competition-observations.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/demo-summary.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/issues.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/payout-effort-observations.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/provider-github-export.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/run_demo.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/staleness-observations.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/funded-issues-readonly/testability-observations.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/github-action/README.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/github-action/patchrail-ci-triage-artifact/ci-report.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/github-action/patchrail-ci-triage-artifact/ci-result.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/github-action/patchrail-ci-triage-artifact/doctor.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/github-action/patchrail-ci-triage-artifact/fixture-benchmark-summary.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/github-action/patchrail-ci-triage-artifact/fixture-benchmark.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/local-agent-queue/README.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/local-agent-queue/demo-summary.expected.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/local-agent-queue/run_demo.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/pilot-outcome/README.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/pilot-outcome/patchrail-own-repo-20260603.md +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/examples/pilot-outcome/patchrail-own-repo-20260603.summary.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/schemas/application_dossier.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/schemas/ci_result.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_audit_event.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_audit_summary.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_gate_report.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_policy_resolution.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_policy_scan.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_proposal.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_review.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_status.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/schemas/queue_work_item.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/schemas/reviewer_quick_check_artifacts.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/scripts/release_readiness.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/scripts/reviewer_quick_check.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/scripts/update_ci_evidence_reference.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/__main__.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/ci/__init__.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/funded_issues/algora_board.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/funded_issues/blocklist.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/funded_issues/discovery.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/funded_issues/importers.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/funded_issues/source_noise.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/queue/__init__.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/queue/server.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/queue/status.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/queue/store.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/reviewer_quick_check.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/__init__.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/application-dossier.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/ci-benchmark.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/ci-fixture-check.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/ci-pilot-metrics.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/ci-pilot-summary.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/funded-issues-client-report.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/funded-issues-recheck-queue.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/funded-issues-recheck-summary.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/funded-issues-report.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/funded-issues-shortlist.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/funded-issues-store-status.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/funded-issues-store.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-audit-event.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-audit-summary.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-gate-report.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-policy-resolution.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-policy-scan.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-proposal.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-review.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-status.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/queue-work-item.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/src/patchrail/schemas/reviewer-quick-check-artifacts.v1.schema.json +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_apply_recheck.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_client_report.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_competition.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_payout_effort.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_source_noise.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_staleness.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_funded_issues_testability.py +0 -0
- {patchrail-0.1.0 → patchrail-0.1.1}/tests/test_queue_cli.py +0 -0
- {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.
|
|
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
|
+

|
|
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
|
-
|
|
73
|
-
|
|
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
|
|
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
|
+

|
|
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
|
-
|
|
43
|
-
|
|
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
|
|
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
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
+
```
|