The delta API version 2026.1 is used to store and retrieve changes to nodes. It is intended for fine-grained changes to single values. it is not intended as a bulk API that updates large chunks of the model at once.

1. Conventions used in this document

  • ALL-CAPS key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP14 (RFC2119, RFC8174) when, and only when, they appear in all capitals, as shown here.

  • Footnotes refer to more discussions and rationale, but are non-normative.

2. Introduction

Delta API assumes a bidirectional communication channel between a client and a repository. The client initiates the channel with the repository to open a participation[1]. Both parties communicate through the established channel via messages.

Delta API supports these message categories, loosely following CQRS pattern[2][3]:

  • Queries initiated/requested by the client, with synchronous response by the repository. A query requests some information from the repository without changing the repository’s contents. The repository gathers all information needed to answer the query, and sends the information back. The repository might reply to invalid queries with a failure message. We also use queries for managing participations.[4]

  • Commands initiated/requested by the client, with synchronous response by the repository. A command requests some change to the repository. The repository quickly confirms having received the command, or rejects a failed command.[5] However, the repository processes the command asynchronously, and eventually broadcasts the effect(s) as event(s).

  • Events initiated/broadcast by the repository, without response by the client. An event describes some change that has been applied to the repository’s contents. Events correlate to their originating command(s)[6]; this command might have been sent by this client or another client.[7] All clients receive the same events (given the same subscription scope and disregarding event sequence numbers).

A client describes the interesting part of the repository’s contents by specifying its subscription scope. The client receives only events on nodes within that scope.

A typical workflow for a client would be:

  1. Client connects to repository and starts a participation.

  2. Client subscribes to some partitions with subscription queries. The response contains a serialization chunk with the current contents of these partitions.

  3. Client initiates its editor or processing with the chunk.

  4. Client sends commands to request changes to some nodes in the subscribed partitions.

  5. Client receives events with the actual changes that have been applied to the subscribed nodes.

  6. Client updates its editor or processing with the event’s contents.

  7. Client receives events originating from other clients' commands.

  8. Client updates its editor or processing with the event’s contents.

  9. Client ends the participation.

The repository is always the ultimate arbiter of its contents.[8] It can decide to apply each command verbatim, with some tweaks (e.g. because of concurrent changes), or not at all (e.g. because the command would introduce containment loops).

Each repository might introduce its own strategy how to handle commands.[3] For example, assume client 1 sends a deleteChild command to delete node X, and then client 2 sends a setProperty command on node X.

  • Repository A applies all commands in order, thus deletes node X and ignores the second command. It emits one childDeleted event, correlated to both commands.

  • Repository B keeps an internal "trash can" of all deleted nodes. It deletes node X on the first command, but resurrects node X on the second command and changes the property as requested. It first emits a childDeleted event (correlated to the first command), but later childAdded and propertyChanged events (both correlated to the second command).

  • Repository C batches command processing. It looks at both messages together, and decides it’s more important to keep the new property value around. It emits one propertyChanged event, correlated with both commands.

A client stays up-to-date with the repository’s contents if it applies all events in order.[9] The order is defined by the event’s sequence number.[10] A client can either decide to apply its own change immediately and filter out events based on that command, or wait for the correlated event to arrive and apply the change only then.

2.1. Out of scope

This specification precisely describes the semantic content of each message. We don’t describe the binding to any specific protocol (e.g. JSON over WebSockets, Protobuf over HTTP, message queues).

2.2. Command overview

We specified the semantics of each command and event precisely, leading to lots of similar, but different commands/events.[11]

This table provides an overview of actions (rows) and element they apply to (columns).

Action Child Annotation Reference Property Partition / Classifier

Add

Add child

Add annotation

Add reference[12][13]

Add property

Add partition

Delete

Delete child

Delete annotation

Delete reference

Delete property

Delete partition

Change

Replace child

Replace annotation

Change reference

Change property

Change classifier

Move from other node

Move child from other containment

Move annotation from other parent

Move from other feature in same node

Move child from other containment in same parent

Move in same feature in same node

Move child in same containment

Move annotation in same parent

Move from other node and replace existing[14]

Move child from other containment and replace existing child

Move annotation from other parent and replace existing annotation

Move from other feature in same node and replace existing[14]

Move child from other containment in same parent and replace existing child

Move in same feature in same node and replace existing[14]

Move child in same containment and replace existing child

Move annotation in same parent and replace existing annotation

Composite

Composite

3. Description

3.1. Repository characteristics

A repository is a set of partitions, and a set of APIs, amongst them this delta API. The repository has an ID that must be unique for all repositories in the same context. LionWeb doesn’t specify the scope of the context.[15]

A repository is “its own universe”: nodes within it can’t reference nodes, or be referenced from nodes from other repositories. All nodes within the same repository MUST have unique IDs. Nodes can refer to nodes from the LionCore and built-in languages.

3.2. Client characteristics

A client is a program connecting to a repository. Each client has exactly one participation with one repository at one point in time. The same client can have several consecutive participations with the same repository, but never at the same time. A client might interact with several repositories, but they are completely independent (i.e. same as two clients connecting to two repositories).[1]

The client has the responsibility to guarantee uniqueness of query ids and command ids within the same participation.

Authentication and authorization are out of scope of this API.

3.3. Channel characteristics

Logically, the channel has independent parts for each category of message; in practice, we might transmit some or all of them through a shared channel.

This protocol is agnostic of its underlying transport or technical implementation. By default, this protocol uses JSON encoding over a text-based, single channel, stateful, bi-directional, asynchronous, reliable, and trustworthy transport.[16] Any transport that fits these criteria (e.g. WebSocket[17]) MUST use the same encoding and MUST adhere to the Delta JSON Schema.[18]

We assume the underlying protocol handles quality of service concerns (i.e. guaranteed one-time complete delivery of messages), they are out of scope of this API.

3.4. Participation characteristics

Each participation has a participation id, unique for all concurrent participations. The repository assigns the participation id upon starting a new participation. The participation id MUST follow the same format as identifier. It serves as a technical identifier.

A participation is transparent for reconnecting network connections,i.e. one participation can survive potential technical reconnects. A participation spans over time: if we would e.g. used REST, a participation spans over several REST requests/responses.

A participation starts by the client connecting to the repository via delta protocol. A participation ends either by the client ending it, or if the client disconnects involuntarily (e.g. by crashing or a connection failure).

A client can try to reconnect a participation if the client still knows a previously valid participation id, and the last event sequence number the client received.[19]

3.5. Event sequence numbers

Each event contains a sequence number.[10] This number is a positive integer that increments by one for each consecutive event. It is unique per participation.[20]

A client SHOULD use this number to order incoming events, and check whether the client missed any event.

3.6. Subscription characteristics

The subscription, or subscription scope, is the set of partitions a participation gets events for. A subscription does not have an identity on its own; it is bound to one participation.

Scope is defined by the node id of a partition; it includes all changes to the partition and all its descendants (including annotation instances).[21]

At the start of a participation, the subscription scope is empty. A client can change its subscription scope by

A client can change the subscription scope at any time during a participation.

A client can send commands for any node id, independent of the client’s subscription. Assume a client sends a command for a node that’s part of a partition that client is not subscribed to. The repository treats that command the same as from a client that was subscribed to the containing partition, i.e. applies it in accordance with the repository’s policy. The repository also sends out the same events to subscribed clients, thus not to the sending client.[22]

3.7. Message characteristics

Atomicity

Most messages are atomic; they cannot be split. The exceptions are splittable messages.

Message identity

Each message has some id unique to the participation and category:

Technical name

Every defined message has a unique technical name. The technical name is a valid programming language identifier as described for IKeyed. Each binding to a specific protocol might use the technical name in a different way. For example, a JSON binding might have a member containing the technical name of the message, or a Protobuf binding might use the technical name as type name.

3.7.1. Splittable messages

All messages containing a SerializationChunk.

A client or repository CAN decide to split up a splittable message if that message would exceed the acceptable message size. LionWeb does not define the acceptable message size, it SHOULD be a parameter for each implementation.

All splittable messages MAY contain a SplitFlag. If the flag is unset or false, the splittable message is self-contained. If the flag is true, one or more continued chunk messages will follow.[25]

Splittable messages include:

Continued chunks

Continued chunks continue the chunk from the related splittable message. Each continued chunk refers to the splittable message it belongs to. The continued chunk contains a chunk, a consecutive sequence number, and a ContinuedChunkCompletedFlag to signal whether it is the last continued chunk, or more will follow. If the flag is true, this is the last continued chunk. If the flag is false, one or more continued chunk messages will follow.[25]

There MUST NOT be any message in the same channel between the chunked message and all related continued chunks.

Continued chunks include:

3.7.2. Additional Info

Each message optionally can have one or more additional infos consisting of:[26][27][28]

  • kind is an identifier-compatible string identifying the additional info type. Some kinds are pre-defined in this specification. A repository MAY reply with other, additional kinds.

  • distribute? is an optional boolean flag with default value false. It is only valid in Commands, i.e. MUST NOT be used for Events or Queries. If present and set to true, the repository MUST copy the additional info to all events that result from the command, and distribute the additional info to all participants receiving the event.

  • message is a human-readable string describing the additional info.

  • data is a flat map with 0 or more arbitrary keys and values. All keys MUST be identifier-compatible and MUST be unique within the same additional info. All values MUST be strings. A kind might imply presence of specific keys in data.

This additional info is symmetric to additional infos in bulk API.

4. Scenarios

4.1. Virgin repository, first time client connects

virginRepo
  1. Client signs on to repository repo-alpha, with protocol version 2026.1, and client id myClient.

  2. Repository confirms participation with participation id participation-a.

  3. Client initiates new partition.

  4. Client sends Add partition command with nodeA payload (details omitted) and command id cmd-1.

  5. Repository registers command for processing.

  6. Repository updates internal representation.

  7. Repository creates event for update.

  8. Repository emits event Partition added with nodeA payload and sequence number 1. It includes one CommandSource with value (participation-a, cmd-1)

  9. Client receives event and forwards information to editor.

  10. Client draws nodeA.

4.2. Client reconnects to known partition

reconnectKnownPartition
  1. Client knows the relevant partition, wants to subscribe.

  2. Client sends Subscribe to partition contents query with partition node id partition-id.

  3. Repository retrieves all contents of partition with node id partition-id.

  4. Repository found contents.

  5. Repository responds to query with id qry-1 with contents of 3 nodes: partitionNode, childNodeA, childNodeB (details omitted).

  6. Client receives query result and forwards information to editor.

  7. Client draws childNodeA and childNodeB. partitionNode is not drawn, it represents the canvas.

4.3. Client changes known node with remote update

changeKnownNodeRemoteUpdate
  1. User enters new property value.

  2. Client editor forwards user action into command.

  3. Client sends Add property command with nodeA node id, age property (details omitted), 23 value and command id cmd-1.

  4. Repository registers command for processing.

  5. Client informs editor of command submission.

  6. Repository updates internal representation.

  7. Repository creates event for update.

  8. Repository emits event Property added with nodeA node id, age property (details omitted), 23 value and sequence number 1. It includes one CommandSource with value (participation-a, cmd-1)

  9. Client receives event and forwards information to editor.

  10. Client updates nodeA with new property value.

4.4. Client changes known node with local update

changeKnownNodeLocalUpdate
  1. User enters new property value.

  2. Client updates nodeA with new property value.

  3. Client editor forwards user action into command.

  4. Client sends Add property command with nodeA node id, age property (details omitted), 23 value and command id cmd-1.

  5. Repository registers command for processing.

  6. Client registers processed command id cmd-1.

  7. Repository updates internal representation.

  8. Repository creates event for update.

  9. Repository emits event Property added with nodeA node id, age property (details omitted), 23 value and sequence number 1. It includes one CommandSource with value (participation-a, cmd-1)

  10. Client found a matching registered processed command id.

  11. Client unregisters processed command id cmd-1, and does NOT forward information to editor — the event originates from this client, thus has already been processed.

  12. Another client sends Add property command with command id cmd-x (other parameters omitted).

  13. Repository updates internal representation.

  14. Repository creates event for update.

  15. Repository emits event Property added with sequence number 2 (other parameters omitted). It includes one CommandSource with value (other-client, cmd-x)

  16. Client did not find any matching registered processed command id.

  17. Client forwards information to editor.

  18. Client updates with new property value.

4.5. Client tries to change invalid node id

changeUnknownNodeFailedCommand
  1. User enters new property value on node node with spaces that’s known to the editor.

  2. Client editor forwards user action into command.

  3. Client sends Add property command with node with spaces node id, age property (details omitted), 23 value and command id cmd-1.

  4. Repository checks whether node id node with spaces is valid.

  5. Client registers processed command id cmd-1.

  6. Client informs editor of command submission.

  7. Repository rejects invalid node id.

  8. Repository sends ErrorEvent only to this participation with invalidNodeId error code, invalid node id 'node with spaces' message and sequence number 1. It includes one CommandSource with value (participation-a, cmd-1).

  9. Client removes cmd-1 from open commands list.

  10. Client informs editor of failed command.

  11. Client informs user.

4.6. Client tries to change unknown node with failed event

changeUnknownNodeFailedEvent
  1. User enters new property value on node nodeA that’s known to the editor.

  2. Client editor forwards user action into command.

  3. Client sends Add property command with nodeA node id, age property (details omitted), 23 value and command id cmd-1.

  4. Repository registers command for processing.

  5. Client registers processed command id cmd-1.

  6. Client informs editor of command submission.

  7. Repository realizes it does not know a node with id nodeA

  8. Repository creates event for notification.

  9. Repository emits ErrorEvent with unknownNode error code, cannot add property to unknown node message and sequence number 1. It includes one CommandSource with value (participation-a, cmd-1).

  10. Client removes cmd-1 from open commands list.

4.7. Client with remote update changes property to same value as it already has

changeSameValueRemoteUpdate
  1. User enters changed property value that’s the same value as the old value.

  2. Client editor forwards user action into command.

  3. Client sends Change property command with nodeA node id, age property (details omitted), 23 old value, 23 new value and command id cmd-1.

  4. Repository registers command for processing.

  5. Client registers processed command id cmd-1.

  6. Client informs editor of command submission.

  7. Repository determines no change to internal representation.

  8. Repository creates event for notification.

  9. Repository emits No-op event with CommandSource with value (participation-a, cmd-1) and sequence number 1.

  10. Client removes cmd-1 from open commands list.

4.8. Repository has bug, needs to tell client it couldn’t apply its commands

repositoryBug
  1. User enters new property value on node nodeA that’s known to the editor.

  2. Client editor forwards user action into command.

  3. Client sends Add property command with nodeA node id, age property (details omitted), 23 value and command id cmd-1.

  4. Repository registers command for processing.

  5. Client registers processed command id cmd-1.

  6. Client informs editor of command submission.

  7. Repository tries to update internal representation. Some error occurs (e.g. database unavailable).

  8. Repository handles the error.

  9. Repository creates event for notification.

  10. Repository emits ErrorEvent with internalError error code, internal error occurred message and sequence number 1. It includes one CommandSource with value (participation-a, cmd-1).

  11. Client removes cmd-1 from open commands list.

4.9. Concurrent changes to known node with local update

concurrentChangeLocalUpdate
  1. User enters new property value.

  2. Client updates nodeA with new property value.

  3. Client editor forwards user action into command.

  4. Client sends Add property command with nodeA node id, age property (details omitted), 23 value and command id cmd-1.

  5. Repository registers command for processing.

  6. Client registers processed command id cmd-1.

  7. Another client sends Add property command nodeA node id, age property (details omitted), 42 value and command id cmd-x.

  8. Repository resolves concurrent updates t nodeA, age property with "last write wins" strategy. Repository updates internal representation with value 42.

  9. Repository creates event for update.

  10. Repository emits event Property added with nodeA node id, age property (details omitted), 23 value and sequence number 1. It includes one CommandSource with values (participation-a, cmd-1) and (other-client, cmd-x).

  11. Client found a matching registered processed command id.

  12. Client unregisters processed command id cmd-1.

  13. Not all command sources could be matched against registered processed command ids. Client forwards information to editor.

  14. Client updates with new property value.

4.10. Concurrent changes to known node with remote update

concurrentChangeRemoteUpdate
  1. User enters new property value.

  2. Client editor forwards user action into command.

  3. Client sends Add property command with nodeA node id, age property (details omitted), 23 value and command id cmd-1.

  4. Repository registers command for processing.

  5. Client informs editor of command submission.

  6. Another client sends Add property command nodeA node id, age property (details omitted), 42 value and command id cmd-x.

  7. Repository resolves concurrent updates t nodeA, age property with "last write wins" strategy. Repository updates internal representation with value 42.

  8. Repository creates event for update.

  9. Repository emits event Property added with nodeA node id, age property (details omitted), 23 value and sequence number 1. It includes one CommandSource with values (participation-a, cmd-1) and (other-client, cmd-x).

  10. Client receives event and forwards information to editor.

  11. Client updates nodeA with new property value.

4.11. Split query response

splitQueryResponse
  1. Client knows the relevant partition, wants to subscribe.

  2. Client sends Subscribe to partition contents query with partition node id partition-id.

  3. Repository retrieves all contents of partition with node id partition-id.

  4. Repository found contents.

  5. Repository responds to query with id qry-1 with contents of 2 nodes: partitionNode, nodeA (details omitted). Repository decided the response is too big, and splits it up (split: true).

  6. Client receives split query result and buffers partial response.

  7. Repository continues its response to query with id qry-1 with another Chunked query response with chunk of 1 node: nodeB (details omitted). This is the first in the sequence of chunked responses (continuedChunkSequenceNumber: 0) and there will be another response (continuedChunkCompleted: false).

  8. Client receives the next split query result and buffers partial response.

  9. Repository continues its response to query with id qry-1 with another Chunked query response with chunk of 2 nodes: nodeC, annotationD (details omitted). This is the second in the sequence of chunked responses (continuedChunkSequenceNumber: 1) and there will not be another response (continuedChunkCompleted: true).

  10. Client receives the final next split query result and composes the response.

  11. Client forwards information to editor.

  12. Client draws nodeA and nodeB. partitionNode is not drawn, it represents the canvas.

5. Messages

5.1. Parameter syntax

  • Parameters suffixed with ? CAN be omitted, or CAN have a value of null. Both representations express the parameter to be unset.[29]

  • Parameters suffixed with [] are ordered lists with zero or more elements.

5.2. Parameter types

additionalInfos

Optionally empty[30] list of additional infos.

TargetNode

Target’s node as id.

MetaPointer

MetaPointer-tuple to describe an M2 element (classifier, feature, etc.). Encoded as meta-pointer.

PropertyValue

Property value encoded as property value.

ResolveInfo

ResolveInfo of a reference as string. Can be null.

Index

Position inside a multiple link or annotations as integer >= 0. Cannot be null. Use value 0 for single links.

Command

Any command.

CommandId

Id of a command.[23] Same format as identifiers; must be unique per participation.

QueryId

Id of a query. Same format as identifiers; must be unique per participation.

SerializationChunk

Chunk of nodes as described in serialization specification, but without top-level serializationFormatVersion and languages members. Thus, the serialization chunk has only the top-level member nodes.[31]

Nodes in the chunk MAY have references to already existing nodes, and already existing nodes MAY have references to nodes in the chunk.[32]

+ Chunks have different constraints, depending on use case:

+

Single

MUST contain a single anchor node, and all other nodes MUST be descendants of the anchor node. The chunk MUST contain all features of the anchor node and all its descendants, i.e. the anchor node is complete.

Multi

MAY contain more than one root node (i.e. independent subtrees), and the chunk MUST contain all descendants of each root node. MUST contain all features of all contained nodes.

Shallow

MAY contain more than one root node (i.e. independent subtrees), and each root node might be incomplete.

DepthLimit

Depth of returned shallow chunk. MUST be an integer >= 0, with

  • 0 meaning "return only the root node(s)",

  • 1 meaning "return the root node(s) and their direct children/annotations",

  • 2 meaning "return the root node(s), their direct children/annotations, and the direct children/annotations of these",

  • etc.

SplitFlag

boolean flag whether the chunk is complete within this splittable message.[25]

ContinuedChunkCompletedFlag

boolean flag whether this continued chunk completes its splittable message.[25]

ContinuedChunkSequenceNumber

orders connected continued chunks. Positive integer that starts at 0 and increments by one for each consecutive continued chunk.[25]

Event

Any event.

ParticipationId

Id of a participation. Same format as identifiers; must be unique for all concurrent participations.

clientId

Id of a client. Same format as identifiers; must be stable over time for the same client to use reserved free node ids.

RepositoryId

Id of a repository. Same format as identifiers; must be unique for all repositories in the same context. LionWeb doesn’t specify the scope of the context.[15]

CommandSource

(ParticipationId, CommandId) tuple[6] this event is based on. This allows a client to know when its command has been processed (either successful or not).

EventSequenceNumber

event sequence number of this event.

FreeId

Free node id.

DeltaProtocolVersion

Version of the delta protocol, e.g. 2026.1.

boolean

A boolean value, i.e. either true or false.

integer type

An integer value.

5.2.1. New nodes

The term "new node" refers to nodes that MUST NOT yet exist in the repository.[32]

5.2.2. Existing nodes

The term "existing node" refers to nodes that MUST exist in the repository.

5.2.3. Reused nodes

The term "reused node" refers to nodes that are removed and re-added in the same command/event.[33] A client SHOULD keep the identity of the reused node in its internal representation.

These replace with new content commands / replace with new content events are:

5.2.4. How to address references

We refer to references by the tuple of (parent, reference, index). Rationale: Both reference target and resolveInfo can be null, so they aren’t suitable for identifying the reference. However, target and resolveInfo MUST NOT both be null.

5.3. Errors

5.3.1. Invalid participation

The participation the client uses to communicate with the repository is not valid.

Possible reasons:

Technical name

invalidParticipation

5.3.2. Node already exists

Client tries to create a node with an id that already exists.

Technical name

nodeAlreadyExists

5.3.3. Unknown node

Client tries to operate on a node unknown to the repository.

Technical name

unknownNode

5.3.4. Unknown index

Client tries to operate on an index beyond the number of existing elements.

Technical name

unknownIndex

5.3.5. Entry at index is not the given entry

Client provided an entry (either a node or a target/resolveInfo) and an index, but the entry is not at the given index.

Technical name

indexNodeMismatch

5.3.6. Move without parent

Client tries to move a node that doesn’t have a parent.

Technical name

moveWithoutParent

5.3.7. Invalid move

Client tries to move a node incompatible with the emitted command.

Technical name

invalidMove

5.3.8. Undefined reference target

Client tries to set a reference with neither target nor resolveInfo

Technical name

undefinedReferenceTarget

5.4. Queries

5.4.1. Special responses

5.4.1.1. Error response

Any query might return with error parameters instead of its declared response parameters.[34]

See also ErrorEvent.

Technical name

ErrorResponse

Response parameters
errorCode

String

message

String

queryId

QueryId Id of the related query.

additionalInfos

additionalInfos

5.4.1.2. Chunked query response

A continued chunk for a splittable response of one of the following queries:

Technical name

ChunkedQueryResponse

Response parameters
chunk

SerializationChunk The continued chunk. The combination of all continued chunks MUST adhere to the same constraints as the related splittable message's chunk.

continuedChunkCompleted

ContinuedChunkCompletedFlag

continuedChunkSequenceNumber

ContinuedChunkSequenceNumber

queryId

QueryId Id of the related splittable query

additionalInfos

additionalInfos

5.4.2. Subscription

5.4.2.1. Subscribe to partition changes

This client wants to receive Partition added events on newly created (if creation is true) or Partition deleted events on deleted (if deletion is true) partitions. The client automatically subscribes to newly created partitions (if creation is true), and receives the full contents of partitions.

Technical name

SubscribeToChangingPartitions

Request parameters
creation

boolean Whether this client wants to receive events on newly created partitions (true), or not (false).

deletion

boolean Whether this client wants to receive events on deleted partitions (true), or not (false).

queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Response parameters
queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Errors
5.4.2.2. Inform about partition changes

This client wants to receive Partition added events on newly created (if creation is true) or Partition deleted events on deleted (if deletion is true) partitions. The client receives partitions contents up to depthLimit. The client does not subscribe to newly created partitions.[25]

Technical name

InformAboutChangingPartitions

Request parameters
creation

boolean Whether this client wants to receive events on newly created partitions (true), or not (false).

deletion

boolean Whether this client wants to receive events on deleted partitions (true), or not (false).

depthLimit

depth limit Depth of Partition added.newPartition.

queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Response parameters
queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Errors
5.4.2.3. Subscribe to partition contents

This client wants to receive events on any changes to partition or any of its descendants.[35][21]

Technical name

SubscribeToPartitionContents

Request parameters
partition

TargetNode Node id of the partition this client wants to receive events of.

queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Response parameters
contents

single chunk Complete contents of partition, i.e. the node with id partition and all of its descendants (including annotation instances).

split?

SplitFlag

queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Errors
5.4.2.4. Unsubscribe from partition contents

This client does not want to receive events on any changes to partition or any of its descendants anymore.[35]

Technical name

UnsubscribeFromPartitionContents

Request parameters
partition

TargetNode Node id of the partition this client wants to stop receiving events of.

queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Response parameters
queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Errors

5.4.3. Participation

Even though participation handling does not relate to repository contents, we consider them queries.[4].

5.4.3.1. Sign On (start a participation)

The client starts a participation for a specific repository.

Note
signing on is not the same as logging in: The latter includes some authentication/authorization check, which is out of scope of this specification.
Technical name

SignOn

Request parameters
deltaProtocolVersion

DeltaProtocolVersion

clientId

clientId Id of the client signing on.[1]

repositoryId

RepositoryId Id of the repository to which the client wants to establish a participation.

queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Response parameters
participationId

ParticipationId the repository assigns to this participation.

queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Errors
  • Unsupported delta protocol version

5.4.3.2. Sign Off (end a participation)

The client ends a participation.[36]

Note
signing off is not the same as logging off: The latter includes some authentication/authorization invalidation, which is out of scope of this specification.
Technical name

SignOff

Request parameters
queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Response parameters
queryId

QueryId Id of this query.

additionalInfos

additionalInfos

5.4.3.3. Reconnect (resume an existing participation)

The client has been technically disconnected, but still knows its participation id. Then the client can ask to reconnect to the repository.[19]

Technical name

Reconnect

Request parameters
participationId

ParticipationId The previously used participation id.

lastReceivedSequenceNumber

EventSequenceNumber Last event sequence number received by the client.

queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Response parameters
lastSentSequenceNumber

EventSequenceNumber Last event sequence number sent by the repository.

queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Errors

5.4.4. Miscellaneous

5.4.4.1. Get available ids

Request count number of unused valid ids.

Same functionality as bulk API ids command.

We don’t assume leases, i.e. ids handed out to one client are "owned" by that client forever. We identify the client by its clientId.

Technical name

GetAvailableIds

Request parameters
count

integer type Number of ids requested.

queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Response parameters
ids

FreeId[] List of ids guaranteed to be free. The repository MUST return between one (inclusive) and count (inclusive) ids. It MAY return less than count ids.

queryId

QueryId Id of this query.

additionalInfos

additionalInfos

5.4.4.2. List partitions

Lists all non-language partitions accessible in the repository.[38]

Same functionality as bulk API listPartitions command.

Technical name

ListPartitions

Request parameters
depthLimit

depth limit Depth of partitions.

queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Response parameters
partitions

shallow chunk All accessible Partitions in the Repository up to depthLimit.

split?

SplitFlag

queryId

QueryId Id of this query.

additionalInfos

additionalInfos

5.4.4.3. List and subscribe partitions

Lists all non-language partitions accessible in the repository, and subscribes the client to all of them.[38] The client receives the full contents of all listed partitions.[25]

See also List partitions.

Technical name

ListAndSubscribePartitions

Request parameters
queryId

QueryId Id of this query.

additionalInfos

additionalInfos

Response parameters
partitions

multi chunk All accessible Partitions in the Repository.

split?

SplitFlag

queryId

QueryId Id of this query.

additionalInfos

additionalInfos

5.5. Command — event pairs overview

legend
Diagram legend

5.5.1. Partitions

Command / Event / Description Before After

Add newPartition node as new partition.

nothing

addPartition

Delete partition deletedPartition.

deletePartition

nothing

5.5.2. Nodes

Command / Event / Description Before After

Change classifier of node from oldClassifier to newClassifier.

changeClassifier before
changeClassifier after

5.5.3. Properties

Command / Event / Description Before After

Add newValue as value of property property to node.

addProperty before
addProperty after

Delete existing property with oldValue from node.

deleteProperty before
deleteProperty after

Change existing property of node from oldValue to newValue.

changeProperty before
changeProperty after

5.5.4. Children

Command / Event / Description Before After

Add new node newChild to parent in containment at index.

addChild before
addChild after

Delete existing node deletedChild from parent's containment at index.

deleteChild before
deleteChild after

Replace existing node replacedChild inside parent's containment at index with new node newChild. Delete replacedChild.

replaceChild before
replaceChild after

Move existing node movedChild (currently inside oldParent's oldContainment at oldIndex) inside newParent's newContainment at newIndex.

moveChildFromOtherContainment before
moveChildFromOtherContainment after

Move existing node movedChild (currently inside parent's oldContainment at oldIndex) inside parent's newContainment at newIndex.

moveChildFromOtherContainmentInSameParent before
moveChildFromOtherContainmentInSameParent after

Move existing node movedChild (currently inside parent's containment at oldIndex) inside parent's containment at newIndex.

moveChildInSameContainment before
moveChildInSameContainment after

Move existing node movedChild (currently inside oldParent's oldContainment at oldIndex) inside newParent's newContainment at newIndex, replacing replacedChild that was previously inside newParent's newContainment at newIndex.

moveAndReplaceChildFromOtherContainment before
moveAndReplaceChildFromOtherContainment after

Move existing node movedChild (currently inside parent's oldContainment at oldIndex) inside parent's newContainment at newIndex, replacing replacedChild that was previously inside parent's newContainment at newIndex.

moveAndReplaceChildFromOtherContainmentInSameParent before
moveAndReplaceChildFromOtherContainmentInSameParent after

Move existing node movedChild (currently inside parent's containment at oldIndex) inside parent's containment at newIndex, replacing replacedChild that was previously inside parent's containment at newIndex.

moveAndReplaceChildInSameContainment before
moveAndReplaceChildInSameContainment after

5.5.5. Annotations

Command / Event / Description Before After

Add new node newAnnotation to parent's annotations at index.

addAnnotation before
addAnnotation after

Delete existing node deletedAnnotation from parent's annotations at index.

deleteAnnotation before
deleteAnnotation after

Replace existing node replacedAnnotation inside parent's annotations at index with new node newAnnotation. Delete replacedAnnotation.

replaceAnnotation before
replaceAnnotation after

Move existing node movedAnnotation (currently inside oldParent's annotations at oldIndex) inside newParent's annotations at newIndex.

moveAnnotationFromOtherParent before
moveAnnotationFromOtherParent after

Move existing node movedAnnotation (currently inside parent's annotations at oldIndex) inside parent's annotations at newIndex.

moveAnnotationInSameParent before
moveAnnotationInSameParent after

Move existing node movedAnnotation (currently inside oldParent's annotations at oldIndex) inside newParent's annotations at newIndex, replacing replacedAnnotation that was previously inside newParent's annotations at newIndex.

moveAndReplaceAnnotationFromOtherParent before
moveAndReplaceAnnotationFromOtherParent after

Move existing node movedAnnotation (currently inside parent's annotations at oldIndex) inside parent's annotations at newIndex, replacing replacedAnnotation that was previously inside parent's annotations at newIndex.

moveAndReplaceAnnotationInSameParent before
moveAndReplaceAnnotationInSameParent after

5.5.6. References

Command / Event / Description Before After

Add newTarget / newResolveInfo to parent's reference at index.

addReference before
addReference after

Delete existing deletedTarget/deletedResolveInfo from parent's reference at index.

deleteReference before
deleteReference after

Replace existing replacedTarget/replacedResolveInfo inside parent's reference at index with newTarget/newResolveInfo.

changeReference before
changeReference after

5.6. Commands

5.6.1. Chunked Command

A continued chunk for one of the following splittable commands:

Technical name

ChunkedCommand

Parameters
chunk

SerializationChunk The continued chunk. The combination of all continued chunks MUST adhere to the same constraints as the related splittable message's chunk.

continuedChunkCompleted

ContinuedChunkCompletedFlag

continuedChunkSequenceNumber

ContinuedChunkSequenceNumber

commandId

CommandId Id of the related splittable command

additionalInfos

additionalInfos

5.6.2. Partitions

5.6.2.1. Add partition

Add newPartition node as new partition.

The client implicitly subscribes to any changes to newPartition or any of its descendants.

Before After

nothing

addPartition
Technical name

AddPartition

Parameters
newPartition

single chunk Subtree to form a new partition. The anchor node MUST NOT contain a parent (as this is a partition, thus cannot have a parent). All nodes in that subtree MUST be new nodes.

Note
This parameter differs from the corresponding event parameter: The command’s parameter contains a whole subtree, whereas the event’s parameter may contain only the top of the subtree.[25]
split?

SplitFlag

commandId

CommandId Id of this command.

additionalInfos

additionalInfos

Related event

Partition added

5.6.2.2. Delete partition

Delete existing partition deletedPartition, and all its descendants (including annotation instances). Does NOT change references to any of the deleted nodes.[39]

Before After
deletePartition

nothing

Technical name

DeletePartition

Parameters
deletedPartition

TargetNode

commandId

CommandId Id of this command.

additionalInfos

additionalInfos

Related event

Partition deleted

5.6.3. Nodes

5.6.3.1. Change classifier

Change classifier of existing node node to newClassifier.

Before After
changeClassifier before
changeClassifier after
Technical name

ChangeClassifier

Parameters
node

TargetNode

newClassifier

MetaPointer

commandId

CommandId Id of this command.

additionalInfos

additionalInfos

Related event

Classifier changed

5.6.4. Properties

5.6.4.1. Add property

Add newValue as value of property property to node.

Before After
addProperty before
addProperty after
Technical name

AddProperty

Parameters
node

TargetNode

property

MetaPointer

newValue

PropertyValue

commandId

CommandId

additionalInfos

additionalInfos

Errors
Related event

Property added

5.6.4.2. Delete property

Delete existing property from node.

Before After
deleteProperty before
deleteProperty after
Technical name

DeleteProperty

Parameters
node

TargetNode

property

MetaPointer

commandId

CommandId

additionalInfos

additionalInfos

Errors
Related event

Property deleted

5.6.4.3. Change property

Change existing property of node to newValue.

Before After
changeProperty before
changeProperty after
Technical name

ChangeProperty

Parameters
node

TargetNode

property

MetaPointer

newValue

PropertyValue

commandId

CommandId

additionalInfos

additionalInfos

Errors
Related event

Property changed

5.6.5. Children

5.6.5.1. Add child
Before After
addChild before
addChild after
Technical name

AddChild

Parameters
parent

TargetNode

newChild

single chunk Subtree to form a new child. The anchor node MUST contain the parent as parent.[40] All nodes in that subtree MUST be new nodes.

containment

MetaPointer

index

Index

split?

SplitFlag

commandId

CommandId

additionalInfos

additionalInfos

Related event

Child added

5.6.5.2. Delete child

Delete existing node deletedChild[41] from parent's containment at index, and all its descendants (including annotation instances). Does NOT change references to any of the deleted nodes.[39]

Before After
deleteChild before
deleteChild after
Technical name

DeleteChild

Parameters
parent

TargetNode

containment

MetaPointer

index

Index

deletedChild

TargetNode

commandId

CommandId

additionalInfos

additionalInfos

Related event

Child deleted

5.6.5.3. Replace child

Delete current child replacedChild[41] inside parent's containment at index, and all its descendants (including annotation instances). Does NOT change references to any of the deleted nodes.[39]

Before After
replaceChild before
replaceChild after
Technical name

ReplaceChild

Parameters
newChild

single chunk Subtree to form a new child. The anchor node MUST contain the parent as parent.[40] All nodes in that subtree MUST either be new nodes or reused nodes.

parent

TargetNode

containment

MetaPointer

index

Index

replacedChild

TargetNode

split?

SplitFlag

commandId

CommandId

additionalInfos

additionalInfos

Related event

Child replaced

5.6.5.4. Move child from other containment
Before After
moveChildFromOtherContainment before
moveChildFromOtherContainment after
Technical name

MoveChildFromOtherContainment

Parameters
newParent

TargetNode

newContainment

MetaPointer

newIndex

Index

movedChild

TargetNode

commandId

CommandId

additionalInfos

additionalInfos

Errors
5.6.5.5. Move child from other containment in same parent

Move existing node movedChild (currently inside one of movedChild's parent’s containments other than newContainment) inside movedChild's parent’s newContainment at newIndex.

Before After
moveChildFromOtherContainmentInSameParent before
moveChildFromOtherContainmentInSameParent after
Technical name

MoveChildFromOtherContainmentInSameParent

Parameters
newContainment

MetaPointer

newIndex

Index

movedChild

TargetNode

commandId

CommandId

additionalInfos

additionalInfos

Errors
5.6.5.6. Move child in same containment

Move existing node movedChild within its current containment to newIndex.

Before After
moveChildInSameContainment before
moveChildInSameContainment after
Technical name

MoveChildInSameContainment

Parameters
newIndex

Index

movedChild

TargetNode

commandId

CommandId

additionalInfos

additionalInfos

Errors
5.6.5.7. Move child from other containment and replace existing child

Move existing node movedChild inside newParent's newContainment at newIndex. Delete current child replacedChild[41] inside newParent's newContainment at newIndex, and all its descendants (including annotation instances). Does NOT change references to any of the deleted nodes.[39]

Before After
moveAndReplaceChildFromOtherContainment before
moveAndReplaceChildFromOtherContainment after
Technical name

MoveAndReplaceChildFromOtherContainment

Parameters
newParent

TargetNode

newContainment

MetaPointer

newIndex

Index

replacedChild

TargetNode

movedChild

TargetNode

commandId

CommandId

additionalInfos

additionalInfos

5.6.5.8. Move child from other containment in same parent and replace existing child

Move existing node movedChild (currently inside one of movedChild's parent’s containments other than newContainment) inside movedChild's parent’s newContainment at newIndex. Delete current child replacedChild[41] inside movedChild's parent’s newContainment at newIndex, and all its descendants (including annotation instances). Does NOT change references to any of the deleted nodes.[39]

Before After
moveAndReplaceChildFromOtherContainmentInSameParent before
moveAndReplaceChildFromOtherContainmentInSameParent after
Technical name

MoveAndReplaceChildFromOtherContainmentInSameParent

Parameters
newContainment

MetaPointer

newIndex

Index

replacedChild

TargetNode

movedChild

TargetNode

commandId

CommandId

additionalInfos

additionalInfos

5.6.5.9. Move child in same containment and replace existing child

Move existing node movedChild within its current containment to newIndex. Delete current child replacedChild[41] inside the same containment at newIndex, and all its descendants (including annotation instances). Does NOT change references to any of the deleted nodes.[39]

Before After
moveAndReplaceChildInSameContainment before
moveAndReplaceChildInSameContainment after
Technical name

MoveAndReplaceChildInSameContainment

Parameters
newIndex

Index

replacedChild

TargetNode

movedChild

TargetNode

commandId

CommandId

additionalInfos

additionalInfos

5.6.6. Annotations

5.6.6.1. Add annotation

Add new node newAnnotation to parent's annotations at index.

Before After
addAnnotation before
addAnnotation after
Technical name

AddAnnotation

Parameters
parent

TargetNode

newAnnotation

single chunk Subtree to form a new annotation. The anchor node MUST contain the parent as parent.[40] All nodes in that subtree MUST be new nodes.

index

Index

split?

SplitFlag

commandId

CommandId

additionalInfos

additionalInfos

Errors
Related event

Annotation added

5.6.6.2. Delete annotation

Delete existing node deletedAnnotation[41] from parent's annotations at index, and all its descendants (including annotation instances). Does NOT change references to any of the deleted nodes.[39]

Before After
deleteAnnotation before
deleteAnnotation after
Technical name

DeleteAnnotation

Parameters
parent

TargetNode

index

Index

deletedAnnotation

TargetNode

commandId

CommandId

additionalInfos

additionalInfos

Related event

Annotation deleted

5.6.6.3. Replace annotation

Delete current node replacedAnnotation[41] at parent's annotations at index, and all its descendants (including annotation instances). Does NOT change references to any of the deleted nodes.[39]

Replace existing node replacedAnnotation inside parent's annotations at index with new or reused node newAnnotation.

Before After
replaceAnnotation before
replaceAnnotation after
Technical name

ReplaceAnnotation

Parameters
newAnnotation

single chunk Subtree to form a new annotation. The anchor node MUST contain the parent as parent.[40] All nodes in that subtree MUST either be new nodes or reused nodes.

parent

TargetNode

index

Index

replacedAnnotation

TargetNode

split?

SplitFlag

commandId

CommandId

additionalInfos

additionalInfos

Related event

Annotation replaced

5.6.6.4. Move annotation from other parent

Move existing node movedAnnotation inside newParent's annotations at newIndex.

Before After
moveAnnotationFromOtherParent before
moveAnnotationFromOtherParent after
Technical name

MoveAnnotationFromOtherParent

Parameters
newParent

TargetNode

newIndex

Index

movedAnnotation

TargetNode

commandId

CommandId

additionalInfos

additionalInfos

Errors
5.6.6.5. Move annotation in same parent

Move existing node movedAnnotation within the same parent to newIndex.

Before After
moveAnnotationInSameParent before
moveAnnotationInSameParent after
Technical name

MoveAnnotationInSameParent

Parameters
newIndex

Index

movedAnnotation

TargetNode

commandId

CommandId

additionalInfos

additionalInfos

Errors
5.6.6.6. Move annotation from other parent and replace existing annotation

Move existing node movedAnnotation inside newParent's annotations at newIndex. Delete current node replacedAnnotation[41] at newParent's annotations at newIndex, and all its descendants (including annotation instances). Does NOT change references to any of the deleted nodes.[39]

Before After
moveAndReplaceAnnotationFromOtherParent before
moveAndReplaceAnnotationFromOtherParent after
Technical name

MoveAndReplaceAnnotationFromOtherParent

Parameters
newParent

TargetNode

newIndex

Index

replacedAnnotation

TargetNode

movedAnnotation

TargetNode

commandId

CommandId

additionalInfos

additionalInfos

5.6.6.7. Move annotation in same parent and replace existing annotation

Move existing node movedAnnotation within the same parent to newIndex. Delete current node replacedAnnotation[41] at movedAnnotation's parent’s annotations at newIndex, and all its descendants (including annotation instances). Does NOT change references to any of the deleted nodes.[39]

Before After
moveAndReplaceAnnotationInSameParent before
moveAndReplaceAnnotationInSameParent after
Technical name

MoveAndReplaceAnnotationInSameParent

Parameters
newIndex

Index

replacedAnnotation

TargetNode

movedAnnotation

TargetNode

commandId

CommandId

additionalInfos

additionalInfos

5.6.7. References

5.6.7.1. Add reference
Before After
addReference before
addReference after
Technical name

AddReference

Parameters
parent

TargetNode

reference

MetaPointer

index

Index

newReference

TargetNode?

newResolveInfo

ResolveInfo?

commandId

CommandId

additionalInfos

additionalInfos

Related event

Reference added

5.6.7.2. Delete reference

Delete existing entry deletedReference/deletedResolveInfo[41] from parent's reference at index.

Before After
deleteReference before
deleteReference after
Technical name

DeleteReference

Parameters
parent

TargetNode

reference

MetaPointer

index

Index

deletedReference

TargetNode?

deletedResolveInfo

ResolveInfo?

commandId

CommandId

additionalInfos

additionalInfos

Related event

Reference deleted

5.6.7.3. Change reference

Replace existing entry oldReference/oldResolveInfo[41] inside parent's reference at index with newReference/newResolveInfo.

Before After
changeReference before
changeReference after
Technical name

ChangeReference

Parameters
parent

TargetNode

reference

MetaPointer

index

Index

oldReference

TargetNode?

oldResolveInfo

ResolveInfo?

newReference

TargetNode?

newResolveInfo

ResolveInfo?

commandId

CommandId

additionalInfos

additionalInfos

Related event

Reference changed

5.6.8. Composite

5.6.8.1. Composite

Groups several commands into a logical group.[42] The parts are ordered.

Command groups don’t guarantee anything; the repository MAY take the group as a hint to resolve conflicts in a different manner.

Composite commands have a command id on their own.[43] We can nest composite commands arbitrarily.[44]

Technical name

CompositeCommand [45]

Parameters
parts

Command[]

protocolMessages

[protocolMessagesType]

Errors
Related event

Composite

5.7. Events

5.7.1. Chunked Event

A continued chunk for one of the following splittable events:

Technical name

ChunkedEvent

Parameters
chunk

SerializationChunk The continued chunk. The combination of all continued chunks MUST adhere to the same constraints as the related splittable message's chunk.

continuedChunkCompleted

ContinuedChunkCompletedFlag

chunkedEventSequenceNumber

event sequence number Sequence number of the related splittable event

sequenceNumber

event sequence number

additionalInfos

additionalInfos

5.7.2. Partitions

5.7.2.1. Partition added

New partition newPartition has been added to the repository.

Technical name

PartitionAdded

Parameters
newPartition

single chunk (if subscribed via List and subscribe partitions or Subscribe to partition changes) or
shallow chunk (if subscribed via Inform about partition changes) up to depthLimit.

Note
This parameter differs from the corresponding command parameter: The command’s parameter always contains a whole subtree, whereas the event’s parameter may contain only the top of the subtree.[25]
split?

SplitFlag

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Add partition

5.7.2.2. Partition deleted

Partition deletedPartition, and all its deletedDescendants[46], have been deleted from the repository.

This client is now unsubscribed from any changes to deletedPartition or any of its descendants.

Technical name

PartitionDeleted

Parameters
deletedPartition

TargetNode

deletedDescendants

TargetNode[]

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Delete partition

5.7.3. Nodes

5.7.3.1. Classifier changed

Classifier of node has been changed from oldClassifier to newClassifier.

Technical name

ClassifierChanged

Parameters
node

TargetNode

newClassifier

MetaPointer

oldClassifier

MetaPointer

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Change classifier

5.7.4. Properties

5.7.4.1. Property added

property of node has been set to newValue.

Technical name

PropertyAdded

Parameters
node

TargetNode

property

MetaPointer

newValue

PropertyValue

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Add property

5.7.4.2. Property deleted

Existing property of node with oldValue has been deleted.

Technical name

PropertyDeleted

Parameters
node

TargetNode

property

MetaPointer

oldValue

PropertyValue

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Delete property

5.7.4.3. Property changed

Existing property of node has been changed from oldValue to newValue.

Technical name

PropertyChanged

Parameters
node

TargetNode

property

MetaPointer

newValue

PropertyValue

oldValue

PropertyValue

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Change property

5.7.5. Children

5.7.5.1. Child added

New node newChild has been added to parent's containment at index.

All other children inside parent's containment with index >= index have been moved to next higher index.

Technical name

ChildAdded

Parameters
parent

TargetNode

newChild

single chunk Subtree that formed the new child. The anchor node MUST contain the parent as parent.[40] All nodes in that subtree MUST be new nodes.[47]

containment

MetaPointer

index

Index

split?

SplitFlag

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Add child

5.7.5.2. Child deleted

Existing node deletedChild, and all its deletedDescendants[46], have been deleted from parent's containment at index.[48] All other children inside parent's containment with index > index have been moved to next lower index.

Technical name

ChildDeleted

Parameters
deletedChild

TargetNode

deletedDescendants

TargetNode[]

parent

TargetNode

containment

MetaPointer

index

Index

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Delete child

5.7.5.3. Child replaced

Existing node replacedChild, and all its replacedDescendants[46], inside parent's containment at index has been replaced with new or reused node newChild.

replacedChild, and all its descendants, have been deleted.

Technical name

ChildReplaced

Parameters
newChild

single chunk Subtree that formed the new child. The anchor node MUST contain the parent as parent.[40] All nodes in that subtree MUST be new nodes or reused nodes.[47]

replacedChild

TargetNode

replacedDescendants

TargetNode[]

parent

TargetNode

containment

MetaPointer

index

Index

split?

SplitFlag

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Replace child

5.7.5.4. Child moved from other containment

Existing node movedChild (previously inside oldParent's oldContainment at oldIndex) has been moved inside newParent's newContainment at newIndex.

All other children inside oldParent's oldContainment with index > oldIndex have been moved to next lower index.

All other children inside newParent's newContainment with index >= newIndex have been moved to next higher index.

Technical name

ChildMovedFromOtherContainment

Parameters
newParent

TargetNode

newContainment

MetaPointer

newIndex

Index

movedChild

TargetNode

oldParent

TargetNode

oldContainment

MetaPointer

oldIndex

Index

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

5.7.5.5. Child moved from other containment in same parent

Existing node movedChild (previously inside parent's oldContainment at oldIndex) has been moved inside parent's newContainment at newIndex.

All other children inside parent's oldContainment with index > oldIndex have been moved to next lower index.

All other children inside parent's newContainment with index >= newIndex have been moved to next higher index.

Technical name

ChildMovedFromOtherContainmentInSameParent

Parameters
newContainment

MetaPointer

newIndex

Index

movedChild

TargetNode

parent

TargetNode

oldContainment

MetaPointer

oldIndex

Index

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

5.7.5.6. Child moved in same containment

Existing node movedChild (previously inside parent's containment at oldIndex) has been moved inside parent's containment at newIndex.

If oldIndex < newIndex: All other children inside parent's containment with previous index > oldIndex and previous index ⇐ newIndex have been moved to next lower index. Example:
oldIndex=3: A[0] B[1] C[2] X[3] D[4] E[5] F[6]
newIndex=5: A[0] B[1] C[2] D[3] E[4] X[5] F[6]

If oldIndex > newIndex: All other children inside parent's containment with previous index >= newIndex and previous index < oldIndex have been moved to next lower index. Example:
oldIndex=3: A[0] B[1] C[2] X[3] D[4] E[5] F[6]
newIndex=1: A[0] X[1] B[2] C[3] D[4] E[5] F[6]

oldIndex MUST NOT be equal to newIndex.

Technical name

ChildMovedInSameContainment

Parameters
newIndex

Index

movedChild

TargetNode

parent

TargetNode

containment

MetaPointer

oldIndex

Index

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

5.7.5.7. Child moved from other containment and replaced existing child

Existing node movedChild (previously inside oldParent's oldContainment at oldIndex) has replaced the existing replacedChild inside newParent's newContainment at newIndex. replacedChild, and all its replacedDescendants[46], have been deleted.

All other children inside oldParent's oldContainment with index > oldIndex have been moved to next lower index.

No other children inside newParent's newContainment have been moved.

Technical name

ChildMovedAndReplacedFromOtherContainment

Parameters
newParent

TargetNode

newContainment

MetaPointer

newIndex

Index

movedChild

TargetNode

oldParent

TargetNode

oldContainment

MetaPointer

oldIndex

Index

replacedChild

TargetNode

replacedDescendants

TargetNode[]

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

5.7.5.8. Child moved from other containment in same parent and replaced existing child

Existing node movedChild (previously inside parent's oldContainment at oldIndex) has replaced the existing replacedChild inside parent's newContainment at newIndex. replacedChild, and all its replacedDescendants[46], have been deleted.

All other children inside parent's oldContainment with index > oldIndex have been moved to next lower index.

No other children inside parent's newContainment have been moved.

Technical name

ChildMovedAndReplacedFromOtherContainmentInSameParent

Parameters
newContainment

MetaPointer

newIndex

Index

movedChild

TargetNode

parent

TargetNode

oldContainment

MetaPointer

oldIndex

Index

replacedChild

TargetNode

replacedDescendants

TargetNode[]

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

5.7.5.9. Child moved in same containment and replaced existing child

Existing node movedChild (previously inside parent's containment at oldIndex) has replaced the existing replacedChild inside parent's containment at newIndex. replacedChild, and all its replacedDescendants[46], have been deleted.

If oldIndex < newIndex: All other children inside parent's containment with previous index > oldIndex have been moved to next lower index. Example:
oldIndex=3: A[0] B[1] C[2] X[3] D[4] E[5] F[6] G[7]
newIndex=5: A[0] B[1] C[2] D[3] E[4] X[5] G[6]

If oldIndex > newIndex: All other children inside parent's containment with previous index >= oldIndex have been moved to next lower index. Example:
oldIndex=4: A[0] B[1] C[2] D[3] X[4] E[5] F[6]
newIndex=1: A[0] X[1] C[2] D[3] E[4] F[5]

oldIndex MUST NOT be equal to newIndex.

Technical name

ChildMovedAndReplacedInSameContainment

Parameters
newIndex

Index

movedChild

TargetNode

parent

TargetNode

containment

MetaPointer

oldIndex

Index

replacedChild

TargetNode

replacedDescendants

TargetNode[]

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

5.7.6. Annotations

5.7.6.1. Annotation added

New node newAnnotation has been added to parent's annotations at index.

All other annotations inside parent's annotations with index >= index have been moved to next higher index.

Technical name

AnnotationAdded

Parameters
parent

TargetNode

newAnnotation

single chunk Subtree that formed the new annotation. The anchor node MUST contain the parent as parent.[40] All nodes in that subtree MUST be new nodes.[47]

index

Index

split?

SplitFlag

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Add annotation

5.7.6.2. Annotation deleted

Existing node deletedAnnotation, and all its deletedDescendants[46], have been deleted from parent's annotations at index.[48] All other annotations inside parent's annotations with index > index have been moved to next lower index.

Technical name

AnnotationDeleted

Parameters
deletedAnnotation

TargetNode

deletedDescendants

TargetNode[]

parent

TargetNode

index

Index

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Delete annotation

5.7.6.3. Annotation replaced

Existing node replacedAnnotation, and all its replacedDescendants[46], inside parent's annotations at index has been replaced with new or reused node newAnnotation.

replacedAnnotation, and all its descendants, have been deleted.

Technical name

AnnotationReplaced

Parameters
newAnnotation

single chunk Subtree that formed the new annotation. The anchor node MUST contain the newAnnotation as parent.[40] All nodes in that subtree MUST either be new nodes or reused nodes.[47]

replacedAnnotation

TargetNode

replacedDescendants

TargetNode[]

parent

TargetNode

index

Index

split?

SplitFlag

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Replace annotation

5.7.6.4. Annotation moved from other parent

Existing node movedAnnotation (previously inside oldParent's annotations at oldIndex) has been moved inside newParent's annotations at newIndex.

All other annotations inside oldParent's annotations with index > oldIndex have been moved to next lower index.

All other annotations inside newParent's annotations with index >= newIndex have been moved to next higher index.

Technical name

AnnotationMovedFromOtherParent

Parameters
newParent

TargetNode

newIndex

Index

movedAnnotation

TargetNode

oldParent

TargetNode

oldIndex

Index

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

5.7.6.5. Annotation moved in same parent

Existing node movedAnnotation (previously inside parent's annotations at oldIndex) has been moved inside parent's annotations at newIndex.

If oldIndex < newIndex: All other annotations inside parent's annotations with previous index > oldIndex and previous index ⇐ newIndex have been moved to next lower index. Example:
oldIndex=3: A[0] B[1] C[2] X[3] D[4] E[5] F[6]
newIndex=5: A[0] B[1] C[2] D[3] E[4] X[5] F[6]

If oldIndex > newIndex: All other annotations inside parent's annotations with previous index >= newIndex and previous index < oldIndex have been moved to next lower index. Example:
oldIndex=3: A[0] B[1] C[2] X[3] D[4] E[5] F[6]
newIndex=1: A[0] X[1] B[2] C[3] D[4] E[5] F[6]

oldIndex MUST NOT be equal to newIndex.

Technical name

AnnotationMovedInSameParent

Parameters
newIndex

Index

movedAnnotation

TargetNode

parent

TargetNode

oldIndex

TargetNode

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

5.7.6.6. Annotation moved from other parent and replaced existing annotation

Existing node movedAnnotation (previously inside oldParent's annotations at oldIndex) has replaced the existing replacedAnnotation inside newParent's annotations at newIndex. replacedAnnotation, and all its replacedDescendants[46], have been deleted.

All other annotations inside oldParent's annotations with index > oldIndex have been moved to next lower index.

No other annotations inside newParent's annotations have been moved.

Technical name

AnnotationMovedAndReplacedFromOtherParent

Parameters
newParent

TargetNode

newIndex

Index

movedAnnotation

TargetNode

oldParent

TargetNode

oldIndex

Index

replacedAnnotation

TargetNode

replacedDescendants

TargetNode[]

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

5.7.6.7. Annotation moved in same parent and replaced existing annotation

Existing node movedAnnotation (previously inside parent's annotations at oldIndex) has replaced the existing replacedAnnotation inside parent's annotations at newIndex. replacedAnnotation, and all its replacedDescendants[46], have been deleted.

If oldIndex < newIndex: All other annotations inside parent's annotations with previous index > oldIndex have been moved to next lower index. Example:
oldIndex=3: A[0] B[1] C[2] X[3] D[4] E[5] F[6] G[7]
newIndex=5: A[0] B[1] C[2] D[3] E[4] X[5] G[6]

If oldIndex > newIndex: All other annotations inside parent's annotations with previous index >= oldIndex have been moved to next lower index. Example:
oldIndex=4: A[0] B[1] C[2] D[3] X[4] E[5] F[6]
newIndex=1: A[0] X[1] C[2] D[3] E[4] F[5]

oldIndex MUST NOT be equal to newIndex.

Technical name

AnnotationMovedAndReplacedInSameParent

Parameters
newIndex

Index

movedAnnotation

TargetNode

parent

TargetNode

oldIndex

TargetNode

replacedAnnotation

TargetNode

replacedDescendants

TargetNode[]

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

5.7.7. References

5.7.7.1. Reference added

Reference with newReference/newResolveInfo has been added to parent's reference at index. All other entries inside parent's reference with index >= index have been moved to next higher index.

Technical name

ReferenceAdded

Parameters
parent

TargetNode

reference

MetaPointer

index

Index

newReference

TargetNode?

newResolveInfo

ResolveInfo?

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Add reference

5.7.7.2. Reference deleted

Existing reference with deletedReference/deletedResolveInfo has been deleted from parent's reference at index. All other entries inside parent's reference with index > index have been moved to next lower index.

Technical name

ReferenceDeleted

Parameters
parent

TargetNode

reference

MetaPointer

index

Index

deletedReference

TargetNode?

deletedResolveInfo

ResolveInfo?

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Delete reference

5.7.7.3. Reference changed

Existing reference with oldReference/oldResolveInfo inside parent's annotations at index has been replaced with newReference/newResolveInfo.

Technical name

ReferenceChanged

Parameters
parent

TargetNode

reference

MetaPointer

index

Index

newReference

TargetNode?

newResolveInfo

ResolveInfo?

oldReference

TargetNode?

oldResolveInfo

ResolveInfo?

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

Change reference

5.7.8. Miscellaneous

5.7.8.1. Composite

The events in parts have happened in the given order.[42]

Composite events don’t mention origin commands on their own; they are only mentioned in each part.[6] We can nest composite events arbitrarily.[44]

Technical name

CompositeEvent [49]

Parameters
parts

Event[]

protocolMessages

[protocolMessagesType]

Related command

Composite

5.7.8.2. No-op

Nothing happened as result of one or more command(s).[50]

Technical name

NoOp

Parameters
originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

none

5.7.8.3. ErrorEvent

Repository couldn’t handle one or more command(s).[51][34]

The repository MAY send an error event to only one participation.[52]

See also Error response.

Technical name

ErrorEvent

Parameters
errorCode

String

message

String

originCommands

CommandSource[]

sequenceNumber

event sequence number

additionalInfos

additionalInfos

Related command

none

Appendix A: Delta JSON Schema

The LionWeb delta JSON Schema.

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://lionweb.io/delta.schema.json",
  "title": "LionWeb Delta Protocol",
  "description": "Version: 0",
  "type": "object",
  "anyOf": [
    {
      "$ref": "#/$defs/QueryRequests"
    },
    {
      "$ref": "#/$defs/QueryResponses"
    },
    {
      "$ref": "#/$defs/Commands"
    },
    {
      "$ref": "#/$defs/Events"
    }
  ],
  "$defs": {
    "id": {
      "type": "string",
      "minLength": 1,
      "pattern": "^[a-zA-Z0-9_-]+$"
    },
    "deltaProtocolVersion": {
      "enum": [
        "2026.1"
      ]
    },
    "key": {
      "$ref": "#/$defs/id"
    },
    "version": {
      "type": "string",
      "minLength": 1
    },
    "metaPointer": {
      "type": "object",
      "properties": {
        "language": {
          "$ref": "#/$defs/key"
        },
        "version": {
          "$ref": "#/$defs/version"
        },
        "key": {
          "$ref": "#/$defs/key"
        }
      },
      "required": [
        "language",
        "version",
        "key"
      ],
      "additionalProperties": false,
      "minProperties": 3,
      "maxProperties": 3
    },
    "depthLimit": {
      "type": "integer",
      "minimum": 0
    },
    "split": {
      "type": "boolean"
    },
    "continuedChunkCompleted": {
      "type": "boolean"
    },
    "continuedChunkSequenceNumber": {
      "type": "integer",
      "minimum": 0
    },
    "DeltaSerializationChunk": {
      "type": "object",
      "properties": {
        "nodes": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/SerializedNode"
          },
          "uniqueItems": true
        }
      },
      "required": [
        "nodes"
      ],
      "additionalProperties": false,
      "minProperties": 1,
      "maxProperties": 1
    },
    "SerializedNode": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/$defs/targetNode"
        },
        "classifier": {
          "$ref": "#/$defs/metaPointer"
        },
        "properties": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/SerializedProperty"
          }
        },
        "containments": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/SerializedContainment"
          }
        },
        "references": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/SerializedReference"
          }
        },
        "annotations": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/id"
          },
          "uniqueItems": true
        },
        "parent": {
          "oneOf": [
            {
              "$ref": "#/$defs/id"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "id",
        "classifier",
        "properties",
        "containments",
        "references",
        "annotations",
        "parent"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 7
    },
    "SerializedProperty": {
      "type": "object",
      "properties": {
        "property": {
          "$ref": "#/$defs/metaPointer"
        },
        "value": {
          "oneOf": [
            {
              "$ref": "#/$defs/propertyValue"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "property",
        "value"
      ],
      "additionalProperties": false,
      "minProperties": 2,
      "maxProperties": 2
    },
    "SerializedContainment": {
      "type": "object",
      "properties": {
        "containment": {
          "$ref": "#/$defs/metaPointer"
        },
        "children": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/id"
          },
          "uniqueItems": true
        }
      },
      "required": [
        "containment",
        "children"
      ],
      "additionalProperties": false,
      "minProperties": 2,
      "maxProperties": 2
    },
    "SerializedReference": {
      "type": "object",
      "properties": {
        "reference": {
          "$ref": "#/$defs/metaPointer"
        },
        "targets": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/SerializedReferenceTarget"
          }
        }
      },
      "required": [
        "reference",
        "targets"
      ],
      "additionalProperties": false,
      "minProperties": 2,
      "maxProperties": 2
    },
    "SerializedReferenceTarget": {
      "type": "object",
      "properties": {
        "resolveInfo": {
          "$ref": "#/$defs/optionalResolveInfo"
        },
        "reference": {
          "$ref": "#/$defs/optionalTargetNode"
        }
      },
      "required": [
        "resolveInfo",
        "reference"
      ],
      "additionalProperties": false,
      "minProperties": 2,
      "maxProperties": 2
    },
    "queryId": {
      "$ref": "#/$defs/id"
    },
    "commandId": {
      "$ref": "#/$defs/id"
    },
    "commandSource": {
      "type": "object",
      "properties": {
        "participationId": {
          "$ref": "#/$defs/participationId"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        }
      },
      "required": [
        "participationId",
        "commandId"
      ],
      "additionalProperties": false,
      "minProperties": 2,
      "maxProperties": 2
    },
    "commandSources": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/commandSource"
      },
      "uniqueItems": true
    },
    "participationId": {
      "$ref": "#/$defs/id"
    },
    "repositoryId": {
      "$ref": "#/$defs/id"
    },
    "clientId": {
      "$ref": "#/$defs/id"
    },
    "targetNode": {
      "$ref": "#/$defs/id"
    },
    "optionalTargetNode": {
      "oneOf": [
        {
          "$ref": "#/$defs/targetNode"
        },
        {
          "type": "null"
        }
      ]
    },
    "targetNodes": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/targetNode"
      },
      "uniqueItems": true
    },
    "resolveInfo": {
      "type": "string"
    },
    "optionalResolveInfo": {
      "oneOf": [
        {
          "$ref": "#/$defs/resolveInfo"
        },
        {
          "type": "null"
        }
      ]
    },
    "eventSequenceNumber": {
      "type": "integer",
      "minimum": 0
    },
    "propertyValue": {
      "type": "string"
    },
    "index": {
      "type": "integer",
      "minimum": 0
    },
    "additionalInfoKind": {
      "$ref": "#/$defs/id"
    },
    "errorCode": {
      "$ref": "#/$defs/id"
    },
    "additionalInfoDataKey": {
      "$ref": "#/$defs/id"
    },
    "additionalInfos": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/AdditionalInfo"
      }
    },
    "AdditionalInfo": {
      "properties": {
        "kind": {
          "$ref": "#/$defs/additionalInfoKind"
        },
        "distribute": {
          "$ref": "#/$defs/additionalInfoDistribute"
        },
        "message": {
          "type": "string"
        },
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/AdditionalInfoData"
          }
        }
      },
      "required": [
        "kind",
        "message",
        "data"
      ],
      "additionalProperties": false,
      "minProperties": 3,
      "maxProperties": 4
    },
    "additionalInfoDistribute": {
      "type": "boolean",
      "default": false
    },
    "AdditionalInfoData": {
      "properties": {
        "key": {
          "$ref": "#/$defs/additionalInfoDataKey"
        },
        "value": {
          "type": "string"
        }
      },
      "required": [
        "key",
        "value"
      ],
      "additionalProperties": false,
      "minProperties": 2,
      "maxProperties": 2
    },
    "QueryRequests": {
      "anyOf": [
        {
          "$ref": "#/$defs/SubscribeToChangingPartitionsRequest"
        },
        {
          "$ref": "#/$defs/InformAboutChangingPartitionsRequest"
        },
        {
          "$ref": "#/$defs/SubscribeToPartitionContentsRequest"
        },
        {
          "$ref": "#/$defs/UnsubscribeFromPartitionContentsRequest"
        },
        {
          "$ref": "#/$defs/SignOnRequest"
        },
        {
          "$ref": "#/$defs/SignOffRequest"
        },
        {
          "$ref": "#/$defs/ReconnectRequest"
        },
        {
          "$ref": "#/$defs/GetAvailableIdsRequest"
        },
        {
          "$ref": "#/$defs/ListPartitionsRequest"
        },
        {
          "$ref": "#/$defs/ListAndSubscribePartitionsRequest"
        }
      ]
    },
    "QueryResponses": {
      "anyOf": [
        {
          "$ref": "#/$defs/SubscribeToChangingPartitionsResponse"
        },
        {
          "$ref": "#/$defs/InformAboutChangingPartitionsResponse"
        },
        {
          "$ref": "#/$defs/SubscribeToPartitionContentsResponse"
        },
        {
          "$ref": "#/$defs/UnsubscribeFromPartitionContentsResponse"
        },
        {
          "$ref": "#/$defs/SignOnResponse"
        },
        {
          "$ref": "#/$defs/SignOffResponse"
        },
        {
          "$ref": "#/$defs/ReconnectResponse"
        },
        {
          "$ref": "#/$defs/GetAvailableIdsResponse"
        },
        {
          "$ref": "#/$defs/ListPartitionsResponse"
        },
        {
          "$ref": "#/$defs/ListAndSubscribePartitionsResponse"
        },
        {
          "$ref": "#/$defs/ErrorResponse"
        },
        {
          "$ref": "#/$defs/ChunkedQueryResponse"
        }
      ]
    },
    "SubscribeToChangingPartitionsRequest": {
      "properties": {
        "messageKind": {
          "const": "SubscribeToChangingPartitionsRequest"
        },
        "creation": {
          "type": "boolean"
        },
        "deletion": {
          "type": "boolean"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "creation",
        "deletion",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 5,
      "maxProperties": 5
    },
    "SubscribeToChangingPartitionsResponse": {
      "properties": {
        "messageKind": {
          "const": "SubscribeToChangingPartitionsResponse"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 3,
      "maxProperties": 3
    },
    "InformAboutChangingPartitionsRequest": {
      "properties": {
        "messageKind": {
          "const": "InformAboutChangingPartitionsRequest"
        },
        "creation": {
          "type": "boolean"
        },
        "deletion": {
          "type": "boolean"
        },
        "depthLimit": {
          "$ref": "#/$defs/depthLimit"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "creation",
        "deletion",
        "depthLimit",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 6
    },
    "InformAboutChangingPartitionsResponse": {
      "properties": {
        "messageKind": {
          "const": "InformAboutChangingPartitionsResponse"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 3,
      "maxProperties": 3
    },
    "SubscribeToPartitionContentsRequest": {
      "properties": {
        "messageKind": {
          "const": "SubscribeToPartitionContentsRequest"
        },
        "partition": {
          "$ref": "#/$defs/targetNode"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "partition",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 4,
      "maxProperties": 4
    },
    "SubscribeToPartitionContentsResponse": {
      "properties": {
        "messageKind": {
          "const": "SubscribeToPartitionContentsResponse"
        },
        "contents": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "split": {
          "$ref": "#/$defs/split"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "contents",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 4,
      "maxProperties": 5
    },
    "UnsubscribeFromPartitionContentsRequest": {
      "properties": {
        "messageKind": {
          "const": "UnsubscribeFromPartitionContentsRequest"
        },
        "partition": {
          "$ref": "#/$defs/targetNode"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "partition",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 4,
      "maxProperties": 4
    },
    "UnsubscribeFromPartitionContentsResponse": {
      "properties": {
        "messageKind": {
          "const": "UnsubscribeFromPartitionContentsResponse"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 3,
      "maxProperties": 3
    },
    "SignOnRequest": {
      "properties": {
        "messageKind": {
          "const": "SignOnRequest"
        },
        "deltaProtocolVersion": {
          "$ref": "#/$defs/deltaProtocolVersion"
        },
        "clientId": {
          "$ref": "#/$defs/clientId"
        },
        "repositoryId": {
          "$ref": "#/$defs/repositoryId"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "deltaProtocolVersion",
        "clientId",
        "repositoryId",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 6
    },
    "SignOnResponse": {
      "properties": {
        "messageKind": {
          "const": "SignOnResponse"
        },
        "participationId": {
          "$ref": "#/$defs/participationId"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "participationId",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 4,
      "maxProperties": 4
    },
    "SignOffRequest": {
      "properties": {
        "messageKind": {
          "const": "SignOffRequest"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 3,
      "maxProperties": 3
    },
    "SignOffResponse": {
      "properties": {
        "messageKind": {
          "const": "SignOffResponse"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 3,
      "maxProperties": 3
    },
    "ReconnectRequest": {
      "properties": {
        "messageKind": {
          "const": "ReconnectRequest"
        },
        "participationId": {
          "$ref": "#/$defs/participationId"
        },
        "lastReceivedSequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "participationId",
        "lastReceivedSequenceNumber",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 5,
      "maxProperties": 5
    },
    "ReconnectResponse": {
      "properties": {
        "messageKind": {
          "const": "ReconnectResponse"
        },
        "lastSentSequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "lastSentSequenceNumber",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 4,
      "maxProperties": 4
    },
    "GetAvailableIdsRequest": {
      "properties": {
        "messageKind": {
          "const": "GetAvailableIdsRequest"
        },
        "count": {
          "type": "integer",
          "minimum": 0
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "count",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 4,
      "maxProperties": 4
    },
    "GetAvailableIdsResponse": {
      "properties": {
        "messageKind": {
          "const": "GetAvailableIdsResponse"
        },
        "ids": {
          "$ref": "#/$defs/targetNodes"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "ids",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 4,
      "maxProperties": 4
    },
    "ListPartitionsRequest": {
      "properties": {
        "messageKind": {
          "const": "ListPartitionsRequest"
        },
        "depthLimit": {
          "$ref": "#/$defs/depthLimit"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "depthLimit",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 4,
      "maxProperties": 4
    },
    "ListPartitionsResponse": {
      "properties": {
        "messageKind": {
          "const": "ListPartitionsResponse"
        },
        "partitions": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "split": {
          "$ref": "#/$defs/split"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "partitions",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 4,
      "maxProperties": 5
    },
    "ListAndSubscribePartitionsRequest": {
      "properties": {
        "messageKind": {
          "const": "ListAndSubscribePartitionsRequest"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 3,
      "maxProperties": 3
    },
    "ListAndSubscribePartitionsResponse": {
      "properties": {
        "messageKind": {
          "const": "ListAndSubscribePartitionsResponse"
        },
        "partitions": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "split": {
          "$ref": "#/$defs/split"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "partitions",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 4,
      "maxProperties": 5
    },
    "ErrorResponse": {
      "properties": {
        "messageKind": {
          "const": "ErrorResponse"
        },
        "errorCode": {
          "$ref": "#/$defs/errorCode"
        },
        "message": {
          "type": "string"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "errorCode",
        "message",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 5,
      "maxProperties": 5
    },
    "ChunkedQueryResponse": {
      "properties": {
        "messageKind": {
          "const": "ChunkedQueryResponse"
        },
        "chunk": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "continuedChunkCompleted": {
          "$ref": "#/$defs/continuedChunkCompleted"
        },
        "continuedChunkSequenceNumber": {
          "$ref": "#/$defs/continuedChunkSequenceNumber"
        },
        "queryId": {
          "$ref": "#/$defs/queryId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "continuedChunkCompleted",
        "continuedChunkSequenceNumber",
        "queryId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 6
    },
    "Commands": {
      "anyOf": [
        {
          "$ref": "#/$defs/AddPartition"
        },
        {
          "$ref": "#/$defs/DeletePartition"
        },
        {
          "$ref": "#/$defs/ChangeClassifier"
        },
        {
          "$ref": "#/$defs/AddProperty"
        },
        {
          "$ref": "#/$defs/DeleteProperty"
        },
        {
          "$ref": "#/$defs/ChangeProperty"
        },
        {
          "$ref": "#/$defs/AddChild"
        },
        {
          "$ref": "#/$defs/DeleteChild"
        },
        {
          "$ref": "#/$defs/ReplaceChild"
        },
        {
          "$ref": "#/$defs/MoveChildFromOtherContainment"
        },
        {
          "$ref": "#/$defs/MoveChildFromOtherContainmentInSameParent"
        },
        {
          "$ref": "#/$defs/MoveChildInSameContainment"
        },
        {
          "$ref": "#/$defs/MoveAndReplaceChildFromOtherContainment"
        },
        {
          "$ref": "#/$defs/MoveAndReplaceChildFromOtherContainmentInSameParent"
        },
        {
          "$ref": "#/$defs/MoveAndReplaceChildInSameContainment"
        },
        {
          "$ref": "#/$defs/AddAnnotation"
        },
        {
          "$ref": "#/$defs/DeleteAnnotation"
        },
        {
          "$ref": "#/$defs/ReplaceAnnotation"
        },
        {
          "$ref": "#/$defs/MoveAnnotationFromOtherParent"
        },
        {
          "$ref": "#/$defs/MoveAnnotationInSameParent"
        },
        {
          "$ref": "#/$defs/MoveAndReplaceAnnotationFromOtherParent"
        },
        {
          "$ref": "#/$defs/MoveAndReplaceAnnotationInSameParent"
        },
        {
          "$ref": "#/$defs/AddReference"
        },
        {
          "$ref": "#/$defs/DeleteReference"
        },
        {
          "$ref": "#/$defs/ChangeReference"
        },
        {
          "$ref": "#/$defs/CompositeCommand"
        },
        {
          "$ref": "#/$defs/ChunkedCommand"
        }
      ]
    },
    "AddPartition": {
      "properties": {
        "messageKind": {
          "const": "AddPartition"
        },
        "newPartition": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "split": {
          "$ref": "#/$defs/split"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newPartition",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 4,
      "maxProperties": 5
    },
    "DeletePartition": {
      "properties": {
        "messageKind": {
          "const": "DeletePartition"
        },
        "deletedPartition": {
          "$ref": "#/$defs/targetNode"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "deletedPartition",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 4,
      "maxProperties": 4
    },
    "ChangeClassifier": {
      "properties": {
        "messageKind": {
          "const": "ChangeClassifier"
        },
        "node": {
          "$ref": "#/$defs/targetNode"
        },
        "newClassifier": {
          "$ref": "#/$defs/metaPointer"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "node",
        "newClassifier",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 5,
      "maxProperties": 5
    },
    "AddProperty": {
      "properties": {
        "messageKind": {
          "const": "AddProperty"
        },
        "node": {
          "$ref": "#/$defs/targetNode"
        },
        "property": {
          "$ref": "#/$defs/metaPointer"
        },
        "newValue": {
          "$ref": "#/$defs/propertyValue"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "node",
        "property",
        "newValue",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 6
    },
    "DeleteProperty": {
      "properties": {
        "messageKind": {
          "const": "DeleteProperty"
        },
        "node": {
          "$ref": "#/$defs/targetNode"
        },
        "property": {
          "$ref": "#/$defs/metaPointer"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "node",
        "property",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 5,
      "maxProperties": 5
    },
    "ChangeProperty": {
      "properties": {
        "messageKind": {
          "const": "ChangeProperty"
        },
        "node": {
          "$ref": "#/$defs/targetNode"
        },
        "property": {
          "$ref": "#/$defs/metaPointer"
        },
        "newValue": {
          "$ref": "#/$defs/propertyValue"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "node",
        "property",
        "newValue",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 6
    },
    "AddChild": {
      "properties": {
        "messageKind": {
          "const": "AddChild"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "newChild": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "containment": {
          "$ref": "#/$defs/metaPointer"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "split": {
          "$ref": "#/$defs/split"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "newChild",
        "containment",
        "index",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 8
    },
    "DeleteChild": {
      "properties": {
        "messageKind": {
          "const": "DeleteChild"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "containment": {
          "$ref": "#/$defs/metaPointer"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "deletedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "containment",
        "index",
        "deletedChild",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 7
    },
    "ReplaceChild": {
      "properties": {
        "messageKind": {
          "const": "ReplaceChild"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "newChild": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "containment": {
          "$ref": "#/$defs/metaPointer"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "replacedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "split": {
          "$ref": "#/$defs/split"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "newChild",
        "containment",
        "index",
        "replacedChild",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 8,
      "maxProperties": 9
    },
    "MoveChildFromOtherContainment": {
      "properties": {
        "messageKind": {
          "const": "MoveChildFromOtherContainment"
        },
        "newParent": {
          "$ref": "#/$defs/targetNode"
        },
        "newContainment": {
          "$ref": "#/$defs/metaPointer"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newParent",
        "newContainment",
        "newIndex",
        "movedChild",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 7
    },
    "MoveChildFromOtherContainmentInSameParent": {
      "properties": {
        "messageKind": {
          "const": "MoveChildFromOtherContainmentInSameParent"
        },
        "newContainment": {
          "$ref": "#/$defs/metaPointer"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newContainment",
        "newIndex",
        "movedChild",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 6
    },
    "MoveChildInSameContainment": {
      "properties": {
        "messageKind": {
          "const": "MoveChildInSameContainment"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newIndex",
        "movedChild",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 5,
      "maxProperties": 5
    },
    "MoveAndReplaceChildFromOtherContainment": {
      "properties": {
        "messageKind": {
          "const": "MoveAndReplaceChildFromOtherContainment"
        },
        "newParent": {
          "$ref": "#/$defs/targetNode"
        },
        "newContainment": {
          "$ref": "#/$defs/metaPointer"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "replacedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "movedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newParent",
        "newContainment",
        "newIndex",
        "replacedChild",
        "movedChild",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 8,
      "maxProperties": 8
    },
    "MoveAndReplaceChildFromOtherContainmentInSameParent": {
      "properties": {
        "messageKind": {
          "const": "MoveAndReplaceChildFromOtherContainmentInSameParent"
        },
        "newContainment": {
          "$ref": "#/$defs/metaPointer"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "replacedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "movedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newContainment",
        "newIndex",
        "replacedChild",
        "movedChild",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 7
    },
    "MoveAndReplaceChildInSameContainment": {
      "properties": {
        "messageKind": {
          "const": "MoveAndReplaceChildInSameContainment"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "replacedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "movedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newIndex",
        "replacedChild",
        "movedChild",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 6
    },
    "AddAnnotation": {
      "properties": {
        "messageKind": {
          "const": "AddAnnotation"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "newAnnotation": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "split": {
          "$ref": "#/$defs/split"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "newAnnotation",
        "index",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 7
    },
    "DeleteAnnotation": {
      "properties": {
        "messageKind": {
          "const": "DeleteAnnotation"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "deletedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "index",
        "deletedAnnotation",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 6
    },
    "ReplaceAnnotation": {
      "properties": {
        "messageKind": {
          "const": "ReplaceAnnotation"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "newAnnotation": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "replacedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "split": {
          "$ref": "#/$defs/split"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "newAnnotation",
        "index",
        "replacedAnnotation",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 8
    },
    "MoveAnnotationFromOtherParent": {
      "properties": {
        "messageKind": {
          "const": "MoveAnnotationFromOtherParent"
        },
        "newParent": {
          "$ref": "#/$defs/targetNode"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newParent",
        "newIndex",
        "movedAnnotation",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 6
    },
    "MoveAnnotationInSameParent": {
      "properties": {
        "messageKind": {
          "const": "MoveAnnotationInSameParent"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newIndex",
        "movedAnnotation",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 5,
      "maxProperties": 5
    },
    "MoveAndReplaceAnnotationFromOtherParent": {
      "properties": {
        "messageKind": {
          "const": "MoveAndReplaceAnnotationFromOtherParent"
        },
        "newParent": {
          "$ref": "#/$defs/targetNode"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "replacedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "movedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newParent",
        "newIndex",
        "replacedAnnotation",
        "movedAnnotation",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 7
    },
    "MoveAndReplaceAnnotationInSameParent": {
      "properties": {
        "messageKind": {
          "const": "MoveAndReplaceAnnotationInSameParent"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "replacedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "movedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newIndex",
        "replacedAnnotation",
        "movedAnnotation",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 6
    },
    "AddReference": {
      "properties": {
        "messageKind": {
          "const": "AddReference"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "reference": {
          "$ref": "#/$defs/metaPointer"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "newReference": {
          "$ref": "#/$defs/targetNode"
        },
        "newResolveInfo": {
          "$ref": "#/$defs/resolveInfo"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "reference",
        "index",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 8
    },
    "DeleteReference": {
      "properties": {
        "messageKind": {
          "const": "DeleteReference"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "reference": {
          "$ref": "#/$defs/metaPointer"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "deletedReference": {
          "$ref": "#/$defs/targetNode"
        },
        "deletedResolveInfo": {
          "$ref": "#/$defs/resolveInfo"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "reference",
        "index",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 8
    },
    "ChangeReference": {
      "properties": {
        "messageKind": {
          "const": "ChangeReference"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "reference": {
          "$ref": "#/$defs/metaPointer"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "oldReference": {
          "$ref": "#/$defs/targetNode"
        },
        "oldResolveInfo": {
          "$ref": "#/$defs/resolveInfo"
        },
        "newReference": {
          "$ref": "#/$defs/targetNode"
        },
        "newResolveInfo": {
          "$ref": "#/$defs/resolveInfo"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "reference",
        "index",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 10
    },
    "CompositeCommand": {
      "properties": {
        "messageKind": {
          "const": "CompositeCommand"
        },
        "parts": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Commands"
          }
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "parts",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 4,
      "maxProperties": 4
    },
    "ChunkedCommand": {
      "properties": {
        "messageKind": {
          "const": "ChunkedCommand"
        },
        "chunk": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "continuedChunkCompleted": {
          "$ref": "#/$defs/continuedChunkCompleted"
        },
        "continuedChunkSequenceNumber": {
          "$ref": "#/$defs/continuedChunkSequenceNumber"
        },
        "commandId": {
          "$ref": "#/$defs/commandId"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "chunk",
        "continuedChunkCompleted",
        "continuedChunkSequenceNumber",
        "commandId",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 6
    },
    "Events": {
      "anyOf": [
        {
          "$ref": "#/$defs/PartitionAdded"
        },
        {
          "$ref": "#/$defs/PartitionDeleted"
        },
        {
          "$ref": "#/$defs/ClassifierChanged"
        },
        {
          "$ref": "#/$defs/PropertyAdded"
        },
        {
          "$ref": "#/$defs/PropertyDeleted"
        },
        {
          "$ref": "#/$defs/PropertyChanged"
        },
        {
          "$ref": "#/$defs/ChildAdded"
        },
        {
          "$ref": "#/$defs/ChildDeleted"
        },
        {
          "$ref": "#/$defs/ChildReplaced"
        },
        {
          "$ref": "#/$defs/ChildMovedFromOtherContainment"
        },
        {
          "$ref": "#/$defs/ChildMovedFromOtherContainmentInSameParent"
        },
        {
          "$ref": "#/$defs/ChildMovedInSameContainment"
        },
        {
          "$ref": "#/$defs/ChildMovedAndReplacedFromOtherContainment"
        },
        {
          "$ref": "#/$defs/ChildMovedAndReplacedFromOtherContainmentInSameParent"
        },
        {
          "$ref": "#/$defs/ChildMovedAndReplacedInSameContainment"
        },
        {
          "$ref": "#/$defs/AnnotationAdded"
        },
        {
          "$ref": "#/$defs/AnnotationDeleted"
        },
        {
          "$ref": "#/$defs/AnnotationReplaced"
        },
        {
          "$ref": "#/$defs/AnnotationMovedFromOtherParent"
        },
        {
          "$ref": "#/$defs/AnnotationMovedInSameParent"
        },
        {
          "$ref": "#/$defs/AnnotationMovedAndReplacedFromOtherParent"
        },
        {
          "$ref": "#/$defs/AnnotationMovedAndReplacedInSameParent"
        },
        {
          "$ref": "#/$defs/ReferenceAdded"
        },
        {
          "$ref": "#/$defs/ReferenceDeleted"
        },
        {
          "$ref": "#/$defs/ReferenceChanged"
        },
        {
          "$ref": "#/$defs/NoOpEvent"
        },
        {
          "$ref": "#/$defs/CompositeEvent"
        },
        {
          "$ref": "#/$defs/ErrorEvent"
        },
        {
          "$ref": "#/$defs/ChunkedEvent"
        }
      ]
    },
    "PartitionAdded": {
      "properties": {
        "messageKind": {
          "const": "PartitionAdded"
        },
        "newPartition": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "split": {
          "$ref": "#/$defs/split"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newPartition",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 5,
      "maxProperties": 6
    },
    "PartitionDeleted": {
      "properties": {
        "messageKind": {
          "const": "PartitionDeleted"
        },
        "deletedPartition": {
          "$ref": "#/$defs/targetNode"
        },
        "deletedDescendants": {
          "$ref": "#/$defs/targetNodes"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "deletedPartition",
        "deletedDescendants",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 6
    },
    "ClassifierChanged": {
      "properties": {
        "messageKind": {
          "const": "ClassifierChanged"
        },
        "node": {
          "$ref": "#/$defs/targetNode"
        },
        "newClassifier": {
          "$ref": "#/$defs/metaPointer"
        },
        "oldClassifier": {
          "$ref": "#/$defs/metaPointer"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "node",
        "newClassifier",
        "oldClassifier",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 7
    },
    "PropertyAdded": {
      "properties": {
        "messageKind": {
          "const": "PropertyAdded"
        },
        "node": {
          "$ref": "#/$defs/targetNode"
        },
        "property": {
          "$ref": "#/$defs/metaPointer"
        },
        "newValue": {
          "$ref": "#/$defs/propertyValue"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "node",
        "property",
        "newValue",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 7
    },
    "PropertyDeleted": {
      "properties": {
        "messageKind": {
          "const": "PropertyDeleted"
        },
        "node": {
          "$ref": "#/$defs/targetNode"
        },
        "property": {
          "$ref": "#/$defs/metaPointer"
        },
        "oldValue": {
          "$ref": "#/$defs/propertyValue"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "node",
        "property",
        "oldValue",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 7
    },
    "PropertyChanged": {
      "properties": {
        "messageKind": {
          "const": "PropertyChanged"
        },
        "node": {
          "$ref": "#/$defs/targetNode"
        },
        "property": {
          "$ref": "#/$defs/metaPointer"
        },
        "oldValue": {
          "$ref": "#/$defs/propertyValue"
        },
        "newValue": {
          "$ref": "#/$defs/propertyValue"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "node",
        "property",
        "oldValue",
        "newValue",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 8,
      "maxProperties": 8
    },
    "ChildAdded": {
      "properties": {
        "messageKind": {
          "const": "ChildAdded"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "newChild": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "containment": {
          "$ref": "#/$defs/metaPointer"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "split": {
          "$ref": "#/$defs/split"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "newChild",
        "containment",
        "index",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 8,
      "maxProperties": 9
    },
    "ChildDeleted": {
      "properties": {
        "messageKind": {
          "const": "ChildDeleted"
        },
        "deletedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "deletedDescendants": {
          "$ref": "#/$defs/targetNodes"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "containment": {
          "$ref": "#/$defs/metaPointer"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "deletedChild",
        "deletedDescendants",
        "parent",
        "containment",
        "index",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 9,
      "maxProperties": 9
    },
    "ChildReplaced": {
      "properties": {
        "messageKind": {
          "const": "ChildReplaced"
        },
        "newChild": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "replacedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "replacedDescendants": {
          "$ref": "#/$defs/targetNodes"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "containment": {
          "$ref": "#/$defs/metaPointer"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "split": {
          "$ref": "#/$defs/split"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newChild",
        "replacedChild",
        "replacedDescendants",
        "parent",
        "containment",
        "index",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 10,
      "maxProperties": 11
    },
    "ChildMovedFromOtherContainment": {
      "properties": {
        "messageKind": {
          "const": "ChildMovedFromOtherContainment"
        },
        "newParent": {
          "$ref": "#/$defs/targetNode"
        },
        "newContainment": {
          "$ref": "#/$defs/metaPointer"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "oldParent": {
          "$ref": "#/$defs/targetNode"
        },
        "oldContainment": {
          "$ref": "#/$defs/metaPointer"
        },
        "oldIndex": {
          "$ref": "#/$defs/index"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newParent",
        "newContainment",
        "newIndex",
        "movedChild",
        "oldParent",
        "oldContainment",
        "oldIndex",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 11,
      "maxProperties": 11
    },
    "ChildMovedFromOtherContainmentInSameParent": {
      "properties": {
        "messageKind": {
          "const": "ChildMovedFromOtherContainmentInSameParent"
        },
        "newContainment": {
          "$ref": "#/$defs/metaPointer"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "oldContainment": {
          "$ref": "#/$defs/metaPointer"
        },
        "oldIndex": {
          "$ref": "#/$defs/index"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newContainment",
        "newIndex",
        "movedChild",
        "parent",
        "oldContainment",
        "oldIndex",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 10,
      "maxProperties": 10
    },
    "ChildMovedInSameContainment": {
      "properties": {
        "messageKind": {
          "const": "ChildMovedInSameContainment"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "containment": {
          "$ref": "#/$defs/metaPointer"
        },
        "oldIndex": {
          "$ref": "#/$defs/index"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newIndex",
        "movedChild",
        "parent",
        "containment",
        "oldIndex",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 9,
      "maxProperties": 9
    },
    "ChildMovedAndReplacedFromOtherContainment": {
      "properties": {
        "messageKind": {
          "const": "ChildMovedAndReplacedFromOtherContainment"
        },
        "newParent": {
          "$ref": "#/$defs/targetNode"
        },
        "newContainment": {
          "$ref": "#/$defs/metaPointer"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "oldParent": {
          "$ref": "#/$defs/targetNode"
        },
        "oldContainment": {
          "$ref": "#/$defs/metaPointer"
        },
        "oldIndex": {
          "$ref": "#/$defs/index"
        },
        "replacedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "replacedDescendants": {
          "$ref": "#/$defs/targetNodes"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newParent",
        "newContainment",
        "newIndex",
        "movedChild",
        "oldParent",
        "oldContainment",
        "oldIndex",
        "replacedChild",
        "replacedDescendants",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 13,
      "maxProperties": 13
    },
    "ChildMovedAndReplacedFromOtherContainmentInSameParent": {
      "properties": {
        "messageKind": {
          "const": "ChildMovedAndReplacedFromOtherContainmentInSameParent"
        },
        "newContainment": {
          "$ref": "#/$defs/metaPointer"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "oldContainment": {
          "$ref": "#/$defs/metaPointer"
        },
        "oldIndex": {
          "$ref": "#/$defs/index"
        },
        "replacedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "replacedDescendants": {
          "$ref": "#/$defs/targetNodes"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newContainment",
        "newIndex",
        "movedChild",
        "parent",
        "oldContainment",
        "oldIndex",
        "replacedChild",
        "replacedDescendants",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 12,
      "maxProperties": 12
    },
    "ChildMovedAndReplacedInSameContainment": {
      "properties": {
        "messageKind": {
          "const": "ChildMovedAndReplacedInSameContainment"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "containment": {
          "$ref": "#/$defs/metaPointer"
        },
        "oldIndex": {
          "$ref": "#/$defs/index"
        },
        "replacedChild": {
          "$ref": "#/$defs/targetNode"
        },
        "replacedDescendants": {
          "$ref": "#/$defs/targetNodes"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newIndex",
        "movedChild",
        "parent",
        "containment",
        "oldIndex",
        "replacedChild",
        "replacedDescendants",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 11,
      "maxProperties": 11
    },
    "AnnotationAdded": {
      "properties": {
        "messageKind": {
          "const": "AnnotationAdded"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "newAnnotation": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "split": {
          "$ref": "#/$defs/split"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "newAnnotation",
        "index",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 8
    },
    "AnnotationDeleted": {
      "properties": {
        "messageKind": {
          "const": "AnnotationDeleted"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "deletedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "deletedDescendants": {
          "$ref": "#/$defs/targetNodes"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "deletedAnnotation",
        "deletedDescendants",
        "index",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 8,
      "maxProperties": 8
    },
    "AnnotationReplaced": {
      "properties": {
        "messageKind": {
          "const": "AnnotationReplaced"
        },
        "newAnnotation": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "replacedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "replacedDescendants": {
          "$ref": "#/$defs/targetNodes"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "split": {
          "$ref": "#/$defs/split"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newAnnotation",
        "replacedAnnotation",
        "replacedDescendants",
        "parent",
        "index",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 9,
      "maxProperties": 10
    },
    "AnnotationMovedFromOtherParent": {
      "properties": {
        "messageKind": {
          "const": "AnnotationMovedFromOtherParent"
        },
        "newParent": {
          "$ref": "#/$defs/targetNode"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "oldParent": {
          "$ref": "#/$defs/targetNode"
        },
        "oldIndex": {
          "$ref": "#/$defs/index"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newParent",
        "newIndex",
        "movedAnnotation",
        "oldParent",
        "oldIndex",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 9,
      "maxProperties": 9
    },
    "AnnotationMovedInSameParent": {
      "properties": {
        "messageKind": {
          "const": "AnnotationMovedInSameParent"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "oldIndex": {
          "$ref": "#/$defs/index"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newIndex",
        "movedAnnotation",
        "parent",
        "oldIndex",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 8,
      "maxProperties": 8
    },
    "AnnotationMovedAndReplacedFromOtherParent": {
      "properties": {
        "messageKind": {
          "const": "AnnotationMovedAndReplacedFromOtherParent"
        },
        "newParent": {
          "$ref": "#/$defs/targetNode"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "oldParent": {
          "$ref": "#/$defs/targetNode"
        },
        "oldIndex": {
          "$ref": "#/$defs/index"
        },
        "replacedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "replacedDescendants": {
          "$ref": "#/$defs/targetNodes"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newParent",
        "newIndex",
        "movedAnnotation",
        "oldParent",
        "oldIndex",
        "replacedAnnotation",
        "replacedDescendants",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 11,
      "maxProperties": 11
    },
    "AnnotationMovedAndReplacedInSameParent": {
      "properties": {
        "messageKind": {
          "const": "AnnotationMovedAndReplacedInSameParent"
        },
        "newIndex": {
          "$ref": "#/$defs/index"
        },
        "movedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "oldIndex": {
          "$ref": "#/$defs/index"
        },
        "replacedAnnotation": {
          "$ref": "#/$defs/targetNode"
        },
        "replacedDescendants": {
          "$ref": "#/$defs/targetNodes"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "newIndex",
        "movedAnnotation",
        "parent",
        "oldIndex",
        "replacedAnnotation",
        "replacedDescendants",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 10,
      "maxProperties": 10
    },
    "ReferenceAdded": {
      "properties": {
        "messageKind": {
          "const": "ReferenceAdded"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "reference": {
          "$ref": "#/$defs/metaPointer"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "newReference": {
          "$ref": "#/$defs/targetNode"
        },
        "newResolveInfo": {
          "$ref": "#/$defs/resolveInfo"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "reference",
        "index",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 9
    },
    "ReferenceDeleted": {
      "properties": {
        "messageKind": {
          "const": "ReferenceDeleted"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "reference": {
          "$ref": "#/$defs/metaPointer"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "deletedReference": {
          "$ref": "#/$defs/targetNode"
        },
        "deletedResolveInfo": {
          "$ref": "#/$defs/resolveInfo"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "reference",
        "index",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 9
    },
    "ReferenceChanged": {
      "properties": {
        "messageKind": {
          "const": "ReferenceChanged"
        },
        "parent": {
          "$ref": "#/$defs/targetNode"
        },
        "reference": {
          "$ref": "#/$defs/metaPointer"
        },
        "index": {
          "$ref": "#/$defs/index"
        },
        "newReference": {
          "$ref": "#/$defs/targetNode"
        },
        "newResolveInfo": {
          "$ref": "#/$defs/resolveInfo"
        },
        "oldReference": {
          "$ref": "#/$defs/targetNode"
        },
        "oldResolveInfo": {
          "$ref": "#/$defs/resolveInfo"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parent",
        "reference",
        "index",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 11
    },
    "CompositeEvent": {
      "properties": {
        "messageKind": {
          "const": "CompositeEvent"
        },
        "parts": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Events"
          }
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "parts",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 3,
      "maxProperties": 3
    },
    "NoOpEvent": {
      "properties": {
        "messageKind": {
          "const": "NoOpEvent"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 4,
      "maxProperties": 4
    },
    "ErrorEvent": {
      "properties": {
        "messageKind": {
          "const": "ErrorEvent"
        },
        "errorCode": {
          "$ref": "#/$defs/errorCode"
        },
        "message": {
          "type": "string"
        },
        "originCommands": {
          "$ref": "#/$defs/commandSources"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "errorCode",
        "message",
        "originCommands",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 6,
      "maxProperties": 6
    },
    "ChunkedEvent": {
      "properties": {
        "messageKind": {
          "const": "ChunkedEvent"
        },
        "chunk": {
          "$ref": "#/$defs/DeltaSerializationChunk"
        },
        "continuedChunkCompleted": {
          "$ref": "#/$defs/continuedChunkCompleted"
        },
        "continuedChunkSequenceNumber": {
          "$ref": "#/$defs/continuedChunkSequenceNumber"
        },
        "chunkedEventSequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "sequenceNumber": {
          "$ref": "#/$defs/eventSequenceNumber"
        },
        "additionalInfos": {
          "$ref": "#/$defs/additionalInfos"
        }
      },
      "required": [
        "messageKind",
        "chunk",
        "continuedChunkCompleted",
        "continuedChunkSequenceNumber",
        "chunkedEventSequenceNumber",
        "sequenceNumber",
        "additionalInfos"
      ],
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 7
    }
  }
}

1. Define Delta Participation (was: Session) #337
2. https://en.wikipedia.org/wiki/Command_Query_Responsibility_Segregation
3. Do we separate basic model sync ("delta") from updates on changes ("notification") a la CQRS? #291
4. Is participation handling a query or something else? #350
5. Repo must tell client if command applied successfully #298
6. Each event must list all command ids it results from #306
7. Repo must send all updates to all clients #299
8. Repository takes the final decision on any change to its contents #339
9. Repository doesn’t maintain an understanding of the state of a client’s model #297
10. Should we have an event sequence number? #341
11. How fine-grained do we want to split up commands? #317
12. How fine-grained do we want reference commands? #329
13. Refactor and Simplify Reference Delta’s #431
14. Moving a child between parents, replacing a child at the destination #321
15. Clarifying terms "repository" vs. "server" vs. "forest" #401
16. Assumed connection properties of default delta serialization #429
17. https://websockets.spec.whatwg.org/
18. How do LW specs relate to specific bindings / implementations #428
19. Can a client ask the repo if the participation is still alive? #349
20. Scope of event sequence number #343
21. How to specifiy subscription scope? #269
22. Can a client change a node it is not subscribed to? #352
23. Each command has a unique id #305
24. Do we need a dedicated eventId? #423
25. Provide partition contents only on explicit request #425
26. Do we allow additional data on events? #331
27. Do we allow additional data on commands? #332
28. Rename + unify ProtocolMessage? #430
29. Clarify use of "?" for parameters in specification #427
30. Representation of empty protocol messages part of delta messages #402
31. Does DeltaSerializationChunk have the same format as bulk SerializationChunk? #358
32. Do we allow to add more than one node per AddChild command? #327
33. Clarify semantics of Replace (with new content) commands #422
34. Introduce ErrorResponse #405
35. Can a client change its subscription scope during a connection? #270
36. Do we have a "end Participation" / "sign-off" API? #344
37. Reconnect query: Report invalid participation by error or by `participationValid` flag? #354
38. Do we want `listPartitions` query in delta? #361
39. Deleting a node does not touch existing references to that node #285
40. How to mark added node in DeltaSerializationChunk? #357
41. Potential issues with delete<child/reference/…​> commands #371
42. Delta needs to support composite commands / events #281
43. Does a composite command have its own commandId? #353
44. Can we nest composite commands / events? #360
45. This command is the only one to have a Command suffix, which is necessary to distinguish it from its CompositeEvent counterpart. All other commands can be distinguished from their event counterparts by looking at whether the technical name reads as an imperative (“add child” — for commands), or in past perfect tense (”child [has been] added” — for events).
46. What type and contents should the "deletedChild" property of the ChildDeleted event have #370
47. If we add a subtree, do we emit one add per node or only one for the (added) root node of the tree? #326
48. If we remove a node via delta protocol, do we also need to send events for all descendants? #286
49. This event is the only one to have a Event suffix, which is necessary to distinguish it from its CompositeCommand counterpart. All other events can be distinguished from their command counterparts by looking at whether the technical name reads as an imperative (“add child” — for commands), or in past perfect tense (”child [has been] added” — for events). (The NoOp and Error don’t have command counterparts.)
50. How to report a command has completely been discarded, without any resulting event? #314
51. Repository error event #316
52. Do we broadcast ErrorEvent to everybody or only the originating client? #379