Semantic Versioning Policy¶
avo follows Semantic Versioning 2.0.0. The public API surface is frozen at version 0.2.0; any change to a documented surface requires a corresponding SemVer bump.
Version grammar¶
Given a version MAJOR.MINOR.PATCH:
MAJOR— incompatible API changes.MINOR— backwards-compatible new functionality.PATCH— backwards-compatible bug fixes.
Pre-1.0 (0.x.y) signals an unstable API; minor bumps may include
breaking changes until 1.0.0 is released.
What counts as public¶
A symbol, file, environment variable, or CLI form is public when it appears in one of the following locations:
docs/api-stability.md(the canonical list).- Any module's
__all__attribute. - Any export from the
avopackage root. - Any
AVO_*environment variable consumed by the runtime. - Any
avo <command>form documented in the README oravo --help. - Any public
ProviderAdapter,FunctionTool, or hook callback signature inavo.providers,avo.tools, oravo.hooks.
Everything else is internal and may change without notice, including (but not limited to):
- The on-disk layout of the SQLite event log.
- The wire format of any internal protocol.
- The exact contents of
tracing.TraceInspectortext output. - The
avo_coreRust wheel's PyO3 surface (when applicable).
Deprecation process¶
Breaking changes follow a three-step process:
- Deprecate. Mark the symbol with a
DeprecationWarningand add a@deprecateddecorator (or equivalent marker) one minor release ahead of removal. - Document. Add an entry under the
Deprecatedsection ofCHANGELOG.mdfor the release that introduced the deprecation. - Remove. Removal happens on the next
MAJORbump (or on a subsequentMINORbump while the project is still pre-1.0, with the sameDeprecatedentry updated toRemoved).
The full process applies to:
- Removed or renamed public exports.
- Removed or renamed
AVO_*environment variables. - Removed or changed CLI subcommands or flags.
- Changed
ProviderAdapterorFunctionToolmethod signatures.
Patch-level changes¶
Bug fixes that do not alter observable behavior may ship as a
PATCH bump without prior notice. Examples:
- Internal refactors with no API change.
- Performance improvements that preserve output.
- Documentation corrections.
- Test-only changes.
Pre-1.0 caveat¶
While the major version is 0, the MINOR position is treated as
the breaking-change boundary. A bump from 0.1.x to 0.2.0 may
include removals of symbols deprecated in 0.1.x. The deprecation
process above still applies — symbols land in Deprecated first
and stay for at least one minor release before removal.
How to propose a breaking change¶
- Open an issue describing the change and migration path.
- Wait for maintainer sign-off before implementing.
- Add the symbol to
DeprecatedinCHANGELOG.mdfor the release that ships the deprecation. - Ship the removal on the next breaking-change release.
Stability guarantees¶
| Surface | Pre-1.0 | Post-1.0 |
|---|---|---|
Public exports listed in docs/api-stability.md |
may change with deprecation notice | frozen |
AVO_* environment variable names |
may change with deprecation notice | frozen |
| CLI subcommand grammar | may change with deprecation notice | frozen |
| SQLite event-log schema | may migrate; migrations shipped | frozen; migrations only |
ProviderAdapter protocol |
may add new optional methods | frozen |
| Hook event names | may add new event names | frozen |
Versioning of optional dependencies¶
Dependencies under [project.optional-dependencies] (e.g. [otel],
[sandbox], [mcp]) follow their own SemVer cadence. Avo bumps
the minimum required version of an optional dep only when:
- The new version is required to fix a known incompatibility, or
- The old version reaches end-of-life upstream.
Optional dep changes never trigger an avo MAJOR bump.