code-mower 1.0.15__tar.gz → 1.1.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 (431) hide show
  1. {code_mower-1.0.15 → code_mower-1.1.1}/PKG-INFO +19 -12
  2. {code_mower-1.0.15 → code_mower-1.1.1}/README.md +18 -11
  3. {code_mower-1.0.15 → code_mower-1.1.1}/pyproject.toml +1 -1
  4. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/__init__.py +1 -1
  5. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/antigravity_cli_audit_pr.py +46 -0
  6. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/board.py +33 -4
  7. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/campaign_adapters.py +14 -2
  8. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cli.py +3 -0
  9. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/config.py +186 -0
  10. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/controller.py +78 -5
  11. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/__init__.py +12 -0
  12. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/adoption.py +11 -1
  13. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/groups.py +1 -1
  14. code_mower-1.1.1/src/code_mower/doctor_checks/jira.py +914 -0
  15. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/runner.py +19 -0
  16. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/gemini_cli_audit_pr.py +49 -13
  17. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/init.py +102 -1
  18. code_mower-1.1.1/src/code_mower/jira_cloud.py +1754 -0
  19. code_mower-1.1.1/src/code_mower/jira_mutations.py +2456 -0
  20. code_mower-1.1.1/src/code_mower/jira_pr_sync.py +741 -0
  21. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/lane_status.py +82 -2
  22. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/package_manifest.py +10 -0
  23. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/provider_credentials.py +66 -6
  24. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/release_campaigns.py +507 -18
  25. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/release_qualify.py +25 -1
  26. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/code-mower.example.yml +36 -0
  27. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
  28. code_mower-1.1.1/src/code_mower/tracker_contract.py +320 -0
  29. code_mower-1.1.1/src/code_mower/tracker_queue.py +329 -0
  30. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower.egg-info/PKG-INFO +19 -12
  31. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower.egg-info/SOURCES.txt +16 -0
  32. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/builder-provenance.yml.j2 +1 -1
  33. code_mower-1.1.1/tests/test_antigravity_cli_audit_pr.py +395 -0
  34. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_board.py +19 -6
  35. code_mower-1.1.1/tests/test_campaign_gh_auth_and_issue_binding_817.py +902 -0
  36. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_devin_cli_audit_pr.py +7 -2
  37. code_mower-1.1.1/tests/test_jira_adoption.py +785 -0
  38. code_mower-1.1.1/tests/test_jira_cloud.py +2103 -0
  39. code_mower-1.1.1/tests/test_jira_mutations.py +2725 -0
  40. code_mower-1.1.1/tests/test_jira_pr_sync.py +921 -0
  41. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_lane_status.py +164 -1
  42. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_release_campaigns.py +455 -11
  43. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_release_hygiene.py +49 -47
  44. code_mower-1.1.1/tests/test_remote_qualification_failure_reason_819.py +116 -0
  45. code_mower-1.1.1/tests/test_tracker_config.py +181 -0
  46. code_mower-1.1.1/tests/test_tracker_contract.py +221 -0
  47. code_mower-1.1.1/tests/test_tracker_queue.py +681 -0
  48. {code_mower-1.0.15 → code_mower-1.1.1}/CODE_OF_CONDUCT.md +0 -0
  49. {code_mower-1.0.15 → code_mower-1.1.1}/LICENSE +0 -0
  50. {code_mower-1.0.15 → code_mower-1.1.1}/MANIFEST.in +0 -0
  51. {code_mower-1.0.15 → code_mower-1.1.1}/NOTICE +0 -0
  52. {code_mower-1.0.15 → code_mower-1.1.1}/SUPPORT.md +0 -0
  53. {code_mower-1.0.15 → code_mower-1.1.1}/requirements/requirements.txt +0 -0
  54. {code_mower-1.0.15 → code_mower-1.1.1}/setup.cfg +0 -0
  55. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/adapters/__init__.py +0 -0
  56. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/adapters/_base.py +0 -0
  57. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  58. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/adapters/gitar.py +0 -0
  59. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/adapters/greptile.py +0 -0
  60. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/adapters/qodo.py +0 -0
  61. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/antigravity_sdk_probe.py +0 -0
  62. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/audit_handoff_log.py +0 -0
  63. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/audit_labeler_lib.py +0 -0
  64. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/audit_limits.py +0 -0
  65. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/audit_progress.py +0 -0
  66. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/blind_review_artifacts.py +0 -0
  67. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/blind_review_coordinator.py +0 -0
  68. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/board_store.py +0 -0
  69. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/bootstrap.py +0 -0
  70. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/builder_experiment.py +0 -0
  71. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/builder_runs.py +0 -0
  72. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/__init__.py +0 -0
  73. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/arms.py +0 -0
  74. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/auto_discovery.py +0 -0
  75. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/commands.py +0 -0
  76. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/context_inputs.py +0 -0
  77. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/corpus.py +0 -0
  78. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/effect_report.py +0 -0
  79. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/evidence.py +0 -0
  80. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/evidence_report.py +0 -0
  81. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/identity.py +0 -0
  82. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/metrics.py +0 -0
  83. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/overlap.py +0 -0
  84. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/planning.py +0 -0
  85. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/policy.py +0 -0
  86. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/results.py +0 -0
  87. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/run_results.py +0 -0
  88. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/run_status.py +0 -0
  89. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/runner.py +0 -0
  90. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/truth.py +0 -0
  91. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/calibration/value_report.py +0 -0
  92. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/campaign_discovery.py +0 -0
  93. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/checks.py +0 -0
  94. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/claude_audit_pr.py +0 -0
  95. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/claude_cli_bounce.py +0 -0
  96. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/claude_cli_environment.py +0 -0
  97. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/clear_stale.py +0 -0
  98. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud.py +0 -0
  99. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/__init__.py +0 -0
  100. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/adoption_runs.py +0 -0
  101. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/bundle.py +0 -0
  102. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/doctor.py +0 -0
  103. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/dogfood.py +0 -0
  104. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/endpoints.py +0 -0
  105. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/errors.py +0 -0
  106. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/events.py +0 -0
  107. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/export.py +0 -0
  108. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/finding_outcomes.py +0 -0
  109. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/git_metadata.py +0 -0
  110. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/manifest.py +0 -0
  111. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/operations.py +0 -0
  112. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/pr_outcomes.py +0 -0
  113. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/productivity.py +0 -0
  114. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/productivity_windows.py +0 -0
  115. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/reports.py +0 -0
  116. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/setup.py +0 -0
  117. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/tokens.py +0 -0
  118. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/upload.py +0 -0
  119. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/cloud_client/work_types.py +0 -0
  120. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/code_mower_calibration.py +0 -0
  121. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/code_mower_context_packs.py +0 -0
  122. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/code_mower_merge.py +0 -0
  123. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/code_mower_telemetry.py +0 -0
  124. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  125. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/codex_audit_env_preflight.py +0 -0
  126. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/codex_audit_pr.py +0 -0
  127. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  128. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  129. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/decisions.py +0 -0
  130. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/devin_api.py +0 -0
  131. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/devin_cli_audit_pr.py +0 -0
  132. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor.py +0 -0
  133. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/audit_limits.py +0 -0
  134. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/campaign_auth.py +0 -0
  135. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/cloud.py +0 -0
  136. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/common.py +0 -0
  137. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github.py +0 -0
  138. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_actions.py +0 -0
  139. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  140. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  141. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  142. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  143. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  144. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  145. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  146. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  147. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_api.py +0 -0
  148. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_branch.py +0 -0
  149. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_config.py +0 -0
  150. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_human_token.py +0 -0
  151. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_provider.py +0 -0
  152. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_repo.py +0 -0
  153. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
  154. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/models.py +0 -0
  155. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/output.py +0 -0
  156. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/presets.py +0 -0
  157. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/privacy.py +0 -0
  158. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  159. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  160. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  161. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_env.py +0 -0
  162. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  163. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  164. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
  165. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  166. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  167. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  168. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  169. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  170. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  171. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  172. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  173. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  174. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/providers.py +0 -0
  175. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/registry.py +0 -0
  176. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/runtime.py +0 -0
  177. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  178. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
  179. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/doctor_checks/supervised_pilot.py +0 -0
  180. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/file_locks.py +0 -0
  181. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/gate_health.py +0 -0
  182. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/git_identity.py +0 -0
  183. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/grok_build_audit_pr.py +0 -0
  184. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  185. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/lane_configs/__init__.py +0 -0
  186. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/lane_configs/aider.py +0 -0
  187. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  188. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/lane_configs/claude.py +0 -0
  189. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/lane_configs/codex.py +0 -0
  190. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/lane_configs/devin.py +0 -0
  191. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/lane_configs/devin_cli.py +0 -0
  192. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  193. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/lane_configs/grok_build.py +0 -0
  194. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  195. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/lane_configs/local_llm.py +0 -0
  196. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/lane_configs/muse_cli.py +0 -0
  197. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/lane_delivery.py +0 -0
  198. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/local_llm_audit_pr.py +0 -0
  199. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/local_llm_bakeoff.py +0 -0
  200. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/local_llm_calibration.py +0 -0
  201. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/local_llm_profiles.py +0 -0
  202. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/migration.py +0 -0
  203. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/migration_install.py +0 -0
  204. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/migration_mirror.py +0 -0
  205. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/migration_readiness.py +0 -0
  206. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/migration_rehearsal.py +0 -0
  207. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/muse_cli_audit_pr.py +0 -0
  208. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/next_steps.py +0 -0
  209. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/package.py +0 -0
  210. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/package_content.py +0 -0
  211. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/package_paths.py +0 -0
  212. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/package_rendering.py +0 -0
  213. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/package_static.py +0 -0
  214. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/participants.py +0 -0
  215. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/plan_context.py +0 -0
  216. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/productivity_report.py +0 -0
  217. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/prompts.py +0 -0
  218. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/provider_registry.py +0 -0
  219. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/provider_runners/__init__.py +0 -0
  220. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/provider_runners/comments.py +0 -0
  221. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/provider_runners/exit_codes.py +0 -0
  222. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/provider_runners/git.py +0 -0
  223. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/provider_runners/github_auth.py +0 -0
  224. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/provider_runners/github_pr.py +0 -0
  225. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  226. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/provider_runners/process.py +0 -0
  227. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/provider_runners/repo_paths.py +0 -0
  228. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/provider_runners/text_schema.py +0 -0
  229. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  230. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/provider_runners/workspace.py +0 -0
  231. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/providers/__init__.py +0 -0
  232. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/providers/local_cli.py +0 -0
  233. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/providers/provenance.py +0 -0
  234. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/release_readiness.py +0 -0
  235. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/reviewer_metrics.py +0 -0
  236. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/reviewer_spend.py +0 -0
  237. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/saas_reviewer_labeler.py +0 -0
  238. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/secrets.py +0 -0
  239. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/session.py +0 -0
  240. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/builder-experiment.example.json +0 -0
  241. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  242. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/calibration-corpus.json +0 -0
  243. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/context-packs.example.json +0 -0
  244. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  245. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  246. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  247. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  248. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  249. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  250. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  251. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
  252. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  253. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lanes/README.md +0 -0
  254. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lanes/claude.md +0 -0
  255. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lanes/codex.md +0 -0
  256. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lanes/cursor.md +0 -0
  257. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lanes/devin.md +0 -0
  258. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lanes/generic.md +0 -0
  259. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
  260. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/product-support/code_mower +0 -0
  261. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  262. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  263. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  264. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  265. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/product-support/run_devin_cli_audit_pr.sh +0 -0
  266. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  267. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/product-support/status_report.py +0 -0
  268. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/providers.yml +0 -0
  269. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  270. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  271. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  272. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  273. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  274. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  275. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
  276. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  277. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  278. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  279. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  280. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
  281. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  282. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  283. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  284. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  285. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  286. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
  287. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/trailer_comment_labeler.py +0 -0
  288. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/versioning.py +0 -0
  289. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/work_orders.py +0 -0
  290. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower/workflow_actionlint.py +0 -0
  291. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower.egg-info/dependency_links.txt +0 -0
  292. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower.egg-info/entry_points.txt +0 -0
  293. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower.egg-info/requires.txt +0 -0
  294. {code_mower-1.0.15 → code_mower-1.1.1}/src/code_mower.egg-info/top_level.txt +0 -0
  295. {code_mower-1.0.15 → code_mower-1.1.1}/templates/builder-experiment.example.json +0 -0
  296. {code_mower-1.0.15 → code_mower-1.1.1}/templates/calibration-corpus.example.json +0 -0
  297. {code_mower-1.0.15 → code_mower-1.1.1}/templates/calibration-corpus.json +0 -0
  298. {code_mower-1.0.15 → code_mower-1.1.1}/templates/code-mower.yml.j2 +0 -0
  299. {code_mower-1.0.15 → code_mower-1.1.1}/templates/context-packs.example.json +0 -0
  300. {code_mower-1.0.15 → code_mower-1.1.1}/templates/cursor/BUGBOT.md +0 -0
  301. {code_mower-1.0.15 → code_mower-1.1.1}/templates/lanes/README.md +0 -0
  302. {code_mower-1.0.15 → code_mower-1.1.1}/templates/lanes/claude.md +0 -0
  303. {code_mower-1.0.15 → code_mower-1.1.1}/templates/lanes/codex.md +0 -0
  304. {code_mower-1.0.15 → code_mower-1.1.1}/templates/lanes/cursor.md +0 -0
  305. {code_mower-1.0.15 → code_mower-1.1.1}/templates/lanes/devin.md +0 -0
  306. {code_mower-1.0.15 → code_mower-1.1.1}/templates/lanes/generic.md +0 -0
  307. {code_mower-1.0.15 → code_mower-1.1.1}/templates/lanes/run_mac_lane.sh +0 -0
  308. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/acp_bridge.yml +0 -0
  309. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/aider.yml +0 -0
  310. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/antigravity_cli.yml +0 -0
  311. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/claude_audit.yml +0 -0
  312. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/claude_review.yml +0 -0
  313. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/coderabbit_cli.yml +0 -0
  314. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/codex.yml +0 -0
  315. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/cursor_bugbot.yml +0 -0
  316. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/cursor_cloud_agent.yml +0 -0
  317. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/devin.yml +0 -0
  318. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/devin_cli.yml +0 -0
  319. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/gemini_cli.yml +0 -0
  320. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/gitar.yml +0 -0
  321. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/greptile.yml +0 -0
  322. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/hermes_cli.yml +0 -0
  323. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/local_llm.yml +0 -0
  324. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/muse_cli.yml +0 -0
  325. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers/qodo.yml +0 -0
  326. {code_mower-1.0.15 → code_mower-1.1.1}/templates/providers.yml +0 -0
  327. {code_mower-1.0.15 → code_mower-1.1.1}/templates/reviewer-spend.example.json +0 -0
  328. {code_mower-1.0.15 → code_mower-1.1.1}/templates/reviewer-value-report.example.md +0 -0
  329. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  330. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  331. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  332. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  333. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  334. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/code-mower-gate.yml.j2 +0 -0
  335. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  336. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  337. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  338. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  339. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  340. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  341. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  342. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  343. {code_mower-1.0.15 → code_mower-1.1.1}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  344. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_adoption_diagnostics.py +0 -0
  345. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_adoption_result_semantics.py +0 -0
  346. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_adoption_run_contract.py +0 -0
  347. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_antigravity_sdk_probe.py +0 -0
  348. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_audit_comment_posture.py +0 -0
  349. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_audit_limits.py +0 -0
  350. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_builder_experiment.py +0 -0
  351. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_builder_identity.py +0 -0
  352. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_builder_runs.py +0 -0
  353. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_calibration_effect_report.py +0 -0
  354. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_calibration_truth.py +0 -0
  355. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_campaign_adapters.py +0 -0
  356. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_campaign_discovery.py +0 -0
  357. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_campaign_retry_evidence_711.py +0 -0
  358. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_checks.py +0 -0
  359. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_claude_audit_pr.py +0 -0
  360. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_claude_cli_bounce.py +0 -0
  361. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_clear_stale.py +0 -0
  362. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_cloud_client.py +0 -0
  363. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_cloud_git_metadata.py +0 -0
  364. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_cloud_manifest.py +0 -0
  365. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_cloud_reports.py +0 -0
  366. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  367. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_codex_audit_env_preflight.py +0 -0
  368. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_codex_audit_pr.py +0 -0
  369. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_controller.py +0 -0
  370. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_decision_audit_integration.py +0 -0
  371. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_decisions.py +0 -0
  372. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_devin_api.py +0 -0
  373. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_devin_builder_lane.py +0 -0
  374. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_devin_provider_contract.py +0 -0
  375. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_actions_cost_summary.py +0 -0
  376. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_actions_failure_selection.py +0 -0
  377. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_boundaries.py +0 -0
  378. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_campaign_auth.py +0 -0
  379. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_campaign_readiness.py +0 -0
  380. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_github_checks.py +0 -0
  381. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_output.py +0 -0
  382. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_privacy.py +0 -0
  383. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_provider_env_required.py +0 -0
  384. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_provider_env_tokens.py +0 -0
  385. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_provider_local_audit_setup.py +0 -0
  386. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_provider_probe.py +0 -0
  387. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_provider_review_hygiene.py +0 -0
  388. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_registry.py +0 -0
  389. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_runtime.py +0 -0
  390. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_self_hosted_runner.py +0 -0
  391. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_doctor_supervised_pilot.py +0 -0
  392. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_file_locks.py +0 -0
  393. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_fork_pr_guard.py +0 -0
  394. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_gate_automerge.py +0 -0
  395. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_gate_health.py +0 -0
  396. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_hosted_dispatch_profile.py +0 -0
  397. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_init_actionlint.py +0 -0
  398. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_init_build_loop.py +0 -0
  399. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_lane_delivery_contract.py +0 -0
  400. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_local_llm_github_helpers.py +0 -0
  401. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_migration_rehearsal.py +0 -0
  402. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_migration_setup_drift.py +0 -0
  403. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_next_steps.py +0 -0
  404. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_package_install_failure_taxonomy.py +0 -0
  405. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_participant_sessions.py +0 -0
  406. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_plan_context.py +0 -0
  407. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_pr_outcome_contract.py +0 -0
  408. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_pr_outcome_coverage.py +0 -0
  409. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_productivity_metrics_contract.py +0 -0
  410. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_productivity_report.py +0 -0
  411. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_productivity_windows.py +0 -0
  412. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_prompts.py +0 -0
  413. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_provider_credentials.py +0 -0
  414. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_provider_fixture_contracts.py +0 -0
  415. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_provider_local_cli.py +0 -0
  416. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_provider_runners_comments.py +0 -0
  417. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_provider_runners_git.py +0 -0
  418. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_provider_runners_github_pr.py +0 -0
  419. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_provider_runners_pr_worktree.py +0 -0
  420. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_provider_runners_process.py +0 -0
  421. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_provider_runners_repo_paths.py +0 -0
  422. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_provider_runners_text_schema.py +0 -0
  423. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_provider_runners_workspace.py +0 -0
  424. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_release_qualify.py +0 -0
  425. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_reviewer_finding_outcome_contract.py +0 -0
  426. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_reviewer_metrics_core.py +0 -0
  427. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_reviewer_spend.py +0 -0
  428. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_supervised_pilot_contract.py +0 -0
  429. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_trailer_comment_labeler.py +0 -0
  430. {code_mower-1.0.15 → code_mower-1.1.1}/tests/test_work_orders.py +0 -0
  431. {code_mower-1.0.15 → code_mower-1.1.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.0.15
3
+ Version: 1.1.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
@@ -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.15/docs/try-in-10-minutes.md)
248
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.1/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,13 +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.
309
- The v1.0.15 release makes measurement and release operations more trustworthy:
310
- productivity reports prefer live GitHub current state while retaining clearly
311
- labeled historical Board observations, release campaigns can discover trusted
312
- results on their explicitly linked release PR, provider credentials survive
313
- restarts through fail-closed profiles, and new metadata-only contracts cover
314
- reviewer finding outcomes, normalized productivity windows, and PR cost
315
- coverage.
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.
316
319
  Package-only users can start from the public package rather than a source
317
320
  checkout.
318
321
 
@@ -345,7 +348,7 @@ Provider-contract baseline for the next release train:
345
348
 
346
349
  For release verification,
347
350
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
348
- the package-index procedure for `v1.0.15` / `code-mower==1.0.15`. The
351
+ the package-index procedure for `v1.1.1` / `code-mower==1.1.1`. The
349
352
  GitHub release records the workflow and rehearsal evidence for the exact tag.
350
353
  After publication, [Release Qualification](docs/release-qualification.md)
351
354
  coordinates provider-specific install and operational checks without treating
@@ -539,8 +542,8 @@ measurement work.
539
542
 
540
543
  ## Installation Status
541
544
 
542
- The current package-index release baseline is `v1.0.15`, with pinned package
543
- install spec `code-mower==1.0.15`. Release evidence is recorded on the GitHub
545
+ The current package-index release baseline is `v1.1.1`, with pinned package
546
+ install spec `code-mower==1.1.1`. Release evidence is recorded on the GitHub
544
547
  release and in the first-user install rehearsal. The public repository is
545
548
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
546
549
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -599,6 +602,8 @@ first so local work exercises the same package entrypoint users install.
599
602
  - [Provider Matrix](docs/provider-matrix.md)
600
603
  - [Provider Calibration Scorecard](docs/provider-calibration-scorecard.md)
601
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)
602
607
  - [First Run Transcript](docs/first-run-transcript.md)
603
608
  - [First-User Demo Transcript](docs/first-user-demo-transcript.md)
604
609
  - [First-User Install Rehearsal](docs/first-user-install-rehearsal.md)
@@ -624,6 +629,8 @@ first so local work exercises the same package entrypoint users install.
624
629
  - [v1.0.13 Release Notes](docs/v1013-release-notes.md)
625
630
  - [v1.0.14 Release Notes](docs/v1014-release-notes.md)
626
631
  - [v1.0.15 Release Notes](docs/v1015-release-notes.md)
632
+ - [v1.1.1 Release Notes](docs/v111-release-notes.md)
633
+ - [v1.1 Release Notes](docs/v11-release-notes.md)
627
634
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
628
635
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
629
636
  - [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.15/docs/try-in-10-minutes.md)
218
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.1/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,13 +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.
279
- The v1.0.15 release makes measurement and release operations more trustworthy:
280
- productivity reports prefer live GitHub current state while retaining clearly
281
- labeled historical Board observations, release campaigns can discover trusted
282
- results on their explicitly linked release PR, provider credentials survive
283
- restarts through fail-closed profiles, and new metadata-only contracts cover
284
- reviewer finding outcomes, normalized productivity windows, and PR cost
285
- coverage.
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.
286
289
  Package-only users can start from the public package rather than a source
287
290
  checkout.
288
291
 
@@ -315,7 +318,7 @@ Provider-contract baseline for the next release train:
315
318
 
316
319
  For release verification,
317
320
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
318
- the package-index procedure for `v1.0.15` / `code-mower==1.0.15`. The
321
+ the package-index procedure for `v1.1.1` / `code-mower==1.1.1`. The
319
322
  GitHub release records the workflow and rehearsal evidence for the exact tag.
320
323
  After publication, [Release Qualification](docs/release-qualification.md)
321
324
  coordinates provider-specific install and operational checks without treating
@@ -509,8 +512,8 @@ measurement work.
509
512
 
510
513
  ## Installation Status
511
514
 
512
- The current package-index release baseline is `v1.0.15`, with pinned package
513
- install spec `code-mower==1.0.15`. Release evidence is recorded on the GitHub
515
+ The current package-index release baseline is `v1.1.1`, with pinned package
516
+ install spec `code-mower==1.1.1`. Release evidence is recorded on the GitHub
514
517
  release and in the first-user install rehearsal. The public repository is
515
518
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
516
519
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -569,6 +572,8 @@ first so local work exercises the same package entrypoint users install.
569
572
  - [Provider Matrix](docs/provider-matrix.md)
570
573
  - [Provider Calibration Scorecard](docs/provider-calibration-scorecard.md)
571
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)
572
577
  - [First Run Transcript](docs/first-run-transcript.md)
573
578
  - [First-User Demo Transcript](docs/first-user-demo-transcript.md)
574
579
  - [First-User Install Rehearsal](docs/first-user-install-rehearsal.md)
@@ -594,6 +599,8 @@ first so local work exercises the same package entrypoint users install.
594
599
  - [v1.0.13 Release Notes](docs/v1013-release-notes.md)
595
600
  - [v1.0.14 Release Notes](docs/v1014-release-notes.md)
596
601
  - [v1.0.15 Release Notes](docs/v1015-release-notes.md)
602
+ - [v1.1.1 Release Notes](docs/v111-release-notes.md)
603
+ - [v1.1 Release Notes](docs/v11-release-notes.md)
597
604
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
598
605
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
599
606
  - [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.15"
7
+ version = "1.1.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.0.15"
3
+ __version__ = "1.1.1"
@@ -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
@@ -604,8 +604,20 @@ def build_qualification_prompt(
604
604
  else "runtime_class is python_<major>.<minor>; provider and"
605
605
  ),
606
606
  "executor are lowercase safe identifiers; steps is a non-empty list of",
607
- "{id, status, elapsed_seconds, warning_count, owner_action_count} with",
608
- "id one of board, doctor, lanes_status, overhead, package_install or a namespaced",
607
+ "{id, status, elapsed_seconds, warning_count, owner_action_count} with an",
608
+ "optional failure_reason on a failed package_install step and nowhere else.",
609
+ "A failed package_install step must carry exactly one failure_reason:",
610
+ "network for connection or TLS failures (connection refused, timeout,",
611
+ "DNS, SSL or certificate validation), package_index for a missing version",
612
+ "or 404 from the package index, runtime for Python or dependency",
613
+ "incompatibility (unsupported Python version, missing module, conflicting",
614
+ "dependencies), sandbox_permission for permission, disk, or sandbox",
615
+ "denials (permission denied, disk full, read-only filesystem). Use",
616
+ "unknown only for a command that was actually attempted and cannot be",
617
+ "classified from local diagnostics. Report only the closed reason word;",
618
+ "never include raw output, logs, paths, commands, source, diffs,",
619
+ "transcripts, or secrets. Step id is",
620
+ "one of board, doctor, lanes_status, overhead, package_install or a namespaced",
609
621
  "<namespace>__<name> provider extension (both halves lowercase safe",
610
622
  "identifiers); any other id is rejected. Status is one of",
611
623
  "pass, fail, warn, unavailable, planned. A step with a",
@@ -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
 
@@ -21,8 +21,10 @@ if __package__ in {None, "", "tools"}:
21
21
  from tools import audit_limits
22
22
  except ImportError: # pragma: no cover - direct script execution fallback.
23
23
  import audit_limits # type: ignore
24
+ import tracker_contract # type: ignore
24
25
  else: # pragma: no cover - exercised after package extraction.
25
26
  from . import audit_limits
27
+ from . import tracker_contract
26
28
 
27
29
 
28
30
  ALLOWED_LANE_TYPES = {"audit", "review"}
@@ -513,6 +515,188 @@ def required_secret_entries_for_lane(lane: Mapping[str, Any]) -> tuple[str, ...]
513
515
  return tuple(secrets)
514
516
 
515
517
 
518
+ def _validate_tracker_jira_cloud(
519
+ jira_cloud: Any,
520
+ issues: list[ConfigIssue],
521
+ ) -> None:
522
+ path = "tracker.jira_cloud"
523
+ jira_map = _as_mapping(jira_cloud, path, issues)
524
+ site_url = _require_string(jira_map.get("site_url"), f"{path}.site_url", issues)
525
+ if site_url is not None and not site_url.startswith("https://"):
526
+ issues.append(ConfigIssue(f"{path}.site_url", "must be an HTTPS Jira Cloud site URL"))
527
+ _require_string(jira_map.get("cloud_id"), f"{path}.cloud_id", issues)
528
+ _require_string(jira_map.get("project_id"), f"{path}.project_id", issues)
529
+ if jira_map.get("project_key") is not None:
530
+ _require_identifier(jira_map.get("project_key"), f"{path}.project_key", issues)
531
+ if jira_map.get("issue_type_id") is not None:
532
+ _require_string(jira_map.get("issue_type_id"), f"{path}.issue_type_id", issues)
533
+ if jira_map.get("jql") is not None:
534
+ jql = _require_string(jira_map.get("jql"), f"{path}.jql", issues)
535
+ if jql is not None and (len(jql) > 2000 or "\n" in jql or "\r" in jql):
536
+ issues.append(ConfigIssue(f"{path}.jql", "must be a single line of at most 2000 characters"))
537
+
538
+ status_category_map = jira_map.get("status_category_map")
539
+ if status_category_map is not None:
540
+ category_path = f"{path}.status_category_map"
541
+ for category, status_ids in _as_mapping(status_category_map, category_path, issues).items():
542
+ if category not in tracker_contract.LIFECYCLE_CATEGORIES:
543
+ issues.append(
544
+ ConfigIssue(
545
+ f"{category_path}.{category}",
546
+ f"must be one of {sorted(tracker_contract.LIFECYCLE_CATEGORIES)}",
547
+ )
548
+ )
549
+ for index, status_id in enumerate(
550
+ _as_sequence(status_ids, f"{category_path}.{category}", issues)
551
+ ):
552
+ if not isinstance(status_id, str) or not status_id:
553
+ issues.append(
554
+ ConfigIssue(
555
+ f"{category_path}.{category}[{index}]",
556
+ "must be a non-empty string status id",
557
+ )
558
+ )
559
+
560
+ field_mappings = jira_map.get("field_mappings")
561
+ if field_mappings is not None:
562
+ mapping_path = f"{path}.field_mappings"
563
+ for target, source_field_id in _as_mapping(field_mappings, mapping_path, issues).items():
564
+ if target not in tracker_contract.SAFE_FIELD_MAPPING_TARGETS:
565
+ issues.append(
566
+ ConfigIssue(
567
+ f"{mapping_path}.{target}",
568
+ "must map to a safe normalized contract field: "
569
+ f"{sorted(tracker_contract.SAFE_FIELD_MAPPING_TARGETS)}",
570
+ )
571
+ )
572
+ _require_string(source_field_id, f"{mapping_path}.{target}", issues)
573
+
574
+ mutations = jira_map.get("mutations")
575
+ if mutations is not None:
576
+ mutation_path = f"{path}.mutations"
577
+ mutation_map = _as_mapping(mutations, mutation_path, issues)
578
+ extra_mutation_keys = set(mutation_map) - {
579
+ "writes_enabled",
580
+ "allowed_operations",
581
+ "transitions",
582
+ }
583
+ for key in extra_mutation_keys:
584
+ issues.append(
585
+ ConfigIssue(
586
+ f"{mutation_path}.{key}",
587
+ "must be writes_enabled, allowed_operations, or transitions",
588
+ )
589
+ )
590
+ if "writes_enabled" in mutation_map and not isinstance(
591
+ mutation_map.get("writes_enabled"), bool
592
+ ):
593
+ issues.append(ConfigIssue(f"{mutation_path}.writes_enabled", "must be true or false"))
594
+ allowed_operations = mutation_map.get("allowed_operations")
595
+ if allowed_operations is not None:
596
+ for index, operation in enumerate(
597
+ _as_sequence(allowed_operations, f"{mutation_path}.allowed_operations", issues)
598
+ ):
599
+ if operation not in tracker_contract.ALLOWED_MUTATION_OPERATIONS:
600
+ issues.append(
601
+ ConfigIssue(
602
+ f"{mutation_path}.allowed_operations[{index}]",
603
+ "must be one of "
604
+ f"{sorted(tracker_contract.ALLOWED_MUTATION_OPERATIONS)}",
605
+ )
606
+ )
607
+ transitions = mutation_map.get("transitions")
608
+ if transitions is not None:
609
+ # Write transitions are configured by immutable transition id and
610
+ # re-verified against the live issue before any apply.
611
+ transition_path = f"{mutation_path}.transitions"
612
+ for category, transition_id in _as_mapping(
613
+ transitions, transition_path, issues
614
+ ).items():
615
+ if category not in tracker_contract.LIFECYCLE_CATEGORIES:
616
+ issues.append(
617
+ ConfigIssue(
618
+ f"{transition_path}.{category}",
619
+ "must be one of "
620
+ f"{sorted(tracker_contract.LIFECYCLE_CATEGORIES)}",
621
+ )
622
+ )
623
+ continue
624
+ if not isinstance(transition_id, str) or not re.fullmatch(
625
+ r"[0-9]{1,32}", transition_id
626
+ ):
627
+ issues.append(
628
+ ConfigIssue(
629
+ f"{transition_path}.{category}",
630
+ "must be a numeric Jira transition id string",
631
+ )
632
+ )
633
+
634
+ sync = jira_map.get("sync")
635
+ if sync is not None:
636
+ sync_path = f"{path}.sync"
637
+ sync_map = _as_mapping(sync, sync_path, issues)
638
+ for key in set(sync_map) - {"trusted_pr_authors"}:
639
+ issues.append(
640
+ ConfigIssue(
641
+ f"{sync_path}.{key}",
642
+ "must be trusted_pr_authors",
643
+ )
644
+ )
645
+ if "trusted_pr_authors" in sync_map:
646
+ _validate_github_login_items(
647
+ sync_map.get("trusted_pr_authors"),
648
+ f"{sync_path}.trusted_pr_authors",
649
+ issues,
650
+ )
651
+
652
+ extra_keys = set(jira_map) - {
653
+ "site_url",
654
+ "cloud_id",
655
+ "project_id",
656
+ "project_key",
657
+ "issue_type_id",
658
+ "jql",
659
+ "status_category_map",
660
+ "field_mappings",
661
+ "mutations",
662
+ "sync",
663
+ }
664
+ for key in extra_keys:
665
+ issues.append(ConfigIssue(f"{path}.{key}", "unknown tracker.jira_cloud configuration key"))
666
+
667
+
668
+ def _validate_tracker(tracker: Any, issues: list[ConfigIssue]) -> None:
669
+ if tracker is None:
670
+ return
671
+ tracker_map = _as_mapping(tracker, "tracker", issues)
672
+ extra_keys = set(tracker_map) - {"kind", "jira_cloud"}
673
+ for key in extra_keys:
674
+ issues.append(ConfigIssue(f"tracker.{key}", "unknown tracker configuration key"))
675
+
676
+ kind = tracker_map.get("kind", "github")
677
+ if kind not in tracker_contract.TRACKER_KINDS:
678
+ issues.append(
679
+ ConfigIssue("tracker.kind", f"must be one of {sorted(tracker_contract.TRACKER_KINDS)}")
680
+ )
681
+ return
682
+
683
+ jira_cloud = tracker_map.get("jira_cloud")
684
+ if kind == "jira_cloud":
685
+ if jira_cloud is None:
686
+ issues.append(
687
+ ConfigIssue(
688
+ "tracker.jira_cloud",
689
+ "jira_cloud kind requires a tracker.jira_cloud block",
690
+ )
691
+ )
692
+ else:
693
+ _validate_tracker_jira_cloud(jira_cloud, issues)
694
+ elif jira_cloud is not None:
695
+ issues.append(
696
+ ConfigIssue("tracker.jira_cloud", "must be omitted unless tracker.kind is jira_cloud")
697
+ )
698
+
699
+
516
700
  def validate_config(config: Mapping[str, Any]) -> list[ConfigIssue]:
517
701
  issues: list[ConfigIssue] = []
518
702
  if config.get("version") not in {1, "1"}:
@@ -568,6 +752,8 @@ def validate_config(config: Mapping[str, Any]) -> list[ConfigIssue]:
568
752
  _require_string(str(key), f"{section_path}.{key}", issues)
569
753
  _require_identifier(lane_name, f"{section_path}.{key}", issues)
570
754
 
755
+ _validate_tracker(config.get("tracker"), issues)
756
+
571
757
  owner_surface = config.get("owner_surface")
572
758
  if owner_surface is not None:
573
759
  owner_surface_map = _as_mapping(owner_surface, "owner_surface", issues)