Current active target: 1.0.0
This document is the canonical release and compatibility policy for Ruff. It defines how maintainers cut releases, what compatibility guarantees apply, and which gates must pass before a tag is created.
Ruff follows semantic versioning-oriented release classes:
MAJOR(X.y.z): compatibility reset with explicit migration guidance.MINOR(x.Y.z): additive language/runtime/tooling features and planned compatibility updates.PATCH(x.y.Z): compatibility-preserving fixes, security fixes, performance improvements, and documentation/process corrections.
Major-release policy note:
- Ruff is now at
1.0.0. - Future major-version changes must include explicit compatibility and migration guidance.
- Previously valid syntax should remain valid within a patch line.
- Parser/runtime behavior changes that alter existing successful program output require explicit changelog notes.
- Intentional breaking language changes require a planned release-cycle callout and migration notes.
- Stable builtin names and documented argument contracts should remain compatible within a patch line.
- Security hardening may tighten behavior (for example rejecting unsafe defaults) when required; such changes must be documented as compatibility-impacting fixes.
- Capability requirements for host-effect APIs are part of the compatibility contract and must be documented in
docs/STANDARD_LIBRARY.mdanddocs/NATIVE_API_SECURITY_POSTURE.md.
- Human-readable diagnostic text may improve over time.
- Diagnostic
code,subsystem, and machine-readable JSON field shape are stability surfaces. - CLI/LSP JSON field removals or type changes are breaking; additive optional fields are non-breaking.
Exit code classes are contract-stable for automation:
0: success1: command/gate failure2: usage/argument parse failure3: lexer/parser diagnostics4: runtime semantic failure5: IO failure6: internal/tooling failure
- Ruff package workflows treat
ruff.lockas the deterministic dependency snapshot derived fromruff.toml. ruff package-installregenerates lockfile state deterministically (stable ordering and schema metadata).ruff package-install --frozenis the verify mode and must fail whenruff.lockis missing or out of date relative toruff.toml.- Release candidates should include a lockfile verification pass for package workflow fixtures and examples that use manifests.
The release gate is enforced by scripts/release_gate.sh and CI workflows.
Canonical full gate command:
bash scripts/release_gate.sh --fullRelease-candidate readiness gate command:
bash scripts/release_candidate_gate.sh --fullFast smoke gate command:
bash scripts/release_gate.sh --minimalRoadmap-only readiness precheck:
bash scripts/release_candidate_gate.sh --roadmap-onlyFull gate command order:
cargo fmt --checkcargo clippy --all-targets --all-features -- -D warningscargo test- Focused integration suites:
cargo test --test native_api_security_boundariescargo test --test package_module_workflow_integrationcargo test --test vm_interpreter_parity_surfaces- optional
cargo test --test serve_command_integrationwhenRUFF_ENABLE_SOCKET_TESTS=1
- Ruff self-test fixtures:
cargo run -- test - Optional tools when installed:
cargo audit,cargo deny check
Optional benchmark smoke in full mode:
RUFF_RELEASE_GATE_RUN_BENCH=1 bash scripts/release_gate.sh --fullBefore tagging 1.0.0-rc or 1.0.0:
- Confirm all P0 and P1 roadmap items are complete in
ROADMAP.md. - Confirm every deferred P2 item is explicitly documented.
- Run full release gate and required integration suites.
- Validate release-state consistency checks.
- Record release evidence in
notes/with exact commands and outcomes.
Recommended RC staging flow:
- Branch from
main(for examplerelease/1.0.0-rc1). - Freeze scope to release blockers only.
- Re-run full gates after each blocker fix.
- Cut RC tag only from a clean tree.
- Promote RC to final tag only after all gates remain green.
CHANGELOG.md must follow Keep a Changelog structure with concrete user impact.
Required section categories (when applicable):
AddedChangedFixedSecurityPerformanceRemoved
Release-entry template:
## [X.Y.Z] - YYYY-MM-DD
### Added
- ...
### Changed
- ...
### Fixed
- ...
### Security
- ...
### Performance
- ...Rules:
- Keep entries specific and user-facing.
- Call out compatibility-impacting changes explicitly.
- Include migration guidance when behavior changes could break automation or scripts.
- Confirm local repository state.
git status --short
git branch --show-current- Run release gates.
bash scripts/release_gate.sh --full
bash .github/scripts/check-release-state.sh- Validate editor extension baseline when cycle scope includes editor/tooling updates.
cd tools/vscode-ruff-extension
npm ci
npm run check
cd ../..- Confirm roadmap and artifact checklist status:
ROADMAP.mddocs/RELEASE_ARTIFACT_CHECKLIST_V1_0_0.md
- Confirm release evidence notes exist and are up to date under
notes/.
- Set
[package].versioninCargo.toml. - Create/complete the target release section in
CHANGELOG.md. - Update release-status strings in:
README.mdROADMAP.md
- Re-run release-state guard:
bash .github/scripts/check-release-state.sh- Create release commit.
git add Cargo.toml Cargo.lock CHANGELOG.md README.md ROADMAP.md docs/RELEASE_PROCESS.md
git commit -m ":rocket: RELEASE: vX.Y.Z"
git push origin main- Create and push annotated tag.
git tag -a vX.Y.Z -m "Ruff vX.Y.Z"
git push origin vX.Y.Z- Publish crate (when applicable):
cargo publish --dry-run
cargo publish-
Publish GitHub release artifacts (Linux/macOS binaries + checksums) via release workflows.
-
Run published-artifact smoke validation and record outcomes.
Use before high-risk releases:
- Create dry-run branch.
- Execute full gates.
- Apply version/doc edits as rehearsal.
- Run checks again.
- Create dry-run commit.
- Record commands/results in
notes/. - Discard or merge dry-run branch after review.
Dry-run success criteria:
- no undocumented manual steps
- deterministic command outcomes
- release-state guard passes
Every release (including RC) needs a dated note under notes/ that includes:
- execution context (local/CI, host details)
- exact commands run
- pass/fail status per command
- warnings/exceptions and rationale
- explicit sign-off statement for release readiness
Do not mark release checklist items complete without evidence.