orbi-cli 0.7.26__tar.gz → 0.7.27__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.27}/PKG-INFO +1 -1
  2. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/pyproject.toml +1 -1
  3. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/__init__.py +1 -1
  4. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/config.py +10 -3
  5. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/example_config.toml +2 -1
  6. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/runner_health.py +19 -15
  7. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi_cli.egg-info/PKG-INFO +1 -1
  8. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_ci_workflow.py +45 -0
  9. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_runner_config.py +17 -2
  10. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_runner_health.py +46 -0
  11. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/LICENSE +0 -0
  12. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/README.md +0 -0
  13. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/docs/licenses/sustainable-use-license.md +0 -0
  14. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/setup.cfg +0 -0
  15. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/base_ci_red.py +0 -0
  16. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/blocked_comment.py +0 -0
  17. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/branch_reclaim.py +0 -0
  18. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/check_permission.py +0 -0
  19. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/checks.py +0 -0
  20. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/claim.py +0 -0
  21. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/clarify.py +0 -0
  22. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/cli.py +0 -0
  23. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/cli_commands.py +0 -0
  24. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/cli_doctor.py +0 -0
  25. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/cli_parser.py +0 -0
  26. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/cli_source.py +0 -0
  27. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/cli_status.py +0 -0
  28. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/cli_ticket_command.py +0 -0
  29. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/comment_kind.py +0 -0
  30. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/comment_trust.py +0 -0
  31. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/criteria_command.py +0 -0
  32. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/delivery_comment.py +0 -0
  33. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/delivery_labels.py +0 -0
  34. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/delivery_scene.py +0 -0
  35. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/engine_source.py +0 -0
  36. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/extensions/clarify_verdict.ts +0 -0
  37. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/failure.py +0 -0
  38. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/failure_report.py +0 -0
  39. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/gh_response.py +0 -0
  40. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/git_identity.py +0 -0
  41. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/git_transport.py +0 -0
  42. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/github.py +0 -0
  43. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/github_feedback.py +0 -0
  44. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/gitops.py +0 -0
  45. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/human_review.py +0 -0
  46. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/journal.py +0 -0
  47. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/language.py +0 -0
  48. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/language_terms.py +0 -0
  49. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/launchd_deploy.py +0 -0
  50. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/merge_exec.py +0 -0
  51. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/merge_gate.py +0 -0
  52. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/merge_handoff.py +0 -0
  53. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/milestone.py +0 -0
  54. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/milestone_command.py +0 -0
  55. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/notify.py +0 -0
  56. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pi_activity.py +0 -0
  57. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pi_command.py +0 -0
  58. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pi_idle.py +0 -0
  59. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pi_process.py +0 -0
  60. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pi_recovery.py +0 -0
  61. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pi_session.py +0 -0
  62. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pi_stream_log.py +0 -0
  63. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pilot_setup.py +0 -0
  64. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pilot_slots.py +0 -0
  65. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pr_verification.py +0 -0
  66. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/progress.py +0 -0
  67. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/progress_display.py +0 -0
  68. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/progress_outcome.py +0 -0
  69. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/progress_summary.py +0 -0
  70. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/release.py +0 -0
  71. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/release_closeout.py +0 -0
  72. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/release_comments.py +0 -0
  73. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/release_declaration.py +0 -0
  74. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/release_git.py +0 -0
  75. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/release_notes.py +0 -0
  76. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/release_run.py +0 -0
  77. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/repo_config.py +0 -0
  78. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/resume_scan.py +0 -0
  79. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/resume_verification.py +0 -0
  80. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/review_merge.py +0 -0
  81. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/review_rounds.py +0 -0
  82. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/review_verdict.py +0 -0
  83. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/run_state.py +0 -0
  84. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/runner.py +0 -0
  85. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/runner_marker.py +0 -0
  86. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/runner_source.py +0 -0
  87. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/scene.py +0 -0
  88. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/scheduler.py +0 -0
  89. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/scheduler_units.py +0 -0
  90. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/session_command.py +0 -0
  91. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/setup_checks.py +0 -0
  92. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/setup_config.py +0 -0
  93. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/source_pool.py +0 -0
  94. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/split_command.py +0 -0
  95. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/status_observe.py +0 -0
  96. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/suggest.py +0 -0
  97. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/systemd_deploy.py +0 -0
  98. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/ticket_command.py +0 -0
  99. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/user_summary.py +0 -0
  100. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi_cli.egg-info/SOURCES.txt +0 -0
  101. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi_cli.egg-info/dependency_links.txt +0 -0
  102. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi_cli.egg-info/entry_points.txt +0 -0
  103. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi_cli.egg-info/top_level.txt +0 -0
  104. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_agents_md.py +0 -0
  105. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_apply_label_patch.py +0 -0
  106. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_base_branch_failure.py +0 -0
  107. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_base_ci_red.py +0 -0
  108. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_blocked_comment.py +0 -0
  109. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_bootstrap_adapters.py +0 -0
  110. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_bootstrap_delivery.py +0 -0
  111. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_bootstrap_pi.py +0 -0
  112. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_bootstrap_preflight.py +0 -0
  113. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_bootstrap_release.py +0 -0
  114. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_bootstrap_runner.py +0 -0
  115. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_branch_reclaim.py +0 -0
  116. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_check_permission.py +0 -0
  117. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_ci_failure_issue_workflow.py +0 -0
  118. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_ci_failure_triage.py +0 -0
  119. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_ci_macos_workflow.py +0 -0
  120. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_clarify.py +0 -0
  121. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_claude_plugin.py +0 -0
  122. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_cli_golden.py +0 -0
  123. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_cli_install.py +0 -0
  124. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_cli_milestone.py +0 -0
  125. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_cli_packaging.py +0 -0
  126. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_cli_source.py +0 -0
  127. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_cli_ticket_commands.py +0 -0
  128. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_command_receipt_contract.py +0 -0
  129. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_comment_identity.py +0 -0
  130. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_comment_readers_contract.py +0 -0
  131. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_comment_trust.py +0 -0
  132. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_concurrency_e2e.py +0 -0
  133. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_constitution.py +0 -0
  134. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_coverage_gate.py +0 -0
  135. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_criteria_command.py +0 -0
  136. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_deliver_pr_fakes.py +0 -0
  137. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_delivery_branch_delete.py +0 -0
  138. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_delivery_labels.py +0 -0
  139. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_delivery_scene.py +0 -0
  140. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docker_docs.py +0 -0
  141. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docker_entrypoint.py +0 -0
  142. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docker_image_workflow.py +0 -0
  143. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docs_i18n.py +0 -0
  144. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docs_issue_shapes.py +0 -0
  145. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docs_labels.py +0 -0
  146. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docs_mermaid.py +0 -0
  147. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docs_releases.py +0 -0
  148. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docs_single_source.py +0 -0
  149. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docs_site.py +0 -0
  150. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_engine_source.py +0 -0
  151. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_failure.py +0 -0
  152. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_failure_report.py +0 -0
  153. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_fix_needed_loop.py +0 -0
  154. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_gh_read_retry.py +0 -0
  155. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_gh_response.py +0 -0
  156. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_git_base_smoke.py +0 -0
  157. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_git_merge_smoke.py +0 -0
  158. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_git_network_retry.py +0 -0
  159. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_git_transport.py +0 -0
  160. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_github.py +0 -0
  161. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_github_fakes.py +0 -0
  162. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_gitops.py +0 -0
  163. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_gitops_fakes.py +0 -0
  164. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_human_review.py +0 -0
  165. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_import_graph.py +0 -0
  166. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_install_sh.py +0 -0
  167. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_issue_1367.py +0 -0
  168. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_issue_461.py +0 -0
  169. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_issue_template_config.py +0 -0
  170. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_journal.py +0 -0
  171. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_journal_events.py +0 -0
  172. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_launchd_deploy.py +0 -0
  173. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_license.py +0 -0
  174. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_merge_exec_extraction.py +0 -0
  175. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_message_language.py +0 -0
  176. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_milestone_command.py +0 -0
  177. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_notify.py +0 -0
  178. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_ops_e2e.py +0 -0
  179. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_orbi.py +0 -0
  180. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_orbi_dashboard.py +0 -0
  181. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_orbi_exporter.py +0 -0
  182. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_patch_ratchet.py +0 -0
  183. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pi_activity.py +0 -0
  184. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pi_command.py +0 -0
  185. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pi_extensions.py +0 -0
  186. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pi_provider_templates.py +0 -0
  187. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pi_recovery.py +0 -0
  188. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pi_session.py +0 -0
  189. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pilot_setup.py +0 -0
  190. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pilot_slots.py +0 -0
  191. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pr_issue_link_workflow.py +0 -0
  192. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pr_verification.py +0 -0
  193. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_prerequisite_check.py +0 -0
  194. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_progress.py +0 -0
  195. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_progress_wiring.py +0 -0
  196. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_prompt_contract.py +0 -0
  197. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_public_contracts.py +0 -0
  198. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_public_helpers.py +0 -0
  199. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_publish_workflow.py +0 -0
  200. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_release_docs_workflow.py +0 -0
  201. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_release_extraction.py +0 -0
  202. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_release_ticket_templates.py +0 -0
  203. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_repo_config.py +0 -0
  204. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_resume_continue_e2e.py +0 -0
  205. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_resume_e2e.py +0 -0
  206. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_resume_pr.py +0 -0
  207. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_review_merge.py +0 -0
  208. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_review_verdict.py +0 -0
  209. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_run_artifacts.py +0 -0
  210. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_run_id_e2e.py +0 -0
  211. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_run_id_fixture.py +0 -0
  212. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_runner_source_freshness.py +0 -0
  213. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_scene.py +0 -0
  214. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_scheduler.py +0 -0
  215. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_seam.py +0 -0
  216. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_setup_output_golden.py +0 -0
  217. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_size_ratchet.py +0 -0
  218. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_split_command.py +0 -0
  219. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_src_layout.py +0 -0
  220. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_status_observe.py +0 -0
  221. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_steering_review.py +0 -0
  222. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_suggest.py +0 -0
  223. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_suite_hygiene.py +0 -0
  224. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_systemd_deploy.py +0 -0
  225. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_systemd_timer.py +0 -0
  226. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_ticket_command.py +0 -0
  227. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_user_acceptance_contract.py +0 -0
  228. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_user_summary.py +0 -0
  229. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_versioned_comment_block.py +0 -0
  230. {orbi_cli-0.7.26 → orbi_cli-0.7.27}/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.27
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.27"
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.27"
@@ -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.27
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
@@ -496,6 +496,51 @@ def test_ci_workflow_pins_the_mintlify_cli_version():
496
496
  )
497
497
 
498
498
 
499
+ # Issue #1983: `mint@4.2.890` validates through @mintlify/previewing's
500
+ # `is-online@10` connectivity probe: three got requests raced under a
501
+ # `pTimeout`, and when the timeout fired it called `.cancel()` on every
502
+ # probe — got's p-cancelable throws "The `onCancel` handler was attached
503
+ # after the promise settled." for a probe that had already settled, inside
504
+ # the `.catch()` handler, so the throw is uncaught and kills the CLI
505
+ # (2026-10-28, run 40708890646: one slow probe on a GitHub runner). The
506
+ # newer @mintlify/previewing pulls no `is-online`/`got` probe at all: its
507
+ # own `local-preview/is-online.js` uses native `fetch` under an
508
+ # AbortController and `catch { return false }`, so a slow probe can no
509
+ # longer terminate the process. `mint@4.2.1157` is the pinned version of
510
+ # that fixed tree; the pin is a FLOOR (bumping further is the deliberate
511
+ # one-line change #744 describes, a downgrade comes back to the crash).
512
+ MINTLIFY_MIN_VERSION = (4, 2, 1157)
513
+
514
+
515
+ def test_ci_workflow_pins_the_mintlify_cli_without_the_fragile_connectivity_probe():
516
+ """Issue #1983: the docs build smoke must not run a Mintlify CLI whose
517
+ `validate` ships the p-cancelable/is-online probe that aborts the whole
518
+ process when a connectivity probe is slow. A slow probe is runner
519
+ weather, not a docs defect, and it turned `main` red."""
520
+ commands = step_commands(steps_of(load_workflow()))
521
+ installs = [
522
+ command for command in commands
523
+ if re.search(r"npm (i|install)( -g)? mint\b", command)
524
+ ]
525
+ assert installs, (
526
+ "CI must install the official Mintlify CLI (mint), "
527
+ f"steps run: {commands!r}"
528
+ )
529
+ for command in installs:
530
+ match = re.search(r"\bmint@([0-9]+)\.([0-9]+)\.([0-9]+)\b", command)
531
+ assert match, (
532
+ "the Mintlify CLI install must pin an exact version "
533
+ f"(npm install -g mint@<semver>, Issue #744), got: {command!r}"
534
+ )
535
+ pinned = tuple(int(part) for part in match.groups())
536
+ assert pinned >= MINTLIFY_MIN_VERSION, (
537
+ "the pinned Mintlify CLI must be at least "
538
+ f"{'.'.join(str(part) for part in MINTLIFY_MIN_VERSION)}: older "
539
+ "versions ship the is-online/got connectivity probe that crashes "
540
+ f"`mint validate` on a slow probe (Issue #1983), got: {command!r}"
541
+ )
542
+
543
+
499
544
  def test_testing_documents_remote_ci():
500
545
  """Issue #241: the remote CI contract lives in docs/testing.mdx
501
546
  (the README homepage keeps only the summary plus the docs link):
@@ -429,14 +429,29 @@ def test_load_config_health_alert_repo_default_and_override(tmp_path):
429
429
  "fork-owner/orbi-fork"
430
430
 
431
431
 
432
- def test_load_config_rejects_empty_health_alert_repo(tmp_path):
432
+ def test_load_config_keeps_empty_health_alert_repo_as_off(tmp_path):
433
+ """Issue #1985: an explicit empty string turns health-alert FILING off
434
+ while the detection stays; it loads instead of failing the whole
435
+ config."""
433
436
  config_path = tmp_path / "orbi.toml"
434
437
  config_path.write_text(
435
438
  'source_repos = ["owner/repo"]\nhealth_alert_repo = ""\n',
436
439
  encoding="utf-8",
437
440
  )
441
+ assert config_domain.load_config(config_path).health_alert_repo == ""
442
+
443
+
444
+ def test_load_config_rejects_non_string_health_alert_repo(tmp_path):
445
+ """Issue #1985: the two documented values are "" (off) and
446
+ "owner/repo" (route it there) — anything that is not a string is a
447
+ misconfiguration and fails the load fast."""
448
+ config_path = tmp_path / "orbi.toml"
449
+ config_path.write_text(
450
+ 'source_repos = ["owner/repo"]\nhealth_alert_repo = 42\n',
451
+ encoding="utf-8",
452
+ )
438
453
  with pytest.raises(
439
- ValueError, match="health_alert_repo must be a non-empty string",
454
+ ValueError, match="health_alert_repo must be a string",
440
455
  ):
441
456
  config_domain.load_config(config_path)
442
457
 
@@ -1151,6 +1151,52 @@ def test_health_alert_repo_override_wins(tmp_path):
1151
1151
  assert fake.commands("remote get-url origin") == []
1152
1152
 
1153
1153
 
1154
+ def test_empty_health_alert_repo_keeps_detection_without_filing(tmp_path, caplog):
1155
+ """Issue #1985: `health_alert_repo = ""` turns alert FILING off — the
1156
+ crash loop is still detected and journaled, but no alert-repository
1157
+ lookup runs and no alert Issue is filed."""
1158
+ write_state(tmp_path, {"runs": [], "last_pickup_ts": time.time(),
1159
+ "alerted": []})
1160
+ fake = FakeRunCommand({
1161
+ "journalctl --user -u orbi@1.service": THREE_CRASH_JOURNAL,
1162
+ "journalctl --user -u orbi@2.service": "",
1163
+ })
1164
+ with caplog.at_level("INFO"):
1165
+ alerts = runner_health.run_health_check(
1166
+ make_config(tmp_path, health_alert_repo=""), run_command=fake,
1167
+ )
1168
+ assert alerts == []
1169
+ assert "health_degraded check=crash_loop" in caplog.text
1170
+ assert fake.commands("gh issue") == []
1171
+ assert fake.commands("remote get-url origin") == []
1172
+
1173
+
1174
+ def test_stale_pickup_empty_health_alert_repo_detects_without_filing(
1175
+ tmp_path, caplog,
1176
+ ):
1177
+ """Issue #1985: a stale pickup with `health_alert_repo = ""` is still
1178
+ detected (the ready-queue probe on the delivery repo stays) and
1179
+ journaled, but no alert-repository lookup and no alert Issue happen."""
1180
+ write_state(tmp_path, {"runs": [],
1181
+ "last_pickup_ts": time.time() - 48 * 3600,
1182
+ "alerted": []})
1183
+ fake = FakeRunCommand({
1184
+ "journalctl --user -u orbi@1.service": "",
1185
+ "journalctl --user -u orbi@2.service": "",
1186
+ "--label ai-ready": json.dumps([{"number": 7}]),
1187
+ })
1188
+ with caplog.at_level("INFO"):
1189
+ alerts = runner_health.run_health_check(
1190
+ make_config(tmp_path, health_alert_repo=""), run_command=fake,
1191
+ )
1192
+ assert alerts == []
1193
+ assert "health_degraded check=stale_pickup" in caplog.text
1194
+ # The detection probe stays: the ai-ready queue on the delivery repo.
1195
+ assert len(fake.commands("--label ai-ready")) == 1
1196
+ assert fake.commands("gh issue create") == []
1197
+ assert fake.commands("remote get-url origin") == []
1198
+
1199
+
1154
1200
  def test_undeterminable_alert_repo_skips_the_issue(tmp_path, caplog):
1155
1201
  """Issue #345: when the orbi repo cannot be determined the alert is
1156
1202
  skipped (bypass) — never filed in the delivery repo, never guessed."""
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes