@unified-product-graph/core 0.12.3 → 0.12.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/index.cjs +329 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +52 -40
- package/dist/index.d.ts +52 -40
- package/dist/index.js +328 -37
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -954,6 +954,13 @@ var UPG_ENTITY_META = [
|
|
|
954
954
|
{ name: "workspace", type_id: "ent_328", maturity: "proposed", since: "0.2.0" },
|
|
955
955
|
{ name: "framework_exercise", type_id: "ent_350", maturity: "proposed", since: "0.8.4" }
|
|
956
956
|
];
|
|
957
|
+
var DEFERRED_PROPOSED_BY_CONTRACT = {
|
|
958
|
+
user_story: "UPG-571: frozen proposed by the v0.7.0 re-canon contract (story_statement to user_story); user-story-split.test.ts asserts the invariant.",
|
|
959
|
+
experiment_run: "UPG-664: the optional multi-run / replication child; experiment_plan graduated to stable, the run stays proposed.",
|
|
960
|
+
ai_experiment: "UPG-665: AI prompt/model restructure (open ADR).",
|
|
961
|
+
ai_dataset: "UPG-665: AI prompt/model restructure (open ADR).",
|
|
962
|
+
ai_trace: "UPG-665: AI prompt/model restructure (open ADR)."
|
|
963
|
+
};
|
|
957
964
|
var UPG_ENTITY_META_BY_NAME = new Map(
|
|
958
965
|
UPG_ENTITY_META.map((m) => [m.name, m])
|
|
959
966
|
);
|
|
@@ -3124,7 +3131,8 @@ var UPG_CROSS_EDGE_TYPES = [
|
|
|
3124
3131
|
"competitor_signal_surfaces_opportunity",
|
|
3125
3132
|
"competitor_classified_as_classification_value",
|
|
3126
3133
|
"node_classified_as_classification_value",
|
|
3127
|
-
"journey_phase_realises_operating_stage"
|
|
3134
|
+
"journey_phase_realises_operating_stage",
|
|
3135
|
+
"screen_markets_product"
|
|
3128
3136
|
];
|
|
3129
3137
|
var REGISTRY_PRODUCT_ID = "registry";
|
|
3130
3138
|
|
|
@@ -8428,6 +8436,288 @@ var UPG_SCALAR_TO_EDGE_MIGRATIONS = {
|
|
|
8428
8436
|
drop_scalar: true,
|
|
8429
8437
|
reason: "P14 shadow: the subscription_subscribes_to_pricing_tier edge already exists. Backfill the plan as a pricing_tier edge, then drop the name string."
|
|
8430
8438
|
}
|
|
8439
|
+
],
|
|
8440
|
+
"0.12.4": [
|
|
8441
|
+
// ── Bucket B — actor-as-string (ADDITIVE: add the ownership edge, KEEP the display string) ──
|
|
8442
|
+
// Per the scalar-vs-edge ADR display-cache rule (2026-06-16) and T3.1 (reuse the
|
|
8443
|
+
// polymorphic node_owned_by_* family; do NOT mint typed actor edges). `drop_scalar`
|
|
8444
|
+
// is FALSE for every entry: the string stays as a human-readable display-cache, and
|
|
8445
|
+
// the edge makes "everything owned by X" queryable across instances. OPT-IN — consumers
|
|
8446
|
+
// run promote_scalars_to_edges when they want the edges; nothing is forced on upgrade.
|
|
8447
|
+
// person-vs-team is the field-level call (ratified 2026-06-16): org units + durable
|
|
8448
|
+
// platform/components → team (9); work items, authored artifacts, and DRIs → person.
|
|
8449
|
+
// Two single-string participant fields (threat_model.participants, ceremony.participants)
|
|
8450
|
+
// are intentionally NOT here: a free-text name list cannot be promoted to one edge
|
|
8451
|
+
// without guessing — they are re-doc'd as display-cache only.
|
|
8452
|
+
// ── owned by a team (org units + durable platform/components) ──
|
|
8453
|
+
{
|
|
8454
|
+
from_type: "feature_area",
|
|
8455
|
+
scalar_property: "owner",
|
|
8456
|
+
target_type: "team",
|
|
8457
|
+
edge_type: "node_owned_by_team",
|
|
8458
|
+
drop_scalar: false,
|
|
8459
|
+
reason: 'P14 actor: a feature area is owned by a team; link node_owned_by_team so "everything this team owns" is queryable. Display string kept as a cache.'
|
|
8460
|
+
},
|
|
8461
|
+
{
|
|
8462
|
+
from_type: "bounded_context",
|
|
8463
|
+
scalar_property: "team_owner",
|
|
8464
|
+
target_type: "team",
|
|
8465
|
+
edge_type: "node_owned_by_team",
|
|
8466
|
+
drop_scalar: false,
|
|
8467
|
+
reason: "P14 actor: the owning team is a first-class entity; link node_owned_by_team. Display string kept as a cache."
|
|
8468
|
+
},
|
|
8469
|
+
{
|
|
8470
|
+
from_type: "service",
|
|
8471
|
+
scalar_property: "owner",
|
|
8472
|
+
target_type: "team",
|
|
8473
|
+
edge_type: "node_owned_by_team",
|
|
8474
|
+
drop_scalar: false,
|
|
8475
|
+
reason: "P14 actor: Backstage-style service ownership rolls up by team; link node_owned_by_team. Display string kept as a cache."
|
|
8476
|
+
},
|
|
8477
|
+
{
|
|
8478
|
+
from_type: "product_area",
|
|
8479
|
+
scalar_property: "owner",
|
|
8480
|
+
target_type: "team",
|
|
8481
|
+
edge_type: "node_owned_by_team",
|
|
8482
|
+
drop_scalar: false,
|
|
8483
|
+
reason: "P14 actor: a product area is an org unit owned by a team; link node_owned_by_team. Display string kept as a cache."
|
|
8484
|
+
},
|
|
8485
|
+
{
|
|
8486
|
+
from_type: "api_contract",
|
|
8487
|
+
scalar_property: "owner",
|
|
8488
|
+
target_type: "team",
|
|
8489
|
+
edge_type: "node_owned_by_team",
|
|
8490
|
+
drop_scalar: false,
|
|
8491
|
+
reason: "P14 actor: an API contract is a service-interface component owned by the team that owns the service (Backstage); link node_owned_by_team. Display string kept as a cache."
|
|
8492
|
+
},
|
|
8493
|
+
{
|
|
8494
|
+
from_type: "database_schema",
|
|
8495
|
+
scalar_property: "owner",
|
|
8496
|
+
target_type: "team",
|
|
8497
|
+
edge_type: "node_owned_by_team",
|
|
8498
|
+
drop_scalar: false,
|
|
8499
|
+
reason: "P14 actor: a database schema is a data component owned by the team responsible for it; link node_owned_by_team. Display string kept as a cache."
|
|
8500
|
+
},
|
|
8501
|
+
{
|
|
8502
|
+
from_type: "design_system",
|
|
8503
|
+
scalar_property: "maintainer",
|
|
8504
|
+
target_type: "team",
|
|
8505
|
+
edge_type: "node_owned_by_team",
|
|
8506
|
+
drop_scalar: false,
|
|
8507
|
+
reason: "P14 actor: a design system is a shared platform maintained by a team; link node_owned_by_team. Display string kept as a cache."
|
|
8508
|
+
},
|
|
8509
|
+
{
|
|
8510
|
+
from_type: "service_level_agreement",
|
|
8511
|
+
scalar_property: "owner",
|
|
8512
|
+
target_type: "team",
|
|
8513
|
+
edge_type: "node_owned_by_team",
|
|
8514
|
+
drop_scalar: false,
|
|
8515
|
+
reason: "P14 actor: an SLA is a service-provider-side commitment owned by a team; link node_owned_by_team. Display string kept as a cache."
|
|
8516
|
+
},
|
|
8517
|
+
{
|
|
8518
|
+
from_type: "key_activity",
|
|
8519
|
+
scalar_property: "operational_owner",
|
|
8520
|
+
target_type: "team",
|
|
8521
|
+
edge_type: "node_owned_by_team",
|
|
8522
|
+
drop_scalar: false,
|
|
8523
|
+
reason: "P14 actor: the operationally accountable owner of a recurring activity is a team; link node_owned_by_team. Display string kept as a cache."
|
|
8524
|
+
},
|
|
8525
|
+
// ── owned by a person (DRIs, work items, authored artifacts; the string is a name, handle, or email) ──
|
|
8526
|
+
{
|
|
8527
|
+
from_type: "strategic_theme",
|
|
8528
|
+
scalar_property: "owner",
|
|
8529
|
+
target_type: "person",
|
|
8530
|
+
edge_type: "node_owned_by_person",
|
|
8531
|
+
drop_scalar: false,
|
|
8532
|
+
reason: "P14 actor: the theme owner is a first-class person; link node_owned_by_person so cross-theme ownership is queryable. Display string kept."
|
|
8533
|
+
},
|
|
8534
|
+
{
|
|
8535
|
+
from_type: "initiative",
|
|
8536
|
+
scalar_property: "owner",
|
|
8537
|
+
target_type: "person",
|
|
8538
|
+
edge_type: "node_owned_by_person",
|
|
8539
|
+
drop_scalar: false,
|
|
8540
|
+
reason: "P14 actor: the initiative owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8541
|
+
},
|
|
8542
|
+
{
|
|
8543
|
+
from_type: "strategic_pillar",
|
|
8544
|
+
scalar_property: "owner",
|
|
8545
|
+
target_type: "person",
|
|
8546
|
+
edge_type: "node_owned_by_person",
|
|
8547
|
+
drop_scalar: false,
|
|
8548
|
+
reason: "P14 actor: the pillar owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8549
|
+
},
|
|
8550
|
+
{
|
|
8551
|
+
from_type: "metric",
|
|
8552
|
+
scalar_property: "owner",
|
|
8553
|
+
target_type: "person",
|
|
8554
|
+
edge_type: "node_owned_by_person",
|
|
8555
|
+
drop_scalar: false,
|
|
8556
|
+
reason: 'P14 actor: the metric owner is a first-class person ("every metric this person owns"); link node_owned_by_person. Display string kept.'
|
|
8557
|
+
},
|
|
8558
|
+
{
|
|
8559
|
+
from_type: "data_domain",
|
|
8560
|
+
scalar_property: "steward",
|
|
8561
|
+
target_type: "person",
|
|
8562
|
+
edge_type: "node_owned_by_person",
|
|
8563
|
+
drop_scalar: false,
|
|
8564
|
+
reason: "P14 actor: the data steward is a first-class person; link node_owned_by_person. Display string kept."
|
|
8565
|
+
},
|
|
8566
|
+
{
|
|
8567
|
+
from_type: "partnership",
|
|
8568
|
+
scalar_property: "owner",
|
|
8569
|
+
target_type: "person",
|
|
8570
|
+
edge_type: "node_owned_by_person",
|
|
8571
|
+
drop_scalar: false,
|
|
8572
|
+
reason: "P14 actor: the partnership owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8573
|
+
},
|
|
8574
|
+
{
|
|
8575
|
+
from_type: "key_resource",
|
|
8576
|
+
scalar_property: "owner",
|
|
8577
|
+
target_type: "person",
|
|
8578
|
+
edge_type: "node_owned_by_person",
|
|
8579
|
+
drop_scalar: false,
|
|
8580
|
+
reason: "P14 actor: the resource owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8581
|
+
},
|
|
8582
|
+
{
|
|
8583
|
+
from_type: "document",
|
|
8584
|
+
scalar_property: "author",
|
|
8585
|
+
target_type: "person",
|
|
8586
|
+
edge_type: "node_owned_by_person",
|
|
8587
|
+
drop_scalar: false,
|
|
8588
|
+
reason: 'P14 actor: the author is a first-class person ("every document by this author"); link node_owned_by_person. Display string kept.'
|
|
8589
|
+
},
|
|
8590
|
+
{
|
|
8591
|
+
from_type: "outcome",
|
|
8592
|
+
scalar_property: "owner",
|
|
8593
|
+
target_type: "person",
|
|
8594
|
+
edge_type: "node_owned_by_person",
|
|
8595
|
+
drop_scalar: false,
|
|
8596
|
+
reason: "P14 actor: the outcome owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8597
|
+
},
|
|
8598
|
+
{
|
|
8599
|
+
from_type: "feature",
|
|
8600
|
+
scalar_property: "owner",
|
|
8601
|
+
target_type: "person",
|
|
8602
|
+
edge_type: "node_owned_by_person",
|
|
8603
|
+
drop_scalar: false,
|
|
8604
|
+
reason: "P14 actor: the feature owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8605
|
+
},
|
|
8606
|
+
{
|
|
8607
|
+
from_type: "epic",
|
|
8608
|
+
scalar_property: "owner",
|
|
8609
|
+
target_type: "person",
|
|
8610
|
+
edge_type: "node_owned_by_person",
|
|
8611
|
+
drop_scalar: false,
|
|
8612
|
+
reason: "P14 actor: the epic owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8613
|
+
},
|
|
8614
|
+
{
|
|
8615
|
+
from_type: "release",
|
|
8616
|
+
scalar_property: "owner",
|
|
8617
|
+
target_type: "person",
|
|
8618
|
+
edge_type: "node_owned_by_person",
|
|
8619
|
+
drop_scalar: false,
|
|
8620
|
+
reason: "P14 actor: the release owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8621
|
+
},
|
|
8622
|
+
{
|
|
8623
|
+
from_type: "task",
|
|
8624
|
+
scalar_property: "assignee",
|
|
8625
|
+
target_type: "person",
|
|
8626
|
+
edge_type: "node_owned_by_person",
|
|
8627
|
+
drop_scalar: false,
|
|
8628
|
+
reason: 'P14 actor: the assignee is a first-class person ("every task assigned to this person"); link node_owned_by_person. Display string kept.'
|
|
8629
|
+
},
|
|
8630
|
+
{
|
|
8631
|
+
from_type: "bug",
|
|
8632
|
+
scalar_property: "assignee",
|
|
8633
|
+
target_type: "person",
|
|
8634
|
+
edge_type: "node_owned_by_person",
|
|
8635
|
+
drop_scalar: false,
|
|
8636
|
+
reason: "P14 actor: the assignee is a first-class person; link node_owned_by_person. Display string kept."
|
|
8637
|
+
},
|
|
8638
|
+
{
|
|
8639
|
+
from_type: "roadmap",
|
|
8640
|
+
scalar_property: "owner",
|
|
8641
|
+
target_type: "person",
|
|
8642
|
+
edge_type: "node_owned_by_person",
|
|
8643
|
+
drop_scalar: false,
|
|
8644
|
+
reason: "P14 actor: the roadmap owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8645
|
+
},
|
|
8646
|
+
{
|
|
8647
|
+
from_type: "journey_step",
|
|
8648
|
+
scalar_property: "owner",
|
|
8649
|
+
target_type: "person",
|
|
8650
|
+
edge_type: "node_owned_by_person",
|
|
8651
|
+
drop_scalar: false,
|
|
8652
|
+
reason: "P14 actor: the journey-step owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8653
|
+
},
|
|
8654
|
+
{
|
|
8655
|
+
from_type: "design_concept",
|
|
8656
|
+
scalar_property: "owner",
|
|
8657
|
+
target_type: "person",
|
|
8658
|
+
edge_type: "node_owned_by_person",
|
|
8659
|
+
drop_scalar: false,
|
|
8660
|
+
reason: "P14 actor: the design-concept owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8661
|
+
},
|
|
8662
|
+
{
|
|
8663
|
+
from_type: "technical_debt_item",
|
|
8664
|
+
scalar_property: "owner",
|
|
8665
|
+
target_type: "person",
|
|
8666
|
+
edge_type: "node_owned_by_person",
|
|
8667
|
+
drop_scalar: false,
|
|
8668
|
+
reason: "P14 actor: the debt-item owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8669
|
+
},
|
|
8670
|
+
{
|
|
8671
|
+
from_type: "feature_flag",
|
|
8672
|
+
scalar_property: "owner",
|
|
8673
|
+
target_type: "person",
|
|
8674
|
+
edge_type: "node_owned_by_person",
|
|
8675
|
+
drop_scalar: false,
|
|
8676
|
+
reason: "P14 actor: the flag owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8677
|
+
},
|
|
8678
|
+
{
|
|
8679
|
+
from_type: "deployment",
|
|
8680
|
+
scalar_property: "deployer",
|
|
8681
|
+
target_type: "person",
|
|
8682
|
+
edge_type: "node_owned_by_person",
|
|
8683
|
+
drop_scalar: false,
|
|
8684
|
+
reason: 'P14 actor: the deployer is a first-class person ("every deployment by this person"); link node_owned_by_person. Display string kept.'
|
|
8685
|
+
},
|
|
8686
|
+
{
|
|
8687
|
+
from_type: "investigation",
|
|
8688
|
+
scalar_property: "lead_investigator",
|
|
8689
|
+
target_type: "person",
|
|
8690
|
+
edge_type: "node_owned_by_person",
|
|
8691
|
+
drop_scalar: false,
|
|
8692
|
+
reason: "P14 actor: the lead investigator is a first-class person; link node_owned_by_person. Display string kept."
|
|
8693
|
+
},
|
|
8694
|
+
{
|
|
8695
|
+
from_type: "department",
|
|
8696
|
+
scalar_property: "leader",
|
|
8697
|
+
target_type: "person",
|
|
8698
|
+
edge_type: "node_owned_by_person",
|
|
8699
|
+
drop_scalar: false,
|
|
8700
|
+
reason: "P14 actor: the department leader is a first-class person; link node_owned_by_person. Display string kept."
|
|
8701
|
+
},
|
|
8702
|
+
// ── owned by people (multi: string[] of names) ──
|
|
8703
|
+
{
|
|
8704
|
+
from_type: "decision",
|
|
8705
|
+
scalar_property: "decision_makers",
|
|
8706
|
+
target_type: "person",
|
|
8707
|
+
edge_type: "node_owned_by_person",
|
|
8708
|
+
multi: true,
|
|
8709
|
+
drop_scalar: false,
|
|
8710
|
+
reason: "P14 actor: each decision-maker is a first-class person; one node_owned_by_person edge per name. Display list kept as a cache."
|
|
8711
|
+
},
|
|
8712
|
+
{
|
|
8713
|
+
from_type: "review_gate",
|
|
8714
|
+
scalar_property: "required_approvers",
|
|
8715
|
+
target_type: "person",
|
|
8716
|
+
edge_type: "node_owned_by_person",
|
|
8717
|
+
multi: true,
|
|
8718
|
+
drop_scalar: false,
|
|
8719
|
+
reason: "P14 actor: each required approver is a first-class person; one node_owned_by_person edge per name. Display list kept as a cache."
|
|
8720
|
+
}
|
|
8431
8721
|
]
|
|
8432
8722
|
};
|
|
8433
8723
|
function getScalarToEdgeMigrations(fromVersion, toVersion) {
|
|
@@ -9679,7 +9969,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9679
9969
|
spec_url: { type: "string", description: "URL of the specification document" },
|
|
9680
9970
|
protocol: { type: "string", enum: ["REST", "GraphQL", "gRPC", "AsyncAPI", "SOAP", "WebSocket", "MQTT", "SSE", "other"], description: "Communication protocol. `SSE` (server-sent events) added in 0.9.12." },
|
|
9681
9971
|
version: { type: "string", description: "API version" },
|
|
9682
|
-
owner: { type: "string", description: "Maintaining person or team." }
|
|
9972
|
+
owner: { type: "string", description: "Maintaining person or team. Promote to a `node_owned_by_team` edge if ownership must be queryable." }
|
|
9683
9973
|
},
|
|
9684
9974
|
// ApiEcosystemProperties: API ecosystem.
|
|
9685
9975
|
api_ecosystem: {
|
|
@@ -9760,7 +10050,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9760
10050
|
},
|
|
9761
10051
|
// BoundedContextProperties: DDD bounded context.
|
|
9762
10052
|
bounded_context: {
|
|
9763
|
-
team_owner: { type: "string", description: "Owning team" },
|
|
10053
|
+
team_owner: { type: "string", description: "Owning team. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
|
|
9764
10054
|
tech_stack: { type: "string[]", description: "Technologies used within this context" },
|
|
9765
10055
|
ubiquitous_language: { type: "string", description: "Key terms and their definitions" }
|
|
9766
10056
|
},
|
|
@@ -9849,7 +10139,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9849
10139
|
steps_to_reproduce: { type: "string", description: "Step-by-step reproduction" },
|
|
9850
10140
|
environment: { type: "string", description: 'Observed environment (e.g. "prod", "staging", "iOS 17.4")' },
|
|
9851
10141
|
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Urgency relative to other work. Independent of `bug_severity` (a critical bug can have low priority if rare)." },
|
|
9852
|
-
assignee: { type: "string", description: "Assigned person" },
|
|
10142
|
+
assignee: { type: "string", description: "Assigned person. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
9853
10143
|
due_date: { type: "string", description: "ISO date due. Often tied to a release gate or SLA." },
|
|
9854
10144
|
labels: { type: "string[]", description: "Free-form classification tags. Applied uniformly across work item types." }
|
|
9855
10145
|
},
|
|
@@ -9889,7 +10179,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9889
10179
|
ceremony_type: { type: "string", enum: ["standup", "planning", "review", "retro", "sync", "demo", "other"], description: "Kind of recurring meeting" },
|
|
9890
10180
|
cadence: { type: "string", enum: ["continuous", "hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "on_demand", "other"], description: "How often the ceremony occurs. Uses the shared `Cadence` scale." },
|
|
9891
10181
|
duration_minutes: { type: "number", description: "Typical duration of the meeting in minutes" },
|
|
9892
|
-
participants: { type: "string", description: "People or roles who attend" }
|
|
10182
|
+
participants: { type: "string", description: "People or roles who attend. Promote individuals to `node_owned_by_person` edges if participation must be queryable." }
|
|
9893
10183
|
},
|
|
9894
10184
|
// CertificationProperties: Certification.
|
|
9895
10185
|
certification: {
|
|
@@ -10219,7 +10509,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10219
10509
|
},
|
|
10220
10510
|
// DataDomainProperties: DataDomain. A coarse-grained grouping of related data assets (sources,
|
|
10221
10511
|
data_domain: {
|
|
10222
|
-
steward: { type: "string", description: "Accountable person or team" },
|
|
10512
|
+
steward: { type: "string", description: "Accountable person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
10223
10513
|
domain_type: { type: "string", enum: ["master", "operational", "analytical", "reference"], description: "Domain contents classification. `master` = canonical entity data (customers, products). `operational` = live transactional data. `analytical` = warehouse / BI data. `reference` = slow-changing lookup data." },
|
|
10224
10514
|
sensitivity: { type: "string", enum: ["public", "internal", "confidential", "restricted"], description: "Sensitivity band applied across the domain" }
|
|
10225
10515
|
},
|
|
@@ -10285,7 +10575,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10285
10575
|
db_type: { type: "string", enum: ["postgres", "mysql", "mongodb", "redis", "other"], description: "Engine" },
|
|
10286
10576
|
schema_version: { type: "string", description: "Current schema version" },
|
|
10287
10577
|
migration_status: { type: "string", enum: ["current", "pending", "failed"], description: "Pending-migration status" },
|
|
10288
|
-
owner: { type: "string", description: "Owning person or team responsible for design and migrations." },
|
|
10578
|
+
owner: { type: "string", description: "Owning person or team responsible for design and migrations. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
|
|
10289
10579
|
table_count: { type: "number", description: "Tables or collections in this schema. Useful for migration scope estimation." }
|
|
10290
10580
|
},
|
|
10291
10581
|
// DealProperties: Deal.
|
|
@@ -10303,7 +10593,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10303
10593
|
date: { type: "string", description: "ISO date the decision was made or last meaningfully updated." },
|
|
10304
10594
|
decision_outcome: { type: "string", description: "Outcome text. What was decided. Separate from `rationale` (which explains why)." },
|
|
10305
10595
|
consequences: { type: "string", description: `Known positive and negative consequences. Mirrors MADR's "Consequences" section.` },
|
|
10306
|
-
decision_makers: { type: "string[]", description:
|
|
10596
|
+
decision_makers: { type: "string[]", description: 'People who made the decision. Mirrors MADR\'s "Deciders" field. Promote to `node_owned_by_person` edges (one per name) if ownership must be queryable.' },
|
|
10307
10597
|
decision_drivers: { type: "string[]", description: `Forces, constraints, and goals that shaped the decision. Mirrors MADR's "Decision Drivers" section. @example ["must work offline", "team has no Go expertise", "cost < $500/mo"]` }
|
|
10308
10598
|
},
|
|
10309
10599
|
// DeliverableProperties: Deliverable.
|
|
@@ -10324,7 +10614,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10324
10614
|
headcount: { type: "number", description: "Total number of people in the department" },
|
|
10325
10615
|
budget: { type: "number", description: "Annual budget allocated to the department" },
|
|
10326
10616
|
department_mission: { type: "string", description: "Charter / purpose statement for the department" },
|
|
10327
|
-
leader: { type: "string", description: "Department leader (person or role reference)" },
|
|
10617
|
+
leader: { type: "string", description: "Department leader (person or role reference). Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
10328
10618
|
fiscal_year: { type: "string", description: "Fiscal year the headcount / budget numbers apply to" }
|
|
10329
10619
|
},
|
|
10330
10620
|
// DependencyProperties: Dependency entity.
|
|
@@ -10342,7 +10632,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10342
10632
|
deploy_status: { type: "string", enum: ["success", "failure", "rolling"], description: "Current status" },
|
|
10343
10633
|
sha: { type: "string", description: "Git SHA of the deployed commit" },
|
|
10344
10634
|
duration_seconds: { type: "number", description: "Wall-clock duration in seconds. Tracks deployment speed trends." },
|
|
10345
|
-
deployer: { type: "string", description: "Triggering person or system." }
|
|
10635
|
+
deployer: { type: "string", description: "Triggering person or system. Promote to a `node_owned_by_person` edge if ownership must be queryable." }
|
|
10346
10636
|
},
|
|
10347
10637
|
// DesignComponentProperties: Design system component.
|
|
10348
10638
|
design_component: {
|
|
@@ -10359,7 +10649,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10359
10649
|
rationale: { type: "string", description: "Selection or rejection rationale" },
|
|
10360
10650
|
concept_status: { type: "string", enum: ["exploring", "validated", "selected", "rejected"], description: "Current selection status" },
|
|
10361
10651
|
maturity: { type: "string", enum: ["sketch", "refined", "final"], description: "Development stage, from rough idea to presentation-ready" },
|
|
10362
|
-
owner: { type: "string", description: "Shepherding designer or researcher" }
|
|
10652
|
+
owner: { type: "string", description: "Shepherding designer or researcher. Promote to a `node_owned_by_person` edge if ownership must be queryable." }
|
|
10363
10653
|
},
|
|
10364
10654
|
// DesignGuidelineProperties: Design guideline.
|
|
10365
10655
|
design_guideline: {
|
|
@@ -10410,7 +10700,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10410
10700
|
design_system: {
|
|
10411
10701
|
version: { type: "string", description: "Current version" },
|
|
10412
10702
|
repo_path: { type: "string", description: "Code repository or package path" },
|
|
10413
|
-
maintainer: { type: "string", description: "Maintaining person or team" },
|
|
10703
|
+
maintainer: { type: "string", description: "Maintaining person or team. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
|
|
10414
10704
|
license: { type: "string", description: "Open-source license, if public" },
|
|
10415
10705
|
homepage_url: { type: "string", description: "Documentation homepage. Public-facing entry point." }
|
|
10416
10706
|
},
|
|
@@ -10473,7 +10763,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10473
10763
|
source_url: { type: "string", description: "Canonical retrievable URL" },
|
|
10474
10764
|
platform: { type: "string", enum: ["markdown", "notion", "figma", "google_docs", "confluence", "github", "linear", "other"], description: "Hosting platform" },
|
|
10475
10765
|
document_type: { type: "string", enum: ["vision", "plan", "decision", "research", "spec", "audit", "session", "feedback", "case-study", "narrative", "bug-report", "archive-collection", "rfc", "runbook", "guide", "onboarding", "brief", "report", "reference"], description: "Purpose classification" },
|
|
10476
|
-
author: { type: "string", description: "Author (free-form: name, email, or handle)" },
|
|
10766
|
+
author: { type: "string", description: "Author (free-form: name, email, or handle). Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
10477
10767
|
last_updated: { type: "string", description: "ISO 8601 last-meaningful-update" },
|
|
10478
10768
|
word_count: { type: "number", description: "Approximate word count. Useful for planning, indexing, summarisation." },
|
|
10479
10769
|
content_summary: { type: "string", description: "1\u20133 sentence summary. Drives previews, search snippets, embedding context." },
|
|
@@ -10511,7 +10801,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10511
10801
|
epic: {
|
|
10512
10802
|
estimate: { type: "string", description: 'Rough size estimate (e.g. "3 sprints", "L", "13 points")' },
|
|
10513
10803
|
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Task-level priority" },
|
|
10514
|
-
owner: { type: "string", description: "Responsible person or team" },
|
|
10804
|
+
owner: { type: "string", description: "Responsible person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
10515
10805
|
start_date: { type: "string", description: "ISO date work begins" },
|
|
10516
10806
|
target_date: { type: "string", description: "ISO date work completes" }
|
|
10517
10807
|
},
|
|
@@ -10691,7 +10981,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10691
10981
|
// FeatureProperties: A discrete, user-facing capability of the product.
|
|
10692
10982
|
feature: {
|
|
10693
10983
|
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Task-level priority" },
|
|
10694
|
-
owner: { type: "string", description: "Responsible person or team" },
|
|
10984
|
+
owner: { type: "string", description: "Responsible person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
10695
10985
|
start_date: { type: "string", description: "ISO date work begins" },
|
|
10696
10986
|
target_date: { type: "string", description: "ISO date work completes" },
|
|
10697
10987
|
health: { type: "string", enum: ["on_track", "at_risk", "off_track"], description: "Delivery health" }
|
|
@@ -10701,7 +10991,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10701
10991
|
scope_summary: { type: "string", description: "One-line scope description. Disambiguates from sibling areas at a glance." },
|
|
10702
10992
|
owning_team: { type: "string", description: "Team identifier or slug. Free-form display. Canonical relationship is the `team_owns_feature_area` edge." },
|
|
10703
10993
|
feature_count: { type: "number", description: "Approximate feature count under this area. Snapshot; `feature_area_contains_feature` edges are the source of truth.", modifier: "derived" },
|
|
10704
|
-
owner: { type: "string", description: "Area owner (handle or email)" },
|
|
10994
|
+
owner: { type: "string", description: "Area owner (handle or email). Promote to a `node_owned_by_team` edge if ownership must be queryable." },
|
|
10705
10995
|
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance to the product overall" },
|
|
10706
10996
|
maturity: { type: "string", enum: ["nascent", "growing", "mature", "legacy"], description: "Maturity. `nascent` = newly-formed grouping. `mature` = established surface. `legacy` = being phased out for a successor." },
|
|
10707
10997
|
area_status: { type: "string", enum: ["active", "planned", "deprecated"], description: "Status in the product structure" }
|
|
@@ -10712,7 +11002,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10712
11002
|
flag_status: { type: "string", enum: ["on", "off", "rollout"], description: "Activation state. `on` = enabled for all. `off` = disabled for all. `rollout` = partial via targeting_rules." },
|
|
10713
11003
|
rollout_pct: { type: "number", description: "Percentage enabled (0\u2013100). Meaningful when `flag_status === 'rollout'`." },
|
|
10714
11004
|
targeting_rules: { type: "string", description: "Human-readable targeting rules. Full rule evaluation happens in the flag service." },
|
|
10715
|
-
owner: { type: "string", description: "Owning person or team responsible for the flag's lifecycle." },
|
|
11005
|
+
owner: { type: "string", description: "Owning person or team responsible for the flag's lifecycle. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
10716
11006
|
flag_type: { type: "string", enum: ["temporary", "permanent", "experiment"], description: "Lifecycle classification. `temporary` = should be removed after rollout (kill switch, gradual rollout). `permanent` = long-lived feature gate (entitlement flag). `experiment` = A/B test with a defined end condition." },
|
|
10717
11007
|
expiry_date: { type: "string", description: "ISO date after which this flag should be cleaned up. A temporary flag without an `expiry_date` is a code smell." },
|
|
10718
11008
|
created_date: { type: "string", description: "Creation date. Useful for flag age and stale-flag detection." }
|
|
@@ -10951,7 +11241,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10951
11241
|
start_date: { type: "string", description: 'ISO start date. @example "2026-04-01"' },
|
|
10952
11242
|
end_date: { type: "string", description: 'ISO end date. @example "2026-09-30"' },
|
|
10953
11243
|
budget: { type: "number", description: "Budget allocated (base currency units)" },
|
|
10954
|
-
owner: { type: "string", description: "Owning person or team" }
|
|
11244
|
+
owner: { type: "string", description: "Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." }
|
|
10955
11245
|
},
|
|
10956
11246
|
// InsightProperties: Unified insight, synthesised from evidence and observations.
|
|
10957
11247
|
insight: {
|
|
@@ -11020,7 +11310,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11020
11310
|
findings: { type: "string", description: "Findings discovered so far" },
|
|
11021
11311
|
started_at: { type: "string", description: "ISO timestamp the investigation began" },
|
|
11022
11312
|
resolved_at: { type: "string", description: "ISO timestamp the investigation was concluded. Pairs with `status === 'resolved' | 'abandoned'`." },
|
|
11023
|
-
lead_investigator: { type: "string", description: "Lead investigator (email or handle). Distinct from the team owning the affected service." },
|
|
11313
|
+
lead_investigator: { type: "string", description: "Lead investigator (email or handle). Distinct from the team owning the affected service. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
11024
11314
|
session_id: { type: "string", description: "Originating session" },
|
|
11025
11315
|
category: { type: "string", enum: ["performance", "security", "data_quality", "reliability", "cost", "compliance", "other"], description: "Kind of issue under investigation. Distinct from `RootCauseProperties.cause_category`, which captures *why something went wrong*." }
|
|
11026
11316
|
},
|
|
@@ -11150,7 +11440,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11150
11440
|
required: ["value", "label"]
|
|
11151
11441
|
},
|
|
11152
11442
|
thought: { type: "string", description: "What the user is thinking" },
|
|
11153
|
-
owner: { type: "string", description: "Responsible owner" }
|
|
11443
|
+
owner: { type: "string", description: "Responsible owner. Promote to a `node_owned_by_person` edge if ownership must be queryable." }
|
|
11154
11444
|
},
|
|
11155
11445
|
// KeyActivityProperties: KeyActivity.
|
|
11156
11446
|
key_activity: {
|
|
@@ -11159,7 +11449,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11159
11449
|
frequency_count: { type: "number", description: "Exact count of runs in the period. Pairs with `frequency_period`." },
|
|
11160
11450
|
frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
|
|
11161
11451
|
frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative tier. Use when an exact rate is unknown." },
|
|
11162
|
-
operational_owner: { type: "string", description: "Operationally accountable team or individual" },
|
|
11452
|
+
operational_owner: { type: "string", description: "Operationally accountable team or individual. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
|
|
11163
11453
|
capacity_constraint: { type: "string", description: "Bottleneck or scaling constraint" },
|
|
11164
11454
|
automation_level: { type: "string", enum: ["manual", "assisted", "automated"], description: "How much runs without human intervention" }
|
|
11165
11455
|
},
|
|
@@ -11167,7 +11457,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11167
11457
|
key_resource: {
|
|
11168
11458
|
resource_type: { type: "string", enum: ["physical", "intellectual", "human", "financial"], description: "Category" },
|
|
11169
11459
|
criticality: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Criticality to the business model" },
|
|
11170
|
-
owner: { type: "string", description: "Accountable person or team" },
|
|
11460
|
+
owner: { type: "string", description: "Accountable person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
11171
11461
|
scarcity_risk: {
|
|
11172
11462
|
type: "assessment",
|
|
11173
11463
|
scale_id: "severity_5",
|
|
@@ -11356,7 +11646,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11356
11646
|
range_min: { type: "number", description: "Minimum expected or baseline value" },
|
|
11357
11647
|
range_max: { type: "number", description: "Maximum expected or ceiling value" },
|
|
11358
11648
|
cadence: { type: "string", enum: ["continuous", "hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "on_demand", "other"], description: "Measurement cadence. Canonical `Cadence` since v0.4.0. `'realtime'` migrates to `'continuous'`; all other values 1:1." },
|
|
11359
|
-
owner: { type: "string", description: "Person or team responsible for tracking this metric" },
|
|
11649
|
+
owner: { type: "string", description: "Person or team responsible for tracking this metric. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
11360
11650
|
metric_health: { type: "string", enum: ["healthy", "at_risk", "unhealthy", "unknown"], description: "Universal health rollup. Orthogonal to lifecycle and `guardrail_status`. Applies to every metric regardless of `designation`. `healthy` = trending well against target / inside safe range. `at_risk` = drifting, approaching breach or target shortfall. `unhealthy` = missed target or breached; action needed. `unknown` = no current reading or not yet measured. For guardrails specifically, `guardrail_status` remains the breach-specific signal (`safe`/`warning`/`breached`)." },
|
|
11361
11651
|
guardrail_threshold_min: { type: "number", description: "Lower bound for guardrail safety (below this = breach)" },
|
|
11362
11652
|
guardrail_threshold_max: { type: "number", description: "Upper bound for guardrail safety (above this = breach)" },
|
|
@@ -11543,7 +11833,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11543
11833
|
// OutcomeProperties: A measurable change in user or business state the product drives.
|
|
11544
11834
|
outcome: {
|
|
11545
11835
|
timeline: { type: "string", description: 'Target timeframe (e.g. "Q2 2026", "12 months")' },
|
|
11546
|
-
owner: { type: "string", description: "Accountable person or team" },
|
|
11836
|
+
owner: { type: "string", description: "Accountable person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
11547
11837
|
success_criteria: { type: "string", description: 'What "achieved" looks like, concretely. Pairs with `measurement_method`. @example "30-day retention above 40% for new signups"' },
|
|
11548
11838
|
measurement_method: { type: "string", enum: ["quantitative", "qualitative", "mixed"], description: "Assessment approach. `quantitative` = metrics drive the call. `qualitative` = observation / interviews. `mixed` = both, weighted case-by-case." },
|
|
11549
11839
|
current_state: { type: "string", description: "Baseline or latest read" },
|
|
@@ -11602,7 +11892,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11602
11892
|
},
|
|
11603
11893
|
required: ["value", "label"]
|
|
11604
11894
|
},
|
|
11605
|
-
owner: { type: "string", description: "Internal owner" },
|
|
11895
|
+
owner: { type: "string", description: "Internal owner. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
11606
11896
|
start_date: { type: "string", description: "Date the partnership became effective (ISO 8601)" }
|
|
11607
11897
|
},
|
|
11608
11898
|
// PaywallProperties: Paywall.
|
|
@@ -11730,7 +12020,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11730
12020
|
product_area: {
|
|
11731
12021
|
strategic_priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Strategic priority assigned to this area" },
|
|
11732
12022
|
description: { type: "string", description: "Narrative description of what this area covers" },
|
|
11733
|
-
owner: { type: "string", description: "Person or team that owns this area" }
|
|
12023
|
+
owner: { type: "string", description: "Person or team that owns this area. Promote to a `node_owned_by_team` edge if ownership must be queryable." }
|
|
11734
12024
|
},
|
|
11735
12025
|
// ProgramProperties: Program.
|
|
11736
12026
|
program: {
|
|
@@ -11841,7 +12131,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11841
12131
|
release_date: { type: "string", description: "Scheduled or actual release date (ISO)" },
|
|
11842
12132
|
version: { type: "string", description: 'Semver or named version (e.g. "v2.1.0", "Beta 3")' },
|
|
11843
12133
|
start_date: { type: "string", description: "ISO date work begins" },
|
|
11844
|
-
owner: { type: "string", description: "Responsible person or team" }
|
|
12134
|
+
owner: { type: "string", description: "Responsible person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." }
|
|
11845
12135
|
},
|
|
11846
12136
|
// ReleaseStrategyProperties: Release strategy.
|
|
11847
12137
|
release_strategy: {
|
|
@@ -11902,7 +12192,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11902
12192
|
// ReviewGateProperties: Review gate.
|
|
11903
12193
|
review_gate: {
|
|
11904
12194
|
gate_type: { type: "string", enum: ["human_review", "automated_check", "approval"], description: "Kind of review required at this gate" },
|
|
11905
|
-
required_approvers: { type: "string[]", description: "People or roles that must approve" },
|
|
12195
|
+
required_approvers: { type: "string[]", description: "People or roles that must approve. Promote to `node_owned_by_person` edges (one per name) if ownership must be queryable." },
|
|
11906
12196
|
gate_status: { type: "string", enum: ["pending", "approved", "rejected", "bypassed"], description: "Current approval status of the gate" }
|
|
11907
12197
|
},
|
|
11908
12198
|
// RiskProperties: Risk.
|
|
@@ -11942,7 +12232,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11942
12232
|
roadmap: {
|
|
11943
12233
|
roadmap_type: { type: "string", enum: ["now_next_later", "quarterly", "release_based", "theme_based"], description: "Structure" },
|
|
11944
12234
|
timeframe: { type: "string", description: "Covered timeframe" },
|
|
11945
|
-
owner: { type: "string", description: "Owning person or team" }
|
|
12235
|
+
owner: { type: "string", description: "Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." }
|
|
11946
12236
|
},
|
|
11947
12237
|
// RoadmapItemProperties: Roadmap item.
|
|
11948
12238
|
roadmap_item: {
|
|
@@ -12082,7 +12372,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12082
12372
|
service: {
|
|
12083
12373
|
service_type: { type: "string", enum: ["web", "api", "worker", "db", "queue", "library", "mobile", "docs", "lambda", "cli"], description: "Functional classification. Expanded from Backstage's component type vocabulary. `cli` added in 0.9.12." },
|
|
12084
12374
|
tech_stack: { type: "string[]", description: 'Technologies used (e.g. ["TypeScript", "Postgres", "Redis"])' },
|
|
12085
|
-
owner: { type: "string", description: "Owning person or team. Backstage marks this required; strongly recommended." },
|
|
12375
|
+
owner: { type: "string", description: "Owning person or team. Backstage marks this required; strongly recommended. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
|
|
12086
12376
|
lifecycle: { type: "string", enum: ["experimental", "production", "deprecated"], description: 'Service maturity. Answers "how mature is it?". `experimental` = early-stage. `production` = battle-tested. `deprecated` = being phased out.' },
|
|
12087
12377
|
tags: { type: "string[]", description: 'Free-form filter tags (e.g. ["payments", "critical-path", "team-alpha"]).' },
|
|
12088
12378
|
links: { type: "object[]", description: "Named URLs for documentation, dashboards, runbooks." }
|
|
@@ -12103,7 +12393,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12103
12393
|
agreement_term: { type: "string", description: 'Effective term of the agreement (e.g. "12 months", "auto-renewing annual")' },
|
|
12104
12394
|
effective_date: { type: "string", description: "ISO date effective" },
|
|
12105
12395
|
expiry_date: { type: "string", description: "ISO date expires. Pairs with `agreement_term` for renewal logic." },
|
|
12106
|
-
owner: { type: "string", description: "Party accountable on the service provider side" },
|
|
12396
|
+
owner: { type: "string", description: "Party accountable on the service provider side. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
|
|
12107
12397
|
consequence_of_breach: { type: "string", description: "What happens if the SLA is breached (credits, penalties, escalation path)" }
|
|
12108
12398
|
},
|
|
12109
12399
|
// ServiceLevelIndicatorProperties: Service Level Indicator.
|
|
@@ -12250,7 +12540,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12250
12540
|
},
|
|
12251
12541
|
// StrategicPillarProperties: StrategicPillar entity. Durable multi-year direction the product commits to.
|
|
12252
12542
|
strategic_pillar: {
|
|
12253
|
-
owner: { type: "string", description: "Owning person or team" },
|
|
12543
|
+
owner: { type: "string", description: "Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
12254
12544
|
description: { type: "string", description: "Narrative of the pillar's intent" },
|
|
12255
12545
|
scope: { type: "string", description: "What this pillar covers" },
|
|
12256
12546
|
time_horizon: { type: "string", description: 'Planning horizon. Typically multi-year. @example "3 years", "2026-2028"' },
|
|
@@ -12258,7 +12548,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12258
12548
|
},
|
|
12259
12549
|
// StrategicThemeProperties: StrategicTheme entity.
|
|
12260
12550
|
strategic_theme: {
|
|
12261
|
-
owner: { type: "string", description: "Owning person or team" },
|
|
12551
|
+
owner: { type: "string", description: "Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
12262
12552
|
time_horizon: { type: "string", description: 'Planning horizon. @example "Q1 2026", "FY26"' },
|
|
12263
12553
|
description: { type: "string", description: "Short narrative of what the theme is about" },
|
|
12264
12554
|
scope: { type: "string", description: "What the theme explicitly includes or excludes" }
|
|
@@ -12351,7 +12641,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12351
12641
|
},
|
|
12352
12642
|
// TaskProperties: Task: a discrete unit of work, smaller than a story.
|
|
12353
12643
|
task: {
|
|
12354
|
-
assignee: { type: "string", description: "Assigned person" },
|
|
12644
|
+
assignee: { type: "string", description: "Assigned person. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
12355
12645
|
effort: { type: "string", description: 'Effort estimate (e.g. "2h", "1d", "3 points"). Use a consistent unit within your team.' },
|
|
12356
12646
|
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Relative importance against other tasks" },
|
|
12357
12647
|
due_date: { type: "string", description: "ISO date due. Typically bounded by the containing story's due date." },
|
|
@@ -12397,7 +12687,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12397
12687
|
},
|
|
12398
12688
|
required: ["value", "label"]
|
|
12399
12689
|
},
|
|
12400
|
-
owner: { type: "string", description: "Owning person or team responsible for paydown." },
|
|
12690
|
+
owner: { type: "string", description: "Owning person or team responsible for paydown. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
12401
12691
|
affected_area: { type: "string", description: 'Codebase location, service, or module. @example "apps/graph/src/canvas/", "UserService", "auth module"' },
|
|
12402
12692
|
interest: { type: "string", description: 'Ongoing cost of leaving it unresolved (the "interest" in the financial metaphor). @example "~2h/sprint of workarounds", "blocks type-safe refactor of checkout"' },
|
|
12403
12693
|
intentionality: { type: "string", enum: ["deliberate", "inadvertent"], description: "Origin of the debt. `deliberate` = conscious decision to ship something imperfect (prudent or reckless). `inadvertent` = discovered after the fact. Based on Fowler's Technical Debt Quadrant." }
|
|
@@ -12505,7 +12795,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12505
12795
|
methodology: { type: "string", enum: ["stride", "dread", "pasta", "attack_tree", "other"], description: 'Methodology. `stride` = Spoofing, Tampering, Repudiation, Information Disclosure, DoS, Elevation of Privilege (OWASP standard). `dread` = Damage, Reproducibility, Exploitability, Affected users, Discoverability (numeric scoring). `pasta` = Process for Attack Simulation and Threat Analysis (7-stage). `attack_tree` = hierarchical tree of attack paths. @example "stride" is the most widely used methodology for web applications' },
|
|
12506
12796
|
scope: { type: "string", description: 'What system, feature, or data flow is being analysed. @example "user authentication", "payment processing", "admin API"' },
|
|
12507
12797
|
last_reviewed: { type: "string", description: 'ISO date last reviewed. Models become stale as systems evolve. @example "2026-03-01"' },
|
|
12508
|
-
participants: { type: "string", description: 'Participants in the exercise. @example "Alice Chen (security lead), Bob Park (backend engineer), Carol Liu (architect)"' },
|
|
12798
|
+
participants: { type: "string", description: 'Participants in the exercise. @example "Alice Chen (security lead), Bob Park (backend engineer), Carol Liu (architect)". Promote individuals to `node_owned_by_person` edges if participation must be queryable.' },
|
|
12509
12799
|
threat_count: { type: "number", description: "Threats identified. Key metric for scope and completeness. @example 12" }
|
|
12510
12800
|
},
|
|
12511
12801
|
// TouchpointProperties: Customer touchpoint.
|
|
@@ -28932,7 +29222,7 @@ function isCanonical(text) {
|
|
|
28932
29222
|
}
|
|
28933
29223
|
|
|
28934
29224
|
// src/index.ts
|
|
28935
|
-
var UPG_VERSION = "0.12.
|
|
29225
|
+
var UPG_VERSION = "0.12.5";
|
|
28936
29226
|
var UPG_FORMAT_VERSION = "0.4.0";
|
|
28937
29227
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
28938
29228
|
var UPG_TYPES = getTypes();
|
|
@@ -29003,6 +29293,7 @@ export {
|
|
|
29003
29293
|
CLASSIFICATION_EDGE_PROPERTY_SCHEMA,
|
|
29004
29294
|
CONTENT_DEPTH_WARNING_RULES,
|
|
29005
29295
|
DEFAULT_ENTITY_EMOJI,
|
|
29296
|
+
DEFERRED_PROPOSED_BY_CONTRACT,
|
|
29006
29297
|
DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK,
|
|
29007
29298
|
ENGINEERING_PLATFORM_PLAYBOOK,
|
|
29008
29299
|
ENTITY_EMOJI,
|