patchrail 0.1.1__tar.gz → 0.2.0__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.1 → patchrail-0.2.0}/.gitignore +1 -0
- patchrail-0.2.0/CHANGELOG.md +83 -0
- patchrail-0.2.0/PKG-INFO +214 -0
- patchrail-0.2.0/README.md +183 -0
- patchrail-0.2.0/actions/ci-triage/action.yml +105 -0
- patchrail-0.2.0/actions/ci-triage/scripts/ci_triage_action_outputs.py +221 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/demo-output.md +0 -1
- patchrail-0.2.0/examples/ci-triage-action/README.md +71 -0
- patchrail-0.2.0/examples/ci-triage-action/sample/ci-report.md +18 -0
- patchrail-0.2.0/examples/ci-triage-action/sample/ci-result.json +21 -0
- patchrail-0.2.0/examples/ci-triage-action/sample/github-output.txt +16 -0
- patchrail-0.2.0/examples/ci-triage-action/sample/step-summary.md +8 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/pyproject.toml +4 -5
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/__init__.py +1 -1
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/ci/classify.py +19 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/cli.py +677 -176
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/funded_issues/discovery.py +3 -3
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/application-dossier.v1.schema.json +1 -1
- {patchrail-0.1.1 → patchrail-0.2.0}/uv.lock +1 -1
- patchrail-0.1.1/CHANGELOG.md +0 -113
- patchrail-0.1.1/PKG-INFO +0 -324
- patchrail-0.1.1/README.md +0 -294
- patchrail-0.1.1/docs/agent-control-plane.md +0 -332
- patchrail-0.1.1/docs/agent-workflows.md +0 -24
- patchrail-0.1.1/docs/api-reference.md +0 -591
- 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/ci-failure-zoo.md +0 -157
- patchrail-0.1.1/docs/ci-janitor.md +0 -75
- patchrail-0.1.1/docs/codex-workflows.md +0 -93
- patchrail-0.1.1/docs/fix/README.md +0 -45
- patchrail-0.1.1/docs/fix/artifact-or-cache-failure.md +0 -42
- patchrail-0.1.1/docs/fix/browser-test-failure.md +0 -42
- patchrail-0.1.1/docs/fix/ci-job-timeout.md +0 -41
- patchrail-0.1.1/docs/fix/code-coverage-threshold.md +0 -42
- patchrail-0.1.1/docs/fix/cpp-build-failure.md +0 -42
- patchrail-0.1.1/docs/fix/docker-build-failure.md +0 -42
- patchrail-0.1.1/docs/fix/dotnet-build-failure.md +0 -42
- patchrail-0.1.1/docs/fix/git-checkout-failure.md +0 -42
- patchrail-0.1.1/docs/fix/git-merge-conflict.md +0 -42
- patchrail-0.1.1/docs/fix/github-actions-workflow.md +0 -41
- patchrail-0.1.1/docs/fix/go-lint.md +0 -42
- patchrail-0.1.1/docs/fix/go-test-failure.md +0 -41
- patchrail-0.1.1/docs/fix/java-build-failure.md +0 -42
- patchrail-0.1.1/docs/fix/javascript-lint.md +0 -41
- patchrail-0.1.1/docs/fix/network-transient-failure.md +0 -42
- patchrail-0.1.1/docs/fix/node-dependency-install.md +0 -42
- patchrail-0.1.1/docs/fix/node-test-failure.md +0 -42
- patchrail-0.1.1/docs/fix/php-composer-failure.md +0 -42
- patchrail-0.1.1/docs/fix/python-dependency-resolution.md +0 -42
- patchrail-0.1.1/docs/fix/python-lint.md +0 -42
- patchrail-0.1.1/docs/fix/python-test-failure.md +0 -41
- patchrail-0.1.1/docs/fix/python-type-check.md +0 -42
- patchrail-0.1.1/docs/fix/release-publish-failure.md +0 -42
- patchrail-0.1.1/docs/fix/ruby-bundle-failure.md +0 -42
- patchrail-0.1.1/docs/fix/runner-resource-exhaustion.md +0 -42
- patchrail-0.1.1/docs/fix/rust-lint.md +0 -41
- patchrail-0.1.1/docs/fix/rust-test-failure.md +0 -41
- patchrail-0.1.1/docs/fix/secrets-or-permissions-failure.md +0 -42
- patchrail-0.1.1/docs/fix/security-scan-failure.md +0 -42
- patchrail-0.1.1/docs/fix/terraform-iac-failure.md +0 -42
- patchrail-0.1.1/docs/fix/typescript-typecheck.md +0 -42
- patchrail-0.1.1/docs/funded-issues-ethics.md +0 -79
- patchrail-0.1.1/docs/github-action.md +0 -106
- patchrail-0.1.1/docs/metrics.md +0 -157
- patchrail-0.1.1/docs/open-source-program-evidence.md +0 -342
- patchrail-0.1.1/docs/openai-open-source-evidence.md +0 -381
- patchrail-0.1.1/docs/pilot-guide.md +0 -208
- patchrail-0.1.1/docs/pilot-request-package.md +0 -138
- patchrail-0.1.1/docs/public-workflow-ledger.md +0 -135
- patchrail-0.1.1/docs/quickstart.md +0 -119
- patchrail-0.1.1/docs/release-process.md +0 -251
- patchrail-0.1.1/docs/release-v0.1.0-evidence.md +0 -169
- patchrail-0.1.1/docs/release-v0.2.0-evidence.md +0 -93
- patchrail-0.1.1/docs/release-v0.3.0-evidence.md +0 -175
- patchrail-0.1.1/docs/release-v0.4.0-evidence.md +0 -90
- patchrail-0.1.1/docs/roadmap.md +0 -92
- patchrail-0.1.1/docs/threat-model.md +0 -68
- patchrail-0.1.1/schemas/application_dossier.schema.json +0 -305
- patchrail-0.1.1/schemas/ci_result.schema.json +0 -120
- patchrail-0.1.1/schemas/queue_audit_event.schema.json +0 -44
- patchrail-0.1.1/schemas/queue_audit_summary.schema.json +0 -169
- patchrail-0.1.1/schemas/queue_gate_report.schema.json +0 -158
- patchrail-0.1.1/schemas/queue_policy_resolution.schema.json +0 -188
- patchrail-0.1.1/schemas/queue_policy_scan.schema.json +0 -175
- patchrail-0.1.1/schemas/queue_proposal.schema.json +0 -61
- patchrail-0.1.1/schemas/queue_review.schema.json +0 -218
- patchrail-0.1.1/schemas/queue_status.schema.json +0 -179
- patchrail-0.1.1/schemas/queue_work_item.schema.json +0 -64
- patchrail-0.1.1/schemas/reviewer_quick_check_artifacts.schema.json +0 -104
- patchrail-0.1.1/scripts/release_readiness.py +0 -206
- patchrail-0.1.1/scripts/reviewer_quick_check.py +0 -13
- patchrail-0.1.1/scripts/update_ci_evidence_reference.py +0 -110
- patchrail-0.1.1/src/patchrail/web_metrics.py +0 -653
- patchrail-0.1.1/tests/test_ci_classify_expansion.py +0 -600
- patchrail-0.1.1/tests/test_ci_cli.py +0 -1644
- patchrail-0.1.1/tests/test_funded_issues_algora_board.py +0 -288
- patchrail-0.1.1/tests/test_funded_issues_apply_recheck.py +0 -368
- patchrail-0.1.1/tests/test_funded_issues_blocklist.py +0 -168
- patchrail-0.1.1/tests/test_funded_issues_cli.py +0 -4880
- patchrail-0.1.1/tests/test_funded_issues_client_report.py +0 -361
- patchrail-0.1.1/tests/test_funded_issues_competition.py +0 -212
- patchrail-0.1.1/tests/test_funded_issues_payout_effort.py +0 -230
- patchrail-0.1.1/tests/test_funded_issues_source_noise.py +0 -528
- patchrail-0.1.1/tests/test_funded_issues_staleness.py +0 -222
- patchrail-0.1.1/tests/test_funded_issues_store.py +0 -1276
- patchrail-0.1.1/tests/test_funded_issues_testability.py +0 -206
- patchrail-0.1.1/tests/test_public_workflows.py +0 -2618
- patchrail-0.1.1/tests/test_queue_cli.py +0 -1654
- patchrail-0.1.1/tests/test_queue_http_api.py +0 -142
- patchrail-0.1.1/tests/test_web_metrics_cli.py +0 -305
- {patchrail-0.1.1 → patchrail-0.2.0}/.agents/skills/patchrail-ci-triage/SKILL.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/.agents/skills/patchrail-release-captain/SKILL.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/.agents/skills/patchrail-review-guardrails/SKILL.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/ADOPTERS.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/AGENTS.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/CODE_OF_CONDUCT.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/CONTRIBUTING.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/ETHICS.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/GOVERNANCE.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/LICENSE +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/SECURITY.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/browser-playwright-navigation-timeout.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/browser-playwright-navigation-timeout.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/browser-playwright-webserver-timeout.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/browser-playwright-webserver-timeout.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/cypress-browser-launch.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/cypress-browser-launch.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dependency-failure.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dependency-failure.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-base-image-manifest-not-found.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-base-image-manifest-not-found.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-buildkit-missing-context.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-buildkit-missing-context.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-buildkit-missing-stage.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-buildkit-missing-stage.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-compose-healthcheck.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-compose-healthcheck.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-compose-missing-env-file.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-compose-missing-env-file.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-csharp-compile-error.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-csharp-compile-error.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-nuget-package-downgrade.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-nuget-package-downgrade.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-nuget-version-conflict.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-nuget-version-conflict.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-sdk-target-framework-mismatch.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-sdk-target-framework-mismatch.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-xunit-assertion.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-xunit-assertion.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-bad-shell.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-bad-shell.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-invalid-workflow.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-invalid-workflow.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-matrix-expression.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-matrix-expression.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-missing-workflow-ref.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-missing-workflow-ref.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-permission-id-token.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-permission-id-token.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-permission.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-permission.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-token-permission.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-token-permission.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-unresolved-action.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-unresolved-action.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-unresolved-checkout.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-unresolved-checkout.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-yaml-syntax.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-yaml-syntax.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-assertion-fail.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-assertion-fail.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-compile-failure.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-compile-failure.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-compile-interface.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-compile-interface.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-data-race-test.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-data-race-test.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-module-missing-symbol.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-module-missing-symbol.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-panic-in-test.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-panic-in-test.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-timeout-race.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-timeout-race.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-timeout.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-timeout.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-undefined-function.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-undefined-function.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-undefined-symbol.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-undefined-symbol.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-dependency-resolution.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-dependency-resolution.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-no-tests-found.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-no-tests-found.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-toolchain-version.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-toolchain-version.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-unsupported-major-version.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-unsupported-major-version.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-maven-compilation.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-maven-compilation.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-biome-format.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-biome-format.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-a11y.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-a11y.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-config-parser-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-config-parser-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-import-order.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-import-order.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-no-undef.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-no-undef.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-react-hooks.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-react-hooks.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-unused-vars.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-unused-vars.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-prettier-format.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-prettier-format.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-prettier-generated-client-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-prettier-generated-client-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-prettier.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-prettier.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-lockfile-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-lockfile-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-ci-lock-outdated.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-ci-lock-outdated.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-engine-mismatch.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-engine-mismatch.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-eresolve-react.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-eresolve-react.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-missing-lockfile.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-missing-lockfile.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-missing-package-lock.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-missing-package-lock.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-workspace-lock-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-workspace-lock-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-peer-dependency.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-peer-dependency.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-catalog-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-catalog-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-frozen-lockfile.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-frozen-lockfile.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-lockfile-config-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-lockfile-config-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-peer-conflict-react.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-peer-conflict-react.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-peer-optional.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-peer-optional.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-workspace-protocol.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-workspace-protocol.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-constraints-peer-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-constraints-peer-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-immutable-cache-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-immutable-cache-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-immutable-install.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-immutable-install.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-peer-dependency.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-peer-dependency.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-peer-version.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-peer-version.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-composer-lock-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-composer-lock-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-composer-missing-package.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-composer-missing-package.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-composer-platform-version.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-composer-platform-version.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-phpunit-autoload-class-not-found.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-phpunit-autoload-class-not-found.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-phpunit-failure.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-phpunit-failure.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/playwright-missing-browsers.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/playwright-missing-browsers.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/playwright-selector-timeout.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/playwright-selector-timeout.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-hatch-build-dependency.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-hatch-build-dependency.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-module-import.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-module-import.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-conflicting-constraints.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-conflicting-constraints.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-constraint-marker-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-constraint-marker-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-constraint-pin-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-constraint-pin-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-extra-conflict.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-extra-conflict.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-index-timeout-backtrack.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-index-timeout-backtrack.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-marker-py310.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-marker-py310.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-missing-musllinux-wheel.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-missing-musllinux-wheel.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-no-matching-distribution.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-no-matching-distribution.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-platform-arm64-wheel.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-platform-arm64-wheel.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-platform-wheel.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-platform-wheel.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-prerelease-range.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-prerelease-range.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-python-version-marker.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-python-version-marker.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-tools-backtracking.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-tools-backtracking.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-tools-conflict.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-tools-conflict.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-tools-extra-marker-conflict.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-tools-extra-marker-conflict.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-yanked-only-candidate.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-yanked-only-candidate.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-yanked-release.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-yanked-release.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-poetry-python-range-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-poetry-python-range-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-poetry-solver-conflict.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-poetry-solver-conflict.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-poetry-transitive-conflict.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-poetry-transitive-conflict.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pytest-env-token-redacted.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pytest-env-token-redacted.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-assert-json.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-assert-json.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-failure.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-failure.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-fixture-timeout.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-fixture-timeout.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-import-mode.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-import-mode.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-module-not-found.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-module-not-found.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-parametrize-regression.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-parametrize-regression.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-snapshot-diff.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-snapshot-diff.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-tox-constraint-conflict.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-tox-constraint-conflict.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-constraint-backtrack-fail.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-constraint-backtrack-fail.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-extra-marker-conflict.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-extra-marker-conflict.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-extra-python-marker-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-extra-python-marker-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-resolution-no-solution.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-resolution-no-solution.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-bundler-conflict.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-bundler-conflict.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-bundler-missing-gem.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-bundler-missing-gem.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-bundler-platform-lock.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-bundler-platform-lock.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-gem-native-extension.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-gem-native-extension.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-rake-aborted.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-rake-aborted.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-rspec-failure.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-rspec-failure.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-ruby-version-lock.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-ruby-version-lock.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-yanked-gem.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-yanked-gem.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-compile-error.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-compile-error.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0277-trait-bound.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0277-trait-bound.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0308-mismatched-types.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0308-mismatched-types.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0382-moved-value.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0382-moved-value.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0502-borrow-checker.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0502-borrow-checker.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0599-method-not-found.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0599-method-not-found.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-panic-thread.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-panic-thread.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-snapshot-failure.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-snapshot-failure.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-test-failure.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-test-failure.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-trait-bound-error.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-trait-bound-error.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-cargo-audit-rustsec.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-cargo-audit-rustsec.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-gosec-findings.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-gosec-findings.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-npm-audit-critical.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-npm-audit-critical.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-pip-audit-vulnerability.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-pip-audit-vulnerability.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-trivy-container-critical.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-trivy-container-critical.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-generated-client-schema-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-generated-client-schema-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-import-type-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-import-type-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-jsx-prop-mismatch.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-jsx-prop-mismatch.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-missing-name.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-missing-name.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-path-alias-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-path-alias-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-route-param-mismatch.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-route-param-mismatch.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-schema-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-schema-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2304-missing-global.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2304-missing-global.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2322-prop.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2322-prop.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2345-route-param.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2345-route-param.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2416-class-override.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2416-class-override.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2551-import-name.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2551-import-name.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2741-required-prop.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2741-required-prop.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2769-overload.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2769-overload.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts7006-implicit-any.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts7006-implicit-any.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-tsconfig-lib-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-tsconfig-lib-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-typecheck.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-typecheck.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-vite-env-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-vite-env-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-zod-schema-drift.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-zod-schema-drift.log +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/control-plane-demo/README.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/control-plane-demo/demo-output.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/README.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/client-profile-python.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/competition-observations.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/demo-summary.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/issues.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/payout-effort-observations.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/provider-github-export.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/run_demo.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/staleness-observations.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/testability-observations.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/github-action/README.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/github-action/patchrail-ci-triage-artifact/ci-report.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/github-action/patchrail-ci-triage-artifact/ci-result.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/github-action/patchrail-ci-triage-artifact/doctor.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/github-action/patchrail-ci-triage-artifact/fixture-benchmark-summary.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/github-action/patchrail-ci-triage-artifact/fixture-benchmark.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/local-agent-queue/README.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/local-agent-queue/demo-summary.expected.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/local-agent-queue/run_demo.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/pilot-outcome/README.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/pilot-outcome/patchrail-own-repo-20260603.md +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/examples/pilot-outcome/patchrail-own-repo-20260603.summary.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/__main__.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/ci/__init__.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/funded_issues/__init__.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/funded_issues/algora_board.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/funded_issues/blocklist.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/funded_issues/importers.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/funded_issues/source_noise.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/funded_issues/store.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/queue/__init__.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/queue/server.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/queue/status.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/queue/store.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/reviewer_quick_check.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/__init__.py +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/ci-benchmark.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/ci-fixture-check.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/ci-pilot-metrics.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/ci-pilot-summary.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/ci-result.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/funded-issues-client-report.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/funded-issues-recheck-queue.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/funded-issues-recheck-summary.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/funded-issues-report.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/funded-issues-shortlist.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/funded-issues-store-status.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/funded-issues-store.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-audit-event.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-audit-summary.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-gate-report.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-policy-resolution.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-policy-scan.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-proposal.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-review.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-status.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-work-item.v1.schema.json +0 -0
- {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/reviewer-quick-check-artifacts.v1.schema.json +0 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.2.0 - 2026-07-07
|
|
4
|
+
|
|
5
|
+
### Removed
|
|
6
|
+
|
|
7
|
+
- Removed the commercial `Guide:` link that `ci explain` appended to text and
|
|
8
|
+
Markdown reports, and the matching guide URL outputs from the GitHub Action.
|
|
9
|
+
Reports now end after the classification; per-class remediation write-ups
|
|
10
|
+
live in-repo under `docs/fix/`.
|
|
11
|
+
- Removed commercial product links and campaign-tagged URLs from the README,
|
|
12
|
+
docs, and the PyPI project URL list.
|
|
13
|
+
- Removed the distribution and web-metrics tooling (`ci share-links` and the
|
|
14
|
+
web metrics commands and store). PatchRail no longer ships link-tracking or
|
|
15
|
+
distribution helpers.
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- `funded-issues` is now explicitly labeled experimental. Discovery commands
|
|
20
|
+
default to safe-only filtering, and risky entries require an explicit
|
|
21
|
+
`--include-risky` flag.
|
|
22
|
+
- Rewrote the README around the open-source CI triage workflow: quickstart
|
|
23
|
+
with real classifier output, honest feature table, local-first safety
|
|
24
|
+
section, and the fixture contribution path.
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- Added `node_script_missing` CI classification so npm/pnpm/yarn jobs that
|
|
29
|
+
call a missing package script are separated from dependency-install failures
|
|
30
|
+
and routed to a workflow/script repair path.
|
|
31
|
+
- Added a permanent source-level blocklist to the funded-issues tracker:
|
|
32
|
+
owners manually verified as fake-bounty sources are dropped at the
|
|
33
|
+
`merge_into_store` choke point (counted as `blocked` in the merge summary)
|
|
34
|
+
and `purge_blocklisted_entries` removes any legacy entries; `track` runs the
|
|
35
|
+
purge on every merge so existing stores self-heal.
|
|
36
|
+
- Added `funded-issues import-algora-board`, an offline parser for a locally
|
|
37
|
+
saved Algora organization bounty-board page. It extracts the funder-stated
|
|
38
|
+
USD amount, GitHub issue reference, posting age, and declared claim count
|
|
39
|
+
per bounty, and can merge the scored records into a tracker store. No
|
|
40
|
+
network access is performed.
|
|
41
|
+
- Added read-only competition and payout-vs-effort scoring signals plus the
|
|
42
|
+
`funded-issues competition` and `funded-issues payout-effort` batch
|
|
43
|
+
commands, all derived from public metadata observations with no claims,
|
|
44
|
+
comments, or maintainer contact.
|
|
45
|
+
- Added an offline owner-level `source_noise` heuristic and
|
|
46
|
+
`funded-issues apply-recheck`, a local-file-only command that transitions
|
|
47
|
+
tracker entries to closed / stale / active from recheck observations.
|
|
48
|
+
- Added .NET/NuGet/C# and xUnit fixture coverage for `dotnet restore`,
|
|
49
|
+
`dotnet build`, and `dotnet test` failure modes, growing the public CI
|
|
50
|
+
fixture zoo to 153 cases.
|
|
51
|
+
|
|
52
|
+
## 0.1.1 - 2026-06-12
|
|
53
|
+
|
|
54
|
+
- `ci explain` now ends text and Markdown reports with a `Guide:` link to the
|
|
55
|
+
matching getpatchrail.com `/fix` remediation page; unknown or unpublished
|
|
56
|
+
failure classes fall back to the `/fix` index without a network call.
|
|
57
|
+
- Added `funded-issues fresh`, a local read-only radar over the tracker store
|
|
58
|
+
that surfaces recently posted or recently labeled funded issues for fast
|
|
59
|
+
solver-side triage.
|
|
60
|
+
- Added `pre_commit_hook_failure` CI classification so pre-commit hook output is
|
|
61
|
+
recognized directly while the CLI still avoids linking to a missing `/fix`
|
|
62
|
+
page until that guide exists.
|
|
63
|
+
|
|
64
|
+
## 0.1.0 - 2026-06-02
|
|
65
|
+
|
|
66
|
+
- Initial public CI Janitor snapshot.
|
|
67
|
+
- Added `patchrail ci explain` and `patchrail ci classify`.
|
|
68
|
+
- Added local Markdown, JSON, and text reports.
|
|
69
|
+
- Added Apache-2.0 license and safety/ethics documentation.
|
|
70
|
+
- Added fixture-backed tests, local benchmark command, and GitHub Actions CI.
|
|
71
|
+
- Expanded the initial CI fixture zoo to 101 sanitized synthetic examples across
|
|
72
|
+
Python, Node, TypeScript, Go, Rust, and GitHub Actions failure modes.
|
|
73
|
+
- Added a read-only GitHub Actions triage artifact workflow.
|
|
74
|
+
- Added the experimental local Agent Control Plane queue with SQLite-backed
|
|
75
|
+
work items, approval states, audit export, CI result import, and proposal
|
|
76
|
+
records.
|
|
77
|
+
- Added the experimental read-only `funded-issues` CLI over local metadata,
|
|
78
|
+
with safe-only filtering and explicit anti-abuse blocked actions.
|
|
79
|
+
- Added permission-only adopter reporting and a public metrics tracker for
|
|
80
|
+
pilot outcomes, adoption signals, and open-source program evidence gaps.
|
|
81
|
+
- Added release-prep evidence docs, package smoke checks, and manual publish
|
|
82
|
+
gates. Release tags, PyPI publishing, GitHub Releases, and public
|
|
83
|
+
announcements remain maintainer actions.
|
patchrail-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: patchrail
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Local-first maintainer automation for open-source CI triage
|
|
5
|
+
Project-URL: Homepage, https://github.com/patchrail/patchrail
|
|
6
|
+
Project-URL: Documentation, https://github.com/patchrail/patchrail/tree/main/docs
|
|
7
|
+
Project-URL: Changelog, https://github.com/patchrail/patchrail/blob/main/CHANGELOG.md
|
|
8
|
+
Project-URL: Issues, https://github.com/patchrail/patchrail/issues
|
|
9
|
+
Project-URL: GitHub Action, https://github.com/patchrail/ci-triage-action
|
|
10
|
+
Author: Pablo Guillén
|
|
11
|
+
License-Expression: Apache-2.0
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: ci,github-actions,maintenance,open-source,triage
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Environment :: Console
|
|
16
|
+
Classifier: Intended Audience :: Developers
|
|
17
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
23
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
24
|
+
Requires-Python: >=3.11
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: build>=1.2; extra == 'dev'
|
|
27
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
28
|
+
Requires-Dist: ruff>=0.5; extra == 'dev'
|
|
29
|
+
Requires-Dist: twine>=5.1; extra == 'dev'
|
|
30
|
+
Description-Content-Type: text/markdown
|
|
31
|
+
|
|
32
|
+
# PatchRail
|
|
33
|
+
|
|
34
|
+
Local-first CI failure triage for open-source maintainers. Paste a failing CI
|
|
35
|
+
log, get the failure class, the reproduction command, and a suggested fix
|
|
36
|
+
strategy — in seconds, fully offline.
|
|
37
|
+
|
|
38
|
+
[](https://pypi.org/project/patchrail/)
|
|
39
|
+
[](https://github.com/patchrail/patchrail/actions/workflows/ci.yml)
|
|
40
|
+
[](LICENSE)
|
|
41
|
+
[](https://pypi.org/project/patchrail/)
|
|
42
|
+
|
|
43
|
+

|
|
44
|
+
|
|
45
|
+
The recording above is real output from the bundled
|
|
46
|
+
`examples/ci-triage/typescript-import-type-drift.log` fixture. No model calls,
|
|
47
|
+
no network, no telemetry: the classifier is a curated rule engine that runs
|
|
48
|
+
entirely on your machine.
|
|
49
|
+
|
|
50
|
+
## Why maintainers use it
|
|
51
|
+
|
|
52
|
+
- **33 failure classes** backed by real log signatures — dependency
|
|
53
|
+
resolution, flaky network, OOM-killed runners, Docker builds, lint,
|
|
54
|
+
type checks, and test failures across Python, Node, TypeScript, Go, Rust,
|
|
55
|
+
Java, .NET, Ruby, PHP, and C++.
|
|
56
|
+
- **153 sanitized CI log fixtures** keep the classifier honest: every rule is
|
|
57
|
+
benchmarked against the public fixture zoo in `examples/ci-triage/` on every
|
|
58
|
+
test run.
|
|
59
|
+
- **23 secret-redaction patterns** (GitHub/GitLab/npm/PyPI/AWS tokens, private
|
|
60
|
+
keys, JWTs, emails, home paths) so logs can be shared safely.
|
|
61
|
+
- **Local-first by design**: no network access, no billing, no external model,
|
|
62
|
+
no telemetry. Nothing leaves the machine.
|
|
63
|
+
- **Markdown for humans, JSON for automation** — pipe the same result into a
|
|
64
|
+
PR comment or a workflow step.
|
|
65
|
+
|
|
66
|
+
## Quickstart
|
|
67
|
+
|
|
68
|
+
PatchRail is published on PyPI:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
pipx install patchrail
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Classify any failed CI log:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
patchrail ci explain --log failed-ci.log
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Or try it on a bundled fixture from a clone of this repo:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
git clone https://github.com/patchrail/patchrail
|
|
84
|
+
cd patchrail
|
|
85
|
+
patchrail ci explain --log examples/ci-triage/dependency-failure.log --format markdown
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Real output:
|
|
89
|
+
|
|
90
|
+
```markdown
|
|
91
|
+
# PatchRail CI Report
|
|
92
|
+
|
|
93
|
+
- Root cause: `python_dependency_resolution`
|
|
94
|
+
- Confidence: `0.95`
|
|
95
|
+
- Subsystem: Python dependency installation
|
|
96
|
+
- Reproduce: `python -m pip install -r requirements.txt`
|
|
97
|
+
- Suggested action: Pin or relax the conflicting dependency range, then rerun the same install command and the affected tests.
|
|
98
|
+
|
|
99
|
+
## Evidence signals
|
|
100
|
+
|
|
101
|
+
- `Could not find a version that satisfies the requirement`
|
|
102
|
+
- `ResolutionImpossible`
|
|
103
|
+
- `python -m pip install`
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
It also reads from stdin, so you can pipe a log straight in:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
tail -n 200 failed-ci.log | patchrail ci explain
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Every failure class has a step-by-step remediation write-up in
|
|
113
|
+
[docs/fix/](docs/fix/README.md).
|
|
114
|
+
|
|
115
|
+
## GitHub Action
|
|
116
|
+
|
|
117
|
+
Run the same triage on every red CI run with
|
|
118
|
+
[`patchrail/ci-triage-action`](https://github.com/patchrail/ci-triage-action)
|
|
119
|
+
(also on the
|
|
120
|
+
[GitHub Marketplace](https://github.com/marketplace/actions/patchrail-ci-triage)).
|
|
121
|
+
It classifies the log locally on the runner — no PR, no comment, nothing
|
|
122
|
+
leaves the job:
|
|
123
|
+
|
|
124
|
+
```yaml
|
|
125
|
+
- name: PatchRail CI triage
|
|
126
|
+
if: failure()
|
|
127
|
+
uses: patchrail/ci-triage-action@v1
|
|
128
|
+
with:
|
|
129
|
+
log-path: test.log
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
See [examples/ci-triage-action](examples/ci-triage-action/README.md) for the
|
|
133
|
+
report artifact shape.
|
|
134
|
+
|
|
135
|
+
## Features
|
|
136
|
+
|
|
137
|
+
| Feature | Status | Notes |
|
|
138
|
+
| --- | --- | --- |
|
|
139
|
+
| CI failure triage (`ci explain`, `ci classify`) | Beta | 33 failure classes for GitHub Actions-style logs and common toolchains |
|
|
140
|
+
| Secret redaction (`redact`, `ci explain --redact`) | Beta | 23 patterns for tokens, keys, emails, and home paths |
|
|
141
|
+
| Reports | Beta | Markdown, JSON, and plain text |
|
|
142
|
+
| Fixture benchmark (`ci benchmark`) | Beta | Scores the classifier against all 153 public fixtures |
|
|
143
|
+
| GitHub Action | Beta | Read-only triage artifact on failed workflows |
|
|
144
|
+
| Local queue / control plane (`queue`) | Experimental | SQLite-backed work items with human approval states |
|
|
145
|
+
| Funded issue discovery (`funded-issues`) | Experimental (read-only) | Safe-only defaults, no claiming or commenting; see [docs/funded-issues-ethics.md](docs/funded-issues-ethics.md) |
|
|
146
|
+
|
|
147
|
+
## Local-first & safety
|
|
148
|
+
|
|
149
|
+
PatchRail never phones home. The classifier needs no API key, no GitHub App,
|
|
150
|
+
no repo write permission, and no external model call. Write actions (PRs,
|
|
151
|
+
comments, claims) are out of scope; anything that could become one sits behind
|
|
152
|
+
an explicit human approval state.
|
|
153
|
+
|
|
154
|
+
Secret redaction is a first-class feature, not an afterthought. Redact a log
|
|
155
|
+
before sharing it anywhere:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
patchrail redact --log failed.log > failed.redacted.log
|
|
159
|
+
patchrail ci explain --redact --log failed.log
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
The redaction pass covers GitHub, GitLab, npm, PyPI, AWS, Stripe, Slack,
|
|
163
|
+
Google, Hugging Face, and SendGrid credentials, private key blocks, JWTs,
|
|
164
|
+
bearer tokens, URL-embedded credentials, `*_TOKEN`/`*_SECRET` environment
|
|
165
|
+
assignments, email addresses, and user home paths.
|
|
166
|
+
|
|
167
|
+
See [ETHICS.md](ETHICS.md), [SECURITY.md](SECURITY.md), and
|
|
168
|
+
[docs/threat-model.md](docs/threat-model.md).
|
|
169
|
+
|
|
170
|
+
## Roadmap
|
|
171
|
+
|
|
172
|
+
- **v0.3** — public demo of the local agent control plane: SQLite-backed work
|
|
173
|
+
queue, approval gates, and audit export.
|
|
174
|
+
- **v0.4** — ethical funded-maintenance workflow: read-only discovery with
|
|
175
|
+
human-gated follow-up, no automated claiming.
|
|
176
|
+
|
|
177
|
+
Details in [docs/roadmap.md](docs/roadmap.md).
|
|
178
|
+
|
|
179
|
+
## Documentation
|
|
180
|
+
|
|
181
|
+
- [Quickstart](docs/quickstart.md)
|
|
182
|
+
- [Fix guides per failure class](docs/fix/README.md)
|
|
183
|
+
- [CI Failure Zoo](docs/ci-failure-zoo.md)
|
|
184
|
+
- [GitHub Actions CI triage](docs/github-action.md)
|
|
185
|
+
- [Agent Control Plane](docs/agent-control-plane.md)
|
|
186
|
+
- [API reference](docs/api-reference.md)
|
|
187
|
+
- [Threat model](docs/threat-model.md)
|
|
188
|
+
- [Funded issue ethics](docs/funded-issues-ethics.md)
|
|
189
|
+
|
|
190
|
+
## Contributing
|
|
191
|
+
|
|
192
|
+
The fastest way in is **adding a CI fixture — it takes about 10 minutes**:
|
|
193
|
+
grab a failed log, redact it, trim it to the smallest excerpt that still shows
|
|
194
|
+
the root cause, and add it with its expected classification under
|
|
195
|
+
`examples/ci-triage/`. The full path is in
|
|
196
|
+
[CONTRIBUTING.md](CONTRIBUTING.md), and the
|
|
197
|
+
[CI failure fixture issue template](.github/ISSUE_TEMPLATE/ci_failure_fixture.md)
|
|
198
|
+
works if you are not ready to open a pull request.
|
|
199
|
+
|
|
200
|
+
Issues labeled
|
|
201
|
+
[`good first issue`](https://github.com/patchrail/patchrail/labels/good%20first%20issue)
|
|
202
|
+
are scoped for first-time contributors.
|
|
203
|
+
|
|
204
|
+
Run the checks locally before opening a PR:
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
uv run --extra dev pytest -q
|
|
208
|
+
uv run --extra dev ruff check .
|
|
209
|
+
uv run --extra dev patchrail ci benchmark examples/ci-triage --format json
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## License
|
|
213
|
+
|
|
214
|
+
Apache-2.0.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# PatchRail
|
|
2
|
+
|
|
3
|
+
Local-first CI failure triage for open-source maintainers. Paste a failing CI
|
|
4
|
+
log, get the failure class, the reproduction command, and a suggested fix
|
|
5
|
+
strategy — in seconds, fully offline.
|
|
6
|
+
|
|
7
|
+
[](https://pypi.org/project/patchrail/)
|
|
8
|
+
[](https://github.com/patchrail/patchrail/actions/workflows/ci.yml)
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](https://pypi.org/project/patchrail/)
|
|
11
|
+
|
|
12
|
+

|
|
13
|
+
|
|
14
|
+
The recording above is real output from the bundled
|
|
15
|
+
`examples/ci-triage/typescript-import-type-drift.log` fixture. No model calls,
|
|
16
|
+
no network, no telemetry: the classifier is a curated rule engine that runs
|
|
17
|
+
entirely on your machine.
|
|
18
|
+
|
|
19
|
+
## Why maintainers use it
|
|
20
|
+
|
|
21
|
+
- **33 failure classes** backed by real log signatures — dependency
|
|
22
|
+
resolution, flaky network, OOM-killed runners, Docker builds, lint,
|
|
23
|
+
type checks, and test failures across Python, Node, TypeScript, Go, Rust,
|
|
24
|
+
Java, .NET, Ruby, PHP, and C++.
|
|
25
|
+
- **153 sanitized CI log fixtures** keep the classifier honest: every rule is
|
|
26
|
+
benchmarked against the public fixture zoo in `examples/ci-triage/` on every
|
|
27
|
+
test run.
|
|
28
|
+
- **23 secret-redaction patterns** (GitHub/GitLab/npm/PyPI/AWS tokens, private
|
|
29
|
+
keys, JWTs, emails, home paths) so logs can be shared safely.
|
|
30
|
+
- **Local-first by design**: no network access, no billing, no external model,
|
|
31
|
+
no telemetry. Nothing leaves the machine.
|
|
32
|
+
- **Markdown for humans, JSON for automation** — pipe the same result into a
|
|
33
|
+
PR comment or a workflow step.
|
|
34
|
+
|
|
35
|
+
## Quickstart
|
|
36
|
+
|
|
37
|
+
PatchRail is published on PyPI:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pipx install patchrail
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Classify any failed CI log:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
patchrail ci explain --log failed-ci.log
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Or try it on a bundled fixture from a clone of this repo:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
git clone https://github.com/patchrail/patchrail
|
|
53
|
+
cd patchrail
|
|
54
|
+
patchrail ci explain --log examples/ci-triage/dependency-failure.log --format markdown
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Real output:
|
|
58
|
+
|
|
59
|
+
```markdown
|
|
60
|
+
# PatchRail CI Report
|
|
61
|
+
|
|
62
|
+
- Root cause: `python_dependency_resolution`
|
|
63
|
+
- Confidence: `0.95`
|
|
64
|
+
- Subsystem: Python dependency installation
|
|
65
|
+
- Reproduce: `python -m pip install -r requirements.txt`
|
|
66
|
+
- Suggested action: Pin or relax the conflicting dependency range, then rerun the same install command and the affected tests.
|
|
67
|
+
|
|
68
|
+
## Evidence signals
|
|
69
|
+
|
|
70
|
+
- `Could not find a version that satisfies the requirement`
|
|
71
|
+
- `ResolutionImpossible`
|
|
72
|
+
- `python -m pip install`
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
It also reads from stdin, so you can pipe a log straight in:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
tail -n 200 failed-ci.log | patchrail ci explain
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Every failure class has a step-by-step remediation write-up in
|
|
82
|
+
[docs/fix/](docs/fix/README.md).
|
|
83
|
+
|
|
84
|
+
## GitHub Action
|
|
85
|
+
|
|
86
|
+
Run the same triage on every red CI run with
|
|
87
|
+
[`patchrail/ci-triage-action`](https://github.com/patchrail/ci-triage-action)
|
|
88
|
+
(also on the
|
|
89
|
+
[GitHub Marketplace](https://github.com/marketplace/actions/patchrail-ci-triage)).
|
|
90
|
+
It classifies the log locally on the runner — no PR, no comment, nothing
|
|
91
|
+
leaves the job:
|
|
92
|
+
|
|
93
|
+
```yaml
|
|
94
|
+
- name: PatchRail CI triage
|
|
95
|
+
if: failure()
|
|
96
|
+
uses: patchrail/ci-triage-action@v1
|
|
97
|
+
with:
|
|
98
|
+
log-path: test.log
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
See [examples/ci-triage-action](examples/ci-triage-action/README.md) for the
|
|
102
|
+
report artifact shape.
|
|
103
|
+
|
|
104
|
+
## Features
|
|
105
|
+
|
|
106
|
+
| Feature | Status | Notes |
|
|
107
|
+
| --- | --- | --- |
|
|
108
|
+
| CI failure triage (`ci explain`, `ci classify`) | Beta | 33 failure classes for GitHub Actions-style logs and common toolchains |
|
|
109
|
+
| Secret redaction (`redact`, `ci explain --redact`) | Beta | 23 patterns for tokens, keys, emails, and home paths |
|
|
110
|
+
| Reports | Beta | Markdown, JSON, and plain text |
|
|
111
|
+
| Fixture benchmark (`ci benchmark`) | Beta | Scores the classifier against all 153 public fixtures |
|
|
112
|
+
| GitHub Action | Beta | Read-only triage artifact on failed workflows |
|
|
113
|
+
| Local queue / control plane (`queue`) | Experimental | SQLite-backed work items with human approval states |
|
|
114
|
+
| Funded issue discovery (`funded-issues`) | Experimental (read-only) | Safe-only defaults, no claiming or commenting; see [docs/funded-issues-ethics.md](docs/funded-issues-ethics.md) |
|
|
115
|
+
|
|
116
|
+
## Local-first & safety
|
|
117
|
+
|
|
118
|
+
PatchRail never phones home. The classifier needs no API key, no GitHub App,
|
|
119
|
+
no repo write permission, and no external model call. Write actions (PRs,
|
|
120
|
+
comments, claims) are out of scope; anything that could become one sits behind
|
|
121
|
+
an explicit human approval state.
|
|
122
|
+
|
|
123
|
+
Secret redaction is a first-class feature, not an afterthought. Redact a log
|
|
124
|
+
before sharing it anywhere:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
patchrail redact --log failed.log > failed.redacted.log
|
|
128
|
+
patchrail ci explain --redact --log failed.log
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
The redaction pass covers GitHub, GitLab, npm, PyPI, AWS, Stripe, Slack,
|
|
132
|
+
Google, Hugging Face, and SendGrid credentials, private key blocks, JWTs,
|
|
133
|
+
bearer tokens, URL-embedded credentials, `*_TOKEN`/`*_SECRET` environment
|
|
134
|
+
assignments, email addresses, and user home paths.
|
|
135
|
+
|
|
136
|
+
See [ETHICS.md](ETHICS.md), [SECURITY.md](SECURITY.md), and
|
|
137
|
+
[docs/threat-model.md](docs/threat-model.md).
|
|
138
|
+
|
|
139
|
+
## Roadmap
|
|
140
|
+
|
|
141
|
+
- **v0.3** — public demo of the local agent control plane: SQLite-backed work
|
|
142
|
+
queue, approval gates, and audit export.
|
|
143
|
+
- **v0.4** — ethical funded-maintenance workflow: read-only discovery with
|
|
144
|
+
human-gated follow-up, no automated claiming.
|
|
145
|
+
|
|
146
|
+
Details in [docs/roadmap.md](docs/roadmap.md).
|
|
147
|
+
|
|
148
|
+
## Documentation
|
|
149
|
+
|
|
150
|
+
- [Quickstart](docs/quickstart.md)
|
|
151
|
+
- [Fix guides per failure class](docs/fix/README.md)
|
|
152
|
+
- [CI Failure Zoo](docs/ci-failure-zoo.md)
|
|
153
|
+
- [GitHub Actions CI triage](docs/github-action.md)
|
|
154
|
+
- [Agent Control Plane](docs/agent-control-plane.md)
|
|
155
|
+
- [API reference](docs/api-reference.md)
|
|
156
|
+
- [Threat model](docs/threat-model.md)
|
|
157
|
+
- [Funded issue ethics](docs/funded-issues-ethics.md)
|
|
158
|
+
|
|
159
|
+
## Contributing
|
|
160
|
+
|
|
161
|
+
The fastest way in is **adding a CI fixture — it takes about 10 minutes**:
|
|
162
|
+
grab a failed log, redact it, trim it to the smallest excerpt that still shows
|
|
163
|
+
the root cause, and add it with its expected classification under
|
|
164
|
+
`examples/ci-triage/`. The full path is in
|
|
165
|
+
[CONTRIBUTING.md](CONTRIBUTING.md), and the
|
|
166
|
+
[CI failure fixture issue template](.github/ISSUE_TEMPLATE/ci_failure_fixture.md)
|
|
167
|
+
works if you are not ready to open a pull request.
|
|
168
|
+
|
|
169
|
+
Issues labeled
|
|
170
|
+
[`good first issue`](https://github.com/patchrail/patchrail/labels/good%20first%20issue)
|
|
171
|
+
are scoped for first-time contributors.
|
|
172
|
+
|
|
173
|
+
Run the checks locally before opening a PR:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
uv run --extra dev pytest -q
|
|
177
|
+
uv run --extra dev ruff check .
|
|
178
|
+
uv run --extra dev patchrail ci benchmark examples/ci-triage --format json
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## License
|
|
182
|
+
|
|
183
|
+
Apache-2.0.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
name: PatchRail CI Triage
|
|
2
|
+
description: Classify a CI log locally and expose PatchRail triage outputs.
|
|
3
|
+
|
|
4
|
+
inputs:
|
|
5
|
+
log-path:
|
|
6
|
+
description: Path to the failed CI log inside the checked-out repository.
|
|
7
|
+
required: true
|
|
8
|
+
report-dir:
|
|
9
|
+
description: Directory where PatchRail writes the markdown and JSON reports.
|
|
10
|
+
required: false
|
|
11
|
+
default: patchrail-ci-triage
|
|
12
|
+
redact:
|
|
13
|
+
description: Redact secrets, emails, and local home paths before writing reports.
|
|
14
|
+
required: false
|
|
15
|
+
default: "true"
|
|
16
|
+
|
|
17
|
+
outputs:
|
|
18
|
+
failure-class:
|
|
19
|
+
description: PatchRail failure class for the CI log.
|
|
20
|
+
value: ${{ steps.outputs.outputs.failure-class }}
|
|
21
|
+
failure-slug:
|
|
22
|
+
description: URL-safe PatchRail failure class slug for labels and artifacts.
|
|
23
|
+
value: ${{ steps.outputs.outputs.failure-slug }}
|
|
24
|
+
confidence:
|
|
25
|
+
description: PatchRail classifier confidence.
|
|
26
|
+
value: ${{ steps.outputs.outputs.confidence }}
|
|
27
|
+
json-result:
|
|
28
|
+
description: Path to the structured PatchRail result JSON.
|
|
29
|
+
value: ${{ steps.outputs.outputs.json-result }}
|
|
30
|
+
artifact-name:
|
|
31
|
+
description: Stable artifact name for uploading the PatchRail triage bundle.
|
|
32
|
+
value: ${{ steps.outputs.outputs.artifact-name }}
|
|
33
|
+
markdown-report:
|
|
34
|
+
description: Path to the maintainer-readable PatchRail report.
|
|
35
|
+
value: ${{ steps.outputs.outputs.markdown-report }}
|
|
36
|
+
summary-line:
|
|
37
|
+
description: One-line PatchRail triage summary for GitHub step summaries.
|
|
38
|
+
value: ${{ steps.outputs.outputs.summary-line }}
|
|
39
|
+
redacted-categories:
|
|
40
|
+
description: Number of local redaction categories found in the CI log.
|
|
41
|
+
value: ${{ steps.outputs.outputs.redacted-categories }}
|
|
42
|
+
adoption-key:
|
|
43
|
+
description: Stable PatchRail adoption evidence key for downstream dashboards.
|
|
44
|
+
value: ${{ steps.outputs.outputs.adoption-key }}
|
|
45
|
+
adoption-event-id:
|
|
46
|
+
description: Stable event id for deduplicating PatchRail workflow evidence.
|
|
47
|
+
value: ${{ steps.outputs.outputs.adoption-event-id }}
|
|
48
|
+
adoption-event-json:
|
|
49
|
+
description: Single-line PatchRail adoption event JSON for workflow evidence ledgers.
|
|
50
|
+
value: ${{ steps.outputs.outputs.adoption-event-json }}
|
|
51
|
+
workflow-repository:
|
|
52
|
+
description: Repository where the PatchRail triage action ran, when available.
|
|
53
|
+
value: ${{ steps.outputs.outputs.workflow-repository }}
|
|
54
|
+
workflow-run-url:
|
|
55
|
+
description: GitHub Actions run URL for the triage execution, when available.
|
|
56
|
+
value: ${{ steps.outputs.outputs.workflow-run-url }}
|
|
57
|
+
workflow-run-host:
|
|
58
|
+
description: Host that executed the triage workflow, for github.com/GHES attribution.
|
|
59
|
+
value: ${{ steps.outputs.outputs.workflow-run-host }}
|
|
60
|
+
next-step:
|
|
61
|
+
description: Minimal next repair step for the detected CI failure.
|
|
62
|
+
value: ${{ steps.outputs.outputs.next-step }}
|
|
63
|
+
reproduction-command:
|
|
64
|
+
description: Local command PatchRail recommends to reproduce the detected failure.
|
|
65
|
+
value: ${{ steps.outputs.outputs.reproduction-command }}
|
|
66
|
+
|
|
67
|
+
runs:
|
|
68
|
+
using: composite
|
|
69
|
+
steps:
|
|
70
|
+
- name: Install PatchRail
|
|
71
|
+
shell: bash
|
|
72
|
+
run: |
|
|
73
|
+
set -euo pipefail
|
|
74
|
+
python -m pip install "$GITHUB_ACTION_PATH/../.."
|
|
75
|
+
|
|
76
|
+
- name: Generate PatchRail reports
|
|
77
|
+
shell: bash
|
|
78
|
+
run: |
|
|
79
|
+
set -euo pipefail
|
|
80
|
+
log_path="${{ inputs.log-path }}"
|
|
81
|
+
report_dir="${{ inputs.report-dir }}"
|
|
82
|
+
redact_arg=""
|
|
83
|
+
if [ "${{ inputs.redact }}" = "true" ]; then
|
|
84
|
+
redact_arg="--redact"
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
test -f "$log_path"
|
|
88
|
+
mkdir -p "$report_dir"
|
|
89
|
+
patchrail ci classify $redact_arg --log "$log_path" --format json --out "$report_dir/ci-result.json"
|
|
90
|
+
patchrail ci explain $redact_arg --log "$log_path" --format markdown --out "$report_dir/ci-report.md"
|
|
91
|
+
|
|
92
|
+
- name: Export action outputs
|
|
93
|
+
id: outputs
|
|
94
|
+
shell: bash
|
|
95
|
+
run: |
|
|
96
|
+
set -euo pipefail
|
|
97
|
+
summary_arg=()
|
|
98
|
+
if [ -n "${GITHUB_STEP_SUMMARY:-}" ]; then
|
|
99
|
+
summary_arg=(--summary "$GITHUB_STEP_SUMMARY")
|
|
100
|
+
fi
|
|
101
|
+
python "$GITHUB_ACTION_PATH/scripts/ci_triage_action_outputs.py" \
|
|
102
|
+
--result "${{ inputs.report-dir }}/ci-result.json" \
|
|
103
|
+
--report "${{ inputs.report-dir }}/ci-report.md" \
|
|
104
|
+
--output "$GITHUB_OUTPUT" \
|
|
105
|
+
"${summary_arg[@]}"
|