code-mower 1.2.0__tar.gz → 1.2.2__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 (434) hide show
  1. {code_mower-1.2.0 → code_mower-1.2.2}/PKG-INFO +9 -7
  2. {code_mower-1.2.0 → code_mower-1.2.2}/README.md +8 -6
  3. {code_mower-1.2.0 → code_mower-1.2.2}/pyproject.toml +1 -1
  4. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/__init__.py +1 -1
  5. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/campaign_adapters.py +13 -0
  6. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/init.py +2 -0
  7. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/jira_cloud.py +2 -1
  8. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/jira_mutations.py +9 -1
  9. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/jira_pr_sync.py +12 -3
  10. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_status.py +35 -2
  11. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/session.py +4 -0
  12. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/code-mower.example.yml +3 -0
  13. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
  14. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/tracker_contract.py +1 -1
  15. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/tracker_queue.py +1 -1
  16. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower.egg-info/PKG-INFO +9 -7
  17. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/builder-provenance.yml.j2 +1 -1
  18. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_campaign_adapters.py +97 -0
  19. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_jira_adoption.py +2 -1
  20. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_jira_cloud.py +7 -3
  21. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_jira_pr_sync.py +49 -1
  22. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_lane_status.py +89 -0
  23. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_participant_sessions.py +2 -0
  24. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_release_hygiene.py +55 -47
  25. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_tracker_contract.py +6 -0
  26. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_tracker_queue.py +2 -2
  27. {code_mower-1.2.0 → code_mower-1.2.2}/CODE_OF_CONDUCT.md +0 -0
  28. {code_mower-1.2.0 → code_mower-1.2.2}/LICENSE +0 -0
  29. {code_mower-1.2.0 → code_mower-1.2.2}/MANIFEST.in +0 -0
  30. {code_mower-1.2.0 → code_mower-1.2.2}/NOTICE +0 -0
  31. {code_mower-1.2.0 → code_mower-1.2.2}/SUPPORT.md +0 -0
  32. {code_mower-1.2.0 → code_mower-1.2.2}/requirements/requirements.txt +0 -0
  33. {code_mower-1.2.0 → code_mower-1.2.2}/setup.cfg +0 -0
  34. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/adapters/__init__.py +0 -0
  35. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/adapters/_base.py +0 -0
  36. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  37. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/adapters/gitar.py +0 -0
  38. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/adapters/greptile.py +0 -0
  39. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/adapters/qodo.py +0 -0
  40. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  41. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/antigravity_sdk_probe.py +0 -0
  42. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/audit_handoff_log.py +0 -0
  43. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/audit_labeler_lib.py +0 -0
  44. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/audit_limits.py +0 -0
  45. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/audit_progress.py +0 -0
  46. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/blind_review_artifacts.py +0 -0
  47. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/blind_review_coordinator.py +0 -0
  48. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/board.py +0 -0
  49. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/board_store.py +0 -0
  50. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/bootstrap.py +0 -0
  51. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/builder_experiment.py +0 -0
  52. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/builder_runs.py +0 -0
  53. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/__init__.py +0 -0
  54. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/arms.py +0 -0
  55. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/auto_discovery.py +0 -0
  56. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/commands.py +0 -0
  57. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/context_inputs.py +0 -0
  58. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/corpus.py +0 -0
  59. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/effect_report.py +0 -0
  60. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/evidence.py +0 -0
  61. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/evidence_report.py +0 -0
  62. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/identity.py +0 -0
  63. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/metrics.py +0 -0
  64. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/overlap.py +0 -0
  65. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/planning.py +0 -0
  66. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/policy.py +0 -0
  67. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/results.py +0 -0
  68. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/run_results.py +0 -0
  69. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/run_status.py +0 -0
  70. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/runner.py +0 -0
  71. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/truth.py +0 -0
  72. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/value_report.py +0 -0
  73. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/campaign_discovery.py +0 -0
  74. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/checks.py +0 -0
  75. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/claude_audit_pr.py +0 -0
  76. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/claude_cli_bounce.py +0 -0
  77. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/claude_cli_environment.py +0 -0
  78. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/clear_stale.py +0 -0
  79. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cli.py +0 -0
  80. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud.py +0 -0
  81. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/__init__.py +0 -0
  82. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/adoption_runs.py +0 -0
  83. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/bundle.py +0 -0
  84. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/doctor.py +0 -0
  85. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/dogfood.py +0 -0
  86. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/endpoints.py +0 -0
  87. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/errors.py +0 -0
  88. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/events.py +0 -0
  89. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/export.py +0 -0
  90. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/finding_outcomes.py +0 -0
  91. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/git_metadata.py +0 -0
  92. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/manifest.py +0 -0
  93. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/operations.py +0 -0
  94. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/pr_outcomes.py +0 -0
  95. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/productivity.py +0 -0
  96. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/productivity_windows.py +0 -0
  97. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/reports.py +0 -0
  98. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/setup.py +0 -0
  99. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/tokens.py +0 -0
  100. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/upload.py +0 -0
  101. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/work_types.py +0 -0
  102. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/code_mower_calibration.py +0 -0
  103. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/code_mower_context_packs.py +0 -0
  104. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/code_mower_merge.py +0 -0
  105. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/code_mower_telemetry.py +0 -0
  106. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  107. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/codex_audit_env_preflight.py +0 -0
  108. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/codex_audit_pr.py +0 -0
  109. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  110. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  111. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/config.py +0 -0
  112. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/controller.py +0 -0
  113. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/decisions.py +0 -0
  114. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/devin_api.py +0 -0
  115. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/devin_cli_audit_pr.py +0 -0
  116. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor.py +0 -0
  117. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/__init__.py +0 -0
  118. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/adoption.py +0 -0
  119. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/audit_limits.py +0 -0
  120. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/campaign_auth.py +0 -0
  121. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/cloud.py +0 -0
  122. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/common.py +0 -0
  123. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github.py +0 -0
  124. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions.py +0 -0
  125. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  126. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  127. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  128. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  129. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  130. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  131. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  132. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  133. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_api.py +0 -0
  134. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_branch.py +0 -0
  135. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_config.py +0 -0
  136. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_human_token.py +0 -0
  137. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_provider.py +0 -0
  138. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_repo.py +0 -0
  139. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
  140. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/groups.py +0 -0
  141. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/jira.py +0 -0
  142. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/models.py +0 -0
  143. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/output.py +0 -0
  144. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/presets.py +0 -0
  145. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/privacy.py +0 -0
  146. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  147. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  148. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  149. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_env.py +0 -0
  150. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  151. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  152. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
  153. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  154. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  155. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  156. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  157. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  158. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  159. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  160. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  161. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  162. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/providers.py +0 -0
  163. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/registry.py +0 -0
  164. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/runner.py +0 -0
  165. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/runtime.py +0 -0
  166. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  167. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
  168. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/supervised_pilot.py +0 -0
  169. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/file_locks.py +0 -0
  170. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/gate_health.py +0 -0
  171. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  172. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/git_identity.py +0 -0
  173. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/grok_build_audit_pr.py +0 -0
  174. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  175. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/__init__.py +0 -0
  176. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/aider.py +0 -0
  177. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  178. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/claude.py +0 -0
  179. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/codex.py +0 -0
  180. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/devin.py +0 -0
  181. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/devin_cli.py +0 -0
  182. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  183. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/grok_build.py +0 -0
  184. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  185. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/local_llm.py +0 -0
  186. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/muse_cli.py +0 -0
  187. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_delivery.py +0 -0
  188. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/local_llm_audit_pr.py +0 -0
  189. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/local_llm_bakeoff.py +0 -0
  190. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/local_llm_calibration.py +0 -0
  191. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/local_llm_profiles.py +0 -0
  192. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/migration.py +0 -0
  193. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/migration_install.py +0 -0
  194. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/migration_mirror.py +0 -0
  195. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/migration_readiness.py +0 -0
  196. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/migration_rehearsal.py +0 -0
  197. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/muse_cli_audit_pr.py +0 -0
  198. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/next_steps.py +0 -0
  199. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/package.py +0 -0
  200. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/package_content.py +0 -0
  201. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/package_manifest.py +0 -0
  202. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/package_paths.py +0 -0
  203. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/package_rendering.py +0 -0
  204. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/package_static.py +0 -0
  205. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/participants.py +0 -0
  206. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/plan_context.py +0 -0
  207. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/productivity_report.py +0 -0
  208. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/prompts.py +0 -0
  209. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_credentials.py +0 -0
  210. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_registry.py +0 -0
  211. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/__init__.py +0 -0
  212. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/comments.py +0 -0
  213. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/exit_codes.py +0 -0
  214. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/git.py +0 -0
  215. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/github_auth.py +0 -0
  216. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/github_pr.py +0 -0
  217. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  218. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/process.py +0 -0
  219. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/repo_paths.py +0 -0
  220. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/text_schema.py +0 -0
  221. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  222. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/workspace.py +0 -0
  223. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/providers/__init__.py +0 -0
  224. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/providers/local_cli.py +0 -0
  225. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/providers/provenance.py +0 -0
  226. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/release_campaigns.py +0 -0
  227. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/release_qualify.py +0 -0
  228. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/release_readiness.py +0 -0
  229. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/reviewer_metrics.py +0 -0
  230. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/reviewer_spend.py +0 -0
  231. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/saas_reviewer_labeler.py +0 -0
  232. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/secrets.py +0 -0
  233. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/session_lease.py +0 -0
  234. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/builder-experiment.example.json +0 -0
  235. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  236. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/calibration-corpus.json +0 -0
  237. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/context-packs.example.json +0 -0
  238. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  239. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  240. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  241. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  242. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  243. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  244. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  245. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
  246. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  247. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lanes/README.md +0 -0
  248. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lanes/claude.md +0 -0
  249. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lanes/codex.md +0 -0
  250. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lanes/cursor.md +0 -0
  251. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lanes/devin.md +0 -0
  252. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lanes/generic.md +0 -0
  253. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
  254. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/code_mower +0 -0
  255. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  256. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  257. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  258. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  259. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/run_devin_cli_audit_pr.sh +0 -0
  260. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  261. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/status_report.py +0 -0
  262. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/providers.yml +0 -0
  263. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  264. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  265. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  266. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  267. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  268. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  269. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
  270. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  271. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  272. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  273. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  274. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
  275. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  276. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  277. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  278. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  279. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  280. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
  281. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/trailer_comment_labeler.py +0 -0
  282. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/versioning.py +0 -0
  283. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/work_orders.py +0 -0
  284. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/workflow_actionlint.py +0 -0
  285. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower.egg-info/SOURCES.txt +0 -0
  286. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower.egg-info/dependency_links.txt +0 -0
  287. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower.egg-info/entry_points.txt +0 -0
  288. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower.egg-info/requires.txt +0 -0
  289. {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower.egg-info/top_level.txt +0 -0
  290. {code_mower-1.2.0 → code_mower-1.2.2}/templates/builder-experiment.example.json +0 -0
  291. {code_mower-1.2.0 → code_mower-1.2.2}/templates/calibration-corpus.example.json +0 -0
  292. {code_mower-1.2.0 → code_mower-1.2.2}/templates/calibration-corpus.json +0 -0
  293. {code_mower-1.2.0 → code_mower-1.2.2}/templates/code-mower.yml.j2 +0 -0
  294. {code_mower-1.2.0 → code_mower-1.2.2}/templates/context-packs.example.json +0 -0
  295. {code_mower-1.2.0 → code_mower-1.2.2}/templates/cursor/BUGBOT.md +0 -0
  296. {code_mower-1.2.0 → code_mower-1.2.2}/templates/lanes/README.md +0 -0
  297. {code_mower-1.2.0 → code_mower-1.2.2}/templates/lanes/claude.md +0 -0
  298. {code_mower-1.2.0 → code_mower-1.2.2}/templates/lanes/codex.md +0 -0
  299. {code_mower-1.2.0 → code_mower-1.2.2}/templates/lanes/cursor.md +0 -0
  300. {code_mower-1.2.0 → code_mower-1.2.2}/templates/lanes/devin.md +0 -0
  301. {code_mower-1.2.0 → code_mower-1.2.2}/templates/lanes/generic.md +0 -0
  302. {code_mower-1.2.0 → code_mower-1.2.2}/templates/lanes/run_mac_lane.sh +0 -0
  303. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/acp_bridge.yml +0 -0
  304. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/aider.yml +0 -0
  305. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/antigravity_cli.yml +0 -0
  306. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/claude_audit.yml +0 -0
  307. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/claude_review.yml +0 -0
  308. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/coderabbit_cli.yml +0 -0
  309. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/codex.yml +0 -0
  310. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/cursor_bugbot.yml +0 -0
  311. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/cursor_cloud_agent.yml +0 -0
  312. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/devin.yml +0 -0
  313. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/devin_cli.yml +0 -0
  314. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/gemini_cli.yml +0 -0
  315. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/gitar.yml +0 -0
  316. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/greptile.yml +0 -0
  317. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/hermes_cli.yml +0 -0
  318. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/local_llm.yml +0 -0
  319. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/muse_cli.yml +0 -0
  320. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/qodo.yml +0 -0
  321. {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers.yml +0 -0
  322. {code_mower-1.2.0 → code_mower-1.2.2}/templates/reviewer-spend.example.json +0 -0
  323. {code_mower-1.2.0 → code_mower-1.2.2}/templates/reviewer-value-report.example.md +0 -0
  324. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  325. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  326. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  327. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  328. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  329. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/code-mower-gate.yml.j2 +0 -0
  330. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  331. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  332. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  333. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  334. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  335. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  336. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  337. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  338. {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  339. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_adoption_diagnostics.py +0 -0
  340. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_adoption_result_semantics.py +0 -0
  341. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_adoption_run_contract.py +0 -0
  342. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_antigravity_cli_audit_pr.py +0 -0
  343. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_antigravity_sdk_probe.py +0 -0
  344. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_audit_comment_posture.py +0 -0
  345. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_audit_limits.py +0 -0
  346. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_board.py +0 -0
  347. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_board_lease.py +0 -0
  348. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_builder_experiment.py +0 -0
  349. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_builder_identity.py +0 -0
  350. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_builder_runs.py +0 -0
  351. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_calibration_effect_report.py +0 -0
  352. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_calibration_truth.py +0 -0
  353. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_campaign_discovery.py +0 -0
  354. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_campaign_gh_auth_and_issue_binding_817.py +0 -0
  355. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_campaign_retry_evidence_711.py +0 -0
  356. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_checks.py +0 -0
  357. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_claude_audit_pr.py +0 -0
  358. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_claude_cli_bounce.py +0 -0
  359. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_clear_stale.py +0 -0
  360. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_cloud_client.py +0 -0
  361. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_cloud_git_metadata.py +0 -0
  362. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_cloud_manifest.py +0 -0
  363. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_cloud_reports.py +0 -0
  364. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  365. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_codex_audit_env_preflight.py +0 -0
  366. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_codex_audit_pr.py +0 -0
  367. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_controller.py +0 -0
  368. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_decision_audit_integration.py +0 -0
  369. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_decisions.py +0 -0
  370. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_devin_api.py +0 -0
  371. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_devin_builder_lane.py +0 -0
  372. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_devin_cli_audit_pr.py +0 -0
  373. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_devin_provider_contract.py +0 -0
  374. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_actions_cost_summary.py +0 -0
  375. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_actions_failure_selection.py +0 -0
  376. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_boundaries.py +0 -0
  377. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_campaign_auth.py +0 -0
  378. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_campaign_readiness.py +0 -0
  379. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_github_checks.py +0 -0
  380. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_output.py +0 -0
  381. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_privacy.py +0 -0
  382. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_provider_env_required.py +0 -0
  383. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_provider_env_tokens.py +0 -0
  384. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_provider_local_audit_setup.py +0 -0
  385. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_provider_probe.py +0 -0
  386. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_provider_review_hygiene.py +0 -0
  387. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_registry.py +0 -0
  388. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_runtime.py +0 -0
  389. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_self_hosted_runner.py +0 -0
  390. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_supervised_pilot.py +0 -0
  391. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_file_locks.py +0 -0
  392. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_fork_pr_guard.py +0 -0
  393. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_gate_automerge.py +0 -0
  394. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_gate_health.py +0 -0
  395. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_hosted_dispatch_profile.py +0 -0
  396. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_init_actionlint.py +0 -0
  397. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_init_build_loop.py +0 -0
  398. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_jira_mutations.py +0 -0
  399. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_lane_delivery_contract.py +0 -0
  400. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_local_llm_github_helpers.py +0 -0
  401. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_migration_rehearsal.py +0 -0
  402. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_migration_setup_drift.py +0 -0
  403. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_next_steps.py +0 -0
  404. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_package_install_failure_taxonomy.py +0 -0
  405. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_plan_context.py +0 -0
  406. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_pr_outcome_contract.py +0 -0
  407. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_pr_outcome_coverage.py +0 -0
  408. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_productivity_metrics_contract.py +0 -0
  409. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_productivity_report.py +0 -0
  410. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_productivity_windows.py +0 -0
  411. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_prompts.py +0 -0
  412. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_credentials.py +0 -0
  413. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_fixture_contracts.py +0 -0
  414. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_local_cli.py +0 -0
  415. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_comments.py +0 -0
  416. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_git.py +0 -0
  417. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_github_pr.py +0 -0
  418. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_pr_worktree.py +0 -0
  419. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_process.py +0 -0
  420. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_repo_paths.py +0 -0
  421. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_text_schema.py +0 -0
  422. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_workspace.py +0 -0
  423. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_release_campaigns.py +0 -0
  424. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_release_qualify.py +0 -0
  425. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_remote_qualification_failure_reason_819.py +0 -0
  426. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_reviewer_finding_outcome_contract.py +0 -0
  427. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_reviewer_metrics_core.py +0 -0
  428. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_reviewer_spend.py +0 -0
  429. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_session_lease.py +0 -0
  430. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_supervised_pilot_contract.py +0 -0
  431. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_tracker_config.py +0 -0
  432. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_trailer_comment_labeler.py +0 -0
  433. {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_work_orders.py +0 -0
  434. {code_mower-1.2.0 → code_mower-1.2.2}/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.2.0
3
+ Version: 1.2.2
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
@@ -56,8 +56,8 @@ Default cloud bundles exclude source code, raw diffs, raw model transcripts,
56
56
  raw stdout/stderr, auth output, and secrets.
57
57
 
58
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
59
+ published `code-mower==1.2.2` package, use the documentation from the matching
60
+ [`v1.2.2` tag](https://github.com/codemower-ai/code-mower/tree/v1.2.2) so the
61
61
  commands and package stay aligned as development continues.
62
62
 
63
63
  ## Design Principles
@@ -252,7 +252,7 @@ agent report its actual host posture, exact installed version, doctor result,
252
252
  Board URL, and any owner-only click-list before it mutates the repo.
253
253
 
254
254
  The current package-index announcement entry point is the tagged
255
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.0/docs/try-in-10-minutes.md)
255
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.2/docs/try-in-10-minutes.md)
256
256
  guide. The v1.0 supervised-pilot release includes the native Board, the
257
257
  controller dry-run and policy contract, adoption and upgrade hardening from
258
258
  recent install rehearsals, package-index release checks, provider-diversity
@@ -367,7 +367,7 @@ Provider-contract baseline for the next release train:
367
367
 
368
368
  For release verification,
369
369
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
370
- the package-index procedure for `v1.2.0` / `code-mower==1.2.0`. The
370
+ the package-index procedure for `v1.2.2` / `code-mower==1.2.2`. The
371
371
  GitHub release records the workflow and rehearsal evidence for the exact tag.
372
372
  After publication, [Release Qualification](docs/release-qualification.md)
373
373
  coordinates provider-specific install and operational checks without treating
@@ -561,8 +561,8 @@ measurement work.
561
561
 
562
562
  ## Installation Status
563
563
 
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
564
+ The current package-index release baseline is `v1.2.2`, with pinned package
565
+ install spec `code-mower==1.2.2`. Release evidence is recorded on the GitHub
566
566
  release and in the first-user install rehearsal. The public repository is
567
567
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
568
568
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -675,6 +675,8 @@ first so local work exercises the same package entrypoint users install.
675
675
  - [v1.1.1 Release Notes](docs/v111-release-notes.md)
676
676
  - [v1.1.2 Release Notes](docs/v112-release-notes.md)
677
677
  - [v1.2 Release Notes](docs/v12-release-notes.md)
678
+ - [v1.2.1 Release Notes](docs/v121-release-notes.md)
679
+ - [v1.2.2 Release Notes](docs/v122-release-notes.md)
678
680
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
679
681
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
680
682
 
@@ -26,8 +26,8 @@ Default cloud bundles exclude source code, raw diffs, raw model transcripts,
26
26
  raw stdout/stderr, auth output, and secrets.
27
27
 
28
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
29
+ published `code-mower==1.2.2` package, use the documentation from the matching
30
+ [`v1.2.2` tag](https://github.com/codemower-ai/code-mower/tree/v1.2.2) so the
31
31
  commands and package stay aligned as development continues.
32
32
 
33
33
  ## Design Principles
@@ -222,7 +222,7 @@ agent report its actual host posture, exact installed version, doctor result,
222
222
  Board URL, and any owner-only click-list before it mutates the repo.
223
223
 
224
224
  The current package-index announcement entry point is the tagged
225
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.0/docs/try-in-10-minutes.md)
225
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.2/docs/try-in-10-minutes.md)
226
226
  guide. The v1.0 supervised-pilot release includes the native Board, the
227
227
  controller dry-run and policy contract, adoption and upgrade hardening from
228
228
  recent install rehearsals, package-index release checks, provider-diversity
@@ -337,7 +337,7 @@ Provider-contract baseline for the next release train:
337
337
 
338
338
  For release verification,
339
339
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
340
- the package-index procedure for `v1.2.0` / `code-mower==1.2.0`. The
340
+ the package-index procedure for `v1.2.2` / `code-mower==1.2.2`. The
341
341
  GitHub release records the workflow and rehearsal evidence for the exact tag.
342
342
  After publication, [Release Qualification](docs/release-qualification.md)
343
343
  coordinates provider-specific install and operational checks without treating
@@ -531,8 +531,8 @@ measurement work.
531
531
 
532
532
  ## Installation Status
533
533
 
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
534
+ The current package-index release baseline is `v1.2.2`, with pinned package
535
+ install spec `code-mower==1.2.2`. Release evidence is recorded on the GitHub
536
536
  release and in the first-user install rehearsal. The public repository is
537
537
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
538
538
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -645,6 +645,8 @@ first so local work exercises the same package entrypoint users install.
645
645
  - [v1.1.1 Release Notes](docs/v111-release-notes.md)
646
646
  - [v1.1.2 Release Notes](docs/v112-release-notes.md)
647
647
  - [v1.2 Release Notes](docs/v12-release-notes.md)
648
+ - [v1.2.1 Release Notes](docs/v121-release-notes.md)
649
+ - [v1.2.2 Release Notes](docs/v122-release-notes.md)
648
650
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
649
651
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
650
652
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-mower"
7
- version = "1.2.0"
7
+ version = "1.2.2"
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.2.0"
3
+ __version__ = "1.2.2"
@@ -570,6 +570,19 @@ def build_qualification_prompt(
570
570
  )
571
571
  if target_runtime:
572
572
  lines.append(f"- target_runtime: {target_runtime}")
573
+ if provider == "claude":
574
+ lines.extend(
575
+ [
576
+ "",
577
+ "Claude timing arithmetic (mandatory): report every step elapsed_seconds",
578
+ "as a non-negative integer number of seconds. Include an overhead step for",
579
+ "measured setup or serialization time outside the named checks. Set the",
580
+ "top-level elapsed_seconds to the exact arithmetic sum of the numeric step",
581
+ "elapsed_seconds values you emit; never use a separately measured or",
582
+ "estimated total. Before responding, add those emitted values again and",
583
+ "confirm exact equality.",
584
+ ]
585
+ )
573
586
  lines.extend(
574
587
  [
575
588
  "",
@@ -2361,6 +2361,7 @@ EXAMPLE_JIRA_TRACKER_CONFIG: dict[str, Any] = {
2361
2361
  "status_category_map": {
2362
2362
  "new": ["10000"],
2363
2363
  "in_progress": ["10001"],
2364
+ "review": ["10004"],
2364
2365
  "blocked": ["10002"],
2365
2366
  "done": ["10003"],
2366
2367
  },
@@ -2380,6 +2381,7 @@ EXAMPLE_JIRA_TRACKER_CONFIG: dict[str, Any] = {
2380
2381
  ],
2381
2382
  "transitions": {
2382
2383
  "in_progress": "31",
2384
+ "review": "51",
2383
2385
  },
2384
2386
  },
2385
2387
  },
@@ -65,6 +65,7 @@ from .provider_credentials import (
65
65
  resolve_provider_credentials,
66
66
  validate_jira_email,
67
67
  )
68
+ from .tracker_contract import LIFECYCLE_CATEGORIES
68
69
 
69
70
  API_GATEWAY = "https://api.atlassian.com"
70
71
  SITE_EXAMPLE = "https://example.atlassian.net"
@@ -1773,7 +1774,7 @@ def map_status_to_lifecycle(
1773
1774
  if wanted not in known:
1774
1775
  return None
1775
1776
  mapping = status_category_map or {}
1776
- for category in ("new", "in_progress", "blocked", "done"):
1777
+ for category in LIFECYCLE_CATEGORIES:
1777
1778
  ids = mapping.get(category) or []
1778
1779
  if wanted in {str(item) for item in ids}:
1779
1780
  return category
@@ -2252,7 +2252,15 @@ def _parser() -> argparse.ArgumentParser:
2252
2252
  sync.add_argument(
2253
2253
  "--milestone",
2254
2254
  required=True,
2255
- choices=("opened", "updated", "blocked", "green", "merged", "closed_unmerged"),
2255
+ choices=(
2256
+ "opened",
2257
+ "ready_for_review",
2258
+ "updated",
2259
+ "blocked",
2260
+ "green",
2261
+ "merged",
2262
+ "closed_unmerged",
2263
+ ),
2256
2264
  help="GitHub/Code Mower lifecycle milestone to synchronize",
2257
2265
  )
2258
2266
  sync.add_argument("--pr-url", required=True, help="GitHub pull request URL")
@@ -58,6 +58,7 @@ SYNC_REPORT_SCHEMA = "code_mower.jiraPrSync.v1"
58
58
  #: replay), never inferred from prose.
59
59
  PR_MILESTONES = (
60
60
  "opened",
61
+ "ready_for_review",
61
62
  "updated",
62
63
  "blocked",
63
64
  "green",
@@ -72,6 +73,10 @@ PR_MILESTONES = (
72
73
  #: often they replay.
73
74
  _MILESTONE_POLICY: Mapping[str, Mapping[str, str]] = {
74
75
  "opened": {"transition_category": "in_progress", "comment_template": "pr_opened"},
76
+ "ready_for_review": {
77
+ "transition_category": "review",
78
+ "comment_template": "pr_opened",
79
+ },
75
80
  "updated": {"transition_category": "", "comment_template": ""},
76
81
  "blocked": {"transition_category": "blocked", "comment_template": "pr_blocked"},
77
82
  "green": {"transition_category": "", "comment_template": ""},
@@ -340,13 +345,17 @@ def build_sync_plan(
340
345
  )
341
346
 
342
347
  settings = jira_mutations.resolve_mutation_settings(config)
343
- stale_categories = {
348
+ required_stale_categories = {
344
349
  "opened": ("blocked", "done"),
350
+ "ready_for_review": ("blocked", "done"),
345
351
  "blocked": ("done",),
346
352
  }.get(milestone, ())
353
+ optional_stale_categories = {
354
+ "opened": ("review",),
355
+ }.get(milestone, ())
347
356
  missing_stale_categories = [
348
357
  category
349
- for category in stale_categories
358
+ for category in required_stale_categories
350
359
  if not settings.status_category_map.get(category)
351
360
  ]
352
361
  if missing_stale_categories:
@@ -387,7 +396,7 @@ def build_sync_plan(
387
396
  stale_status_ids = sorted(
388
397
  {
389
398
  status_id
390
- for category in stale_categories
399
+ for category in (*required_stale_categories, *optional_stale_categories)
391
400
  for status_id in settings.status_category_map.get(category, ())
392
401
  }
393
402
  )
@@ -14,6 +14,7 @@ from collections.abc import Callable, Mapping, Sequence
14
14
  from datetime import UTC, datetime, timedelta
15
15
  from pathlib import Path
16
16
  from typing import Any
17
+ from urllib.parse import urlparse
17
18
 
18
19
  from . import config as code_mower_config
19
20
  from . import tracker_queue
@@ -125,16 +126,48 @@ def _check_value(check: Mapping[str, Any], keys: Sequence[str], default: str) ->
125
126
  return default
126
127
 
127
128
 
129
+ def _check_identity(check: Mapping[str, Any]) -> tuple[str, str, str, str]:
130
+ app = check.get("app")
131
+ app_name = ""
132
+ if isinstance(app, Mapping):
133
+ app_name = _check_value(app, ("slug", "name", "databaseId"), "")
134
+ provider_url = _check_value(check, ("detailsUrl", "targetUrl"), "")
135
+ try:
136
+ provider_host = urlparse(provider_url).hostname or ""
137
+ except ValueError:
138
+ provider_host = ""
139
+ return (
140
+ _text(check.get("__typename")).casefold(),
141
+ _check_value(check, ("name", "context", "workflowName"), "unknown").casefold(),
142
+ _text(check.get("workflowName")).casefold(),
143
+ (app_name or provider_host).casefold(),
144
+ )
145
+
146
+
147
+ def _check_timestamp(check: Mapping[str, Any]) -> str:
148
+ return _check_value(check, ("startedAt", "createdAt", "completedAt"), "")
149
+
150
+
128
151
  def _checks(raw: Any) -> list[dict[str, str]]:
129
152
  if not isinstance(raw, list):
130
153
  return []
154
+ current: dict[tuple[str, str, str, str], tuple[str, int, Mapping[str, Any]]] = {}
155
+ order: list[tuple[str, str, str, str]] = []
156
+ for index, check in enumerate(raw):
157
+ if not isinstance(check, Mapping):
158
+ continue
159
+ identity = _check_identity(check)
160
+ candidate = (_check_timestamp(check), index, check)
161
+ if identity not in current:
162
+ order.append(identity)
163
+ if identity not in current or candidate[:2] >= current[identity][:2]:
164
+ current[identity] = candidate
131
165
  checks = [
132
166
  {
133
167
  "name": _check_value(check, ("name", "context", "workflowName"), "unknown"),
134
168
  "state": _check_value(check, ("conclusion", "state", "status"), "unknown").lower(),
135
169
  }
136
- for check in raw
137
- if isinstance(check, Mapping)
170
+ for _timestamp, _index, check in (current[identity] for identity in order)
138
171
  ]
139
172
  major = [check for check in checks if any(term in check["name"].lower() for term in CHECK_TERMS)]
140
173
  return (major or checks)[:8]
@@ -49,6 +49,10 @@ JIRA_TRACKER_CONTRACT_INSTRUCTIONS = (
49
49
  "Every Jira write must flow through the guarded `code-mower tracker mutate` or "
50
50
  "`code-mower tracker pr-sync` commands; do not write through Rovo MCP tools or "
51
51
  "any other path.",
52
+ "When implementation starts, preview and then apply a claim plus the configured "
53
+ "`in_progress` transition through `code-mower tracker mutate`.",
54
+ "When a non-draft pull request is ready for human review, preview and then apply "
55
+ "the `ready_for_review` milestone through `code-mower tracker pr-sync`.",
52
56
  "Report only the configured Jira project key or ID; never surface issue body "
53
57
  "text, comments, attachments, or credentials in this session brief.",
54
58
  )
@@ -26,6 +26,8 @@ repositories:
26
26
  # - "10000"
27
27
  # in_progress:
28
28
  # - "10001"
29
+ # review:
30
+ # - "10004"
29
31
  # blocked:
30
32
  # - "10002"
31
33
  # done:
@@ -44,6 +46,7 @@ repositories:
44
46
  # - "link"
45
47
  # transitions:
46
48
  # in_progress: "31"
49
+ # review: "51"
47
50
 
48
51
  audit:
49
52
  # Leave blank to use the size-aware default: $2 base, +$1 per 150 KB
@@ -8,7 +8,7 @@ permissions:
8
8
  contents: read
9
9
 
10
10
  env:
11
- CODE_MOWER_PACKAGE_SPEC: code-mower==1.2.0
11
+ CODE_MOWER_PACKAGE_SPEC: code-mower==1.2.2
12
12
 
13
13
  jobs:
14
14
  auto-record:
@@ -18,7 +18,7 @@ TRACKER_WORK_ITEM_SCHEMA = "code_mower.trackerWorkItem.v1"
18
18
 
19
19
  TRACKER_KINDS = ("github", "jira_cloud")
20
20
 
21
- LIFECYCLE_CATEGORIES = ("new", "in_progress", "blocked", "done")
21
+ LIFECYCLE_CATEGORIES = ("new", "in_progress", "review", "blocked", "done")
22
22
 
23
23
  ALLOWED_MUTATION_OPERATIONS = ("assign", "transition", "comment", "link")
24
24
 
@@ -174,7 +174,7 @@ def normalize_jira_work_item(raw: Mapping[str, Any], config: Mapping[str, Any])
174
174
  category = {"new": "new", "indeterminate": "in_progress", "done": "done"}.get(
175
175
  (status.get("statusCategory") or {}).get("key")
176
176
  )
177
- elif status in ("new", "in_progress", "blocked", "done"):
177
+ elif status in ("new", "in_progress", "review", "blocked", "done"):
178
178
  category = status
179
179
  labels = fields.get(mappings.get("labels", "labels")) or []
180
180
  if not isinstance(labels, list):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 1.2.0
3
+ Version: 1.2.2
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
@@ -56,8 +56,8 @@ Default cloud bundles exclude source code, raw diffs, raw model transcripts,
56
56
  raw stdout/stderr, auth output, and secrets.
57
57
 
58
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
59
+ published `code-mower==1.2.2` package, use the documentation from the matching
60
+ [`v1.2.2` tag](https://github.com/codemower-ai/code-mower/tree/v1.2.2) so the
61
61
  commands and package stay aligned as development continues.
62
62
 
63
63
  ## Design Principles
@@ -252,7 +252,7 @@ agent report its actual host posture, exact installed version, doctor result,
252
252
  Board URL, and any owner-only click-list before it mutates the repo.
253
253
 
254
254
  The current package-index announcement entry point is the tagged
255
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.0/docs/try-in-10-minutes.md)
255
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.2/docs/try-in-10-minutes.md)
256
256
  guide. The v1.0 supervised-pilot release includes the native Board, the
257
257
  controller dry-run and policy contract, adoption and upgrade hardening from
258
258
  recent install rehearsals, package-index release checks, provider-diversity
@@ -367,7 +367,7 @@ Provider-contract baseline for the next release train:
367
367
 
368
368
  For release verification,
369
369
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
370
- the package-index procedure for `v1.2.0` / `code-mower==1.2.0`. The
370
+ the package-index procedure for `v1.2.2` / `code-mower==1.2.2`. The
371
371
  GitHub release records the workflow and rehearsal evidence for the exact tag.
372
372
  After publication, [Release Qualification](docs/release-qualification.md)
373
373
  coordinates provider-specific install and operational checks without treating
@@ -561,8 +561,8 @@ measurement work.
561
561
 
562
562
  ## Installation Status
563
563
 
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
564
+ The current package-index release baseline is `v1.2.2`, with pinned package
565
+ install spec `code-mower==1.2.2`. Release evidence is recorded on the GitHub
566
566
  release and in the first-user install rehearsal. The public repository is
567
567
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
568
568
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -675,6 +675,8 @@ first so local work exercises the same package entrypoint users install.
675
675
  - [v1.1.1 Release Notes](docs/v111-release-notes.md)
676
676
  - [v1.1.2 Release Notes](docs/v112-release-notes.md)
677
677
  - [v1.2 Release Notes](docs/v12-release-notes.md)
678
+ - [v1.2.1 Release Notes](docs/v121-release-notes.md)
679
+ - [v1.2.2 Release Notes](docs/v122-release-notes.md)
678
680
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
679
681
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
680
682
 
@@ -8,7 +8,7 @@ permissions:
8
8
  contents: read
9
9
 
10
10
  env:
11
- CODE_MOWER_PACKAGE_SPEC: code-mower==1.2.0
11
+ CODE_MOWER_PACKAGE_SPEC: code-mower==1.2.2
12
12
 
13
13
  jobs:
14
14
  auto-record:
@@ -398,6 +398,35 @@ class ArgvBuilderTests(unittest.TestCase):
398
398
  prompt,
399
399
  )
400
400
 
401
+ def test_claude_prompt_requires_deterministic_timing_arithmetic(self) -> None:
402
+ prompt = campaign_adapters.build_qualification_prompt(
403
+ provider="claude",
404
+ release_tag="v1.0.0",
405
+ package_spec="code-mower==1.0.0",
406
+ package_identity="code-mower",
407
+ normalized_version="1.0.0",
408
+ qualification_context="cold_install",
409
+ starting_version="",
410
+ )
411
+ self.assertIn("non-negative integer number of seconds", prompt)
412
+ self.assertIn("exact arithmetic sum", prompt)
413
+ self.assertIn("never use a separately measured", prompt)
414
+ self.assertIn("Include an overhead step", prompt)
415
+
416
+ def test_non_claude_prompts_omit_claude_timing_rule(self) -> None:
417
+ for provider in ("codex", "antigravity", "muse", "devin_cli"):
418
+ with self.subTest(provider=provider):
419
+ prompt = campaign_adapters.build_qualification_prompt(
420
+ provider=provider,
421
+ release_tag="v1.0.0",
422
+ package_spec="code-mower==1.0.0",
423
+ package_identity="code-mower",
424
+ normalized_version="1.0.0",
425
+ qualification_context="cold_install",
426
+ starting_version="",
427
+ )
428
+ self.assertNotIn("Claude timing arithmetic", prompt)
429
+
401
430
  def test_guidance_schema_enforces_step_id_taxonomy(self) -> None:
402
431
  step_id_schema = campaign_adapters.ADOPTION_RESULT_JSON_SCHEMA[
403
432
  "properties"
@@ -876,6 +905,74 @@ class AdapterTransportTests(unittest.TestCase):
876
905
  self.assertEqual(json.loads(output.read_text(encoding="utf-8")), _adoption_result("claude"))
877
906
  self.assertNotIn("SECRET-NOISE", output.read_text(encoding="utf-8"))
878
907
 
908
+ def test_claude_rejects_inconsistent_timing_without_retry(self) -> None:
909
+ calls = 0
910
+ inconsistent = _adoption_result(
911
+ "claude",
912
+ elapsed_seconds=20,
913
+ steps=[
914
+ {
915
+ "id": "package_install",
916
+ "status": "pass",
917
+ "elapsed_seconds": 8,
918
+ "warning_count": 0,
919
+ "owner_action_count": 0,
920
+ },
921
+ {
922
+ "id": "doctor",
923
+ "status": "pass",
924
+ "elapsed_seconds": 4,
925
+ "warning_count": 0,
926
+ "owner_action_count": 0,
927
+ },
928
+ ],
929
+ )
930
+
931
+ def runner(
932
+ argv: Any, prompt_input: Any, timeout: int, workdir: Path, child_env: Any
933
+ ) -> Any:
934
+ nonlocal calls
935
+ calls += 1
936
+ stdout = json.dumps({"is_error": False, "structured_output": inconsistent})
937
+ return subprocess.CompletedProcess(list(argv), 0, stdout=stdout, stderr="")
938
+
939
+ code, output, _tmp = self._run("claude", runner)
940
+ self.assertNotEqual(code, 0)
941
+ self.assertEqual(calls, 1)
942
+ self.assertFalse(output.exists())
943
+
944
+ def test_claude_accepts_exact_integer_step_sum(self) -> None:
945
+ exact = _adoption_result(
946
+ "claude",
947
+ elapsed_seconds=12,
948
+ steps=[
949
+ {
950
+ "id": "package_install",
951
+ "status": "pass",
952
+ "elapsed_seconds": 8,
953
+ "warning_count": 0,
954
+ "owner_action_count": 0,
955
+ },
956
+ {
957
+ "id": "doctor",
958
+ "status": "pass",
959
+ "elapsed_seconds": 4,
960
+ "warning_count": 0,
961
+ "owner_action_count": 0,
962
+ },
963
+ ],
964
+ )
965
+
966
+ def runner(
967
+ argv: Any, prompt_input: Any, timeout: int, workdir: Path, child_env: Any
968
+ ) -> Any:
969
+ stdout = json.dumps({"is_error": False, "structured_output": exact})
970
+ return subprocess.CompletedProcess(list(argv), 0, stdout=stdout, stderr="")
971
+
972
+ code, output, _tmp = self._run("claude", runner)
973
+ self.assertEqual(code, 0)
974
+ self.assertEqual(json.loads(output.read_text(encoding="utf-8")), exact)
975
+
879
976
  def test_claude_rejects_is_error_true_envelope_even_with_valid_fenced_result(self) -> None:
880
977
  """A valid Claude error envelope must fail closed even if result contains fenced JSON."""
881
978
  valid_payload = _adoption_result("claude")
@@ -727,8 +727,9 @@ class JiraAdoptionRehearsalFlowTests(unittest.TestCase):
727
727
  issues = code_mower_config.validate_config(config_dict)
728
728
  self.assertEqual(issues, [])
729
729
 
730
- # Operator configures transition to match their workflow (transition 21 leads to status 10001)
730
+ # Operator configures transitions to match their workflow.
731
731
  config_dict["tracker"]["jira_cloud"]["mutations"]["transitions"]["in_progress"] = "21"
732
+ config_dict["tracker"]["jira_cloud"]["mutations"]["transitions"]["review"] = "51"
732
733
 
733
734
  # Step 3: Run doctor readiness checks
734
735
  perms_with_writes = {
@@ -847,7 +847,10 @@ class ReadPrimitiveTests(unittest.TestCase):
847
847
  client = make_client(runner)
848
848
  statuses = client.get_statuses()
849
849
  categories = client.get_status_categories()
850
- self.assertEqual([item["id"] for item in statuses], ["10000", "10001", "10002"])
850
+ self.assertEqual(
851
+ [item["id"] for item in statuses],
852
+ ["10000", "10001", "10004", "10002"],
853
+ )
851
854
  self.assertEqual(
852
855
  [item["key"] for item in categories], ["new", "indeterminate", "done"]
853
856
  )
@@ -922,9 +925,10 @@ class ReadPrimitiveTests(unittest.TestCase):
922
925
  client = make_client(runner)
923
926
  transitions = client.get_transitions("20001")
924
927
  self.assertEqual(
925
- [item["id"] for item in transitions], ["11", "21", "31"]
928
+ [item["id"] for item in transitions], ["11", "21", "51", "31"]
926
929
  )
927
930
  self.assertEqual(transitions[1]["to_status_id"], "10001")
931
+ self.assertEqual(transitions[2]["to_status_id"], "10004")
928
932
 
929
933
  def test_effective_permission_probe_returns_booleans(self) -> None:
930
934
  runner = FakeHttp([http_response(load_fixture("permissions.json"))])
@@ -1218,7 +1222,7 @@ class DoctorCheckTests(unittest.TestCase):
1218
1222
  detail = dict(read.detail or {})
1219
1223
  self.assertEqual(detail["reason"], "ready")
1220
1224
  self.assertEqual(detail["project_key"], "ABC")
1221
- self.assertEqual(detail["status_count"], 3)
1225
+ self.assertEqual(detail["status_count"], 4)
1222
1226
  self.assertEqual(detail["permission_probe"]["BROWSE_PROJECTS"], True)
1223
1227
  # Readiness samples the configured project, even when queue JQL is broad.
1224
1228
  bodies = runner.request_bodies()