Automation uses Invoke tasks that wrap uv.
Common workflows:
# CI parity
uv run invoke ci
# Dry-run a release to TestPyPI
uv run invoke release --dry-run --push-tag --token "$TEST_PYPI_TOKEN" \
--index-url https://test.pypi.org/legacy/ --skip-existing
# Publish to PyPI
export PYPI_TOKEN="pypi-..."
uv run invoke release --push-tag --token "$PYPI_TOKEN"
Update SPEC.md (Phase 9) and notes/STATUS.md after releases. Use a feature branch and ensure CI is green before merging to main.