code-mower 1.2.0__tar.gz → 1.2.1__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.1}/PKG-INFO +8 -7
  2. {code_mower-1.2.0 → code_mower-1.2.1}/README.md +7 -6
  3. {code_mower-1.2.0 → code_mower-1.2.1}/pyproject.toml +1 -1
  4. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/__init__.py +1 -1
  5. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/campaign_adapters.py +13 -0
  6. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
  7. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower.egg-info/PKG-INFO +8 -7
  8. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/builder-provenance.yml.j2 +1 -1
  9. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_campaign_adapters.py +97 -0
  10. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_release_hygiene.py +51 -47
  11. {code_mower-1.2.0 → code_mower-1.2.1}/CODE_OF_CONDUCT.md +0 -0
  12. {code_mower-1.2.0 → code_mower-1.2.1}/LICENSE +0 -0
  13. {code_mower-1.2.0 → code_mower-1.2.1}/MANIFEST.in +0 -0
  14. {code_mower-1.2.0 → code_mower-1.2.1}/NOTICE +0 -0
  15. {code_mower-1.2.0 → code_mower-1.2.1}/SUPPORT.md +0 -0
  16. {code_mower-1.2.0 → code_mower-1.2.1}/requirements/requirements.txt +0 -0
  17. {code_mower-1.2.0 → code_mower-1.2.1}/setup.cfg +0 -0
  18. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/adapters/__init__.py +0 -0
  19. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/adapters/_base.py +0 -0
  20. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  21. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/adapters/gitar.py +0 -0
  22. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/adapters/greptile.py +0 -0
  23. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/adapters/qodo.py +0 -0
  24. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  25. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/antigravity_sdk_probe.py +0 -0
  26. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/audit_handoff_log.py +0 -0
  27. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/audit_labeler_lib.py +0 -0
  28. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/audit_limits.py +0 -0
  29. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/audit_progress.py +0 -0
  30. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/blind_review_artifacts.py +0 -0
  31. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/blind_review_coordinator.py +0 -0
  32. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/board.py +0 -0
  33. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/board_store.py +0 -0
  34. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/bootstrap.py +0 -0
  35. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/builder_experiment.py +0 -0
  36. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/builder_runs.py +0 -0
  37. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/__init__.py +0 -0
  38. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/arms.py +0 -0
  39. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/auto_discovery.py +0 -0
  40. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/commands.py +0 -0
  41. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/context_inputs.py +0 -0
  42. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/corpus.py +0 -0
  43. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/effect_report.py +0 -0
  44. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/evidence.py +0 -0
  45. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/evidence_report.py +0 -0
  46. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/identity.py +0 -0
  47. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/metrics.py +0 -0
  48. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/overlap.py +0 -0
  49. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/planning.py +0 -0
  50. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/policy.py +0 -0
  51. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/results.py +0 -0
  52. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/run_results.py +0 -0
  53. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/run_status.py +0 -0
  54. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/runner.py +0 -0
  55. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/truth.py +0 -0
  56. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/calibration/value_report.py +0 -0
  57. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/campaign_discovery.py +0 -0
  58. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/checks.py +0 -0
  59. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/claude_audit_pr.py +0 -0
  60. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/claude_cli_bounce.py +0 -0
  61. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/claude_cli_environment.py +0 -0
  62. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/clear_stale.py +0 -0
  63. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cli.py +0 -0
  64. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud.py +0 -0
  65. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/__init__.py +0 -0
  66. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/adoption_runs.py +0 -0
  67. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/bundle.py +0 -0
  68. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/doctor.py +0 -0
  69. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/dogfood.py +0 -0
  70. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/endpoints.py +0 -0
  71. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/errors.py +0 -0
  72. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/events.py +0 -0
  73. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/export.py +0 -0
  74. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/finding_outcomes.py +0 -0
  75. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/git_metadata.py +0 -0
  76. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/manifest.py +0 -0
  77. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/operations.py +0 -0
  78. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/pr_outcomes.py +0 -0
  79. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/productivity.py +0 -0
  80. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/productivity_windows.py +0 -0
  81. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/reports.py +0 -0
  82. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/setup.py +0 -0
  83. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/tokens.py +0 -0
  84. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/upload.py +0 -0
  85. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/cloud_client/work_types.py +0 -0
  86. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/code_mower_calibration.py +0 -0
  87. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/code_mower_context_packs.py +0 -0
  88. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/code_mower_merge.py +0 -0
  89. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/code_mower_telemetry.py +0 -0
  90. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  91. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/codex_audit_env_preflight.py +0 -0
  92. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/codex_audit_pr.py +0 -0
  93. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  94. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  95. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/config.py +0 -0
  96. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/controller.py +0 -0
  97. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/decisions.py +0 -0
  98. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/devin_api.py +0 -0
  99. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/devin_cli_audit_pr.py +0 -0
  100. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor.py +0 -0
  101. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/__init__.py +0 -0
  102. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/adoption.py +0 -0
  103. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/audit_limits.py +0 -0
  104. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/campaign_auth.py +0 -0
  105. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/cloud.py +0 -0
  106. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/common.py +0 -0
  107. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github.py +0 -0
  108. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_actions.py +0 -0
  109. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  110. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  111. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  112. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  113. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  114. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  115. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  116. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  117. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_api.py +0 -0
  118. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_branch.py +0 -0
  119. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_config.py +0 -0
  120. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_human_token.py +0 -0
  121. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_provider.py +0 -0
  122. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_repo.py +0 -0
  123. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
  124. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/groups.py +0 -0
  125. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/jira.py +0 -0
  126. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/models.py +0 -0
  127. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/output.py +0 -0
  128. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/presets.py +0 -0
  129. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/privacy.py +0 -0
  130. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  131. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  132. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  133. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_env.py +0 -0
  134. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  135. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  136. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
  137. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  138. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  139. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  140. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  141. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  142. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  143. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  144. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  145. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  146. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/providers.py +0 -0
  147. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/registry.py +0 -0
  148. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/runner.py +0 -0
  149. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/runtime.py +0 -0
  150. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  151. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
  152. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/doctor_checks/supervised_pilot.py +0 -0
  153. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/file_locks.py +0 -0
  154. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/gate_health.py +0 -0
  155. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  156. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/git_identity.py +0 -0
  157. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/grok_build_audit_pr.py +0 -0
  158. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  159. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/init.py +0 -0
  160. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/jira_cloud.py +0 -0
  161. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/jira_mutations.py +0 -0
  162. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/jira_pr_sync.py +0 -0
  163. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/lane_configs/__init__.py +0 -0
  164. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/lane_configs/aider.py +0 -0
  165. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  166. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/lane_configs/claude.py +0 -0
  167. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/lane_configs/codex.py +0 -0
  168. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/lane_configs/devin.py +0 -0
  169. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/lane_configs/devin_cli.py +0 -0
  170. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  171. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/lane_configs/grok_build.py +0 -0
  172. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  173. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/lane_configs/local_llm.py +0 -0
  174. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/lane_configs/muse_cli.py +0 -0
  175. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/lane_delivery.py +0 -0
  176. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/lane_status.py +0 -0
  177. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/local_llm_audit_pr.py +0 -0
  178. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/local_llm_bakeoff.py +0 -0
  179. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/local_llm_calibration.py +0 -0
  180. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/local_llm_profiles.py +0 -0
  181. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/migration.py +0 -0
  182. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/migration_install.py +0 -0
  183. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/migration_mirror.py +0 -0
  184. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/migration_readiness.py +0 -0
  185. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/migration_rehearsal.py +0 -0
  186. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/muse_cli_audit_pr.py +0 -0
  187. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/next_steps.py +0 -0
  188. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/package.py +0 -0
  189. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/package_content.py +0 -0
  190. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/package_manifest.py +0 -0
  191. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/package_paths.py +0 -0
  192. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/package_rendering.py +0 -0
  193. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/package_static.py +0 -0
  194. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/participants.py +0 -0
  195. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/plan_context.py +0 -0
  196. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/productivity_report.py +0 -0
  197. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/prompts.py +0 -0
  198. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/provider_credentials.py +0 -0
  199. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/provider_registry.py +0 -0
  200. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/provider_runners/__init__.py +0 -0
  201. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/provider_runners/comments.py +0 -0
  202. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/provider_runners/exit_codes.py +0 -0
  203. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/provider_runners/git.py +0 -0
  204. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/provider_runners/github_auth.py +0 -0
  205. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/provider_runners/github_pr.py +0 -0
  206. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  207. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/provider_runners/process.py +0 -0
  208. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/provider_runners/repo_paths.py +0 -0
  209. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/provider_runners/text_schema.py +0 -0
  210. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  211. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/provider_runners/workspace.py +0 -0
  212. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/providers/__init__.py +0 -0
  213. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/providers/local_cli.py +0 -0
  214. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/providers/provenance.py +0 -0
  215. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/release_campaigns.py +0 -0
  216. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/release_qualify.py +0 -0
  217. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/release_readiness.py +0 -0
  218. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/reviewer_metrics.py +0 -0
  219. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/reviewer_spend.py +0 -0
  220. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/saas_reviewer_labeler.py +0 -0
  221. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/secrets.py +0 -0
  222. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/session.py +0 -0
  223. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/session_lease.py +0 -0
  224. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/builder-experiment.example.json +0 -0
  225. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  226. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/calibration-corpus.json +0 -0
  227. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/code-mower.example.yml +0 -0
  228. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/context-packs.example.json +0 -0
  229. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  230. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  231. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  232. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  233. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  234. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  235. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  236. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
  237. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  238. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lanes/README.md +0 -0
  239. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lanes/claude.md +0 -0
  240. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lanes/codex.md +0 -0
  241. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lanes/cursor.md +0 -0
  242. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lanes/devin.md +0 -0
  243. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lanes/generic.md +0 -0
  244. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
  245. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/product-support/code_mower +0 -0
  246. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  247. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  248. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  249. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  250. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/product-support/run_devin_cli_audit_pr.sh +0 -0
  251. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  252. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/product-support/status_report.py +0 -0
  253. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/providers.yml +0 -0
  254. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  255. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  256. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  257. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  258. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  259. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  260. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
  261. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  262. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  263. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  264. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  265. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
  266. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  267. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  268. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  269. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  270. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  271. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
  272. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/tracker_contract.py +0 -0
  273. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/tracker_queue.py +0 -0
  274. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/trailer_comment_labeler.py +0 -0
  275. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/versioning.py +0 -0
  276. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/work_orders.py +0 -0
  277. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower/workflow_actionlint.py +0 -0
  278. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower.egg-info/SOURCES.txt +0 -0
  279. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower.egg-info/dependency_links.txt +0 -0
  280. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower.egg-info/entry_points.txt +0 -0
  281. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower.egg-info/requires.txt +0 -0
  282. {code_mower-1.2.0 → code_mower-1.2.1}/src/code_mower.egg-info/top_level.txt +0 -0
  283. {code_mower-1.2.0 → code_mower-1.2.1}/templates/builder-experiment.example.json +0 -0
  284. {code_mower-1.2.0 → code_mower-1.2.1}/templates/calibration-corpus.example.json +0 -0
  285. {code_mower-1.2.0 → code_mower-1.2.1}/templates/calibration-corpus.json +0 -0
  286. {code_mower-1.2.0 → code_mower-1.2.1}/templates/code-mower.yml.j2 +0 -0
  287. {code_mower-1.2.0 → code_mower-1.2.1}/templates/context-packs.example.json +0 -0
  288. {code_mower-1.2.0 → code_mower-1.2.1}/templates/cursor/BUGBOT.md +0 -0
  289. {code_mower-1.2.0 → code_mower-1.2.1}/templates/lanes/README.md +0 -0
  290. {code_mower-1.2.0 → code_mower-1.2.1}/templates/lanes/claude.md +0 -0
  291. {code_mower-1.2.0 → code_mower-1.2.1}/templates/lanes/codex.md +0 -0
  292. {code_mower-1.2.0 → code_mower-1.2.1}/templates/lanes/cursor.md +0 -0
  293. {code_mower-1.2.0 → code_mower-1.2.1}/templates/lanes/devin.md +0 -0
  294. {code_mower-1.2.0 → code_mower-1.2.1}/templates/lanes/generic.md +0 -0
  295. {code_mower-1.2.0 → code_mower-1.2.1}/templates/lanes/run_mac_lane.sh +0 -0
  296. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/acp_bridge.yml +0 -0
  297. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/aider.yml +0 -0
  298. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/antigravity_cli.yml +0 -0
  299. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/claude_audit.yml +0 -0
  300. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/claude_review.yml +0 -0
  301. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/coderabbit_cli.yml +0 -0
  302. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/codex.yml +0 -0
  303. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/cursor_bugbot.yml +0 -0
  304. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/cursor_cloud_agent.yml +0 -0
  305. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/devin.yml +0 -0
  306. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/devin_cli.yml +0 -0
  307. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/gemini_cli.yml +0 -0
  308. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/gitar.yml +0 -0
  309. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/greptile.yml +0 -0
  310. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/hermes_cli.yml +0 -0
  311. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/local_llm.yml +0 -0
  312. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/muse_cli.yml +0 -0
  313. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers/qodo.yml +0 -0
  314. {code_mower-1.2.0 → code_mower-1.2.1}/templates/providers.yml +0 -0
  315. {code_mower-1.2.0 → code_mower-1.2.1}/templates/reviewer-spend.example.json +0 -0
  316. {code_mower-1.2.0 → code_mower-1.2.1}/templates/reviewer-value-report.example.md +0 -0
  317. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  318. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  319. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  320. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  321. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  322. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/code-mower-gate.yml.j2 +0 -0
  323. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  324. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  325. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  326. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  327. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  328. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  329. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  330. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  331. {code_mower-1.2.0 → code_mower-1.2.1}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  332. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_adoption_diagnostics.py +0 -0
  333. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_adoption_result_semantics.py +0 -0
  334. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_adoption_run_contract.py +0 -0
  335. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_antigravity_cli_audit_pr.py +0 -0
  336. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_antigravity_sdk_probe.py +0 -0
  337. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_audit_comment_posture.py +0 -0
  338. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_audit_limits.py +0 -0
  339. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_board.py +0 -0
  340. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_board_lease.py +0 -0
  341. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_builder_experiment.py +0 -0
  342. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_builder_identity.py +0 -0
  343. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_builder_runs.py +0 -0
  344. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_calibration_effect_report.py +0 -0
  345. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_calibration_truth.py +0 -0
  346. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_campaign_discovery.py +0 -0
  347. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_campaign_gh_auth_and_issue_binding_817.py +0 -0
  348. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_campaign_retry_evidence_711.py +0 -0
  349. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_checks.py +0 -0
  350. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_claude_audit_pr.py +0 -0
  351. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_claude_cli_bounce.py +0 -0
  352. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_clear_stale.py +0 -0
  353. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_cloud_client.py +0 -0
  354. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_cloud_git_metadata.py +0 -0
  355. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_cloud_manifest.py +0 -0
  356. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_cloud_reports.py +0 -0
  357. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  358. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_codex_audit_env_preflight.py +0 -0
  359. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_codex_audit_pr.py +0 -0
  360. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_controller.py +0 -0
  361. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_decision_audit_integration.py +0 -0
  362. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_decisions.py +0 -0
  363. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_devin_api.py +0 -0
  364. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_devin_builder_lane.py +0 -0
  365. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_devin_cli_audit_pr.py +0 -0
  366. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_devin_provider_contract.py +0 -0
  367. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_actions_cost_summary.py +0 -0
  368. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_actions_failure_selection.py +0 -0
  369. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_boundaries.py +0 -0
  370. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_campaign_auth.py +0 -0
  371. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_campaign_readiness.py +0 -0
  372. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_github_checks.py +0 -0
  373. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_output.py +0 -0
  374. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_privacy.py +0 -0
  375. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_provider_env_required.py +0 -0
  376. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_provider_env_tokens.py +0 -0
  377. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_provider_local_audit_setup.py +0 -0
  378. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_provider_probe.py +0 -0
  379. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_provider_review_hygiene.py +0 -0
  380. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_registry.py +0 -0
  381. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_runtime.py +0 -0
  382. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_self_hosted_runner.py +0 -0
  383. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_doctor_supervised_pilot.py +0 -0
  384. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_file_locks.py +0 -0
  385. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_fork_pr_guard.py +0 -0
  386. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_gate_automerge.py +0 -0
  387. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_gate_health.py +0 -0
  388. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_hosted_dispatch_profile.py +0 -0
  389. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_init_actionlint.py +0 -0
  390. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_init_build_loop.py +0 -0
  391. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_jira_adoption.py +0 -0
  392. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_jira_cloud.py +0 -0
  393. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_jira_mutations.py +0 -0
  394. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_jira_pr_sync.py +0 -0
  395. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_lane_delivery_contract.py +0 -0
  396. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_lane_status.py +0 -0
  397. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_local_llm_github_helpers.py +0 -0
  398. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_migration_rehearsal.py +0 -0
  399. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_migration_setup_drift.py +0 -0
  400. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_next_steps.py +0 -0
  401. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_package_install_failure_taxonomy.py +0 -0
  402. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_participant_sessions.py +0 -0
  403. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_plan_context.py +0 -0
  404. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_pr_outcome_contract.py +0 -0
  405. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_pr_outcome_coverage.py +0 -0
  406. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_productivity_metrics_contract.py +0 -0
  407. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_productivity_report.py +0 -0
  408. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_productivity_windows.py +0 -0
  409. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_prompts.py +0 -0
  410. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_provider_credentials.py +0 -0
  411. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_provider_fixture_contracts.py +0 -0
  412. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_provider_local_cli.py +0 -0
  413. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_provider_runners_comments.py +0 -0
  414. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_provider_runners_git.py +0 -0
  415. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_provider_runners_github_pr.py +0 -0
  416. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_provider_runners_pr_worktree.py +0 -0
  417. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_provider_runners_process.py +0 -0
  418. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_provider_runners_repo_paths.py +0 -0
  419. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_provider_runners_text_schema.py +0 -0
  420. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_provider_runners_workspace.py +0 -0
  421. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_release_campaigns.py +0 -0
  422. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_release_qualify.py +0 -0
  423. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_remote_qualification_failure_reason_819.py +0 -0
  424. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_reviewer_finding_outcome_contract.py +0 -0
  425. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_reviewer_metrics_core.py +0 -0
  426. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_reviewer_spend.py +0 -0
  427. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_session_lease.py +0 -0
  428. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_supervised_pilot_contract.py +0 -0
  429. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_tracker_config.py +0 -0
  430. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_tracker_contract.py +0 -0
  431. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_tracker_queue.py +0 -0
  432. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_trailer_comment_labeler.py +0 -0
  433. {code_mower-1.2.0 → code_mower-1.2.1}/tests/test_work_orders.py +0 -0
  434. {code_mower-1.2.0 → code_mower-1.2.1}/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.1
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.1` package, use the documentation from the matching
60
+ [`v1.2.1` tag](https://github.com/codemower-ai/code-mower/tree/v1.2.1) 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.1/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.1` / `code-mower==1.2.1`. 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.1`, with pinned package
565
+ install spec `code-mower==1.2.1`. 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,7 @@ 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)
678
679
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
679
680
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
680
681
 
@@ -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.1` package, use the documentation from the matching
30
+ [`v1.2.1` tag](https://github.com/codemower-ai/code-mower/tree/v1.2.1) 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.1/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.1` / `code-mower==1.2.1`. 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.1`, with pinned package
535
+ install spec `code-mower==1.2.1`. 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,7 @@ 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)
648
649
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
649
650
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
650
651
 
@@ -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.1"
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.1"
@@ -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
  "",
@@ -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.1
12
12
 
13
13
  jobs:
14
14
  auto-record:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 1.2.0
3
+ Version: 1.2.1
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.1` package, use the documentation from the matching
60
+ [`v1.2.1` tag](https://github.com/codemower-ai/code-mower/tree/v1.2.1) 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.1/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.1` / `code-mower==1.2.1`. 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.1`, with pinned package
565
+ install spec `code-mower==1.2.1`. 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,7 @@ 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)
678
679
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
679
680
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
680
681
 
@@ -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.1
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")
@@ -65,7 +65,7 @@ from scripts import guard_package_workflows, privacy_scan
65
65
 
66
66
  class ReleaseHygieneTests(unittest.TestCase):
67
67
  def test_version_is_current_supervised_pilot_release(self) -> None:
68
- self.assertEqual(__version__, "1.2.0")
68
+ self.assertEqual(__version__, "1.2.1")
69
69
 
70
70
  def test_dogfood_repo_has_real_root_config(self) -> None:
71
71
  config_path = ROOT / "code-mower.yml"
@@ -216,7 +216,7 @@ class ReleaseHygieneTests(unittest.TestCase):
216
216
  self.assertIn("Cold Install Vs Upgrade", install)
217
217
  self.assertIn("Switching Between pipx And uv", install)
218
218
  self.assertIn("uv tool install --python 3.12 --reinstall --refresh-package", install)
219
- self.assertIn("code-mower==1.2.0", troubleshooting)
219
+ self.assertIn("code-mower==1.2.1", troubleshooting)
220
220
  self.assertNotIn("code-mower==0.8.0b1", troubleshooting)
221
221
  self.assertIn("pipx uninstall code-mower", install)
222
222
  for env_name in ("PIPX_HOME", "PIPX_BIN_DIR", "PIPX_LOG_DIR"):
@@ -1100,7 +1100,7 @@ exit 1
1100
1100
  )
1101
1101
 
1102
1102
  self.assertNotEqual(completed.returncode, 0)
1103
- self.assertIn("pipx install code-mower==1.2.0", completed.stderr)
1103
+ self.assertIn("pipx install code-mower==1.2.1", completed.stderr)
1104
1104
  self.assertIn("scripts/dev-python -m venv .venv", completed.stderr)
1105
1105
  self.assertIn(".venv/bin/code-mower", completed.stderr)
1106
1106
  self.assertNotIn("PYTHONPATH=src", completed.stderr)
@@ -3238,10 +3238,10 @@ jobs:
3238
3238
 
3239
3239
  cases = (
3240
3240
  (
3241
- 'CODE_MOWER_STANDALONE_REF="v1.2.0"\n',
3241
+ 'CODE_MOWER_STANDALONE_REF="v1.2.1"\n',
3242
3242
  "pass",
3243
3243
  "matches_running_package",
3244
- "v1.2.0",
3244
+ "v1.2.1",
3245
3245
  ),
3246
3246
  (
3247
3247
  'CODE_MOWER_STANDALONE_REF="v0.9.1-beta.1"\n',
@@ -3272,12 +3272,12 @@ jobs:
3272
3272
 
3273
3273
  payload = migration._standalone_pin_drift_summary(
3274
3274
  repo,
3275
- package_version="1.2.0",
3275
+ package_version="1.2.1",
3276
3276
  )
3277
3277
 
3278
3278
  self.assertEqual(payload["status"], status)
3279
3279
  self.assertEqual(payload["reason"], reason)
3280
- self.assertEqual(payload["expected_ref"], "v1.2.0")
3280
+ self.assertEqual(payload["expected_ref"], "v1.2.1")
3281
3281
  if current_ref is None:
3282
3282
  self.assertNotIn("current_ref", payload)
3283
3283
  else:
@@ -3298,7 +3298,7 @@ jobs:
3298
3298
 
3299
3299
  payload = migration._standalone_pin_drift_summary(
3300
3300
  repo,
3301
- package_version="1.2.0",
3301
+ package_version="1.2.1",
3302
3302
  )
3303
3303
 
3304
3304
  self.assertEqual(payload["status"], "warn")
@@ -3361,7 +3361,7 @@ jobs:
3361
3361
  "standalone_pin": {
3362
3362
  "status": "skip",
3363
3363
  "reason": "pin_file_absent",
3364
- "expected_ref": "v1.2.0",
3364
+ "expected_ref": "v1.2.1",
3365
3365
  },
3366
3366
  "builder_hint": {
3367
3367
  "status": "skip",
@@ -3373,7 +3373,7 @@ jobs:
3373
3373
 
3374
3374
  rendered = migration.render_setup_drift_text(payload)
3375
3375
 
3376
- self.assertIn("Standalone pin: SKIP pin_file_absent expected=v1.2.0", rendered)
3376
+ self.assertIn("Standalone pin: SKIP pin_file_absent expected=v1.2.1", rendered)
3377
3377
 
3378
3378
  def test_setup_drift_reports_builder_hint_when_builders_omitted(self) -> None:
3379
3379
  from code_mower import migration
@@ -5553,11 +5553,11 @@ printf 'repo:%s:%s:%s\\n' "${lane}" "${stdin_flag}" "${token}"
5553
5553
  (output_dir / "src/code_mower/cloud_client/dogfood.py").is_file()
5554
5554
  )
5555
5555
  self.assertIn(
5556
- 'version = "1.2.0"',
5556
+ 'version = "1.2.1"',
5557
5557
  (output_dir / "pyproject.toml").read_text(encoding="utf-8"),
5558
5558
  )
5559
5559
  self.assertIn(
5560
- '__version__ = "1.2.0"',
5560
+ '__version__ = "1.2.1"',
5561
5561
  (output_dir / "src/code_mower/__init__.py").read_text(
5562
5562
  encoding="utf-8"
5563
5563
  ),
@@ -7562,7 +7562,7 @@ def main():
7562
7562
  "pip",
7563
7563
  "install",
7564
7564
  "--no-cache-dir",
7565
- "code-mower==1.2.0",
7565
+ "code-mower==1.2.1",
7566
7566
  ]
7567
7567
 
7568
7568
  def fake_run_step(*args: object, **kwargs: object) -> subprocess.CompletedProcess[str]:
@@ -7629,7 +7629,7 @@ def main():
7629
7629
  self.assertTrue(code_mower_migration._package_spec_uses_package_index("code-mower"))
7630
7630
  self.assertTrue(
7631
7631
  code_mower_migration._package_spec_uses_package_index(
7632
- "code-mower==1.2.0"
7632
+ "code-mower==1.2.1"
7633
7633
  )
7634
7634
  )
7635
7635
  self.assertFalse(code_mower_migration._package_spec_uses_package_index("."))
@@ -7638,7 +7638,7 @@ def main():
7638
7638
  )
7639
7639
  self.assertFalse(
7640
7640
  code_mower_migration._package_spec_uses_package_index(
7641
- "git+https://github.com/codemower-ai/code-mower.git@v1.2.0"
7641
+ "git+https://github.com/codemower-ai/code-mower.git@v1.2.1"
7642
7642
  )
7643
7643
  )
7644
7644
 
@@ -7648,7 +7648,7 @@ def main():
7648
7648
 
7649
7649
  with self.assertRaisesRegex(ValueError, "--allow-package-index"):
7650
7650
  code_mower_migration.run_package_install_rehearsal(
7651
- package_spec="code-mower==1.2.0",
7651
+ package_spec="code-mower==1.2.1",
7652
7652
  work_dir=work_dir,
7653
7653
  )
7654
7654
 
@@ -7676,7 +7676,7 @@ def main():
7676
7676
  [
7677
7677
  "package-install-rehearsal",
7678
7678
  "--package-spec",
7679
- "code-mower==1.2.0",
7679
+ "code-mower==1.2.1",
7680
7680
  "--allow-package-index",
7681
7681
  "--upgrade-pip",
7682
7682
  "--pip-no-cache",
@@ -7732,10 +7732,10 @@ def main():
7732
7732
  payload = release_readiness.render_release_readiness(ROOT)
7733
7733
 
7734
7734
  self.assertEqual(payload["status"], "pass")
7735
- self.assertEqual(payload["version"], "1.2.0")
7736
- self.assertEqual(payload["release_tag"], "v1.2.0")
7737
- self.assertEqual(payload["alpha_tag"], "v1.2.0")
7738
- self.assertEqual(payload["package_index_spec"], "code-mower==1.2.0")
7735
+ self.assertEqual(payload["version"], "1.2.1")
7736
+ self.assertEqual(payload["release_tag"], "v1.2.1")
7737
+ self.assertEqual(payload["alpha_tag"], "v1.2.1")
7738
+ self.assertEqual(payload["package_index_spec"], "code-mower==1.2.1")
7739
7739
  check_ids = {check["id"]: check for check in payload["checks"]}
7740
7740
  self.assertEqual(check_ids["package-version-consistency"]["status"], "pass")
7741
7741
  self.assertEqual(
@@ -7751,9 +7751,9 @@ def main():
7751
7751
  self.assertEqual(check_ids["public-support-redaction-guidance"]["status"], "pass")
7752
7752
  commands = {action["id"]: action["command"] for action in payload["next_actions"]}
7753
7753
  urls = {action["id"]: action.get("url", "") for action in payload["next_actions"]}
7754
- self.assertIn("--ref v1.2.0", commands["dry-run-release-workflow"])
7754
+ self.assertIn("--ref v1.2.1", commands["dry-run-release-workflow"])
7755
7755
  self.assertNotIn("--ref main", commands["dry-run-release-workflow"])
7756
- self.assertIn("--ref v1.2.0", commands["publish-testpypi-candidate"])
7756
+ self.assertIn("--ref v1.2.1", commands["publish-testpypi-candidate"])
7757
7757
  self.assertNotIn("--ref main", commands["publish-testpypi-candidate"])
7758
7758
  self.assertIn("publish_testpypi=true", commands["publish-testpypi-candidate"])
7759
7759
  self.assertIn("publish_pypi=false", commands["publish-testpypi-candidate"])
@@ -7790,7 +7790,7 @@ def main():
7790
7790
  check_ids = {check["id"]: check for check in payload["checks"]}
7791
7791
  check = check_ids["materialized-package-version-consistency"]
7792
7792
  self.assertEqual(check["status"], "fail")
7793
- self.assertEqual(check["detail"]["source_version"], "1.2.0")
7793
+ self.assertEqual(check["detail"]["source_version"], "1.2.1")
7794
7794
  self.assertEqual(check["detail"]["generated_init_version"], "0.0.0")
7795
7795
 
7796
7796
  def test_public_support_docs_are_packaged_and_privacy_forward(self) -> None:
@@ -7894,20 +7894,20 @@ def main():
7894
7894
  "v1.0.0-rc.1",
7895
7895
  )
7896
7896
  self.assertEqual(
7897
- release_readiness._release_tag_for_version("1.2.0"),
7898
- "v1.2.0",
7897
+ release_readiness._release_tag_for_version("1.2.1"),
7898
+ "v1.2.1",
7899
7899
  )
7900
7900
  self.assertEqual(
7901
- code_mower_versioning.release_tag_for_version("1.2.0"),
7902
- "v1.2.0",
7901
+ code_mower_versioning.release_tag_for_version("1.2.1"),
7902
+ "v1.2.1",
7903
7903
  )
7904
7904
 
7905
7905
  def test_public_release_baseline_helpers_derive_announcement_links(self) -> None:
7906
7906
  self.assertEqual(
7907
7907
  code_mower_versioning.public_baseline_sentence(__version__),
7908
7908
  (
7909
- "The current package-index release baseline is `v1.2.0`, "
7910
- "with pinned package install spec `code-mower==1.2.0`. "
7909
+ "The current package-index release baseline is `v1.2.1`, "
7910
+ "with pinned package install spec `code-mower==1.2.1`. "
7911
7911
  "Release evidence is recorded on the GitHub release and in the "
7912
7912
  "first-user install rehearsal."
7913
7913
  ),
@@ -7916,7 +7916,7 @@ def main():
7916
7916
  code_mower_versioning.tagged_doc_url(__version__),
7917
7917
  (
7918
7918
  "https://github.com/codemower-ai/code-mower/blob/"
7919
- "v1.2.0/docs/try-in-10-minutes.md"
7919
+ "v1.2.1/docs/try-in-10-minutes.md"
7920
7920
  ),
7921
7921
  )
7922
7922
 
@@ -7969,12 +7969,12 @@ def main():
7969
7969
 
7970
7970
  readme = (ROOT / "README.md").read_text(encoding="utf-8")
7971
7971
  sessions = (ROOT / "docs" / "sessions.md").read_text(encoding="utf-8")
7972
- release_notes = (ROOT / "docs" / "v12-release-notes.md").read_text(
7972
+ release_notes = (ROOT / "docs" / "v121-release-notes.md").read_text(
7973
7973
  encoding="utf-8"
7974
7974
  )
7975
7975
  self.assertIn("Documentation on `main` follows the source on `main`", readme)
7976
- self.assertIn("available in `code-mower==1.2.0`", sessions)
7977
- self.assertIn("# Code Mower v1.2.0 Release Notes", release_notes)
7976
+ self.assertIn("available in `code-mower==1.2.1`", sessions)
7977
+ self.assertIn("# Code Mower v1.2.1 Release Notes", release_notes)
7978
7978
  self.assertIn("The privacy boundary is unchanged.", release_notes)
7979
7979
  self.assertLess(
7980
7980
  readme.index("[v1.1 Release Notes](docs/v11-release-notes.md)"),
@@ -7984,6 +7984,10 @@ def main():
7984
7984
  readme.index("[v1.1.2 Release Notes](docs/v112-release-notes.md)"),
7985
7985
  readme.index("[v1.2 Release Notes](docs/v12-release-notes.md)"),
7986
7986
  )
7987
+ self.assertLess(
7988
+ readme.index("[v1.2 Release Notes](docs/v12-release-notes.md)"),
7989
+ readme.index("[v1.2.1 Release Notes](docs/v121-release-notes.md)"),
7990
+ )
7987
7991
 
7988
7992
  def test_current_release_docs_record_package_index_procedure(self) -> None:
7989
7993
  readme = (ROOT / "README.md").read_text(encoding="utf-8")
@@ -8005,15 +8009,15 @@ def main():
8005
8009
  )
8006
8010
 
8007
8011
  current_status = (
8008
- "The current package-index release baseline is `v1.2.0`, with "
8009
- "pinned package install spec `code-mower==1.2.0`. Release "
8012
+ "The current package-index release baseline is `v1.2.1`, with "
8013
+ "pinned package install spec `code-mower==1.2.1`. Release "
8010
8014
  "evidence is recorded on the GitHub release and in the first-user "
8011
8015
  "install rehearsal."
8012
8016
  )
8013
8017
  for text in (readme, current_state, rollout):
8014
8018
  self.assertIn(current_status, " ".join(text.split()))
8015
8019
  self.assertIn(
8016
- "The current package-index release entrypoint is `code-mower==1.2.0`",
8020
+ "The current package-index release entrypoint is `code-mower==1.2.1`",
8017
8021
  public_release,
8018
8022
  )
8019
8023
  self.assertIn("The v1.0 supervised-pilot release includes", public_release)
@@ -8023,7 +8027,7 @@ def main():
8023
8027
  )
8024
8028
 
8025
8029
  self.assertIn(
8026
- "The current public-release baseline is `v1.2.0`",
8030
+ "The current public-release baseline is `v1.2.1`",
8027
8031
  oss_checklist,
8028
8032
  )
8029
8033
  self.assertIn(
@@ -8054,7 +8058,7 @@ def main():
8054
8058
  " ".join(first_user.split()),
8055
8059
  )
8056
8060
  self.assertIn("never substitute mutable `main`", first_user)
8057
- self.assertEqual(first_user.count(" --ref v1.2.0 \\"), 2)
8061
+ self.assertEqual(first_user.count(" --ref v1.2.1 \\"), 2)
8058
8062
  self.assertNotIn(" --ref main \\", first_user)
8059
8063
  self.assertIn("-f publish_testpypi=true", first_user)
8060
8064
  self.assertIn("-f publish_pypi=false", first_user)
@@ -8066,23 +8070,23 @@ def main():
8066
8070
  first_user,
8067
8071
  )
8068
8072
  self.assertNotIn(
8069
- "The latest public-package rehearsal for `v1.2.0` was run",
8073
+ "The latest public-package rehearsal for `v1.2.1` was run",
8070
8074
  first_user,
8071
8075
  )
8072
- self.assertNotIn("TestPyPI is not\npublished for `1.2.0`", first_user)
8076
+ self.assertNotIn("TestPyPI is not\npublished for `1.2.1`", first_user)
8073
8077
  for text in (readme, current_state, rollout):
8074
8078
  self.assertNotIn(
8075
- "published on PyPI as `code-mower==1.2.0`",
8079
+ "published on PyPI as `code-mower==1.2.1`",
8076
8080
  text,
8077
8081
  )
8078
8082
  self.assertNotIn(
8079
8083
  "latest 10/10 public-package readiness proof for "
8080
- "`code-mower==1.2.0`",
8084
+ "`code-mower==1.2.1`",
8081
8085
  text,
8082
8086
  )
8083
8087
  self.assertNotIn(
8084
8088
  "public PyPI package-install rehearsal from "
8085
- "`code-mower==1.2.0`",
8089
+ "`code-mower==1.2.1`",
8086
8090
  text,
8087
8091
  )
8088
8092
  self.assertNotIn("beta.52: 10/10 first-user readiness", text)
@@ -8382,7 +8386,7 @@ def main():
8382
8386
 
8383
8387
  self.assertIn("Python 3.12 or newer", install)
8384
8388
  self.assertIn('pipx install --python "$CODE_MOWER_PYTHON"', install)
8385
- self.assertIn("uv tool install --python 3.12 code-mower==1.2.0", install)
8389
+ self.assertIn("uv tool install --python 3.12 code-mower==1.2.1", install)
8386
8390
  self.assertIn(
8387
8391
  'PIP_NO_CACHE_DIR=1 pipx install --force --python "$CODE_MOWER_PYTHON"',
8388
8392
  install,
@@ -8476,7 +8480,7 @@ def main():
8476
8480
  / "v101-effectiveness-assessment.md",
8477
8481
  }
8478
8482
  stale_phrases = (
8479
- "pipx install --python python3.12 code-mower==1.2.0",
8483
+ "pipx install --python python3.12 code-mower==1.2.1",
8480
8484
  "Use only after TestPyPI passes.",
8481
8485
  "future newest betas until 1.0",
8482
8486
  "during v0.7 adoption",
@@ -8776,7 +8780,7 @@ def main():
8776
8780
  "doctor --adoption --repo codemower-ai/code-mower",
8777
8781
  doctor_step["command"],
8778
8782
  )
8779
- self.assertIn("code-mower==1.2.0", package_step["command"])
8783
+ self.assertIn("code-mower==1.2.1", package_step["command"])
8780
8784
  self.assertIn("--allow-package-index", package_step["command"])
8781
8785
  self.assertIn("current published PyPI package", package_step["why"])
8782
8786
  self.assertIn("first_user_readiness", package_step["why"])
File without changes
File without changes