The versioning scheme
The public API version isMAJOR.MINOR, reported by the info handshake as MAJOR.MINOR.PATCH
(currently 1.0.0):
- Major is the proto package —
hyphaedb.v1, laterhyphaedb.v2. A new major is a new package path, and the two coexist in the running server;v2does not deletev1. A major bump is the only place a breaking change is allowed. - Minor is additive within a major — new optional fields, new RPCs, new enum variants. A minor never removes or repurposes anything a conformant older client depends on.
- Patch is implementation-only and carries no wire-surface meaning.
1.3.x and a server at 1.5.x are
both major 1 and must interoperate.
Bidirectional compatibility
Two version floors make this concrete:
minimum_supported_client_version— a server-side floor (the oldest client minor it will serve).minimum_supported_server_version— an SDK-side floor; the SDK refuses to connect to an older server with a clear connect error and capability-gates anything newer.
Unknown enum variants
Proto3 gRPC enums are integers on the wire, so an unknown variant arrives as a bare tag with no discriminator. To survive a newer server’s enum variants without aborting:- Every proto enum reserves
*_UNSPECIFIED = 0as a sentinel — never a real domain variant. - An unrecognized enum integer decodes to a language-level
Unknown(i32)carrying the raw tag, not a panic or decode error. - Over MCP and REST JSON, an unknown variant uses a string-discriminator fallback.
Capability negotiation
On connect, each SDK callsinfo once and stores the returned capability set on the session: the
server’s version, its minimum supported client minor, and a list of capability tokens for optional
features. The SDK gates optional features on token presence — a feature absent from an older server’s
set is simply not attempted.
The server currently advertises these tokens (the set is additive and may grow):
Capability tokens are additive — a token is never removed within a major.
Deprecation and sunset
A field or RPC may be marked deprecated but stays functional for at least two minor releases within its major; removal happens only at the next major. While a deprecated surface is in use, the server emits a machine-readable signal, and the SDK surfaces a one-time deprecation warning without failing the call:Deprecated surfaces keep working. The signal is advisory — it tells an operator to migrate before the
next major removes the surface, without breaking the current call.