code-mower 1.0.14__tar.gz → 1.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. {code_mower-1.0.14 → code_mower-1.1.0}/PKG-INFO +19 -5
  2. {code_mower-1.0.14 → code_mower-1.1.0}/README.md +18 -4
  3. {code_mower-1.0.14 → code_mower-1.1.0}/pyproject.toml +1 -1
  4. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/__init__.py +1 -1
  5. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/antigravity_cli_audit_pr.py +46 -0
  6. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/board.py +33 -4
  7. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cli.py +3 -0
  8. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud.py +131 -3
  9. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/__init__.py +58 -0
  10. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/bundle.py +1 -0
  11. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/events.py +165 -23
  12. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/export.py +13 -1
  13. code_mower-1.1.0/src/code_mower/cloud_client/finding_outcomes.py +205 -0
  14. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/operations.py +670 -11
  15. code_mower-1.1.0/src/code_mower/cloud_client/pr_outcomes.py +958 -0
  16. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/productivity.py +2 -0
  17. code_mower-1.1.0/src/code_mower/cloud_client/productivity_windows.py +720 -0
  18. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/config.py +186 -0
  19. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/controller.py +78 -5
  20. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/devin_api.py +130 -12
  21. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor.py +20 -0
  22. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/__init__.py +12 -0
  23. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/adoption.py +162 -35
  24. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/groups.py +1 -1
  25. code_mower-1.1.0/src/code_mower/doctor_checks/jira.py +914 -0
  26. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/runner.py +18 -0
  27. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/gemini_cli_audit_pr.py +49 -13
  28. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/init.py +102 -1
  29. code_mower-1.1.0/src/code_mower/jira_cloud.py +1754 -0
  30. code_mower-1.1.0/src/code_mower/jira_mutations.py +2456 -0
  31. code_mower-1.1.0/src/code_mower/jira_pr_sync.py +741 -0
  32. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_status.py +82 -2
  33. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/package_manifest.py +17 -0
  34. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/productivity_report.py +69 -11
  35. code_mower-1.1.0/src/code_mower/provider_credentials.py +628 -0
  36. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/release_campaigns.py +764 -145
  37. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/release_qualify.py +33 -0
  38. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/reviewer_spend.py +42 -5
  39. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/code-mower.example.yml +36 -0
  40. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
  41. code_mower-1.1.0/src/code_mower/tracker_contract.py +320 -0
  42. code_mower-1.1.0/src/code_mower/tracker_queue.py +329 -0
  43. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower.egg-info/PKG-INFO +19 -5
  44. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower.egg-info/SOURCES.txt +21 -0
  45. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/builder-provenance.yml.j2 +1 -1
  46. code_mower-1.1.0/tests/test_antigravity_cli_audit_pr.py +395 -0
  47. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_campaign_retry_evidence_711.py +76 -0
  48. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_campaign_readiness.py +207 -0
  49. code_mower-1.1.0/tests/test_jira_adoption.py +785 -0
  50. code_mower-1.1.0/tests/test_jira_cloud.py +2103 -0
  51. code_mower-1.1.0/tests/test_jira_mutations.py +2725 -0
  52. code_mower-1.1.0/tests/test_jira_pr_sync.py +921 -0
  53. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_lane_status.py +164 -1
  54. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_pr_outcome_contract.py +41 -0
  55. code_mower-1.1.0/tests/test_pr_outcome_coverage.py +3401 -0
  56. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_productivity_report.py +120 -2
  57. code_mower-1.1.0/tests/test_productivity_windows.py +1209 -0
  58. code_mower-1.1.0/tests/test_provider_credentials.py +864 -0
  59. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_release_campaigns.py +11588 -10287
  60. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_release_hygiene.py +49 -46
  61. code_mower-1.1.0/tests/test_reviewer_finding_outcome_contract.py +488 -0
  62. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_reviewer_spend.py +205 -0
  63. code_mower-1.1.0/tests/test_tracker_config.py +181 -0
  64. code_mower-1.1.0/tests/test_tracker_contract.py +221 -0
  65. code_mower-1.1.0/tests/test_tracker_queue.py +681 -0
  66. code_mower-1.0.14/src/code_mower/cloud_client/pr_outcomes.py +0 -160
  67. {code_mower-1.0.14 → code_mower-1.1.0}/CODE_OF_CONDUCT.md +0 -0
  68. {code_mower-1.0.14 → code_mower-1.1.0}/LICENSE +0 -0
  69. {code_mower-1.0.14 → code_mower-1.1.0}/MANIFEST.in +0 -0
  70. {code_mower-1.0.14 → code_mower-1.1.0}/NOTICE +0 -0
  71. {code_mower-1.0.14 → code_mower-1.1.0}/SUPPORT.md +0 -0
  72. {code_mower-1.0.14 → code_mower-1.1.0}/requirements/requirements.txt +0 -0
  73. {code_mower-1.0.14 → code_mower-1.1.0}/setup.cfg +0 -0
  74. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/adapters/__init__.py +0 -0
  75. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/adapters/_base.py +0 -0
  76. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  77. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/adapters/gitar.py +0 -0
  78. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/adapters/greptile.py +0 -0
  79. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/adapters/qodo.py +0 -0
  80. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/antigravity_sdk_probe.py +0 -0
  81. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/audit_handoff_log.py +0 -0
  82. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/audit_labeler_lib.py +0 -0
  83. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/audit_limits.py +0 -0
  84. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/audit_progress.py +0 -0
  85. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/blind_review_artifacts.py +0 -0
  86. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/blind_review_coordinator.py +0 -0
  87. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/board_store.py +0 -0
  88. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/bootstrap.py +0 -0
  89. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/builder_experiment.py +0 -0
  90. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/builder_runs.py +0 -0
  91. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/__init__.py +0 -0
  92. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/arms.py +0 -0
  93. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/auto_discovery.py +0 -0
  94. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/commands.py +0 -0
  95. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/context_inputs.py +0 -0
  96. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/corpus.py +0 -0
  97. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/effect_report.py +0 -0
  98. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/evidence.py +0 -0
  99. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/evidence_report.py +0 -0
  100. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/identity.py +0 -0
  101. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/metrics.py +0 -0
  102. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/overlap.py +0 -0
  103. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/planning.py +0 -0
  104. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/policy.py +0 -0
  105. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/results.py +0 -0
  106. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/run_results.py +0 -0
  107. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/run_status.py +0 -0
  108. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/runner.py +0 -0
  109. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/truth.py +0 -0
  110. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/value_report.py +0 -0
  111. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/campaign_adapters.py +0 -0
  112. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/campaign_discovery.py +0 -0
  113. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/checks.py +0 -0
  114. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/claude_audit_pr.py +0 -0
  115. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/claude_cli_bounce.py +0 -0
  116. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/claude_cli_environment.py +0 -0
  117. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/clear_stale.py +0 -0
  118. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/adoption_runs.py +0 -0
  119. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/doctor.py +0 -0
  120. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/dogfood.py +0 -0
  121. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/endpoints.py +0 -0
  122. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/errors.py +0 -0
  123. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/git_metadata.py +0 -0
  124. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/manifest.py +0 -0
  125. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/reports.py +0 -0
  126. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/setup.py +0 -0
  127. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/tokens.py +0 -0
  128. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/upload.py +0 -0
  129. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/work_types.py +0 -0
  130. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/code_mower_calibration.py +0 -0
  131. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/code_mower_context_packs.py +0 -0
  132. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/code_mower_merge.py +0 -0
  133. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/code_mower_telemetry.py +0 -0
  134. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  135. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/codex_audit_env_preflight.py +0 -0
  136. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/codex_audit_pr.py +0 -0
  137. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  138. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  139. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/decisions.py +0 -0
  140. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/devin_cli_audit_pr.py +0 -0
  141. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/audit_limits.py +0 -0
  142. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/campaign_auth.py +0 -0
  143. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/cloud.py +0 -0
  144. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/common.py +0 -0
  145. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github.py +0 -0
  146. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions.py +0 -0
  147. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  148. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  149. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  150. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  151. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  152. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  153. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  154. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  155. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_api.py +0 -0
  156. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_branch.py +0 -0
  157. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_config.py +0 -0
  158. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_human_token.py +0 -0
  159. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_provider.py +0 -0
  160. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_repo.py +0 -0
  161. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
  162. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/models.py +0 -0
  163. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/output.py +0 -0
  164. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/presets.py +0 -0
  165. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/privacy.py +0 -0
  166. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  167. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  168. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  169. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_env.py +0 -0
  170. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  171. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  172. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
  173. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  174. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  175. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  176. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  177. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  178. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  179. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  180. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  181. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  182. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/providers.py +0 -0
  183. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/registry.py +0 -0
  184. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/runtime.py +0 -0
  185. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  186. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
  187. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/supervised_pilot.py +0 -0
  188. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/file_locks.py +0 -0
  189. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/gate_health.py +0 -0
  190. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/git_identity.py +0 -0
  191. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/grok_build_audit_pr.py +0 -0
  192. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  193. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/__init__.py +0 -0
  194. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/aider.py +0 -0
  195. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  196. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/claude.py +0 -0
  197. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/codex.py +0 -0
  198. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/devin.py +0 -0
  199. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/devin_cli.py +0 -0
  200. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  201. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/grok_build.py +0 -0
  202. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  203. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/local_llm.py +0 -0
  204. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/muse_cli.py +0 -0
  205. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_delivery.py +0 -0
  206. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/local_llm_audit_pr.py +0 -0
  207. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/local_llm_bakeoff.py +0 -0
  208. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/local_llm_calibration.py +0 -0
  209. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/local_llm_profiles.py +0 -0
  210. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/migration.py +0 -0
  211. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/migration_install.py +0 -0
  212. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/migration_mirror.py +0 -0
  213. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/migration_readiness.py +0 -0
  214. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/migration_rehearsal.py +0 -0
  215. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/muse_cli_audit_pr.py +0 -0
  216. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/next_steps.py +0 -0
  217. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/package.py +0 -0
  218. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/package_content.py +0 -0
  219. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/package_paths.py +0 -0
  220. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/package_rendering.py +0 -0
  221. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/package_static.py +0 -0
  222. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/participants.py +0 -0
  223. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/plan_context.py +0 -0
  224. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/prompts.py +0 -0
  225. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_registry.py +0 -0
  226. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/__init__.py +0 -0
  227. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/comments.py +0 -0
  228. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/exit_codes.py +0 -0
  229. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/git.py +0 -0
  230. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/github_auth.py +0 -0
  231. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/github_pr.py +0 -0
  232. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  233. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/process.py +0 -0
  234. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/repo_paths.py +0 -0
  235. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/text_schema.py +0 -0
  236. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  237. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/workspace.py +0 -0
  238. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/providers/__init__.py +0 -0
  239. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/providers/local_cli.py +0 -0
  240. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/providers/provenance.py +0 -0
  241. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/release_readiness.py +0 -0
  242. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/reviewer_metrics.py +0 -0
  243. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/saas_reviewer_labeler.py +0 -0
  244. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/secrets.py +0 -0
  245. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/session.py +0 -0
  246. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/builder-experiment.example.json +0 -0
  247. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  248. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/calibration-corpus.json +0 -0
  249. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/context-packs.example.json +0 -0
  250. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  251. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  252. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  253. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  254. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  255. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  256. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  257. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
  258. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  259. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lanes/README.md +0 -0
  260. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lanes/claude.md +0 -0
  261. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lanes/codex.md +0 -0
  262. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lanes/cursor.md +0 -0
  263. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lanes/devin.md +0 -0
  264. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lanes/generic.md +0 -0
  265. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
  266. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/code_mower +0 -0
  267. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  268. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  269. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  270. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  271. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/run_devin_cli_audit_pr.sh +0 -0
  272. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  273. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/status_report.py +0 -0
  274. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/providers.yml +0 -0
  275. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  276. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  277. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  278. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  279. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  280. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  281. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
  282. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  283. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  284. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  285. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  286. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
  287. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  288. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  289. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  290. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  291. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  292. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
  293. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/trailer_comment_labeler.py +0 -0
  294. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/versioning.py +0 -0
  295. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/work_orders.py +0 -0
  296. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/workflow_actionlint.py +0 -0
  297. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower.egg-info/dependency_links.txt +0 -0
  298. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower.egg-info/entry_points.txt +0 -0
  299. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower.egg-info/requires.txt +0 -0
  300. {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower.egg-info/top_level.txt +0 -0
  301. {code_mower-1.0.14 → code_mower-1.1.0}/templates/builder-experiment.example.json +0 -0
  302. {code_mower-1.0.14 → code_mower-1.1.0}/templates/calibration-corpus.example.json +0 -0
  303. {code_mower-1.0.14 → code_mower-1.1.0}/templates/calibration-corpus.json +0 -0
  304. {code_mower-1.0.14 → code_mower-1.1.0}/templates/code-mower.yml.j2 +0 -0
  305. {code_mower-1.0.14 → code_mower-1.1.0}/templates/context-packs.example.json +0 -0
  306. {code_mower-1.0.14 → code_mower-1.1.0}/templates/cursor/BUGBOT.md +0 -0
  307. {code_mower-1.0.14 → code_mower-1.1.0}/templates/lanes/README.md +0 -0
  308. {code_mower-1.0.14 → code_mower-1.1.0}/templates/lanes/claude.md +0 -0
  309. {code_mower-1.0.14 → code_mower-1.1.0}/templates/lanes/codex.md +0 -0
  310. {code_mower-1.0.14 → code_mower-1.1.0}/templates/lanes/cursor.md +0 -0
  311. {code_mower-1.0.14 → code_mower-1.1.0}/templates/lanes/devin.md +0 -0
  312. {code_mower-1.0.14 → code_mower-1.1.0}/templates/lanes/generic.md +0 -0
  313. {code_mower-1.0.14 → code_mower-1.1.0}/templates/lanes/run_mac_lane.sh +0 -0
  314. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/acp_bridge.yml +0 -0
  315. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/aider.yml +0 -0
  316. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/antigravity_cli.yml +0 -0
  317. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/claude_audit.yml +0 -0
  318. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/claude_review.yml +0 -0
  319. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/coderabbit_cli.yml +0 -0
  320. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/codex.yml +0 -0
  321. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/cursor_bugbot.yml +0 -0
  322. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/cursor_cloud_agent.yml +0 -0
  323. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/devin.yml +0 -0
  324. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/devin_cli.yml +0 -0
  325. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/gemini_cli.yml +0 -0
  326. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/gitar.yml +0 -0
  327. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/greptile.yml +0 -0
  328. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/hermes_cli.yml +0 -0
  329. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/local_llm.yml +0 -0
  330. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/muse_cli.yml +0 -0
  331. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/qodo.yml +0 -0
  332. {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers.yml +0 -0
  333. {code_mower-1.0.14 → code_mower-1.1.0}/templates/reviewer-spend.example.json +0 -0
  334. {code_mower-1.0.14 → code_mower-1.1.0}/templates/reviewer-value-report.example.md +0 -0
  335. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  336. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  337. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  338. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  339. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  340. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/code-mower-gate.yml.j2 +0 -0
  341. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  342. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  343. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  344. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  345. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  346. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  347. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  348. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  349. {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  350. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_adoption_diagnostics.py +0 -0
  351. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_adoption_result_semantics.py +0 -0
  352. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_adoption_run_contract.py +0 -0
  353. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_antigravity_sdk_probe.py +0 -0
  354. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_audit_comment_posture.py +0 -0
  355. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_audit_limits.py +0 -0
  356. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_board.py +0 -0
  357. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_builder_experiment.py +0 -0
  358. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_builder_identity.py +0 -0
  359. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_builder_runs.py +0 -0
  360. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_calibration_effect_report.py +0 -0
  361. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_calibration_truth.py +0 -0
  362. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_campaign_adapters.py +0 -0
  363. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_campaign_discovery.py +0 -0
  364. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_checks.py +0 -0
  365. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_claude_audit_pr.py +0 -0
  366. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_claude_cli_bounce.py +0 -0
  367. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_clear_stale.py +0 -0
  368. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_cloud_client.py +0 -0
  369. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_cloud_git_metadata.py +0 -0
  370. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_cloud_manifest.py +0 -0
  371. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_cloud_reports.py +0 -0
  372. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  373. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_codex_audit_env_preflight.py +0 -0
  374. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_codex_audit_pr.py +0 -0
  375. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_controller.py +0 -0
  376. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_decision_audit_integration.py +0 -0
  377. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_decisions.py +0 -0
  378. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_devin_api.py +0 -0
  379. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_devin_builder_lane.py +0 -0
  380. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_devin_cli_audit_pr.py +0 -0
  381. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_devin_provider_contract.py +0 -0
  382. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_actions_cost_summary.py +0 -0
  383. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_actions_failure_selection.py +0 -0
  384. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_boundaries.py +0 -0
  385. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_campaign_auth.py +0 -0
  386. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_github_checks.py +0 -0
  387. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_output.py +0 -0
  388. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_privacy.py +0 -0
  389. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_provider_env_required.py +0 -0
  390. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_provider_env_tokens.py +0 -0
  391. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_provider_local_audit_setup.py +0 -0
  392. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_provider_probe.py +0 -0
  393. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_provider_review_hygiene.py +0 -0
  394. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_registry.py +0 -0
  395. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_runtime.py +0 -0
  396. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_self_hosted_runner.py +0 -0
  397. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_supervised_pilot.py +0 -0
  398. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_file_locks.py +0 -0
  399. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_fork_pr_guard.py +0 -0
  400. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_gate_automerge.py +0 -0
  401. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_gate_health.py +0 -0
  402. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_hosted_dispatch_profile.py +0 -0
  403. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_init_actionlint.py +0 -0
  404. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_init_build_loop.py +0 -0
  405. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_lane_delivery_contract.py +0 -0
  406. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_local_llm_github_helpers.py +0 -0
  407. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_migration_rehearsal.py +0 -0
  408. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_migration_setup_drift.py +0 -0
  409. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_next_steps.py +0 -0
  410. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_package_install_failure_taxonomy.py +0 -0
  411. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_participant_sessions.py +0 -0
  412. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_plan_context.py +0 -0
  413. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_productivity_metrics_contract.py +0 -0
  414. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_prompts.py +0 -0
  415. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_fixture_contracts.py +0 -0
  416. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_local_cli.py +0 -0
  417. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_comments.py +0 -0
  418. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_git.py +0 -0
  419. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_github_pr.py +0 -0
  420. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_pr_worktree.py +0 -0
  421. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_process.py +0 -0
  422. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_repo_paths.py +0 -0
  423. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_text_schema.py +0 -0
  424. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_workspace.py +0 -0
  425. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_release_qualify.py +0 -0
  426. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_reviewer_metrics_core.py +0 -0
  427. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_supervised_pilot_contract.py +0 -0
  428. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_trailer_comment_labeler.py +0 -0
  429. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_work_orders.py +0 -0
  430. {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_work_type_contract.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 1.0.14
3
+ Version: 1.1.0
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Homepage, https://github.com/codemower-ai/code-mower
@@ -234,6 +234,10 @@ after reinstalling, especially when switching between pipx and uv.
234
234
  | B. Build loop in 30 minutes | You want builders plus an orchestrator pattern after the reviewer gate works. | Complete path A, then add the automation token, require `code-mower/gate` from Any source, enable repository auto-merge, prove the self-hosted Mac lane runner with `doctor --runner`, run `init --builders`, and dispatch the first issue. | [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md) |
235
235
  | C. Builder experiment | You want to compare authoring loops before trusting them broadly. | Use a work order or experiment spec, run `code-mower builder-experiment run` around an explicit command, then review the source-free `authoringRun` artifact and normal audit evidence. | [Builder Experiments](docs/builder-experiments.md) |
236
236
 
237
+ For Jira Cloud work tracking instead of the default GitHub Issues path, see
238
+ [Jira Cloud Setup](docs/jira-cloud-setup.md) and
239
+ [Jira Adoption Rehearsal](docs/jira-adoption-rehearsal.md).
240
+
237
241
  When you ask another agent to install, upgrade, orchestrate, build, or review,
238
242
  start from the universal prompt in
239
243
  [Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md). It makes the
@@ -241,7 +245,7 @@ agent report its actual host posture, exact installed version, doctor result,
241
245
  Board URL, and any owner-only click-list before it mutates the repo.
242
246
 
243
247
  The current package-index announcement entry point is the tagged
244
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.0.14/docs/try-in-10-minutes.md)
248
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.0/docs/try-in-10-minutes.md)
245
249
  guide. The v1.0 supervised-pilot release includes the native Board, the
246
250
  controller dry-run and policy contract, adoption and upgrade hardening from
247
251
  recent install rehearsals, package-index release checks, provider-diversity
@@ -306,6 +310,12 @@ reports `running` / `waiting_for_user`, so a finished informational Devin
306
310
  attempt is no longer recorded as owner-blocked. An explicit terminal API
307
311
  failure and a `waiting_for_approval` session still take precedence over any
308
312
  structured output.
313
+ The v1.1 release adds optional Jira Cloud work tracking while keeping GitHub
314
+ pull requests, checks, and merge gates authoritative. Jira setup starts
315
+ read-only; mutation requires both explicit configuration and an explicit
316
+ apply command. Controller queue visibility, Board, and PR-to-Jira milestones
317
+ share the same bounded metadata contract, and GitHub-only repositories keep
318
+ their existing behavior and generated workflows.
309
319
  Package-only users can start from the public package rather than a source
310
320
  checkout.
311
321
 
@@ -338,7 +348,7 @@ Provider-contract baseline for the next release train:
338
348
 
339
349
  For release verification,
340
350
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
341
- the package-index procedure for `v1.0.14` / `code-mower==1.0.14`. The
351
+ the package-index procedure for `v1.1.0` / `code-mower==1.1.0`. The
342
352
  GitHub release records the workflow and rehearsal evidence for the exact tag.
343
353
  After publication, [Release Qualification](docs/release-qualification.md)
344
354
  coordinates provider-specific install and operational checks without treating
@@ -532,8 +542,8 @@ measurement work.
532
542
 
533
543
  ## Installation Status
534
544
 
535
- The current package-index release baseline is `v1.0.14`, with pinned package
536
- install spec `code-mower==1.0.14`. Release evidence is recorded on the GitHub
545
+ The current package-index release baseline is `v1.1.0`, with pinned package
546
+ install spec `code-mower==1.1.0`. Release evidence is recorded on the GitHub
537
547
  release and in the first-user install rehearsal. The public repository is
538
548
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
539
549
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -592,6 +602,8 @@ first so local work exercises the same package entrypoint users install.
592
602
  - [Provider Matrix](docs/provider-matrix.md)
593
603
  - [Provider Calibration Scorecard](docs/provider-calibration-scorecard.md)
594
604
  - [GitHub Setup](docs/github-setup.md)
605
+ - [Jira Cloud Setup](docs/jira-cloud-setup.md)
606
+ - [Jira Adoption Rehearsal](docs/jira-adoption-rehearsal.md)
595
607
  - [First Run Transcript](docs/first-run-transcript.md)
596
608
  - [First-User Demo Transcript](docs/first-user-demo-transcript.md)
597
609
  - [First-User Install Rehearsal](docs/first-user-install-rehearsal.md)
@@ -616,6 +628,8 @@ first so local work exercises the same package entrypoint users install.
616
628
  - [v1.0.12 Release Notes](docs/v1012-release-notes.md)
617
629
  - [v1.0.13 Release Notes](docs/v1013-release-notes.md)
618
630
  - [v1.0.14 Release Notes](docs/v1014-release-notes.md)
631
+ - [v1.0.15 Release Notes](docs/v1015-release-notes.md)
632
+ - [v1.1 Release Notes](docs/v11-release-notes.md)
619
633
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
620
634
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
621
635
  - [Demo Calibration Example](examples/demo-calibration/README.md)
@@ -204,6 +204,10 @@ after reinstalling, especially when switching between pipx and uv.
204
204
  | B. Build loop in 30 minutes | You want builders plus an orchestrator pattern after the reviewer gate works. | Complete path A, then add the automation token, require `code-mower/gate` from Any source, enable repository auto-merge, prove the self-hosted Mac lane runner with `doctor --runner`, run `init --builders`, and dispatch the first issue. | [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md) |
205
205
  | C. Builder experiment | You want to compare authoring loops before trusting them broadly. | Use a work order or experiment spec, run `code-mower builder-experiment run` around an explicit command, then review the source-free `authoringRun` artifact and normal audit evidence. | [Builder Experiments](docs/builder-experiments.md) |
206
206
 
207
+ For Jira Cloud work tracking instead of the default GitHub Issues path, see
208
+ [Jira Cloud Setup](docs/jira-cloud-setup.md) and
209
+ [Jira Adoption Rehearsal](docs/jira-adoption-rehearsal.md).
210
+
207
211
  When you ask another agent to install, upgrade, orchestrate, build, or review,
208
212
  start from the universal prompt in
209
213
  [Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md). It makes the
@@ -211,7 +215,7 @@ agent report its actual host posture, exact installed version, doctor result,
211
215
  Board URL, and any owner-only click-list before it mutates the repo.
212
216
 
213
217
  The current package-index announcement entry point is the tagged
214
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.0.14/docs/try-in-10-minutes.md)
218
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.0/docs/try-in-10-minutes.md)
215
219
  guide. The v1.0 supervised-pilot release includes the native Board, the
216
220
  controller dry-run and policy contract, adoption and upgrade hardening from
217
221
  recent install rehearsals, package-index release checks, provider-diversity
@@ -276,6 +280,12 @@ reports `running` / `waiting_for_user`, so a finished informational Devin
276
280
  attempt is no longer recorded as owner-blocked. An explicit terminal API
277
281
  failure and a `waiting_for_approval` session still take precedence over any
278
282
  structured output.
283
+ The v1.1 release adds optional Jira Cloud work tracking while keeping GitHub
284
+ pull requests, checks, and merge gates authoritative. Jira setup starts
285
+ read-only; mutation requires both explicit configuration and an explicit
286
+ apply command. Controller queue visibility, Board, and PR-to-Jira milestones
287
+ share the same bounded metadata contract, and GitHub-only repositories keep
288
+ their existing behavior and generated workflows.
279
289
  Package-only users can start from the public package rather than a source
280
290
  checkout.
281
291
 
@@ -308,7 +318,7 @@ Provider-contract baseline for the next release train:
308
318
 
309
319
  For release verification,
310
320
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
311
- the package-index procedure for `v1.0.14` / `code-mower==1.0.14`. The
321
+ the package-index procedure for `v1.1.0` / `code-mower==1.1.0`. The
312
322
  GitHub release records the workflow and rehearsal evidence for the exact tag.
313
323
  After publication, [Release Qualification](docs/release-qualification.md)
314
324
  coordinates provider-specific install and operational checks without treating
@@ -502,8 +512,8 @@ measurement work.
502
512
 
503
513
  ## Installation Status
504
514
 
505
- The current package-index release baseline is `v1.0.14`, with pinned package
506
- install spec `code-mower==1.0.14`. Release evidence is recorded on the GitHub
515
+ The current package-index release baseline is `v1.1.0`, with pinned package
516
+ install spec `code-mower==1.1.0`. Release evidence is recorded on the GitHub
507
517
  release and in the first-user install rehearsal. The public repository is
508
518
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
509
519
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -562,6 +572,8 @@ first so local work exercises the same package entrypoint users install.
562
572
  - [Provider Matrix](docs/provider-matrix.md)
563
573
  - [Provider Calibration Scorecard](docs/provider-calibration-scorecard.md)
564
574
  - [GitHub Setup](docs/github-setup.md)
575
+ - [Jira Cloud Setup](docs/jira-cloud-setup.md)
576
+ - [Jira Adoption Rehearsal](docs/jira-adoption-rehearsal.md)
565
577
  - [First Run Transcript](docs/first-run-transcript.md)
566
578
  - [First-User Demo Transcript](docs/first-user-demo-transcript.md)
567
579
  - [First-User Install Rehearsal](docs/first-user-install-rehearsal.md)
@@ -586,6 +598,8 @@ first so local work exercises the same package entrypoint users install.
586
598
  - [v1.0.12 Release Notes](docs/v1012-release-notes.md)
587
599
  - [v1.0.13 Release Notes](docs/v1013-release-notes.md)
588
600
  - [v1.0.14 Release Notes](docs/v1014-release-notes.md)
601
+ - [v1.0.15 Release Notes](docs/v1015-release-notes.md)
602
+ - [v1.1 Release Notes](docs/v11-release-notes.md)
589
603
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
590
604
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
591
605
  - [Demo Calibration Example](examples/demo-calibration/README.md)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-mower"
7
- version = "1.0.14"
7
+ version = "1.1.0"
8
8
  description = "Multi-reviewer AI code audit orchestration"
9
9
  requires-python = ">=3.12"
10
10
  readme = "README.md"
@@ -1,3 +1,3 @@
1
1
  """Code Mower package."""
2
2
 
3
- __version__ = "1.0.14"
3
+ __version__ = "1.1.0"
@@ -12,6 +12,8 @@ import sys
12
12
  import urllib.error
13
13
  from pathlib import Path
14
14
 
15
+ from typing import Mapping
16
+
15
17
  if __package__ in {None, ""}:
16
18
  module_dir = Path(__file__).resolve().parent
17
19
  sys.path.insert(0, str(module_dir.parent))
@@ -34,6 +36,11 @@ DEFAULT_ANTIGRAVITY_DISPLAY_NAME = "Antigravity CLI"
34
36
  ANTIGRAVITY_SETTINGS_SUBDIRS = (".gemini", ".gemini/antigravity-cli")
35
37
  ANTIGRAVITY_ALTERNATE_COMMANDS = ("antigravity",)
36
38
  ANTIGRAVITY_AMBIENT_HOME_ENV = "ANTIGRAVITY_CLI_USE_AMBIENT_HOME"
39
+ ANTIGRAVITY_REQUIRED_FLAGS = ("--dangerously-skip-permissions",)
40
+ ANTIGRAVITY_HELP_SENTINELS = (
41
+ *gemini_cli_audit_pr.PROMPT_FILE_HELP_SENTINELS,
42
+ *ANTIGRAVITY_REQUIRED_FLAGS,
43
+ )
37
44
 
38
45
  AntigravityCliHeadChangedError = gemini_cli_audit_pr.GeminiCliHeadChangedError
39
46
  AntigravityCliUnsupportedError = gemini_cli_audit_pr.GeminiCliUnsupportedError
@@ -61,6 +68,43 @@ def resolve_antigravity_command(command: str) -> str:
61
68
  return command
62
69
 
63
70
 
71
+ def build_antigravity_audit_argv(
72
+ *,
73
+ command: str = DEFAULT_ANTIGRAVITY_COMMAND,
74
+ workspace_dir: Path,
75
+ prompt_instruction: str,
76
+ timeout_seconds: int = gemini_cli_audit_pr.DEFAULT_TIMEOUT_SECONDS,
77
+ model: str = "",
78
+ ) -> list[str]:
79
+ """Build structured argv for headless Antigravity CLI audit inside sandbox."""
80
+ return gemini_cli_audit_pr.build_prompt_file_argv(
81
+ resolve_antigravity_command(command),
82
+ workspace_dir=workspace_dir,
83
+ prompt_instruction=prompt_instruction,
84
+ timeout_seconds=timeout_seconds,
85
+ model=model,
86
+ extra_args=ANTIGRAVITY_REQUIRED_FLAGS,
87
+ )
88
+
89
+
90
+ def verify_antigravity_cli_contract(
91
+ command: str,
92
+ *,
93
+ cwd: Path,
94
+ env: Mapping[str, str] | None = None,
95
+ display_name: str = DEFAULT_ANTIGRAVITY_DISPLAY_NAME,
96
+ ) -> None:
97
+ """Verify that the Antigravity CLI supports required audit flags."""
98
+ resolved_env = env if env is not None else os.environ
99
+ gemini_cli_audit_pr.verify_prompt_file_contract(
100
+ resolve_antigravity_command(command),
101
+ cwd=cwd,
102
+ env=resolved_env,
103
+ display_name=display_name,
104
+ required_sentinels=ANTIGRAVITY_HELP_SENTINELS,
105
+ )
106
+
107
+
64
108
  def run_antigravity_cli_audit(
65
109
  *,
66
110
  repo: str,
@@ -120,6 +164,8 @@ def run_antigravity_cli_audit(
120
164
  cli_transport="prompt_file",
121
165
  preserve_ambient_home=use_ambient_home,
122
166
  context_pack_text=context_pack_text,
167
+ extra_args=ANTIGRAVITY_REQUIRED_FLAGS,
168
+ required_help_sentinels=ANTIGRAVITY_HELP_SENTINELS,
123
169
  )
124
170
 
125
171
 
@@ -212,6 +212,8 @@ def status_payload(
212
212
  *,
213
213
  gh_json_runner: lane_status.GitHubJsonRunner = lane_status.run_gh_json,
214
214
  command_runner: lane_status.CommandRunner = lane_status.run_command,
215
+ jira_reader: controller.tracker_queue.JiraQueueReader | None = None,
216
+ tracker_links: Mapping[tuple[str, str, str], int] | None = None,
215
217
  ) -> dict[str, Any]:
216
218
  payload = lane_status.collect_status(
217
219
  repo=config.repo,
@@ -240,7 +242,11 @@ def status_payload(
240
242
  config,
241
243
  payload,
242
244
  gh_json_runner=gh_json_runner,
245
+ jira_reader=jira_reader,
246
+ tracker_links=tracker_links,
243
247
  )
248
+ if "tracker" in payload["supervised_pilot"]:
249
+ payload["tracker"] = payload["supervised_pilot"]["tracker"]
244
250
  payload["productivity"] = productivity_report.board_payload(
245
251
  repo=config.repo,
246
252
  repo_path=config.repo_path,
@@ -771,6 +777,9 @@ def _supervised_pr_payload(pr: Mapping[str, Any]) -> dict[str, Any]:
771
777
 
772
778
 
773
779
  def _supervised_issue_payload(issue: Mapping[str, Any]) -> dict[str, Any]:
780
+ if issue.get("source_kind") == "jira_cloud":
781
+ return {"source_kind": "jira_cloud", "work_item": issue["work_item"],
782
+ "builder_lane": _safe_text(issue.get("builder_lane"), limit=60)}
774
783
  payload: dict[str, Any] = {
775
784
  "number": _int(issue.get("number")) or 0,
776
785
  "url": _http_url(issue.get("url")),
@@ -787,10 +796,13 @@ def _supervised_issue_payload(issue: Mapping[str, Any]) -> dict[str, Any]:
787
796
 
788
797
  def supervised_pilot_payload(
789
798
  config: BoardConfig,
790
- status: dict[str, Any],
799
+ status: Mapping[str, Any],
791
800
  *,
792
801
  gh_json_runner: lane_status.GitHubJsonRunner = lane_status.run_gh_json,
802
+ jira_reader: controller.tracker_queue.JiraQueueReader | None = None,
803
+ tracker_links: Mapping[tuple[str, str, str], int] | None = None,
793
804
  ) -> dict[str, Any]:
805
+ """Return pilot state and its optional tracker view without modifying status."""
794
806
  config_path = Path(config.repo_path) / "code-mower.yml"
795
807
  if not config_path.is_file():
796
808
  return _supervised_disabled("code-mower.yml not found; supervised pilot state is unavailable")
@@ -803,12 +815,20 @@ def supervised_pilot_payload(
803
815
  return _supervised_disabled("Code Mower config is invalid; run code-mower config validate")
804
816
 
805
817
  remote = status.get("remote") if isinstance(status.get("remote"), Mapping) else {}
806
- if remote.get("available"):
818
+ tracker_view = None
819
+ if controller.tracker_queue.jira_enabled(raw_config):
820
+ tracker_view = controller.tracker_queue.queue_view(
821
+ controller.tracker_queue.collect_queue(raw_config, reader=jira_reader),
822
+ config=raw_config, remote=remote, links=tracker_links,
823
+ stale_minutes=config.stale_minutes,
824
+ )
825
+ if remote.get("available") or controller.tracker_queue.jira_enabled(raw_config):
807
826
  ready_issues = controller._collect_ready_issues( # noqa: SLF001 - shared package policy surface for Board.
808
827
  repo=config.repo,
809
828
  config=raw_config,
810
829
  gh_json_runner=gh_json_runner,
811
830
  issue_limit=min(config.pr_limit, 50),
831
+ tracker_view=tracker_view,
812
832
  )
813
833
  else:
814
834
  ready_issues = {"available": False, "errors": ["remote unavailable"], "issues": []}
@@ -824,6 +844,7 @@ def supervised_pilot_payload(
824
844
  raw_prs = remote.get("pull_requests") if isinstance(remote.get("pull_requests"), list) else []
825
845
  issue_payload = ready_issues.get("issues") if isinstance(ready_issues.get("issues"), list) else []
826
846
  return {
847
+ **({"tracker": report["tracker"]} if "tracker" in report else {}),
827
848
  "schema": controller.SUPERVISED_PILOT_SCHEMA,
828
849
  "enabled": True,
829
850
  "cycle_state": _supervised_cycle_state(decision.get("decision_state")),
@@ -1396,10 +1417,11 @@ def render_board_html(config: BoardConfig) -> str:
1396
1417
  supervisedDecision.pr_number ? `<div class="row"><div class="line"><a href="${{esc(href(supervisedDecision.pr_url))}}">Selected PR #${{esc(supervisedDecision.pr_number)}}</a>${{supervisedDecision.lane_id ? pill(supervisedDecision.lane_id) : ""}}${{supervisedDecision.gate_status ? pill(`gate ${{supervisedDecision.gate_status}}`) : ""}}${{supervisedDecision.author_lane_excluded ? pill("author excluded") : ""}}</div><div class="muted">${{esc(supervisedDecision.branch || "")}}${{supervisedDecision.head_sha_prefix ? ` @ ${{esc(supervisedDecision.head_sha_prefix)}}` : ""}}</div></div>` : "",
1397
1418
  supervisedDecision.issue_number ? `<div class="row"><div class="line"><a href="${{esc(href(supervisedDecision.issue_url))}}">Selected issue #${{esc(supervisedDecision.issue_number)}}</a>${{supervisedDecision.lane_id ? pill(supervisedDecision.lane_id) : ""}}</div></div>` : "",
1398
1419
  reviewerOutcomes.length ? `<div class="row"><b>Reviewer Evidence</b><div class="muted">${{reviewerOutcomes.map(outcome => `${{esc(outcome.lane_id || outcome.config_lane_id)}}=${{esc(outcome.verdict)}}`).join(", ")}}</div></div>` : "",
1399
- supervisedIssues.length ? `<div class="row"><b>Ready Issues</b><div class="muted">${{supervisedIssues.slice(0, 5).map(issue => `#${{esc(issue.number)}} ${{esc(issue.builder_lane || "")}}`).join(", ")}}</div></div>` : "",
1420
+ supervisedIssues.length ? `<div class="row"><b>Ready Issues</b><div class="muted">${{supervisedIssues.slice(0, 5).map(issue => `${{esc(issue.work_item?.identity?.issue_key || `#${{issue.number}}`)}} ${{esc(issue.builder_lane || "")}}`).join(", ")}}</div></div>` : "",
1400
1421
  supervisedPRs.length ? `<div class="row"><b>Active PRs</b><div class="muted">${{supervisedPRs.slice(0, 5).map(pr => `#${{esc(pr.number)}} ${{esc(pr.merge_state || "")}}${{pr.stale ? " stale" : ""}}${{pr.is_draft ? " draft" : ""}}`).join(", ")}}</div></div>` : ""
1401
1422
  ].filter(Boolean).join("") : empty(supervised.message || "Supervised pilot state unavailable.");
1402
- put("supervised", supervisedRows || empty(supervised.message || "No supervised pilot activity."));
1423
+ const trackerRows = data.tracker ? `<div class="row"><b>Tracker: ${{esc(data.tracker.source_kind)}}</b> ${{pill(data.tracker.freshness)}}<div>${{esc((data.tracker.errors || []).join(", "))}}</div></div>` + (data.tracker.items || []).map(row => `<div class="row"><a href="${{esc(href(row.work_item.url))}}">${{esc(row.work_item.identity.issue_key || row.work_item.identity.issue_id)}}</a> ${{pill(row.work_item.lifecycle_category)}} ${{pill(row.freshness)}} ${{pill(row.lane_id || "unassigned")}}<div>PR ${{esc(row.linked_pr_number || "-")}} gate=${{esc(row.gate_status)}} (${{esc(row.pr_freshness)}})</div><div>next: ${{esc(row.next_action)}}</div></div>`).join("") : "";
1424
+ put("supervised", trackerRows + supervisedRows || empty(supervised.message || "No supervised pilot activity."));
1403
1425
  const productivityRows = [
1404
1426
  `<div class="row"><div>next: <b>${{esc(productivity.next_action || "inspect")}}</b></div></div>`,
1405
1427
  `<div class="row"><b>Current</b><div class="line">${{pill(`open PRs ${{display(productivityCurrent.open_pr_count)}}`)}}${{pill(`active lanes ${{display(productivityCurrent.active_lane_count)}}`)}}${{pill(`blocked ${{display(productivityCurrent.blocked_pr_count)}}`)}}${{pill(`owner actions ${{display(productivityCurrent.owner_action_count)}}`)}}</div></div>`,
@@ -1906,6 +1928,13 @@ def make_handler(
1906
1928
  snapshot, cache_metadata = status_cache.get()
1907
1929
  payload = copy.deepcopy(snapshot) if snapshot is not None else _pending_status_payload(config)
1908
1930
  payload["board"]["cache"] = cache_metadata
1931
+ if "tracker" in payload and cache_metadata["state"] == "stale":
1932
+ payload["tracker"]["freshness"] = "historical"
1933
+ for row in payload["tracker"]["items"]:
1934
+ row["freshness"] = "historical"
1935
+ row["pr_freshness"] = "historical"
1936
+ row["eligible"] = False
1937
+ row["next_action"] = "refresh current state"
1909
1938
  if config.record_events:
1910
1939
  # Recording identity is the cache generation, not cache freshness.
1911
1940
  # ``snapshot`` and ``generation`` are read together under the cache
@@ -66,6 +66,7 @@ from . import gate_health as code_mower_gate_health
66
66
  from . import grok_build_audit_pr
67
67
  from . import hermes_cli_audit_pr
68
68
  from . import init as code_mower_init
69
+ from . import jira_mutations as code_mower_jira_mutations
69
70
  from . import lane_delivery as code_mower_lane_delivery
70
71
  from . import lane_status as code_mower_lane_status
71
72
  from . import local_llm_audit_pr
@@ -478,6 +479,7 @@ COMMAND_DESCRIPTIONS: dict[str, str] = {
478
479
  "saas-reviewer-labeler": "Apply labels from hosted reviewer comments.",
479
480
  "telemetry": "Inspect benchmark telemetry/event helpers.",
480
481
  "trailer-comment-labeler": "Apply labels from structured audit trailers.",
482
+ "tracker": "Plan or apply guarded, idempotent Jira Cloud work-tracker mutations.",
481
483
  "work-order": "Draft implementation work orders and builder experiment seeds.",
482
484
  }
483
485
 
@@ -626,6 +628,7 @@ COMMAND_HANDLERS: dict[str, CommandHandler] = {
626
628
  "session": code_mower_session.main,
627
629
  "telemetry": code_mower_telemetry.main,
628
630
  "trailer-comment-labeler": trailer_comment_labeler.main,
631
+ "tracker": code_mower_jira_mutations.main,
629
632
  "work-order": code_mower_work_orders.work_order_main,
630
633
  }
631
634
 
@@ -32,6 +32,7 @@ if __package__ in {None, ""}:
32
32
  default_setup_path as _default_setup_path,
33
33
  build_upload_payload,
34
34
  default_dogfood_reports as _default_dogfood_reports,
35
+ detect_repo_slug as _detect_repo_slug,
35
36
  dogfood_upload as _dogfood_upload,
36
37
  event_id_from_github_run as _event_id_from_github_run,
37
38
  is_local_http_endpoint,
@@ -50,6 +51,7 @@ if __package__ in {None, ""}:
50
51
  repo_slug_from_remote as _repo_slug_from_remote,
51
52
  repo_sync_output_name as _repo_sync_output_name,
52
53
  repo_sync_upload as _repo_sync_upload,
54
+ pr_outcomes_upload as _pr_outcomes_upload,
53
55
  resolve_setup_token as _resolve_setup_token,
54
56
  reviewer_runs_upload as _reviewer_runs_upload,
55
57
  run_cloud_doctor,
@@ -86,6 +88,7 @@ else: # pragma: no cover - exercised after package extraction.
86
88
  default_setup_path as _default_setup_path,
87
89
  build_upload_payload,
88
90
  default_dogfood_reports as _default_dogfood_reports,
91
+ detect_repo_slug as _detect_repo_slug,
89
92
  dogfood_upload as _dogfood_upload,
90
93
  event_id_from_github_run as _event_id_from_github_run,
91
94
  is_local_http_endpoint,
@@ -104,6 +107,7 @@ else: # pragma: no cover - exercised after package extraction.
104
107
  repo_slug_from_remote as _repo_slug_from_remote,
105
108
  repo_sync_output_name as _repo_sync_output_name,
106
109
  repo_sync_upload as _repo_sync_upload,
110
+ pr_outcomes_upload as _pr_outcomes_upload,
107
111
  resolve_setup_token as _resolve_setup_token,
108
112
  reviewer_runs_upload as _reviewer_runs_upload,
109
113
  run_cloud_doctor,
@@ -125,6 +129,7 @@ DEFAULT_OUTPUT_DIR = ".code-mower/cloud-benchmark-bundle"
125
129
  DEFAULT_CATCH_UP_OUTPUT_DIR = ".code-mower/cloud-catch-up-bundle"
126
130
  DEFAULT_REVIEWER_RUNS_OUTPUT_DIR = ".code-mower/reviewer-run-bundle"
127
131
  DEFAULT_REPO_SYNC_OUTPUT_DIR = ".code-mower/cloud-repo-sync"
132
+ DEFAULT_PR_OUTCOMES_OUTPUT_DIR = ".code-mower/cloud-pr-outcomes-bundle"
128
133
  DEFAULT_BOARD_SNAPSHOT_OUTPUT_DIR = ".code-mower/cloud-board-snapshot-bundle"
129
134
 
130
135
  # Keep the legacy cloud.py import surface intentional while implementation
@@ -143,6 +148,7 @@ __all__ = [
143
148
  "DEFAULT_CATCH_UP_OUTPUT_DIR",
144
149
  "DEFAULT_REVIEWER_RUNS_OUTPUT_DIR",
145
150
  "DEFAULT_REPO_SYNC_OUTPUT_DIR",
151
+ "DEFAULT_PR_OUTCOMES_OUTPUT_DIR",
146
152
  "DEFAULT_BOARD_SNAPSHOT_OUTPUT_DIR",
147
153
  "build_cloud_bundle",
148
154
  "build_upload_payload",
@@ -170,6 +176,7 @@ __all__ = [
170
176
  "_repo_slug_from_remote",
171
177
  "_repo_sync_output_name",
172
178
  "_repo_sync_upload",
179
+ "_pr_outcomes_upload",
173
180
  "_resolve_setup_token",
174
181
  "_reviewer_runs_upload",
175
182
  "_run_git",
@@ -468,6 +475,57 @@ def main(argv: list[str] | None = None) -> int:
468
475
  )
469
476
  catch_up.add_argument("--timeout", type=float, default=20.0)
470
477
  catch_up.add_argument("--json", action="store_true")
478
+ pr_outcomes = subparsers.add_parser("pr-outcomes")
479
+ pr_outcomes.add_argument("--repo-path", type=Path, default=Path.cwd())
480
+ pr_outcomes.add_argument(
481
+ "--output-dir",
482
+ type=Path,
483
+ default=Path(DEFAULT_PR_OUTCOMES_OUTPUT_DIR),
484
+ )
485
+ pr_outcomes.add_argument("--repo-slug", default="")
486
+ pr_outcomes.add_argument("--team-id", default="")
487
+ pr_outcomes.add_argument("--install-id", default="")
488
+ pr_outcomes.add_argument("--source", default="code-mower-pr-outcomes")
489
+ pr_outcomes.add_argument(
490
+ "--limit",
491
+ type=int,
492
+ default=MAX_EVENT_COUNT,
493
+ help=f"number of PRs to include; max {MAX_EVENT_COUNT}",
494
+ )
495
+ pr_outcomes.add_argument(
496
+ "--spend",
497
+ type=Path,
498
+ default=None,
499
+ help=(
500
+ "reviewer spend ledger to merge into coverage; defaults to "
501
+ ".code-mower/reviewer-spend.json when present"
502
+ ),
503
+ )
504
+ pr_outcomes.add_argument(
505
+ "--endpoint",
506
+ default=os.environ.get("CODE_MOWER_CLOUD_ENDPOINT", DEFAULT_UPLOAD_ENDPOINT),
507
+ )
508
+ pr_outcomes.add_argument("--token-env", default=DEFAULT_TOKEN_ENV)
509
+ pr_outcomes.add_argument(
510
+ "--token-file",
511
+ type=Path,
512
+ default=None,
513
+ help="token env file or raw token file to use when token env is not set",
514
+ )
515
+ pr_outcomes.add_argument(
516
+ "--token-dir",
517
+ type=Path,
518
+ default=None,
519
+ help="directory with Code Mower Cloud token profiles",
520
+ )
521
+ pr_outcomes.add_argument(
522
+ "--yes",
523
+ action="store_true",
524
+ help="perform the network upload; without this, pr-outcomes is a dry run",
525
+ )
526
+ pr_outcomes.add_argument("--timeout", type=float, default=20.0)
527
+ pr_outcomes.add_argument("--json", action="store_true")
528
+
471
529
  board_snapshot = subparsers.add_parser("board-snapshot")
472
530
  board_snapshot.add_argument("--repo-path", type=Path, default=Path.cwd())
473
531
  board_snapshot.add_argument(
@@ -604,10 +662,21 @@ def main(argv: list[str] | None = None) -> int:
604
662
  repo_sync.add_argument(
605
663
  "--mode",
606
664
  action="append",
607
- choices=("dogfood", "catch-up", "reviewer-runs"),
665
+ choices=("dogfood", "catch-up", "reviewer-runs", "pr-outcomes"),
608
666
  default=[],
609
667
  help="sync mode to run; repeatable, defaults to dogfood and reviewer-runs",
610
668
  )
669
+ repo_sync.add_argument(
670
+ "--event",
671
+ action="append",
672
+ default=[],
673
+ metavar="EVENT_TYPE=PATH",
674
+ help=(
675
+ "include structured benchmark events from JSON/JSONL in each repo's "
676
+ "dogfood step; productivity_summary entries also accept "
677
+ "code_mower.productivityWindow.v1 window observations"
678
+ ),
679
+ )
611
680
  repo_sync.add_argument(
612
681
  "--output-dir",
613
682
  type=Path,
@@ -685,7 +754,12 @@ def main(argv: list[str] | None = None) -> int:
685
754
  return 0
686
755
  if args.command == "export":
687
756
  events = [
688
- *_parse_event_args(args.event),
757
+ *_parse_event_args(
758
+ args.event,
759
+ repo_slug=args.repo_slug,
760
+ team_id=args.team_id,
761
+ install_id=args.install_id,
762
+ ),
689
763
  *_spend_events(
690
764
  args.spend,
691
765
  repo_slug=args.repo_slug,
@@ -781,11 +855,23 @@ def main(argv: list[str] | None = None) -> int:
781
855
  print(render_cloud_doctor_text(report), end="")
782
856
  return 1 if report["failures"] else 0
783
857
  if args.command == "dogfood":
858
+ # Resolve the slug before loading window events so a slugless
859
+ # observation is filled from --repo-slug or the detected repo,
860
+ # exactly as dogfood_upload and repo-sync resolve it below.
861
+ dogfood_repo_slug = args.repo_slug or _detect_repo_slug(
862
+ args.repo_path.expanduser().resolve()
863
+ )
784
864
  result = _dogfood_upload(
785
865
  repo_path=args.repo_path,
786
866
  output_dir=args.output_dir,
787
867
  reports=_parse_report_args(args.report),
788
- events=_parse_event_args(args.event),
868
+ events=_parse_event_args(
869
+ args.event,
870
+ repo_slug=dogfood_repo_slug,
871
+ team_id=args.team_id,
872
+ install_id=args.install_id,
873
+ source=args.source,
874
+ ),
789
875
  spend_path=args.spend,
790
876
  repo_slug=args.repo_slug,
791
877
  team_id=args.team_id,
@@ -920,6 +1006,40 @@ def main(argv: list[str] | None = None) -> int:
920
1006
  elif result["status"] == "dry_run":
921
1007
  print("Network: skipped (pass --yes to upload)")
922
1008
  return 1 if result["status"] == "doctor_failed" else 0
1009
+ if args.command == "pr-outcomes":
1010
+ result = _pr_outcomes_upload(
1011
+ repo_path=args.repo_path,
1012
+ output_dir=args.output_dir,
1013
+ repo_slug=args.repo_slug,
1014
+ team_id=args.team_id,
1015
+ install_id=args.install_id,
1016
+ source=args.source,
1017
+ limit=args.limit,
1018
+ endpoint=args.endpoint,
1019
+ token_env=args.token_env,
1020
+ token_file=args.token_file,
1021
+ token_dir=args.token_dir,
1022
+ yes=args.yes,
1023
+ timeout=args.timeout,
1024
+ spend_path=args.spend,
1025
+ )
1026
+ if args.json:
1027
+ print(json.dumps(result, indent=2, sort_keys=True))
1028
+ else:
1029
+ print("Code Mower cloud PR outcomes")
1030
+ print(f"Status: {result['status']}")
1031
+ print(f"Repository: {result['repo_slug']}")
1032
+ print(f"PRs examined: {result.get('pr_count', 0)}")
1033
+ print(f"Events: {result['event_count']}")
1034
+ if result["status"] == "uploaded":
1035
+ print(f"Upload status: {result['upload']['status']}")
1036
+ elif result["status"] == "dry_run":
1037
+ print("Network: skipped (pass --yes to upload)")
1038
+ errors = result.get("errors") or []
1039
+ if errors:
1040
+ print(f"Validation errors: {len(errors)}")
1041
+ return 1 if result["status"] == "doctor_failed" else 0
1042
+
923
1043
  if args.command == "repo-sync":
924
1044
  result = _repo_sync_upload(
925
1045
  repo_specs=args.repo,
@@ -937,6 +1057,7 @@ def main(argv: list[str] | None = None) -> int:
937
1057
  include_git_ref=args.include_git_ref,
938
1058
  yes=args.yes,
939
1059
  timeout=args.timeout,
1060
+ events=args.event,
940
1061
  )
941
1062
  if args.json:
942
1063
  print(json.dumps(result, indent=2, sort_keys=True))
@@ -951,6 +1072,7 @@ def main(argv: list[str] | None = None) -> int:
951
1072
  current = summary.get("current_dogfood", {})
952
1073
  history = summary.get("imported_history", {})
953
1074
  reviewer = summary.get("reviewer_evidence", {})
1075
+ baseline = summary.get("productivity_baseline", {})
954
1076
  print(
955
1077
  "Current dogfood: "
956
1078
  f"{current.get('steps', 0)} steps, "
@@ -967,6 +1089,12 @@ def main(argv: list[str] | None = None) -> int:
967
1089
  f"{reviewer.get('steps', 0)} steps, "
968
1090
  f"{reviewer.get('events', 0)} events"
969
1091
  )
1092
+ print(
1093
+ "Productivity baseline: "
1094
+ f"{baseline.get('steps', 0)} steps, "
1095
+ f"{baseline.get('events', 0)} events "
1096
+ "(correlation only, no causal claims)"
1097
+ )
970
1098
  guidance = (
971
1099
  history.get("trust_guidance", {})
972
1100
  if isinstance(history, dict)