code-mower 0.9.3b1__tar.gz → 1.0.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 (360) hide show
  1. {code_mower-0.9.3b1 → code_mower-1.0.0}/PKG-INFO +43 -14
  2. {code_mower-0.9.3b1 → code_mower-1.0.0}/README.md +42 -13
  3. {code_mower-0.9.3b1 → code_mower-1.0.0}/pyproject.toml +1 -1
  4. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/__init__.py +1 -1
  5. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/board.py +203 -0
  6. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/arms.py +1 -0
  7. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/planning.py +1 -0
  8. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cli.py +8 -0
  9. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/bundle.py +4 -0
  10. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/events.py +113 -0
  11. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/code_mower_telemetry.py +19 -3
  12. code_mower-1.0.0/src/code_mower/controller.py +816 -0
  13. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor.py +30 -0
  14. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/__init__.py +18 -0
  15. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github.py +20 -2
  16. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_branch.py +9 -1
  17. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_human_token.py +123 -4
  18. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_repo.py +31 -5
  19. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/groups.py +3 -0
  20. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/models.py +67 -3
  21. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/output.py +25 -2
  22. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/registry.py +12 -0
  23. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/runner.py +16 -0
  24. code_mower-1.0.0/src/code_mower/doctor_checks/supervised_pilot.py +434 -0
  25. code_mower-1.0.0/src/code_mower/lane_configs/muse_cli.py +35 -0
  26. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/migration.py +207 -8
  27. code_mower-1.0.0/src/code_mower/muse_cli_audit_pr.py +502 -0
  28. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/package_content.py +1 -0
  29. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/package_manifest.py +8 -0
  30. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_registry.py +39 -0
  31. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/code-mower.example.yml +38 -1
  32. {code_mower-0.9.3b1 → code_mower-1.0.0/src/code_mower}/templates/providers.yml +38 -1
  33. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
  34. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/versioning.py +7 -1
  35. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower.egg-info/PKG-INFO +43 -14
  36. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower.egg-info/SOURCES.txt +8 -0
  37. code_mower-1.0.0/templates/providers/muse_cli.yml +35 -0
  38. {code_mower-0.9.3b1/src/code_mower → code_mower-1.0.0}/templates/providers.yml +38 -1
  39. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/builder-provenance.yml.j2 +1 -1
  40. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_board.py +93 -0
  41. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_clear_stale.py +8 -0
  42. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_cloud_client.py +75 -0
  43. code_mower-1.0.0/tests/test_controller.py +466 -0
  44. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_boundaries.py +1 -0
  45. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_github_checks.py +108 -0
  46. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_output.py +89 -0
  47. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_registry.py +78 -1
  48. code_mower-1.0.0/tests/test_doctor_supervised_pilot.py +338 -0
  49. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_init_build_loop.py +23 -0
  50. code_mower-1.0.0/tests/test_migration_setup_drift.py +162 -0
  51. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_fixture_contracts.py +38 -2
  52. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_local_cli.py +214 -1
  53. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_release_hygiene.py +208 -61
  54. code_mower-1.0.0/tests/test_supervised_pilot_contract.py +61 -0
  55. code_mower-0.9.3b1/tests/test_migration_setup_drift.py +0 -82
  56. {code_mower-0.9.3b1 → code_mower-1.0.0}/CODE_OF_CONDUCT.md +0 -0
  57. {code_mower-0.9.3b1 → code_mower-1.0.0}/LICENSE +0 -0
  58. {code_mower-0.9.3b1 → code_mower-1.0.0}/MANIFEST.in +0 -0
  59. {code_mower-0.9.3b1 → code_mower-1.0.0}/NOTICE +0 -0
  60. {code_mower-0.9.3b1 → code_mower-1.0.0}/SUPPORT.md +0 -0
  61. {code_mower-0.9.3b1 → code_mower-1.0.0}/requirements/requirements.txt +0 -0
  62. {code_mower-0.9.3b1 → code_mower-1.0.0}/setup.cfg +0 -0
  63. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/adapters/__init__.py +0 -0
  64. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/adapters/_base.py +0 -0
  65. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  66. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/adapters/gitar.py +0 -0
  67. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/adapters/greptile.py +0 -0
  68. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/adapters/qodo.py +0 -0
  69. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  70. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/antigravity_sdk_probe.py +0 -0
  71. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/audit_handoff_log.py +0 -0
  72. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/audit_labeler_lib.py +0 -0
  73. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/audit_limits.py +0 -0
  74. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/audit_progress.py +0 -0
  75. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/blind_review_artifacts.py +0 -0
  76. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/blind_review_coordinator.py +0 -0
  77. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/board_store.py +0 -0
  78. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/bootstrap.py +0 -0
  79. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/builder_experiment.py +0 -0
  80. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/builder_runs.py +0 -0
  81. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/__init__.py +0 -0
  82. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/auto_discovery.py +0 -0
  83. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/commands.py +0 -0
  84. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/context_inputs.py +0 -0
  85. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/corpus.py +0 -0
  86. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/effect_report.py +0 -0
  87. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/evidence.py +0 -0
  88. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/evidence_report.py +0 -0
  89. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/identity.py +0 -0
  90. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/metrics.py +0 -0
  91. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/overlap.py +0 -0
  92. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/policy.py +0 -0
  93. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/results.py +0 -0
  94. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/run_results.py +0 -0
  95. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/run_status.py +0 -0
  96. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/runner.py +0 -0
  97. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/truth.py +0 -0
  98. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/value_report.py +0 -0
  99. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/checks.py +0 -0
  100. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/claude_audit_pr.py +0 -0
  101. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/claude_cli_bounce.py +0 -0
  102. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/claude_cli_environment.py +0 -0
  103. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/clear_stale.py +0 -0
  104. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud.py +0 -0
  105. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/__init__.py +0 -0
  106. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/doctor.py +0 -0
  107. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/dogfood.py +0 -0
  108. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/endpoints.py +0 -0
  109. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/errors.py +0 -0
  110. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/export.py +0 -0
  111. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/git_metadata.py +0 -0
  112. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/manifest.py +0 -0
  113. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/operations.py +0 -0
  114. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/reports.py +0 -0
  115. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/setup.py +0 -0
  116. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/tokens.py +0 -0
  117. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/upload.py +0 -0
  118. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/code_mower_calibration.py +0 -0
  119. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/code_mower_context_packs.py +0 -0
  120. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/code_mower_merge.py +0 -0
  121. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  122. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/codex_audit_env_preflight.py +0 -0
  123. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/codex_audit_pr.py +0 -0
  124. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  125. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  126. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/config.py +0 -0
  127. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/decisions.py +0 -0
  128. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/adoption.py +0 -0
  129. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/audit_limits.py +0 -0
  130. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/cloud.py +0 -0
  131. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/common.py +0 -0
  132. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions.py +0 -0
  133. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  134. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  135. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  136. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  137. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  138. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  139. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  140. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  141. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_api.py +0 -0
  142. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_config.py +0 -0
  143. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_provider.py +0 -0
  144. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
  145. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/presets.py +0 -0
  146. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/privacy.py +0 -0
  147. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  148. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  149. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  150. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_env.py +0 -0
  151. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  152. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  153. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
  154. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  155. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  156. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  157. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  158. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  159. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  160. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  161. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  162. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  163. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/providers.py +0 -0
  164. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/runtime.py +0 -0
  165. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  166. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
  167. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/gate_health.py +0 -0
  168. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  169. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/git_identity.py +0 -0
  170. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/grok_build_audit_pr.py +0 -0
  171. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  172. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/init.py +0 -0
  173. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/__init__.py +0 -0
  174. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/aider.py +0 -0
  175. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  176. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/claude.py +0 -0
  177. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/codex.py +0 -0
  178. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/devin.py +0 -0
  179. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  180. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/grok_build.py +0 -0
  181. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  182. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/local_llm.py +0 -0
  183. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_status.py +0 -0
  184. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/local_llm_audit_pr.py +0 -0
  185. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/local_llm_bakeoff.py +0 -0
  186. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/local_llm_calibration.py +0 -0
  187. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/local_llm_profiles.py +0 -0
  188. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/migration_install.py +0 -0
  189. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/migration_mirror.py +0 -0
  190. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/migration_readiness.py +0 -0
  191. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/migration_rehearsal.py +0 -0
  192. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/next_steps.py +0 -0
  193. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/package.py +0 -0
  194. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/package_paths.py +0 -0
  195. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/package_rendering.py +0 -0
  196. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/package_static.py +0 -0
  197. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/plan_context.py +0 -0
  198. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/prompts.py +0 -0
  199. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/__init__.py +0 -0
  200. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/comments.py +0 -0
  201. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/exit_codes.py +0 -0
  202. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/git.py +0 -0
  203. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/github_auth.py +0 -0
  204. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/github_pr.py +0 -0
  205. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  206. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/process.py +0 -0
  207. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/repo_paths.py +0 -0
  208. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/text_schema.py +0 -0
  209. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  210. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/workspace.py +0 -0
  211. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/providers/__init__.py +0 -0
  212. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/providers/local_cli.py +0 -0
  213. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/providers/provenance.py +0 -0
  214. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/release_readiness.py +0 -0
  215. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/reviewer_metrics.py +0 -0
  216. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/reviewer_spend.py +0 -0
  217. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/saas_reviewer_labeler.py +0 -0
  218. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/secrets.py +0 -0
  219. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/builder-experiment.example.json +0 -0
  220. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  221. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/calibration-corpus.json +0 -0
  222. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/context-packs.example.json +0 -0
  223. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  224. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  225. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  226. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  227. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  228. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  229. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  230. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
  231. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  232. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lanes/README.md +0 -0
  233. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lanes/claude.md +0 -0
  234. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lanes/codex.md +0 -0
  235. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lanes/cursor.md +0 -0
  236. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lanes/generic.md +0 -0
  237. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
  238. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/product-support/code_mower +0 -0
  239. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  240. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  241. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  242. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  243. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  244. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/product-support/status_report.py +0 -0
  245. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  246. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  247. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  248. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  249. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  250. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  251. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
  252. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  253. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  254. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  255. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  256. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
  257. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  258. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  259. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  260. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  261. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  262. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
  263. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/trailer_comment_labeler.py +0 -0
  264. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/work_orders.py +0 -0
  265. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/workflow_actionlint.py +0 -0
  266. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower.egg-info/dependency_links.txt +0 -0
  267. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower.egg-info/entry_points.txt +0 -0
  268. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower.egg-info/requires.txt +0 -0
  269. {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower.egg-info/top_level.txt +0 -0
  270. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/builder-experiment.example.json +0 -0
  271. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/calibration-corpus.example.json +0 -0
  272. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/calibration-corpus.json +0 -0
  273. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/code-mower.yml.j2 +0 -0
  274. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/context-packs.example.json +0 -0
  275. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/cursor/BUGBOT.md +0 -0
  276. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/lanes/README.md +0 -0
  277. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/lanes/claude.md +0 -0
  278. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/lanes/codex.md +0 -0
  279. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/lanes/cursor.md +0 -0
  280. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/lanes/generic.md +0 -0
  281. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/lanes/run_mac_lane.sh +0 -0
  282. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/acp_bridge.yml +0 -0
  283. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/aider.yml +0 -0
  284. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/antigravity_cli.yml +0 -0
  285. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/claude_audit.yml +0 -0
  286. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/claude_review.yml +0 -0
  287. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/coderabbit_cli.yml +0 -0
  288. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/codex.yml +0 -0
  289. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/cursor_bugbot.yml +0 -0
  290. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/devin.yml +0 -0
  291. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/gemini_cli.yml +0 -0
  292. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/gitar.yml +0 -0
  293. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/greptile.yml +0 -0
  294. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/hermes_cli.yml +0 -0
  295. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/local_llm.yml +0 -0
  296. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/qodo.yml +0 -0
  297. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/reviewer-spend.example.json +0 -0
  298. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/reviewer-value-report.example.md +0 -0
  299. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  300. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  301. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  302. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  303. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  304. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/code-mower-gate.yml.j2 +0 -0
  305. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  306. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  307. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  308. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  309. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  310. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  311. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  312. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  313. {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  314. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_antigravity_sdk_probe.py +0 -0
  315. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_audit_comment_posture.py +0 -0
  316. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_audit_limits.py +0 -0
  317. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_builder_experiment.py +0 -0
  318. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_builder_identity.py +0 -0
  319. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_builder_runs.py +0 -0
  320. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_calibration_effect_report.py +0 -0
  321. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_calibration_truth.py +0 -0
  322. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_checks.py +0 -0
  323. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_claude_audit_pr.py +0 -0
  324. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_claude_cli_bounce.py +0 -0
  325. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_cloud_git_metadata.py +0 -0
  326. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_cloud_manifest.py +0 -0
  327. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_cloud_reports.py +0 -0
  328. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  329. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_codex_audit_env_preflight.py +0 -0
  330. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_codex_audit_pr.py +0 -0
  331. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_decision_audit_integration.py +0 -0
  332. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_decisions.py +0 -0
  333. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_actions_cost_summary.py +0 -0
  334. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_actions_failure_selection.py +0 -0
  335. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_privacy.py +0 -0
  336. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_provider_env_required.py +0 -0
  337. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_provider_env_tokens.py +0 -0
  338. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_provider_local_audit_setup.py +0 -0
  339. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_provider_probe.py +0 -0
  340. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_provider_review_hygiene.py +0 -0
  341. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_runtime.py +0 -0
  342. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_self_hosted_runner.py +0 -0
  343. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_gate_health.py +0 -0
  344. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_init_actionlint.py +0 -0
  345. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_lane_status.py +0 -0
  346. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_local_llm_github_helpers.py +0 -0
  347. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_plan_context.py +0 -0
  348. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_prompts.py +0 -0
  349. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_comments.py +0 -0
  350. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_git.py +0 -0
  351. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_github_pr.py +0 -0
  352. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_pr_worktree.py +0 -0
  353. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_process.py +0 -0
  354. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_repo_paths.py +0 -0
  355. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_text_schema.py +0 -0
  356. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_workspace.py +0 -0
  357. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_reviewer_metrics_core.py +0 -0
  358. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_reviewer_spend.py +0 -0
  359. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_trailer_comment_labeler.py +0 -0
  360. {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_work_orders.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 0.9.3b1
3
+ Version: 1.0.0
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.12
@@ -66,6 +66,12 @@ first-run adoption gaps. `--preflight` remains the compatibility preset for
66
66
  older scripts; `--adoption` adds explicit repo targeting and setup guidance.
67
67
  Use `--hosted-builders` or `--orchestrator-only` when the current machine is
68
68
  observing/coordinating lanes and will not run local Codex or Claude wrappers.
69
+ For the v1.0 supervised pilot posture, run
70
+ `code-mower doctor --supervised-pilot --repo OWNER/REPO`; use
71
+ `--promoted-pilot` only when `code-mower/gate`, repository auto-merge, and a
72
+ merge-capable gate credential are ready to let green audits drive merge.
73
+ On a self-hosted Mac audit host, add `--runner` to include runner launch and
74
+ wrapper checks in the same proof.
69
75
 
70
76
  Example, shortened:
71
77
 
@@ -95,6 +101,13 @@ wrappers, run `code-mower migration setup-drift --repo-path .` before copying a
95
101
  fresh `.code-mower.generated` tree. It is read-only and reports path-level
96
102
  classifications (`same`, `differs`, `new`, `repo-only`,
97
103
  `missing-from-output`) without file contents or diffs.
104
+ If the repository already has builder or dispatch lanes, rerun setup drift with
105
+ the current builder set, for example `--builders codex,claude,cursor`, before
106
+ opening the reviewed upgrade PR.
107
+ If the report warns that the repo path may be incomplete, rerun it from the
108
+ full repository checkout before treating every generated file as new. If it
109
+ detects reviewer-lane files but no builder-dispatch files, pass `--builders`
110
+ only for repos that actually use builder lanes.
98
111
  Use [Upgrade An Existing Repository](docs/upgrade-existing-repo.md) for the
99
112
  reviewed PR flow, repo-only file handling, builder identity checks, and
100
113
  wrapper/pin drift checks.
@@ -124,7 +137,11 @@ checks Board inputs and local history without exposing local paths by default.
124
137
  `code-mower board reset --repo OWNER/REPO --yes` clears only the local Board
125
138
  history file. The Board also shows an owner queue, and it
126
139
  summarizes reviewer verdict history and spend/latency from local board events
127
- plus `.code-mower/reviewer-spend.json` when those files exist. Local agents can
140
+ plus `.code-mower/reviewer-spend.json` when those files exist. When
141
+ `code-mower.yml` is present, the Board also embeds a supervised-pilot controller
142
+ summary so the browser view shows the current decision, queue counts, reviewer
143
+ evidence, selected PR or issue, and next action from the same metadata-only
144
+ policy engine as `code-mower controller run`. Local agents can
128
145
  publish opt-in status cards by writing metadata-only JSON files to
129
146
  `.code-mower/board/agents/*.json`; the Board redacts local paths by default and
130
147
  does not upload those cards.
@@ -133,6 +150,12 @@ The local JSON contracts are documented in
133
150
  When a team wants the same operator picture on CodeMower.com, run
134
151
  `code-mower cloud board-snapshot --repo-slug OWNER/REPO --json` to inspect a
135
152
  zero-report, metadata-only mirror event, then add `--yes` only after review.
153
+ The v1.0 supervised-pilot automation and event boundary is defined in
154
+ [Supervised Pilot Contract](docs/supervised-pilot-contract.md).
155
+ As that controller lands, `code-mower controller run --repo OWNER/REPO` is the
156
+ dry-run-first policy check: it selects the current dispatch/merge/owner-action
157
+ decision from metadata, can write a sanitized event with `--event-file`, and
158
+ does not mutate GitHub state.
136
159
 
137
160
  ## See The Value Shape First
138
161
 
@@ -169,14 +192,19 @@ after reinstalling, especially when switching between pipx and uv.
169
192
  | 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) |
170
193
  | 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) |
171
194
 
195
+ When you ask another agent to install, upgrade, orchestrate, build, or review,
196
+ start from the universal prompt in
197
+ [Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md). It makes the
198
+ agent report its actual host posture, exact installed version, doctor result,
199
+ Board URL, and any owner-only click-list before it mutates the repo.
200
+
172
201
  The current package-index announcement entry point is the tagged
173
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.3-beta.1/docs/try-in-10-minutes.md)
174
- guide. The v0.9 beta includes the completed native Board work plus the adoption
175
- and upgrade hardening from recent install rehearsals; v0.9.3 keeps the path
176
- smooth by clarifying starter-package diagnostics, surfacing richer top-level
177
- lane status detail, showing Board version drift, and reporting standalone pin
178
- drift during existing-repo upgrades. Package-only users can start from the
179
- public package rather than a source checkout.
202
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.0.0/docs/try-in-10-minutes.md)
203
+ guide. The v1.0 supervised-pilot release includes the native Board, the
204
+ controller dry-run and policy contract, adoption and upgrade hardening from
205
+ recent install rehearsals, package-index release checks, provider-diversity
206
+ fixtures, and the universal orchestrator prompt pack. Package-only users can
207
+ start from the public package rather than a source checkout.
180
208
 
181
209
  ## What Calibration Does And Does Not Prove
182
210
 
@@ -207,7 +235,7 @@ Provider-contract baseline for the next release train:
207
235
 
208
236
  For release verification,
209
237
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
210
- the package-index procedure for `v0.9.3-beta.1` / `code-mower==0.9.3b1`. The
238
+ the package-index procedure for `v1.0.0` / `code-mower==1.0.0`. The
211
239
  GitHub release records the workflow and rehearsal evidence for the exact tag.
212
240
 
213
241
  ## Optional: Plan Before Coding
@@ -355,8 +383,8 @@ The first recommended lanes are local/manual:
355
383
  | Gitar | advisory third signal | informational until calibrated |
356
384
 
357
385
  Everything else starts manual or informational until your own calibration data
358
- proves it is useful: Antigravity/Gemini, Hermes, CodeRabbit CLI, Cursor BugBot,
359
- Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
386
+ proves it is useful: Antigravity/Gemini, Muse, Hermes, CodeRabbit CLI, Cursor
387
+ BugBot, Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
360
388
 
361
389
  Gemini CLI and Antigravity are distinct lane ids even though both are Google
362
390
  surfaces and may use Gemini model infrastructure. Keep their auth, model
@@ -393,8 +421,8 @@ measurement work.
393
421
 
394
422
  ## Installation Status
395
423
 
396
- The current package-index beta baseline is `v0.9.3-beta.1`, with pinned package
397
- install spec `code-mower==0.9.3b1`. Release evidence is recorded on the GitHub
424
+ The current package-index release baseline is `v1.0.0`, with pinned package
425
+ install spec `code-mower==1.0.0`. Release evidence is recorded on the GitHub
398
426
  release and in the first-user install rehearsal. The public repository is
399
427
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
400
428
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -459,6 +487,7 @@ first so local work exercises the same package entrypoint users install.
459
487
  - [v0.6 Release Notes](docs/v06-release-notes.md)
460
488
  - [v0.8 Release Notes](docs/v08-release-notes.md)
461
489
  - [v0.9 Release Notes](docs/v09-release-notes.md)
490
+ - [v1.0 Release Notes](docs/v10-release-notes.md)
462
491
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
463
492
  - [Demo Calibration Example](examples/demo-calibration/README.md)
464
493
  - [Board Demo Rehearsal](examples/board-demo/README.md)
@@ -49,6 +49,12 @@ first-run adoption gaps. `--preflight` remains the compatibility preset for
49
49
  older scripts; `--adoption` adds explicit repo targeting and setup guidance.
50
50
  Use `--hosted-builders` or `--orchestrator-only` when the current machine is
51
51
  observing/coordinating lanes and will not run local Codex or Claude wrappers.
52
+ For the v1.0 supervised pilot posture, run
53
+ `code-mower doctor --supervised-pilot --repo OWNER/REPO`; use
54
+ `--promoted-pilot` only when `code-mower/gate`, repository auto-merge, and a
55
+ merge-capable gate credential are ready to let green audits drive merge.
56
+ On a self-hosted Mac audit host, add `--runner` to include runner launch and
57
+ wrapper checks in the same proof.
52
58
 
53
59
  Example, shortened:
54
60
 
@@ -78,6 +84,13 @@ wrappers, run `code-mower migration setup-drift --repo-path .` before copying a
78
84
  fresh `.code-mower.generated` tree. It is read-only and reports path-level
79
85
  classifications (`same`, `differs`, `new`, `repo-only`,
80
86
  `missing-from-output`) without file contents or diffs.
87
+ If the repository already has builder or dispatch lanes, rerun setup drift with
88
+ the current builder set, for example `--builders codex,claude,cursor`, before
89
+ opening the reviewed upgrade PR.
90
+ If the report warns that the repo path may be incomplete, rerun it from the
91
+ full repository checkout before treating every generated file as new. If it
92
+ detects reviewer-lane files but no builder-dispatch files, pass `--builders`
93
+ only for repos that actually use builder lanes.
81
94
  Use [Upgrade An Existing Repository](docs/upgrade-existing-repo.md) for the
82
95
  reviewed PR flow, repo-only file handling, builder identity checks, and
83
96
  wrapper/pin drift checks.
@@ -107,7 +120,11 @@ checks Board inputs and local history without exposing local paths by default.
107
120
  `code-mower board reset --repo OWNER/REPO --yes` clears only the local Board
108
121
  history file. The Board also shows an owner queue, and it
109
122
  summarizes reviewer verdict history and spend/latency from local board events
110
- plus `.code-mower/reviewer-spend.json` when those files exist. Local agents can
123
+ plus `.code-mower/reviewer-spend.json` when those files exist. When
124
+ `code-mower.yml` is present, the Board also embeds a supervised-pilot controller
125
+ summary so the browser view shows the current decision, queue counts, reviewer
126
+ evidence, selected PR or issue, and next action from the same metadata-only
127
+ policy engine as `code-mower controller run`. Local agents can
111
128
  publish opt-in status cards by writing metadata-only JSON files to
112
129
  `.code-mower/board/agents/*.json`; the Board redacts local paths by default and
113
130
  does not upload those cards.
@@ -116,6 +133,12 @@ The local JSON contracts are documented in
116
133
  When a team wants the same operator picture on CodeMower.com, run
117
134
  `code-mower cloud board-snapshot --repo-slug OWNER/REPO --json` to inspect a
118
135
  zero-report, metadata-only mirror event, then add `--yes` only after review.
136
+ The v1.0 supervised-pilot automation and event boundary is defined in
137
+ [Supervised Pilot Contract](docs/supervised-pilot-contract.md).
138
+ As that controller lands, `code-mower controller run --repo OWNER/REPO` is the
139
+ dry-run-first policy check: it selects the current dispatch/merge/owner-action
140
+ decision from metadata, can write a sanitized event with `--event-file`, and
141
+ does not mutate GitHub state.
119
142
 
120
143
  ## See The Value Shape First
121
144
 
@@ -152,14 +175,19 @@ after reinstalling, especially when switching between pipx and uv.
152
175
  | 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) |
153
176
  | 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) |
154
177
 
178
+ When you ask another agent to install, upgrade, orchestrate, build, or review,
179
+ start from the universal prompt in
180
+ [Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md). It makes the
181
+ agent report its actual host posture, exact installed version, doctor result,
182
+ Board URL, and any owner-only click-list before it mutates the repo.
183
+
155
184
  The current package-index announcement entry point is the tagged
156
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.3-beta.1/docs/try-in-10-minutes.md)
157
- guide. The v0.9 beta includes the completed native Board work plus the adoption
158
- and upgrade hardening from recent install rehearsals; v0.9.3 keeps the path
159
- smooth by clarifying starter-package diagnostics, surfacing richer top-level
160
- lane status detail, showing Board version drift, and reporting standalone pin
161
- drift during existing-repo upgrades. Package-only users can start from the
162
- public package rather than a source checkout.
185
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.0.0/docs/try-in-10-minutes.md)
186
+ guide. The v1.0 supervised-pilot release includes the native Board, the
187
+ controller dry-run and policy contract, adoption and upgrade hardening from
188
+ recent install rehearsals, package-index release checks, provider-diversity
189
+ fixtures, and the universal orchestrator prompt pack. Package-only users can
190
+ start from the public package rather than a source checkout.
163
191
 
164
192
  ## What Calibration Does And Does Not Prove
165
193
 
@@ -190,7 +218,7 @@ Provider-contract baseline for the next release train:
190
218
 
191
219
  For release verification,
192
220
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
193
- the package-index procedure for `v0.9.3-beta.1` / `code-mower==0.9.3b1`. The
221
+ the package-index procedure for `v1.0.0` / `code-mower==1.0.0`. The
194
222
  GitHub release records the workflow and rehearsal evidence for the exact tag.
195
223
 
196
224
  ## Optional: Plan Before Coding
@@ -338,8 +366,8 @@ The first recommended lanes are local/manual:
338
366
  | Gitar | advisory third signal | informational until calibrated |
339
367
 
340
368
  Everything else starts manual or informational until your own calibration data
341
- proves it is useful: Antigravity/Gemini, Hermes, CodeRabbit CLI, Cursor BugBot,
342
- Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
369
+ proves it is useful: Antigravity/Gemini, Muse, Hermes, CodeRabbit CLI, Cursor
370
+ BugBot, Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
343
371
 
344
372
  Gemini CLI and Antigravity are distinct lane ids even though both are Google
345
373
  surfaces and may use Gemini model infrastructure. Keep their auth, model
@@ -376,8 +404,8 @@ measurement work.
376
404
 
377
405
  ## Installation Status
378
406
 
379
- The current package-index beta baseline is `v0.9.3-beta.1`, with pinned package
380
- install spec `code-mower==0.9.3b1`. Release evidence is recorded on the GitHub
407
+ The current package-index release baseline is `v1.0.0`, with pinned package
408
+ install spec `code-mower==1.0.0`. Release evidence is recorded on the GitHub
381
409
  release and in the first-user install rehearsal. The public repository is
382
410
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
383
411
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -442,6 +470,7 @@ first so local work exercises the same package entrypoint users install.
442
470
  - [v0.6 Release Notes](docs/v06-release-notes.md)
443
471
  - [v0.8 Release Notes](docs/v08-release-notes.md)
444
472
  - [v0.9 Release Notes](docs/v09-release-notes.md)
473
+ - [v1.0 Release Notes](docs/v10-release-notes.md)
445
474
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
446
475
  - [Demo Calibration Example](examples/demo-calibration/README.md)
447
476
  - [Board Demo Rehearsal](examples/board-demo/README.md)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-mower"
7
- version = "0.9.3b1"
7
+ version = "1.0.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__ = "0.9.3b1"
3
+ __version__ = "1.0.0"
@@ -23,6 +23,8 @@ from urllib.parse import urlparse
23
23
 
24
24
  from . import __version__ as CODE_MOWER_VERSION
25
25
  from . import board_store
26
+ from . import config as code_mower_config
27
+ from . import controller
26
28
  from . import lane_status
27
29
  from . import reviewer_spend
28
30
 
@@ -199,6 +201,11 @@ def status_payload(
199
201
  }
200
202
  payload["agent_adapters"] = agent_adapters_payload(config)
201
203
  payload["owner_queue"] = owner_queue_payload(payload)
204
+ payload["supervised_pilot"] = supervised_pilot_payload(
205
+ config,
206
+ payload,
207
+ gh_json_runner=gh_json_runner,
208
+ )
202
209
  return payload
203
210
 
204
211
 
@@ -328,6 +335,183 @@ def owner_queue_payload(status: dict[str, Any]) -> dict[str, Any]:
328
335
  }
329
336
 
330
337
 
338
+ def _supervised_disabled(message: str, *, cycle_state: str = "unavailable") -> dict[str, Any]:
339
+ return {
340
+ "schema": controller.SUPERVISED_PILOT_SCHEMA,
341
+ "enabled": False,
342
+ "cycle_state": cycle_state,
343
+ "controller_mode": "dry_run",
344
+ "decision": {},
345
+ "queue": {"active_lanes": {}, "metrics": {}, "ready_issue_errors": []},
346
+ "active_issues": [],
347
+ "active_prs": [],
348
+ "message": message,
349
+ }
350
+
351
+
352
+ def _supervised_cycle_state(decision_state: object) -> str:
353
+ state = str(decision_state or "")
354
+ if state == "no_work":
355
+ return "idle"
356
+ if state == "dispatch_builder":
357
+ return "dispatch"
358
+ if state == "ready_to_merge":
359
+ return "ready"
360
+ if state == "owner_action":
361
+ return "owner_action"
362
+ if state in {"blocked_audit", "failing_check", "not_mergeable"}:
363
+ return "blocked"
364
+ if state in {"stale_evidence", "draft_pr", "waiting_for_evidence"}:
365
+ return "waiting"
366
+ return "unknown"
367
+
368
+
369
+ def _safe_bool(value: object) -> bool:
370
+ return bool(value)
371
+
372
+
373
+ def _safe_reviewer_outcomes(value: object) -> list[dict[str, Any]]:
374
+ if not isinstance(value, list):
375
+ return []
376
+ outcomes = []
377
+ for item in value:
378
+ if not isinstance(item, Mapping):
379
+ continue
380
+ outcomes.append(
381
+ {
382
+ "lane_id": _safe_text(item.get("lane_id"), limit=60),
383
+ "config_lane_id": _safe_text(item.get("config_lane_id"), limit=80),
384
+ "verdict": _safe_text(item.get("verdict"), limit=20),
385
+ "promoted": _safe_bool(item.get("promoted")),
386
+ }
387
+ )
388
+ return outcomes
389
+
390
+
391
+ def _supervised_decision_payload(decision: Mapping[str, Any]) -> dict[str, Any]:
392
+ payload: dict[str, Any] = {
393
+ "decision_state": _safe_text(decision.get("decision_state"), limit=80),
394
+ "next_action": _safe_text(decision.get("next_action"), limit=160),
395
+ "next_detail": _safe_text(decision.get("next_detail"), limit=220),
396
+ "stop_condition": _safe_text(decision.get("stop_condition"), limit=80),
397
+ "owner_action_kind": _safe_text(decision.get("owner_action_kind"), limit=80),
398
+ "lane_id": _safe_text(decision.get("lane_id"), limit=60),
399
+ "gate_status": _safe_text(decision.get("gate_status"), limit=40),
400
+ "branch": _safe_text(decision.get("branch"), limit=160),
401
+ "author": _safe_text(decision.get("author"), limit=80),
402
+ "head_sha_prefix": _head_prefix(decision.get("head_sha_prefix")),
403
+ "merge_method": _safe_text(decision.get("merge_method"), limit=40),
404
+ "author_lane_excluded": _safe_bool(decision.get("author_lane_excluded")),
405
+ "promoted_reviewers_passed": _safe_bool(decision.get("promoted_reviewers_passed")),
406
+ "would_mutate": _safe_bool(decision.get("would_mutate")),
407
+ "reviewer_outcomes": _safe_reviewer_outcomes(decision.get("reviewer_outcomes")),
408
+ }
409
+ if pr_number := _int(decision.get("pr_number")):
410
+ payload["pr_number"] = pr_number
411
+ if issue_number := _int(decision.get("issue_number")):
412
+ payload["issue_number"] = issue_number
413
+ if pr_url := _http_url(decision.get("pr_url")):
414
+ payload["pr_url"] = pr_url
415
+ if issue_url := _http_url(decision.get("issue_url")):
416
+ payload["issue_url"] = issue_url
417
+ return {key: value for key, value in payload.items() if value not in (None, "", [])}
418
+
419
+
420
+ def _supervised_pr_payload(pr: Mapping[str, Any]) -> dict[str, Any]:
421
+ labels = pr.get("labels") if isinstance(pr.get("labels"), Mapping) else {}
422
+ payload: dict[str, Any] = {
423
+ "number": _int(pr.get("number")) or 0,
424
+ "title": _safe_text(pr.get("title"), limit=180),
425
+ "url": _http_url(pr.get("url")),
426
+ "branch": _safe_text(pr.get("branch"), limit=160),
427
+ "author": _safe_text(pr.get("author"), limit=80),
428
+ "updated_at": _safe_text(pr.get("updated_at"), limit=80),
429
+ "head_sha_prefix": _head_prefix(pr.get("head_sha")),
430
+ "merge_state": _safe_text(pr.get("merge_state"), limit=40),
431
+ "is_draft": _safe_bool(pr.get("is_draft")),
432
+ "stale": _safe_bool(pr.get("stale")),
433
+ "next_action": _safe_text(pr.get("next_action"), limit=160),
434
+ "next_detail": _safe_text(pr.get("next_detail"), limit=220),
435
+ "labels": labels,
436
+ }
437
+ return {key: value for key, value in payload.items() if value not in (None, "", [])}
438
+
439
+
440
+ def _supervised_issue_payload(issue: Mapping[str, Any]) -> dict[str, Any]:
441
+ payload: dict[str, Any] = {
442
+ "number": _int(issue.get("number")) or 0,
443
+ "url": _http_url(issue.get("url")),
444
+ "author": _safe_text(issue.get("author"), limit=80),
445
+ "updated_at": _safe_text(issue.get("updated_at"), limit=80),
446
+ "builder_lane": _safe_text(issue.get("builder_lane"), limit=60),
447
+ "assigned": _safe_bool(issue.get("assigned")),
448
+ "dispatched": _safe_bool(issue.get("dispatched")),
449
+ "owner_action": _safe_bool(issue.get("owner_action")),
450
+ "labels": [label for label in issue.get("labels") or [] if isinstance(label, str)][:20],
451
+ }
452
+ return {key: value for key, value in payload.items() if value not in (None, "", [])}
453
+
454
+
455
+ def supervised_pilot_payload(
456
+ config: BoardConfig,
457
+ status: dict[str, Any],
458
+ *,
459
+ gh_json_runner: lane_status.GitHubJsonRunner = lane_status.run_gh_json,
460
+ ) -> dict[str, Any]:
461
+ config_path = Path(config.repo_path) / "code-mower.yml"
462
+ if not config_path.is_file():
463
+ return _supervised_disabled("code-mower.yml not found; supervised pilot state is unavailable")
464
+ try:
465
+ raw_config = code_mower_config.load_config(config_path)
466
+ issues = code_mower_config.validate_config(raw_config)
467
+ except (OSError, code_mower_config.ConfigError, ValueError):
468
+ return _supervised_disabled("could not read Code Mower config; run code-mower config validate")
469
+ if issues:
470
+ return _supervised_disabled("Code Mower config is invalid; run code-mower config validate")
471
+
472
+ remote = status.get("remote") if isinstance(status.get("remote"), Mapping) else {}
473
+ if remote.get("available"):
474
+ ready_issues = controller._collect_ready_issues( # noqa: SLF001 - shared package policy surface for Board.
475
+ repo=config.repo,
476
+ config=raw_config,
477
+ gh_json_runner=gh_json_runner,
478
+ issue_limit=min(config.pr_limit, 50),
479
+ )
480
+ else:
481
+ ready_issues = {"available": False, "errors": ["remote unavailable"], "issues": []}
482
+
483
+ report = controller.evaluate_controller_report(
484
+ status_report=status,
485
+ ready_issues=ready_issues,
486
+ config=raw_config,
487
+ options=controller.ControllerOptions(repo=config.repo, mode="dry_run", issue_limit=min(config.pr_limit, 50)),
488
+ )
489
+ decision = report.get("decision") if isinstance(report.get("decision"), Mapping) else {}
490
+ queue = report.get("queue") if isinstance(report.get("queue"), Mapping) else {}
491
+ raw_prs = remote.get("pull_requests") if isinstance(remote.get("pull_requests"), list) else []
492
+ issue_payload = ready_issues.get("issues") if isinstance(ready_issues.get("issues"), list) else []
493
+ return {
494
+ "schema": controller.SUPERVISED_PILOT_SCHEMA,
495
+ "enabled": True,
496
+ "cycle_state": _supervised_cycle_state(decision.get("decision_state")),
497
+ "controller_mode": report.get("mode") or "dry_run",
498
+ "generated_at": report.get("generated_at") or "",
499
+ "decision": _supervised_decision_payload(decision),
500
+ "queue": queue,
501
+ "active_issues": [
502
+ _supervised_issue_payload(issue)
503
+ for issue in issue_payload
504
+ if isinstance(issue, Mapping)
505
+ ],
506
+ "active_prs": [
507
+ _supervised_pr_payload(pr)
508
+ for pr in raw_prs
509
+ if isinstance(pr, Mapping)
510
+ ],
511
+ "message": "",
512
+ }
513
+
514
+
331
515
  def _verdict_from_done_label(label: str) -> tuple[str, str] | None:
332
516
  if label.endswith("-done"):
333
517
  return label[: -len("-done")], "PASS"
@@ -652,6 +836,7 @@ def render_board_html(config: BoardConfig) -> str:
652
836
  </header>
653
837
  <main>
654
838
  <div class="summary" id="summary"></div>
839
+ <section><h2>Supervised Pilot</h2><div class="rows" id="supervised"></div></section>
655
840
  <section><h2>Owner Queue</h2><div class="rows" id="owner"></div></section>
656
841
  <section><h2>Agent Cards</h2><div class="rows" id="agents"></div></section>
657
842
  <section><h2>Open PRs</h2><div class="rows" id="prs"></div></section>
@@ -702,6 +887,12 @@ def render_board_html(config: BoardConfig) -> str:
702
887
  const alerts = data.remote?.gate_health?.alerts || [];
703
888
  const ownerQueue = data.owner_queue?.entries || [];
704
889
  const agentCards = data.agent_adapters?.agents || [];
890
+ const supervised = data.supervised_pilot || {{}};
891
+ const supervisedDecision = supervised.decision || {{}};
892
+ const supervisedQueue = supervised.queue || {{}};
893
+ const supervisedMetrics = supervisedQueue.metrics || {{}};
894
+ const supervisedPRs = supervised.active_prs || [];
895
+ const supervisedIssues = supervised.active_issues || [];
705
896
  const timelines = data.timelines || {{}};
706
897
  const verdicts = timelines.verdicts?.entries || [];
707
898
  const spend = timelines.spend || {{}};
@@ -711,10 +902,22 @@ def render_board_html(config: BoardConfig) -> str:
711
902
  data.next_detail ? `<div class="metric"><span class="muted">Detail</span><b>${{esc(data.next_detail)}}</b></div>` : "",
712
903
  `<div class="metric"><span class="muted">GitHub</span><b class="${{data.remote?.available ? "ok" : "warn"}}">${{data.remote?.available ? "available" : "unavailable"}}</b></div>`,
713
904
  `<div class="metric"><span class="muted">Open PRs</span><b>${{prs.length}}</b></div>`,
905
+ `<div class="metric"><span class="muted">Pilot</span><b class="${{stateClass(supervised.cycle_state || "")}}">${{esc(supervised.cycle_state || "off")}}</b></div>`,
714
906
  `<div class="metric"><span class="muted">Owner queue</span><b class="${{ownerQueue.length ? "warn" : "ok"}}">${{ownerQueue.length}}</b></div>`,
715
907
  `<div class="metric"><span class="muted">Agent cards</span><b>${{agentCards.length}}</b></div>`,
716
908
  `<div class="metric"><span class="muted">Gate alerts</span><b class="${{alerts.length ? "warn" : "ok"}}">${{alerts.length}}</b></div>`
717
909
  ].join(""));
910
+ const reviewerOutcomes = supervisedDecision.reviewer_outcomes || [];
911
+ const supervisedRows = supervised.enabled ? [
912
+ `<div class="row"><div class="line"><b class="${{stateClass(supervised.cycle_state)}}">${{esc(supervised.cycle_state || "unknown")}}</b>${{pill(supervised.controller_mode || "dry_run")}}${{supervisedDecision.decision_state ? pill(supervisedDecision.decision_state) : ""}}</div><div>next: <b>${{esc(supervisedDecision.next_action || "inspect")}}</b></div>${{supervisedDecision.next_detail ? `<div class="muted">${{esc(supervisedDecision.next_detail)}}</div>` : ""}}</div>`,
913
+ `<div class="row"><div class="line">${{pill(`open PRs ${{supervisedMetrics.open_pr_count ?? supervisedPRs.length}}`)}}${{pill(`ready issues ${{supervisedMetrics.ready_issue_count ?? supervisedIssues.length}}`)}}${{pill(`active lanes ${{supervisedMetrics.active_lane_count ?? 0}}`)}}${{pill(`stale ${{supervisedMetrics.stale_evidence_count ?? 0}}`)}}</div></div>`,
914
+ 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>` : "",
915
+ 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>` : "",
916
+ 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>` : "",
917
+ 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>` : "",
918
+ 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>` : ""
919
+ ].filter(Boolean).join("") : empty(supervised.message || "Supervised pilot state unavailable.");
920
+ put("supervised", supervisedRows || empty(supervised.message || "No supervised pilot activity."));
718
921
  put("owner", ownerQueue.length ? ownerQueue.map(item => `<div class="row"><div class="line"><a href="${{esc(href(item.url))}}">#${{esc(item.pr_number)}} ${{esc(item.kind)}}</a>${{pill(item.next_action)}}${{pill(item.head_sha_prefix)}}</div><div class="muted">${{esc(item.branch)}} by ${{esc(item.author)}}${{item.updated_at ? ` updated ${{localTime(item.updated_at)}}` : ""}}</div></div>`).join("") : empty(data.owner_queue?.message || "No owner queue items."));
719
922
  put("agents", agentCards.length ? agentCards.map(agent => `<div class="row"><div class="line"><b>${{esc(agent.provider)}}</b>${{pill(agent.role)}}${{pill(agent.status)}}${{agent.lane ? pill(agent.lane) : ""}}${{agent.pr_number ? pill(`#${{agent.pr_number}}`) : ""}}</div><div>${{esc(agent.title || agent.next_action || "local agent")}}</div><div class="muted">${{esc(agent.branch || agent.repo || "")}}${{agent.pid ? ` pid=${{esc(agent.pid)}}` : ""}}${{agent.cwd ? ` cwd=${{esc(agent.cwd)}}` : ""}}${{agent.updated_at ? ` updated ${{localTime(agent.updated_at)}}` : ""}}</div></div>`).join("") : empty(data.agent_adapters?.message || "No local agent adapter cards."));
720
923
  put("prs", prs.length ? prs.map(pr => `<div class="row">
@@ -15,6 +15,7 @@ DEFAULT_CLI_LANES = (
15
15
  "hermes_cli",
16
16
  "coderabbit_cli",
17
17
  "grok_build",
18
+ "muse_cli",
18
19
  )
19
20
 
20
21
 
@@ -232,6 +232,7 @@ def build_pilot_plan(
232
232
  "gemini_cli",
233
233
  "grok_build",
234
234
  "hermes_cli",
235
+ "muse_cli",
235
236
  }:
236
237
  output_leaf = _local_cli_output_leaf(
237
238
  lane_slug=lane_slug,
@@ -52,6 +52,7 @@ from . import coderabbit_cli_audit_pr
52
52
  from . import codex_audit_env_preflight
53
53
  from . import codex_audit_pr
54
54
  from . import codex_audit_schema_smoke
55
+ from . import controller as code_mower_controller
55
56
  from . import code_mower_calibration
56
57
  from . import code_mower_context_packs
57
58
  from . import code_mower_merge
@@ -70,6 +71,7 @@ from . import local_llm_bakeoff
70
71
  from . import local_llm_calibration
71
72
  from . import local_llm_profiles
72
73
  from . import migration as code_mower_migration
74
+ from . import muse_cli_audit_pr
73
75
  from . import next_steps as code_mower_next_steps
74
76
  from . import package as code_mower_package
75
77
  from . import prompts as code_mower_prompts
@@ -439,6 +441,7 @@ COMMAND_DESCRIPTIONS: dict[str, str] = {
439
441
  "config": "Validate or inspect a Code Mower config.",
440
442
  "context": "Record local external planning context manifests.",
441
443
  "context-packs": "Build selective surrounding-file context packs.",
444
+ "controller": "Compute supervised-pilot dispatch and merge-policy decisions.",
442
445
  "coderabbit-cli": "Run a CodeRabbit CLI informational lane.",
443
446
  "codex-audit": "Run a Codex structured audit lane.",
444
447
  "codex-audit-env-preflight": "Probe Codex audit environment setup.",
@@ -454,6 +457,7 @@ COMMAND_DESCRIPTIONS: dict[str, str] = {
454
457
  "local-llm": "Probe and run local OpenAI-compatible model lanes.",
455
458
  "migration": "Rehearse standalone package and wrapper migration paths.",
456
459
  "merge-plan": "Inspect merge-readiness signals and lane labels.",
460
+ "muse-cli": "Run a Muse CLI structured audit lane.",
457
461
  "next-steps": "Print the recommended next actions after setup.",
458
462
  "package": "Build or inspect package extraction artifacts.",
459
463
  "plan": "Create local issue-derived planning artifacts.",
@@ -478,6 +482,7 @@ FIRST_USER_COMMANDS = (
478
482
  "reviewer-metrics",
479
483
  "cloud",
480
484
  "config",
485
+ "controller",
481
486
  "lanes",
482
487
  "project-context",
483
488
  )
@@ -550,6 +555,7 @@ def _top_level_help(show_all: bool) -> str:
550
555
  "Common first run:",
551
556
  " code-mower init --easy",
552
557
  " code-mower doctor --adoption --repo OWNER/REPO",
558
+ " code-mower doctor --supervised-pilot --repo OWNER/REPO",
553
559
  " code-mower lanes status --repo OWNER/REPO",
554
560
  " code-mower board serve --repo OWNER/REPO",
555
561
  (
@@ -578,6 +584,7 @@ COMMAND_HANDLERS: dict[str, CommandHandler] = {
578
584
  "config": _config_main,
579
585
  "context": code_mower_work_orders.context_main,
580
586
  "context-packs": code_mower_context_packs.main,
587
+ "controller": code_mower_controller.main,
581
588
  "coderabbit-cli": coderabbit_cli_audit_pr.main,
582
589
  "codex-audit": codex_audit_pr.main,
583
590
  "codex-audit-env-preflight": codex_audit_env_preflight.main,
@@ -593,6 +600,7 @@ COMMAND_HANDLERS: dict[str, CommandHandler] = {
593
600
  "local-llm": _local_llm_main,
594
601
  "migration": code_mower_migration.main,
595
602
  "merge-plan": code_mower_merge.main,
603
+ "muse-cli": muse_cli_audit_pr.main,
596
604
  "next-steps": code_mower_next_steps.main,
597
605
  "package": _package_main,
598
606
  "plan": code_mower_work_orders.plan_main,
@@ -25,9 +25,13 @@ SAFE_EVENT_TYPES = {
25
25
  "board_snapshot",
26
26
  "builder_run",
27
27
  "calibration_run",
28
+ "controller_decision",
28
29
  "dogfood_upload",
29
30
  "lane_policy_snapshot",
31
+ "merge_decision",
32
+ "owner_intervention",
30
33
  "provider_catalog_snapshot",
34
+ "queue_state_snapshot",
31
35
  "reviewer_run",
32
36
  "value_report_snapshot",
33
37
  "work_order",