> Status: draft. Part of the Harmovela 0.2 core specification. > Category: core
Define how Harmovela versions protocol assets and how implementations negotiate compatibility.
Migration decisions for legacy public identifiers are tracked in the compatibility matrix. That matrix is decision input only and does not authorize identifier changes.
Harmovela versions four distinct assets independently:
| Asset | Version Field | Example | Scope | Category |
|---|---|---|---|---|
| Protocol envelope | spec_version | "0.2" | Envelope field set, required fields, semantic rules | core |
| Event type families | Event type registry | — | Standard event type names and semantics | core |
| Payload schemas | payload_schema (URI) | https://schemas.axisrobo.com/tool.call.progress.v1.json | Per-event payload structure | profile |
| Transport bindings | Transport spec | — | stdio framing, WebSocket subprotocol, etc. | profile |
Core assets are required by every conformant implementation. Profile assets may be adopted independently and carry their own conformance requirements.
The spec_version field uses MAJOR.MINOR format (e.g., "0.2").
Within a minor version:
Across major versions:
unsupported_version.During session initialization (session.opened / session.ready), peers declare their supported protocol version via capabilities.spec_version. Both sides must agree on a version before the session becomes ready. A peer that cannot negotiate a compatible version should send session.error with code unsupported_version.
The standard event type registry (the set of type string values defined in design/protocol/) follows these rules:
event.rejected (code unknown_event_type). This is an intentional divergence from the earlier draft that suggested opaque forwarding.Each event type family may define one or more payload schemas. A payload schema is identified by a URI in the payload_schema field:
{
"type": "memory.fact.added",
"payload_schema": "https://schemas.axisrobo.com/memory.fact.added.v1.json",
"payload": { ... }
}
Rules:
...v1, ...v2).payload_schema is present.Each transport binding (stdio, WebSocket, HTTP SSE, etc.) versions independently of the protocol envelope. A transport binding specification defines:
Current transport binding documents: see design/protocol/transport-stdio.md, design/protocol/transport-websocket.md, design/protocol/transport-sse.md, design/protocol/transport-grpc.md, design/protocol/transport-nats.md, design/protocol/transport-kafka.md, design/protocol/transport-redis-streams.md. Transports are profile assets and may be adopted independently from core.
Implementations should follow these forward-compatibility practices:
1. Ignore unknown fields in envelopes and payloads. 2. Reject unknown event types with event.rejected (code unknown_event_type). Unknown event types are not forwarded. 3. Downgrade gracefully when a peer declares an older version — use only features available in that version. 4. Log, don't crash on protocol features you don't recognize.
Harmovela follows a no-surprise deprecation policy:
1. Deprecation notice: A field, event type, or feature is marked deprecated in a minor version release. 2. Support window: The deprecated item is supported for at least one additional minor version. 3. Removal: The item is removed in the next major version.
Deprecation notices appear in the protocol specification changelog and the relevant spec document.
spec_version in every envelope.aep_version is rejected everywhere. Implementations must reject envelopes that use aep_version instead of spec_version.event.rejected with code unsupported_version and details.supported listing accepted versions.