code-mower 0.9.1b1__tar.gz → 0.9.2b1__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 (353) hide show
  1. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/PKG-INFO +10 -9
  2. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/README.md +9 -8
  3. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/pyproject.toml +1 -1
  4. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/__init__.py +1 -1
  5. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/board.py +2 -1
  6. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/board_store.py +4 -2
  7. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cli.py +0 -3
  8. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_human_token.py +4 -6
  9. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_status.py +61 -14
  10. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/migration.py +1 -1
  11. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/package_manifest.py +0 -1
  12. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
  13. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower.egg-info/PKG-INFO +10 -9
  14. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower.egg-info/SOURCES.txt +0 -2
  15. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/builder-provenance.yml.j2 +1 -1
  16. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_board.py +2 -2
  17. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_github_checks.py +16 -4
  18. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_lane_status.py +100 -13
  19. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_release_hygiene.py +38 -38
  20. code_mower-0.9.1b1/src/code_mower/observe.py +0 -324
  21. code_mower-0.9.1b1/tests/test_observe.py +0 -111
  22. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/CODE_OF_CONDUCT.md +0 -0
  23. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/LICENSE +0 -0
  24. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/MANIFEST.in +0 -0
  25. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/NOTICE +0 -0
  26. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/SUPPORT.md +0 -0
  27. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/requirements/requirements.txt +0 -0
  28. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/setup.cfg +0 -0
  29. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/adapters/__init__.py +0 -0
  30. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/adapters/_base.py +0 -0
  31. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  32. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/adapters/gitar.py +0 -0
  33. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/adapters/greptile.py +0 -0
  34. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/adapters/qodo.py +0 -0
  35. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  36. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/antigravity_sdk_probe.py +0 -0
  37. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/audit_handoff_log.py +0 -0
  38. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/audit_labeler_lib.py +0 -0
  39. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/audit_limits.py +0 -0
  40. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/audit_progress.py +0 -0
  41. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/blind_review_artifacts.py +0 -0
  42. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/blind_review_coordinator.py +0 -0
  43. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/bootstrap.py +0 -0
  44. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/builder_experiment.py +0 -0
  45. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/builder_runs.py +0 -0
  46. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/__init__.py +0 -0
  47. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/arms.py +0 -0
  48. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/auto_discovery.py +0 -0
  49. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/commands.py +0 -0
  50. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/context_inputs.py +0 -0
  51. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/corpus.py +0 -0
  52. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/effect_report.py +0 -0
  53. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/evidence.py +0 -0
  54. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/evidence_report.py +0 -0
  55. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/identity.py +0 -0
  56. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/metrics.py +0 -0
  57. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/overlap.py +0 -0
  58. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/planning.py +0 -0
  59. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/policy.py +0 -0
  60. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/results.py +0 -0
  61. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/run_results.py +0 -0
  62. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/run_status.py +0 -0
  63. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/runner.py +0 -0
  64. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/truth.py +0 -0
  65. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/value_report.py +0 -0
  66. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/checks.py +0 -0
  67. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/claude_audit_pr.py +0 -0
  68. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/claude_cli_bounce.py +0 -0
  69. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/claude_cli_environment.py +0 -0
  70. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/clear_stale.py +0 -0
  71. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud.py +0 -0
  72. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/__init__.py +0 -0
  73. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/bundle.py +0 -0
  74. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/doctor.py +0 -0
  75. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/dogfood.py +0 -0
  76. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/endpoints.py +0 -0
  77. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/errors.py +0 -0
  78. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/events.py +0 -0
  79. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/export.py +0 -0
  80. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/git_metadata.py +0 -0
  81. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/manifest.py +0 -0
  82. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/operations.py +0 -0
  83. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/reports.py +0 -0
  84. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/setup.py +0 -0
  85. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/tokens.py +0 -0
  86. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/upload.py +0 -0
  87. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/code_mower_calibration.py +0 -0
  88. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/code_mower_context_packs.py +0 -0
  89. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/code_mower_merge.py +0 -0
  90. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/code_mower_telemetry.py +0 -0
  91. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  92. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/codex_audit_env_preflight.py +0 -0
  93. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/codex_audit_pr.py +0 -0
  94. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  95. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  96. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/config.py +0 -0
  97. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/decisions.py +0 -0
  98. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor.py +0 -0
  99. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/__init__.py +0 -0
  100. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/adoption.py +0 -0
  101. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/audit_limits.py +0 -0
  102. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/cloud.py +0 -0
  103. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/common.py +0 -0
  104. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github.py +0 -0
  105. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions.py +0 -0
  106. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  107. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  108. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  109. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  110. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  111. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  112. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  113. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  114. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_api.py +0 -0
  115. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_branch.py +0 -0
  116. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_config.py +0 -0
  117. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_provider.py +0 -0
  118. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_repo.py +0 -0
  119. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
  120. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/groups.py +0 -0
  121. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/models.py +0 -0
  122. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/output.py +0 -0
  123. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/presets.py +0 -0
  124. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/privacy.py +0 -0
  125. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  126. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  127. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  128. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_env.py +0 -0
  129. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  130. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  131. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
  132. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  133. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  134. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  135. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  136. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  137. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  138. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  139. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  140. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  141. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/providers.py +0 -0
  142. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/registry.py +0 -0
  143. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/runner.py +0 -0
  144. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/runtime.py +0 -0
  145. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  146. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
  147. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/gate_health.py +0 -0
  148. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  149. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/git_identity.py +0 -0
  150. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/grok_build_audit_pr.py +0 -0
  151. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  152. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/init.py +0 -0
  153. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/__init__.py +0 -0
  154. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/aider.py +0 -0
  155. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  156. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/claude.py +0 -0
  157. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/codex.py +0 -0
  158. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/devin.py +0 -0
  159. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  160. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/grok_build.py +0 -0
  161. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  162. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/local_llm.py +0 -0
  163. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/local_llm_audit_pr.py +0 -0
  164. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/local_llm_bakeoff.py +0 -0
  165. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/local_llm_calibration.py +0 -0
  166. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/local_llm_profiles.py +0 -0
  167. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/migration_install.py +0 -0
  168. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/migration_mirror.py +0 -0
  169. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/migration_readiness.py +0 -0
  170. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/migration_rehearsal.py +0 -0
  171. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/next_steps.py +0 -0
  172. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/package.py +0 -0
  173. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/package_content.py +0 -0
  174. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/package_paths.py +0 -0
  175. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/package_rendering.py +0 -0
  176. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/package_static.py +0 -0
  177. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/plan_context.py +0 -0
  178. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/prompts.py +0 -0
  179. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_registry.py +0 -0
  180. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/__init__.py +0 -0
  181. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/comments.py +0 -0
  182. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/exit_codes.py +0 -0
  183. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/git.py +0 -0
  184. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/github_auth.py +0 -0
  185. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/github_pr.py +0 -0
  186. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  187. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/process.py +0 -0
  188. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/repo_paths.py +0 -0
  189. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/text_schema.py +0 -0
  190. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  191. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/workspace.py +0 -0
  192. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/providers/__init__.py +0 -0
  193. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/providers/local_cli.py +0 -0
  194. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/providers/provenance.py +0 -0
  195. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/release_readiness.py +0 -0
  196. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/reviewer_metrics.py +0 -0
  197. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/reviewer_spend.py +0 -0
  198. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/saas_reviewer_labeler.py +0 -0
  199. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/secrets.py +0 -0
  200. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/builder-experiment.example.json +0 -0
  201. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  202. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/calibration-corpus.json +0 -0
  203. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/code-mower.example.yml +0 -0
  204. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/context-packs.example.json +0 -0
  205. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  206. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  207. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  208. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  209. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  210. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  211. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  212. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
  213. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  214. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lanes/README.md +0 -0
  215. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lanes/claude.md +0 -0
  216. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lanes/codex.md +0 -0
  217. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lanes/cursor.md +0 -0
  218. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lanes/generic.md +0 -0
  219. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
  220. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/product-support/code_mower +0 -0
  221. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  222. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  223. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  224. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  225. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  226. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/product-support/status_report.py +0 -0
  227. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/providers.yml +0 -0
  228. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  229. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  230. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  231. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  232. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  233. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  234. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
  235. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  236. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  237. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  238. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  239. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
  240. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  241. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  242. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  243. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  244. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  245. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
  246. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/trailer_comment_labeler.py +0 -0
  247. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/versioning.py +0 -0
  248. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/work_orders.py +0 -0
  249. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/workflow_actionlint.py +0 -0
  250. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower.egg-info/dependency_links.txt +0 -0
  251. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower.egg-info/entry_points.txt +0 -0
  252. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower.egg-info/requires.txt +0 -0
  253. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower.egg-info/top_level.txt +0 -0
  254. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/builder-experiment.example.json +0 -0
  255. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/calibration-corpus.example.json +0 -0
  256. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/calibration-corpus.json +0 -0
  257. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/code-mower.yml.j2 +0 -0
  258. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/context-packs.example.json +0 -0
  259. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/cursor/BUGBOT.md +0 -0
  260. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/lanes/README.md +0 -0
  261. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/lanes/claude.md +0 -0
  262. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/lanes/codex.md +0 -0
  263. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/lanes/cursor.md +0 -0
  264. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/lanes/generic.md +0 -0
  265. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/lanes/run_mac_lane.sh +0 -0
  266. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/acp_bridge.yml +0 -0
  267. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/aider.yml +0 -0
  268. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/antigravity_cli.yml +0 -0
  269. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/claude_audit.yml +0 -0
  270. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/claude_review.yml +0 -0
  271. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/coderabbit_cli.yml +0 -0
  272. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/codex.yml +0 -0
  273. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/cursor_bugbot.yml +0 -0
  274. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/devin.yml +0 -0
  275. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/gemini_cli.yml +0 -0
  276. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/gitar.yml +0 -0
  277. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/greptile.yml +0 -0
  278. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/hermes_cli.yml +0 -0
  279. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/local_llm.yml +0 -0
  280. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/qodo.yml +0 -0
  281. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers.yml +0 -0
  282. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/reviewer-spend.example.json +0 -0
  283. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/reviewer-value-report.example.md +0 -0
  284. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  285. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  286. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  287. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  288. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  289. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/code-mower-gate.yml.j2 +0 -0
  290. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  291. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  292. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  293. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  294. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  295. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  296. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  297. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  298. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  299. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_antigravity_sdk_probe.py +0 -0
  300. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_audit_comment_posture.py +0 -0
  301. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_audit_limits.py +0 -0
  302. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_builder_experiment.py +0 -0
  303. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_builder_identity.py +0 -0
  304. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_builder_runs.py +0 -0
  305. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_calibration_effect_report.py +0 -0
  306. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_calibration_truth.py +0 -0
  307. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_checks.py +0 -0
  308. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_claude_audit_pr.py +0 -0
  309. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_claude_cli_bounce.py +0 -0
  310. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_clear_stale.py +0 -0
  311. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_cloud_client.py +0 -0
  312. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_cloud_git_metadata.py +0 -0
  313. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_cloud_manifest.py +0 -0
  314. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_cloud_reports.py +0 -0
  315. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  316. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_codex_audit_env_preflight.py +0 -0
  317. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_codex_audit_pr.py +0 -0
  318. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_decision_audit_integration.py +0 -0
  319. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_decisions.py +0 -0
  320. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_actions_cost_summary.py +0 -0
  321. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_actions_failure_selection.py +0 -0
  322. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_boundaries.py +0 -0
  323. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_output.py +0 -0
  324. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_privacy.py +0 -0
  325. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_provider_env_required.py +0 -0
  326. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_provider_env_tokens.py +0 -0
  327. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_provider_local_audit_setup.py +0 -0
  328. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_provider_probe.py +0 -0
  329. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_provider_review_hygiene.py +0 -0
  330. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_registry.py +0 -0
  331. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_runtime.py +0 -0
  332. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_self_hosted_runner.py +0 -0
  333. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_gate_health.py +0 -0
  334. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_init_actionlint.py +0 -0
  335. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_init_build_loop.py +0 -0
  336. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_local_llm_github_helpers.py +0 -0
  337. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_migration_setup_drift.py +0 -0
  338. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_plan_context.py +0 -0
  339. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_prompts.py +0 -0
  340. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_fixture_contracts.py +0 -0
  341. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_local_cli.py +0 -0
  342. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_comments.py +0 -0
  343. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_git.py +0 -0
  344. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_github_pr.py +0 -0
  345. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_pr_worktree.py +0 -0
  346. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_process.py +0 -0
  347. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_repo_paths.py +0 -0
  348. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_text_schema.py +0 -0
  349. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_workspace.py +0 -0
  350. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_reviewer_metrics_core.py +0 -0
  351. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_reviewer_spend.py +0 -0
  352. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_trailer_comment_labeler.py +0 -0
  353. {code_mower-0.9.1b1 → code_mower-0.9.2b1}/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.1b1
3
+ Version: 0.9.2b1
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.12
@@ -169,12 +169,13 @@ after reinstalling, especially when switching between pipx and uv.
169
169
  | 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) |
170
170
 
171
171
  The current package-index announcement entry point is the tagged
172
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.1-beta.1/docs/try-in-10-minutes.md)
172
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.2-beta.1/docs/try-in-10-minutes.md)
173
173
  guide. The v0.9 beta includes the completed native Board work plus the adoption
174
- and upgrade hardening from recent install rehearsals; v0.9.1 adds a smaller
175
- announcement-hardening pass on Board visibility, doctor guidance, and safer
176
- setup docs. Package-only users can start from the public package rather than a
177
- source checkout.
174
+ and upgrade hardening from recent install rehearsals; v0.9.2 keeps the path
175
+ simple by removing the retired third-party observe bridge, softening
176
+ dispatch-token expiry metadata when the secret is present, and making
177
+ stale-audit waits name the runner/dispatcher requeue path. Package-only users
178
+ can start from the public package rather than a source checkout.
178
179
 
179
180
  ## What Calibration Does And Does Not Prove
180
181
 
@@ -205,7 +206,7 @@ Provider-contract baseline for the next release train:
205
206
 
206
207
  For release verification,
207
208
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
208
- the package-index procedure for `v0.9.1-beta.1` / `code-mower==0.9.1b1`. The
209
+ the package-index procedure for `v0.9.2-beta.1` / `code-mower==0.9.2b1`. The
209
210
  GitHub release records the workflow and rehearsal evidence for the exact tag.
210
211
 
211
212
  ## Optional: Plan Before Coding
@@ -391,8 +392,8 @@ measurement work.
391
392
 
392
393
  ## Installation Status
393
394
 
394
- The current package-index beta baseline is `v0.9.1-beta.1`, with pinned package
395
- install spec `code-mower==0.9.1b1`. Release evidence is recorded on the GitHub
395
+ The current package-index beta baseline is `v0.9.2-beta.1`, with pinned package
396
+ install spec `code-mower==0.9.2b1`. Release evidence is recorded on the GitHub
396
397
  release and in the first-user install rehearsal. The public repository is
397
398
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
398
399
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -152,12 +152,13 @@ after reinstalling, especially when switching between pipx and uv.
152
152
  | 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) |
153
153
 
154
154
  The current package-index announcement entry point is the tagged
155
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.1-beta.1/docs/try-in-10-minutes.md)
155
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.2-beta.1/docs/try-in-10-minutes.md)
156
156
  guide. The v0.9 beta includes the completed native Board work plus the adoption
157
- and upgrade hardening from recent install rehearsals; v0.9.1 adds a smaller
158
- announcement-hardening pass on Board visibility, doctor guidance, and safer
159
- setup docs. Package-only users can start from the public package rather than a
160
- source checkout.
157
+ and upgrade hardening from recent install rehearsals; v0.9.2 keeps the path
158
+ simple by removing the retired third-party observe bridge, softening
159
+ dispatch-token expiry metadata when the secret is present, and making
160
+ stale-audit waits name the runner/dispatcher requeue path. Package-only users
161
+ can start from the public package rather than a source checkout.
161
162
 
162
163
  ## What Calibration Does And Does Not Prove
163
164
 
@@ -188,7 +189,7 @@ Provider-contract baseline for the next release train:
188
189
 
189
190
  For release verification,
190
191
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
191
- the package-index procedure for `v0.9.1-beta.1` / `code-mower==0.9.1b1`. The
192
+ the package-index procedure for `v0.9.2-beta.1` / `code-mower==0.9.2b1`. The
192
193
  GitHub release records the workflow and rehearsal evidence for the exact tag.
193
194
 
194
195
  ## Optional: Plan Before Coding
@@ -374,8 +375,8 @@ measurement work.
374
375
 
375
376
  ## Installation Status
376
377
 
377
- The current package-index beta baseline is `v0.9.1-beta.1`, with pinned package
378
- install spec `code-mower==0.9.1b1`. Release evidence is recorded on the GitHub
378
+ The current package-index beta baseline is `v0.9.2-beta.1`, with pinned package
379
+ install spec `code-mower==0.9.2b1`. Release evidence is recorded on the GitHub
379
380
  release and in the first-user install rehearsal. The public repository is
380
381
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
381
382
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-mower"
7
- version = "0.9.1b1"
7
+ version = "0.9.2b1"
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.1b1"
3
+ __version__ = "0.9.2b1"
@@ -697,6 +697,7 @@ def render_board_html(config: BoardConfig) -> str:
697
697
  <div>labels: ${{labels(pr.labels)}}</div>
698
698
  <div>checks: ${{checks(pr.checks)}}</div>
699
699
  <div>next: <b>${{esc(pr.next_action)}}</b></div>
700
+ ${{pr.next_detail ? `<div class="muted">${{esc(pr.next_detail)}}</div>` : ""}}
700
701
  </div>`).join("") : empty("No open pull requests."));
701
702
  put("alerts", alerts.length ? alerts.map(a => `<div class="row"><b class="warn">${{esc(a.kind)}}</b> ${{esc(a.message)}}</div>`).join("") : empty("No gate alerts."));
702
703
  put("runs", runs.length ? runs.slice(0, 8).map(run => `<div class="row"><div class="line"><a href="${{esc(href(run.url))}}">${{esc(run.workflow || "workflow")}}</a>${{pill(run.conclusion || run.status || "unknown")}}</div><div class="muted">${{esc(run.branch)}}${{run.updated_at ? ` updated ${{localTime(run.updated_at)}}` : ""}}</div></div>`).join("") : empty("No recent Code Mower workflow runs."));
@@ -707,7 +708,7 @@ def render_board_html(config: BoardConfig) -> str:
707
708
  spend.filtered_rows ? `<div class="row muted">Filtered ${{esc(spend.filtered_rows)}} spend row(s) from other repos.</div>` : ""
708
709
  ].filter(Boolean);
709
710
  put("spend", spendRows.length ? spendRows.join("") : empty(spend.message || "No reviewer spend rows for this repo yet."));
710
- const boards = data.agenttrail?.boards || [];
711
+ const boards = data.local_boards?.boards || [];
711
712
  const procs = data.local_processes?.processes || [];
712
713
  put("local", [...boards.map(b => `<div class="row">board localhost:${{esc(b.port)}} pid=${{esc(b.pid)}} cwd=<code>${{esc(b.cwd || "")}}</code></div>`), ...procs.slice(0, 8).map(p => `<div class="row">${{esc(p.provider)}} pid=${{esc(p.pid)}} cwd=<code>${{esc(p.cwd || "")}}</code></div>`)].join("") || empty("No local boards or lane processes visible."));
713
714
  }}
@@ -83,14 +83,16 @@ def _redact_local_paths(value: Any) -> Any:
83
83
 
84
84
  def _snapshot_summary(snapshot: Mapping[str, Any]) -> dict[str, Any]:
85
85
  remote = snapshot.get("remote") if isinstance(snapshot.get("remote"), dict) else {}
86
- agenttrail = snapshot.get("agenttrail") if isinstance(snapshot.get("agenttrail"), dict) else {}
86
+ local_boards = (
87
+ snapshot.get("local_boards") if isinstance(snapshot.get("local_boards"), dict) else {}
88
+ )
87
89
  local_processes = (
88
90
  snapshot.get("local_processes") if isinstance(snapshot.get("local_processes"), dict) else {}
89
91
  )
90
92
  pull_requests = remote.get("pull_requests") if isinstance(remote.get("pull_requests"), list) else []
91
93
  gate_health = remote.get("gate_health") if isinstance(remote.get("gate_health"), dict) else {}
92
94
  gate_alerts = gate_health.get("alerts") if isinstance(gate_health.get("alerts"), list) else []
93
- boards = agenttrail.get("boards") if isinstance(agenttrail.get("boards"), list) else []
95
+ boards = local_boards.get("boards") if isinstance(local_boards.get("boards"), list) else []
94
96
  processes = (
95
97
  local_processes.get("processes")
96
98
  if isinstance(local_processes.get("processes"), list)
@@ -71,7 +71,6 @@ from . import local_llm_calibration
71
71
  from . import local_llm_profiles
72
72
  from . import migration as code_mower_migration
73
73
  from . import next_steps as code_mower_next_steps
74
- from . import observe as code_mower_observe
75
74
  from . import package as code_mower_package
76
75
  from . import prompts as code_mower_prompts
77
76
  from . import reviewer_metrics
@@ -456,7 +455,6 @@ COMMAND_DESCRIPTIONS: dict[str, str] = {
456
455
  "migration": "Rehearse standalone package and wrapper migration paths.",
457
456
  "merge-plan": "Inspect merge-readiness signals and lane labels.",
458
457
  "next-steps": "Print the recommended next actions after setup.",
459
- "observe": "Run legacy optional local observability companions.",
460
458
  "package": "Build or inspect package extraction artifacts.",
461
459
  "plan": "Create local issue-derived planning artifacts.",
462
460
  "project-context": "Create editable local project-context doctrine docs.",
@@ -596,7 +594,6 @@ COMMAND_HANDLERS: dict[str, CommandHandler] = {
596
594
  "migration": code_mower_migration.main,
597
595
  "merge-plan": code_mower_merge.main,
598
596
  "next-steps": code_mower_next_steps.main,
599
- "observe": code_mower_observe.main,
600
597
  "package": _package_main,
601
598
  "plan": code_mower_work_orders.plan_main,
602
599
  "project-context": code_mower_work_orders.project_context_main,
@@ -173,11 +173,10 @@ def check_human_automation_token(
173
173
  http_timeout=http_timeout,
174
174
  )
175
175
  if variable_payload is None:
176
- status = _blocking_status_for_posture(adoption_posture)
177
176
  return DoctorCheck(
178
177
  name="github.human_automation_token",
179
- status=status,
180
- message=f"{slug} is missing the {expires_var} human token expiry variable",
178
+ status=STATUS_WARN,
179
+ message=f"{slug} is missing the {expires_var} human token expiry metadata",
181
180
  detail={
182
181
  **detail,
183
182
  "created_at": str(secret_payload.get("created_at") or ""),
@@ -219,10 +218,9 @@ def check_human_automation_token(
219
218
  )
220
219
  expiry = _parse_expiry(expiry_text)
221
220
  if expiry is None:
222
- status = _blocking_status_for_posture(adoption_posture)
223
221
  return DoctorCheck(
224
222
  name="github.human_automation_token",
225
- status=status,
223
+ status=STATUS_WARN,
226
224
  message=f"{slug} has an invalid {expires_var} value",
227
225
  detail={**detail, "expires_at": expiry_text},
228
226
  remediation=(
@@ -235,7 +233,7 @@ def check_human_automation_token(
235
233
  days_remaining = (expiry - today).days
236
234
  status = STATUS_PASS
237
235
  if days_remaining < 0:
238
- status = _blocking_status_for_posture(adoption_posture)
236
+ status = STATUS_WARN
239
237
  elif days_remaining <= EXPIRY_WARNING_DAYS:
240
238
  status = STATUS_WARN
241
239
 
@@ -19,10 +19,12 @@ WORKFLOW_TERMS = ("code mower", "code-mower", "gate", "audit", "dispatch", "labe
19
19
  CHECK_TERMS = ("code-mower", "gate", "package", "audit", "label", "dispatch", "gitar", "clear-stale")
20
20
  GATE_RERUN_ACTIONS = {
21
21
  "fix failing check",
22
+ "rerun stale gate",
22
23
  "waiting for audits or owner input",
23
24
  "waiting for checks",
24
25
  "ready for merge or auto-merge",
25
26
  }
27
+ PENDING_STATES = {"", "pending", "queued", "in_progress", "requested"}
26
28
  PROCESS_PROVIDERS = {
27
29
  "antigravity": "antigravity",
28
30
  "claude": "claude",
@@ -31,10 +33,9 @@ PROCESS_PROVIDERS = {
31
33
  "gemini": "gemini",
32
34
  "gitar": "gitar",
33
35
  }
34
- AGENTTRAIL_DEFAULT_PORTS = {5330, 5331}
35
36
  BOARD_DEFAULT_PORTS = set(range(5332, 5342))
36
- LOCAL_BOARD_DEFAULT_PORTS = AGENTTRAIL_DEFAULT_PORTS | BOARD_DEFAULT_PORTS
37
- LOCAL_BOARD_PROCESS_NAMES = {"code-mower", "node", "npx", "python", "python3"}
37
+ LOCAL_BOARD_DEFAULT_PORTS = BOARD_DEFAULT_PORTS
38
+ LOCAL_BOARD_PROCESS_NAMES = {"code-mower", "python", "python3"}
38
39
  LOCAL_PATH_REDACTION = "[local path hidden]"
39
40
 
40
41
 
@@ -133,6 +134,38 @@ def _has_state(checks: Sequence[Mapping[str, str]], states: set[str]) -> bool:
133
134
  return any(check.get("state", "") in states for check in checks)
134
135
 
135
136
 
137
+ def _audit_need_lanes(labels: Mapping[str, Sequence[str]]) -> tuple[str, ...]:
138
+ lanes = []
139
+ for label in labels.get("needs", ()):
140
+ if label.startswith("needs-") and label.endswith("-audit"):
141
+ lanes.append(label.removeprefix("needs-").removesuffix("-audit"))
142
+ return tuple(lanes)
143
+
144
+
145
+ def _has_pending_gate(checks: Sequence[Mapping[str, str]]) -> bool:
146
+ return any("gate" in check.get("name", "").lower() and check.get("state", "") in PENDING_STATES for check in checks)
147
+
148
+
149
+ def _stale_next_action_and_detail(
150
+ labels: Mapping[str, Sequence[str]],
151
+ checks: Sequence[Mapping[str, str]],
152
+ stale: bool,
153
+ next_action: str,
154
+ ) -> tuple[str, str]:
155
+ if not stale or labels.get("blocked"):
156
+ return next_action, ""
157
+ audit_lanes = _audit_need_lanes(labels)
158
+ if audit_lanes:
159
+ lane_text = ", ".join(audit_lanes)
160
+ return (
161
+ "requeue stale audit",
162
+ f"stale audit request for {lane_text}; check the audit runner/dispatcher and requeue the lane",
163
+ )
164
+ if _has_pending_gate(checks):
165
+ return "rerun stale gate", "stale gate status; rerun the gate workflow for the current head"
166
+ return next_action, "stale pending evidence; inspect recent workflows and requeue the stuck lane"
167
+
168
+
136
169
  def _next_action(
137
170
  labels: Mapping[str, Sequence[str]],
138
171
  checks: Sequence[Mapping[str, str]],
@@ -149,7 +182,7 @@ def _next_action(
149
182
  return "rebase/behind"
150
183
  if labels.get("needs"):
151
184
  return "waiting for audits or owner input"
152
- if _has_state(checks, {"", "pending", "queued", "in_progress", "requested"}):
185
+ if _has_state(checks, PENDING_STATES):
153
186
  return "waiting for checks"
154
187
  if merge_state == "CLEAN" and labels.get("done"):
155
188
  return "ready for merge or auto-merge"
@@ -172,7 +205,7 @@ def _stale(
172
205
  labels: Mapping[str, Any],
173
206
  checks: Sequence[Mapping[str, str]],
174
207
  ) -> bool:
175
- if not (labels.get("needs") or _has_state(checks, {"pending", "queued", "in_progress", "requested"})):
208
+ if not (labels.get("needs") or _has_state(checks, PENDING_STATES)):
176
209
  return False
177
210
  try:
178
211
  updated = datetime.fromisoformat(updated_at.replace("Z", "+00:00"))
@@ -200,6 +233,8 @@ def _summarize_pr(
200
233
  number = int(pr.get("number") or 0)
201
234
  head_sha = _text(pr.get("headRefOid"))
202
235
  next_action = _next_action(labels, checks, merge_state, is_draft)
236
+ stale = _stale(updated_at, now, stale_minutes, labels, checks)
237
+ next_action, next_detail = _stale_next_action_and_detail(labels, checks, stale, next_action)
203
238
  return {
204
239
  "number": number,
205
240
  "title": _text(pr.get("title")),
@@ -212,8 +247,9 @@ def _summarize_pr(
212
247
  "updated_at": updated_at,
213
248
  "labels": labels,
214
249
  "checks": checks,
215
- "stale": _stale(updated_at, now, stale_minutes, labels, checks),
250
+ "stale": stale,
216
251
  "next_action": next_action,
252
+ "next_detail": next_detail,
217
253
  "gate_rerun_command": _gate_rerun_command(repo, number, head_sha),
218
254
  }
219
255
 
@@ -365,7 +401,7 @@ def _process_command(pid: int, command_runner: CommandRunner) -> str:
365
401
  return _stdout(command_runner, ["ps", "-p", str(pid), "-o", "command="]).strip()
366
402
 
367
403
 
368
- def collect_agenttrail_boards(command_runner: CommandRunner = _run_command) -> dict[str, Any]:
404
+ def collect_local_boards(command_runner: CommandRunner = _run_command) -> dict[str, Any]:
369
405
  listeners = _listener_inventory(command_runner)
370
406
  if not listeners:
371
407
  return {"available": False, "boards": [], "message": "local listener inventory unavailable"}
@@ -379,7 +415,7 @@ def collect_agenttrail_boards(command_runner: CommandRunner = _run_command) -> d
379
415
  process_name = str(listener["process"]).lower()
380
416
  board_like = any(
381
417
  term in haystack
382
- for term in ("agenttrail", "code-mower board", "code_mower.board", "code_mower.cli board", "board serve")
418
+ for term in ("code-mower board", "code_mower.board", "code_mower.cli board", "board serve")
383
419
  )
384
420
  runtime_like = process_name in LOCAL_BOARD_PROCESS_NAMES or process_name.startswith("python")
385
421
  if board_like or (default_port and runtime_like):
@@ -426,7 +462,7 @@ def collect_lane_processes(command_runner: CommandRunner = _run_command) -> dict
426
462
 
427
463
 
428
464
  def _redact_local_paths(report: dict[str, Any]) -> None:
429
- for board in report["agenttrail"].get("boards") or []:
465
+ for board in report["local_boards"].get("boards") or []:
430
466
  if board.get("cwd"):
431
467
  board["cwd"] = LOCAL_PATH_REDACTION
432
468
  board["cwd_redacted"] = True
@@ -438,14 +474,23 @@ def _redact_local_paths(report: dict[str, Any]) -> None:
438
474
 
439
475
  def _global_next(report: Mapping[str, Any]) -> str:
440
476
  prs = report["remote"].get("pull_requests", [])
441
- local_active = bool(report["agenttrail"].get("boards")) or bool(report["local_processes"].get("processes"))
477
+ local_active = bool(report["local_boards"].get("boards")) or bool(report["local_processes"].get("processes"))
442
478
  if not report["remote"].get("available"):
443
479
  return (
444
480
  "remote unavailable; inspect local lanes"
445
481
  if local_active
446
482
  else "remote unavailable; fix GitHub access"
447
483
  )
448
- for action in ("fix BLOCKED audit", "fix failing check", "rebase/behind", "waiting for audits or owner input", "waiting for checks", "ready for merge or auto-merge"):
484
+ for action in (
485
+ "fix BLOCKED audit",
486
+ "fix failing check",
487
+ "rebase/behind",
488
+ "requeue stale audit",
489
+ "rerun stale gate",
490
+ "waiting for audits or owner input",
491
+ "waiting for checks",
492
+ "ready for merge or auto-merge",
493
+ ):
449
494
  if any(pr.get("next_action") == action for pr in prs):
450
495
  return action
451
496
  return "inspect PRs" if prs else ("local lanes visible; connect them to PR evidence" if local_active else "no active lanes")
@@ -468,7 +513,7 @@ def collect_status(
468
513
  "repo": repo,
469
514
  "generated_at": observed_at.isoformat().replace("+00:00", "Z"),
470
515
  "remote": _remote(repo, gh_json_runner, observed_at, pr_limit, workflow_limit, stale_minutes),
471
- "agenttrail": collect_agenttrail_boards(command_runner),
516
+ "local_boards": collect_local_boards(command_runner),
472
517
  "local_processes": collect_lane_processes(command_runner),
473
518
  }
474
519
  if not show_local_paths:
@@ -501,6 +546,8 @@ def render_text(report: Mapping[str, Any]) -> str:
501
546
  lines.append(f" labels: {_label_text(pr['labels'])}")
502
547
  lines.append(f" checks: {_check_text(pr['checks'])}")
503
548
  lines.append(f" next: {pr['next_action']}")
549
+ if pr.get("next_detail"):
550
+ lines.append(f" detail: {pr['next_detail']}")
504
551
  if pr.get("gate_rerun_command") and pr.get("next_action") in GATE_RERUN_ACTIONS:
505
552
  lines.append(f" rerun gate: {pr['gate_rerun_command']}")
506
553
  elif remote.get("available"):
@@ -528,8 +575,8 @@ def render_text(report: Mapping[str, Any]) -> str:
528
575
  lines.append("Gate alerts: unavailable")
529
576
  lines.extend(f"- {alert['message']}" for alert in alerts[:5])
530
577
  lines.append("")
531
- boards = report["agenttrail"].get("boards") or []
532
- message = report["agenttrail"].get("message") or "none visible"
578
+ boards = report["local_boards"].get("boards") or []
579
+ message = report["local_boards"].get("message") or "none visible"
533
580
  lines.append("Local boards:" if boards else f"Local boards: none ({message})")
534
581
  for board in boards:
535
582
  cwd = f" cwd={board['cwd']}" if board.get("cwd") else ""
@@ -715,7 +715,7 @@ def main(argv: Sequence[str] | None = None) -> int:
715
715
  "--allow-package-index",
716
716
  action="store_true",
717
717
  help=(
718
- "allow bare package-index specs such as code-mower==0.9.1b1; "
718
+ "allow bare package-index specs such as code-mower==0.9.2b1; "
719
719
  "normal unit/CI rehearsals should use a local path instead"
720
720
  ),
721
721
  )
@@ -244,7 +244,6 @@ PACKAGE_FILES = (
244
244
  ("src/code_mower/migration_readiness.py", "src/code_mower/migration_readiness.py", "core"),
245
245
  ("src/code_mower/migration_rehearsal.py", "src/code_mower/migration_rehearsal.py", "core"),
246
246
  ("tools/code_mower_next_steps.py", "src/code_mower/next_steps.py", "core"),
247
- ("src/code_mower/observe.py", "src/code_mower/observe.py", "core"),
248
247
  ("src/code_mower/lane_status.py", "src/code_mower/lane_status.py", "core"),
249
248
  ("tools/code_mower_package.py", "src/code_mower/package.py", "core"),
250
249
  ("tools/code_mower_package_content.py", "src/code_mower/package_content.py", "core"),
@@ -8,7 +8,7 @@ permissions:
8
8
  contents: read
9
9
 
10
10
  env:
11
- CODE_MOWER_PACKAGE_SPEC: code-mower==0.9.1b1
11
+ CODE_MOWER_PACKAGE_SPEC: code-mower==0.9.2b1
12
12
 
13
13
  jobs:
14
14
  auto-record:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 0.9.1b1
3
+ Version: 0.9.2b1
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.12
@@ -169,12 +169,13 @@ after reinstalling, especially when switching between pipx and uv.
169
169
  | 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) |
170
170
 
171
171
  The current package-index announcement entry point is the tagged
172
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.1-beta.1/docs/try-in-10-minutes.md)
172
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.2-beta.1/docs/try-in-10-minutes.md)
173
173
  guide. The v0.9 beta includes the completed native Board work plus the adoption
174
- and upgrade hardening from recent install rehearsals; v0.9.1 adds a smaller
175
- announcement-hardening pass on Board visibility, doctor guidance, and safer
176
- setup docs. Package-only users can start from the public package rather than a
177
- source checkout.
174
+ and upgrade hardening from recent install rehearsals; v0.9.2 keeps the path
175
+ simple by removing the retired third-party observe bridge, softening
176
+ dispatch-token expiry metadata when the secret is present, and making
177
+ stale-audit waits name the runner/dispatcher requeue path. Package-only users
178
+ can start from the public package rather than a source checkout.
178
179
 
179
180
  ## What Calibration Does And Does Not Prove
180
181
 
@@ -205,7 +206,7 @@ Provider-contract baseline for the next release train:
205
206
 
206
207
  For release verification,
207
208
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
208
- the package-index procedure for `v0.9.1-beta.1` / `code-mower==0.9.1b1`. The
209
+ the package-index procedure for `v0.9.2-beta.1` / `code-mower==0.9.2b1`. The
209
210
  GitHub release records the workflow and rehearsal evidence for the exact tag.
210
211
 
211
212
  ## Optional: Plan Before Coding
@@ -391,8 +392,8 @@ measurement work.
391
392
 
392
393
  ## Installation Status
393
394
 
394
- The current package-index beta baseline is `v0.9.1-beta.1`, with pinned package
395
- install spec `code-mower==0.9.1b1`. Release evidence is recorded on the GitHub
395
+ The current package-index beta baseline is `v0.9.2-beta.1`, with pinned package
396
+ install spec `code-mower==0.9.2b1`. Release evidence is recorded on the GitHub
396
397
  release and in the first-user install rehearsal. The public repository is
397
398
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
398
399
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -56,7 +56,6 @@ src/code_mower/migration_mirror.py
56
56
  src/code_mower/migration_readiness.py
57
57
  src/code_mower/migration_rehearsal.py
58
58
  src/code_mower/next_steps.py
59
- src/code_mower/observe.py
60
59
  src/code_mower/package.py
61
60
  src/code_mower/package_content.py
62
61
  src/code_mower/package_manifest.py
@@ -331,7 +330,6 @@ tests/test_init_build_loop.py
331
330
  tests/test_lane_status.py
332
331
  tests/test_local_llm_github_helpers.py
333
332
  tests/test_migration_setup_drift.py
334
- tests/test_observe.py
335
333
  tests/test_plan_context.py
336
334
  tests/test_prompts.py
337
335
  tests/test_provider_fixture_contracts.py
@@ -8,7 +8,7 @@ permissions:
8
8
  contents: read
9
9
 
10
10
  env:
11
- CODE_MOWER_PACKAGE_SPEC: code-mower==0.9.1b1
11
+ CODE_MOWER_PACKAGE_SPEC: code-mower==0.9.2b1
12
12
 
13
13
  jobs:
14
14
  auto-record:
@@ -63,7 +63,7 @@ def _command_runner(args: list[str]) -> subprocess.CompletedProcess[str]:
63
63
  if args[:4] == ["lsof", "-nP", "-iTCP", "-sTCP:LISTEN"]:
64
64
  return _completed("p123\ncnode\nn127.0.0.1:5332\n")
65
65
  if args == ["ps", "-p", "123", "-o", "command="]:
66
- return _completed("node /tmp/bin/agenttrail /repo --no-open\n")
66
+ return _completed("code-mower board serve --repo owner/repo\n")
67
67
  if args == ["lsof", "-a", "-p", "123", "-d", "cwd", "-Fn"]:
68
68
  return _completed("p123\nn/tmp/lane-checkout\n")
69
69
  if args == ["ps", "-axo", "pid=,command="]:
@@ -102,7 +102,7 @@ class BoardTests(TestCase):
102
102
  self.assertIn("const localTime", html)
103
103
  self.assertIn("Intl.DateTimeFormat(undefined", html)
104
104
  self.assertIn('title="UTC ', html)
105
- self.assertNotIn("AgentTrail", html)
105
+ self.assertIn("next_detail", html)
106
106
 
107
107
  def test_render_board_html_escapes_script_terminators(self) -> None:
108
108
  html = board.render_board_html(board.BoardConfig(repo="owner/repo</script><b>bad</b>"))
@@ -275,7 +275,19 @@ class GitHubDoctorCheckTests(unittest.TestCase):
275
275
  self.assertIn("hosted-builder observer posture", check.message)
276
276
  self.assertEqual(check.detail["adoption_posture"], "hosted-builders")
277
277
 
278
- def test_human_automation_token_check_fails_when_expired(self) -> None:
278
+ def test_human_automation_token_check_warns_when_expiry_metadata_missing(self) -> None:
279
+ check = self._human_token_check(
280
+ [
281
+ ({"name": "DISPATCH_TOKEN"}, {}),
282
+ (None, {"returncode": 1, "output_summary": "not found"}),
283
+ ]
284
+ )
285
+
286
+ self.assertEqual(check.status, "warn")
287
+ self.assertIn("missing the DISPATCH_TOKEN_EXPIRES_AT", check.message)
288
+ self.assertIn("--body never", str(check.remediation))
289
+
290
+ def test_human_automation_token_check_warns_when_expired(self) -> None:
279
291
  check = self._human_token_check(
280
292
  [
281
293
  ({"name": "DISPATCH_TOKEN"}, {}),
@@ -283,7 +295,7 @@ class GitHubDoctorCheckTests(unittest.TestCase):
283
295
  ]
284
296
  )
285
297
 
286
- self.assertEqual(check.status, "fail")
298
+ self.assertEqual(check.status, "warn")
287
299
  self.assertIn("expired", check.message)
288
300
 
289
301
  def test_human_automation_token_check_warns_for_orchestrator_expired_secret(
@@ -300,7 +312,7 @@ class GitHubDoctorCheckTests(unittest.TestCase):
300
312
  self.assertEqual(check.status, "warn")
301
313
  self.assertIn("expired", check.message)
302
314
 
303
- def test_human_automation_token_check_rejects_timestamp_expiry(self) -> None:
315
+ def test_human_automation_token_check_warns_on_timestamp_expiry(self) -> None:
304
316
  check = self._human_token_check(
305
317
  [
306
318
  ({"name": "DISPATCH_TOKEN"}, {}),
@@ -314,7 +326,7 @@ class GitHubDoctorCheckTests(unittest.TestCase):
314
326
  ]
315
327
  )
316
328
 
317
- self.assertEqual(check.status, "fail")
329
+ self.assertEqual(check.status, "warn")
318
330
  self.assertIn("invalid DISPATCH_TOKEN_EXPIRES_AT", check.message)
319
331
  self.assertIn("`never`", str(check.remediation))
320
332