@alphazede/bearing-lite 0.2.1 → 1.0.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.
- package/CONTRIBUTING.md +11 -6
- package/README.md +224 -121
- package/com.github.copilot/hooks/hooks.json +33 -0
- package/hooks/assurance-budget.cjs +33 -11
- package/hooks/closeout.cjs +17 -0
- package/hooks/com.anthropic.claude-code/mapping.md +35 -16
- package/hooks/owner-stops.cjs +154 -0
- package/hooks/plan-package.cjs +5 -4
- package/hooks/policy.cjs +10 -4
- package/hooks/profiles.cjs +119 -0
- package/hooks/te-host.cjs +40 -5
- package/hooks/transition-order.cjs +24 -4
- package/hooks/verification.cjs +358 -0
- package/package.json +6 -3
- package/plugin.json +2 -34
- package/profiles.json +1 -0
- package/schemas/authority.schema.json +55 -34
- package/schemas/implementation.schema.json +204 -5
- package/schemas/journey.schema.json +142 -48
- package/schemas/profiles.schema.json +359 -0
- package/schemas/verification.schema.json +126 -0
- package/skills/{set-bearings → architectural-alignment}/SKILL.md +17 -13
- package/skills/{set-bearings → architectural-alignment}/templates/workspace.md +1 -1
- package/skills/bearing-lite/SKILL.md +23 -23
- package/skills/bearing-lite/references/assurance-policy.md +32 -16
- package/skills/bearing-lite/references/lineups.md +7 -105
- package/skills/bearing-lite/references/owner-stops.md +122 -0
- package/skills/bearing-lite/references/peer-synthesis.md +11 -12
- package/skills/bearing-lite/references/profiles.md +149 -0
- package/skills/bearing-lite/references/resume.md +30 -0
- package/skills/bearing-lite/references/review-policy.md +8 -3
- package/skills/bearing-lite/references/role-routing.mmd +14 -14
- package/skills/bearing-lite/references/task-state.md +10 -10
- package/skills/bearing-lite/references/task-state.mmd +2 -2
- package/skills/bearing-lite/references/verification.md +52 -0
- package/skills/bearing-lite/templates/task.md +29 -28
- package/skills/{explorer → coordinator}/SKILL.md +19 -19
- package/skills/{crewmate → implementer}/SKILL.md +17 -15
- package/skills/{repository-fit → intake}/SKILL.md +10 -9
- package/skills/integration-engineer/SKILL.md +17 -12
- package/skills/light-implementer/SKILL.md +6 -5
- package/skills/onboard-bearing/SKILL.md +46 -0
- package/skills/plan-integrator/SKILL.md +14 -14
- package/skills/planning-and-design/SKILL.md +60 -0
- package/skills/{map-the-route → planning-and-design}/references/artifact-grammar.md +29 -27
- package/skills/prompt/SKILL.md +245 -0
- package/skills/requirements-engineer/SKILL.md +11 -11
- package/skills/{park-ranger → reviewer}/SKILL.md +16 -13
- package/skills/{gather-supplies → scope-definition}/SKILL.md +13 -13
- package/skills/scribe/SKILL.md +12 -8
- package/skills/systems-modeler/SKILL.md +5 -3
- package/skills/test-engineer/SKILL.md +16 -13
- package/templates/dod-manifest-v1.html +648 -0
- package/tools/render-dod-manifest.mjs +1743 -0
- package/lineups.json +0 -1
- package/schemas/lineups.schema.json +0 -145
- package/skills/map-the-route/SKILL.md +0 -59
- package/skills/navigator/SKILL.md +0 -36
- package/skills/surveyor/SKILL.md +0 -48
- package/skills/validator/SKILL.md +0 -37
- package/skills/validator/references/grading-rubric.md +0 -40
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://github.com/alphazede/bearing-lite/schemas/implementation.schema.json",
|
|
4
4
|
"title": "Bearing Lite implementation.json",
|
|
5
|
-
"description": "Nested execution authority. XLSX is never authority. Owner-configured n, k, and c have no assistant default integers. Every slice requires CONTRACT-EMV-008 fields including reasoning_level (object), not a sibling reasoning string. human_decision may be a string, object, or null. authority_id is a nonempty string on dispatchable slices and may be null only when dispatchable is false or slice_status is publication-blocked. Extra lifecycle metadata is allowed.",
|
|
5
|
+
"description": "Nested execution authority. XLSX is never authority. Owner-configured n, k, and c have no assistant default integers. Every slice requires CONTRACT-EMV-008 fields including reasoning_level (object), not a sibling reasoning string. human_decision may be a string, object, or null. authority_id is a nonempty string on dispatchable slices and may be null only when dispatchable is false or slice_status is publication-blocked. Extra lifecycle metadata is allowed. lineup_freeze is not a live field; profile_freeze is required.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": true,
|
|
8
8
|
"required": [
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"artifact",
|
|
11
11
|
"source_baseline",
|
|
12
12
|
"journey_settings",
|
|
13
|
-
"
|
|
13
|
+
"profile_freeze",
|
|
14
14
|
"waves",
|
|
15
15
|
"dependencies",
|
|
16
16
|
"slices",
|
|
@@ -108,6 +108,174 @@
|
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
]
|
|
111
|
+
},
|
|
112
|
+
"dodNa": {
|
|
113
|
+
"type": "object",
|
|
114
|
+
"additionalProperties": true,
|
|
115
|
+
"properties": {
|
|
116
|
+
"not_applicable": { "type": "boolean" },
|
|
117
|
+
"na": { "type": "boolean" },
|
|
118
|
+
"reason": { "type": "string", "minLength": 1 },
|
|
119
|
+
"status": { "type": "string" }
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
"dodView": {
|
|
123
|
+
"type": "object",
|
|
124
|
+
"additionalProperties": false,
|
|
125
|
+
"properties": {
|
|
126
|
+
"format": { "type": "string", "enum": ["svg", "png"] },
|
|
127
|
+
"path": { "type": "string", "minLength": 1 },
|
|
128
|
+
"inline": { "type": "string", "minLength": 1 },
|
|
129
|
+
"alt": { "type": "string" }
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
"dodModel": {
|
|
133
|
+
"type": "object",
|
|
134
|
+
"additionalProperties": true,
|
|
135
|
+
"required": ["id"],
|
|
136
|
+
"properties": {
|
|
137
|
+
"id": { "type": "string", "minLength": 1 },
|
|
138
|
+
"mode": { "type": "string" },
|
|
139
|
+
"source": { "type": "string" },
|
|
140
|
+
"revision": { "type": "string" },
|
|
141
|
+
"digest": { "type": "string" },
|
|
142
|
+
"viewpoint": { "type": "string" },
|
|
143
|
+
"trace": { "type": "string" },
|
|
144
|
+
"limitations": { "type": "string" },
|
|
145
|
+
"render_status": { "type": "string" },
|
|
146
|
+
"required": { "type": "boolean" },
|
|
147
|
+
"selected": { "type": "boolean" },
|
|
148
|
+
"not_applicable": { "type": "boolean" },
|
|
149
|
+
"reason": { "type": "string" },
|
|
150
|
+
"view": { "$ref": "#/$defs/dodView" },
|
|
151
|
+
"views": {
|
|
152
|
+
"type": "array",
|
|
153
|
+
"items": { "$ref": "#/$defs/dodView" }
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
"dodManifest": {
|
|
158
|
+
"type": "object",
|
|
159
|
+
"additionalProperties": true,
|
|
160
|
+
"description": "Structured rendering input for the versioned DoD Manifest template. Planning fields are the immutable projection; closeout is append-only. Activated models (selected OR required, including render_status READY/MISSING/STALE) must bind digest plus view.format svg|png and view.path or svg view.inline, either on the planning row or via closeout.model_views. The renderer never invents views or evidence and never rewrites planning model rows.",
|
|
161
|
+
"required": ["template_version", "output_name", "title"],
|
|
162
|
+
"properties": {
|
|
163
|
+
"template_version": { "type": "string", "const": "1.0.1" },
|
|
164
|
+
"output_name": { "type": "string", "minLength": 1, "pattern": "^[A-Za-z0-9._-]+-dod-manifest\\.html$" },
|
|
165
|
+
"state": { "type": "string", "minLength": 1 },
|
|
166
|
+
"title": { "type": "string", "minLength": 1 },
|
|
167
|
+
"lede": { "type": "string" },
|
|
168
|
+
"bluf": { "type": "string" },
|
|
169
|
+
"identity": {
|
|
170
|
+
"type": "array",
|
|
171
|
+
"items": {
|
|
172
|
+
"type": "object",
|
|
173
|
+
"additionalProperties": true,
|
|
174
|
+
"properties": {
|
|
175
|
+
"label": { "type": "string" },
|
|
176
|
+
"value": { "type": ["string", "number"] }
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
"outcome": { "type": "string" },
|
|
181
|
+
"scope": { "type": "array", "items": { "type": "string" } },
|
|
182
|
+
"exclusions": { "type": "array", "items": { "type": "string" } },
|
|
183
|
+
"definition_of_done": {
|
|
184
|
+
"oneOf": [
|
|
185
|
+
{ "$ref": "#/$defs/dodNa" },
|
|
186
|
+
{ "type": "array", "items": { "type": "object", "additionalProperties": true } }
|
|
187
|
+
]
|
|
188
|
+
},
|
|
189
|
+
"requirements": {
|
|
190
|
+
"oneOf": [
|
|
191
|
+
{ "$ref": "#/$defs/dodNa" },
|
|
192
|
+
{ "type": "array", "items": { "type": "object", "additionalProperties": true } }
|
|
193
|
+
]
|
|
194
|
+
},
|
|
195
|
+
"architecture": {
|
|
196
|
+
"oneOf": [
|
|
197
|
+
{ "$ref": "#/$defs/dodNa" },
|
|
198
|
+
{ "type": "array", "items": { "type": "object", "additionalProperties": true } }
|
|
199
|
+
]
|
|
200
|
+
},
|
|
201
|
+
"models": {
|
|
202
|
+
"oneOf": [
|
|
203
|
+
{ "$ref": "#/$defs/dodNa" },
|
|
204
|
+
{ "type": "array", "items": { "$ref": "#/$defs/dodModel" } }
|
|
205
|
+
]
|
|
206
|
+
},
|
|
207
|
+
"lineup": {
|
|
208
|
+
"oneOf": [
|
|
209
|
+
{ "$ref": "#/$defs/dodNa" },
|
|
210
|
+
{ "type": "array", "items": { "type": "object", "additionalProperties": true } }
|
|
211
|
+
]
|
|
212
|
+
},
|
|
213
|
+
"tasks": {
|
|
214
|
+
"oneOf": [
|
|
215
|
+
{ "$ref": "#/$defs/dodNa" },
|
|
216
|
+
{ "type": "array", "items": { "type": "object", "additionalProperties": true } }
|
|
217
|
+
]
|
|
218
|
+
},
|
|
219
|
+
"vv": {
|
|
220
|
+
"oneOf": [
|
|
221
|
+
{ "$ref": "#/$defs/dodNa" },
|
|
222
|
+
{ "type": "array", "items": { "type": "object", "additionalProperties": true } }
|
|
223
|
+
]
|
|
224
|
+
},
|
|
225
|
+
"documentation": {
|
|
226
|
+
"oneOf": [
|
|
227
|
+
{ "$ref": "#/$defs/dodNa" },
|
|
228
|
+
{ "type": "array", "items": { "type": "object", "additionalProperties": true } }
|
|
229
|
+
]
|
|
230
|
+
},
|
|
231
|
+
"risks": {
|
|
232
|
+
"oneOf": [
|
|
233
|
+
{ "$ref": "#/$defs/dodNa" },
|
|
234
|
+
{ "type": "array", "items": { "type": "object", "additionalProperties": true } }
|
|
235
|
+
]
|
|
236
|
+
},
|
|
237
|
+
"authority": {
|
|
238
|
+
"oneOf": [
|
|
239
|
+
{ "$ref": "#/$defs/dodNa" },
|
|
240
|
+
{ "type": "array", "items": { "type": "object", "additionalProperties": true } }
|
|
241
|
+
]
|
|
242
|
+
},
|
|
243
|
+
"closeout": {
|
|
244
|
+
"type": "object",
|
|
245
|
+
"additionalProperties": true,
|
|
246
|
+
"description": "Append-only actuals. Must not rewrite planning projection fields.",
|
|
247
|
+
"properties": {
|
|
248
|
+
"candidate": { "type": ["string", "null"] },
|
|
249
|
+
"changed_paths": { "type": "array" },
|
|
250
|
+
"evidence": { "type": "array" },
|
|
251
|
+
"open_gaps": { "type": "array" },
|
|
252
|
+
"owner_acceptance": { "type": ["string", "null"] },
|
|
253
|
+
"slice_receipts": { "type": "array" },
|
|
254
|
+
"amendments": { "type": "array" },
|
|
255
|
+
"owner_amendments": { "type": "array" },
|
|
256
|
+
"documentation_completion": true,
|
|
257
|
+
"anomalies": true,
|
|
258
|
+
"repairs": true,
|
|
259
|
+
"recovery_used": true,
|
|
260
|
+
"residual_gaps": { "type": "array" },
|
|
261
|
+
"completion_status": { "type": "string" },
|
|
262
|
+
"model_views": {
|
|
263
|
+
"type": "array",
|
|
264
|
+
"description": "Append-only supplemental rendering bindings keyed by planning model_id. Each entry may carry digest and view only. Duplicate, unknown, semantically overriding, or already-planned bindings are rejected.",
|
|
265
|
+
"items": {
|
|
266
|
+
"type": "object",
|
|
267
|
+
"additionalProperties": false,
|
|
268
|
+
"required": ["model_id", "digest", "view"],
|
|
269
|
+
"properties": {
|
|
270
|
+
"model_id": { "type": "string", "minLength": 1 },
|
|
271
|
+
"digest": { "type": "string", "minLength": 1 },
|
|
272
|
+
"view": { "$ref": "#/$defs/dodView" }
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
111
279
|
}
|
|
112
280
|
},
|
|
113
281
|
"properties": {
|
|
@@ -129,10 +297,40 @@
|
|
|
129
297
|
"k": { "type": "integer", "minimum": 0 },
|
|
130
298
|
"c": { "type": "integer", "minimum": 0 }
|
|
131
299
|
}
|
|
132
|
-
}
|
|
300
|
+
},
|
|
301
|
+
"development_strategy": {
|
|
302
|
+
"type": "object",
|
|
303
|
+
"additionalProperties": true,
|
|
304
|
+
"required": ["mode"],
|
|
305
|
+
"properties": {
|
|
306
|
+
"mode": { "type": "string", "enum": ["single_implementer", "tdd"] }
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
"assurance_cadence": {
|
|
310
|
+
"type": "object",
|
|
311
|
+
"additionalProperties": true,
|
|
312
|
+
"properties": {
|
|
313
|
+
"test_engineer": {
|
|
314
|
+
"type": "object",
|
|
315
|
+
"additionalProperties": true,
|
|
316
|
+
"properties": {
|
|
317
|
+
"assurance": { "type": "string", "enum": ["slice", "phase", "lifecycle"] }
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
"reviewer": { "type": "string", "enum": ["slice", "phase", "lifecycle"] },
|
|
321
|
+
"integration_engineer": {
|
|
322
|
+
"type": "object",
|
|
323
|
+
"additionalProperties": true,
|
|
324
|
+
"properties": {
|
|
325
|
+
"execution": { "type": "string", "enum": ["slice", "phase", "lifecycle"] }
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
"planning_to_implementation_clean_session": { "type": "boolean" }
|
|
133
331
|
}
|
|
134
332
|
},
|
|
135
|
-
"
|
|
333
|
+
"profile_freeze": { "$ref": "#/$defs/contentfulObject" },
|
|
136
334
|
"waves": {
|
|
137
335
|
"type": "array",
|
|
138
336
|
"items": { "type": "object", "additionalProperties": true }
|
|
@@ -145,6 +343,7 @@
|
|
|
145
343
|
"type": "array",
|
|
146
344
|
"items": { "$ref": "#/$defs/slice" }
|
|
147
345
|
},
|
|
148
|
-
"traceability": { "$ref": "#/$defs/contentfulObject" }
|
|
346
|
+
"traceability": { "$ref": "#/$defs/contentfulObject" },
|
|
347
|
+
"dod_manifest": { "$ref": "#/$defs/dodManifest" }
|
|
149
348
|
}
|
|
150
349
|
}
|
|
@@ -2,32 +2,21 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://github.com/alphazede/bearing-lite/schemas/journey.schema.json",
|
|
4
4
|
"title": "Bearing Lite journey.json",
|
|
5
|
-
"description": "Append-only decisions and authority-event history plus the generation-bound checkout lease. The full mutable file digest is not the stable SEIT execution baseline. Extra lifecycle metadata is allowed at the document root. Lease identity fields stay closed.",
|
|
5
|
+
"description": "Append-only decisions and authority-event history plus the generation-bound checkout lease for a Bearing Lifecycle. The full mutable file digest is not the stable SEIT execution baseline. Extra lifecycle metadata is allowed at the document root. Lease identity fields stay closed. lineup_selection is not a live field; profile_selection is required.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": true,
|
|
8
|
-
"required": [
|
|
9
|
-
"schema_version",
|
|
10
|
-
"journey",
|
|
11
|
-
"checkout_lease",
|
|
12
|
-
"decisions",
|
|
13
|
-
"open_decisions",
|
|
14
|
-
"planning_receipts",
|
|
15
|
-
"lineup_selection"
|
|
16
|
-
],
|
|
8
|
+
"required": ["schema_version", "journey", "checkout_lease", "decisions", "open_decisions", "planning_receipts", "profile_selection"],
|
|
17
9
|
"properties": {
|
|
18
|
-
"schema_version": {
|
|
10
|
+
"schema_version": {"type": "string", "minLength": 1},
|
|
19
11
|
"journey": {
|
|
20
12
|
"type": "object",
|
|
21
13
|
"additionalProperties": true,
|
|
22
14
|
"required": ["id", "title", "status", "planning_repository"],
|
|
23
15
|
"properties": {
|
|
24
|
-
"id": {
|
|
25
|
-
"title": {
|
|
26
|
-
"status": {
|
|
27
|
-
|
|
28
|
-
"enum": ["planning", "implementation", "complete", "cancelled"]
|
|
29
|
-
},
|
|
30
|
-
"planning_repository": { "type": "string", "minLength": 1 }
|
|
16
|
+
"id": {"type": "string", "minLength": 1},
|
|
17
|
+
"title": {"type": "string", "minLength": 1},
|
|
18
|
+
"status": {"type": "string", "enum": ["planning", "implementation", "complete", "cancelled"]},
|
|
19
|
+
"planning_repository": {"type": "string", "minLength": 1}
|
|
31
20
|
}
|
|
32
21
|
},
|
|
33
22
|
"checkout_lease": {
|
|
@@ -45,57 +34,162 @@
|
|
|
45
34
|
"state"
|
|
46
35
|
],
|
|
47
36
|
"properties": {
|
|
48
|
-
"journey": {
|
|
49
|
-
"controller": {
|
|
50
|
-
"repository": {
|
|
51
|
-
"checkout": {
|
|
52
|
-
"branch": {
|
|
53
|
-
"candidate_revision": {
|
|
54
|
-
"acquired_at": {
|
|
55
|
-
"generation": {
|
|
56
|
-
"state": {
|
|
57
|
-
"released_at": {
|
|
58
|
-
"release_reason": {
|
|
59
|
-
},
|
|
60
|
-
"if": {
|
|
61
|
-
"properties": {
|
|
62
|
-
"state": { "const": "released" }
|
|
63
|
-
}
|
|
37
|
+
"journey": {"type": "string", "minLength": 1},
|
|
38
|
+
"controller": {"type": "string", "minLength": 1},
|
|
39
|
+
"repository": {"type": "string", "minLength": 1},
|
|
40
|
+
"checkout": {"type": "string", "minLength": 1},
|
|
41
|
+
"branch": {"type": "string", "minLength": 1},
|
|
42
|
+
"candidate_revision": {"type": "string", "minLength": 1},
|
|
43
|
+
"acquired_at": {"type": "string", "minLength": 1},
|
|
44
|
+
"generation": {"type": "integer", "minimum": 1},
|
|
45
|
+
"state": {"enum": ["active", "released"]},
|
|
46
|
+
"released_at": {"type": "string", "format": "date-time"},
|
|
47
|
+
"release_reason": {"type": "string", "minLength": 1}
|
|
64
48
|
},
|
|
65
|
-
"
|
|
66
|
-
|
|
67
|
-
}
|
|
49
|
+
"if": {"properties": {"state": {"const": "released"}}},
|
|
50
|
+
"then": {"required": ["released_at", "release_reason"]}
|
|
68
51
|
},
|
|
69
52
|
"history": {
|
|
70
53
|
"type": "object",
|
|
71
54
|
"additionalProperties": true,
|
|
72
55
|
"description": "Optional append-only Journey history wrapper",
|
|
73
56
|
"properties": {
|
|
74
|
-
"decisions": {
|
|
75
|
-
"authority_events": {
|
|
57
|
+
"decisions": {"type": "array", "items": {"type": "object", "additionalProperties": true}},
|
|
58
|
+
"authority_events": {"type": "array", "items": {"type": "object", "additionalProperties": true}}
|
|
76
59
|
}
|
|
77
60
|
},
|
|
78
61
|
"decisions": {
|
|
79
62
|
"type": "array",
|
|
80
63
|
"description": "Append-only confirmed owner decisions",
|
|
81
|
-
"items": {
|
|
64
|
+
"items": {
|
|
65
|
+
"type": "object",
|
|
66
|
+
"additionalProperties": true,
|
|
67
|
+
"allOf": [
|
|
68
|
+
{
|
|
69
|
+
"if": {"required": ["record_type"], "properties": {"record_type": {"const": "owner_stop"}}},
|
|
70
|
+
"then": {"$ref": "#/$defs/ownerStop"}
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
}
|
|
82
74
|
},
|
|
83
75
|
"authority_events": {
|
|
84
76
|
"type": "array",
|
|
85
77
|
"description": "Append-only authority grant, amend, revoke, or supersede events",
|
|
86
|
-
"items": {
|
|
78
|
+
"items": {"type": "object", "additionalProperties": true}
|
|
87
79
|
},
|
|
88
80
|
"open_decisions": {
|
|
89
81
|
"type": "array",
|
|
90
|
-
"items": {
|
|
82
|
+
"items": {
|
|
83
|
+
"type": "object",
|
|
84
|
+
"additionalProperties": true,
|
|
85
|
+
"allOf": [
|
|
86
|
+
{
|
|
87
|
+
"if": {"required": ["record_type"], "properties": {"record_type": {"const": "owner_stop"}}},
|
|
88
|
+
"then": {"$ref": "#/$defs/ownerStop"}
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
}
|
|
91
92
|
},
|
|
92
|
-
"planning_receipts": {
|
|
93
|
+
"planning_receipts": {"type": "array", "items": {"type": "object", "additionalProperties": true}},
|
|
94
|
+
"profile_selection": {"type": "object", "additionalProperties": true},
|
|
95
|
+
"owner_wait_tracking": {"type": "boolean", "description": "Explicit coverage marker; absence is unavailable, never zero owner wait."},
|
|
96
|
+
"owner_blocked_intervals": {
|
|
93
97
|
"type": "array",
|
|
94
|
-
"items": {
|
|
95
|
-
|
|
96
|
-
|
|
98
|
+
"items": {
|
|
99
|
+
"type": "object",
|
|
100
|
+
"additionalProperties": false,
|
|
101
|
+
"required": ["decision_ids", "started_at", "ended_at"],
|
|
102
|
+
"properties": {
|
|
103
|
+
"decision_ids": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "minLength": 1}},
|
|
104
|
+
"started_at": {"type": "string", "format": "date-time", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$"},
|
|
105
|
+
"ended_at": {"type": ["string", "null"], "format": "date-time", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$"}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"$defs": {
|
|
111
|
+
"ownerStop": {
|
|
97
112
|
"type": "object",
|
|
98
|
-
"additionalProperties": true
|
|
113
|
+
"additionalProperties": true,
|
|
114
|
+
"required": [
|
|
115
|
+
"record_type",
|
|
116
|
+
"id",
|
|
117
|
+
"class",
|
|
118
|
+
"question",
|
|
119
|
+
"why_owner",
|
|
120
|
+
"evidence_ref",
|
|
121
|
+
"affected_slices",
|
|
122
|
+
"blocking",
|
|
123
|
+
"status",
|
|
124
|
+
"created_at",
|
|
125
|
+
"asked_at",
|
|
126
|
+
"answered_at",
|
|
127
|
+
"cancelled_at",
|
|
128
|
+
"round_trip_id"
|
|
129
|
+
],
|
|
130
|
+
"properties": {
|
|
131
|
+
"record_type": {"const": "owner_stop"},
|
|
132
|
+
"id": {"type": "string", "minLength": 1},
|
|
133
|
+
"class": {"enum": ["A", "B", "C", "D", "E", "F"]},
|
|
134
|
+
"question": {"type": "string", "minLength": 1},
|
|
135
|
+
"why_owner": {"type": "string", "minLength": 1},
|
|
136
|
+
"evidence_ref": {"type": "string", "minLength": 1},
|
|
137
|
+
"affected_slices": {"type": "array", "uniqueItems": true, "items": {"type": "string", "minLength": 1}},
|
|
138
|
+
"blocking": {"type": "boolean"},
|
|
139
|
+
"status": {"enum": ["queued", "asked", "answered", "cancelled"]},
|
|
140
|
+
"created_at": {"type": "string", "format": "date-time", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$"},
|
|
141
|
+
"asked_at": {"type": ["string", "null"], "format": "date-time", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$"},
|
|
142
|
+
"answered_at": {"type": ["string", "null"], "format": "date-time", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$"},
|
|
143
|
+
"cancelled_at": {"type": ["string", "null"], "format": "date-time", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$"},
|
|
144
|
+
"round_trip_id": {"type": ["string", "null"], "minLength": 1},
|
|
145
|
+
"answer_ref": {"type": "string", "minLength": 1}
|
|
146
|
+
},
|
|
147
|
+
"allOf": [
|
|
148
|
+
{
|
|
149
|
+
"if": {"properties": {"status": {"const": "queued"}}},
|
|
150
|
+
"then": {
|
|
151
|
+
"properties": {
|
|
152
|
+
"asked_at": {"type": "null"},
|
|
153
|
+
"answered_at": {"type": "null"},
|
|
154
|
+
"cancelled_at": {"type": "null"},
|
|
155
|
+
"round_trip_id": {"type": "null"}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"if": {"properties": {"status": {"const": "asked"}}},
|
|
161
|
+
"then": {
|
|
162
|
+
"properties": {
|
|
163
|
+
"asked_at": {"type": "string"},
|
|
164
|
+
"round_trip_id": {"type": "string", "minLength": 1},
|
|
165
|
+
"answered_at": {"type": "null"},
|
|
166
|
+
"cancelled_at": {"type": "null"}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"if": {"properties": {"status": {"const": "answered"}}},
|
|
172
|
+
"then": {
|
|
173
|
+
"properties": {
|
|
174
|
+
"asked_at": {"type": "string"},
|
|
175
|
+
"answered_at": {"type": "string"},
|
|
176
|
+
"cancelled_at": {"type": "null"},
|
|
177
|
+
"round_trip_id": {"type": "string", "minLength": 1}
|
|
178
|
+
},
|
|
179
|
+
"required": ["answer_ref"]
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"if": {"properties": {"status": {"const": "cancelled"}}},
|
|
184
|
+
"then": {"properties": {"cancelled_at": {"type": "string"}, "answered_at": {"type": "null"}}}
|
|
185
|
+
}
|
|
186
|
+
]
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
"allOf": [
|
|
190
|
+
{
|
|
191
|
+
"if": {"required": ["owner_wait_tracking"], "properties": {"owner_wait_tracking": {"const": true}}},
|
|
192
|
+
"then": {"required": ["owner_blocked_intervals"]}
|
|
99
193
|
}
|
|
100
|
-
|
|
194
|
+
]
|
|
101
195
|
}
|