@ixo/topic-protocol 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +133 -0
  2. package/dist/schemas/action-receipt.schema.json +18 -0
  3. package/dist/schemas/agent-run.schema.json +18 -0
  4. package/dist/schemas/external-session-binding.schema.json +24 -0
  5. package/dist/schemas/room-policy.schema.json +15 -0
  6. package/dist/schemas/topic-capsule.schema.json +19 -0
  7. package/dist/schemas/topic-index-entry.schema.json +17 -0
  8. package/dist/schemas/topic-message.schema.json +18 -0
  9. package/dist/schemas/topic-operation.schema.json +19 -0
  10. package/dist/schemas/topic-preferences.schema.json +13 -0
  11. package/dist/schemas/topic-record.schema.json +18 -0
  12. package/dist/schemas/topic-relation.schema.json +16 -0
  13. package/dist/schemas/topic-root.schema.json +18 -0
  14. package/dist/schemas/topic-state.schema.json +19 -0
  15. package/dist/src/contracts/schemas.d.ts +569 -0
  16. package/dist/src/contracts/schemas.js +30 -0
  17. package/dist/src/contracts/schemas.js.map +1 -0
  18. package/dist/src/contracts/validator.d.ts +14 -0
  19. package/dist/src/contracts/validator.js +43 -0
  20. package/dist/src/contracts/validator.js.map +1 -0
  21. package/dist/src/errors.d.ts +6 -0
  22. package/dist/src/errors.js +11 -0
  23. package/dist/src/errors.js.map +1 -0
  24. package/dist/src/index.d.ts +11 -0
  25. package/dist/src/index.js +12 -0
  26. package/dist/src/index.js.map +1 -0
  27. package/dist/src/matrix/anchors.d.ts +2 -0
  28. package/dist/src/matrix/anchors.js +55 -0
  29. package/dist/src/matrix/anchors.js.map +1 -0
  30. package/dist/src/matrix/content.d.ts +11 -0
  31. package/dist/src/matrix/content.js +64 -0
  32. package/dist/src/matrix/content.js.map +1 -0
  33. package/dist/src/matrix/events.d.ts +4 -0
  34. package/dist/src/matrix/events.js +94 -0
  35. package/dist/src/matrix/events.js.map +1 -0
  36. package/dist/src/matrix/pending.d.ts +22 -0
  37. package/dist/src/matrix/pending.js +83 -0
  38. package/dist/src/matrix/pending.js.map +1 -0
  39. package/dist/src/matrix/runtime.d.ts +18 -0
  40. package/dist/src/matrix/runtime.js +121 -0
  41. package/dist/src/matrix/runtime.js.map +1 -0
  42. package/dist/src/matrix/types.d.ts +84 -0
  43. package/dist/src/matrix/types.js +5 -0
  44. package/dist/src/matrix/types.js.map +1 -0
  45. package/dist/src/projector/payload.d.ts +27 -0
  46. package/dist/src/projector/payload.js +80 -0
  47. package/dist/src/projector/payload.js.map +1 -0
  48. package/dist/src/projector/prepare.d.ts +3 -0
  49. package/dist/src/projector/prepare.js +47 -0
  50. package/dist/src/projector/prepare.js.map +1 -0
  51. package/dist/src/projector/project.d.ts +2 -0
  52. package/dist/src/projector/project.js +89 -0
  53. package/dist/src/projector/project.js.map +1 -0
  54. package/dist/src/projector/state.d.ts +8 -0
  55. package/dist/src/projector/state.js +89 -0
  56. package/dist/src/projector/state.js.map +1 -0
  57. package/dist/src/projector/types.d.ts +76 -0
  58. package/dist/src/projector/types.js +19 -0
  59. package/dist/src/projector/types.js.map +1 -0
  60. package/dist/src/shared/compare.d.ts +2 -0
  61. package/dist/src/shared/compare.js +14 -0
  62. package/dist/src/shared/compare.js.map +1 -0
  63. package/package.json +61 -0
package/README.md ADDED
@@ -0,0 +1,133 @@
1
+ # Topic Protocol
2
+
3
+ The Topic Protocol defines a **Qi Topic** as the durable unit of context,
4
+ continuity, discovery, authority, collaboration, and outcome for IXO.
5
+
6
+ It uses native Matrix threads as a federated conversation transport without
7
+ making a Matrix event ID, a model session, or a chat transcript the canonical
8
+ identity of a discussion.
9
+
10
+ ## Status
11
+
12
+ **Version:** 0.1.0
13
+ **Maturity:** Draft implementation candidate
14
+ **Execution source of truth:** [Linear Topic Protocol project](https://linear.app/ixo-world/project/topic-protocol-4ea58bc7910d)
15
+
16
+ This repository is a protocol baseline, not evidence that the M0 runtime and
17
+ security gates have passed. In particular, complete cold-cache thread discovery,
18
+ E2EE agent participation, encrypted index migration, UCAN replay protection,
19
+ and external action execution require their dedicated conformance evidence.
20
+
21
+ ## Read this first
22
+
23
+ - [Architecture decisions](docs/adr/README.md)
24
+ - [Protocol chapters](docs/protocol/README.md)
25
+ - [Machine-readable contracts](contracts/README.md)
26
+ - [Reference implementation](docs/reference-implementation.md)
27
+ - [ixo-portal integration plan](docs/implementation/ixo-portal.md)
28
+ - [Conformance and release gates](docs/conformance.md)
29
+ - [Source recovery and provenance](docs/source-recovery.md)
30
+ - [Linear issue map](docs/tracking/linear-source-of-truth.md)
31
+
32
+ ## npm runtime
33
+
34
+ `@ixo/topic-protocol` is the client-neutral runtime for Portal, mobile, Jambo,
35
+ MCP servers, and other Matrix clients. It has no dependency on
36
+ `matrix-js-sdk`; each client supplies a small transport and persistent
37
+ key-value adapter at its integration boundary.
38
+
39
+ The package includes:
40
+
41
+ - strict Draft 2020-12 validation for all 13 contracts;
42
+ - deterministic Topic projection from a root and authorised operations;
43
+ - relation-free Matrix root and canonical native `m.thread` event builders;
44
+ - restart-safe two-event Topic creation with duplicate suppression;
45
+ - append-only Matrix operation parsing and room-upgrade anchor selection;
46
+ - explicit conflict, duplicate-delivery, unauthorised, and unreachable handling;
47
+ - immutable caller inputs and typed protocol errors.
48
+
49
+ Install it in a client:
50
+
51
+ ```bash
52
+ npm install @ixo/topic-protocol
53
+ ```
54
+
55
+ Create a Topic with a client-specific transport and durable pending store:
56
+
57
+ ```ts
58
+ import {
59
+ JsonPendingTopicStore,
60
+ TopicRuntime,
61
+ createTopicId,
62
+ } from "@ixo/topic-protocol";
63
+
64
+ const runtime = new TopicRuntime({
65
+ transport: matrixTransport,
66
+ pendingStore: new JsonPendingTopicStore(keyValueStorage),
67
+ });
68
+
69
+ await runtime.createTopic({
70
+ roomId,
71
+ root: {
72
+ version: 1,
73
+ id: createTopicId(),
74
+ title: "Evidence policy",
75
+ status: "active",
76
+ createdBy: actorId,
77
+ createdAt: new Date().toISOString(),
78
+ },
79
+ firstMessage: { msgtype: "m.text", body: "Let’s decide the policy." },
80
+ });
81
+ ```
82
+
83
+ The transport must return the server-assigned Matrix event ID. The runtime
84
+ never binds a Topic to a temporary local-echo ID. Pending storage contains only
85
+ the room ID, Topic ID, root event ID, and creation timestamp; clients must back
86
+ it with durable local storage to make restart recovery effective.
87
+
88
+ Install development dependencies and run the complete quality gate:
89
+
90
+ ```bash
91
+ npm install
92
+ npm run check
93
+ ```
94
+
95
+ See the [reference implementation guide](docs/reference-implementation.md) for
96
+ the public API, trust boundary, and Portal integration notes.
97
+
98
+ ## Validate protocol artifacts
99
+
100
+ The static artifact validator remains dependency-free:
101
+
102
+ ```bash
103
+ python3 scripts/validate_protocol.py
104
+ ```
105
+
106
+ The validator checks the documented inventory, JSON syntax, schema/vector
107
+ pairing, required contract fields, unique API operation/tool names, local
108
+ Markdown links, and the checksum manifest.
109
+
110
+ ## Core invariant
111
+
112
+ > Every human message, agent response, agent run, artifact, decision, and
113
+ > executable action occurs in the context of a Topic.
114
+
115
+ Matrix rooms remain the membership, confidentiality, federation, and encryption
116
+ boundary. A Topic can restrict action authority with UCANs, but it cannot claim
117
+ to hide content from members of its Matrix room. A smaller confidential audience
118
+ requires a separate encrypted room.
119
+
120
+ ## Repository layout
121
+
122
+ ```text
123
+ docs/adr/ Architecture decisions
124
+ docs/protocol/ Human-readable protocol chapters
125
+ docs/implementation/ ixo-portal integration plan
126
+ schemas/ JSON Schema Draft 2020-12 contracts
127
+ examples/ Valid reference vectors
128
+ api/ OpenAPI and MCP contract surfaces
129
+ scripts/ Dependency-free validation and integrity tooling
130
+ checksums/ Reproducible SHA-256 manifest
131
+ src/ TypeScript contract and projection reference library
132
+ test/ TDD contract, behavior, and edge-case tests
133
+ ```
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://topic-protocol.ixo.world/schemas/action-receipt.schema.json",
4
+ "title": "Action receipt",
5
+ "type": "object",
6
+ "required": ["receiptId", "topicId", "action", "actor", "status", "idempotencyKey", "createdAt"],
7
+ "properties": {
8
+ "receiptId": { "type": "string", "minLength": 1 },
9
+ "topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
10
+ "action": { "type": "string", "minLength": 1 },
11
+ "actor": { "type": "string", "minLength": 1 },
12
+ "status": { "type": "string", "enum": ["requested", "confirmed", "succeeded", "failed", "rejected"] },
13
+ "idempotencyKey": { "type": "string", "minLength": 1 },
14
+ "createdAt": { "type": "string", "format": "date-time" },
15
+ "capability": { "type": "string" }
16
+ },
17
+ "additionalProperties": true
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://topic-protocol.ixo.world/schemas/agent-run.schema.json",
4
+ "title": "Agent run",
5
+ "type": "object",
6
+ "required": ["runId", "topicId", "agentId", "capsuleRevision", "status", "startedAt"],
7
+ "properties": {
8
+ "runId": { "type": "string", "minLength": 1 },
9
+ "topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
10
+ "agentId": { "type": "string", "minLength": 1 },
11
+ "capsuleRevision": { "type": "string", "minLength": 1 },
12
+ "status": { "type": "string", "enum": ["running", "completed", "failed", "cancelled"] },
13
+ "startedAt": { "type": "string", "format": "date-time" },
14
+ "finishedAt": { "type": "string", "format": "date-time" },
15
+ "outputs": { "type": "array", "items": { "type": "object" } }
16
+ },
17
+ "additionalProperties": true
18
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://topic-protocol.ixo.world/schemas/external-session-binding.schema.json",
4
+ "title": "External session binding",
5
+ "type": "object",
6
+ "required": ["bindingId", "topicId", "provider", "sessionReference", "actor", "createdAt", "policy"],
7
+ "properties": {
8
+ "bindingId": { "type": "string", "minLength": 1 },
9
+ "topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
10
+ "provider": { "type": "string", "minLength": 1 },
11
+ "sessionReference": { "type": "string", "minLength": 1 },
12
+ "actor": { "type": "string", "minLength": 1 },
13
+ "createdAt": { "type": "string", "format": "date-time" },
14
+ "policy": {
15
+ "type": "object",
16
+ "required": ["privateByDefault"],
17
+ "properties": {
18
+ "privateByDefault": { "type": "boolean" }
19
+ },
20
+ "additionalProperties": true
21
+ }
22
+ },
23
+ "additionalProperties": true
24
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://topic-protocol.ixo.world/schemas/room-policy.schema.json",
4
+ "title": "Topic room policy",
5
+ "type": "object",
6
+ "required": ["version", "mode", "generalEnabled", "allowTopicsInDirectRooms"],
7
+ "properties": {
8
+ "version": { "const": 1 },
9
+ "mode": { "type": "string", "enum": ["required", "optional", "general_only", "object_attached"] },
10
+ "generalEnabled": { "type": "boolean" },
11
+ "allowTopicsInDirectRooms": { "type": "boolean" },
12
+ "authorisedRoles": { "type": "array", "items": { "type": "string" } }
13
+ },
14
+ "additionalProperties": true
15
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://topic-protocol.ixo.world/schemas/topic-capsule.schema.json",
4
+ "title": "Topic Capsule",
5
+ "type": "object",
6
+ "required": ["topicId", "anchor", "stateRevision", "participants", "acceptedMemory", "capabilities", "runtimePolicy"],
7
+ "properties": {
8
+ "topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
9
+ "anchor": { "type": "object", "required": ["roomId", "rootEventId"], "properties": { "roomId": { "type": "string" }, "rootEventId": { "type": "string", "pattern": "^\\$" } } },
10
+ "stateRevision": { "type": "string", "minLength": 1 },
11
+ "participants": { "type": "array", "items": { "type": "object" } },
12
+ "linkedContext": { "type": "array", "items": { "type": "object" } },
13
+ "acceptedMemory": { "type": "array", "items": { "type": "object" } },
14
+ "relevantEvents": { "type": "array", "items": { "type": "object" } },
15
+ "capabilities": { "type": "array", "items": { "type": "object" } },
16
+ "runtimePolicy": { "type": "object" }
17
+ },
18
+ "additionalProperties": true
19
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://topic-protocol.ixo.world/schemas/topic-index-entry.schema.json",
4
+ "title": "Topic index entry",
5
+ "type": "object",
6
+ "required": ["topicId", "roomId", "rootEventId", "status", "latestActivityAt", "completeness"],
7
+ "properties": {
8
+ "topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
9
+ "roomId": { "type": "string", "minLength": 1 },
10
+ "rootEventId": { "type": "string", "pattern": "^\\$" },
11
+ "status": { "type": "string" },
12
+ "latestActivityAt": { "type": "string", "format": "date-time" },
13
+ "notificationMode": { "type": "string", "enum": ["follow", "default", "mute"] },
14
+ "completeness": { "type": "string", "enum": ["complete", "partial-history", "metadata-pending", "decryption-pending"] }
15
+ },
16
+ "additionalProperties": true
17
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://topic-protocol.ixo.world/schemas/topic-message.schema.json",
4
+ "title": "Topic message",
5
+ "type": "object",
6
+ "required": ["topicId", "roomId", "rootEventId", "eventId", "sender", "body", "createdAt"],
7
+ "properties": {
8
+ "topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
9
+ "roomId": { "type": "string", "minLength": 1 },
10
+ "rootEventId": { "type": "string", "pattern": "^\\$" },
11
+ "eventId": { "type": "string", "pattern": "^\\$" },
12
+ "sender": { "type": "string", "minLength": 1 },
13
+ "body": { "type": "string" },
14
+ "createdAt": { "type": "string", "format": "date-time" },
15
+ "inReplyTo": { "type": "string", "pattern": "^\\$" }
16
+ },
17
+ "additionalProperties": true
18
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://topic-protocol.ixo.world/schemas/topic-operation.schema.json",
4
+ "title": "Topic operation",
5
+ "type": "object",
6
+ "required": ["version", "operationId", "topicId", "type", "previousRevision", "actor", "createdAt", "payload"],
7
+ "properties": {
8
+ "version": { "const": 1 },
9
+ "operationId": { "type": "string", "minLength": 1 },
10
+ "topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
11
+ "type": { "type": "string", "enum": ["rename", "change-status", "link-context", "unlink-context", "record-decision", "redirect", "branch", "merge", "resolve-conflict"] },
12
+ "previousRevision": { "type": "string", "minLength": 1 },
13
+ "actor": { "type": "string", "minLength": 1 },
14
+ "createdAt": { "type": "string", "format": "date-time" },
15
+ "payload": { "type": "object" },
16
+ "capability": { "type": "string" }
17
+ },
18
+ "additionalProperties": true
19
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://topic-protocol.ixo.world/schemas/topic-preferences.schema.json",
4
+ "title": "Per-user Topic preferences",
5
+ "type": "object",
6
+ "required": ["version", "topics", "autoFollow"],
7
+ "properties": {
8
+ "version": { "const": 1 },
9
+ "topics": { "type": "object", "additionalProperties": { "type": "object", "required": ["notificationMode", "pinned"], "properties": { "notificationMode": { "type": "string", "enum": ["follow", "default", "mute"] }, "pinned": { "type": "boolean" }, "markedUnreadFrom": { "type": ["string", "null"] } } } },
10
+ "autoFollow": { "type": "string", "enum": ["none", "started", "started_or_participated"] }
11
+ },
12
+ "additionalProperties": false
13
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://topic-protocol.ixo.world/schemas/topic-record.schema.json",
4
+ "title": "Topic record",
5
+ "type": "object",
6
+ "required": ["recordId", "topicId", "kind", "createdBy", "createdAt", "sourceEventIds"],
7
+ "properties": {
8
+ "recordId": { "type": "string", "minLength": 1 },
9
+ "topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
10
+ "kind": { "type": "string", "enum": ["fact", "decision", "assumption", "question", "task", "artifact", "outcome", "memory", "failure"] },
11
+ "createdBy": { "type": "string", "minLength": 1 },
12
+ "createdAt": { "type": "string", "format": "date-time" },
13
+ "sourceEventIds": { "type": "array", "items": { "type": "string", "pattern": "^\\$" } },
14
+ "content": { "type": "object" },
15
+ "accepted": { "type": "boolean" }
16
+ },
17
+ "additionalProperties": true
18
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://topic-protocol.ixo.world/schemas/topic-relation.schema.json",
4
+ "title": "Topic graph relation",
5
+ "type": "object",
6
+ "required": ["relationId", "fromTopicId", "type", "toTopicId", "createdBy", "createdAt"],
7
+ "properties": {
8
+ "relationId": { "type": "string", "minLength": 1 },
9
+ "fromTopicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
10
+ "type": { "type": "string", "enum": ["branches_from", "merged_into", "redirects_to", "references", "produced"] },
11
+ "toTopicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
12
+ "createdBy": { "type": "string", "minLength": 1 },
13
+ "createdAt": { "type": "string", "format": "date-time" }
14
+ },
15
+ "additionalProperties": true
16
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://topic-protocol.ixo.world/schemas/topic-root.schema.json",
4
+ "title": "Topic root envelope",
5
+ "type": "object",
6
+ "required": ["version", "id", "title", "status", "createdBy", "createdAt"],
7
+ "properties": {
8
+ "version": { "const": 1 },
9
+ "id": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
10
+ "title": { "type": "string", "minLength": 1, "maxLength": 280 },
11
+ "kind": { "type": "string", "enum": ["discussion", "question", "decision", "proposal", "task", "incident", "flow"] },
12
+ "status": { "type": "string", "enum": ["draft", "active", "waiting", "blocked", "resolved", "archived", "redirected"] },
13
+ "createdBy": { "type": "string", "minLength": 1 },
14
+ "createdAt": { "type": "string", "format": "date-time" },
15
+ "context": { "type": "array", "items": { "type": "object", "required": ["type", "id"], "properties": { "type": { "type": "string" }, "id": { "type": "string" } } } }
16
+ },
17
+ "additionalProperties": true
18
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://topic-protocol.ixo.world/schemas/topic-state.schema.json",
4
+ "title": "Projected Topic state",
5
+ "type": "object",
6
+ "required": ["topicId", "revision", "status", "basedOnEvents", "conflicts"],
7
+ "properties": {
8
+ "topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
9
+ "revision": { "type": "string", "minLength": 1 },
10
+ "status": { "type": "string", "enum": ["draft", "active", "waiting", "blocked", "resolved", "archived", "redirected"] },
11
+ "purpose": { "type": "string" },
12
+ "acceptedFacts": { "type": "array", "items": { "type": "object" } },
13
+ "decisions": { "type": "array", "items": { "type": "object" } },
14
+ "unresolvedQuestions": { "type": "array", "items": { "type": "object" } },
15
+ "basedOnEvents": { "type": "array", "items": { "type": "string", "pattern": "^\\$" } },
16
+ "conflicts": { "type": "array", "items": { "type": "string" } }
17
+ },
18
+ "additionalProperties": true
19
+ }