orbi-cli 0.7.26__tar.gz → 0.7.28__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 (230) hide show
  1. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/PKG-INFO +1 -1
  2. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/pyproject.toml +1 -1
  3. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/__init__.py +1 -1
  4. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/config.py +10 -3
  5. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/example_config.toml +2 -1
  6. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/runner_health.py +19 -15
  7. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi_cli.egg-info/PKG-INFO +1 -1
  8. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_ci_failure_issue_workflow.py +6 -5
  9. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_ci_failure_triage.py +61 -381
  10. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_ci_workflow.py +45 -0
  11. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_runner_config.py +17 -2
  12. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_runner_health.py +46 -0
  13. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/LICENSE +0 -0
  14. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/README.md +0 -0
  15. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/docs/licenses/sustainable-use-license.md +0 -0
  16. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/setup.cfg +0 -0
  17. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/base_ci_red.py +0 -0
  18. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/blocked_comment.py +0 -0
  19. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/branch_reclaim.py +0 -0
  20. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/check_permission.py +0 -0
  21. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/checks.py +0 -0
  22. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/claim.py +0 -0
  23. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/clarify.py +0 -0
  24. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/cli.py +0 -0
  25. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/cli_commands.py +0 -0
  26. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/cli_doctor.py +0 -0
  27. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/cli_parser.py +0 -0
  28. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/cli_source.py +0 -0
  29. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/cli_status.py +0 -0
  30. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/cli_ticket_command.py +0 -0
  31. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/comment_kind.py +0 -0
  32. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/comment_trust.py +0 -0
  33. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/criteria_command.py +0 -0
  34. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/delivery_comment.py +0 -0
  35. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/delivery_labels.py +0 -0
  36. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/delivery_scene.py +0 -0
  37. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/engine_source.py +0 -0
  38. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/extensions/clarify_verdict.ts +0 -0
  39. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/failure.py +0 -0
  40. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/failure_report.py +0 -0
  41. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/gh_response.py +0 -0
  42. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/git_identity.py +0 -0
  43. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/git_transport.py +0 -0
  44. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/github.py +0 -0
  45. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/github_feedback.py +0 -0
  46. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/gitops.py +0 -0
  47. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/human_review.py +0 -0
  48. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/journal.py +0 -0
  49. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/language.py +0 -0
  50. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/language_terms.py +0 -0
  51. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/launchd_deploy.py +0 -0
  52. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/merge_exec.py +0 -0
  53. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/merge_gate.py +0 -0
  54. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/merge_handoff.py +0 -0
  55. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/milestone.py +0 -0
  56. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/milestone_command.py +0 -0
  57. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/notify.py +0 -0
  58. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/pi_activity.py +0 -0
  59. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/pi_command.py +0 -0
  60. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/pi_idle.py +0 -0
  61. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/pi_process.py +0 -0
  62. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/pi_recovery.py +0 -0
  63. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/pi_session.py +0 -0
  64. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/pi_stream_log.py +0 -0
  65. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/pilot_setup.py +0 -0
  66. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/pilot_slots.py +0 -0
  67. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/pr_verification.py +0 -0
  68. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/progress.py +0 -0
  69. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/progress_display.py +0 -0
  70. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/progress_outcome.py +0 -0
  71. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/progress_summary.py +0 -0
  72. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/release.py +0 -0
  73. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/release_closeout.py +0 -0
  74. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/release_comments.py +0 -0
  75. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/release_declaration.py +0 -0
  76. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/release_git.py +0 -0
  77. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/release_notes.py +0 -0
  78. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/release_run.py +0 -0
  79. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/repo_config.py +0 -0
  80. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/resume_scan.py +0 -0
  81. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/resume_verification.py +0 -0
  82. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/review_merge.py +0 -0
  83. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/review_rounds.py +0 -0
  84. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/review_verdict.py +0 -0
  85. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/run_state.py +0 -0
  86. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/runner.py +0 -0
  87. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/runner_marker.py +0 -0
  88. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/runner_source.py +0 -0
  89. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/scene.py +0 -0
  90. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/scheduler.py +0 -0
  91. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/scheduler_units.py +0 -0
  92. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/session_command.py +0 -0
  93. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/setup_checks.py +0 -0
  94. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/setup_config.py +0 -0
  95. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/source_pool.py +0 -0
  96. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/split_command.py +0 -0
  97. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/status_observe.py +0 -0
  98. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/suggest.py +0 -0
  99. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/systemd_deploy.py +0 -0
  100. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/ticket_command.py +0 -0
  101. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi/user_summary.py +0 -0
  102. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi_cli.egg-info/SOURCES.txt +0 -0
  103. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi_cli.egg-info/dependency_links.txt +0 -0
  104. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi_cli.egg-info/entry_points.txt +0 -0
  105. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/src/orbi_cli.egg-info/top_level.txt +0 -0
  106. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_agents_md.py +0 -0
  107. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_apply_label_patch.py +0 -0
  108. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_base_branch_failure.py +0 -0
  109. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_base_ci_red.py +0 -0
  110. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_blocked_comment.py +0 -0
  111. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_bootstrap_adapters.py +0 -0
  112. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_bootstrap_delivery.py +0 -0
  113. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_bootstrap_pi.py +0 -0
  114. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_bootstrap_preflight.py +0 -0
  115. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_bootstrap_release.py +0 -0
  116. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_bootstrap_runner.py +0 -0
  117. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_branch_reclaim.py +0 -0
  118. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_check_permission.py +0 -0
  119. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_ci_macos_workflow.py +0 -0
  120. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_clarify.py +0 -0
  121. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_claude_plugin.py +0 -0
  122. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_cli_golden.py +0 -0
  123. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_cli_install.py +0 -0
  124. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_cli_milestone.py +0 -0
  125. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_cli_packaging.py +0 -0
  126. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_cli_source.py +0 -0
  127. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_cli_ticket_commands.py +0 -0
  128. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_command_receipt_contract.py +0 -0
  129. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_comment_identity.py +0 -0
  130. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_comment_readers_contract.py +0 -0
  131. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_comment_trust.py +0 -0
  132. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_concurrency_e2e.py +0 -0
  133. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_constitution.py +0 -0
  134. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_coverage_gate.py +0 -0
  135. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_criteria_command.py +0 -0
  136. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_deliver_pr_fakes.py +0 -0
  137. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_delivery_branch_delete.py +0 -0
  138. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_delivery_labels.py +0 -0
  139. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_delivery_scene.py +0 -0
  140. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_docker_docs.py +0 -0
  141. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_docker_entrypoint.py +0 -0
  142. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_docker_image_workflow.py +0 -0
  143. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_docs_i18n.py +0 -0
  144. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_docs_issue_shapes.py +0 -0
  145. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_docs_labels.py +0 -0
  146. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_docs_mermaid.py +0 -0
  147. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_docs_releases.py +0 -0
  148. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_docs_single_source.py +0 -0
  149. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_docs_site.py +0 -0
  150. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_engine_source.py +0 -0
  151. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_failure.py +0 -0
  152. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_failure_report.py +0 -0
  153. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_fix_needed_loop.py +0 -0
  154. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_gh_read_retry.py +0 -0
  155. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_gh_response.py +0 -0
  156. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_git_base_smoke.py +0 -0
  157. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_git_merge_smoke.py +0 -0
  158. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_git_network_retry.py +0 -0
  159. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_git_transport.py +0 -0
  160. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_github.py +0 -0
  161. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_github_fakes.py +0 -0
  162. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_gitops.py +0 -0
  163. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_gitops_fakes.py +0 -0
  164. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_human_review.py +0 -0
  165. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_import_graph.py +0 -0
  166. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_install_sh.py +0 -0
  167. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_issue_1367.py +0 -0
  168. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_issue_461.py +0 -0
  169. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_issue_template_config.py +0 -0
  170. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_journal.py +0 -0
  171. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_journal_events.py +0 -0
  172. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_launchd_deploy.py +0 -0
  173. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_license.py +0 -0
  174. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_merge_exec_extraction.py +0 -0
  175. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_message_language.py +0 -0
  176. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_milestone_command.py +0 -0
  177. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_notify.py +0 -0
  178. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_ops_e2e.py +0 -0
  179. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_orbi.py +0 -0
  180. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_orbi_dashboard.py +0 -0
  181. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_orbi_exporter.py +0 -0
  182. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_patch_ratchet.py +0 -0
  183. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_pi_activity.py +0 -0
  184. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_pi_command.py +0 -0
  185. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_pi_extensions.py +0 -0
  186. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_pi_provider_templates.py +0 -0
  187. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_pi_recovery.py +0 -0
  188. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_pi_session.py +0 -0
  189. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_pilot_setup.py +0 -0
  190. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_pilot_slots.py +0 -0
  191. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_pr_issue_link_workflow.py +0 -0
  192. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_pr_verification.py +0 -0
  193. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_prerequisite_check.py +0 -0
  194. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_progress.py +0 -0
  195. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_progress_wiring.py +0 -0
  196. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_prompt_contract.py +0 -0
  197. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_public_contracts.py +0 -0
  198. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_public_helpers.py +0 -0
  199. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_publish_workflow.py +0 -0
  200. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_release_docs_workflow.py +0 -0
  201. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_release_extraction.py +0 -0
  202. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_release_ticket_templates.py +0 -0
  203. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_repo_config.py +0 -0
  204. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_resume_continue_e2e.py +0 -0
  205. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_resume_e2e.py +0 -0
  206. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_resume_pr.py +0 -0
  207. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_review_merge.py +0 -0
  208. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_review_verdict.py +0 -0
  209. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_run_artifacts.py +0 -0
  210. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_run_id_e2e.py +0 -0
  211. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_run_id_fixture.py +0 -0
  212. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_runner_source_freshness.py +0 -0
  213. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_scene.py +0 -0
  214. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_scheduler.py +0 -0
  215. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_seam.py +0 -0
  216. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_setup_output_golden.py +0 -0
  217. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_size_ratchet.py +0 -0
  218. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_split_command.py +0 -0
  219. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_src_layout.py +0 -0
  220. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_status_observe.py +0 -0
  221. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_steering_review.py +0 -0
  222. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_suggest.py +0 -0
  223. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_suite_hygiene.py +0 -0
  224. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_systemd_deploy.py +0 -0
  225. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_systemd_timer.py +0 -0
  226. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_ticket_command.py +0 -0
  227. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_user_acceptance_contract.py +0 -0
  228. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_user_summary.py +0 -0
  229. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_versioned_comment_block.py +0 -0
  230. {orbi_cli-0.7.26 → orbi_cli-0.7.28}/tests/test_worktree_reclaim.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orbi-cli
3
- Version: 0.7.26
3
+ Version: 0.7.28
4
4
  Summary: Orbi — local AI development worker: claims GitHub Issues, runs Pi in isolated worktrees, and delivers PRs (GitHub Issues + labels are the only state store).
5
5
  Author: xqliu
6
6
  License-Expression: AGPL-3.0-only OR LicenseRef-Sustainable-Use-1.0
@@ -44,7 +44,7 @@ build-backend = "setuptools.build_meta"
44
44
 
45
45
  [project]
46
46
  name = "orbi-cli"
47
- version = "0.7.26"
47
+ version = "0.7.28"
48
48
  description = "Orbi — local AI development worker: claims GitHub Issues, runs Pi in isolated worktrees, and delivers PRs (GitHub Issues + labels are the only state store)."
49
49
  readme = "README.md"
50
50
  requires-python = ">=3.14"
@@ -18,4 +18,4 @@ the package would shadow the installed package for every process with
18
18
  the checkout root on sys.path. The direct-execution compatibility entry
19
19
  is `python3 -m orbi.cli` (development path only).
20
20
  """
21
- __version__ = "0.7.26"
21
+ __version__ = "0.7.28"
@@ -401,9 +401,16 @@ def load_config(path: Path, *, check_provider_api_keys: bool = True,
401
401
  # Runner-self health alert routing: the orbi repo that
402
402
  # receives the watchdog's crash_loop / stale_pickup Issues. Absent ->
403
403
  # None (the Runner derives the orbi repo from the deploy home's git
404
- # origin); present -> must be a non-empty `owner/repo` string, used
405
- # verbatim for fork/private deployments.
406
- health_alert_repo = _optional_pi_string(data, "health_alert_repo")
404
+ # origin when it detects something); a string is kept verbatim — an
405
+ # explicit empty string turns alert FILING off while the detection and
406
+ # its `health_degraded` journal event stay (Issue #1985), any other
407
+ # value is the `owner/repo` the alert is filed in (fork/private
408
+ # deployments). A non-string fails the load fast.
409
+ health_alert_repo = data.get("health_alert_repo")
410
+ if health_alert_repo is not None and not isinstance(
411
+ health_alert_repo, str,
412
+ ):
413
+ raise ValueError("health_alert_repo must be a string")
407
414
  repo_dir = _config_path(data.get("repo_dir", "."), base)
408
415
  # Deployment home: the orbi source checkout — the editable
409
416
  # CLI install source, the systemd/ unit templates, labels.toml and the
@@ -213,7 +213,8 @@ max_concurrency = 1
213
213
  # by `orbi doctor` under unmanaged_units.
214
214
  # unit_name = "core"
215
215
  # Runner health alerts (crash_loop/stale_pickup) go here when set; absent
216
- # derives the Orbi repository from the deploy-home origin.
216
+ # derives the Orbi repository from the deploy-home origin; "" turns alert
217
+ # Issues OFF while the detection and its health_degraded journal event stay.
217
218
  # health_alert_repo = "OWNER/ORBI-REPO"
218
219
  # Repository policy may override the ready label for this delivery source.
219
220
  # dispatch_label = "ai-ready"
@@ -627,9 +627,13 @@ def _run_health_check_locked(config: RunnerConfig, *, run_command) -> list[str]:
627
627
  # `health_alert_repo` override wins (fork/private deployments);
628
628
  # otherwise the orbi repo is derived from the deploy home's git
629
629
  # origin. Undeterminable -> log and skip (bypass: never guess a
630
- # repo, never file the alert in the delivery repo).
630
+ # repo, never file the alert in the delivery repo). An explicit
631
+ # empty string (Issue #1985) turns alert FILING off: no
632
+ # alert-repository lookup at all, while the detection and its
633
+ # `health_degraded` event stay.
631
634
  alert_repo = config.health_alert_repo
632
- if not alert_repo:
635
+ alerts_off = alert_repo == ""
636
+ if alert_repo is None:
633
637
  alert_repo = orbi_repo_from_deploy_home(
634
638
  config.deploy_home, run_command,
635
639
  )
@@ -653,13 +657,7 @@ def _run_health_check_locked(config: RunnerConfig, *, run_command) -> list[str]:
653
657
  "health_degraded", check="crash_loop", crashes=crashes,
654
658
  window_minutes=CRASH_WINDOW_MINUTES, kind=kind,
655
659
  )
656
- if not alert_repo:
657
- event(
658
- "health_alert_repo_undetermined",
659
- level=logging.WARNING, check="crash_loop",
660
- crashes=crashes,
661
- )
662
- else:
660
+ if alert_repo:
663
661
  detail = (
664
662
  f"service crashed {crashes} times in the last "
665
663
  f"{CRASH_WINDOW_MINUTES} minutes"
@@ -676,6 +674,12 @@ def _run_health_check_locked(config: RunnerConfig, *, run_command) -> list[str]:
676
674
  dispatchable=(kind == "bug"),
677
675
  )
678
676
  alerts.append("crash_loop")
677
+ elif not alerts_off:
678
+ event(
679
+ "health_alert_repo_undetermined",
680
+ level=logging.WARNING, check="crash_loop",
681
+ crashes=crashes,
682
+ )
679
683
  # 2. Repeated same-fingerprint run failures (#246 scene).
680
684
  for finding in repeated_failure_findings(state):
681
685
  key = (
@@ -748,12 +752,7 @@ def _run_health_check_locked(config: RunnerConfig, *, run_command) -> list[str]:
748
752
  time.time() - state["last_pickup_ts"],
749
753
  ),
750
754
  )
751
- if not alert_repo:
752
- event(
753
- "health_alert_repo_undetermined",
754
- level=logging.WARNING, check="stale_pickup",
755
- )
756
- else:
755
+ if alert_repo:
757
756
  create_health_issue(
758
757
  alert_repo, "stale_pickup",
759
758
  (
@@ -764,6 +763,11 @@ def _run_health_check_locked(config: RunnerConfig, *, run_command) -> list[str]:
764
763
  run_command=run_command,
765
764
  )
766
765
  alerts.append("stale_pickup")
766
+ elif not alerts_off:
767
+ event(
768
+ "health_alert_repo_undetermined",
769
+ level=logging.WARNING, check="stale_pickup",
770
+ )
767
771
  finally:
768
772
  save_health_state(state_path, state)
769
773
  return alerts
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orbi-cli
3
- Version: 0.7.26
3
+ Version: 0.7.28
4
4
  Summary: Orbi — local AI development worker: claims GitHub Issues, runs Pi in isolated worktrees, and delivers PRs (GitHub Issues + labels are the only state store).
5
5
  Author: xqliu
6
6
  License-Expression: AGPL-3.0-only OR LicenseRef-Sustainable-Use-1.0
@@ -3,7 +3,7 @@
3
3
  The workflow (`.github/workflows/ci-failure-issue.yml`) is the runtime entry
4
4
  of the CI failure triage: it reacts to the COMPLETED runs of the `CI`
5
5
  workflow (`on: workflow_run`), holds the minimal explicit permissions
6
- (`actions: read`, `contents: read`, `issues: write`, `pull-requests: write`)
6
+ (`actions: read`, `contents: read`, `issues: write`, `pull-requests: read`)
7
7
  and runs the triage
8
8
  script with the workflow token. These tests fail when the workflow is
9
9
  missing, stops watching the CI workflow, gains extra permissions, or can
@@ -111,7 +111,9 @@ def test_minimal_explicit_permissions():
111
111
  "actions": "read", # read the completed CI run's jobs
112
112
  "contents": "read", # check out the triage script
113
113
  "issues": "write", # create/update/close the bug Issue
114
- "pull-requests": "write", # resolve PRs and write PR comments
114
+ # Issue #1988: the triage writes nothing to a PR — only the recovery
115
+ # guard reads the recovery run's PR (commits/{sha}/pulls).
116
+ "pull-requests": "read",
115
117
  }
116
118
 
117
119
 
@@ -127,9 +129,8 @@ def test_single_job_runs_the_triage_script():
127
129
 
128
130
 
129
131
  def test_no_step_installs_the_package():
130
- """Issue #1776 acceptance 3: the triage imports the engine's one
131
- delivery-branch check straight from the checkout's `src` (the script's
132
- own sys.path bootstrap), so the job installs nothing."""
132
+ """The job runs the triage script straight from the checkout, so it
133
+ installs nothing (the script imports no engine module, Issue #1988)."""
133
134
  commands = [
134
135
  str(step.get("run", "")) for step in steps_of(load_workflow())
135
136
  if step.get("run")