-
Notifications
You must be signed in to change notification settings - Fork 0
Stability
VTX has three independent versioning surfaces. They evolve on separate cadences and have separate compatibility rules. This page documents the policy.
-
Public C++ API (headers under
sdk/include/vtx/). -
On-disk format (the
.vtxfile layout, including header, chunk encoding, and footer). -
Schemas (the
schema.jsonfiles produced by the Schema Creator and embedded in recorded files).
The maturity headline: VTX is pre-1.0. Until 1.0, any of the three surfaces can change incompatibly between releases. We try not to, and we call it out in CHANGELOG.md when we do.
Semantic versioning. Given a public release MAJOR.MINOR.PATCH:
-
PATCHbumps: bug fixes. No API changes. Drop-in upgrade. -
MINORbumps: additive API changes. New functions, new enums, new struct fields with safe defaults. Existing callers keep compiling and linking. -
MAJORbumps: breaking API changes. Removed or renamed symbols, changed signatures, changed semantics. A migration note lands inCHANGELOG.md.
Minor bumps may include breaking changes. We try to keep them to recognisable boundaries (a release, a deprecation window) but will not guarantee ABI or source compatibility. Pin a specific tag if stability matters to you during this period.
- Any header under
sdk/include/vtx/and the symbols declared in it. - Behaviour documented in this wiki, the repo
docs/, or header comments.
Internal headers under sdk/src/ and anonymous-namespace / detail:: code are not public. Do not depend on them; they change without notice.
No ABI stability guarantee, at any version. The SDK is distributed as source and built per-project. Do not ship VTX as a shared library to consumers that build against mismatched headers.
Every .vtx file carries a format version in its header. Readers check this on open.
- Minor format changes (new optional fields, new chunk types, new compression codecs announced via the header) are backward-compatible: newer readers read older files.
- Major format changes bump the major format version. Older readers refuse to open newer-major files with a clear error. A conversion tool is shipped when a major bump happens.
- The four-section layout (header / schema / chunks / footer).
- Little-endian encoding throughout.
-
VTXP/VTXFmagic bytes. - Zstd as the chunk compression codec.
- The exact byte layout of chunk metadata. Follow
docs/FILE_FORMAT.mdfor the current layout. - The footer's index entry shape. The current design (time + frame index + byte offset + chunk length) is stable in intent; the concrete struct can still shift.
- String-valued entity IDs are likely to become interned integer IDs in a future release. That change will be backward-compatible at read time (readers handle both forms). See Concepts, Strings.
- Silent format changes. Every change that affects the on-disk bytes bumps the format version.
- Reader hostility. An older reader encountering a newer file fails loudly, not quietly.
Schemas define the property/type/bucket layout for a specific title or domain. They live outside the SDK (you author them) but the embedded schema in each file pins the schema a given capture was recorded against.
Safe. Older readers can decode files recorded with the new schema. Examples:
- Adding a new property to an existing struct.
- Adding a new struct.
- Adding a new bucket.
- Adding a new enum value.
- Renaming display names (the human-readable label). The underlying property ID is what matters on disk.
Not safe. Require a schema major-version bump. The Schema Creator detects these when you load an existing schema as a baseline and refuses to save a "next generation" that contains any of them:
- Removing a property.
- Changing a property's
typeIdto an incompatible type (e.g.Int32toString). - Changing a property's ID.
- Removing a struct or a bucket.
- Moving a struct between buckets.
New fields in a newer schema are ignored by older readers: Protobuf drops unknown fields silently; FlatBuffers' vtable layout gives the same effect. An older reader sees the subset of the capture it knows about and keeps working. This is the main reason the SDK insists on schema-defined, evolvable formats and rejects schemaless options (Cereal, Bits).
Each VTX file's header carries:
- The SDK format version (see above).
- The schema version the capture was recorded against.
A reader can refuse to open a capture whose schema version it cannot decode, or (with a compatible schema) decode only the subset it understands.
After 1.0, a public API symbol or format field that we intend to remove goes through:
-
Deprecation: marked with
[[deprecated("...")]](for code) or called out indocs/FILE_FORMAT.md(for format). Shipped in a minor release. - Warning window: at least one minor release with the deprecation in place before removal.
- Removal: in the next major release.
Breaking changes do not skip the window. If we need to make one without a window (security issue, protocol-breaking bug), we will say so explicitly in CHANGELOG.md.
If you hit a compatibility problem that this page says shouldn't be possible, it's a bug. Open an issue with:
- SDK version (tag or commit).
- File format version from the header (or the file itself if you can share it).
- Minimal reproducer.
Security-sensitive reports: follow SECURITY.md instead.
VTX is an open, self-describing binary format for real-time state data. Apache-2.0. (c) 2026 Zenos Interactive.