Effective Date: February 21, 2026 — Status: Normative

1. Overview

This document defines the versioning policy for the Cascade Protocol semantic vocabularies, including rules for version numbering, backward compatibility guarantees, deprecation timelines, and the relationship between vocabulary versions and SDK versions.

The key words MUST, MUST NOT, SHOULD, SHOULD NOT, and MAY in this document are to be interpreted as described in RFC 2119.

The Cascade Protocol comprises multiple independently versioned vocabularies that share a common version numbering scheme. Each vocabulary evolves at its own pace, but all vocabularies adhere to the same compatibility guarantees described in this policy.

2. Version Numbering

Cascade Protocol vocabularies use a two-part version number in the format MAJOR.MINOR (for example, 1.3 or 2.0).

Component Incremented When Example
MAJOR A breaking change is introduced. Consumers MUST review their integration. 1.52.0
MINOR Additions or non-breaking changes are introduced. Existing consumers continue to work without modification. 2.12.2

When the MAJOR version is incremented, the MINOR version resets to 0. There is no PATCH component for vocabularies; small corrections that do not affect the schema (such as fixing a typo in a description) are published under the same version number with an updated dct:modified date.

3. Current Stable Versions

The following table lists the current stable version of each Cascade Protocol vocabulary.

Vocabulary Prefix Version Namespace
Core cascade: v2.2 https://ns.cascadeprotocol.org/core/v1#
Clinical clinical: v1.5 https://ns.cascadeprotocol.org/clinical/v1#
Health health: v2.2 https://ns.cascadeprotocol.org/health/v1#
Checkup checkup: v3.0 https://ns.cascadeprotocol.org/checkup/v1#
POTS pots: v1.3 https://ns.cascadeprotocol.org/pots/v1#
Coverage coverage: v1.0 https://ns.cascadeprotocol.org/coverage/v1#

Note: Namespace URIs and Version Numbers

Namespace URIs contain a major-version segment (e.g., /v1#) that remains stable across minor versions. The version number in owl:versionInfo within the ontology file is the authoritative source for the current version of each vocabulary.

4. Breaking Changes

A breaking change is any modification to a vocabulary that could cause a conforming consumer to fail to read or correctly interpret existing data. Breaking changes MUST trigger a MAJOR version increment.

The following changes are classified as breaking:

B1

Removing a class or property from the vocabulary. Any term that was previously defined and is no longer present.

B2

Changing cardinality from optional to required. If a property that was previously optional (sh:minCount 0 or unspecified) becomes required (sh:minCount 1), existing data missing that property would become non-conforming.

B3

Renaming a predicate. Changing the URI of a property or class, even if the meaning is preserved. Consumers resolve terms by URI, so a rename is effectively a removal plus addition.

B4

Changing the expected type of a property. For example, changing a property from xsd:string to xsd:integer, or from a literal to an object reference.

B5

Removing a provenance type. Deleting a named individual from the cascade:DataProvenance hierarchy (e.g., removing cascade:ConsumerGenerated).

Example: Breaking Change

# Before (health v2.2):
health:heartRate a owl:DatatypeProperty ;
    rdfs:range xsd:integer .

# After (health v3.0) - type changed from integer to decimal:
health:heartRate a owl:DatatypeProperty ;
    rdfs:range xsd:decimal .

# This is a breaking change (B4) because consumers expecting
# xsd:integer may fail to parse xsd:decimal values.

5. Non-Breaking Changes

A non-breaking change is any modification that maintains full backward compatibility with existing consumers and data. Non-breaking changes trigger a MINOR version increment.

The following changes are classified as non-breaking:

N1

Adding optional properties to existing classes. Consumers that do not recognize the new property will simply ignore it.

N2

Adding new classes. New class definitions do not affect the interpretation of existing data.

N3

Adding new vocabulary namespaces. Introducing an entirely new vocabulary (e.g., ecg:) does not alter the semantics of any existing vocabulary.

N4

Adding new enum values to union types. For example, adding a new cascade:DataProvenance subclass. Existing consumers will not encounter the new value in historical data.

N5

Adding new provenance types. Extending the provenance hierarchy with additional named individuals.

N6

Expanding the JSON-LD context with new terms. New context entries do not change the resolution of existing terms.

Example: Non-Breaking Change

# health v2.1 adds a new optional property to VitalSigns:
health:respiratoryRate a owl:DatatypeProperty ;
    rdfs:label "Respiratory Rate" ;
    rdfs:domain health:VitalSigns ;
    rdfs:range xsd:integer ;
    rdfs:comment "Breaths per minute. Added in v2.1." .

# This is a non-breaking change (N1). SDKs built for health v2.0
# will simply ignore the respiratoryRate property when reading data
# written with health v2.1.

6. Backward Compatibility Guarantee

The Cascade Protocol makes the following compatibility guarantees to ensure that data remains readable across vocabulary versions.

6.1 Same-Major-Version Reading

A conforming SDK MUST be able to read data produced by any vocabulary version that shares the same MAJOR version number, regardless of MINOR version differences.

Core Rule

Unknown properties are ignored, not errors. When an SDK encounters a property it does not recognize (because it was introduced in a newer MINOR version), it MUST skip that property silently rather than failing.

6.2 Backward Compatibility (Newer SDK Reads Older Data)

An SDK built for a higher MINOR version MUST successfully read data written with a lower MINOR version of the same MAJOR version. Properties that are absent from older data default to undefined/null.

Scenario SDK Version Data Version Result
Same version health v2.2 health v2.2 Full fidelity. All properties recognized.
Newer SDK, older data health v2.2 health v2.0 Reads successfully. Properties added in v2.1 and v2.2 default to undefined.
Older SDK, newer data health v2.0 health v2.2 Reads successfully. Properties added in v2.1 and v2.2 are silently ignored.
Cross-major version health v2.0 health v1.9 Not guaranteed. A migration guide SHOULD be provided.

6.3 Forward Compatibility (Older SDK Reads Newer Data)

An SDK SHOULD be able to read data from a higher MINOR version within the same MAJOR version. Because new MINOR versions only add optional properties, an older SDK will simply not recognize or display the newer properties. The data it does understand remains correct.

7. Deprecation Timeline

Vocabulary terms (classes, properties, named individuals) may be deprecated when they are superseded by better alternatives. Deprecation follows a structured timeline to give consumers adequate time to migrate.

7.1 Deprecation Rules

  • Deprecated terms MUST be supported for at least 2 MINOR versions after the deprecation notice before they may be removed in the next MAJOR version.
  • Deprecated terms MUST NOT be removed within the same MAJOR version in which they were deprecated.
  • When a term is deprecated, a replacement SHOULD be identified in the deprecation notice.

7.2 Deprecation Signals

Deprecation MUST be signaled through all of the following channels:

Channel Mechanism
OWL Ontology The deprecated term is annotated with owl:deprecated "true"^^xsd:boolean
JSON-LD Context The deprecated term is preserved in the context (for backward compatibility) but annotated with a deprecation comment
SDK Documentation The corresponding API is marked as deprecated with a clear reference to the suggested replacement
Release Notes Each vocabulary release lists all newly deprecated terms and their replacements

7.3 Example: Deprecation Lifecycle

# health v2.1 - property is deprecated
health:bpmReading a owl:DatatypeProperty ;
    rdfs:label "BPM Reading (Deprecated)" ;
    owl:deprecated "true"^^xsd:boolean ;
    rdfs:comment "Deprecated in v2.1. Use health:heartRate instead." ;
    rdfs:seeAlso health:heartRate .

# health v2.2 - deprecated property still present (1 minor version later)
# health v2.3 - deprecated property still present (2 minor versions later)
# health v3.0 - property MAY be removed (next major version)

Implementation Note

SDKs SHOULD emit a compile-time or runtime warning when deprecated terms are used, directing developers to the replacement term. SDKs MUST NOT refuse to read data containing deprecated terms.

8. Schema Version Embedding

Every Cascade Protocol record MUST embed a schema version so that consumers can determine which vocabulary definitions apply to the data.

8.1 The cascade:schemaVersion Property

The cascade:schemaVersion property is a required property on all Cascade Protocol records. It indicates the overall protocol schema version under which the data was serialized.

Attribute Value
Predicate cascade:schemaVersion
Range xsd:string
Cardinality Exactly 1 (required)
Scope Overall protocol schema version, not individual vocabulary versions

8.2 Turtle Example

@prefix cascade: <https://ns.cascadeprotocol.org/core/v1#> .
@prefix pots: <https://ns.cascadeprotocol.org/pots/v1#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<#pots-check-abc123> a pots:POTSCheckResult ;
    cascade:schemaVersion "1.3" ;
    pots:date "2026-01-15T10:30:00Z"^^xsd:dateTime ;
    pots:protocol "nasaLean" ;
    pots:potsThresholdMet "true"^^xsd:boolean .

8.3 JSON-LD Context

When using JSON-LD serialization, the schema version is included in the @version field of the JSON-LD context, in addition to being present as a data property on the record itself.

{
  "@context": {
    "@version": 1.1,
    "cascade": "https://ns.cascadeprotocol.org/core/v1#",
    "pots": "https://ns.cascadeprotocol.org/pots/v1#",
    "schemaVersion": "cascade:schemaVersion"
  },
  "@type": "pots:POTSCheckResult",
  "schemaVersion": "1.3"
}

Why a Single Schema Version?

Rather than requiring consumers to track the individual version of every vocabulary referenced in a record, the cascade:schemaVersion property provides a single version number that maps to a known set of compatible vocabulary versions. The protocol publishes a version compatibility matrix for each schema version.

9. SDK Versioning

SDKs that implement the Cascade Protocol use Semantic Versioning (semver) with the three-part format MAJOR.MINOR.PATCH.

9.1 SDK Version Independence

SDK versions are independent of vocabulary versions. An SDK at version 3.1.0 may support vocabulary versions ranging from health v1.0 through health v2.2.

Aspect Vocabulary SDK
Format MAJOR.MINOR MAJOR.MINOR.PATCH
MAJOR increment Breaking schema change Breaking API change
MINOR increment New classes or properties New features, backward compatible
PATCH increment N/A (no PATCH) Bug fixes, no API changes
Versioning standard Cascade Protocol policy (this document) semver.org

9.2 Vocabulary Support Documentation

Each SDK release MUST document which vocabulary versions it supports. This information appears in the SDK README and changelog.

# CascadeSDK v2.4.0
## Supported Vocabularies
- cascade (core): v2.0 - v2.2
- clinical: v1.0 - v1.5
- health: v2.0 - v2.2
- checkup: v2.0 - v3.0
- pots: v1.0 - v1.3
- coverage: v1.0

9.3 SDK and Vocabulary Lifecycle

When a new vocabulary MAJOR version is released, the SDK SHOULD support both the old and new MAJOR versions for at least one SDK MINOR release cycle to give consumers time to migrate their data.

10. Summary of Change Classification

The following table provides a quick reference for classifying changes.

Change Classification Version Impact
Add optional property to a class Non-breaking (N1) MINOR increment
Add new class Non-breaking (N2) MINOR increment
Add new vocabulary namespace Non-breaking (N3) MINOR increment
Add enum value to union type Non-breaking (N4) MINOR increment
Add new provenance type Non-breaking (N5) MINOR increment
Expand JSON-LD context Non-breaking (N6) MINOR increment
Remove a class or property Breaking (B1) MAJOR increment
Make optional property required Breaking (B2) MAJOR increment
Rename a predicate Breaking (B3) MAJOR increment
Change property type Breaking (B4) MAJOR increment
Remove provenance type Breaking (B5) MAJOR increment
Fix typo in rdfs:comment Editorial No version change
Back to Documentation