From fb0cf70343399a811909c5c2d5d1da6f253a3293 Mon Sep 17 00:00:00 2001 From: Jeff Huber Date: Wed, 2 Sep 2026 09:06:27 -0700 Subject: [PATCH] chore: prepare v0.8.0 beta 1 release --- .gitignore | 1 + CONTRIBUTING.md | 2 +- README.md | 15 ++-- docs/build-loop-in-30-minutes.md | 2 +- docs/current-state-and-roadmap.md | 22 +++--- docs/early-adopter-invite-runbook.md | 4 +- docs/early-adopter-v05.md | 7 +- docs/first-run-transcript.md | 4 +- docs/first-user-demo-transcript.md | 6 +- docs/first-user-install-rehearsal.md | 32 ++++---- docs/friendly-user-rollout-v05.md | 4 +- docs/install.md | 10 +-- docs/mirror-removal-runbook.md | 2 +- docs/oss-v1-checklist.md | 8 +- docs/package-customization.md | 2 +- docs/post-v08-effectiveness-assessment.md | 16 ++-- docs/prd-addendum-v05-beta.md | 4 +- docs/public-release-checklist.md | 15 ++-- docs/pypi-release.md | 14 ++-- docs/quickstart.md | 12 +-- docs/repo-strategy.md | 2 +- docs/try-in-10-minutes.md | 8 +- docs/v08-release-notes.md | 56 ++++++++++++++ pyproject.toml | 4 +- src/code_mower/__init__.py | 2 +- .../workflows/builder-provenance.yml.j2 | 2 +- templates/workflows/builder-provenance.yml.j2 | 2 +- tests/test_release_hygiene.py | 76 +++++++++---------- 28 files changed, 196 insertions(+), 138 deletions(-) create mode 100644 docs/v08-release-notes.md diff --git a/.gitignore b/.gitignore index 9394c31f..ed449781 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ dist/ .ruff_cache/ .code-mower/ .code-mower.generated/ +.code-mower.generated.*/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 33956d2a..c6239972 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,7 +9,7 @@ Use Python 3.12 or newer. CI exercises Python 3.12, 3.13, and 3.14. ```bash python3.12 -m venv .venv .venv/bin/python -m pip install --upgrade pip -.venv/bin/python -m pip install -e . ruff +.venv/bin/python -m pip install -e ".[test]" ``` ## Local Checks diff --git a/README.md b/README.md index d283f0a8..13c83c0c 100644 --- a/README.md +++ b/README.md @@ -135,10 +135,10 @@ for Code Mower contributors. All paths require Python 3.12 or newer. | 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) | The current package-index announcement entry point is the tagged -[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.6.0-beta.3/docs/try-in-10-minutes.md) -guide. The completed v0.7/v0.8 Board and adoption-polish source line is on -`main`; publish a new beta before directing package-only users to those -commands. +[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.8.0-beta.1/docs/try-in-10-minutes.md) +guide. The v0.8 beta includes the completed adoption-polish and native Board +work, so package-only users can start from the public package rather than a +source checkout. ## What Calibration Does And Does Not Prove @@ -167,7 +167,7 @@ Provider-contract baseline for the next release train: For release verification, [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records -the package-index procedure for `v0.6.0-beta.3` / `code-mower==0.6.0b3`. The +the package-index procedure for `v0.8.0-beta.1` / `code-mower==0.8.0b1`. The GitHub release records the workflow and rehearsal evidence for the exact tag. ## Optional: Plan Before Coding @@ -353,8 +353,8 @@ measurement work. ## Installation Status -The current package-index beta baseline is `v0.6.0-beta.3`, with pinned package -install spec `code-mower==0.6.0b3`. Release evidence is recorded on the GitHub +The current package-index beta baseline is `v0.8.0-beta.1`, with pinned package +install spec `code-mower==0.8.0b1`. Release evidence is recorded on the GitHub release and in the first-user install rehearsal. The public repository is [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and GitHub releases remain the auditable source for tags, build artifacts, and @@ -416,6 +416,7 @@ first so local work exercises the same package entrypoint users install. - [Launch Command Surface](docs/launch-command-surface.md) - [v0.6 Truth Baseline](docs/v06-truth-baseline.md) - [v0.6 Release Notes](docs/v06-release-notes.md) +- [v0.8 Release Notes](docs/v08-release-notes.md) - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md) - [Demo Calibration Example](examples/demo-calibration/README.md) - [Board Demo Rehearsal](examples/board-demo/README.md) diff --git a/docs/build-loop-in-30-minutes.md b/docs/build-loop-in-30-minutes.md index b3484ef6..8d42fef2 100644 --- a/docs/build-loop-in-30-minutes.md +++ b/docs/build-loop-in-30-minutes.md @@ -53,7 +53,7 @@ audit evidence, skip to section 2. ```bash python3.12 --version export CODE_MOWER_PYTHON="$(command -v python3.12)" -pipx install --python "$CODE_MOWER_PYTHON" code-mower==0.6.0b3 +pipx install --python "$CODE_MOWER_PYTHON" code-mower==0.8.0b1 gh auth status code-mower init --easy code-mower init --easy --apply --output-dir .code-mower.generated diff --git a/docs/current-state-and-roadmap.md b/docs/current-state-and-roadmap.md index a06d2f60..e306917c 100644 --- a/docs/current-state-and-roadmap.md +++ b/docs/current-state-and-roadmap.md @@ -26,20 +26,18 @@ The public OSS repository is: https://github.com/codemower-ai/code-mower ``` -The current package-index beta baseline is `v0.6.0-beta.3`, with pinned package -install spec `code-mower==0.6.0b3`. Release evidence is recorded on the GitHub +The current package-index beta baseline is `v0.8.0-beta.1`, with pinned package +install spec `code-mower==0.8.0b1`. Release evidence is recorded on the GitHub release and in the first-user install rehearsal. It is intended to be installed from the package index for friendly-user pilots, with GitHub tag/source installs kept as a fallback and development path. -The v0.7/v0.8 source line has landed on `main` and is awaiting the next package -beta before package-only adopters should rely on it. That source line adds the -Python 3.12+ runtime contract, pipx/uv install matrix, hosted-builder and -orchestrator-only doctor postures, non-expiring dispatch-token diagnostics, -native redacted lane status, the local Board, Board history and admin commands, -spend/verdict timelines, owner queue, optional metadata-only agent cards, -explicit cloud Board snapshots, the CodeMower.com Board mirror, and a public -Board demo rehearsal. See +The v0.8 package beta adds the Python 3.12+ runtime contract, pipx/uv install +matrix, hosted-builder and orchestrator-only doctor postures, non-expiring +dispatch-token diagnostics, native redacted lane status, the local Board, Board +history and admin commands, spend/verdict timelines, owner queue, optional +metadata-only agent cards, explicit cloud Board snapshots, the CodeMower.com +Board mirror, and a public Board demo rehearsal. See [Post-v0.8 Effectiveness Assessment](post-v08-effectiveness-assessment.md) for the dogfood assessment and lane-readiness interpretation. @@ -413,8 +411,8 @@ leaving room for future orchestrator adapters. ## Near-Term Roadmap -1. Package the completed v0.7/v0.8 source line as the next beta, then verify the - exact package install from a clean environment before announcement. +1. Keep the v0.8 package beta install path verified from PyPI, and mark the + newest beta GitHub release as Latest until a stable 1.0 line exists. 2. Run one cold-repo adoption rehearsal from the published package: install, `init --easy`, `doctor --adoption`, `lanes status`, `board serve`, one tiny audited PR, and optional metadata-only cloud upload. diff --git a/docs/early-adopter-invite-runbook.md b/docs/early-adopter-invite-runbook.md index 0a0a247d..c2907324 100644 --- a/docs/early-adopter-invite-runbook.md +++ b/docs/early-adopter-invite-runbook.md @@ -38,7 +38,7 @@ It is an OSS local-first tool for setting up AI peer-programmer/reviewer lanes on your real codebase, with optional privacy-first cloud reporting. Start here: -https://github.com/codemower-ai/code-mower/blob/v0.6.0-beta.3/docs/try-in-10-minutes.md +https://github.com/codemower-ai/code-mower/blob/v0.8.0-beta.1/docs/try-in-10-minutes.md Cloud sharing is optional. The default bundle excludes source code, raw diffs, model transcripts, raw stdout/stderr, auth output, and secrets. @@ -51,7 +51,7 @@ Before inviting a user: 1. Verify the tagged install command in a fresh repo: ```bash - pipx install --python python3.12 code-mower==0.6.0b3 + pipx install --python python3.12 code-mower==0.8.0b1 code-mower --version ``` diff --git a/docs/early-adopter-v05.md b/docs/early-adopter-v05.md index 9006b162..534dfb21 100644 --- a/docs/early-adopter-v05.md +++ b/docs/early-adopter-v05.md @@ -125,7 +125,8 @@ Cut a v0.5 alpha or beta only after: - release workflow builds source/wheel distributions, and PyPI publishing is either configured or explicitly called out as the next friction-reduction milestone; -- alpha/beta GitHub releases are marked as prereleases; +- newest beta GitHub releases are marked as regular releases with beta wording, + so GitHub's `/releases/latest` endpoint resolves for early adopters; - docs are sufficient for a new user; - cloud export and dry-run upload are tested; - codemower.com can receive an ingest payload; @@ -137,7 +138,7 @@ Cut a v0.5 alpha or beta only after: ## Current Beta -`v0.6.0-beta.3` is the current friendly-user beta. It keeps the +`v0.8.0-beta.1` is the current friendly-user beta. It keeps the local-first package path from alpha.1, the cloud doctor service-readiness check from alpha.5, the hardened provider-auth doctor diagnostics needed for early-adopter troubleshooting, the dogfood dry-run path that feeds the @@ -147,7 +148,7 @@ It also adds a first-user readiness scorecard to the package-install rehearsal so install, doctor, report, and cloud dry-run privacy gates can be checked at a glance, and it carries provider/model/version provenance through cloud bundles so CodeMower.com can separate benchmark-grade evidence from operational -dogfood. The current beta also adds the v0.6 provider-contract hardening queue, +dogfood. The current beta also carries the provider-contract hardening queue, the `code-mower lanes status` operator snapshot, Antigravity/Gemini lane separation, builder-experiment metadata capture, and the hosted Cursor lane id as `cursor` while accepting legacy `grok-bot` inputs during the migration diff --git a/docs/first-run-transcript.md b/docs/first-run-transcript.md index 45927ce9..7d65ca2a 100644 --- a/docs/first-run-transcript.md +++ b/docs/first-run-transcript.md @@ -9,7 +9,7 @@ same provider warnings. ```bash python3.12 --version export CODE_MOWER_PYTHON="$(command -v python3.12)" -pipx install --python "$CODE_MOWER_PYTHON" code-mower==0.6.0b3 +pipx install --python "$CODE_MOWER_PYTHON" code-mower==0.8.0b1 code-mower --version ``` @@ -17,7 +17,7 @@ Expected shape: ```text Python 3.12.x -code-mower 0.6.0b3 +code-mower 0.8.0b1 ``` ## Generate Local Setup diff --git a/docs/first-user-demo-transcript.md b/docs/first-user-demo-transcript.md index 1a291393..ca782f3a 100644 --- a/docs/first-user-demo-transcript.md +++ b/docs/first-user-demo-transcript.md @@ -14,9 +14,9 @@ release. ```bash python3.12 -m venv "$WORK_DIR/venv" "$WORK_DIR/venv/bin/python" -m pip install --upgrade pip -"$WORK_DIR/venv/bin/python" -m pip install code-mower==0.6.0b3 +"$WORK_DIR/venv/bin/python" -m pip install code-mower==0.8.0b1 "$WORK_DIR/venv/bin/code-mower" migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --python "$(command -v python3.12)" \ --json ``` @@ -28,7 +28,7 @@ python3.12 -m venv "$WORK_DIR/venv" "mode": "package-install-rehearsal", "status": "pass", "steps": 27, - "package_spec": "code-mower==0.6.0b3", + "package_spec": "code-mower==0.8.0b1", "toy_repo": "$WORK_DIR/toy-repo", "doctor_status": "warn", "generated_artifacts": { diff --git a/docs/first-user-install-rehearsal.md b/docs/first-user-install-rehearsal.md index 5613381b..a0daa776 100644 --- a/docs/first-user-install-rehearsal.md +++ b/docs/first-user-install-rehearsal.md @@ -43,7 +43,7 @@ Use the current public tag or release candidate: ```bash code-mower migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --python "$(command -v python3.12)" \ --json ``` @@ -66,7 +66,7 @@ For a fixed output directory: ```bash code-mower migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --python "$(command -v python3.12)" \ --work-dir /tmp/code-mower-first-user-rehearsal \ --json @@ -87,7 +87,7 @@ For a GitHub tag fallback, pass the tag URL explicitly: ```bash code-mower migration package-install-rehearsal \ - --package-spec "git+https://github.com/codemower-ai/code-mower.git@v0.6.0-beta.3" \ + --package-spec "git+https://github.com/codemower-ai/code-mower.git@v0.8.0-beta.1" \ --python "$(command -v python3.12)" \ --json ``` @@ -99,14 +99,14 @@ deciding the package index or the release is broken. For pipx: ```bash export CODE_MOWER_PYTHON="$(command -v python3.12)" -PIP_NO_CACHE_DIR=1 pipx install --force --python "$CODE_MOWER_PYTHON" code-mower==0.6.0b3 +PIP_NO_CACHE_DIR=1 pipx install --force --python "$CODE_MOWER_PYTHON" code-mower==0.8.0b1 code-mower --version ``` For uv: ```bash -uv tool install --python 3.12 --reinstall --refresh-package code-mower code-mower==0.6.0b3 +uv tool install --python 3.12 --reinstall --refresh-package code-mower code-mower==0.8.0b1 code-mower --version ``` @@ -133,7 +133,7 @@ repository after the package install succeeds: ```bash code-mower migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --repo-path /path/to/external-repo \ --python "$(command -v python3.12)" \ --json @@ -214,7 +214,7 @@ When a product repository already has Code Mower wrapper files, the same ```bash code-mower migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --repo-path /path/to/product-repo \ --python "$(command -v python3.12)" \ --json @@ -271,12 +271,12 @@ Treat the rehearsal as passing only when: If this fails, fix the first-user path before cutting or promoting a release. -## v0.6 Beta Package-Index Release Procedure +## v0.8 Beta Package-Index Release Procedure Publish and rehearse the package-index artifacts in this order. After the release tag exists at the release commit, dispatch both package-index publication runs with -`--ref v0.6.0-beta.3`; never substitute mutable `main`, because the TestPyPI +`--ref v0.8.0-beta.1`; never substitute mutable `main`, because the TestPyPI and production PyPI builds must check out identical source. First, run `release.yml` for TestPyPI only: @@ -284,7 +284,7 @@ First, run `release.yml` for TestPyPI only: ```bash gh workflow run release.yml \ --repo codemower-ai/code-mower \ - --ref v0.6.0-beta.3 \ + --ref v0.8.0-beta.1 \ -f publish_testpypi=true \ -f publish_pypi=false ``` @@ -294,11 +294,11 @@ candidate from TestPyPI: ```bash code-mower migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --pip-index-url https://test.pypi.org/simple/ \ --pip-extra-index-url https://pypi.org/simple/ \ --python "$(command -v python3.12)" \ - --work-dir /tmp/code-mower-v06-beta1-testpypi-rehearsal \ + --work-dir /tmp/code-mower-v08-beta1-testpypi-rehearsal \ --json ``` @@ -307,7 +307,7 @@ Then run `release.yml` for production PyPI only: ```bash gh workflow run release.yml \ --repo codemower-ai/code-mower \ - --ref v0.6.0-beta.3 \ + --ref v0.8.0-beta.1 \ -f publish_testpypi=false \ -f publish_pypi=true ``` @@ -317,9 +317,9 @@ production package from PyPI: ```bash code-mower migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --python "$(command -v python3.12)" \ - --work-dir /tmp/code-mower-v06-beta1-pypi-rehearsal \ + --work-dir /tmp/code-mower-v08-beta1-pypi-rehearsal \ --json ``` @@ -335,7 +335,7 @@ repository: ```bash code-mower migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --repo-path "$REPO_PATH" \ --work-dir "$WORK_DIR" \ --json diff --git a/docs/friendly-user-rollout-v05.md b/docs/friendly-user-rollout-v05.md index c5a62504..c3b4430d 100644 --- a/docs/friendly-user-rollout-v05.md +++ b/docs/friendly-user-rollout-v05.md @@ -23,10 +23,10 @@ Use the current beta install pin unless a newer release is explicitly called out in the invite: ```bash -pipx install --python python3.12 code-mower==0.6.0b3 +pipx install --python python3.12 code-mower==0.8.0b1 ``` -The current package-index beta baseline is `v0.6.0-beta.3`, with pinned package install spec `code-mower==0.6.0b3`. Release evidence is recorded on the GitHub release and in the first-user install rehearsal. +The current package-index beta baseline is `v0.8.0-beta.1`, with pinned package install spec `code-mower==0.8.0b1`. Release evidence is recorded on the GitHub release and in the first-user install rehearsal. ## Invite Criteria diff --git a/docs/install.md b/docs/install.md index 5d069c8e..076b42d8 100644 --- a/docs/install.md +++ b/docs/install.md @@ -18,7 +18,7 @@ Install with pipx and an explicit Python 3.12+ interpreter: ```bash python3.12 --version export CODE_MOWER_PYTHON="$(command -v python3.12)" -pipx install --python "$CODE_MOWER_PYTHON" code-mower==0.6.0b3 +pipx install --python "$CODE_MOWER_PYTHON" code-mower==0.8.0b1 code-mower --version ``` @@ -42,7 +42,7 @@ interactive shell profile: ```bash uv python install 3.12 -uv tool install --python 3.12 code-mower==0.6.0b3 +uv tool install --python 3.12 code-mower==0.8.0b1 code-mower --version ``` @@ -59,7 +59,7 @@ For pipx: ```bash python3.12 --version export CODE_MOWER_PYTHON="$(command -v python3.12)" -PIP_NO_CACHE_DIR=1 pipx install --force --python "$CODE_MOWER_PYTHON" code-mower==0.6.0b3 +PIP_NO_CACHE_DIR=1 pipx install --force --python "$CODE_MOWER_PYTHON" code-mower==0.8.0b1 code-mower --version ``` @@ -67,7 +67,7 @@ For uv: ```bash uv python install 3.12 -uv tool install --python 3.12 --reinstall --refresh-package code-mower code-mower==0.6.0b3 +uv tool install --python 3.12 --reinstall --refresh-package code-mower code-mower==0.8.0b1 code-mower --version ``` @@ -95,7 +95,7 @@ old system Python shims cannot enter the release path: ```bash scripts/dev-python --version scripts/dev-python -m venv .venv -.venv/bin/python -m pip install -e . +.venv/bin/python -m pip install -e ".[test]" .venv/bin/code-mower --version ``` diff --git a/docs/mirror-removal-runbook.md b/docs/mirror-removal-runbook.md index fc57b51a..d3a787ca 100644 --- a/docs/mirror-removal-runbook.md +++ b/docs/mirror-removal-runbook.md @@ -32,7 +32,7 @@ Run: ```bash code-mower migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --repo-path /path/to/product-repo \ --json ``` diff --git a/docs/oss-v1-checklist.md b/docs/oss-v1-checklist.md index b5afd613..e761df40 100644 --- a/docs/oss-v1-checklist.md +++ b/docs/oss-v1-checklist.md @@ -40,7 +40,7 @@ history opens the repository. They should be able to confirm: ## Current Beta Baseline -The current public-release baseline is `v0.6.0-beta.3` of the standalone +The current public-release baseline is `v0.8.0-beta.1` of the standalone package. Before widening the release, record: - non-editable package-install rehearsal in a clean venv; @@ -49,7 +49,7 @@ package. Before widening the release, record: runs: TestPyPI first with `publish_testpypi=true`, `publish_pypi=false`, then production PyPI with `publish_testpypi=false`, `publish_pypi=true`; - package-install rehearsals against the exact TestPyPI and PyPI artifacts as - `code-mower==0.6.0b3` after those workflow runs finish, with workflow run + `code-mower==0.8.0b1` after those workflow runs finish, with workflow run links recorded as release evidence; - public-tag/source install validation as a fallback path; - production dogfood uploads from Code Mower OSS, CodeMower.com, and two @@ -181,7 +181,7 @@ It has not yet proved: ## Easy Mode Flow ```bash -pipx install --python python3.12 code-mower==0.6.0b3 +pipx install --python python3.12 code-mower==0.8.0b1 code-mower init --easy code-mower init --easy --apply --output-dir .code-mower.generated code-mower doctor --preflight @@ -191,7 +191,7 @@ code-mower --help-all code-mower next-steps --profile recommended code-mower migration wrapper-rehearsal --repo-path /path/to/product-repo --json code-mower migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --repo-path /path/to/repo \ --json code-mower audit pr 123 diff --git a/docs/package-customization.md b/docs/package-customization.md index 354fef82..325bc65a 100644 --- a/docs/package-customization.md +++ b/docs/package-customization.md @@ -284,7 +284,7 @@ run: ```bash code-mower migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --repo-path /path/to/product-repo \ --json ``` diff --git a/docs/post-v08-effectiveness-assessment.md b/docs/post-v08-effectiveness-assessment.md index 5c83f2a3..56a64426 100644 --- a/docs/post-v08-effectiveness-assessment.md +++ b/docs/post-v08-effectiveness-assessment.md @@ -29,10 +29,10 @@ candidates until more repositories and more adjudicated findings are captured. ## What Should Be Better -- **Cut a release for the completed source line.** The public package baseline - is still `v0.6.0-beta.3` / `code-mower==0.6.0b3` until the next beta is - tagged and published. The native Board work is merged on `main`, but it is - not available to package-only adopters until release. +- **Keep release verification routine.** The public package baseline is + `v0.8.0-beta.1` / `code-mower==0.8.0b1`; each beta should continue to prove + the PyPI install path, first-user rehearsal, local Board, and metadata-only + cloud checks before it is announced. - **Use more builders in live dogfood.** The v0.7/v0.8 implementation PRs were overwhelmingly Codex-authored. That was fast, but it does not yet compare Claude Code, Cursor/Grok Bot, Devin, or Antigravity as builders on equal @@ -68,7 +68,7 @@ reviewer-gate pilot, adoption diagnostics, and local visibility before promotion. It is not yet ready to be marketed as an unattended autonomous merge system for arbitrary teams. -The next release should package the v0.7/v0.8 source line, run one cold-repo -adoption rehearsal from the published package, and deliberately route a few -small follow-up issues through non-Codex builders and informational reviewers -so promotion decisions are based on measured evidence rather than enthusiasm. +The next release should keep running a cold-repo adoption rehearsal from the +published package and deliberately route a few small follow-up issues through +non-Codex builders and informational reviewers so promotion decisions are based +on measured evidence rather than enthusiasm. diff --git a/docs/prd-addendum-v05-beta.md b/docs/prd-addendum-v05-beta.md index 15e77e89..99137b1e 100644 --- a/docs/prd-addendum-v05-beta.md +++ b/docs/prd-addendum-v05-beta.md @@ -14,7 +14,7 @@ environment before they are treated as shareable. schema-structuring phase inherited a repository check that only made sense from an editable source checkout. `v0.5.0-beta.8` fixed that by making the installed-package transport path explicit and then validating it from the public -tag. `v0.6.0-beta.3` keeps that installed-package gate and carries the same +tag. `v0.8.0-beta.1` keeps that installed-package gate and carries the same provenance discipline into provider-contract, stale-audit, catch-up, and dashboard trust work. @@ -33,7 +33,7 @@ workflow history as reviewer-value evidence. `v0.5.0-beta.49` added a dedicated authenticated lineage drilldown for the planning and execution chain: issue -> posted plan -> work order -> pull -request -> reviewer checks -> merge -> upload. `v0.6.0-beta.3` carries that +request -> reviewer checks -> merge -> upload. `v0.8.0-beta.1` carries that trust surface forward while adding the owner-bound WIP, lane-liveness, fix-round, human-token, owner-decision, provider-namespace, builder-experiment, and lane-status hardening from the later dogfood follow-ups. The lineage page diff --git a/docs/public-release-checklist.md b/docs/public-release-checklist.md index 09fc8f4c..9ab6576d 100644 --- a/docs/public-release-checklist.md +++ b/docs/public-release-checklist.md @@ -11,18 +11,17 @@ not know the original reference repos. - Apache-2.0 `LICENSE` and `NOTICE` are present. - The package has alpha/beta releases and reports its version with `code-mower --version`. -- The current package-index beta entrypoint is `code-mower==0.6.0b3`, with +- The current package-index beta entrypoint is `code-mower==0.8.0b1`, with `code-mower doctor --adoption --repo OWNER/REPO` as the human-facing first-run setup diagnostic and `code-mower lanes status --repo OWNER/REPO` as the operator snapshot. The corresponding GitHub tag is - `v0.6.0-beta.3`; `doctor --preflight` and `doctor --v05` remain + `v0.8.0-beta.1`; `doctor --preflight` and `doctor --v05` remain compatibility presets for scripts. -- The v0.7/v0.8 source line has landed on `main`: Python 3.12+ install - hardening, hosted-builder doctor postures, non-expiring token diagnostics, - native redacted lane status, local Board, Board history, spend/verdict - timelines, owner queue, optional metadata-only agent cards, Board doctor, - Board reset, and the public Board demo rehearsal. Cut and rehearse a new beta - before asking package-only adopters to rely on that source-line behavior. +- The v0.8 package beta includes Python 3.12+ install hardening, + hosted-builder doctor postures, non-expiring token diagnostics, native + redacted lane status, local Board, Board history, spend/verdict timelines, + owner queue, optional metadata-only agent cards, Board doctor, Board reset, + and the public Board demo rehearsal. - The README now shows a shortened `doctor --adoption --repo OWNER/REPO` example so fresh users can see the payoff before installing. - The first-run transcript, architecture overview, cloud data contract, and diff --git a/docs/pypi-release.md b/docs/pypi-release.md index 1ad1ced0..f2c12772 100644 --- a/docs/pypi-release.md +++ b/docs/pypi-release.md @@ -5,7 +5,7 @@ and wheel distributions, verifies them with `twine check`, and can publish to TestPyPI or production PyPI through trusted publishing. ```bash -pipx install --python python3.12 code-mower==0.6.0b3 +pipx install --python python3.12 code-mower==0.8.0b1 ``` ## Current Status @@ -85,7 +85,7 @@ same artifact download path used by the optional PyPI publish job, then runs For beta releases, keep release metadata honest: ```bash -gh release view v0.6.0-beta.3 \ +gh release view v0.8.0-beta.1 \ --repo codemower-ai/code-mower \ --json tagName,isPrerelease gh api repos/codemower-ai/code-mower/releases/latest \ @@ -136,7 +136,7 @@ For pipx: ```bash python3.12 --version export CODE_MOWER_PYTHON="$(command -v python3.12)" -PIP_NO_CACHE_DIR=1 pipx install --force --python "$CODE_MOWER_PYTHON" code-mower==0.6.0b3 +PIP_NO_CACHE_DIR=1 pipx install --force --python "$CODE_MOWER_PYTHON" code-mower==0.8.0b1 code-mower --version ``` @@ -144,7 +144,7 @@ For uv: ```bash uv python install 3.12 -uv tool install --python 3.12 --reinstall --refresh-package code-mower code-mower==0.6.0b3 +uv tool install --python 3.12 --reinstall --refresh-package code-mower code-mower==0.8.0b1 code-mower --version ``` @@ -170,7 +170,7 @@ For production PyPI verification: ```bash python3.12 -m venv /tmp/code-mower-pypi-smoke /tmp/code-mower-pypi-smoke/bin/python -m pip install --upgrade pip -/tmp/code-mower-pypi-smoke/bin/python -m pip install code-mower==0.6.0b3 +/tmp/code-mower-pypi-smoke/bin/python -m pip install code-mower==0.8.0b1 /tmp/code-mower-pypi-smoke/bin/code-mower --version ``` @@ -178,7 +178,7 @@ Then run the release-gate first-user rehearsal against the same package: ```bash code-mower migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --python "$(command -v python3.12)" \ --json ``` @@ -226,7 +226,7 @@ The primary README command should stay on an explicit beta version until a stable `1.0` line exists: ```bash -pipx install --python python3.12 code-mower==0.6.0b3 +pipx install --python python3.12 code-mower==0.8.0b1 ``` Do not switch to unpinned `pipx install code-mower` until: diff --git a/docs/quickstart.md b/docs/quickstart.md index 9e3ab6cd..4da6826f 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -3,7 +3,7 @@ This is the reference for Code Mower's first-user command surface. For the two guided starts, use [Try Code Mower In 10 Minutes](try-in-10-minutes.md) for the reviewer gate or [Build Loop In 30 Minutes](build-loop-in-30-minutes.md) for -builders plus orchestrator convention. Code Mower v0.6 is beta software; start +builders plus orchestrator convention. Code Mower v0.8 is beta software; start on one repository and keep all reviewer lanes manual until the output is useful on your codebase. @@ -21,11 +21,11 @@ boxes, and contributor checkouts, use the full ```bash python3.12 --version export CODE_MOWER_PYTHON="$(command -v python3.12)" -pipx install --python "$CODE_MOWER_PYTHON" code-mower==0.6.0b3 +pipx install --python "$CODE_MOWER_PYTHON" code-mower==0.8.0b1 code-mower --version ``` -`0.6.0b3` is a beta release. If you want the newest prerelease instead of this +`0.8.0b1` is a beta release. If you want the newest prerelease instead of this exact verified beta, use: ```bash @@ -36,7 +36,7 @@ For hosted agents or CI boxes without pipx: ```bash uv python install 3.12 -uv tool install --python 3.12 code-mower==0.6.0b3 +uv tool install --python 3.12 code-mower==0.8.0b1 ``` For a Code Mower source checkout, use `scripts/dev-python` and the editable @@ -58,7 +58,7 @@ running multiple builders against the same repository. ## 2. Authenticate GitHub -Code Mower v0.6 is GitHub-first. +Code Mower v0.8 is GitHub-first. ```bash gh auth login -h github.com -s repo,workflow,read:org @@ -353,7 +353,7 @@ export bundle, upload dry run, and CodeMower.com dogfood dry run. ```bash code-mower migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --python "$(command -v python3.12)" \ --json ``` diff --git a/docs/repo-strategy.md b/docs/repo-strategy.md index 455f69d7..4a2d8fd2 100644 --- a/docs/repo-strategy.md +++ b/docs/repo-strategy.md @@ -135,7 +135,7 @@ serialize through their shared lock. The default checkout-lock timeout is long enough for normal audit runs to queue instead of failing after two minutes; dead locks are still cleared by the PID/staleness checks. -`v0.6.0-beta.3` keeps the smoke runner, package plan, docs, next-step cloud +`v0.8.0-beta.1` keeps the smoke runner, package plan, docs, next-step cloud export examples, draft auto-discovery rehearsal, and opt-in upload dry run aligned on reviewer metrics, lane policy, and value report bundles. The public package also includes the formerly private hardening work that made product diff --git a/docs/try-in-10-minutes.md b/docs/try-in-10-minutes.md index 7b83f8ee..99a0a30c 100644 --- a/docs/try-in-10-minutes.md +++ b/docs/try-in-10-minutes.md @@ -20,11 +20,11 @@ paths. The laptop path is: ```bash python3.12 --version export CODE_MOWER_PYTHON="$(command -v python3.12)" -pipx install --python "$CODE_MOWER_PYTHON" code-mower==0.6.0b3 +pipx install --python "$CODE_MOWER_PYTHON" code-mower==0.8.0b1 code-mower --version ``` -`0.6.0b3` is a beta release. To follow the newest beta line instead of +`0.8.0b1` is a beta release. To follow the newest beta line instead of pinning this exact build: ```bash @@ -199,7 +199,7 @@ virtual environment, run: ```bash code-mower migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --python "$(command -v python3.12)" \ --json ``` @@ -211,7 +211,7 @@ repo's native checks. ```bash code-mower migration package-install-rehearsal \ - --package-spec code-mower==0.6.0b3 \ + --package-spec code-mower==0.8.0b1 \ --repo-path /path/to/repo \ --python "$(command -v python3.12)" \ --json diff --git a/docs/v08-release-notes.md b/docs/v08-release-notes.md new file mode 100644 index 00000000..a2c9cc2e --- /dev/null +++ b/docs/v08-release-notes.md @@ -0,0 +1,56 @@ +# Code Mower v0.8.0-beta.1 Release Notes + +This beta packages the v0.7 adoption hardening and v0.8 native Board work. +Install the pinned beta with +`pipx install --python python3.12 code-mower==0.8.0b1`. + +## Headline + +Code Mower v0.8 is a better first install for supervised multi-agent adoption: +clearer Python/install expectations, less noisy doctor output for hosted +builders, a one-command lane status snapshot, and a native local Board for +operator visibility without AgentTrail or hook setup. + +## What's New + +- Python support is now explicit: Code Mower requires Python 3.12 or newer, and + CI exercises Python 3.12, 3.13, and 3.14. +- Install docs cover pipx for laptops, `uv tool install` for hosted agents and + minimal Linux boxes, and editable venvs for contributors. +- Doctor has adoption-oriented profiles for local runners, hosted builders, and + orchestrator-only setups, plus clearer dispatch-token diagnostics including + non-expiring tokens. +- `code-mower lanes status --repo OWNER/REPO` provides a concise, + metadata-only operator snapshot of active PR lanes, labels, checks, workflow + runs, gate health, and next action. +- `code-mower board serve --repo OWNER/REPO` starts a local read-only Board with + redacted lane status, local history, owner queue, spend/latency, verdicts, and + optional metadata-only agent cards. +- Board history/admin commands (`board record`, `board doctor`, and + `board reset`) make local visibility manageable without requiring cloud + upload. +- `code-mower cloud board-snapshot` uploads explicit zero-report Board snapshot + metadata for CodeMower.com mirrors while preserving the existing privacy + boundary. +- The cloud token resolver is shared across cloud commands: environment tokens + still win, `--token-file` is explicit, stored local profiles are supported, + and ambiguous token stores fail with safe filename-only guidance. +- Generated builder-provenance workflows now install this beta package by + default. +- Release, quickstart, install, and first-user rehearsal docs now use the same + current beta pin and keep the GitHub release marked as Latest even though the + software is still beta. + +## Privacy + +The privacy boundary is unchanged. Code Mower uploads remain opt-in and +metadata-only. Do not upload source code, raw diffs, transcripts, issue body +text, raw stdout/stderr, auth output, local secret values, or secrets. + +## Adoption Guidance + +Use this release for supervised early-adopter pilots, not unattended autonomous +merge infrastructure. Start with the reviewer gate, keep lanes informational +until repository-specific calibration supports promotion, use `lanes status` +and the Board for day-to-day visibility, and route a few small issues through +non-Codex builders/reviewers before making promotion claims. diff --git a/pyproject.toml b/pyproject.toml index 11c50eb0..5f54ce4e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "code-mower" -version = "0.6.0b3" +version = "0.8.0b1" description = "Multi-reviewer AI code audit orchestration" requires-python = ">=3.12" readme = "README.md" @@ -13,8 +13,10 @@ dependencies = ["PyYAML>=6.0"] [project.optional-dependencies] test = [ + "build>=1.2", "pytest>=8.0", "ruff>=0.8", + "twine>=5.0", ] [project.scripts] diff --git a/src/code_mower/__init__.py b/src/code_mower/__init__.py index 07951ffd..ee358354 100644 --- a/src/code_mower/__init__.py +++ b/src/code_mower/__init__.py @@ -1,3 +1,3 @@ """Code Mower package.""" -__version__ = "0.6.0b3" +__version__ = "0.8.0b1" diff --git a/src/code_mower/templates/workflows/builder-provenance.yml.j2 b/src/code_mower/templates/workflows/builder-provenance.yml.j2 index eb0aa6df..2172f498 100644 --- a/src/code_mower/templates/workflows/builder-provenance.yml.j2 +++ b/src/code_mower/templates/workflows/builder-provenance.yml.j2 @@ -8,7 +8,7 @@ permissions: contents: read env: - CODE_MOWER_PACKAGE_SPEC: code-mower==0.6.0b3 + CODE_MOWER_PACKAGE_SPEC: code-mower==0.8.0b1 jobs: auto-record: diff --git a/templates/workflows/builder-provenance.yml.j2 b/templates/workflows/builder-provenance.yml.j2 index eb0aa6df..2172f498 100644 --- a/templates/workflows/builder-provenance.yml.j2 +++ b/templates/workflows/builder-provenance.yml.j2 @@ -8,7 +8,7 @@ permissions: contents: read env: - CODE_MOWER_PACKAGE_SPEC: code-mower==0.6.0b3 + CODE_MOWER_PACKAGE_SPEC: code-mower==0.8.0b1 jobs: auto-record: diff --git a/tests/test_release_hygiene.py b/tests/test_release_hygiene.py index 2497138a..f0697bbf 100644 --- a/tests/test_release_hygiene.py +++ b/tests/test_release_hygiene.py @@ -65,7 +65,7 @@ class ReleaseHygieneTests(unittest.TestCase): def test_version_is_current_beta_prerelease(self) -> None: - self.assertEqual(__version__, "0.6.0b3") + self.assertEqual(__version__, "0.8.0b1") def test_release_workflow_verifies_downloaded_distributions_before_publish(self) -> None: workflow = (ROOT / ".github/workflows/release.yml").read_text(encoding="utf-8") @@ -84,8 +84,10 @@ def test_test_extra_matches_contributor_setup_docs(self) -> None: extras = pyproject["project"]["optional-dependencies"] self.assertIn("test", extras) + self.assertIn("build>=1.2", extras["test"]) self.assertIn("pytest>=8.0", extras["test"]) self.assertIn("ruff>=0.8", extras["test"]) + self.assertIn("twine>=5.0", extras["test"]) def test_python_support_contract_is_312_plus(self) -> None: pyproject = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8")) @@ -301,7 +303,7 @@ def test_cli_default_help_is_first_user_focused(self) -> None: self.assertIn( ( "code-mower migration package-install-rehearsal --package-spec " - "code-mower==0.6.0b3 --json" + "code-mower==0.8.0b1 --json" ), help_text, ) @@ -954,7 +956,7 @@ def test_direct_cli_execution_points_to_package_or_dev_wrapper(self) -> None: ) self.assertNotEqual(completed.returncode, 0) - self.assertIn("pipx install code-mower==0.6.0b3", completed.stderr) + self.assertIn("pipx install code-mower==0.8.0b1", completed.stderr) self.assertIn("scripts/dev-python -m venv .venv", completed.stderr) self.assertIn(".venv/bin/code-mower", completed.stderr) self.assertNotIn("PYTHONPATH=src", completed.stderr) @@ -5040,11 +5042,11 @@ def test_package_materializer_can_run_from_extracted_checkout(self) -> None: (output_dir / "src/code_mower/cloud_client/dogfood.py").is_file() ) self.assertIn( - 'version = "0.6.0b3"', + 'version = "0.8.0b1"', (output_dir / "pyproject.toml").read_text(encoding="utf-8"), ) self.assertIn( - '__version__ = "0.6.0b3"', + '__version__ = "0.8.0b1"', (output_dir / "src/code_mower/__init__.py").read_text( encoding="utf-8" ), @@ -6966,10 +6968,10 @@ def test_release_readiness_reports_package_index_promotion_gate(self) -> None: payload = release_readiness.render_release_readiness(ROOT) self.assertEqual(payload["status"], "pass") - self.assertEqual(payload["version"], "0.6.0b3") - self.assertEqual(payload["release_tag"], "v0.6.0-beta.3") - self.assertEqual(payload["alpha_tag"], "v0.6.0-beta.3") - self.assertEqual(payload["package_index_spec"], "code-mower==0.6.0b3") + self.assertEqual(payload["version"], "0.8.0b1") + self.assertEqual(payload["release_tag"], "v0.8.0-beta.1") + self.assertEqual(payload["alpha_tag"], "v0.8.0-beta.1") + self.assertEqual(payload["package_index_spec"], "code-mower==0.8.0b1") check_ids = {check["id"]: check for check in payload["checks"]} self.assertEqual(check_ids["package-version-consistency"]["status"], "pass") self.assertEqual( @@ -6985,9 +6987,9 @@ def test_release_readiness_reports_package_index_promotion_gate(self) -> None: self.assertEqual(check_ids["public-support-redaction-guidance"]["status"], "pass") commands = {action["id"]: action["command"] for action in payload["next_actions"]} urls = {action["id"]: action.get("url", "") for action in payload["next_actions"]} - self.assertIn("--ref v0.6.0-beta.3", commands["dry-run-release-workflow"]) + self.assertIn("--ref v0.8.0-beta.1", commands["dry-run-release-workflow"]) self.assertNotIn("--ref main", commands["dry-run-release-workflow"]) - self.assertIn("--ref v0.6.0-beta.3", commands["publish-testpypi-candidate"]) + self.assertIn("--ref v0.8.0-beta.1", commands["publish-testpypi-candidate"]) self.assertNotIn("--ref main", commands["publish-testpypi-candidate"]) self.assertIn("publish_testpypi=true", commands["publish-testpypi-candidate"]) self.assertIn("publish_pypi=false", commands["publish-testpypi-candidate"]) @@ -7022,7 +7024,7 @@ def test_release_readiness_fails_on_materialized_package_version_drift( check_ids = {check["id"]: check for check in payload["checks"]} check = check_ids["materialized-package-version-consistency"] self.assertEqual(check["status"], "fail") - self.assertEqual(check["detail"]["source_version"], "0.6.0b3") + self.assertEqual(check["detail"]["source_version"], "0.8.0b1") self.assertEqual(check["detail"]["generated_init_version"], "0.0.0") def test_public_support_docs_are_packaged_and_privacy_forward(self) -> None: @@ -7138,8 +7140,8 @@ def test_public_release_baseline_helpers_derive_announcement_links(self) -> None self.assertEqual( code_mower_versioning.public_baseline_sentence(__version__), ( - "The current package-index beta baseline is `v0.6.0-beta.3`, " - "with pinned package install spec `code-mower==0.6.0b3`. " + "The current package-index beta baseline is `v0.8.0-beta.1`, " + "with pinned package install spec `code-mower==0.8.0b1`. " "Release evidence is recorded on the GitHub release and in the " "first-user install rehearsal." ), @@ -7148,7 +7150,7 @@ def test_public_release_baseline_helpers_derive_announcement_links(self) -> None code_mower_versioning.tagged_doc_url(__version__), ( "https://github.com/codemower-ai/code-mower/blob/" - "v0.6.0-beta.3/docs/try-in-10-minutes.md" + "v0.8.0-beta.1/docs/try-in-10-minutes.md" ), ) @@ -7202,28 +7204,25 @@ def test_current_beta_release_docs_record_package_index_procedure(self) -> None: ) current_status = ( - "The current package-index beta baseline is `v0.6.0-beta.3`, with " - "pinned package install spec `code-mower==0.6.0b3`. Release " + "The current package-index beta baseline is `v0.8.0-beta.1`, with " + "pinned package install spec `code-mower==0.8.0b1`. Release " "evidence is recorded on the GitHub release and in the first-user " "install rehearsal." ) for text in (readme, current_state, rollout): self.assertIn(current_status, " ".join(text.split())) self.assertIn( - "The current package-index beta entrypoint is `code-mower==0.6.0b3`", - public_release, - ) - self.assertIn( - "The v0.7/v0.8 source line has landed on `main`", + "The current package-index beta entrypoint is `code-mower==0.8.0b1`", public_release, ) + self.assertIn("The v0.8 package beta includes", public_release) self.assertIn( "`code-mower lanes status --repo OWNER/REPO` as the operator snapshot", " ".join(public_release.split()), ) self.assertIn( - "The current public-release baseline is `v0.6.0-beta.3`", + "The current public-release baseline is `v0.8.0-beta.1`", oss_checklist, ) self.assertIn( @@ -7241,7 +7240,7 @@ def test_current_beta_release_docs_record_package_index_procedure(self) -> None: oss_checklist, ) - self.assertIn("## v0.6 Beta Package-Index Release Procedure", first_user) + self.assertIn("## v0.8 Beta Package-Index Release Procedure", first_user) self.assertIn("## Cache-Bypass And Local Wheel Checks", first_user) self.assertIn("## Cache Bypass And Propagation Triage", pypi_release) for text in (first_user, pypi_release): @@ -7254,7 +7253,7 @@ def test_current_beta_release_docs_record_package_index_procedure(self) -> None: " ".join(first_user.split()), ) self.assertIn("never substitute mutable `main`", first_user) - self.assertEqual(first_user.count(" --ref v0.6.0-beta.3 \\"), 2) + self.assertEqual(first_user.count(" --ref v0.8.0-beta.1 \\"), 2) self.assertNotIn(" --ref main \\", first_user) self.assertIn("-f publish_testpypi=true", first_user) self.assertIn("-f publish_pypi=false", first_user) @@ -7266,23 +7265,23 @@ def test_current_beta_release_docs_record_package_index_procedure(self) -> None: first_user, ) self.assertNotIn( - "The latest public-package rehearsal for `v0.6.0-beta.3` was run", + "The latest public-package rehearsal for `v0.8.0-beta.1` was run", first_user, ) - self.assertNotIn("TestPyPI is not\npublished for `0.6.0b3`", first_user) + self.assertNotIn("TestPyPI is not\npublished for `0.8.0b1`", first_user) for text in (readme, current_state, rollout): self.assertNotIn( - "published on PyPI as `code-mower==0.6.0b3`", + "published on PyPI as `code-mower==0.8.0b1`", text, ) self.assertNotIn( "latest 10/10 public-package readiness proof for " - "`code-mower==0.6.0b3`", + "`code-mower==0.8.0b1`", text, ) self.assertNotIn( "public PyPI package-install rehearsal from " - "`code-mower==0.6.0b3`", + "`code-mower==0.8.0b1`", text, ) self.assertNotIn("beta.52: 10/10 first-user readiness", text) @@ -7570,7 +7569,7 @@ def test_install_docs_cover_supported_adoption_paths(self) -> None: self.assertIn("Python 3.12 or newer", install) self.assertIn('pipx install --python "$CODE_MOWER_PYTHON"', install) - self.assertIn("uv tool install --python 3.12 code-mower==0.6.0b3", install) + self.assertIn("uv tool install --python 3.12 code-mower==0.8.0b1", install) self.assertIn( 'PIP_NO_CACHE_DIR=1 pipx install --force --python "$CODE_MOWER_PYTHON"', install, @@ -7580,7 +7579,7 @@ def test_install_docs_cover_supported_adoption_paths(self) -> None: install, ) self.assertIn("dist/code_mower-*.whl", install) - self.assertIn(".venv/bin/python -m pip install -e .", install) + self.assertIn('.venv/bin/python -m pip install -e ".[test]"', install) self.assertIn("## Multi-Agent Coexistence", install) self.assertIn("code-mower board serve --repo OWNER/REPO", install) self.assertIn("~/.config/code-mower/tokens/", install) @@ -7635,13 +7634,14 @@ def test_v06_adoption_polish_docs_cover_cold_start_surface(self) -> None: troubleshooting = (ROOT / "docs" / "troubleshooting.md").read_text( encoding="utf-8", ) - release_notes = (ROOT / "docs" / "v06-release-notes.md").read_text( + release_notes = (ROOT / "docs" / "v08-release-notes.md").read_text( encoding="utf-8", ) self.assertIn("Cold adopters should start with the reviewer gate", readme) self.assertIn("code-mower builder-experiment run", readme) self.assertIn("[v0.6 Release Notes](docs/v06-release-notes.md)", readme) + self.assertIn("[v0.8 Release Notes](docs/v08-release-notes.md)", readme) self.assertIn("Gemini CLI and Antigravity are distinct lane ids", readme) self.assertIn("Claude Code/Codex/Cursor as builders", quickstart) self.assertIn("Gitar plus Antigravity as informational", quickstart) @@ -7649,11 +7649,11 @@ def test_v06_adoption_polish_docs_cover_cold_start_surface(self) -> None: self.assertIn("Manual Audit Wrapper Fails Before Reviewing", troubleshooting) self.assertIn("OWNER/REPO:/absolute/path/to/pr-head-checkout", troubleshooting) self.assertIn("structured output", " ".join(troubleshooting.split())) - self.assertIn("Code Mower v0.6.0-beta.3 Release Notes", release_notes) - self.assertIn("`code_mower.provider_runners`", release_notes) - self.assertIn("code_mower.authoringRun.v1", release_notes) + self.assertIn("Code Mower v0.8.0-beta.1 Release Notes", release_notes) + self.assertIn("code-mower lanes status --repo OWNER/REPO", release_notes) + self.assertIn("code-mower board serve --repo OWNER/REPO", release_notes) self.assertIn("metadata-only", release_notes) - self.assertIn("no source code, raw diffs", release_notes) + self.assertIn("raw diffs", release_notes) def test_package_command_inventory_derives_current_prerelease_spec(self) -> None: package_content_text = (ROOT / "src/code_mower/package_content.py").read_text( @@ -7850,7 +7850,7 @@ def test_next_steps_includes_cloud_upload_dry_run_after_export(self) -> None: "doctor --adoption --repo codemower-ai/code-mower", doctor_step["command"], ) - self.assertIn("code-mower==0.6.0b3", package_step["command"]) + self.assertIn("code-mower==0.8.0b1", package_step["command"]) self.assertIn("current published PyPI prerelease", package_step["why"]) self.assertIn("first_user_readiness", package_step["why"]) self.assertEqual(