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.
Files changed (488) hide show
  1. {patchrail-0.1.1 → patchrail-0.2.0}/.gitignore +1 -0
  2. patchrail-0.2.0/CHANGELOG.md +83 -0
  3. patchrail-0.2.0/PKG-INFO +214 -0
  4. patchrail-0.2.0/README.md +183 -0
  5. patchrail-0.2.0/actions/ci-triage/action.yml +105 -0
  6. patchrail-0.2.0/actions/ci-triage/scripts/ci_triage_action_outputs.py +221 -0
  7. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/demo-output.md +0 -1
  8. patchrail-0.2.0/examples/ci-triage-action/README.md +71 -0
  9. patchrail-0.2.0/examples/ci-triage-action/sample/ci-report.md +18 -0
  10. patchrail-0.2.0/examples/ci-triage-action/sample/ci-result.json +21 -0
  11. patchrail-0.2.0/examples/ci-triage-action/sample/github-output.txt +16 -0
  12. patchrail-0.2.0/examples/ci-triage-action/sample/step-summary.md +8 -0
  13. {patchrail-0.1.1 → patchrail-0.2.0}/pyproject.toml +4 -5
  14. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/__init__.py +1 -1
  15. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/ci/classify.py +19 -0
  16. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/cli.py +677 -176
  17. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/funded_issues/discovery.py +3 -3
  18. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/application-dossier.v1.schema.json +1 -1
  19. {patchrail-0.1.1 → patchrail-0.2.0}/uv.lock +1 -1
  20. patchrail-0.1.1/CHANGELOG.md +0 -113
  21. patchrail-0.1.1/PKG-INFO +0 -324
  22. patchrail-0.1.1/README.md +0 -294
  23. patchrail-0.1.1/docs/agent-control-plane.md +0 -332
  24. patchrail-0.1.1/docs/agent-workflows.md +0 -24
  25. patchrail-0.1.1/docs/api-reference.md +0 -591
  26. patchrail-0.1.1/docs/assets/ci-explain-demo.gif +0 -0
  27. patchrail-0.1.1/docs/assets/ci-explain-demo.png +0 -0
  28. patchrail-0.1.1/docs/ci-failure-zoo.md +0 -157
  29. patchrail-0.1.1/docs/ci-janitor.md +0 -75
  30. patchrail-0.1.1/docs/codex-workflows.md +0 -93
  31. patchrail-0.1.1/docs/fix/README.md +0 -45
  32. patchrail-0.1.1/docs/fix/artifact-or-cache-failure.md +0 -42
  33. patchrail-0.1.1/docs/fix/browser-test-failure.md +0 -42
  34. patchrail-0.1.1/docs/fix/ci-job-timeout.md +0 -41
  35. patchrail-0.1.1/docs/fix/code-coverage-threshold.md +0 -42
  36. patchrail-0.1.1/docs/fix/cpp-build-failure.md +0 -42
  37. patchrail-0.1.1/docs/fix/docker-build-failure.md +0 -42
  38. patchrail-0.1.1/docs/fix/dotnet-build-failure.md +0 -42
  39. patchrail-0.1.1/docs/fix/git-checkout-failure.md +0 -42
  40. patchrail-0.1.1/docs/fix/git-merge-conflict.md +0 -42
  41. patchrail-0.1.1/docs/fix/github-actions-workflow.md +0 -41
  42. patchrail-0.1.1/docs/fix/go-lint.md +0 -42
  43. patchrail-0.1.1/docs/fix/go-test-failure.md +0 -41
  44. patchrail-0.1.1/docs/fix/java-build-failure.md +0 -42
  45. patchrail-0.1.1/docs/fix/javascript-lint.md +0 -41
  46. patchrail-0.1.1/docs/fix/network-transient-failure.md +0 -42
  47. patchrail-0.1.1/docs/fix/node-dependency-install.md +0 -42
  48. patchrail-0.1.1/docs/fix/node-test-failure.md +0 -42
  49. patchrail-0.1.1/docs/fix/php-composer-failure.md +0 -42
  50. patchrail-0.1.1/docs/fix/python-dependency-resolution.md +0 -42
  51. patchrail-0.1.1/docs/fix/python-lint.md +0 -42
  52. patchrail-0.1.1/docs/fix/python-test-failure.md +0 -41
  53. patchrail-0.1.1/docs/fix/python-type-check.md +0 -42
  54. patchrail-0.1.1/docs/fix/release-publish-failure.md +0 -42
  55. patchrail-0.1.1/docs/fix/ruby-bundle-failure.md +0 -42
  56. patchrail-0.1.1/docs/fix/runner-resource-exhaustion.md +0 -42
  57. patchrail-0.1.1/docs/fix/rust-lint.md +0 -41
  58. patchrail-0.1.1/docs/fix/rust-test-failure.md +0 -41
  59. patchrail-0.1.1/docs/fix/secrets-or-permissions-failure.md +0 -42
  60. patchrail-0.1.1/docs/fix/security-scan-failure.md +0 -42
  61. patchrail-0.1.1/docs/fix/terraform-iac-failure.md +0 -42
  62. patchrail-0.1.1/docs/fix/typescript-typecheck.md +0 -42
  63. patchrail-0.1.1/docs/funded-issues-ethics.md +0 -79
  64. patchrail-0.1.1/docs/github-action.md +0 -106
  65. patchrail-0.1.1/docs/metrics.md +0 -157
  66. patchrail-0.1.1/docs/open-source-program-evidence.md +0 -342
  67. patchrail-0.1.1/docs/openai-open-source-evidence.md +0 -381
  68. patchrail-0.1.1/docs/pilot-guide.md +0 -208
  69. patchrail-0.1.1/docs/pilot-request-package.md +0 -138
  70. patchrail-0.1.1/docs/public-workflow-ledger.md +0 -135
  71. patchrail-0.1.1/docs/quickstart.md +0 -119
  72. patchrail-0.1.1/docs/release-process.md +0 -251
  73. patchrail-0.1.1/docs/release-v0.1.0-evidence.md +0 -169
  74. patchrail-0.1.1/docs/release-v0.2.0-evidence.md +0 -93
  75. patchrail-0.1.1/docs/release-v0.3.0-evidence.md +0 -175
  76. patchrail-0.1.1/docs/release-v0.4.0-evidence.md +0 -90
  77. patchrail-0.1.1/docs/roadmap.md +0 -92
  78. patchrail-0.1.1/docs/threat-model.md +0 -68
  79. patchrail-0.1.1/schemas/application_dossier.schema.json +0 -305
  80. patchrail-0.1.1/schemas/ci_result.schema.json +0 -120
  81. patchrail-0.1.1/schemas/queue_audit_event.schema.json +0 -44
  82. patchrail-0.1.1/schemas/queue_audit_summary.schema.json +0 -169
  83. patchrail-0.1.1/schemas/queue_gate_report.schema.json +0 -158
  84. patchrail-0.1.1/schemas/queue_policy_resolution.schema.json +0 -188
  85. patchrail-0.1.1/schemas/queue_policy_scan.schema.json +0 -175
  86. patchrail-0.1.1/schemas/queue_proposal.schema.json +0 -61
  87. patchrail-0.1.1/schemas/queue_review.schema.json +0 -218
  88. patchrail-0.1.1/schemas/queue_status.schema.json +0 -179
  89. patchrail-0.1.1/schemas/queue_work_item.schema.json +0 -64
  90. patchrail-0.1.1/schemas/reviewer_quick_check_artifacts.schema.json +0 -104
  91. patchrail-0.1.1/scripts/release_readiness.py +0 -206
  92. patchrail-0.1.1/scripts/reviewer_quick_check.py +0 -13
  93. patchrail-0.1.1/scripts/update_ci_evidence_reference.py +0 -110
  94. patchrail-0.1.1/src/patchrail/web_metrics.py +0 -653
  95. patchrail-0.1.1/tests/test_ci_classify_expansion.py +0 -600
  96. patchrail-0.1.1/tests/test_ci_cli.py +0 -1644
  97. patchrail-0.1.1/tests/test_funded_issues_algora_board.py +0 -288
  98. patchrail-0.1.1/tests/test_funded_issues_apply_recheck.py +0 -368
  99. patchrail-0.1.1/tests/test_funded_issues_blocklist.py +0 -168
  100. patchrail-0.1.1/tests/test_funded_issues_cli.py +0 -4880
  101. patchrail-0.1.1/tests/test_funded_issues_client_report.py +0 -361
  102. patchrail-0.1.1/tests/test_funded_issues_competition.py +0 -212
  103. patchrail-0.1.1/tests/test_funded_issues_payout_effort.py +0 -230
  104. patchrail-0.1.1/tests/test_funded_issues_source_noise.py +0 -528
  105. patchrail-0.1.1/tests/test_funded_issues_staleness.py +0 -222
  106. patchrail-0.1.1/tests/test_funded_issues_store.py +0 -1276
  107. patchrail-0.1.1/tests/test_funded_issues_testability.py +0 -206
  108. patchrail-0.1.1/tests/test_public_workflows.py +0 -2618
  109. patchrail-0.1.1/tests/test_queue_cli.py +0 -1654
  110. patchrail-0.1.1/tests/test_queue_http_api.py +0 -142
  111. patchrail-0.1.1/tests/test_web_metrics_cli.py +0 -305
  112. {patchrail-0.1.1 → patchrail-0.2.0}/.agents/skills/patchrail-ci-triage/SKILL.md +0 -0
  113. {patchrail-0.1.1 → patchrail-0.2.0}/.agents/skills/patchrail-release-captain/SKILL.md +0 -0
  114. {patchrail-0.1.1 → patchrail-0.2.0}/.agents/skills/patchrail-review-guardrails/SKILL.md +0 -0
  115. {patchrail-0.1.1 → patchrail-0.2.0}/ADOPTERS.md +0 -0
  116. {patchrail-0.1.1 → patchrail-0.2.0}/AGENTS.md +0 -0
  117. {patchrail-0.1.1 → patchrail-0.2.0}/CODE_OF_CONDUCT.md +0 -0
  118. {patchrail-0.1.1 → patchrail-0.2.0}/CONTRIBUTING.md +0 -0
  119. {patchrail-0.1.1 → patchrail-0.2.0}/ETHICS.md +0 -0
  120. {patchrail-0.1.1 → patchrail-0.2.0}/GOVERNANCE.md +0 -0
  121. {patchrail-0.1.1 → patchrail-0.2.0}/LICENSE +0 -0
  122. {patchrail-0.1.1 → patchrail-0.2.0}/SECURITY.md +0 -0
  123. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/browser-playwright-navigation-timeout.expected.json +0 -0
  124. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/browser-playwright-navigation-timeout.log +0 -0
  125. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/browser-playwright-webserver-timeout.expected.json +0 -0
  126. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/browser-playwright-webserver-timeout.log +0 -0
  127. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/cypress-browser-launch.expected.json +0 -0
  128. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/cypress-browser-launch.log +0 -0
  129. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dependency-failure.expected.json +0 -0
  130. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dependency-failure.log +0 -0
  131. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-base-image-manifest-not-found.expected.json +0 -0
  132. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-base-image-manifest-not-found.log +0 -0
  133. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-buildkit-missing-context.expected.json +0 -0
  134. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-buildkit-missing-context.log +0 -0
  135. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-buildkit-missing-stage.expected.json +0 -0
  136. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-buildkit-missing-stage.log +0 -0
  137. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-compose-healthcheck.expected.json +0 -0
  138. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-compose-healthcheck.log +0 -0
  139. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-compose-missing-env-file.expected.json +0 -0
  140. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/docker-compose-missing-env-file.log +0 -0
  141. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-csharp-compile-error.expected.json +0 -0
  142. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-csharp-compile-error.log +0 -0
  143. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-nuget-package-downgrade.expected.json +0 -0
  144. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-nuget-package-downgrade.log +0 -0
  145. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-nuget-version-conflict.expected.json +0 -0
  146. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-nuget-version-conflict.log +0 -0
  147. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-sdk-target-framework-mismatch.expected.json +0 -0
  148. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-sdk-target-framework-mismatch.log +0 -0
  149. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-xunit-assertion.expected.json +0 -0
  150. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/dotnet-xunit-assertion.log +0 -0
  151. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-bad-shell.expected.json +0 -0
  152. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-bad-shell.log +0 -0
  153. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-invalid-workflow.expected.json +0 -0
  154. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-invalid-workflow.log +0 -0
  155. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-matrix-expression.expected.json +0 -0
  156. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-matrix-expression.log +0 -0
  157. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-missing-workflow-ref.expected.json +0 -0
  158. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-missing-workflow-ref.log +0 -0
  159. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-permission-id-token.expected.json +0 -0
  160. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-permission-id-token.log +0 -0
  161. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-permission.expected.json +0 -0
  162. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-permission.log +0 -0
  163. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-token-permission.expected.json +0 -0
  164. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-token-permission.log +0 -0
  165. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-unresolved-action.expected.json +0 -0
  166. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-unresolved-action.log +0 -0
  167. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-unresolved-checkout.expected.json +0 -0
  168. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-unresolved-checkout.log +0 -0
  169. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-yaml-syntax.expected.json +0 -0
  170. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/github-actions-yaml-syntax.log +0 -0
  171. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-assertion-fail.expected.json +0 -0
  172. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-assertion-fail.log +0 -0
  173. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-compile-failure.expected.json +0 -0
  174. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-compile-failure.log +0 -0
  175. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-compile-interface.expected.json +0 -0
  176. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-compile-interface.log +0 -0
  177. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-data-race-test.expected.json +0 -0
  178. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-data-race-test.log +0 -0
  179. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-module-missing-symbol.expected.json +0 -0
  180. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-module-missing-symbol.log +0 -0
  181. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-panic-in-test.expected.json +0 -0
  182. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-panic-in-test.log +0 -0
  183. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-timeout-race.expected.json +0 -0
  184. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-timeout-race.log +0 -0
  185. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-timeout.expected.json +0 -0
  186. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-timeout.log +0 -0
  187. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-undefined-function.expected.json +0 -0
  188. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-undefined-function.log +0 -0
  189. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-undefined-symbol.expected.json +0 -0
  190. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/go-undefined-symbol.log +0 -0
  191. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-dependency-resolution.expected.json +0 -0
  192. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-dependency-resolution.log +0 -0
  193. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-no-tests-found.expected.json +0 -0
  194. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-no-tests-found.log +0 -0
  195. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-toolchain-version.expected.json +0 -0
  196. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-toolchain-version.log +0 -0
  197. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-unsupported-major-version.expected.json +0 -0
  198. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-gradle-unsupported-major-version.log +0 -0
  199. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-maven-compilation.expected.json +0 -0
  200. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/java-maven-compilation.log +0 -0
  201. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-biome-format.expected.json +0 -0
  202. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-biome-format.log +0 -0
  203. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-a11y.expected.json +0 -0
  204. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-a11y.log +0 -0
  205. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-config-parser-drift.expected.json +0 -0
  206. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-config-parser-drift.log +0 -0
  207. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-import-order.expected.json +0 -0
  208. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-import-order.log +0 -0
  209. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-no-undef.expected.json +0 -0
  210. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-no-undef.log +0 -0
  211. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-react-hooks.expected.json +0 -0
  212. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-react-hooks.log +0 -0
  213. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-unused-vars.expected.json +0 -0
  214. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint-unused-vars.log +0 -0
  215. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint.expected.json +0 -0
  216. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-eslint.log +0 -0
  217. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-prettier-format.expected.json +0 -0
  218. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-prettier-format.log +0 -0
  219. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-prettier-generated-client-drift.expected.json +0 -0
  220. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-prettier-generated-client-drift.log +0 -0
  221. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-prettier.expected.json +0 -0
  222. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/javascript-prettier.log +0 -0
  223. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-lockfile-drift.expected.json +0 -0
  224. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-lockfile-drift.log +0 -0
  225. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-ci-lock-outdated.expected.json +0 -0
  226. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-ci-lock-outdated.log +0 -0
  227. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-engine-mismatch.expected.json +0 -0
  228. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-engine-mismatch.log +0 -0
  229. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-eresolve-react.expected.json +0 -0
  230. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-eresolve-react.log +0 -0
  231. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-missing-lockfile.expected.json +0 -0
  232. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-missing-lockfile.log +0 -0
  233. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-missing-package-lock.expected.json +0 -0
  234. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-missing-package-lock.log +0 -0
  235. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-workspace-lock-drift.expected.json +0 -0
  236. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-npm-workspace-lock-drift.log +0 -0
  237. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-peer-dependency.expected.json +0 -0
  238. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-peer-dependency.log +0 -0
  239. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-catalog-drift.expected.json +0 -0
  240. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-catalog-drift.log +0 -0
  241. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-frozen-lockfile.expected.json +0 -0
  242. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-frozen-lockfile.log +0 -0
  243. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-lockfile-config-drift.expected.json +0 -0
  244. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-lockfile-config-drift.log +0 -0
  245. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-peer-conflict-react.expected.json +0 -0
  246. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-peer-conflict-react.log +0 -0
  247. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-peer-optional.expected.json +0 -0
  248. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-peer-optional.log +0 -0
  249. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-workspace-protocol.expected.json +0 -0
  250. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-pnpm-workspace-protocol.log +0 -0
  251. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-constraints-peer-drift.expected.json +0 -0
  252. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-constraints-peer-drift.log +0 -0
  253. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-immutable-cache-drift.expected.json +0 -0
  254. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-immutable-cache-drift.log +0 -0
  255. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-immutable-install.expected.json +0 -0
  256. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-immutable-install.log +0 -0
  257. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-peer-dependency.expected.json +0 -0
  258. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-peer-dependency.log +0 -0
  259. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-peer-version.expected.json +0 -0
  260. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/node-yarn-peer-version.log +0 -0
  261. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-composer-lock-drift.expected.json +0 -0
  262. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-composer-lock-drift.log +0 -0
  263. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-composer-missing-package.expected.json +0 -0
  264. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-composer-missing-package.log +0 -0
  265. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-composer-platform-version.expected.json +0 -0
  266. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-composer-platform-version.log +0 -0
  267. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-phpunit-autoload-class-not-found.expected.json +0 -0
  268. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-phpunit-autoload-class-not-found.log +0 -0
  269. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-phpunit-failure.expected.json +0 -0
  270. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/php-phpunit-failure.log +0 -0
  271. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/playwright-missing-browsers.expected.json +0 -0
  272. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/playwright-missing-browsers.log +0 -0
  273. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/playwright-selector-timeout.expected.json +0 -0
  274. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/playwright-selector-timeout.log +0 -0
  275. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-hatch-build-dependency.expected.json +0 -0
  276. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-hatch-build-dependency.log +0 -0
  277. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-module-import.expected.json +0 -0
  278. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-module-import.log +0 -0
  279. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-conflicting-constraints.expected.json +0 -0
  280. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-conflicting-constraints.log +0 -0
  281. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-constraint-marker-drift.expected.json +0 -0
  282. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-constraint-marker-drift.log +0 -0
  283. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-constraint-pin-drift.expected.json +0 -0
  284. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-constraint-pin-drift.log +0 -0
  285. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-extra-conflict.expected.json +0 -0
  286. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-extra-conflict.log +0 -0
  287. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-index-timeout-backtrack.expected.json +0 -0
  288. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-index-timeout-backtrack.log +0 -0
  289. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-marker-py310.expected.json +0 -0
  290. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-marker-py310.log +0 -0
  291. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-missing-musllinux-wheel.expected.json +0 -0
  292. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-missing-musllinux-wheel.log +0 -0
  293. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-no-matching-distribution.expected.json +0 -0
  294. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-no-matching-distribution.log +0 -0
  295. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-platform-arm64-wheel.expected.json +0 -0
  296. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-platform-arm64-wheel.log +0 -0
  297. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-platform-wheel.expected.json +0 -0
  298. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-platform-wheel.log +0 -0
  299. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-prerelease-range.expected.json +0 -0
  300. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-prerelease-range.log +0 -0
  301. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-python-version-marker.expected.json +0 -0
  302. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-python-version-marker.log +0 -0
  303. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-tools-backtracking.expected.json +0 -0
  304. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-tools-backtracking.log +0 -0
  305. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-tools-conflict.expected.json +0 -0
  306. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-tools-conflict.log +0 -0
  307. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-tools-extra-marker-conflict.expected.json +0 -0
  308. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-tools-extra-marker-conflict.log +0 -0
  309. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-yanked-only-candidate.expected.json +0 -0
  310. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-yanked-only-candidate.log +0 -0
  311. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-yanked-release.expected.json +0 -0
  312. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pip-yanked-release.log +0 -0
  313. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-poetry-python-range-drift.expected.json +0 -0
  314. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-poetry-python-range-drift.log +0 -0
  315. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-poetry-solver-conflict.expected.json +0 -0
  316. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-poetry-solver-conflict.log +0 -0
  317. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-poetry-transitive-conflict.expected.json +0 -0
  318. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-poetry-transitive-conflict.log +0 -0
  319. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pytest-env-token-redacted.expected.json +0 -0
  320. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-pytest-env-token-redacted.log +0 -0
  321. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-assert-json.expected.json +0 -0
  322. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-assert-json.log +0 -0
  323. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-failure.expected.json +0 -0
  324. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-failure.log +0 -0
  325. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-fixture-timeout.expected.json +0 -0
  326. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-fixture-timeout.log +0 -0
  327. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-import-mode.expected.json +0 -0
  328. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-import-mode.log +0 -0
  329. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-module-not-found.expected.json +0 -0
  330. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-module-not-found.log +0 -0
  331. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-parametrize-regression.expected.json +0 -0
  332. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-parametrize-regression.log +0 -0
  333. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-snapshot-diff.expected.json +0 -0
  334. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-test-snapshot-diff.log +0 -0
  335. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-tox-constraint-conflict.expected.json +0 -0
  336. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-tox-constraint-conflict.log +0 -0
  337. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-constraint-backtrack-fail.expected.json +0 -0
  338. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-constraint-backtrack-fail.log +0 -0
  339. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-extra-marker-conflict.expected.json +0 -0
  340. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-extra-marker-conflict.log +0 -0
  341. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-extra-python-marker-drift.expected.json +0 -0
  342. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-extra-python-marker-drift.log +0 -0
  343. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-resolution-no-solution.expected.json +0 -0
  344. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/python-uv-resolution-no-solution.log +0 -0
  345. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-bundler-conflict.expected.json +0 -0
  346. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-bundler-conflict.log +0 -0
  347. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-bundler-missing-gem.expected.json +0 -0
  348. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-bundler-missing-gem.log +0 -0
  349. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-bundler-platform-lock.expected.json +0 -0
  350. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-bundler-platform-lock.log +0 -0
  351. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-gem-native-extension.expected.json +0 -0
  352. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-gem-native-extension.log +0 -0
  353. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-rake-aborted.expected.json +0 -0
  354. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-rake-aborted.log +0 -0
  355. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-rspec-failure.expected.json +0 -0
  356. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-rspec-failure.log +0 -0
  357. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-ruby-version-lock.expected.json +0 -0
  358. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-ruby-version-lock.log +0 -0
  359. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-yanked-gem.expected.json +0 -0
  360. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/ruby-yanked-gem.log +0 -0
  361. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-compile-error.expected.json +0 -0
  362. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-compile-error.log +0 -0
  363. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0277-trait-bound.expected.json +0 -0
  364. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0277-trait-bound.log +0 -0
  365. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0308-mismatched-types.expected.json +0 -0
  366. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0308-mismatched-types.log +0 -0
  367. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0382-moved-value.expected.json +0 -0
  368. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0382-moved-value.log +0 -0
  369. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0502-borrow-checker.expected.json +0 -0
  370. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0502-borrow-checker.log +0 -0
  371. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0599-method-not-found.expected.json +0 -0
  372. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-e0599-method-not-found.log +0 -0
  373. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-panic-thread.expected.json +0 -0
  374. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-panic-thread.log +0 -0
  375. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-snapshot-failure.expected.json +0 -0
  376. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-snapshot-failure.log +0 -0
  377. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-test-failure.expected.json +0 -0
  378. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-test-failure.log +0 -0
  379. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-trait-bound-error.expected.json +0 -0
  380. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/rust-trait-bound-error.log +0 -0
  381. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-cargo-audit-rustsec.expected.json +0 -0
  382. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-cargo-audit-rustsec.log +0 -0
  383. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-gosec-findings.expected.json +0 -0
  384. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-gosec-findings.log +0 -0
  385. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-npm-audit-critical.expected.json +0 -0
  386. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-npm-audit-critical.log +0 -0
  387. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-pip-audit-vulnerability.expected.json +0 -0
  388. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-pip-audit-vulnerability.log +0 -0
  389. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-trivy-container-critical.expected.json +0 -0
  390. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/security-trivy-container-critical.log +0 -0
  391. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-generated-client-schema-drift.expected.json +0 -0
  392. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-generated-client-schema-drift.log +0 -0
  393. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-import-type-drift.expected.json +0 -0
  394. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-import-type-drift.log +0 -0
  395. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-jsx-prop-mismatch.expected.json +0 -0
  396. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-jsx-prop-mismatch.log +0 -0
  397. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-missing-name.expected.json +0 -0
  398. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-missing-name.log +0 -0
  399. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-path-alias-drift.expected.json +0 -0
  400. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-path-alias-drift.log +0 -0
  401. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-route-param-mismatch.expected.json +0 -0
  402. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-route-param-mismatch.log +0 -0
  403. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-schema-drift.expected.json +0 -0
  404. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-schema-drift.log +0 -0
  405. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2304-missing-global.expected.json +0 -0
  406. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2304-missing-global.log +0 -0
  407. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2322-prop.expected.json +0 -0
  408. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2322-prop.log +0 -0
  409. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2345-route-param.expected.json +0 -0
  410. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2345-route-param.log +0 -0
  411. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2416-class-override.expected.json +0 -0
  412. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2416-class-override.log +0 -0
  413. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2551-import-name.expected.json +0 -0
  414. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2551-import-name.log +0 -0
  415. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2741-required-prop.expected.json +0 -0
  416. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2741-required-prop.log +0 -0
  417. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2769-overload.expected.json +0 -0
  418. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts2769-overload.log +0 -0
  419. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts7006-implicit-any.expected.json +0 -0
  420. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-ts7006-implicit-any.log +0 -0
  421. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-tsconfig-lib-drift.expected.json +0 -0
  422. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-tsconfig-lib-drift.log +0 -0
  423. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-typecheck.expected.json +0 -0
  424. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-typecheck.log +0 -0
  425. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-vite-env-drift.expected.json +0 -0
  426. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-vite-env-drift.log +0 -0
  427. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-zod-schema-drift.expected.json +0 -0
  428. {patchrail-0.1.1 → patchrail-0.2.0}/examples/ci-triage/typescript-zod-schema-drift.log +0 -0
  429. {patchrail-0.1.1 → patchrail-0.2.0}/examples/control-plane-demo/README.md +0 -0
  430. {patchrail-0.1.1 → patchrail-0.2.0}/examples/control-plane-demo/demo-output.md +0 -0
  431. {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/README.md +0 -0
  432. {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/client-profile-python.json +0 -0
  433. {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/competition-observations.json +0 -0
  434. {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/demo-summary.expected.json +0 -0
  435. {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/issues.json +0 -0
  436. {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/payout-effort-observations.json +0 -0
  437. {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/provider-github-export.json +0 -0
  438. {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/run_demo.py +0 -0
  439. {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/staleness-observations.json +0 -0
  440. {patchrail-0.1.1 → patchrail-0.2.0}/examples/funded-issues-readonly/testability-observations.json +0 -0
  441. {patchrail-0.1.1 → patchrail-0.2.0}/examples/github-action/README.md +0 -0
  442. {patchrail-0.1.1 → patchrail-0.2.0}/examples/github-action/patchrail-ci-triage-artifact/ci-report.md +0 -0
  443. {patchrail-0.1.1 → patchrail-0.2.0}/examples/github-action/patchrail-ci-triage-artifact/ci-result.json +0 -0
  444. {patchrail-0.1.1 → patchrail-0.2.0}/examples/github-action/patchrail-ci-triage-artifact/doctor.json +0 -0
  445. {patchrail-0.1.1 → patchrail-0.2.0}/examples/github-action/patchrail-ci-triage-artifact/fixture-benchmark-summary.md +0 -0
  446. {patchrail-0.1.1 → patchrail-0.2.0}/examples/github-action/patchrail-ci-triage-artifact/fixture-benchmark.json +0 -0
  447. {patchrail-0.1.1 → patchrail-0.2.0}/examples/local-agent-queue/README.md +0 -0
  448. {patchrail-0.1.1 → patchrail-0.2.0}/examples/local-agent-queue/demo-summary.expected.json +0 -0
  449. {patchrail-0.1.1 → patchrail-0.2.0}/examples/local-agent-queue/run_demo.py +0 -0
  450. {patchrail-0.1.1 → patchrail-0.2.0}/examples/pilot-outcome/README.md +0 -0
  451. {patchrail-0.1.1 → patchrail-0.2.0}/examples/pilot-outcome/patchrail-own-repo-20260603.md +0 -0
  452. {patchrail-0.1.1 → patchrail-0.2.0}/examples/pilot-outcome/patchrail-own-repo-20260603.summary.json +0 -0
  453. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/__main__.py +0 -0
  454. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/ci/__init__.py +0 -0
  455. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/funded_issues/__init__.py +0 -0
  456. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/funded_issues/algora_board.py +0 -0
  457. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/funded_issues/blocklist.py +0 -0
  458. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/funded_issues/importers.py +0 -0
  459. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/funded_issues/source_noise.py +0 -0
  460. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/funded_issues/store.py +0 -0
  461. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/queue/__init__.py +0 -0
  462. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/queue/server.py +0 -0
  463. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/queue/status.py +0 -0
  464. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/queue/store.py +0 -0
  465. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/reviewer_quick_check.py +0 -0
  466. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/__init__.py +0 -0
  467. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/ci-benchmark.v1.schema.json +0 -0
  468. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/ci-fixture-check.v1.schema.json +0 -0
  469. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/ci-pilot-metrics.v1.schema.json +0 -0
  470. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/ci-pilot-summary.v1.schema.json +0 -0
  471. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/ci-result.v1.schema.json +0 -0
  472. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/funded-issues-client-report.v1.schema.json +0 -0
  473. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/funded-issues-recheck-queue.v1.schema.json +0 -0
  474. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/funded-issues-recheck-summary.v1.schema.json +0 -0
  475. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/funded-issues-report.v1.schema.json +0 -0
  476. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/funded-issues-shortlist.v1.schema.json +0 -0
  477. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/funded-issues-store-status.v1.schema.json +0 -0
  478. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/funded-issues-store.v1.schema.json +0 -0
  479. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-audit-event.v1.schema.json +0 -0
  480. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-audit-summary.v1.schema.json +0 -0
  481. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-gate-report.v1.schema.json +0 -0
  482. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-policy-resolution.v1.schema.json +0 -0
  483. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-policy-scan.v1.schema.json +0 -0
  484. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-proposal.v1.schema.json +0 -0
  485. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-review.v1.schema.json +0 -0
  486. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-status.v1.schema.json +0 -0
  487. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/queue-work-item.v1.schema.json +0 -0
  488. {patchrail-0.1.1 → patchrail-0.2.0}/src/patchrail/schemas/reviewer-quick-check-artifacts.v1.schema.json +0 -0
@@ -1,4 +1,5 @@
1
1
  .venv/
2
+ .DS_Store
2
3
  .pkg-smoke/
3
4
  .patchrail-release-smoke/
4
5
  __pycache__/
@@ -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.
@@ -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
+ [![PyPI](https://img.shields.io/pypi/v/patchrail)](https://pypi.org/project/patchrail/)
39
+ [![CI](https://github.com/patchrail/patchrail/actions/workflows/ci.yml/badge.svg)](https://github.com/patchrail/patchrail/actions/workflows/ci.yml)
40
+ [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)
41
+ [![Python](https://img.shields.io/pypi/pyversions/patchrail)](https://pypi.org/project/patchrail/)
42
+
43
+ ![patchrail ci explain reading a failed CI log and emitting root cause, confidence, and a reproduce command](docs/assets/ci-explain-demo.gif)
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
+ [![PyPI](https://img.shields.io/pypi/v/patchrail)](https://pypi.org/project/patchrail/)
8
+ [![CI](https://github.com/patchrail/patchrail/actions/workflows/ci.yml/badge.svg)](https://github.com/patchrail/patchrail/actions/workflows/ci.yml)
9
+ [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)
10
+ [![Python](https://img.shields.io/pypi/pyversions/patchrail)](https://pypi.org/project/patchrail/)
11
+
12
+ ![patchrail ci explain reading a failed CI log and emitting root cause, confidence, and a reproduce command](docs/assets/ci-explain-demo.gif)
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[@]}"