@x12i/memorix-metadata 3.0.3 → 3.2.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 (56) hide show
  1. package/README.md +4 -0
  2. package/dist/abstracts.d.ts +9 -3
  3. package/dist/abstracts.d.ts.map +1 -1
  4. package/dist/abstracts.js +70 -66
  5. package/dist/abstracts.js.map +1 -1
  6. package/dist/fold-bindings.d.ts +19 -0
  7. package/dist/fold-bindings.d.ts.map +1 -0
  8. package/dist/fold-bindings.js +103 -0
  9. package/dist/fold-bindings.js.map +1 -0
  10. package/dist/index.d.ts +3 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +3 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/kind-fields.d.ts.map +1 -1
  15. package/dist/kind-fields.js +0 -1
  16. package/dist/kind-fields.js.map +1 -1
  17. package/dist/kinds.d.ts +2 -2
  18. package/dist/kinds.d.ts.map +1 -1
  19. package/dist/kinds.js +9 -11
  20. package/dist/kinds.js.map +1 -1
  21. package/dist/normalize.d.ts +1 -0
  22. package/dist/normalize.d.ts.map +1 -1
  23. package/dist/normalize.js +5 -1
  24. package/dist/normalize.js.map +1 -1
  25. package/dist/resolve.d.ts.map +1 -1
  26. package/dist/resolve.js +14 -3
  27. package/dist/resolve.js.map +1 -1
  28. package/dist/topology.d.ts +52 -0
  29. package/dist/topology.d.ts.map +1 -0
  30. package/dist/topology.js +376 -0
  31. package/dist/topology.js.map +1 -0
  32. package/dist/types.d.ts +146 -16
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/validate.d.ts.map +1 -1
  35. package/dist/validate.js +179 -64
  36. package/dist/validate.js.map +1 -1
  37. package/examples/invalid/agent-classification.json +31 -31
  38. package/examples/invalid/broken-binding.json +27 -27
  39. package/examples/invalid/completion-mapping-with-exec-policy.json +31 -31
  40. package/examples/invalid/missing-parent.json +31 -31
  41. package/examples/invalid/operational-kind-root.json +31 -31
  42. package/examples/invalid/pipeline-unknown-service.json +31 -31
  43. package/examples/invalid/relationship-missing-rules.json +24 -24
  44. package/examples/invalid/relationship-with-storage.json +24 -24
  45. package/examples/invalid/service-with-secrets.json +27 -27
  46. package/examples/knowx/normalized/pack.json +1133 -173
  47. package/examples/opx/normalized/pack.json +309 -291
  48. package/examples/opx/raw/abstract-types.json +223 -7
  49. package/examples/opx/raw/object-types.json +26 -95
  50. package/examples/opx/raw/pipelines-and-sources.json +66 -18
  51. package/examples/opx/raw/relationship-definitions.json +17 -47
  52. package/examples/opx/raw/view-definitions.json +6 -20
  53. package/examples/opx/raw/write-and-source-mappings.json +135 -20
  54. package/examples/project-opx/normalized/pack.json +355 -263
  55. package/package.json +1 -1
  56. package/examples/opx/raw/abstract-bindings.json +0 -38
@@ -7,31 +7,38 @@
7
7
  "id": "opx",
8
8
  "name": "Operations (generic parent)",
9
9
  "description": "Complete generic parent agent for ordinary operational work. Permanent Memorix acceptance pack.",
10
+ "parentIds": [],
10
11
  "parentId": null
11
12
  },
12
13
  {
13
14
  "id": "project-opx",
14
15
  "name": "Project Operations (child of opx)",
15
16
  "description": "Inheritance smoke agent. Extends opx without replacing core definitions.",
17
+ "parentIds": [
18
+ "opx"
19
+ ],
16
20
  "parentId": "opx"
17
21
  }
18
22
  ],
19
23
  "objectTypes": [
20
24
  {
21
- "id": "employees",
22
- "name": "Employees",
25
+ "id": "people",
26
+ "name": "People",
23
27
  "dataCategory": "entity",
24
28
  "abstractTypes": [
25
29
  "People"
26
30
  ],
31
+ "notes": "Single people OT. Inside vs outside org is identity kind (concept.identifiers.primary.kind): employeeId | externalPersonId \u2014 not separate object types.",
27
32
  "contentTypes": [
28
33
  {
29
34
  "id": "raw",
30
- "required": true
35
+ "required": true,
36
+ "requiredReason": "Landed provider-native payload; identity and lineage depend on it."
31
37
  },
32
38
  {
33
39
  "id": "snapshots",
34
- "required": true
40
+ "required": true,
41
+ "requiredReason": "Canonical composed person view used by queries and abstracts."
35
42
  },
36
43
  {
37
44
  "id": "discovery",
@@ -53,63 +60,6 @@
53
60
  "id": "relationships",
54
61
  "notes": "Candidate store shape until Gate G4"
55
62
  }
56
- ],
57
- "fields": [
58
- {
59
- "path": "data.displayName",
60
- "valueType": "string",
61
- "contentType": "snapshots"
62
- },
63
- {
64
- "path": "data.role",
65
- "valueType": "string",
66
- "contentType": "snapshots"
67
- }
68
- ]
69
- },
70
- {
71
- "id": "contractors",
72
- "name": "Contractors",
73
- "dataCategory": "entity",
74
- "abstractTypes": [
75
- "People"
76
- ],
77
- "contentTypes": [
78
- {
79
- "id": "raw"
80
- },
81
- {
82
- "id": "snapshots"
83
- },
84
- {
85
- "id": "discovery",
86
- "discriminator": {
87
- "path": "data.discoveryType",
88
- "required": false
89
- }
90
- },
91
- {
92
- "id": "analysis",
93
- "discriminator": {
94
- "path": "data.analysisType",
95
- "required": false
96
- }
97
- },
98
- {
99
- "id": "relationships"
100
- }
101
- ],
102
- "fields": [
103
- {
104
- "path": "data.displayName",
105
- "valueType": "string",
106
- "contentType": "snapshots"
107
- },
108
- {
109
- "path": "data.role",
110
- "valueType": "string",
111
- "contentType": "snapshots"
112
- }
113
63
  ]
114
64
  },
115
65
  {
@@ -167,11 +117,11 @@
167
117
  }
168
118
  },
169
119
  {
170
- "id": "procedures",
171
- "name": "Procedures",
120
+ "id": "playbooks",
121
+ "name": "Playbooks",
172
122
  "dataCategory": "knowledge",
173
123
  "abstractTypes": [
174
- "Procedures"
124
+ "Playbooks"
175
125
  ],
176
126
  "contentTypes": [
177
127
  {
@@ -212,7 +162,7 @@
212
162
  {
213
163
  "id": "People",
214
164
  "name": "People",
215
- "meaning": "Employees and contractors who perform operational work",
165
+ "meaning": "People who perform operational work \u2014 inside the org (employeeId) or outside (externalPersonId), distinguished by identity kind",
216
166
  "category": "entity",
217
167
  "properties": [
218
168
  {
@@ -229,104 +179,223 @@
229
179
  "id": "lens",
230
180
  "valueType": "string",
231
181
  "required": false
182
+ },
183
+ {
184
+ "id": "email",
185
+ "valueType": "string",
186
+ "required": false
187
+ },
188
+ {
189
+ "id": "organization",
190
+ "valueType": "string",
191
+ "required": false
232
192
  }
233
- ]
234
- },
235
- {
236
- "id": "WorkItems",
237
- "name": "Work Items",
238
- "meaning": "Units of operational work",
239
- "category": "entity"
240
- },
241
- {
242
- "id": "Procedures",
243
- "name": "Procedures",
244
- "meaning": "Reusable operational knowledge / playbooks",
245
- "category": "knowledge"
246
- },
247
- {
248
- "id": "ActivityEvents",
249
- "name": "Activity Events",
250
- "meaning": "Progress and activity reports about work items",
251
- "category": "event"
252
- }
253
- ],
254
- "abstractBindings": [
255
- {
256
- "id": "people-employees-contractors",
257
- "abstractType": "People",
258
- "concreteObjectTypes": [
259
- "employees",
260
- "contractors"
261
193
  ],
262
- "union": true,
263
- "notes": "People = Employees ∪ Contractors. No abstract records exist.",
264
194
  "members": [
265
195
  {
266
- "objectType": "employees",
196
+ "objectType": "people",
267
197
  "contentType": "snapshots",
268
198
  "properties": [
269
199
  {
270
200
  "abstractProperty": "title",
271
201
  "contentType": "snapshots",
272
- "mappingId": "opx-people-abstract-employees"
202
+ "mappingId": "opx-people-abstract"
273
203
  },
274
204
  {
275
205
  "abstractProperty": "role",
276
206
  "contentType": "snapshots",
277
- "mappingId": "opx-people-abstract-employees"
207
+ "mappingId": "opx-people-abstract"
278
208
  },
279
209
  {
280
210
  "abstractProperty": "lens",
281
211
  "contentType": "snapshots",
282
- "mappingId": "opx-people-abstract-employees"
212
+ "mappingId": "opx-people-abstract"
213
+ },
214
+ {
215
+ "abstractProperty": "email",
216
+ "contentType": "snapshots",
217
+ "mappingId": "opx-people-abstract"
218
+ },
219
+ {
220
+ "abstractProperty": "organization",
221
+ "contentType": "snapshots",
222
+ "mappingId": "opx-people-abstract"
283
223
  }
284
224
  ]
225
+ }
226
+ ],
227
+ "union": false,
228
+ "notes": "People abstract \u2194 people OT 1:1. Inside/outside org is concept.identifiers.primary.kind (employeeId | externalPersonId), not a second OT."
229
+ },
230
+ {
231
+ "id": "WorkItems",
232
+ "name": "Work Items",
233
+ "meaning": "Units of operational work",
234
+ "category": "entity",
235
+ "properties": [
236
+ {
237
+ "id": "title",
238
+ "valueType": "string",
239
+ "required": true
240
+ },
241
+ {
242
+ "id": "status",
243
+ "valueType": "string",
244
+ "required": true
285
245
  },
286
246
  {
287
- "objectType": "contractors",
247
+ "id": "priority",
248
+ "valueType": "string",
249
+ "required": false
250
+ }
251
+ ],
252
+ "members": [
253
+ {
254
+ "objectType": "work-items",
288
255
  "contentType": "snapshots",
289
256
  "properties": [
290
257
  {
291
258
  "abstractProperty": "title",
292
259
  "contentType": "snapshots",
293
- "mappingId": "opx-people-abstract-contractors"
260
+ "propertyPath": "data.title",
261
+ "concreteValueType": "string"
294
262
  },
295
263
  {
296
- "abstractProperty": "role",
264
+ "abstractProperty": "status",
297
265
  "contentType": "snapshots",
298
- "mappingId": "opx-people-abstract-contractors"
266
+ "propertyPath": "data.status",
267
+ "concreteValueType": "string"
299
268
  },
300
269
  {
301
- "abstractProperty": "lens",
270
+ "abstractProperty": "priority",
302
271
  "contentType": "snapshots",
303
- "mappingId": "opx-people-abstract-contractors"
272
+ "propertyPath": "data.priority",
273
+ "concreteValueType": "string"
304
274
  }
305
275
  ]
306
276
  }
307
- ]
308
- },
309
- {
310
- "id": "work-items-concrete",
311
- "abstractType": "WorkItems",
312
- "concreteObjectTypes": [
313
- "work-items"
314
277
  ],
315
278
  "union": false
316
279
  },
317
280
  {
318
- "id": "procedures-concrete",
319
- "abstractType": "Procedures",
320
- "concreteObjectTypes": [
321
- "procedures"
281
+ "id": "Playbooks",
282
+ "name": "Playbooks",
283
+ "meaning": "Reusable operational knowledge / playbooks",
284
+ "category": "knowledge",
285
+ "properties": [
286
+ {
287
+ "id": "title",
288
+ "valueType": "string",
289
+ "required": true
290
+ },
291
+ {
292
+ "id": "body",
293
+ "valueType": "string",
294
+ "required": true
295
+ },
296
+ {
297
+ "id": "contentHash",
298
+ "valueType": "string",
299
+ "required": false
300
+ }
301
+ ],
302
+ "members": [
303
+ {
304
+ "objectType": "playbooks",
305
+ "contentType": "snapshots",
306
+ "properties": [
307
+ {
308
+ "abstractProperty": "title",
309
+ "contentType": "snapshots",
310
+ "propertyPath": "data.name",
311
+ "concreteValueType": "string"
312
+ },
313
+ {
314
+ "abstractProperty": "body",
315
+ "contentType": "snapshots",
316
+ "propertyPath": "data.body",
317
+ "concreteValueType": "string"
318
+ },
319
+ {
320
+ "abstractProperty": "contentHash",
321
+ "contentType": "snapshots",
322
+ "propertyPath": "data.contentHash",
323
+ "concreteValueType": "string"
324
+ }
325
+ ]
326
+ }
322
327
  ],
323
328
  "union": false
324
329
  },
325
330
  {
326
- "id": "activity-events-concrete",
327
- "abstractType": "ActivityEvents",
328
- "concreteObjectTypes": [
329
- "activity-events"
331
+ "id": "ActivityEvents",
332
+ "name": "Activity Events",
333
+ "meaning": "Progress and activity reports about work items",
334
+ "category": "event",
335
+ "properties": [
336
+ {
337
+ "id": "type",
338
+ "valueType": "string",
339
+ "required": true
340
+ },
341
+ {
342
+ "id": "message",
343
+ "valueType": "string",
344
+ "required": true
345
+ },
346
+ {
347
+ "id": "workItemId",
348
+ "valueType": "recordId",
349
+ "required": true
350
+ },
351
+ {
352
+ "id": "actorId",
353
+ "valueType": "recordId",
354
+ "required": false
355
+ },
356
+ {
357
+ "id": "occurredAt",
358
+ "valueType": "datetime",
359
+ "required": false
360
+ }
361
+ ],
362
+ "members": [
363
+ {
364
+ "objectType": "activity-events",
365
+ "contentType": "snapshots",
366
+ "properties": [
367
+ {
368
+ "abstractProperty": "type",
369
+ "contentType": "snapshots",
370
+ "propertyPath": "data.type",
371
+ "concreteValueType": "string"
372
+ },
373
+ {
374
+ "abstractProperty": "message",
375
+ "contentType": "snapshots",
376
+ "propertyPath": "data.message",
377
+ "concreteValueType": "string"
378
+ },
379
+ {
380
+ "abstractProperty": "workItemId",
381
+ "contentType": "snapshots",
382
+ "propertyPath": "data.workItemId",
383
+ "concreteValueType": "recordId"
384
+ },
385
+ {
386
+ "abstractProperty": "actorId",
387
+ "contentType": "snapshots",
388
+ "propertyPath": "data.actorId",
389
+ "concreteValueType": "recordId"
390
+ },
391
+ {
392
+ "abstractProperty": "occurredAt",
393
+ "contentType": "snapshots",
394
+ "propertyPath": "data.occurredAt",
395
+ "concreteValueType": "datetime"
396
+ }
397
+ ]
398
+ }
330
399
  ],
331
400
  "union": false
332
401
  }
@@ -335,7 +404,7 @@
335
404
  {
336
405
  "id": "people-assigned-to-work-items",
337
406
  "name": "People assigned to work items",
338
- "meaning": "A person (employee or contractor) is assigned to perform a work item",
407
+ "meaning": "A person is assigned to perform a work item",
339
408
  "directionality": "directed",
340
409
  "from": {
341
410
  "abstractType": "People",
@@ -350,28 +419,28 @@
350
419
  "id": "from-source-assignee",
351
420
  "kind": "source-field",
352
421
  "sourcePath": "assigneeId",
353
- "notes": "opx-source work-items.assigneeId resolves across employees and contractors"
422
+ "notes": "opx-source work-items.assigneeId resolves to people OT (any identity kind)"
354
423
  }
355
424
  ]
356
425
  },
357
426
  {
358
- "id": "work-items-use-procedures",
359
- "name": "Work items use procedures",
360
- "meaning": "A work item follows one or more reusable procedures",
427
+ "id": "work-items-use-playbooks",
428
+ "name": "Work items use playbooks",
429
+ "meaning": "A work item follows one or more reusable playbooks",
361
430
  "directionality": "directed",
362
431
  "from": {
363
432
  "abstractType": "WorkItems",
364
- "path": "usedProcedures"
433
+ "path": "usedPlaybooks"
365
434
  },
366
435
  "to": {
367
- "abstractType": "Procedures",
436
+ "abstractType": "Playbooks",
368
437
  "path": "usedByWorkItems"
369
438
  },
370
439
  "discoveryRules": [
371
440
  {
372
- "id": "from-source-procedure-ids",
441
+ "id": "from-source-playbook-ids",
373
442
  "kind": "source-field",
374
- "sourcePath": "procedureIds"
443
+ "sourcePath": "playbookIds"
375
444
  }
376
445
  ]
377
446
  },
@@ -442,12 +511,12 @@
442
511
  "mappings": [
443
512
  {
444
513
  "id": "opx-source-employees-to-raw",
514
+ "purpose": "source",
445
515
  "sourceId": "opx-source",
446
516
  "endpoint": "/employees",
447
- "objectType": "employees",
517
+ "objectType": "people",
448
518
  "contentType": "raw",
449
519
  "mode": "knowledge",
450
- "purpose": "source",
451
520
  "map": {
452
521
  "recordId": {
453
522
  "op": "path",
@@ -456,7 +525,7 @@
456
525
  },
457
526
  "objectType": {
458
527
  "op": "constant",
459
- "value": "employees"
528
+ "value": "people"
460
529
  },
461
530
  "data.displayName": {
462
531
  "op": "path",
@@ -479,13 +548,13 @@
479
548
  }
480
549
  },
481
550
  {
482
- "id": "opx-source-contractors-to-raw",
551
+ "id": "opx-source-external-people-to-raw",
552
+ "purpose": "source",
483
553
  "sourceId": "opx-source",
484
- "endpoint": "/contractors",
485
- "objectType": "contractors",
554
+ "endpoint": "/external-people",
555
+ "objectType": "people",
486
556
  "contentType": "raw",
487
557
  "mode": "knowledge",
488
- "purpose": "source",
489
558
  "map": {
490
559
  "recordId": {
491
560
  "op": "path",
@@ -494,7 +563,7 @@
494
563
  },
495
564
  "objectType": {
496
565
  "op": "constant",
497
- "value": "contractors"
566
+ "value": "people"
498
567
  },
499
568
  "data.displayName": {
500
569
  "op": "path",
@@ -506,9 +575,9 @@
506
575
  "path": "role",
507
576
  "required": true
508
577
  },
509
- "data.vendor": {
578
+ "data.organization": {
510
579
  "op": "path",
511
- "path": "vendor"
580
+ "path": "organization"
512
581
  },
513
582
  "data.sourceId": {
514
583
  "op": "path",
@@ -518,27 +587,12 @@
518
587
  },
519
588
  {
520
589
  "id": "opx-source-work-items-to-raw",
590
+ "purpose": "source",
521
591
  "sourceId": "opx-source",
522
592
  "endpoint": "/work-items",
523
593
  "objectType": "work-items",
524
594
  "contentType": "raw",
525
595
  "mode": "knowledge",
526
- "purpose": "source",
527
- "map": {
528
- "data": {
529
- "op": "path",
530
- "path": "$"
531
- }
532
- }
533
- },
534
- {
535
- "id": "opx-source-procedures-to-raw",
536
- "sourceId": "opx-source",
537
- "endpoint": "/procedures",
538
- "objectType": "procedures",
539
- "contentType": "raw",
540
- "mode": "knowledge",
541
- "purpose": "source",
542
596
  "map": {
543
597
  "data": {
544
598
  "op": "path",
@@ -548,13 +602,13 @@
548
602
  },
549
603
  {
550
604
  "id": "opx-source-work-item-context",
605
+ "purpose": "source",
551
606
  "sourceId": "opx-source",
552
607
  "endpoint": "/work-items/:id/context",
553
608
  "objectType": "work-items",
554
- "contentType": "raw",
609
+ "contentType": "context",
555
610
  "mode": "context",
556
611
  "trigger": "on-demand",
557
- "purpose": "source",
558
612
  "map": {
559
613
  "data": {
560
614
  "op": "path",
@@ -563,46 +617,10 @@
563
617
  }
564
618
  },
565
619
  {
566
- "id": "opx-people-abstract-employees",
567
- "purpose": "abstract",
568
- "abstractType": "People",
569
- "objectType": "employees",
570
- "contentType": "snapshots",
571
- "map": {
572
- "title": {
573
- "expr": {
574
- "op": "path",
575
- "path": "data.displayName"
576
- },
577
- "required": true
578
- },
579
- "role": {
580
- "expr": {
581
- "op": "path",
582
- "path": "data.role"
583
- },
584
- "required": true
585
- },
586
- "lens": {
587
- "op": "constant",
588
- "value": "people"
589
- }
590
- },
591
- "reverse": {
592
- "title": {
593
- "expr": {
594
- "op": "path",
595
- "path": "title"
596
- },
597
- "targetPath": "data.displayName"
598
- }
599
- }
600
- },
601
- {
602
- "id": "opx-people-abstract-contractors",
620
+ "id": "opx-people-abstract",
603
621
  "purpose": "abstract",
604
622
  "abstractType": "People",
605
- "objectType": "contractors",
623
+ "objectType": "people",
606
624
  "contentType": "snapshots",
607
625
  "map": {
608
626
  "title": {
@@ -623,15 +641,6 @@
623
641
  "op": "constant",
624
642
  "value": "people"
625
643
  }
626
- },
627
- "reverse": {
628
- "title": {
629
- "expr": {
630
- "op": "path",
631
- "path": "title"
632
- },
633
- "targetPath": "data.displayName"
634
- }
635
644
  }
636
645
  },
637
646
  {
@@ -664,18 +673,17 @@
664
673
  {
665
674
  "id": "opx-work-items-list",
666
675
  "kind": "list",
667
- "objectType": "work-items",
668
676
  "title": "Work items",
669
677
  "columns": [
670
678
  "concept.title",
671
679
  "data.status",
672
680
  "data.priority"
673
- ]
681
+ ],
682
+ "abstractType": "WorkItems"
674
683
  },
675
684
  {
676
685
  "id": "opx-work-items-item",
677
686
  "kind": "item",
678
- "objectType": "work-items",
679
687
  "title": "Work item",
680
688
  "sections": [
681
689
  "concept",
@@ -683,7 +691,8 @@
683
691
  "workflow",
684
692
  "analysis",
685
693
  "decisions"
686
- ]
694
+ ],
695
+ "abstractType": "WorkItems"
687
696
  },
688
697
  {
689
698
  "id": "opx-people-list",
@@ -699,15 +708,15 @@
699
708
  {
700
709
  "id": "opx-work-item-expand-people",
701
710
  "kind": "relationship-expansion",
702
- "objectType": "work-items",
703
711
  "relationshipDefinitionId": "people-assigned-to-work-items",
704
- "direction": "to-from"
712
+ "direction": "to-from",
713
+ "abstractType": "WorkItems"
705
714
  }
706
715
  ],
707
716
  "writes": [
708
717
  {
709
- "id": "opx-employees-snapshots",
710
- "objectType": "employees",
718
+ "id": "opx-people-employee-snapshots",
719
+ "objectType": "people",
711
720
  "contentType": "snapshots",
712
721
  "identity": {
713
722
  "primaryKind": "employeeId",
@@ -715,11 +724,11 @@
715
724
  }
716
725
  },
717
726
  {
718
- "id": "opx-contractors-snapshots",
719
- "objectType": "contractors",
727
+ "id": "opx-people-external-snapshots",
728
+ "objectType": "people",
720
729
  "contentType": "snapshots",
721
730
  "identity": {
722
- "primaryKind": "contractorId",
731
+ "primaryKind": "externalPersonId",
723
732
  "issuer": "opx-source"
724
733
  }
725
734
  },
@@ -733,11 +742,11 @@
733
742
  }
734
743
  },
735
744
  {
736
- "id": "opx-procedures-snapshots",
737
- "objectType": "procedures",
745
+ "id": "opx-playbooks-snapshots",
746
+ "objectType": "playbooks",
738
747
  "contentType": "snapshots",
739
748
  "identity": {
740
- "primaryKind": "procedureId",
749
+ "primaryKind": "playbookId",
741
750
  "issuer": "opx-source"
742
751
  }
743
752
  },
@@ -755,17 +764,17 @@
755
764
  {
756
765
  "id": "opx-source",
757
766
  "name": "Opx-service",
758
- "kind": "rest-fixture",
767
+ "kind": "rest",
759
768
  "baseUrlEnv": "OPX_SOURCE_URL",
760
769
  "defaultBaseUrl": "http://127.0.0.1:5102",
761
770
  "credentialRef": "opx-source-local",
762
- "connectorRef": "opx-fixture",
771
+ "connectorRef": "opx-rest",
763
772
  "endpoints": [
764
773
  "/employees",
765
- "/contractors",
774
+ "/external-people",
766
775
  "/work-items",
767
776
  "/activity-events",
768
- "/procedures",
777
+ "/playbooks",
769
778
  "/work-items/:id/context"
770
779
  ],
771
780
  "pagination": {
@@ -780,13 +789,18 @@
780
789
  },
781
790
  "routes": [
782
791
  {
783
- "endpoint": "/procedures",
784
- "objectType": "procedures",
792
+ "endpoint": "/playbooks",
793
+ "objectType": "playbooks",
785
794
  "dataCategory": "knowledge",
786
795
  "identityPath": "id",
787
- "primaryKind": "procedureId",
788
- "modes": ["knowledge"],
789
- "pageSize": 2
796
+ "primaryKind": "playbookId",
797
+ "modes": [
798
+ "knowledge"
799
+ ],
800
+ "pageSize": 2,
801
+ "checkpoint": {
802
+ "method": "cursor"
803
+ }
790
804
  },
791
805
  {
792
806
  "endpoint": "/work-items/:id/context",
@@ -794,7 +808,12 @@
794
808
  "dataCategory": "entity",
795
809
  "identityPath": "workItemId",
796
810
  "primaryKind": "workItemId",
797
- "modes": ["context"]
811
+ "modes": [
812
+ "context"
813
+ ],
814
+ "checkpoint": {
815
+ "method": "cursor"
816
+ }
798
817
  },
799
818
  {
800
819
  "endpoint": "/work-items",
@@ -802,23 +821,38 @@
802
821
  "dataCategory": "entity",
803
822
  "identityPath": "id",
804
823
  "primaryKind": "workItemId",
805
- "modes": ["knowledge"]
824
+ "modes": [
825
+ "knowledge"
826
+ ],
827
+ "checkpoint": {
828
+ "method": "cursor"
829
+ }
806
830
  },
807
831
  {
808
832
  "endpoint": "/employees",
809
- "objectType": "employees",
833
+ "objectType": "people",
810
834
  "dataCategory": "entity",
811
835
  "identityPath": "id",
812
836
  "primaryKind": "employeeId",
813
- "modes": ["knowledge"]
837
+ "modes": [
838
+ "knowledge"
839
+ ],
840
+ "checkpoint": {
841
+ "method": "cursor"
842
+ }
814
843
  },
815
844
  {
816
- "endpoint": "/contractors",
817
- "objectType": "contractors",
845
+ "endpoint": "/external-people",
846
+ "objectType": "people",
818
847
  "dataCategory": "entity",
819
848
  "identityPath": "id",
820
- "primaryKind": "contractorId",
821
- "modes": ["knowledge"]
849
+ "primaryKind": "externalPersonId",
850
+ "modes": [
851
+ "knowledge"
852
+ ],
853
+ "checkpoint": {
854
+ "method": "cursor"
855
+ }
822
856
  },
823
857
  {
824
858
  "endpoint": "/activity-events",
@@ -826,57 +860,44 @@
826
860
  "dataCategory": "event",
827
861
  "identityPath": "id",
828
862
  "primaryKind": "activityEventId",
829
- "modes": ["knowledge"]
863
+ "modes": [
864
+ "knowledge"
865
+ ],
866
+ "checkpoint": {
867
+ "method": "cursor"
868
+ }
830
869
  }
831
870
  ]
832
871
  }
833
872
  ],
834
873
  "services": [
835
874
  {
836
- "id": "opx-normalize",
837
- "name": "Normalize records",
838
- "description": "Logical normalize capability for ops knowledge pull",
839
- "capabilities": [
840
- "normalize"
841
- ],
842
- "inputs": [
843
- {
844
- "id": "raw-records",
845
- "schemaRef": "memorix-record/raw"
846
- }
847
- ],
848
- "outputs": [
849
- {
850
- "id": "normalized-records",
851
- "schemaRef": "memorix-record/snapshots"
852
- }
853
- ],
854
- "invocation": {
855
- "kind": "worker",
856
- "operation": "normalize"
857
- }
858
- },
859
- {
860
- "id": "opx-completion",
861
- "name": "Field completion",
875
+ "id": "opx-enrich-priority",
876
+ "name": "Enrich work-item priority",
877
+ "description": "Deterministic priority score draft for WorkItems. Returns a patch plan \u2014 does not persist. Pipeline write-record applies the revision-safe mutation on the concrete member.",
878
+ "role": "agent",
862
879
  "capabilities": [
863
- "completion"
880
+ "enrich"
864
881
  ],
865
882
  "inputs": [
866
883
  {
867
884
  "id": "snapshot",
868
- "schemaRef": "memorix-record/snapshots"
885
+ "abstractType": "WorkItems",
886
+ "path": "snapshots",
887
+ "description": "Current WorkItems projection at a captured revision"
869
888
  }
870
889
  ],
871
890
  "outputs": [
872
891
  {
873
- "id": "completed",
874
- "schemaRef": "memorix-record/snapshots"
892
+ "id": "patch-plan",
893
+ "abstractType": "WorkItems",
894
+ "path": "snapshots",
895
+ "description": "Draft patch / scored fields for the writer step"
875
896
  }
876
897
  ],
877
898
  "invocation": {
878
899
  "kind": "worker",
879
- "operation": "complete"
900
+ "operation": "enrich-priority"
880
901
  }
881
902
  }
882
903
  ],
@@ -903,21 +924,6 @@
903
924
  {
904
925
  "id": "promote",
905
926
  "kind": "promote-snapshots"
906
- },
907
- {
908
- "id": "normalize-svc",
909
- "kind": "invoke-service",
910
- "serviceId": "opx-normalize"
911
- },
912
- {
913
- "id": "complete",
914
- "kind": "completion",
915
- "serviceId": "opx-completion",
916
- "mappingId": "opx-work-items-completion-priority",
917
- "completionPolicy": {
918
- "mode": "fill-missing",
919
- "maxFields": 20
920
- }
921
927
  }
922
928
  ]
923
929
  },
@@ -996,15 +1002,27 @@
996
1002
  "contentType": "workflow"
997
1003
  }
998
1004
  ]
999
- }
1000
- ],
1001
- "schedules": [
1005
+ },
1002
1006
  {
1003
- "id": "opx-knowledge-hourly",
1004
- "pipelineId": "opx-knowledge-pull",
1005
- "cron": "0 * * * *",
1006
- "timezone": "UTC",
1007
- "enabled": true
1007
+ "id": "opx-enrich-priority",
1008
+ "name": "Enrich WI priority (draft then write)",
1009
+ "trigger": "explicit",
1010
+ "description": "Capture snapshot \u2192 enrich service (opx-enrich-priority) \u2192 write-record. Runtime v2 uses stepKind enrich + serviceId.",
1011
+ "steps": [
1012
+ {
1013
+ "id": "enrich",
1014
+ "kind": "enrich",
1015
+ "serviceId": "opx-enrich-priority"
1016
+ },
1017
+ {
1018
+ "id": "write",
1019
+ "kind": "write-record",
1020
+ "contentType": "snapshots"
1021
+ }
1022
+ ]
1008
1023
  }
1009
- ]
1024
+ ],
1025
+ "schedules": [],
1026
+ "kindDeclarations": [],
1027
+ "extensions": {}
1010
1028
  }