owlrunkit 0.22.1 → 0.23.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.
@@ -0,0 +1,144 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://owlcoda.com/schemas/runkit/project-completion-continuity-v1.schema.json",
4
+ "title": "OwlCoda RunKit Project Completion Continuity V1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion", "status", "projectId", "projectTruthHash", "disposition",
9
+ "targetWorkspaceRef", "baseline", "current", "delta", "nextAction",
10
+ "readOnly", "writesPerformed", "authorityBoundary", "authorizationGranted"
11
+ ],
12
+ "properties": {
13
+ "schemaVersion": { "const": "OwlCodaRunKitProjectCompletionContinuityV1" },
14
+ "status": { "enum": ["not_applicable", "baseline_missing", "source_unverifiable", "workspace_drift", "terminal"] },
15
+ "projectId": { "$ref": "#/$defs/text" },
16
+ "projectTruthHash": { "$ref": "#/$defs/hash" },
17
+ "disposition": {
18
+ "enum": [
19
+ "project_work_ledger_incomplete",
20
+ "completed_project_source_baseline_missing",
21
+ "completed_project_source_unverifiable",
22
+ "completed_project_with_unmodeled_workspace_drift",
23
+ "completed_project_terminal"
24
+ ]
25
+ },
26
+ "targetWorkspaceRef": { "$ref": "#/$defs/nullableText" },
27
+ "baseline": {
28
+ "oneOf": [
29
+ { "type": "null" },
30
+ {
31
+ "type": "object",
32
+ "additionalProperties": false,
33
+ "required": ["kind", "deliveryId", "occurredAt", "targetHead", "workspaceSnapshotFingerprint", "truthRef"],
34
+ "properties": {
35
+ "kind": { "const": "imported_source_delivery" },
36
+ "deliveryId": { "$ref": "#/$defs/text" },
37
+ "occurredAt": { "$ref": "#/$defs/text" },
38
+ "targetHead": { "$ref": "#/$defs/gitHash" },
39
+ "workspaceSnapshotFingerprint": { "$ref": "#/$defs/hashRef" },
40
+ "truthRef": { "$ref": "#/$defs/text" }
41
+ }
42
+ }
43
+ ]
44
+ },
45
+ "current": {
46
+ "oneOf": [
47
+ { "type": "null" },
48
+ {
49
+ "type": "object",
50
+ "additionalProperties": false,
51
+ "required": ["headCommit", "workspaceSnapshotFingerprint"],
52
+ "properties": {
53
+ "headCommit": { "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/gitHash" }] },
54
+ "workspaceSnapshotFingerprint": { "$ref": "#/$defs/hashRef" }
55
+ }
56
+ }
57
+ ]
58
+ },
59
+ "delta": {
60
+ "oneOf": [
61
+ { "type": "null" },
62
+ {
63
+ "type": "object",
64
+ "additionalProperties": false,
65
+ "required": [
66
+ "baselineHead", "currentHead", "headChanged", "trackedTreeChanged",
67
+ "submodulesChanged", "committedPaths", "overlayPaths",
68
+ "dependencyEnvironmentPaths", "changedPaths", "changedPathCount",
69
+ "changedPathsTruncated", "pathEvidenceComplete"
70
+ ],
71
+ "properties": {
72
+ "baselineHead": { "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/gitHash" }] },
73
+ "currentHead": { "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/gitHash" }] },
74
+ "headChanged": { "type": "boolean" },
75
+ "trackedTreeChanged": { "type": "boolean" },
76
+ "submodulesChanged": { "type": "boolean" },
77
+ "committedPaths": { "$ref": "#/$defs/paths" },
78
+ "overlayPaths": { "$ref": "#/$defs/paths" },
79
+ "dependencyEnvironmentPaths": { "$ref": "#/$defs/paths" },
80
+ "changedPaths": { "$ref": "#/$defs/paths" },
81
+ "changedPathCount": { "type": "integer", "minimum": 0 },
82
+ "changedPathsTruncated": { "type": "boolean" },
83
+ "pathEvidenceComplete": { "type": "boolean" }
84
+ }
85
+ }
86
+ ]
87
+ },
88
+ "nextAction": { "$ref": "#/$defs/nullableText" },
89
+ "readOnly": { "const": true },
90
+ "writesPerformed": { "const": false },
91
+ "authorityBoundary": { "$ref": "#/$defs/authorityBoundary" },
92
+ "authorizationGranted": { "const": false }
93
+ },
94
+ "examples": [
95
+ {
96
+ "schemaVersion": "OwlCodaRunKitProjectCompletionContinuityV1",
97
+ "status": "baseline_missing",
98
+ "projectId": "completed-project",
99
+ "projectTruthHash": "0000000000000000000000000000000000000000000000000000000000000000",
100
+ "disposition": "completed_project_source_baseline_missing",
101
+ "targetWorkspaceRef": null,
102
+ "baseline": null,
103
+ "current": null,
104
+ "delta": null,
105
+ "nextAction": "Review the current workspace and bind an explicit source baseline before deciding whether the project is terminal.",
106
+ "readOnly": true,
107
+ "writesPerformed": false,
108
+ "authorityBoundary": {
109
+ "agentDispatch": false,
110
+ "git": false,
111
+ "release": false,
112
+ "deployment": false,
113
+ "production": false,
114
+ "business": false,
115
+ "automation": false,
116
+ "money": false
117
+ },
118
+ "authorizationGranted": false
119
+ }
120
+ ],
121
+ "$defs": {
122
+ "text": { "type": "string", "minLength": 1 },
123
+ "nullableText": { "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/text" }] },
124
+ "hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
125
+ "hashRef": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
126
+ "gitHash": { "type": "string", "pattern": "^(?:[a-f0-9]{40}|[a-f0-9]{64})$" },
127
+ "paths": { "type": "array", "maxItems": 256, "uniqueItems": true, "items": { "$ref": "#/$defs/text" } },
128
+ "authorityBoundary": {
129
+ "type": "object",
130
+ "additionalProperties": false,
131
+ "required": ["agentDispatch", "git", "release", "deployment", "production", "business", "automation", "money"],
132
+ "properties": {
133
+ "agentDispatch": { "const": false },
134
+ "git": { "const": false },
135
+ "release": { "const": false },
136
+ "deployment": { "const": false },
137
+ "production": { "const": false },
138
+ "business": { "const": false },
139
+ "automation": { "const": false },
140
+ "money": { "const": false }
141
+ }
142
+ }
143
+ }
144
+ }
@@ -0,0 +1,184 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://owlcoda.com/schemas/runkit/successor-scaffold-v1.schema.json",
4
+ "title": "OwlCoda RunKit Successor Scaffold V1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion", "status", "exitCode", "project", "completionContinuity",
9
+ "unmodeledCandidates", "pathConflicts", "possibleLanes", "draft",
10
+ "nextAction", "persisted", "readOnly", "writesPerformed",
11
+ "authorityBoundary", "authorizationGranted"
12
+ ],
13
+ "properties": {
14
+ "schemaVersion": { "const": "OwlCodaRunKitSuccessorScaffoldV1" },
15
+ "status": { "enum": ["successor_review_required", "successor_baseline_missing", "successor_not_required", "successor_source_unverifiable"] },
16
+ "exitCode": { "const": 0 },
17
+ "project": {
18
+ "type": "object",
19
+ "additionalProperties": false,
20
+ "required": ["projectId", "projectTruthHash", "overall"],
21
+ "properties": {
22
+ "projectId": { "$ref": "#/$defs/text" },
23
+ "projectTruthHash": { "$ref": "#/$defs/hash" },
24
+ "overall": { "const": "completed" }
25
+ }
26
+ },
27
+ "completionContinuity": { "$ref": "project-completion-continuity-v1.schema.json" },
28
+ "unmodeledCandidates": {
29
+ "type": "array",
30
+ "maxItems": 1,
31
+ "items": {
32
+ "type": "object",
33
+ "additionalProperties": false,
34
+ "required": ["candidateId", "kind", "targetWorkspaceRef", "baselineFingerprint", "currentFingerprint", "changedPaths", "changedPathCount", "changedPathsTruncated", "pathEvidenceComplete"],
35
+ "properties": {
36
+ "candidateId": { "const": "workspace-drift" },
37
+ "kind": { "const": "workspace_source_delta" },
38
+ "targetWorkspaceRef": { "$ref": "#/$defs/text" },
39
+ "baselineFingerprint": { "$ref": "#/$defs/hashRef" },
40
+ "currentFingerprint": { "$ref": "#/$defs/hashRef" },
41
+ "changedPaths": { "$ref": "#/$defs/paths" },
42
+ "changedPathCount": { "type": "integer", "minimum": 0 },
43
+ "changedPathsTruncated": { "type": "boolean" },
44
+ "pathEvidenceComplete": { "type": "boolean" }
45
+ }
46
+ }
47
+ },
48
+ "pathConflicts": {
49
+ "type": "array",
50
+ "items": {
51
+ "type": "object",
52
+ "additionalProperties": false,
53
+ "required": ["path", "historicalWorkItemIds"],
54
+ "properties": {
55
+ "path": { "$ref": "#/$defs/text" },
56
+ "historicalWorkItemIds": { "$ref": "#/$defs/nonemptyStrings" }
57
+ }
58
+ }
59
+ },
60
+ "possibleLanes": {
61
+ "type": "array",
62
+ "items": {
63
+ "type": "object",
64
+ "additionalProperties": false,
65
+ "required": ["laneId", "basis", "historicalWorkItemId", "suggestedOwnedPaths", "requiresHumanConfirmation"],
66
+ "properties": {
67
+ "laneId": { "$ref": "#/$defs/text" },
68
+ "basis": { "enum": ["historical_owned_paths_only", "unmatched_paths_only"] },
69
+ "historicalWorkItemId": { "$ref": "#/$defs/nullableText" },
70
+ "suggestedOwnedPaths": { "$ref": "#/$defs/nonemptyStrings" },
71
+ "requiresHumanConfirmation": { "const": true }
72
+ }
73
+ }
74
+ },
75
+ "draft": {
76
+ "type": "object",
77
+ "additionalProperties": false,
78
+ "required": ["projectId", "objective", "workItems", "requiresHumanConfirmation"],
79
+ "properties": {
80
+ "projectId": { "type": "null" },
81
+ "objective": { "type": "null" },
82
+ "workItems": {
83
+ "type": "array",
84
+ "items": {
85
+ "type": "object",
86
+ "additionalProperties": false,
87
+ "required": ["draftLaneId", "title", "ownedPaths", "ownerAgentId"],
88
+ "properties": {
89
+ "draftLaneId": { "$ref": "#/$defs/text" },
90
+ "title": { "type": "null" },
91
+ "ownedPaths": { "$ref": "#/$defs/nonemptyStrings" },
92
+ "ownerAgentId": { "type": "null" }
93
+ }
94
+ }
95
+ },
96
+ "requiresHumanConfirmation": { "$ref": "#/$defs/nonemptyStrings" }
97
+ }
98
+ },
99
+ "nextAction": { "$ref": "#/$defs/nullableText" },
100
+ "persisted": { "const": false },
101
+ "readOnly": { "const": true },
102
+ "writesPerformed": { "const": false },
103
+ "authorityBoundary": { "$ref": "project-completion-continuity-v1.schema.json#/$defs/authorityBoundary" },
104
+ "authorizationGranted": { "const": false }
105
+ },
106
+ "examples": [
107
+ {
108
+ "schemaVersion": "OwlCodaRunKitSuccessorScaffoldV1",
109
+ "status": "successor_baseline_missing",
110
+ "exitCode": 0,
111
+ "project": {
112
+ "projectId": "completed-project",
113
+ "projectTruthHash": "0000000000000000000000000000000000000000000000000000000000000000",
114
+ "overall": "completed"
115
+ },
116
+ "completionContinuity": {
117
+ "schemaVersion": "OwlCodaRunKitProjectCompletionContinuityV1",
118
+ "status": "baseline_missing",
119
+ "projectId": "completed-project",
120
+ "projectTruthHash": "0000000000000000000000000000000000000000000000000000000000000000",
121
+ "disposition": "completed_project_source_baseline_missing",
122
+ "targetWorkspaceRef": "/projects/source",
123
+ "baseline": null,
124
+ "current": {
125
+ "headCommit": "0000000000000000000000000000000000000000",
126
+ "workspaceSnapshotFingerprint": "sha256:0000000000000000000000000000000000000000000000000000000000000000"
127
+ },
128
+ "delta": null,
129
+ "nextAction": "Review the current workspace and bind an explicit source baseline before deciding whether the project is terminal.",
130
+ "readOnly": true,
131
+ "writesPerformed": false,
132
+ "authorityBoundary": {
133
+ "agentDispatch": false,
134
+ "git": false,
135
+ "release": false,
136
+ "deployment": false,
137
+ "production": false,
138
+ "business": false,
139
+ "automation": false,
140
+ "money": false
141
+ },
142
+ "authorizationGranted": false
143
+ },
144
+ "unmodeledCandidates": [],
145
+ "pathConflicts": [],
146
+ "possibleLanes": [],
147
+ "draft": {
148
+ "projectId": null,
149
+ "objective": null,
150
+ "workItems": [],
151
+ "requiresHumanConfirmation": [
152
+ "project_id",
153
+ "objective",
154
+ "work_item_boundaries",
155
+ "owners",
156
+ "acceptance"
157
+ ]
158
+ },
159
+ "nextAction": "Review the current workspace and bind an explicit source baseline before deciding whether the project is terminal.",
160
+ "persisted": false,
161
+ "readOnly": true,
162
+ "writesPerformed": false,
163
+ "authorityBoundary": {
164
+ "agentDispatch": false,
165
+ "git": false,
166
+ "release": false,
167
+ "deployment": false,
168
+ "production": false,
169
+ "business": false,
170
+ "automation": false,
171
+ "money": false
172
+ },
173
+ "authorizationGranted": false
174
+ }
175
+ ],
176
+ "$defs": {
177
+ "text": { "type": "string", "minLength": 1 },
178
+ "nullableText": { "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/text" }] },
179
+ "hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
180
+ "hashRef": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
181
+ "paths": { "type": "array", "maxItems": 256, "uniqueItems": true, "items": { "$ref": "#/$defs/text" } },
182
+ "nonemptyStrings": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "$ref": "#/$defs/text" } }
183
+ }
184
+ }
@@ -0,0 +1,169 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://owlcoda.com/schemas/runkit/team-project-status-v5.schema.json",
4
+ "title": "OwlCoda RunKit Team Project Status V5",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion", "status", "projectId", "objective", "overall", "counts",
9
+ "milestones", "workstreams", "workItems", "agents", "readyQueue",
10
+ "criticalWorkItems", "openDecisions", "resolvedDecisions",
11
+ "deferredVerifications", "openDeferredVerificationIds", "integrationGates",
12
+ "dataCandidates", "sourceDeliveries", "warnings", "externalGates",
13
+ "deliveryLifecycle", "projectTruthHash", "authorizationGranted",
14
+ "deliveryDisposition", "headline", "dominantGap", "nextAction",
15
+ "nextActorId", "completionContinuity", "exitCode"
16
+ ],
17
+ "properties": {
18
+ "schemaVersion": { "const": "OwlCodaRunKitTeamProjectStatusV5" },
19
+ "status": { "const": "team_project_status" },
20
+ "projectId": { "$ref": "#/$defs/text" },
21
+ "objective": { "$ref": "#/$defs/text" },
22
+ "overall": { "enum": ["planned", "active", "active_with_blockers", "completed"] },
23
+ "counts": { "type": "object" },
24
+ "milestones": { "type": "array", "items": { "type": "object" } },
25
+ "workstreams": { "type": "array", "items": { "type": "object" } },
26
+ "workItems": { "type": "array", "items": { "type": "object" } },
27
+ "agents": { "type": "array", "items": { "type": "object" } },
28
+ "readyQueue": { "$ref": "#/$defs/strings" },
29
+ "criticalWorkItems": { "$ref": "#/$defs/strings" },
30
+ "openDecisions": { "type": "array", "items": { "type": "object" } },
31
+ "resolvedDecisions": { "type": "array", "items": { "type": "object" } },
32
+ "deferredVerifications": { "type": "array", "items": { "type": "object" } },
33
+ "openDeferredVerificationIds": { "$ref": "#/$defs/strings" },
34
+ "integrationGates": { "type": "array", "items": { "type": "object" } },
35
+ "dataCandidates": { "type": "array", "items": { "type": "object" } },
36
+ "sourceDeliveries": { "type": "array", "items": { "type": "object" } },
37
+ "warnings": { "type": "array", "items": { "type": "object" } },
38
+ "externalGates": { "type": "array", "items": { "$ref": "external-gate-v1.schema.json" } },
39
+ "deliveryLifecycle": { "$ref": "delivery-lifecycle-v1.schema.json" },
40
+ "projectTruthHash": { "$ref": "#/$defs/hash" },
41
+ "authorizationGranted": { "const": false },
42
+ "deliveryDisposition": {
43
+ "enum": [
44
+ "work_ledger_incomplete", "work_ledger_complete", "source_accepted",
45
+ "integrated", "materialized", "deployed", "live_readback_passed", "product_accepted"
46
+ ]
47
+ },
48
+ "headline": { "$ref": "#/$defs/text" },
49
+ "dominantGap": {
50
+ "type": "object",
51
+ "additionalProperties": false,
52
+ "required": ["kind", "id", "title", "workItemId", "agentId", "reason", "truthRefs"],
53
+ "properties": {
54
+ "kind": { "enum": ["decision", "failed_work", "work_item", "deferred_verification", "integration_gate", "release_authority", "external_gate", "delivery_stage", "source_baseline", "unmodeled_workspace_drift", "none"] },
55
+ "id": { "$ref": "#/$defs/nullableText" },
56
+ "title": { "$ref": "#/$defs/nullableText" },
57
+ "workItemId": { "$ref": "#/$defs/nullableText" },
58
+ "agentId": { "$ref": "#/$defs/nullableText" },
59
+ "reason": { "$ref": "#/$defs/nullableText" },
60
+ "truthRefs": { "$ref": "#/$defs/strings" }
61
+ }
62
+ },
63
+ "nextAction": { "$ref": "#/$defs/nullableText" },
64
+ "nextActorId": { "$ref": "#/$defs/nullableText" },
65
+ "completionContinuity": { "$ref": "project-completion-continuity-v1.schema.json" },
66
+ "exitCode": { "const": 0 }
67
+ },
68
+ "allOf": [
69
+ {
70
+ "if": { "properties": { "deliveryDisposition": { "const": "product_accepted" } }, "required": ["deliveryDisposition"] },
71
+ "then": {
72
+ "properties": {
73
+ "dominantGap": { "properties": { "kind": { "const": "none" } } },
74
+ "nextAction": { "type": "null" },
75
+ "nextActorId": { "type": "null" }
76
+ }
77
+ }
78
+ }
79
+ ],
80
+ "examples": [
81
+ {
82
+ "schemaVersion": "OwlCodaRunKitTeamProjectStatusV5",
83
+ "status": "team_project_status",
84
+ "projectId": "completed-project",
85
+ "objective": "Keep completion continuity honest",
86
+ "overall": "completed",
87
+ "counts": {},
88
+ "milestones": [],
89
+ "workstreams": [],
90
+ "workItems": [],
91
+ "agents": [],
92
+ "readyQueue": [],
93
+ "criticalWorkItems": [],
94
+ "openDecisions": [],
95
+ "resolvedDecisions": [],
96
+ "deferredVerifications": [],
97
+ "openDeferredVerificationIds": [],
98
+ "integrationGates": [],
99
+ "dataCandidates": [],
100
+ "sourceDeliveries": [],
101
+ "warnings": [],
102
+ "externalGates": [],
103
+ "deliveryLifecycle": {
104
+ "schemaVersion": "OwlCodaRunKitDeliveryLifecycleV1",
105
+ "lifecycleStatus": "in_progress",
106
+ "currentStage": "work_ledger_complete",
107
+ "nextRequiredStage": "source",
108
+ "blockingStage": null,
109
+ "blockingExternalGateIds": [],
110
+ "stages": [
111
+ { "stage": "source", "status": "pending", "recordId": null, "ownerAgentId": null, "summary": null, "evidenceRefs": [], "externalGateIds": [], "occurredAt": null, "truthRef": null },
112
+ { "stage": "integration", "status": "pending", "recordId": null, "ownerAgentId": null, "summary": null, "evidenceRefs": [], "externalGateIds": [], "occurredAt": null, "truthRef": null },
113
+ { "stage": "materialization", "status": "pending", "recordId": null, "ownerAgentId": null, "summary": null, "evidenceRefs": [], "externalGateIds": [], "occurredAt": null, "truthRef": null },
114
+ { "stage": "deployment", "status": "pending", "recordId": null, "ownerAgentId": null, "summary": null, "evidenceRefs": [], "externalGateIds": [], "occurredAt": null, "truthRef": null },
115
+ { "stage": "live_readback", "status": "pending", "recordId": null, "ownerAgentId": null, "summary": null, "evidenceRefs": [], "externalGateIds": [], "occurredAt": null, "truthRef": null },
116
+ { "stage": "product_acceptance", "status": "pending", "recordId": null, "ownerAgentId": null, "summary": null, "evidenceRefs": [], "externalGateIds": [], "occurredAt": null, "truthRef": null }
117
+ ],
118
+ "authorizationGranted": false
119
+ },
120
+ "projectTruthHash": "0000000000000000000000000000000000000000000000000000000000000000",
121
+ "authorizationGranted": false,
122
+ "deliveryDisposition": "work_ledger_complete",
123
+ "headline": "Dominant gap: source_baseline; an explicit source baseline is missing.",
124
+ "dominantGap": {
125
+ "kind": "source_baseline",
126
+ "id": "last-modeled-source",
127
+ "title": "Source baseline missing",
128
+ "workItemId": null,
129
+ "agentId": null,
130
+ "reason": "The completed Project Driver ledger has no explicit source snapshot baseline.",
131
+ "truthRefs": ["project/definition.json"]
132
+ },
133
+ "nextAction": "Review the current workspace and bind an explicit source baseline before deciding whether the project is terminal.",
134
+ "nextActorId": null,
135
+ "completionContinuity": {
136
+ "schemaVersion": "OwlCodaRunKitProjectCompletionContinuityV1",
137
+ "status": "baseline_missing",
138
+ "projectId": "completed-project",
139
+ "projectTruthHash": "0000000000000000000000000000000000000000000000000000000000000000",
140
+ "disposition": "completed_project_source_baseline_missing",
141
+ "targetWorkspaceRef": null,
142
+ "baseline": null,
143
+ "current": null,
144
+ "delta": null,
145
+ "nextAction": "Review the current workspace and bind an explicit source baseline before deciding whether the project is terminal.",
146
+ "readOnly": true,
147
+ "writesPerformed": false,
148
+ "authorityBoundary": {
149
+ "agentDispatch": false,
150
+ "git": false,
151
+ "release": false,
152
+ "deployment": false,
153
+ "production": false,
154
+ "business": false,
155
+ "automation": false,
156
+ "money": false
157
+ },
158
+ "authorizationGranted": false
159
+ },
160
+ "exitCode": 0
161
+ }
162
+ ],
163
+ "$defs": {
164
+ "text": { "type": "string", "minLength": 1 },
165
+ "nullableText": { "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/text" }] },
166
+ "strings": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/text" } },
167
+ "hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
168
+ }
169
+ }