code-mower 1.1.1__tar.gz → 1.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 (436) hide show
  1. {code_mower-1.1.1 → code_mower-1.2.0}/PKG-INFO +64 -29
  2. {code_mower-1.1.1 → code_mower-1.2.0}/README.md +63 -28
  3. {code_mower-1.1.1 → code_mower-1.2.0}/pyproject.toml +1 -1
  4. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/__init__.py +1 -1
  5. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/board.py +11 -0
  6. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/events.py +29 -0
  7. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/controller.py +29 -3
  8. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/jira_cloud.py +41 -15
  9. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/package_manifest.py +1 -0
  10. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/release_campaigns.py +37 -2
  11. code_mower-1.2.0/src/code_mower/session.py +322 -0
  12. code_mower-1.2.0/src/code_mower/session_lease.py +515 -0
  13. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
  14. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/tracker_queue.py +11 -4
  15. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower.egg-info/PKG-INFO +64 -29
  16. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower.egg-info/SOURCES.txt +3 -0
  17. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/builder-provenance.yml.j2 +1 -1
  18. code_mower-1.2.0/tests/test_board_lease.py +152 -0
  19. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_controller.py +121 -1
  20. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_jira_adoption.py +6 -4
  21. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_jira_cloud.py +38 -0
  22. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_participant_sessions.py +101 -0
  23. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_release_campaigns.py +65 -0
  24. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_release_hygiene.py +85 -45
  25. code_mower-1.2.0/tests/test_session_lease.py +786 -0
  26. code_mower-1.2.0/tests/test_supervised_pilot_contract.py +104 -0
  27. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_tracker_queue.py +10 -5
  28. code_mower-1.1.1/src/code_mower/session.py +0 -154
  29. code_mower-1.1.1/tests/test_supervised_pilot_contract.py +0 -61
  30. {code_mower-1.1.1 → code_mower-1.2.0}/CODE_OF_CONDUCT.md +0 -0
  31. {code_mower-1.1.1 → code_mower-1.2.0}/LICENSE +0 -0
  32. {code_mower-1.1.1 → code_mower-1.2.0}/MANIFEST.in +0 -0
  33. {code_mower-1.1.1 → code_mower-1.2.0}/NOTICE +0 -0
  34. {code_mower-1.1.1 → code_mower-1.2.0}/SUPPORT.md +0 -0
  35. {code_mower-1.1.1 → code_mower-1.2.0}/requirements/requirements.txt +0 -0
  36. {code_mower-1.1.1 → code_mower-1.2.0}/setup.cfg +0 -0
  37. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/adapters/__init__.py +0 -0
  38. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/adapters/_base.py +0 -0
  39. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  40. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/adapters/gitar.py +0 -0
  41. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/adapters/greptile.py +0 -0
  42. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/adapters/qodo.py +0 -0
  43. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  44. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/antigravity_sdk_probe.py +0 -0
  45. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/audit_handoff_log.py +0 -0
  46. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/audit_labeler_lib.py +0 -0
  47. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/audit_limits.py +0 -0
  48. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/audit_progress.py +0 -0
  49. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/blind_review_artifacts.py +0 -0
  50. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/blind_review_coordinator.py +0 -0
  51. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/board_store.py +0 -0
  52. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/bootstrap.py +0 -0
  53. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/builder_experiment.py +0 -0
  54. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/builder_runs.py +0 -0
  55. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/__init__.py +0 -0
  56. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/arms.py +0 -0
  57. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/auto_discovery.py +0 -0
  58. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/commands.py +0 -0
  59. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/context_inputs.py +0 -0
  60. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/corpus.py +0 -0
  61. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/effect_report.py +0 -0
  62. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/evidence.py +0 -0
  63. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/evidence_report.py +0 -0
  64. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/identity.py +0 -0
  65. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/metrics.py +0 -0
  66. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/overlap.py +0 -0
  67. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/planning.py +0 -0
  68. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/policy.py +0 -0
  69. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/results.py +0 -0
  70. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/run_results.py +0 -0
  71. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/run_status.py +0 -0
  72. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/runner.py +0 -0
  73. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/truth.py +0 -0
  74. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/calibration/value_report.py +0 -0
  75. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/campaign_adapters.py +0 -0
  76. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/campaign_discovery.py +0 -0
  77. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/checks.py +0 -0
  78. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/claude_audit_pr.py +0 -0
  79. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/claude_cli_bounce.py +0 -0
  80. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/claude_cli_environment.py +0 -0
  81. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/clear_stale.py +0 -0
  82. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cli.py +0 -0
  83. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud.py +0 -0
  84. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/__init__.py +0 -0
  85. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/adoption_runs.py +0 -0
  86. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/bundle.py +0 -0
  87. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/doctor.py +0 -0
  88. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/dogfood.py +0 -0
  89. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/endpoints.py +0 -0
  90. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/errors.py +0 -0
  91. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/export.py +0 -0
  92. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/finding_outcomes.py +0 -0
  93. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/git_metadata.py +0 -0
  94. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/manifest.py +0 -0
  95. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/operations.py +0 -0
  96. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/pr_outcomes.py +0 -0
  97. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/productivity.py +0 -0
  98. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/productivity_windows.py +0 -0
  99. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/reports.py +0 -0
  100. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/setup.py +0 -0
  101. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/tokens.py +0 -0
  102. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/upload.py +0 -0
  103. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/cloud_client/work_types.py +0 -0
  104. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/code_mower_calibration.py +0 -0
  105. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/code_mower_context_packs.py +0 -0
  106. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/code_mower_merge.py +0 -0
  107. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/code_mower_telemetry.py +0 -0
  108. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  109. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/codex_audit_env_preflight.py +0 -0
  110. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/codex_audit_pr.py +0 -0
  111. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  112. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  113. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/config.py +0 -0
  114. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/decisions.py +0 -0
  115. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/devin_api.py +0 -0
  116. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/devin_cli_audit_pr.py +0 -0
  117. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor.py +0 -0
  118. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/__init__.py +0 -0
  119. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/adoption.py +0 -0
  120. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/audit_limits.py +0 -0
  121. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/campaign_auth.py +0 -0
  122. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/cloud.py +0 -0
  123. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/common.py +0 -0
  124. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github.py +0 -0
  125. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions.py +0 -0
  126. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  127. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  128. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  129. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  130. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  131. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  132. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  133. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  134. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_api.py +0 -0
  135. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_branch.py +0 -0
  136. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_config.py +0 -0
  137. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_human_token.py +0 -0
  138. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_provider.py +0 -0
  139. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_repo.py +0 -0
  140. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
  141. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/groups.py +0 -0
  142. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/jira.py +0 -0
  143. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/models.py +0 -0
  144. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/output.py +0 -0
  145. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/presets.py +0 -0
  146. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/privacy.py +0 -0
  147. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  148. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  149. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  150. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_env.py +0 -0
  151. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  152. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  153. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
  154. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  155. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  156. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  157. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  158. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  159. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  160. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  161. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  162. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  163. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/providers.py +0 -0
  164. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/registry.py +0 -0
  165. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/runner.py +0 -0
  166. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/runtime.py +0 -0
  167. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  168. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
  169. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/doctor_checks/supervised_pilot.py +0 -0
  170. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/file_locks.py +0 -0
  171. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/gate_health.py +0 -0
  172. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  173. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/git_identity.py +0 -0
  174. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/grok_build_audit_pr.py +0 -0
  175. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  176. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/init.py +0 -0
  177. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/jira_mutations.py +0 -0
  178. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/jira_pr_sync.py +0 -0
  179. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/lane_configs/__init__.py +0 -0
  180. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/lane_configs/aider.py +0 -0
  181. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  182. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/lane_configs/claude.py +0 -0
  183. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/lane_configs/codex.py +0 -0
  184. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/lane_configs/devin.py +0 -0
  185. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/lane_configs/devin_cli.py +0 -0
  186. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  187. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/lane_configs/grok_build.py +0 -0
  188. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  189. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/lane_configs/local_llm.py +0 -0
  190. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/lane_configs/muse_cli.py +0 -0
  191. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/lane_delivery.py +0 -0
  192. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/lane_status.py +0 -0
  193. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/local_llm_audit_pr.py +0 -0
  194. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/local_llm_bakeoff.py +0 -0
  195. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/local_llm_calibration.py +0 -0
  196. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/local_llm_profiles.py +0 -0
  197. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/migration.py +0 -0
  198. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/migration_install.py +0 -0
  199. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/migration_mirror.py +0 -0
  200. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/migration_readiness.py +0 -0
  201. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/migration_rehearsal.py +0 -0
  202. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/muse_cli_audit_pr.py +0 -0
  203. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/next_steps.py +0 -0
  204. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/package.py +0 -0
  205. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/package_content.py +0 -0
  206. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/package_paths.py +0 -0
  207. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/package_rendering.py +0 -0
  208. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/package_static.py +0 -0
  209. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/participants.py +0 -0
  210. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/plan_context.py +0 -0
  211. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/productivity_report.py +0 -0
  212. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/prompts.py +0 -0
  213. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/provider_credentials.py +0 -0
  214. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/provider_registry.py +0 -0
  215. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/provider_runners/__init__.py +0 -0
  216. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/provider_runners/comments.py +0 -0
  217. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/provider_runners/exit_codes.py +0 -0
  218. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/provider_runners/git.py +0 -0
  219. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/provider_runners/github_auth.py +0 -0
  220. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/provider_runners/github_pr.py +0 -0
  221. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  222. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/provider_runners/process.py +0 -0
  223. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/provider_runners/repo_paths.py +0 -0
  224. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/provider_runners/text_schema.py +0 -0
  225. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  226. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/provider_runners/workspace.py +0 -0
  227. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/providers/__init__.py +0 -0
  228. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/providers/local_cli.py +0 -0
  229. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/providers/provenance.py +0 -0
  230. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/release_qualify.py +0 -0
  231. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/release_readiness.py +0 -0
  232. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/reviewer_metrics.py +0 -0
  233. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/reviewer_spend.py +0 -0
  234. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/saas_reviewer_labeler.py +0 -0
  235. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/secrets.py +0 -0
  236. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/builder-experiment.example.json +0 -0
  237. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  238. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/calibration-corpus.json +0 -0
  239. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/code-mower.example.yml +0 -0
  240. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/context-packs.example.json +0 -0
  241. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  242. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  243. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  244. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  245. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  246. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  247. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  248. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
  249. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  250. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lanes/README.md +0 -0
  251. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lanes/claude.md +0 -0
  252. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lanes/codex.md +0 -0
  253. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lanes/cursor.md +0 -0
  254. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lanes/devin.md +0 -0
  255. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lanes/generic.md +0 -0
  256. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
  257. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/product-support/code_mower +0 -0
  258. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  259. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  260. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  261. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  262. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/product-support/run_devin_cli_audit_pr.sh +0 -0
  263. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  264. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/product-support/status_report.py +0 -0
  265. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/providers.yml +0 -0
  266. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  267. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  268. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  269. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  270. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  271. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  272. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
  273. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  274. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  275. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  276. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  277. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
  278. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  279. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  280. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  281. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  282. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  283. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
  284. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/tracker_contract.py +0 -0
  285. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/trailer_comment_labeler.py +0 -0
  286. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/versioning.py +0 -0
  287. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/work_orders.py +0 -0
  288. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower/workflow_actionlint.py +0 -0
  289. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower.egg-info/dependency_links.txt +0 -0
  290. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower.egg-info/entry_points.txt +0 -0
  291. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower.egg-info/requires.txt +0 -0
  292. {code_mower-1.1.1 → code_mower-1.2.0}/src/code_mower.egg-info/top_level.txt +0 -0
  293. {code_mower-1.1.1 → code_mower-1.2.0}/templates/builder-experiment.example.json +0 -0
  294. {code_mower-1.1.1 → code_mower-1.2.0}/templates/calibration-corpus.example.json +0 -0
  295. {code_mower-1.1.1 → code_mower-1.2.0}/templates/calibration-corpus.json +0 -0
  296. {code_mower-1.1.1 → code_mower-1.2.0}/templates/code-mower.yml.j2 +0 -0
  297. {code_mower-1.1.1 → code_mower-1.2.0}/templates/context-packs.example.json +0 -0
  298. {code_mower-1.1.1 → code_mower-1.2.0}/templates/cursor/BUGBOT.md +0 -0
  299. {code_mower-1.1.1 → code_mower-1.2.0}/templates/lanes/README.md +0 -0
  300. {code_mower-1.1.1 → code_mower-1.2.0}/templates/lanes/claude.md +0 -0
  301. {code_mower-1.1.1 → code_mower-1.2.0}/templates/lanes/codex.md +0 -0
  302. {code_mower-1.1.1 → code_mower-1.2.0}/templates/lanes/cursor.md +0 -0
  303. {code_mower-1.1.1 → code_mower-1.2.0}/templates/lanes/devin.md +0 -0
  304. {code_mower-1.1.1 → code_mower-1.2.0}/templates/lanes/generic.md +0 -0
  305. {code_mower-1.1.1 → code_mower-1.2.0}/templates/lanes/run_mac_lane.sh +0 -0
  306. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/acp_bridge.yml +0 -0
  307. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/aider.yml +0 -0
  308. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/antigravity_cli.yml +0 -0
  309. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/claude_audit.yml +0 -0
  310. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/claude_review.yml +0 -0
  311. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/coderabbit_cli.yml +0 -0
  312. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/codex.yml +0 -0
  313. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/cursor_bugbot.yml +0 -0
  314. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/cursor_cloud_agent.yml +0 -0
  315. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/devin.yml +0 -0
  316. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/devin_cli.yml +0 -0
  317. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/gemini_cli.yml +0 -0
  318. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/gitar.yml +0 -0
  319. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/greptile.yml +0 -0
  320. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/hermes_cli.yml +0 -0
  321. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/local_llm.yml +0 -0
  322. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/muse_cli.yml +0 -0
  323. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers/qodo.yml +0 -0
  324. {code_mower-1.1.1 → code_mower-1.2.0}/templates/providers.yml +0 -0
  325. {code_mower-1.1.1 → code_mower-1.2.0}/templates/reviewer-spend.example.json +0 -0
  326. {code_mower-1.1.1 → code_mower-1.2.0}/templates/reviewer-value-report.example.md +0 -0
  327. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  328. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  329. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  330. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  331. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  332. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/code-mower-gate.yml.j2 +0 -0
  333. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  334. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  335. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  336. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  337. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  338. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  339. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  340. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  341. {code_mower-1.1.1 → code_mower-1.2.0}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  342. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_adoption_diagnostics.py +0 -0
  343. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_adoption_result_semantics.py +0 -0
  344. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_adoption_run_contract.py +0 -0
  345. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_antigravity_cli_audit_pr.py +0 -0
  346. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_antigravity_sdk_probe.py +0 -0
  347. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_audit_comment_posture.py +0 -0
  348. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_audit_limits.py +0 -0
  349. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_board.py +0 -0
  350. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_builder_experiment.py +0 -0
  351. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_builder_identity.py +0 -0
  352. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_builder_runs.py +0 -0
  353. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_calibration_effect_report.py +0 -0
  354. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_calibration_truth.py +0 -0
  355. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_campaign_adapters.py +0 -0
  356. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_campaign_discovery.py +0 -0
  357. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_campaign_gh_auth_and_issue_binding_817.py +0 -0
  358. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_campaign_retry_evidence_711.py +0 -0
  359. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_checks.py +0 -0
  360. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_claude_audit_pr.py +0 -0
  361. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_claude_cli_bounce.py +0 -0
  362. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_clear_stale.py +0 -0
  363. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_cloud_client.py +0 -0
  364. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_cloud_git_metadata.py +0 -0
  365. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_cloud_manifest.py +0 -0
  366. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_cloud_reports.py +0 -0
  367. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  368. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_codex_audit_env_preflight.py +0 -0
  369. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_codex_audit_pr.py +0 -0
  370. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_decision_audit_integration.py +0 -0
  371. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_decisions.py +0 -0
  372. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_devin_api.py +0 -0
  373. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_devin_builder_lane.py +0 -0
  374. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_devin_cli_audit_pr.py +0 -0
  375. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_devin_provider_contract.py +0 -0
  376. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_actions_cost_summary.py +0 -0
  377. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_actions_failure_selection.py +0 -0
  378. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_boundaries.py +0 -0
  379. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_campaign_auth.py +0 -0
  380. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_campaign_readiness.py +0 -0
  381. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_github_checks.py +0 -0
  382. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_output.py +0 -0
  383. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_privacy.py +0 -0
  384. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_provider_env_required.py +0 -0
  385. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_provider_env_tokens.py +0 -0
  386. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_provider_local_audit_setup.py +0 -0
  387. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_provider_probe.py +0 -0
  388. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_provider_review_hygiene.py +0 -0
  389. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_registry.py +0 -0
  390. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_runtime.py +0 -0
  391. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_self_hosted_runner.py +0 -0
  392. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_doctor_supervised_pilot.py +0 -0
  393. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_file_locks.py +0 -0
  394. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_fork_pr_guard.py +0 -0
  395. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_gate_automerge.py +0 -0
  396. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_gate_health.py +0 -0
  397. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_hosted_dispatch_profile.py +0 -0
  398. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_init_actionlint.py +0 -0
  399. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_init_build_loop.py +0 -0
  400. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_jira_mutations.py +0 -0
  401. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_jira_pr_sync.py +0 -0
  402. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_lane_delivery_contract.py +0 -0
  403. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_lane_status.py +0 -0
  404. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_local_llm_github_helpers.py +0 -0
  405. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_migration_rehearsal.py +0 -0
  406. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_migration_setup_drift.py +0 -0
  407. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_next_steps.py +0 -0
  408. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_package_install_failure_taxonomy.py +0 -0
  409. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_plan_context.py +0 -0
  410. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_pr_outcome_contract.py +0 -0
  411. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_pr_outcome_coverage.py +0 -0
  412. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_productivity_metrics_contract.py +0 -0
  413. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_productivity_report.py +0 -0
  414. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_productivity_windows.py +0 -0
  415. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_prompts.py +0 -0
  416. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_provider_credentials.py +0 -0
  417. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_provider_fixture_contracts.py +0 -0
  418. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_provider_local_cli.py +0 -0
  419. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_provider_runners_comments.py +0 -0
  420. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_provider_runners_git.py +0 -0
  421. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_provider_runners_github_pr.py +0 -0
  422. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_provider_runners_pr_worktree.py +0 -0
  423. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_provider_runners_process.py +0 -0
  424. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_provider_runners_repo_paths.py +0 -0
  425. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_provider_runners_text_schema.py +0 -0
  426. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_provider_runners_workspace.py +0 -0
  427. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_release_qualify.py +0 -0
  428. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_remote_qualification_failure_reason_819.py +0 -0
  429. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_reviewer_finding_outcome_contract.py +0 -0
  430. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_reviewer_metrics_core.py +0 -0
  431. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_reviewer_spend.py +0 -0
  432. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_tracker_config.py +0 -0
  433. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_tracker_contract.py +0 -0
  434. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_trailer_comment_labeler.py +0 -0
  435. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_work_orders.py +0 -0
  436. {code_mower-1.1.1 → code_mower-1.2.0}/tests/test_work_type_contract.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 1.1.1
3
+ Version: 1.2.0
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Homepage, https://github.com/codemower-ai/code-mower
@@ -34,9 +34,9 @@ Code Mower helps teams set up AI peer-programmer and reviewer lanes on real
34
34
  GitHub pull requests, then measure which builders and reviewers are useful on
35
35
  their actual codebase.
36
36
 
37
- Code Mower 1.0 is supervised-pilot, bring-your-own-agent-loop software for
38
- teams willing to calibrate reviewers. It is not a drop-in unattended merge
39
- gate.
37
+ The current Code Mower release line is supervised-pilot,
38
+ bring-your-own-agent-loop software for teams willing to calibrate reviewers.
39
+ It is not a drop-in unattended merge gate.
40
40
 
41
41
  The short version:
42
42
 
@@ -55,6 +55,11 @@ Code Mower is local-first. The OSS tool works without the hosted service.
55
55
  Default cloud bundles exclude source code, raw diffs, raw model transcripts,
56
56
  raw stdout/stderr, auth output, and secrets.
57
57
 
58
+ Documentation on `main` follows the source on `main`. If you install the
59
+ published `code-mower==1.2.0` package, use the documentation from the matching
60
+ [`v1.2.0` tag](https://github.com/codemower-ai/code-mower/tree/v1.2.0) so the
61
+ commands and package stay aligned as development continues.
62
+
58
63
  ## Design Principles
59
64
 
60
65
  Code Mower should feel like an engineering tool, not a demo harness:
@@ -188,10 +193,12 @@ When a team wants the same operator picture on CodeMower.com, run
188
193
  zero-report, metadata-only mirror event, then add `--yes` only after review.
189
194
  The v1.0 supervised-pilot automation and event boundary is defined in
190
195
  [Supervised Pilot Contract](docs/supervised-pilot-contract.md).
191
- As that controller lands, `code-mower controller run --repo OWNER/REPO` is the
192
- dry-run-first policy check: it selects the current dispatch/merge/owner-action
193
- decision from metadata, can write a sanitized event with `--event-file`, and
194
- does not mutate GitHub state.
196
+ `code-mower controller run --repo OWNER/REPO` is the dry-run-first policy
197
+ check: it selects the current dispatch/merge/owner-action decision from
198
+ metadata, can write a sanitized event with `--event-file`, and does not mutate
199
+ GitHub state. Its modes change policy evaluation and evidence requirements;
200
+ the generated workflows and provider transports own any separately authorized
201
+ mutation.
195
202
 
196
203
  ## See The Value Shape First
197
204
 
@@ -245,7 +252,7 @@ agent report its actual host posture, exact installed version, doctor result,
245
252
  Board URL, and any owner-only click-list before it mutates the repo.
246
253
 
247
254
  The current package-index announcement entry point is the tagged
248
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.1/docs/try-in-10-minutes.md)
255
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.0/docs/try-in-10-minutes.md)
249
256
  guide. The v1.0 supervised-pilot release includes the native Board, the
250
257
  controller dry-run and policy contract, adoption and upgrade hardening from
251
258
  recent install rehearsals, package-index release checks, provider-diversity
@@ -310,14 +317,26 @@ reports `running` / `waiting_for_user`, so a finished informational Devin
310
317
  attempt is no longer recorded as owner-blocked. An explicit terminal API
311
318
  failure and a `waiting_for_approval` session still take precedence over any
312
319
  structured output.
320
+ The v1.0.15 patch makes productivity current-state metrics prefer live GitHub
321
+ state over historical Board snapshots and distinguishes historical evidence in
322
+ reports.
313
323
  The v1.1 release adds optional Jira Cloud work tracking while keeping GitHub
314
324
  pull requests, checks, and merge gates authoritative. Jira setup starts
315
325
  read-only; mutation requires both explicit configuration and an explicit
316
326
  apply command. Controller queue visibility, Board, and PR-to-Jira milestones
317
327
  share the same bounded metadata contract, and GitHub-only repositories keep
318
328
  their existing behavior and generated workflows.
319
- Package-only users can start from the public package rather than a source
320
- checkout.
329
+ The v1.1.1 patch hardens hosted release qualification with authenticated GitHub
330
+ fallback, durable campaign issue binding, persistent trusted result authors,
331
+ and bounded remote install failure reasons. The v1.1.2 patch keeps large Jira
332
+ queues inside the response budget and adds a narrow issue-type discovery
333
+ fallback when Jira's create-metadata inventory returns 404.
334
+
335
+ The v1.2 release gives every orchestrator host the same Jira authority brief,
336
+ adds a local single-orchestrator session lease with Board visibility, records
337
+ controller orchestrator telemetry, qualifies Cursor against the Codex/Claude
338
+ orchestrator contract, and makes hosted release qualification reproduce the
339
+ validated local result command exactly.
321
340
 
322
341
  ## What Calibration Does And Does Not Prove
323
342
 
@@ -348,7 +367,7 @@ Provider-contract baseline for the next release train:
348
367
 
349
368
  For release verification,
350
369
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
351
- the package-index procedure for `v1.1.1` / `code-mower==1.1.1`. The
370
+ the package-index procedure for `v1.2.0` / `code-mower==1.2.0`. The
352
371
  GitHub release records the workflow and rehearsal evidence for the exact tag.
353
372
  After publication, [Release Qualification](docs/release-qualification.md)
354
373
  coordinates provider-specific install and operational checks without treating
@@ -542,8 +561,8 @@ measurement work.
542
561
 
543
562
  ## Installation Status
544
563
 
545
- The current package-index release baseline is `v1.1.1`, with pinned package
546
- install spec `code-mower==1.1.1`. Release evidence is recorded on the GitHub
564
+ The current package-index release baseline is `v1.2.0`, with pinned package
565
+ install spec `code-mower==1.2.0`. Release evidence is recorded on the GitHub
547
566
  release and in the first-user install rehearsal. The public repository is
548
567
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
549
568
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -584,11 +603,14 @@ first so local work exercises the same package entrypoint users install.
584
603
 
585
604
  ## Docs Map
586
605
 
606
+ ### Start And Operate
607
+
587
608
  - [Install And Bootstrap](docs/install.md)
588
609
  - [Upgrade An Existing Repository](docs/upgrade-existing-repo.md)
589
610
  - [Try Code Mower In 10 Minutes](docs/try-in-10-minutes.md)
590
611
  - [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md)
591
612
  - [Quickstart Reference](docs/quickstart.md)
613
+ - [Participants And Sessions](docs/sessions.md)
592
614
  - [Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md)
593
615
  - [Planning And Work Orders](docs/planning-work-orders.md)
594
616
  - [Builder Providers: Grok And Cursor](docs/builders-grok-cursor.md)
@@ -604,11 +626,31 @@ first so local work exercises the same package entrypoint users install.
604
626
  - [GitHub Setup](docs/github-setup.md)
605
627
  - [Jira Cloud Setup](docs/jira-cloud-setup.md)
606
628
  - [Jira Adoption Rehearsal](docs/jira-adoption-rehearsal.md)
629
+ - [Work Tracker Data Contract](docs/tracker-data-contract.md)
630
+ - [Release Qualification](docs/release-qualification.md)
631
+ - [Launch Command Surface](docs/launch-command-surface.md)
632
+ - [Troubleshooting](docs/troubleshooting.md)
633
+
634
+ ### Trust, Architecture, And Evidence
635
+
636
+ - [Architecture](docs/architecture.md)
637
+ - [Lane Promotion Policy](docs/lane-promotion-policy.md)
638
+ - [Cloud Sharing](docs/cloud-sharing.md)
639
+ - [Cloud Data Contract](docs/cloud-data-contract.md)
640
+ - [Board Data Contract](docs/board-data-contract.md)
641
+ - [Privacy And Threat Model](docs/privacy-threat-model.md)
642
+ - [Current State And Roadmap](docs/current-state-and-roadmap.md)
643
+ - [Public Release Checklist](docs/public-release-checklist.md)
644
+ - [PyPI Release Runbook](docs/pypi-release.md)
645
+ - [Sample Doctor Output](docs/sample-doctor-output.md)
607
646
  - [First Run Transcript](docs/first-run-transcript.md)
608
647
  - [First-User Demo Transcript](docs/first-user-demo-transcript.md)
609
648
  - [First-User Install Rehearsal](docs/first-user-install-rehearsal.md)
610
- - [Release Qualification](docs/release-qualification.md)
611
- - [Launch Command Surface](docs/launch-command-surface.md)
649
+ - [Demo Calibration Example](examples/demo-calibration/README.md)
650
+ - [Board Demo Rehearsal](examples/board-demo/README.md)
651
+
652
+ ### History And Release Records
653
+
612
654
  - [v0.6 Truth Baseline](docs/v06-truth-baseline.md)
613
655
  - [v0.6 Release Notes](docs/v06-release-notes.md)
614
656
  - [v0.8 Release Notes](docs/v08-release-notes.md)
@@ -629,22 +671,15 @@ first so local work exercises the same package entrypoint users install.
629
671
  - [v1.0.13 Release Notes](docs/v1013-release-notes.md)
630
672
  - [v1.0.14 Release Notes](docs/v1014-release-notes.md)
631
673
  - [v1.0.15 Release Notes](docs/v1015-release-notes.md)
632
- - [v1.1.1 Release Notes](docs/v111-release-notes.md)
633
674
  - [v1.1 Release Notes](docs/v11-release-notes.md)
675
+ - [v1.1.1 Release Notes](docs/v111-release-notes.md)
676
+ - [v1.1.2 Release Notes](docs/v112-release-notes.md)
677
+ - [v1.2 Release Notes](docs/v12-release-notes.md)
634
678
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
635
679
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
636
- - [Demo Calibration Example](examples/demo-calibration/README.md)
637
- - [Board Demo Rehearsal](examples/board-demo/README.md)
638
- - [PyPI Release Runbook](docs/pypi-release.md)
639
- - [Sample Doctor Output](docs/sample-doctor-output.md)
640
- - [Architecture](docs/architecture.md)
641
- - [Lane Promotion Policy](docs/lane-promotion-policy.md)
642
- - [Cloud Sharing](docs/cloud-sharing.md)
643
- - [Cloud Data Contract](docs/cloud-data-contract.md)
644
- - [Board Data Contract](docs/board-data-contract.md)
645
- - [Privacy And Threat Model](docs/privacy-threat-model.md)
646
- - [Current State And Roadmap](docs/current-state-and-roadmap.md)
647
- - [Public Release Checklist](docs/public-release-checklist.md)
680
+
681
+ ### Project
682
+
648
683
  - [Changelog](CHANGELOG.md)
649
684
  - [Contributing](CONTRIBUTING.md)
650
685
  - [Support](SUPPORT.md)
@@ -4,9 +4,9 @@ Code Mower helps teams set up AI peer-programmer and reviewer lanes on real
4
4
  GitHub pull requests, then measure which builders and reviewers are useful on
5
5
  their actual codebase.
6
6
 
7
- Code Mower 1.0 is supervised-pilot, bring-your-own-agent-loop software for
8
- teams willing to calibrate reviewers. It is not a drop-in unattended merge
9
- gate.
7
+ The current Code Mower release line is supervised-pilot,
8
+ bring-your-own-agent-loop software for teams willing to calibrate reviewers.
9
+ It is not a drop-in unattended merge gate.
10
10
 
11
11
  The short version:
12
12
 
@@ -25,6 +25,11 @@ Code Mower is local-first. The OSS tool works without the hosted service.
25
25
  Default cloud bundles exclude source code, raw diffs, raw model transcripts,
26
26
  raw stdout/stderr, auth output, and secrets.
27
27
 
28
+ Documentation on `main` follows the source on `main`. If you install the
29
+ published `code-mower==1.2.0` package, use the documentation from the matching
30
+ [`v1.2.0` tag](https://github.com/codemower-ai/code-mower/tree/v1.2.0) so the
31
+ commands and package stay aligned as development continues.
32
+
28
33
  ## Design Principles
29
34
 
30
35
  Code Mower should feel like an engineering tool, not a demo harness:
@@ -158,10 +163,12 @@ When a team wants the same operator picture on CodeMower.com, run
158
163
  zero-report, metadata-only mirror event, then add `--yes` only after review.
159
164
  The v1.0 supervised-pilot automation and event boundary is defined in
160
165
  [Supervised Pilot Contract](docs/supervised-pilot-contract.md).
161
- As that controller lands, `code-mower controller run --repo OWNER/REPO` is the
162
- dry-run-first policy check: it selects the current dispatch/merge/owner-action
163
- decision from metadata, can write a sanitized event with `--event-file`, and
164
- does not mutate GitHub state.
166
+ `code-mower controller run --repo OWNER/REPO` is the dry-run-first policy
167
+ check: it selects the current dispatch/merge/owner-action decision from
168
+ metadata, can write a sanitized event with `--event-file`, and does not mutate
169
+ GitHub state. Its modes change policy evaluation and evidence requirements;
170
+ the generated workflows and provider transports own any separately authorized
171
+ mutation.
165
172
 
166
173
  ## See The Value Shape First
167
174
 
@@ -215,7 +222,7 @@ agent report its actual host posture, exact installed version, doctor result,
215
222
  Board URL, and any owner-only click-list before it mutates the repo.
216
223
 
217
224
  The current package-index announcement entry point is the tagged
218
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.1/docs/try-in-10-minutes.md)
225
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.0/docs/try-in-10-minutes.md)
219
226
  guide. The v1.0 supervised-pilot release includes the native Board, the
220
227
  controller dry-run and policy contract, adoption and upgrade hardening from
221
228
  recent install rehearsals, package-index release checks, provider-diversity
@@ -280,14 +287,26 @@ reports `running` / `waiting_for_user`, so a finished informational Devin
280
287
  attempt is no longer recorded as owner-blocked. An explicit terminal API
281
288
  failure and a `waiting_for_approval` session still take precedence over any
282
289
  structured output.
290
+ The v1.0.15 patch makes productivity current-state metrics prefer live GitHub
291
+ state over historical Board snapshots and distinguishes historical evidence in
292
+ reports.
283
293
  The v1.1 release adds optional Jira Cloud work tracking while keeping GitHub
284
294
  pull requests, checks, and merge gates authoritative. Jira setup starts
285
295
  read-only; mutation requires both explicit configuration and an explicit
286
296
  apply command. Controller queue visibility, Board, and PR-to-Jira milestones
287
297
  share the same bounded metadata contract, and GitHub-only repositories keep
288
298
  their existing behavior and generated workflows.
289
- Package-only users can start from the public package rather than a source
290
- checkout.
299
+ The v1.1.1 patch hardens hosted release qualification with authenticated GitHub
300
+ fallback, durable campaign issue binding, persistent trusted result authors,
301
+ and bounded remote install failure reasons. The v1.1.2 patch keeps large Jira
302
+ queues inside the response budget and adds a narrow issue-type discovery
303
+ fallback when Jira's create-metadata inventory returns 404.
304
+
305
+ The v1.2 release gives every orchestrator host the same Jira authority brief,
306
+ adds a local single-orchestrator session lease with Board visibility, records
307
+ controller orchestrator telemetry, qualifies Cursor against the Codex/Claude
308
+ orchestrator contract, and makes hosted release qualification reproduce the
309
+ validated local result command exactly.
291
310
 
292
311
  ## What Calibration Does And Does Not Prove
293
312
 
@@ -318,7 +337,7 @@ Provider-contract baseline for the next release train:
318
337
 
319
338
  For release verification,
320
339
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
321
- the package-index procedure for `v1.1.1` / `code-mower==1.1.1`. The
340
+ the package-index procedure for `v1.2.0` / `code-mower==1.2.0`. The
322
341
  GitHub release records the workflow and rehearsal evidence for the exact tag.
323
342
  After publication, [Release Qualification](docs/release-qualification.md)
324
343
  coordinates provider-specific install and operational checks without treating
@@ -512,8 +531,8 @@ measurement work.
512
531
 
513
532
  ## Installation Status
514
533
 
515
- The current package-index release baseline is `v1.1.1`, with pinned package
516
- install spec `code-mower==1.1.1`. Release evidence is recorded on the GitHub
534
+ The current package-index release baseline is `v1.2.0`, with pinned package
535
+ install spec `code-mower==1.2.0`. Release evidence is recorded on the GitHub
517
536
  release and in the first-user install rehearsal. The public repository is
518
537
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
519
538
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -554,11 +573,14 @@ first so local work exercises the same package entrypoint users install.
554
573
 
555
574
  ## Docs Map
556
575
 
576
+ ### Start And Operate
577
+
557
578
  - [Install And Bootstrap](docs/install.md)
558
579
  - [Upgrade An Existing Repository](docs/upgrade-existing-repo.md)
559
580
  - [Try Code Mower In 10 Minutes](docs/try-in-10-minutes.md)
560
581
  - [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md)
561
582
  - [Quickstart Reference](docs/quickstart.md)
583
+ - [Participants And Sessions](docs/sessions.md)
562
584
  - [Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md)
563
585
  - [Planning And Work Orders](docs/planning-work-orders.md)
564
586
  - [Builder Providers: Grok And Cursor](docs/builders-grok-cursor.md)
@@ -574,11 +596,31 @@ first so local work exercises the same package entrypoint users install.
574
596
  - [GitHub Setup](docs/github-setup.md)
575
597
  - [Jira Cloud Setup](docs/jira-cloud-setup.md)
576
598
  - [Jira Adoption Rehearsal](docs/jira-adoption-rehearsal.md)
599
+ - [Work Tracker Data Contract](docs/tracker-data-contract.md)
600
+ - [Release Qualification](docs/release-qualification.md)
601
+ - [Launch Command Surface](docs/launch-command-surface.md)
602
+ - [Troubleshooting](docs/troubleshooting.md)
603
+
604
+ ### Trust, Architecture, And Evidence
605
+
606
+ - [Architecture](docs/architecture.md)
607
+ - [Lane Promotion Policy](docs/lane-promotion-policy.md)
608
+ - [Cloud Sharing](docs/cloud-sharing.md)
609
+ - [Cloud Data Contract](docs/cloud-data-contract.md)
610
+ - [Board Data Contract](docs/board-data-contract.md)
611
+ - [Privacy And Threat Model](docs/privacy-threat-model.md)
612
+ - [Current State And Roadmap](docs/current-state-and-roadmap.md)
613
+ - [Public Release Checklist](docs/public-release-checklist.md)
614
+ - [PyPI Release Runbook](docs/pypi-release.md)
615
+ - [Sample Doctor Output](docs/sample-doctor-output.md)
577
616
  - [First Run Transcript](docs/first-run-transcript.md)
578
617
  - [First-User Demo Transcript](docs/first-user-demo-transcript.md)
579
618
  - [First-User Install Rehearsal](docs/first-user-install-rehearsal.md)
580
- - [Release Qualification](docs/release-qualification.md)
581
- - [Launch Command Surface](docs/launch-command-surface.md)
619
+ - [Demo Calibration Example](examples/demo-calibration/README.md)
620
+ - [Board Demo Rehearsal](examples/board-demo/README.md)
621
+
622
+ ### History And Release Records
623
+
582
624
  - [v0.6 Truth Baseline](docs/v06-truth-baseline.md)
583
625
  - [v0.6 Release Notes](docs/v06-release-notes.md)
584
626
  - [v0.8 Release Notes](docs/v08-release-notes.md)
@@ -599,22 +641,15 @@ first so local work exercises the same package entrypoint users install.
599
641
  - [v1.0.13 Release Notes](docs/v1013-release-notes.md)
600
642
  - [v1.0.14 Release Notes](docs/v1014-release-notes.md)
601
643
  - [v1.0.15 Release Notes](docs/v1015-release-notes.md)
602
- - [v1.1.1 Release Notes](docs/v111-release-notes.md)
603
644
  - [v1.1 Release Notes](docs/v11-release-notes.md)
645
+ - [v1.1.1 Release Notes](docs/v111-release-notes.md)
646
+ - [v1.1.2 Release Notes](docs/v112-release-notes.md)
647
+ - [v1.2 Release Notes](docs/v12-release-notes.md)
604
648
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
605
649
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
606
- - [Demo Calibration Example](examples/demo-calibration/README.md)
607
- - [Board Demo Rehearsal](examples/board-demo/README.md)
608
- - [PyPI Release Runbook](docs/pypi-release.md)
609
- - [Sample Doctor Output](docs/sample-doctor-output.md)
610
- - [Architecture](docs/architecture.md)
611
- - [Lane Promotion Policy](docs/lane-promotion-policy.md)
612
- - [Cloud Sharing](docs/cloud-sharing.md)
613
- - [Cloud Data Contract](docs/cloud-data-contract.md)
614
- - [Board Data Contract](docs/board-data-contract.md)
615
- - [Privacy And Threat Model](docs/privacy-threat-model.md)
616
- - [Current State And Roadmap](docs/current-state-and-roadmap.md)
617
- - [Public Release Checklist](docs/public-release-checklist.md)
650
+
651
+ ### Project
652
+
618
653
  - [Changelog](CHANGELOG.md)
619
654
  - [Contributing](CONTRIBUTING.md)
620
655
  - [Support](SUPPORT.md)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-mower"
7
- version = "1.1.1"
7
+ version = "1.2.0"
8
8
  description = "Multi-reviewer AI code audit orchestration"
9
9
  requires-python = ">=3.12"
10
10
  readme = "README.md"
@@ -1,3 +1,3 @@
1
1
  """Code Mower package."""
2
2
 
3
- __version__ = "1.1.1"
3
+ __version__ = "1.2.0"
@@ -34,6 +34,7 @@ from . import controller
34
34
  from . import lane_status
35
35
  from . import productivity_report
36
36
  from . import reviewer_spend
37
+ from . import session_lease
37
38
 
38
39
 
39
40
  DEFAULT_HOST = "127.0.0.1"
@@ -235,6 +236,7 @@ def status_payload(
235
236
  "interval_seconds": config.record_interval_seconds,
236
237
  },
237
238
  }
239
+ payload["orchestrator_lease"] = session_lease.observe_lease(start=config.repo_path)
238
240
  payload["agent_adapters"] = agent_adapters_payload(config)
239
241
  payload["release_campaigns"] = release_campaigns_payload(config)
240
242
  payload["owner_queue"] = owner_queue_payload(payload)
@@ -275,6 +277,7 @@ def _recording_metadata(config: BoardConfig, status: str, **extra: Any) -> dict[
275
277
  def _recordable_payload(payload: dict[str, Any]) -> dict[str, Any]:
276
278
  snapshot = dict(payload)
277
279
  snapshot.pop("productivity", None)
280
+ snapshot.pop("orchestrator_lease", None)
278
281
  return snapshot
279
282
 
280
283
 
@@ -544,6 +547,7 @@ def _pending_status_payload(config: BoardConfig) -> dict[str, Any]:
544
547
  "local_paths": "shown" if config.show_local_paths else "redacted",
545
548
  "recording": {"enabled": config.record_events, "interval_seconds": config.record_interval_seconds},
546
549
  }
550
+ payload["orchestrator_lease"] = session_lease.observe_lease(start=config.repo_path)
547
551
  payload["agent_adapters"] = agent_adapters_payload(config)
548
552
  payload["owner_queue"] = owner_queue_payload(payload)
549
553
  payload["supervised_pilot"] = _supervised_disabled(
@@ -1302,6 +1306,7 @@ def render_board_html(config: BoardConfig) -> str:
1302
1306
  <section><h2>Supervised Pilot</h2><div class="rows" id="supervised"></div></section>
1303
1307
  <section><h2>Productivity</h2><div class="rows" id="productivity"></div></section>
1304
1308
  <section><h2>Owner Queue</h2><div class="rows" id="owner"></div></section>
1309
+ <section><h2>Local Orchestrator Lease</h2><div class="rows" id="lease"></div></section>
1305
1310
  <section><h2>Agent Cards</h2><div class="rows" id="agents"></div></section>
1306
1311
  <section><h2>Release Campaigns</h2><div class="rows" id="campaigns"></div></section>
1307
1312
  <section><h2>Open PRs</h2><div class="rows" id="prs"></div></section>
@@ -1368,7 +1373,13 @@ def render_board_html(config: BoardConfig) -> str:
1368
1373
  function checks(list) {{
1369
1374
  return (list || []).map(c => `<span class="${{stateClass(c.state)}}">${{esc(c.name)}}=${{esc(c.state)}}</span>`).join(", ") || '<span class="muted">none</span>';
1370
1375
  }}
1376
+ function renderLease(lease) {{
1377
+ const messages = {{absent: "No orchestrator lease in this working copy.", expired: "Lease expired.", malformed: "Local lease is malformed.", unavailable: "Local lease is unavailable."}};
1378
+ const state = lease?.state || "unavailable";
1379
+ return `<div class="row"><div class="line">${{pill(state)}}<b>Provider: ${{esc(lease?.provider || "none")}}</b></div><div>Expires: ${{lease?.expires_at ? localTime(lease.expires_at) : "n/a"}}</div><div class="muted">${{esc(messages[state] || "Local orchestration lease is active.")}}</div></div>`;
1380
+ }}
1371
1381
  function render(data) {{
1382
+ put("lease", renderLease(data.orchestrator_lease));
1372
1383
  document.getElementById("repo").textContent = REPO;
1373
1384
  const version = data.board?.version || {{}};
1374
1385
  const servingVersion = version.serving_version || "unknown";
@@ -4,12 +4,14 @@ from __future__ import annotations
4
4
 
5
5
  import datetime as dt
6
6
  import json
7
+ import re
7
8
  import subprocess
8
9
  import uuid
9
10
  from pathlib import Path
10
11
  from typing import Any, Mapping
11
12
 
12
13
  from code_mower import __version__
14
+ from code_mower.participants import PARTICIPANTS
13
15
  from code_mower.provider_registry import REFERENCE_PROVIDERS
14
16
  from code_mower.providers import (
15
17
  build_code_mower_tool_provenance,
@@ -46,6 +48,13 @@ from .work_types import validate_work_type_metadata
46
48
 
47
49
 
48
50
  EVENT_SCHEMA = "code_mower.benchmarkEvent.v1"
51
+ CONTROLLER_EVENT_TYPES = frozenset({
52
+ "controller_decision", "merge_decision", "queue_state_snapshot", "owner_intervention",
53
+ })
54
+ ORCHESTRATOR_PROVIDERS = frozenset(
55
+ name for name, participant in PARTICIPANTS.items() if participant.orchestrator
56
+ )
57
+ CUSTOM_ORCHESTRATOR_RE = re.compile(r"custom:[a-z][a-z0-9-]{0,63}")
49
58
  AUTHORING_RUN_SCHEMA = "code_mower.authoringRun.v1"
50
59
  CLOUD_EVENT_STRING_FIELDS = (
51
60
  "schema",
@@ -358,6 +367,21 @@ def build_provider_catalog_snapshot_events(
358
367
  return events
359
368
 
360
369
 
370
+ def validate_orchestrator_provider(value: Any) -> str:
371
+ """Validate categorical host identity without echoing untrusted input."""
372
+ if not isinstance(value, str) or (
373
+ value not in ORCHESTRATOR_PROVIDERS
374
+ and CUSTOM_ORCHESTRATOR_RE.fullmatch(value) is None
375
+ ):
376
+ raise CloudBundleError(
377
+ "orchestrator_provider must be a known orchestrator provider "
378
+ f"({', '.join(sorted(ORCHESTRATOR_PROVIDERS))}) or custom:<slug>; "
379
+ "slug must be 1-64 lowercase letters, digits, or hyphens, starting with a letter"
380
+ )
381
+ validate_metadata_payload({"orchestrator_provider": value})
382
+ return value
383
+
384
+
361
385
  def validate_cloud_event(value: Any) -> dict[str, Any]:
362
386
  """Validate Code Mower's metadata-only cloud event boundary.
363
387
 
@@ -380,6 +404,11 @@ def validate_cloud_event(value: Any) -> dict[str, Any]:
380
404
  for key in ("metrics", "dimensions", "tool"):
381
405
  if not isinstance(value.get(key), dict):
382
406
  raise CloudBundleError(f"structured event field {key} must be an object")
407
+ if (
408
+ value["event_type"] in CONTROLLER_EVENT_TYPES
409
+ and "orchestrator_provider" in value["dimensions"]
410
+ ):
411
+ validate_orchestrator_provider(value["dimensions"]["orchestrator_provider"])
383
412
  if value["event_type"] == PRODUCTIVITY_EVENT_TYPE:
384
413
  validate_productivity_summary_payload(value)
385
414
  if value["event_type"] == PR_OUTCOME_EVENT_TYPE:
@@ -17,7 +17,9 @@ from . import __version__
17
17
  from . import config as code_mower_config
18
18
  from . import lane_status, tracker_queue
19
19
  from .cloud_client.errors import CloudBundleError
20
- from .cloud_client.events import EVENT_SCHEMA, normalize_event, utc_now, validate_cloud_event
20
+ from .cloud_client.events import (
21
+ EVENT_SCHEMA, normalize_event, utc_now, validate_cloud_event, validate_orchestrator_provider,
22
+ )
21
23
  from .providers import build_code_mower_tool_provenance
22
24
 
23
25
 
@@ -52,6 +54,11 @@ class ControllerOptions:
52
54
  auto_merge_enabled: bool = False
53
55
  merge_token_ready: bool = False
54
56
  issue_limit: int = 50
57
+ orchestrator_provider: str | None = None
58
+
59
+ def __post_init__(self) -> None:
60
+ if self.orchestrator_provider is not None:
61
+ validate_orchestrator_provider(self.orchestrator_provider)
55
62
 
56
63
 
57
64
  def _text(value: Any) -> str:
@@ -618,6 +625,8 @@ def evaluate_controller_report(
618
625
  "ready_issue_errors": list(issue_payload.get("errors") or []),
619
626
  },
620
627
  }
628
+ if options.orchestrator_provider is not None:
629
+ report["orchestrator_provider"] = options.orchestrator_provider
621
630
  if tracker_queue.jira_enabled(config) and "tracker" in issue_payload:
622
631
  report["tracker"] = issue_payload["tracker"]
623
632
  return report
@@ -682,6 +691,10 @@ def build_controller_event(
682
691
  "merge_method": _text(decision.get("merge_method")),
683
692
  "would_mutate": bool(decision.get("would_mutate")),
684
693
  }
694
+ if "orchestrator_provider" in report:
695
+ dimensions["orchestrator_provider"] = validate_orchestrator_provider(
696
+ report["orchestrator_provider"]
697
+ )
685
698
  dimensions = {
686
699
  key: value
687
700
  for key, value in dimensions.items()
@@ -788,10 +801,14 @@ def render_text(report: Mapping[str, Any]) -> str:
788
801
  f"Code Mower controller for {report.get('repo')}",
789
802
  f"Generated: {report.get('generated_at')}",
790
803
  f"Mode: {report.get('mode')}",
804
+ ]
805
+ if "orchestrator_provider" in report:
806
+ lines.append(f"Orchestrator: {report['orchestrator_provider']}")
807
+ lines.extend([
791
808
  "",
792
809
  f"Decision: {decision.get('decision_state')}",
793
810
  f"Next: {decision.get('next_action')}",
794
- ]
811
+ ])
795
812
  if decision.get("next_detail"):
796
813
  lines.append(f"Detail: {decision.get('next_detail')}")
797
814
  if decision.get("pr_number"):
@@ -852,6 +869,10 @@ def main(
852
869
  run.add_argument("--auto-merge-enabled", action="store_true")
853
870
  run.add_argument("--merge-token-ready", action="store_true")
854
871
  run.add_argument("--issue-limit", type=int, default=50)
872
+ run.add_argument(
873
+ "--orchestrator", metavar="PROVIDER",
874
+ help="orchestrator provider (e.g. codex, claude, or custom:<slug>); overrides CODE_MOWER_HOST",
875
+ )
855
876
  run.add_argument("--event-file", type=Path, default=None)
856
877
  run.add_argument("--team-id", default="")
857
878
  run.add_argument("--install-id", default="")
@@ -864,6 +885,7 @@ def main(
864
885
  args = parser.parse_args(list(argv or ()))
865
886
  if args.command != "run": # pragma: no cover - argparse validates commands.
866
887
  raise AssertionError(f"unhandled controller command: {args.command}")
888
+ environ = os.environ if env is None else env
867
889
  try:
868
890
  options = ControllerOptions(
869
891
  repo=args.repo,
@@ -872,6 +894,10 @@ def main(
872
894
  auto_merge_enabled=args.auto_merge_enabled,
873
895
  merge_token_ready=args.merge_token_ready,
874
896
  issue_limit=args.issue_limit,
897
+ orchestrator_provider=(
898
+ args.orchestrator if args.orchestrator is not None
899
+ else environ.get("CODE_MOWER_HOST")
900
+ ),
875
901
  )
876
902
  config = code_mower_config.load_config(args.config)
877
903
  jira_reader = tracker_queue.resolve_jira_queue_reader(
@@ -885,7 +911,7 @@ def main(
885
911
  config_dir=(
886
912
  Path(args.provider_config_dir) if args.provider_config_dir else None
887
913
  ),
888
- env=os.environ if env is None else env,
914
+ env=environ,
889
915
  timeout_seconds=args.http_timeout,
890
916
  client_factory=jira_client_factory,
891
917
  )