@wildo-ai/platform-core-shared 1.1.4 → 1.1.5
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/dist/esm/core/resources/resources-operations.custom.shared.definitions.d.ts.map +1 -1
- package/dist/esm/core/resources/resources-relationships.custom.shared.definitions.d.ts.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/runtime/application-backend-env.contracts.d.ts +28 -2
- package/dist/esm/runtime/application-backend-env.contracts.d.ts.map +1 -1
- package/dist/esm/runtime/application-backend-env.contracts.js +27 -1
- package/dist/esm/runtime/application-backend-env.contracts.js.map +1 -1
- package/dist/esm/runtime/runtime-topology.contracts.d.ts.map +1 -1
- package/dist/esm/security/authorizations/roles.custom.shared.definitions.d.ts.map +1 -1
- package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.resources-config.schemas.d.ts +60 -66
- package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.schemas.d.ts +60 -66
- package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.schemas.d.ts.map +1 -1
- package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.schemas.js +2 -2
- package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.schemas.js.map +1 -1
- package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.resources-config.schemas.d.ts +6 -10
- package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.d.ts +6 -10
- package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.d.ts.map +1 -1
- package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.js +26 -28
- package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.js.map +1 -1
- package/dist/esm/wildo-applications/wildo-applications.custom.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/wildo-applications/wildo-applications.custom.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/wildo-applications/wildo-applications.custom.shared.schemas.d.ts +27 -0
- package/dist/esm/wildo-applications/wildo-applications.custom.shared.schemas.d.ts.map +1 -1
- package/dist/esm/wildo-applications/wildo-applications.custom.shared.schemas.js +56 -0
- package/dist/esm/wildo-applications/wildo-applications.custom.shared.schemas.js.map +1 -1
- package/dist/esm/wildo-applications-versions/wildo-applications-versions.custom.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/wildo-applications-versions/wildo-applications-versions.custom.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/wildo-applications-versions/wildo-applications-versions.custom.shared.schemas.d.ts.map +1 -1
- package/dist/esm/workbench/workbench-aspect-resources.custom.shared.schemas.d.ts +13 -0
- package/dist/esm/workbench/workbench-aspect-resources.custom.shared.schemas.d.ts.map +1 -1
- package/dist/esm/workbench/workbench-aspect-resources.custom.shared.schemas.js +418 -1
- package/dist/esm/workbench/workbench-aspect-resources.custom.shared.schemas.js.map +1 -1
- package/dist/esm/workbench/workbench-creation-board.custom.shared.schemas.d.ts +0 -98
- package/dist/esm/workbench/workbench-creation-board.custom.shared.schemas.d.ts.map +0 -1
- package/dist/esm/workbench/workbench-creation-board.custom.shared.schemas.js.map +0 -1
- package/dist/esm/workbench/workbench-creation-conversation.custom.shared.schemas.d.ts +103 -0
- package/dist/esm/workbench/workbench-creation-conversation.custom.shared.schemas.d.ts.map +1 -0
- package/dist/esm/workbench/workbench-creation-conversation.custom.shared.schemas.js +99 -0
- package/dist/esm/workbench/workbench-creation-conversation.custom.shared.schemas.js.map +1 -0
- package/dist/esm/workbench/workbench-creation-dossier.custom.shared.schemas.d.ts +49 -0
- package/dist/esm/workbench/workbench-creation-dossier.custom.shared.schemas.d.ts.map +1 -0
- package/dist/esm/workbench/workbench-creation-dossier.custom.shared.schemas.js +42 -0
- package/dist/esm/workbench/workbench-creation-dossier.custom.shared.schemas.js.map +1 -0
- package/dist/esm/workbench/workbench-creation-plane.custom.shared.resources-config.schemas.d.ts +378 -11
- package/dist/esm/workbench/workbench-creation-plane.custom.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/workbench/workbench-creation-plane.custom.shared.resources-config.schemas.js +426 -5
- package/dist/esm/workbench/workbench-creation-plane.custom.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/workbench/workbench-creation-plane.custom.shared.schemas.d.ts +882 -9
- package/dist/esm/workbench/workbench-creation-plane.custom.shared.schemas.d.ts.map +1 -1
- package/dist/esm/workbench/workbench-creation-plane.custom.shared.schemas.js +1154 -14
- package/dist/esm/workbench/workbench-creation-plane.custom.shared.schemas.js.map +1 -1
- package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.d.ts +117 -1
- package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.d.ts.map +1 -1
- package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.js +160 -0
- package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.js.map +1 -1
- package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.d.ts +184 -7
- package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.js +1 -1
- package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/workbench/workbench-resources.custom.shared.schemas.d.ts +2 -1
- package/dist/esm/workbench/workbench-resources.custom.shared.schemas.d.ts.map +1 -1
- package/dist/esm/workbench/workbench-resources.custom.shared.schemas.js +10 -5
- package/dist/esm/workbench/workbench-resources.custom.shared.schemas.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -13
- package/dist/esm/workbench/workbench-creation-board.custom.shared.schemas.js +0 -86
|
@@ -101,6 +101,12 @@ export const WORKBENCH_ASPECT_DESCRIPTORS = [
|
|
|
101
101
|
rowsPath: 'marketIcps',
|
|
102
102
|
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
103
103
|
edges: [
|
|
104
|
+
/*
|
|
105
|
+
* The SELF-edge (#1427): an ICP's `influences` name OTHER ICPs, carried inside objects and
|
|
106
|
+
* invisible to the registry until it walked one level down. It is what makes a buying group
|
|
107
|
+
* legible — the economic buyer an end user influences is why both are on record.
|
|
108
|
+
*/
|
|
109
|
+
{ field: 'influencesIcpIds', targetAspectKey: 'market.icp', many: true },
|
|
104
110
|
{ field: 'personaIds', targetAspectKey: 'market.persona', many: true },
|
|
105
111
|
{ field: 'jobIds', targetAspectKey: 'market.job', many: true },
|
|
106
112
|
{ field: 'painIds', targetAspectKey: 'market.pain', many: true },
|
|
@@ -316,6 +322,15 @@ export const WORKBENCH_ASPECT_DESCRIPTORS = [
|
|
|
316
322
|
identity: WorkbenchAspectIdentityKind.SINGLETON,
|
|
317
323
|
edges: [],
|
|
318
324
|
},
|
|
325
|
+
{
|
|
326
|
+
aspectKey: 'brand.audience',
|
|
327
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_BRAND_AUDIENCE,
|
|
328
|
+
rowsPath: 'brandAudiences',
|
|
329
|
+
identity: WorkbenchAspectIdentityKind.SINGLETON,
|
|
330
|
+
edges: [
|
|
331
|
+
{ field: 'targetIcpIds', targetAspectKey: 'market.icp', many: true },
|
|
332
|
+
],
|
|
333
|
+
},
|
|
319
334
|
{
|
|
320
335
|
aspectKey: 'brand.asset',
|
|
321
336
|
resourceType: WorkbenchShared_ResourceType.ASPECT_BRAND_ASSET,
|
|
@@ -325,6 +340,120 @@ export const WORKBENCH_ASPECT_DESCRIPTORS = [
|
|
|
325
340
|
{ field: 'derivedFromId', targetAspectKey: 'brand.asset', many: false },
|
|
326
341
|
],
|
|
327
342
|
},
|
|
343
|
+
/*
|
|
344
|
+
* THE COMPLIANCE PROGRAMME (#1431, surfaced #1512). Ten aspects, and the edge set is the point:
|
|
345
|
+
* an obligation reaches the decision that made it applicable, the assignment that owns it, the
|
|
346
|
+
* gap that blocks it and the coverage decision that reviewed it — the whole reason this family is
|
|
347
|
+
* addressable at all.
|
|
348
|
+
*
|
|
349
|
+
* SEVERAL registry fields collapse into ONE spine field wherever they share a target, because the
|
|
350
|
+
* projection joins a reference to the descriptor edge whose target matches. A responsibility
|
|
351
|
+
* assignment names five distinct ROLE fields and they become one `roleIds` link; the distinction
|
|
352
|
+
* is not lost, it is on the row, where each field renders under its own word. What the edge
|
|
353
|
+
* carries is the click-through, which is the same for all five.
|
|
354
|
+
*/
|
|
355
|
+
{
|
|
356
|
+
aspectKey: 'compliance-program.scope-selector',
|
|
357
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_SCOPE_SELECTOR,
|
|
358
|
+
rowsPath: 'complianceScopeSelectors',
|
|
359
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
360
|
+
edges: [],
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
aspectKey: 'compliance-program.applicability-decision',
|
|
364
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_APPLICABILITY_DECISION,
|
|
365
|
+
rowsPath: 'complianceApplicabilityDecisions',
|
|
366
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
367
|
+
edges: [
|
|
368
|
+
{ field: 'scopeSelectorId', targetAspectKey: 'compliance-program.scope-selector', many: false },
|
|
369
|
+
],
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
aspectKey: 'compliance-program.obligation',
|
|
373
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_OBLIGATION,
|
|
374
|
+
rowsPath: 'complianceObligations',
|
|
375
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
376
|
+
edges: [
|
|
377
|
+
{ field: 'scopeSelectorIds', targetAspectKey: 'compliance-program.scope-selector', many: true },
|
|
378
|
+
{ field: 'responsibilityAssignmentIds', targetAspectKey: 'compliance-program.responsibility-assignment', many: true },
|
|
379
|
+
{ field: 'reviewOwnerRoleIds', targetAspectKey: 'compliance-program.role-authority', many: true },
|
|
380
|
+
{ field: 'gapIds', targetAspectKey: 'compliance-program.gap', many: true },
|
|
381
|
+
{ field: 'coverageDecisionId', targetAspectKey: 'compliance-program.obligation-coverage-decision', many: false },
|
|
382
|
+
{ field: 'sourceApplicabilityDecisionIds', targetAspectKey: 'compliance-program.applicability-decision', many: true },
|
|
383
|
+
// A SELF-edge: an obligation may depend on another obligation being met first.
|
|
384
|
+
{ field: 'dependencyObligationIds', targetAspectKey: 'compliance-program.obligation', many: true },
|
|
385
|
+
{ field: 'sharedResponsibilityRuleId', targetAspectKey: 'compliance-program.shared-responsibility-rule', many: false },
|
|
386
|
+
],
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
aspectKey: 'compliance-program.obligation-coverage-decision',
|
|
390
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_COVERAGE_DECISION,
|
|
391
|
+
rowsPath: 'complianceCoverageDecisions',
|
|
392
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
393
|
+
edges: [
|
|
394
|
+
{ field: 'obligationId', targetAspectKey: 'compliance-program.obligation', many: false },
|
|
395
|
+
{ field: 'reviewedByRoleId', targetAspectKey: 'compliance-program.role-authority', many: false },
|
|
396
|
+
],
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
aspectKey: 'compliance-program.implementation-decision',
|
|
400
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_IMPLEMENTATION_DECISION,
|
|
401
|
+
rowsPath: 'complianceImplementationDecisions',
|
|
402
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
403
|
+
edges: [
|
|
404
|
+
{ field: 'scopeSelectorIds', targetAspectKey: 'compliance-program.scope-selector', many: true },
|
|
405
|
+
{ field: 'gapIds', targetAspectKey: 'compliance-program.gap', many: true },
|
|
406
|
+
],
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
aspectKey: 'compliance-program.responsibility-assignment',
|
|
410
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_RESPONSIBILITY_ASSIGNMENT,
|
|
411
|
+
rowsPath: 'complianceResponsibilityAssignments',
|
|
412
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
413
|
+
edges: [
|
|
414
|
+
{ field: 'scopeSelectorId', targetAspectKey: 'compliance-program.scope-selector', many: false },
|
|
415
|
+
// FIVE registry fields — responsible, operating, evidence-provider, approving, escalation —
|
|
416
|
+
// one target, so one link. Each renders under its own word on the row.
|
|
417
|
+
{ field: 'roleIds', targetAspectKey: 'compliance-program.role-authority', many: true },
|
|
418
|
+
],
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
aspectKey: 'compliance-program.gap',
|
|
422
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_GAP,
|
|
423
|
+
rowsPath: 'complianceGaps',
|
|
424
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
425
|
+
edges: [
|
|
426
|
+
{ field: 'scopeSelectorId', targetAspectKey: 'compliance-program.scope-selector', many: false },
|
|
427
|
+
{ field: 'ownerRoleId', targetAspectKey: 'compliance-program.role-authority', many: false },
|
|
428
|
+
],
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
aspectKey: 'compliance-program.documentation-requirement',
|
|
432
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_DOCUMENTATION_REQUIREMENT,
|
|
433
|
+
rowsPath: 'complianceDocumentationRequirements',
|
|
434
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
435
|
+
edges: [
|
|
436
|
+
{ field: 'approvingRoleIds', targetAspectKey: 'compliance-program.role-authority', many: true },
|
|
437
|
+
],
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
aspectKey: 'compliance-program.role-authority',
|
|
441
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_ROLE_AUTHORITY,
|
|
442
|
+
rowsPath: 'complianceRoleAuthorities',
|
|
443
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
444
|
+
edges: [],
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
aspectKey: 'compliance-program.shared-responsibility-rule',
|
|
448
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_SHARED_RESPONSIBILITY_RULE,
|
|
449
|
+
rowsPath: 'complianceSharedResponsibilityRules',
|
|
450
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
451
|
+
edges: [
|
|
452
|
+
{ field: 'scopeSelectorIds', targetAspectKey: 'compliance-program.scope-selector', many: true },
|
|
453
|
+
// Five role fields again — accountable, operating, evidence-provider, approving, conflict.
|
|
454
|
+
{ field: 'roleIds', targetAspectKey: 'compliance-program.role-authority', many: true },
|
|
455
|
+
],
|
|
456
|
+
},
|
|
328
457
|
{
|
|
329
458
|
aspectKey: 'domain-plan.module',
|
|
330
459
|
resourceType: WorkbenchShared_ResourceType.ASPECT_DOMAIN_PLAN_MODULE,
|
|
@@ -332,12 +461,40 @@ export const WORKBENCH_ASPECT_DESCRIPTORS = [
|
|
|
332
461
|
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
333
462
|
edges: [],
|
|
334
463
|
},
|
|
464
|
+
/*
|
|
465
|
+
* The DERIVED resource (#1482, surfaced #1512). Its rows are a projection of
|
|
466
|
+
* `modules[].mainResources` rather than a member of the snapshot — a domain plan lists resources
|
|
467
|
+
* as plain strings — and it is the single most-travelled link in the build lane: a build task's
|
|
468
|
+
* `target.resourceRef` and `produces.resourceRef`, a placement decision's `subject.resourceRef`
|
|
469
|
+
* and an experience view's `resourceId` all land here. Without this row every one of those was an
|
|
470
|
+
* edge the graph could declare and not follow.
|
|
471
|
+
*/
|
|
472
|
+
{
|
|
473
|
+
aspectKey: 'domain-plan.resource',
|
|
474
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_DOMAIN_PLAN_RESOURCE,
|
|
475
|
+
rowsPath: 'domainPlanResources',
|
|
476
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
477
|
+
edges: [
|
|
478
|
+
// Back to the module that lists it — the one edge a projected row carries.
|
|
479
|
+
{ field: 'moduleId', targetAspectKey: 'domain-plan.module', many: false },
|
|
480
|
+
],
|
|
481
|
+
},
|
|
335
482
|
{
|
|
336
483
|
aspectKey: 'domain-plan.relationship',
|
|
337
484
|
resourceType: WorkbenchShared_ResourceType.ASPECT_DOMAIN_PLAN_RELATIONSHIP,
|
|
338
485
|
rowsPath: 'domainPlanRelationships',
|
|
339
486
|
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
340
|
-
edges: [
|
|
487
|
+
edges: [
|
|
488
|
+
/*
|
|
489
|
+
* The two ENDS, as ONE spine field. The registry declares `sourceResourceRef` and
|
|
490
|
+
* `targetResourceRef` separately and both land on the same aspect, and the projection joins a
|
|
491
|
+
* reference to the descriptor edge whose target matches — so one target is one field, by
|
|
492
|
+
* construction. The DIRECTION is not lost: it is on the row itself, where `sourceResourceRef`
|
|
493
|
+
* and `targetResourceRef` render as "From" and "To"; what this field carries is the
|
|
494
|
+
* click-through, which is the same for both ends.
|
|
495
|
+
*/
|
|
496
|
+
{ field: 'relatesResourceIds', targetAspectKey: 'domain-plan.resource', many: true },
|
|
497
|
+
],
|
|
341
498
|
},
|
|
342
499
|
{
|
|
343
500
|
aspectKey: 'build-plan.task',
|
|
@@ -346,11 +503,195 @@ export const WORKBENCH_ASPECT_DESCRIPTORS = [
|
|
|
346
503
|
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
347
504
|
edges: [
|
|
348
505
|
{ field: 'prerequisiteTaskIds', targetAspectKey: 'build-plan.task', many: true },
|
|
506
|
+
/*
|
|
507
|
+
* THE LINK BACK TO THE DECISION (#1427): a task's `target` names the domain-plan module or
|
|
508
|
+
* relationship it builds. Carried inside an object, so the registry could not see it until its
|
|
509
|
+
* drift pin walked one level down — and the spine could not link it until the registry did.
|
|
510
|
+
*/
|
|
511
|
+
{ field: 'targetModuleId', targetAspectKey: 'domain-plan.module', many: false },
|
|
512
|
+
{ field: 'targetRelationshipId', targetAspectKey: 'domain-plan.relationship', many: false },
|
|
513
|
+
/*
|
|
514
|
+
* The most-travelled link in the build lane (#1482): a task's `target.resourceRef` and its
|
|
515
|
+
* `produces.resourceRef` both name the resource it builds. Two registry fields, one target,
|
|
516
|
+
* so one spine field — what is built and what it produces are the same resource.
|
|
517
|
+
*/
|
|
518
|
+
{ field: 'resourceIds', targetAspectKey: 'domain-plan.resource', many: true },
|
|
519
|
+
/* A task may serve a DRAFTED FEATURE (#1433 row 4) — declared once the data was measured. */
|
|
520
|
+
{ field: 'servesFeatureDraftIds', targetAspectKey: 'feature-drafts.draft', many: true },
|
|
521
|
+
{ field: 'servesFunctionalRequirementIds', targetAspectKey: 'requirements.functional', many: true },
|
|
522
|
+
{ field: 'servesNonFunctionalRequirementIds', targetAspectKey: 'requirements.non-functional', many: true },
|
|
523
|
+
{ field: 'servesRoadmapPhaseIds', targetAspectKey: 'roadmap.phase', many: true },
|
|
524
|
+
/* The vision edges (#629) — see the registry for why a build task may serve these. */
|
|
525
|
+
{ field: 'servesSuccessCriterionIds', targetAspectKey: 'vision.success-criterion', many: true },
|
|
526
|
+
{ field: 'servesConstraintIds', targetAspectKey: 'vision.constraint', many: true },
|
|
527
|
+
],
|
|
528
|
+
},
|
|
529
|
+
{
|
|
530
|
+
/*
|
|
531
|
+
* One composition decision per framework scenario (#1491) — NO edges: a decision names a
|
|
532
|
+
* SCENARIO (a framework template) and a basis (a closed vocabulary), neither of which is a
|
|
533
|
+
* decided element another aspect addresses.
|
|
534
|
+
*/
|
|
535
|
+
aspectKey: 'capability-composition.decision',
|
|
536
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_CAPABILITY_COMPOSITION_DECISION,
|
|
537
|
+
rowsPath: 'compositionDecisions',
|
|
538
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
539
|
+
edges: [],
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
/*
|
|
543
|
+
* One planned website page (#1492). Its two edges reach the MARKET — a page is written for an
|
|
544
|
+
* ICP, in a tone of voice — which is what makes the plan checkable from the snapshot's side.
|
|
545
|
+
*/
|
|
546
|
+
aspectKey: 'website-plan.page',
|
|
547
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_WEBSITE_PAGE,
|
|
548
|
+
rowsPath: 'websitePages',
|
|
549
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
550
|
+
edges: [
|
|
551
|
+
{ field: 'audienceIcpIds', targetAspectKey: 'market.icp', many: true },
|
|
552
|
+
{ field: 'toneOfVoiceId', targetAspectKey: 'market.tone-of-voice', many: false },
|
|
553
|
+
],
|
|
554
|
+
},
|
|
555
|
+
{
|
|
556
|
+
/* One planned surface of the application's experience (#1493) — where it lives, and what asked for it. */
|
|
557
|
+
aspectKey: 'experience-plan.view',
|
|
558
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_EXPERIENCE_VIEW,
|
|
559
|
+
rowsPath: 'experienceViews',
|
|
560
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
561
|
+
edges: [
|
|
562
|
+
{ field: 'moduleId', targetAspectKey: 'domain-plan.module', many: false },
|
|
563
|
+
{ field: 'resourceId', targetAspectKey: 'domain-plan.resource', many: false },
|
|
564
|
+
{ field: 'servesFunctionalRequirementIds', targetAspectKey: 'requirements.functional', many: true },
|
|
565
|
+
{ field: 'servesNonFunctionalRequirementIds', targetAspectKey: 'requirements.non-functional', many: true },
|
|
566
|
+
{ field: 'servesRoadmapPhaseIds', targetAspectKey: 'roadmap.phase', many: true },
|
|
567
|
+
{ field: 'servesFeatureDraftIds', targetAspectKey: 'feature-drafts.draft', many: true },
|
|
568
|
+
{ field: 'servesSuccessCriterionIds', targetAspectKey: 'vision.success-criterion', many: true },
|
|
569
|
+
],
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
/* One configuration surface the application composes — no edge: it names files and tokens, not elements. */
|
|
573
|
+
aspectKey: 'experience-plan.configuration',
|
|
574
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_EXPERIENCE_CONFIGURATION,
|
|
575
|
+
rowsPath: 'experienceConfigurations',
|
|
576
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
577
|
+
edges: [],
|
|
578
|
+
},
|
|
579
|
+
{
|
|
580
|
+
/* One moment the application recognises — the module declaring it and the resource that earns it. */
|
|
581
|
+
aspectKey: 'experience-plan.milestone',
|
|
582
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_EXPERIENCE_MILESTONE,
|
|
583
|
+
rowsPath: 'experienceMilestones',
|
|
584
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
585
|
+
edges: [
|
|
586
|
+
{ field: 'moduleId', targetAspectKey: 'domain-plan.module', many: false },
|
|
587
|
+
{ field: 'triggerResourceId', targetAspectKey: 'domain-plan.resource', many: false },
|
|
588
|
+
{ field: 'servesFunctionalRequirementIds', targetAspectKey: 'requirements.functional', many: true },
|
|
589
|
+
{ field: 'servesNonFunctionalRequirementIds', targetAspectKey: 'requirements.non-functional', many: true },
|
|
590
|
+
{ field: 'servesRoadmapPhaseIds', targetAspectKey: 'roadmap.phase', many: true },
|
|
591
|
+
{ field: 'servesFeatureDraftIds', targetAspectKey: 'feature-drafts.draft', many: true },
|
|
592
|
+
{ field: 'servesSuccessCriterionIds', targetAspectKey: 'vision.success-criterion', many: true },
|
|
593
|
+
],
|
|
594
|
+
},
|
|
595
|
+
{
|
|
596
|
+
/* One piece of guidance, linked to the milestones a person must hold first — the journey as one path. */
|
|
597
|
+
aspectKey: 'experience-plan.guidance',
|
|
598
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_EXPERIENCE_GUIDANCE,
|
|
599
|
+
rowsPath: 'experienceGuidance',
|
|
600
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
601
|
+
edges: [
|
|
602
|
+
{ field: 'moduleId', targetAspectKey: 'domain-plan.module', many: false },
|
|
603
|
+
{ field: 'gatedByMilestoneIds', targetAspectKey: 'experience-plan.milestone', many: true },
|
|
604
|
+
{ field: 'hostViewId', targetAspectKey: 'experience-plan.view', many: false },
|
|
349
605
|
{ field: 'servesFunctionalRequirementIds', targetAspectKey: 'requirements.functional', many: true },
|
|
350
606
|
{ field: 'servesNonFunctionalRequirementIds', targetAspectKey: 'requirements.non-functional', many: true },
|
|
351
607
|
{ field: 'servesRoadmapPhaseIds', targetAspectKey: 'roadmap.phase', many: true },
|
|
608
|
+
{ field: 'servesFeatureDraftIds', targetAspectKey: 'feature-drafts.draft', many: true },
|
|
609
|
+
{ field: 'servesSuccessCriterionIds', targetAspectKey: 'vision.success-criterion', many: true },
|
|
352
610
|
],
|
|
353
611
|
},
|
|
612
|
+
{
|
|
613
|
+
/*
|
|
614
|
+
* One worker the backend delegates to (#1495). Its only edges are what asked for it: a worker's
|
|
615
|
+
* routes are the BUILT package's units of work, not decided elements.
|
|
616
|
+
*/
|
|
617
|
+
aspectKey: 'integration-plan.worker',
|
|
618
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_INTEGRATION_WORKER,
|
|
619
|
+
rowsPath: 'integrationWorkers',
|
|
620
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
621
|
+
edges: [
|
|
622
|
+
{ field: 'servesFunctionalRequirementIds', targetAspectKey: 'requirements.functional', many: true },
|
|
623
|
+
{ field: 'servesNonFunctionalRequirementIds', targetAspectKey: 'requirements.non-functional', many: true },
|
|
624
|
+
{ field: 'servesRoadmapPhaseIds', targetAspectKey: 'roadmap.phase', many: true },
|
|
625
|
+
{ field: 'servesFeatureDraftIds', targetAspectKey: 'feature-drafts.draft', many: true },
|
|
626
|
+
{ field: 'servesSuccessCriterionIds', targetAspectKey: 'vision.success-criterion', many: true },
|
|
627
|
+
],
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
/*
|
|
631
|
+
* One cron minion (#1495) — and the ONE aspect whose edges are not unique by target: its
|
|
632
|
+
* containment whitelist reaches `domain-plan.resource` TWICE, once per direction, so both
|
|
633
|
+
* carry `sourceField`. The direction is the decision, and collapsing the two would report a
|
|
634
|
+
* minion as reading what it only writes.
|
|
635
|
+
*/
|
|
636
|
+
aspectKey: 'integration-plan.minion',
|
|
637
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_INTEGRATION_MINION,
|
|
638
|
+
rowsPath: 'integrationMinions',
|
|
639
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
640
|
+
edges: [
|
|
641
|
+
{ field: 'readsResourceIds', sourceField: 'readsResourceRefs', targetAspectKey: 'domain-plan.resource', many: true },
|
|
642
|
+
{ field: 'writesResourceIds', sourceField: 'writesResourceRefs', targetAspectKey: 'domain-plan.resource', many: true },
|
|
643
|
+
{ field: 'servesFunctionalRequirementIds', targetAspectKey: 'requirements.functional', many: true },
|
|
644
|
+
{ field: 'servesNonFunctionalRequirementIds', targetAspectKey: 'requirements.non-functional', many: true },
|
|
645
|
+
{ field: 'servesRoadmapPhaseIds', targetAspectKey: 'roadmap.phase', many: true },
|
|
646
|
+
{ field: 'servesFeatureDraftIds', targetAspectKey: 'feature-drafts.draft', many: true },
|
|
647
|
+
{ field: 'servesSuccessCriterionIds', targetAspectKey: 'vision.success-criterion', many: true },
|
|
648
|
+
],
|
|
649
|
+
},
|
|
650
|
+
{
|
|
651
|
+
/* One provider bound into one scope — no edge: a provider ref is the ENGINE's catalogue, not a decided element. */
|
|
652
|
+
aspectKey: 'integration-plan.provider-binding',
|
|
653
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_INTEGRATION_PROVIDER_BINDING,
|
|
654
|
+
rowsPath: 'integrationProviderBindings',
|
|
655
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
656
|
+
edges: [],
|
|
657
|
+
},
|
|
658
|
+
{
|
|
659
|
+
/*
|
|
660
|
+
* One requirement's standing (#1496), and the aspect that carries BOTH multi-edge shapes at
|
|
661
|
+
* once — which is why every edge here names its source field.
|
|
662
|
+
*
|
|
663
|
+
* Its business key IS its edge: the row exists to say something about ONE requirement, and
|
|
664
|
+
* `requirementRef` reaches both halves of the family — one field, two targets — routed by
|
|
665
|
+
* MEMBERSHIP rather than by the row's own `half` field, which it does carry. An aspect edge
|
|
666
|
+
* declares its targets ONCE and has no per-row selection, and membership MEASURES where a ref
|
|
667
|
+
* lives instead of trusting a landed file's claim about it. `landedTaskIds` and
|
|
668
|
+
* `provenTaskIds` are the other shape, two fields to ONE target, and they must stay apart
|
|
669
|
+
* because proven is a subset of landed and collapsing them would report work as verified that
|
|
670
|
+
* only exists.
|
|
671
|
+
*
|
|
672
|
+
* The projection therefore joins on the PAIR. Naming the source field on all four is what makes
|
|
673
|
+
* that join load-bearing rather than incidental: with them omitted the target-only fallback
|
|
674
|
+
* happens to resolve the same rows, and a regression in the join would go unnoticed.
|
|
675
|
+
*/
|
|
676
|
+
aspectKey: 'application-maturity.requirement',
|
|
677
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_REQUIREMENT_MATURITY,
|
|
678
|
+
rowsPath: 'requirementMaturities',
|
|
679
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
680
|
+
edges: [
|
|
681
|
+
{ field: 'functionalRequirementId', sourceField: 'requirementRef', targetAspectKey: 'requirements.functional', many: false },
|
|
682
|
+
{ field: 'nonFunctionalRequirementId', sourceField: 'requirementRef', targetAspectKey: 'requirements.non-functional', many: false },
|
|
683
|
+
{ field: 'landedTaskIds', sourceField: 'landedTaskRefs', targetAspectKey: 'build-plan.task', many: true },
|
|
684
|
+
{ field: 'provenTaskIds', sourceField: 'provenTaskRefs', targetAspectKey: 'build-plan.task', many: true },
|
|
685
|
+
],
|
|
686
|
+
},
|
|
687
|
+
{
|
|
688
|
+
/* One planned documentation chapter (#1494) — no edge: it cites the BUILT product's own specifications. */
|
|
689
|
+
aspectKey: 'documentation-plan.chapter',
|
|
690
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_DOCUMENTATION_CHAPTER,
|
|
691
|
+
rowsPath: 'documentationChapters',
|
|
692
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
693
|
+
edges: [],
|
|
694
|
+
},
|
|
354
695
|
{
|
|
355
696
|
aspectKey: 'placement.group',
|
|
356
697
|
resourceType: WorkbenchShared_ResourceType.ASPECT_PLACEMENT_GROUP,
|
|
@@ -365,6 +706,13 @@ export const WORKBENCH_ASPECT_DESCRIPTORS = [
|
|
|
365
706
|
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
366
707
|
edges: [
|
|
367
708
|
{ field: 'groupId', targetAspectKey: 'placement.group', many: false },
|
|
709
|
+
/*
|
|
710
|
+
* A placement decision's SUBJECT is a domain-plan module or a RESOURCE (#1427/#1482), both
|
|
711
|
+
* carried inside an object. The resource half was the one the graph could not follow until
|
|
712
|
+
* the projected resource got a row of its own.
|
|
713
|
+
*/
|
|
714
|
+
{ field: 'subjectModuleId', targetAspectKey: 'domain-plan.module', many: false },
|
|
715
|
+
{ field: 'subjectResourceId', targetAspectKey: 'domain-plan.resource', many: false },
|
|
368
716
|
],
|
|
369
717
|
},
|
|
370
718
|
{
|
|
@@ -372,6 +720,10 @@ export const WORKBENCH_ASPECT_DESCRIPTORS = [
|
|
|
372
720
|
resourceType: WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_CANDIDATE_SECTION,
|
|
373
721
|
rowsPath: 'complianceCandidateSections',
|
|
374
722
|
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
723
|
+
/*
|
|
724
|
+
* No edges since #1465: the producer family lands into the SET and is never indexed, so its
|
|
725
|
+
* clause → fact link moved to `compliance-candidate-set.section`, the aspect that is read.
|
|
726
|
+
*/
|
|
375
727
|
edges: [],
|
|
376
728
|
},
|
|
377
729
|
{
|
|
@@ -413,6 +765,18 @@ export const WORKBENCH_ASPECT_DESCRIPTORS = [
|
|
|
413
765
|
identity: WorkbenchAspectIdentityKind.INDEXED,
|
|
414
766
|
edges: [],
|
|
415
767
|
},
|
|
768
|
+
{
|
|
769
|
+
/*
|
|
770
|
+
* BUSINESS_KEY, unlike the processor entry above: a risk entry carries `entryRef`, which the
|
|
771
|
+
* family validator holds unique and which `reviewOrder` addresses rows by. An indexed identity
|
|
772
|
+
* here would make the register's own reading order unable to name the rows it orders.
|
|
773
|
+
*/
|
|
774
|
+
aspectKey: 'risk-register.entry',
|
|
775
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_RISK_REGISTER_ENTRY,
|
|
776
|
+
rowsPath: 'riskRegisterEntries',
|
|
777
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
778
|
+
edges: [],
|
|
779
|
+
},
|
|
416
780
|
{
|
|
417
781
|
aspectKey: 'release-policy.selection',
|
|
418
782
|
resourceType: WorkbenchShared_ResourceType.ASPECT_RELEASE_POLICY_SELECTION,
|
|
@@ -427,6 +791,59 @@ export const WORKBENCH_ASPECT_DESCRIPTORS = [
|
|
|
427
791
|
identity: WorkbenchAspectIdentityKind.INDEXED,
|
|
428
792
|
edges: [],
|
|
429
793
|
},
|
|
794
|
+
/*
|
|
795
|
+
* The two landed SET families of the governed-document lane (#1105). A drafting run EMITS one
|
|
796
|
+
* candidate (the singular family the two `compliance-candidate.*` descriptors above transcribe) and
|
|
797
|
+
* LANDS into the set; a composed release lands into the release set. Without these two, the set that
|
|
798
|
+
* actually landed had no popup and no graph row — a journey that drafted the privacy notice showed the
|
|
799
|
+
* draft's sections only through the producer's contract.
|
|
800
|
+
*/
|
|
801
|
+
{
|
|
802
|
+
aspectKey: 'compliance-candidate-set.candidate',
|
|
803
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_CANDIDATE,
|
|
804
|
+
rowsPath: 'complianceCandidates',
|
|
805
|
+
// Keyed on `documentRef`: the identity decision the set schema records (locale and jurisdictions
|
|
806
|
+
// are publication-variant concerns and would make a draft's identity change as it matured).
|
|
807
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
808
|
+
edges: [
|
|
809
|
+
/*
|
|
810
|
+
* These rows CITE facts, and a fact is either DERIVED from the application or DECIDED by a
|
|
811
|
+
* person — one registry edge with two targets, which the projection routes by membership, so
|
|
812
|
+
* the spine needs one field per target (#1427).
|
|
813
|
+
*/
|
|
814
|
+
{ field: 'citesFactIds', targetAspectKey: 'document-facts.declaration', many: true },
|
|
815
|
+
{ field: 'citesDecidedFactIds', targetAspectKey: 'document-facts-authored.declaration', many: true },
|
|
816
|
+
],
|
|
817
|
+
},
|
|
818
|
+
{
|
|
819
|
+
/*
|
|
820
|
+
* One SECTION of a landed candidate (#1465), derived from the set's `candidates` and addressed by
|
|
821
|
+
* the composed `<documentRef>/<sectionRef>` — a section ref alone repeats across documents.
|
|
822
|
+
*/
|
|
823
|
+
aspectKey: 'compliance-candidate-set.section',
|
|
824
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_CANDIDATE_SET_SECTION,
|
|
825
|
+
rowsPath: 'complianceCandidateSetSections',
|
|
826
|
+
identity: WorkbenchAspectIdentityKind.BUSINESS_KEY,
|
|
827
|
+
edges: [
|
|
828
|
+
// Back to the candidate the section belongs to.
|
|
829
|
+
{ field: 'complianceCandidateId', targetAspectKey: 'compliance-candidate-set.candidate', many: false },
|
|
830
|
+
/*
|
|
831
|
+
* The section's CLAUSES cite the facts they rest on — derived or decided — one registry edge with
|
|
832
|
+
* two targets, routed by membership, so one spine field per target (#1427).
|
|
833
|
+
*/
|
|
834
|
+
{ field: 'citesFactIds', targetAspectKey: 'document-facts.declaration', many: true },
|
|
835
|
+
{ field: 'citesDecidedFactIds', targetAspectKey: 'document-facts-authored.declaration', many: true },
|
|
836
|
+
],
|
|
837
|
+
},
|
|
838
|
+
{
|
|
839
|
+
aspectKey: 'document-release-set.release',
|
|
840
|
+
resourceType: WorkbenchShared_ResourceType.ASPECT_DOCUMENT_RELEASE,
|
|
841
|
+
rowsPath: 'documentReleases',
|
|
842
|
+
// A release is keyed by document × locale × jurisdictions — no single-field business key, so the
|
|
843
|
+
// registry falls back to the indexed identity, as the publication variant beside it does.
|
|
844
|
+
identity: WorkbenchAspectIdentityKind.INDEXED,
|
|
845
|
+
edges: [],
|
|
846
|
+
},
|
|
430
847
|
];
|
|
431
848
|
const DESCRIPTOR_BY_ASPECT_KEY = new Map(WORKBENCH_ASPECT_DESCRIPTORS.map((descriptor) => [descriptor.aspectKey, descriptor]));
|
|
432
849
|
export function getWorkbenchAspectDescriptor(aspectKey) {
|