@unified-product-graph/core 0.12.5 → 0.12.7
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 +43 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -2
- package/dist/index.d.ts +16 -2
- package/dist/index.js +43 -15
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -1633,6 +1633,13 @@ declare const UPG_EDGE_CATALOG: {
|
|
|
1633
1633
|
source_type: string;
|
|
1634
1634
|
target_type: string;
|
|
1635
1635
|
};
|
|
1636
|
+
product_expresses_brand_identity: {
|
|
1637
|
+
forward_verb: string;
|
|
1638
|
+
reverse_verb: string;
|
|
1639
|
+
classification: "semantic";
|
|
1640
|
+
source_type: string;
|
|
1641
|
+
target_type: string;
|
|
1642
|
+
};
|
|
1636
1643
|
design_system_encompasses_user_journey: {
|
|
1637
1644
|
forward_verb: string;
|
|
1638
1645
|
reverse_verb: string;
|
|
@@ -1710,6 +1717,13 @@ declare const UPG_EDGE_CATALOG: {
|
|
|
1710
1717
|
source_type: string;
|
|
1711
1718
|
target_type: string;
|
|
1712
1719
|
};
|
|
1720
|
+
screen_markets_product: {
|
|
1721
|
+
forward_verb: string;
|
|
1722
|
+
reverse_verb: string;
|
|
1723
|
+
classification: "semantic";
|
|
1724
|
+
source_type: string;
|
|
1725
|
+
target_type: string;
|
|
1726
|
+
};
|
|
1713
1727
|
screen_navigates_to_screen: {
|
|
1714
1728
|
forward_verb: string;
|
|
1715
1729
|
reverse_verb: string;
|
|
@@ -7482,7 +7496,7 @@ interface UPGProduct {
|
|
|
7482
7496
|
/** Product lifecycle stages. Covers the full arc from napkin idea to end-of-life. */
|
|
7483
7497
|
type UPGProductStage = 'concept' | 'validation' | 'build' | 'beta' | 'launch' | 'growth' | 'mature' | 'maintenance' | 'sunset';
|
|
7484
7498
|
/** The set of valid cross-product relationship types */
|
|
7485
|
-
type UPGCrossEdgeType = 'shares_persona' | 'shares_competitor' | 'shares_metric' | 'depends_on_product' | 'cannibalises' | 'succeeds' | 'hosts' | 'contributes_to' | 'instance_of' | 'area_serves_persona' | 'area_targets_market_segment' | 'rolls_up_to' | 'product_implements_specification' | 'product_exposes_specification' | 'feature_conforms_to_specification' | 'api_contract_speaks_specification' | 'product_exposes_primitive' | 'feature_manipulates_primitive' | 'primitive_stored_as_data_type' | 'feature_rivals_competitor_feature' | 'competitor_signal_maps_to_feature' | 'competitor_signal_surfaces_opportunity' | 'competitor_classified_as_classification_value' | 'node_classified_as_classification_value' | 'journey_phase_realises_operating_stage' | 'screen_markets_product';
|
|
7499
|
+
type UPGCrossEdgeType = 'shares_persona' | 'shares_competitor' | 'shares_metric' | 'depends_on_product' | 'cannibalises' | 'succeeds' | 'hosts' | 'contributes_to' | 'instance_of' | 'area_serves_persona' | 'area_targets_market_segment' | 'rolls_up_to' | 'product_implements_specification' | 'product_exposes_specification' | 'feature_conforms_to_specification' | 'api_contract_speaks_specification' | 'product_exposes_primitive' | 'feature_manipulates_primitive' | 'primitive_stored_as_data_type' | 'feature_rivals_competitor_feature' | 'competitor_signal_maps_to_feature' | 'competitor_signal_surfaces_opportunity' | 'competitor_classified_as_classification_value' | 'node_classified_as_classification_value' | 'journey_phase_realises_operating_stage' | 'screen_markets_product' | 'screen_renders_design_component' | 'product_expresses_brand_identity';
|
|
7486
7500
|
/**
|
|
7487
7501
|
* Runtime-checkable list of valid cross-product edge types. Mirrors
|
|
7488
7502
|
* `UPGCrossEdgeType` for use in validators and writers that need to test
|
|
@@ -21834,7 +21848,7 @@ declare function isCanonical(text: string): boolean;
|
|
|
21834
21848
|
* it stamps the `upg_version` field of every `.upg` file written by the SDK.
|
|
21835
21849
|
* The `check:version-lockstep` gate enforces this at release time.
|
|
21836
21850
|
*/
|
|
21837
|
-
declare const UPG_VERSION: "0.12.
|
|
21851
|
+
declare const UPG_VERSION: "0.12.7";
|
|
21838
21852
|
/**
|
|
21839
21853
|
* The `.upg` JSON document format version. Written to the `upg_version` field.
|
|
21840
21854
|
* Evolves independently from `UPG_VERSION` (the catalogue version).
|
package/dist/index.d.ts
CHANGED
|
@@ -1633,6 +1633,13 @@ declare const UPG_EDGE_CATALOG: {
|
|
|
1633
1633
|
source_type: string;
|
|
1634
1634
|
target_type: string;
|
|
1635
1635
|
};
|
|
1636
|
+
product_expresses_brand_identity: {
|
|
1637
|
+
forward_verb: string;
|
|
1638
|
+
reverse_verb: string;
|
|
1639
|
+
classification: "semantic";
|
|
1640
|
+
source_type: string;
|
|
1641
|
+
target_type: string;
|
|
1642
|
+
};
|
|
1636
1643
|
design_system_encompasses_user_journey: {
|
|
1637
1644
|
forward_verb: string;
|
|
1638
1645
|
reverse_verb: string;
|
|
@@ -1710,6 +1717,13 @@ declare const UPG_EDGE_CATALOG: {
|
|
|
1710
1717
|
source_type: string;
|
|
1711
1718
|
target_type: string;
|
|
1712
1719
|
};
|
|
1720
|
+
screen_markets_product: {
|
|
1721
|
+
forward_verb: string;
|
|
1722
|
+
reverse_verb: string;
|
|
1723
|
+
classification: "semantic";
|
|
1724
|
+
source_type: string;
|
|
1725
|
+
target_type: string;
|
|
1726
|
+
};
|
|
1713
1727
|
screen_navigates_to_screen: {
|
|
1714
1728
|
forward_verb: string;
|
|
1715
1729
|
reverse_verb: string;
|
|
@@ -7482,7 +7496,7 @@ interface UPGProduct {
|
|
|
7482
7496
|
/** Product lifecycle stages. Covers the full arc from napkin idea to end-of-life. */
|
|
7483
7497
|
type UPGProductStage = 'concept' | 'validation' | 'build' | 'beta' | 'launch' | 'growth' | 'mature' | 'maintenance' | 'sunset';
|
|
7484
7498
|
/** The set of valid cross-product relationship types */
|
|
7485
|
-
type UPGCrossEdgeType = 'shares_persona' | 'shares_competitor' | 'shares_metric' | 'depends_on_product' | 'cannibalises' | 'succeeds' | 'hosts' | 'contributes_to' | 'instance_of' | 'area_serves_persona' | 'area_targets_market_segment' | 'rolls_up_to' | 'product_implements_specification' | 'product_exposes_specification' | 'feature_conforms_to_specification' | 'api_contract_speaks_specification' | 'product_exposes_primitive' | 'feature_manipulates_primitive' | 'primitive_stored_as_data_type' | 'feature_rivals_competitor_feature' | 'competitor_signal_maps_to_feature' | 'competitor_signal_surfaces_opportunity' | 'competitor_classified_as_classification_value' | 'node_classified_as_classification_value' | 'journey_phase_realises_operating_stage' | 'screen_markets_product';
|
|
7499
|
+
type UPGCrossEdgeType = 'shares_persona' | 'shares_competitor' | 'shares_metric' | 'depends_on_product' | 'cannibalises' | 'succeeds' | 'hosts' | 'contributes_to' | 'instance_of' | 'area_serves_persona' | 'area_targets_market_segment' | 'rolls_up_to' | 'product_implements_specification' | 'product_exposes_specification' | 'feature_conforms_to_specification' | 'api_contract_speaks_specification' | 'product_exposes_primitive' | 'feature_manipulates_primitive' | 'primitive_stored_as_data_type' | 'feature_rivals_competitor_feature' | 'competitor_signal_maps_to_feature' | 'competitor_signal_surfaces_opportunity' | 'competitor_classified_as_classification_value' | 'node_classified_as_classification_value' | 'journey_phase_realises_operating_stage' | 'screen_markets_product' | 'screen_renders_design_component' | 'product_expresses_brand_identity';
|
|
7486
7500
|
/**
|
|
7487
7501
|
* Runtime-checkable list of valid cross-product edge types. Mirrors
|
|
7488
7502
|
* `UPGCrossEdgeType` for use in validators and writers that need to test
|
|
@@ -21834,7 +21848,7 @@ declare function isCanonical(text: string): boolean;
|
|
|
21834
21848
|
* it stamps the `upg_version` field of every `.upg` file written by the SDK.
|
|
21835
21849
|
* The `check:version-lockstep` gate enforces this at release time.
|
|
21836
21850
|
*/
|
|
21837
|
-
declare const UPG_VERSION: "0.12.
|
|
21851
|
+
declare const UPG_VERSION: "0.12.7";
|
|
21838
21852
|
/**
|
|
21839
21853
|
* The `.upg` JSON document format version. Written to the `upg_version` field.
|
|
21840
21854
|
* Evolves independently from `UPG_VERSION` (the catalogue version).
|
package/dist/index.js
CHANGED
|
@@ -578,7 +578,7 @@ var UPG_ENTITY_META = [
|
|
|
578
578
|
// (method / success_criteria / sample_size) when `test_plan` re-homed to the
|
|
579
579
|
// QA/testing domain (UPG-678).
|
|
580
580
|
{ name: "experiment_plan", type_id: "ent_340", maturity: "stable", since: "0.2.6" },
|
|
581
|
-
{ name: "experiment_run", type_id: "ent_341", maturity: "
|
|
581
|
+
{ name: "experiment_run", type_id: "ent_341", maturity: "stable", since: "0.2.6" },
|
|
582
582
|
{ name: "learning", type_id: "ent_029", maturity: "stable", since: "0.1.0" },
|
|
583
583
|
// test_plan re-homed validation → testing/QA (UPG-678). It is the QA
|
|
584
584
|
// verification-procedure plan (test scope / environments / pass criteria);
|
|
@@ -666,7 +666,7 @@ var UPG_ENTITY_META = [
|
|
|
666
666
|
// asserts `proposed` as the post-re-canon invariant. Graduating here would
|
|
667
667
|
// break that contract; promotion is a separate, ticketed decision once the
|
|
668
668
|
// story_statement → user_story migration has fully aged out.
|
|
669
|
-
{ name: "user_story", type_id: "ent_073", maturity: "
|
|
669
|
+
{ name: "user_story", type_id: "ent_073", maturity: "stable", since: "0.1.0" },
|
|
670
670
|
{ name: "story_statement", type_id: "ent_342", maturity: "deprecated", since: "0.2.7", deprecated_in: "0.7.0", replacement: "user_story" },
|
|
671
671
|
{ name: "story_task", type_id: "ent_343", maturity: "deprecated", since: "0.2.7", deprecated_in: "0.4.0", replacement: "task" },
|
|
672
672
|
{ name: "acceptance_criterion", type_id: "ent_074", maturity: "stable", since: "0.1.0" },
|
|
@@ -955,8 +955,9 @@ var UPG_ENTITY_META = [
|
|
|
955
955
|
{ name: "framework_exercise", type_id: "ent_350", maturity: "proposed", since: "0.8.4" }
|
|
956
956
|
];
|
|
957
957
|
var DEFERRED_PROPOSED_BY_CONTRACT = {
|
|
958
|
-
user_story
|
|
959
|
-
|
|
958
|
+
// user_story (UPG-571) and experiment_run (UPG-664) graduated to stable in
|
|
959
|
+
// 0.12.6 — Captain lifted both freezes ("we are using them"). Their contracts
|
|
960
|
+
// are settled; they are now stable, not deferred.
|
|
960
961
|
ai_experiment: "UPG-665: AI prompt/model restructure (open ADR).",
|
|
961
962
|
ai_dataset: "UPG-665: AI prompt/model restructure (open ADR).",
|
|
962
963
|
ai_trace: "UPG-665: AI prompt/model restructure (open ADR)."
|
|
@@ -1443,6 +1444,11 @@ var UPG_EDGE_CATALOG = {
|
|
|
1443
1444
|
design_system_defines_design_token: { forward_verb: "defines", reverse_verb: "defined_in", classification: "hierarchy", source_type: "design_system", target_type: "design_token" },
|
|
1444
1445
|
design_system_codified_in_design_guideline: { forward_verb: "codified_in", reverse_verb: "codifies", classification: "hierarchy", source_type: "design_system", target_type: "design_guideline" },
|
|
1445
1446
|
design_system_expresses_brand_identity: { forward_verb: "expresses", reverse_verb: "expressed_in", classification: "hierarchy", source_type: "design_system", target_type: "brand_identity" },
|
|
1447
|
+
// Product expresses the brand (0.12.7, UPG-698). A product references the shared
|
|
1448
|
+
// brand_identity. Dual-registered: also a cross-edge for the common case where the
|
|
1449
|
+
// brand is a registry singleton in another graph (the ratified pattern: brand is a
|
|
1450
|
+
// singleton expressed, not instance_of-d); this catalog entry is the within-graph case.
|
|
1451
|
+
product_expresses_brand_identity: { forward_verb: "expresses", reverse_verb: "expressed_by", classification: "semantic", source_type: "product", target_type: "brand_identity" },
|
|
1446
1452
|
design_system_encompasses_user_journey: { forward_verb: "encompasses", reverse_verb: "encompassed_in", classification: "hierarchy", source_type: "design_system", target_type: "user_journey" },
|
|
1447
1453
|
design_system_encompasses_user_flow: { forward_verb: "encompasses", reverse_verb: "encompassed_in", classification: "hierarchy", source_type: "design_system", target_type: "user_flow" },
|
|
1448
1454
|
design_system_informed_by_insight: { forward_verb: "informed_by", reverse_verb: "informs", classification: "hierarchy", source_type: "design_system", target_type: "insight" },
|
|
@@ -1455,6 +1461,11 @@ var UPG_EDGE_CATALOG = {
|
|
|
1455
1461
|
design_component_composes_design_component: { forward_verb: "composes", reverse_verb: "composed_in", classification: "hierarchy", source_type: "design_component", target_type: "design_component" },
|
|
1456
1462
|
prototype_annotated_with_annotation: { forward_verb: "annotated_with", reverse_verb: "annotates", classification: "hierarchy", source_type: "prototype", target_type: "annotation" },
|
|
1457
1463
|
screen_renders_design_component: { forward_verb: "renders", reverse_verb: "rendered_on", classification: "hierarchy", source_type: "screen", target_type: "design_component" },
|
|
1464
|
+
// Marketing surface to product (0.12.7, UPG-696/698). A marketing/landing screen
|
|
1465
|
+
// markets a product. Dual-registered: also a cross-edge (UPG_CROSS_EDGE_TYPES) for
|
|
1466
|
+
// the common case where the product lives in another graph; this catalog entry is
|
|
1467
|
+
// the within-graph degenerate case (a product's own landing page).
|
|
1468
|
+
screen_markets_product: { forward_verb: "markets", reverse_verb: "marketed_by", classification: "semantic", source_type: "screen", target_type: "product" },
|
|
1458
1469
|
screen_navigates_to_screen: { forward_verb: "navigates_to", reverse_verb: "navigated_from", classification: "hierarchy", source_type: "screen", target_type: "screen" },
|
|
1459
1470
|
screen_surfaces_feature: { forward_verb: "surfaces", reverse_verb: "surfaced_on", classification: "cross-domain", source_type: "screen", target_type: "feature" },
|
|
1460
1471
|
screen_wireframed_as_wireframe: { forward_verb: "wireframed_as", reverse_verb: "wireframes", classification: "hierarchy", source_type: "screen", target_type: "wireframe" },
|
|
@@ -3132,7 +3143,9 @@ var UPG_CROSS_EDGE_TYPES = [
|
|
|
3132
3143
|
"competitor_classified_as_classification_value",
|
|
3133
3144
|
"node_classified_as_classification_value",
|
|
3134
3145
|
"journey_phase_realises_operating_stage",
|
|
3135
|
-
"screen_markets_product"
|
|
3146
|
+
"screen_markets_product",
|
|
3147
|
+
"screen_renders_design_component",
|
|
3148
|
+
"product_expresses_brand_identity"
|
|
3136
3149
|
];
|
|
3137
3150
|
var REGISTRY_PRODUCT_ID = "registry";
|
|
3138
3151
|
|
|
@@ -3401,7 +3414,20 @@ var UPG_VALID_CHILDREN = {
|
|
|
3401
3414
|
// ── OKR hierarchy ──────────────────────────────────────────────────────────
|
|
3402
3415
|
objective: ["key_result", "metric"],
|
|
3403
3416
|
key_result: ["metric"],
|
|
3404
|
-
// ── Strategic cascade: vision → mission → strategic_pillar →
|
|
3417
|
+
// ── Strategic cascade: vision → mission → strategic_pillar → strategic_theme →
|
|
3418
|
+
// { initiative, objective } ───────────────────────────────────────────────
|
|
3419
|
+
//
|
|
3420
|
+
// strategic_pillar vs strategic_theme (UPG-692 T3.3 — distinct cascade levels,
|
|
3421
|
+
// NOT duplicates; sharpened rather than merged):
|
|
3422
|
+
// - strategic_pillar = a DURABLE structural division of the strategy. A
|
|
3423
|
+
// standing area the org organises around for years (e.g. "Structured
|
|
3424
|
+
// content", "Developer experience"). Few, long-lived; time_horizon is
|
|
3425
|
+
// multi-year / open-ended; carries its own `success_indicator`.
|
|
3426
|
+
// - strategic_theme = a TIME-BOUND thrust WITHIN a pillar. The current bet
|
|
3427
|
+
// for a period (e.g. "Go AI-native this year"). More numerous, rotates;
|
|
3428
|
+
// time_horizon is bounded (Q / FY); has NO `success_indicator` because it
|
|
3429
|
+
// is measured through its child objectives (strategic_theme_contains_objective).
|
|
3430
|
+
// That success-measurement asymmetry is the load-bearing distinction.
|
|
3405
3431
|
vision: ["mission"],
|
|
3406
3432
|
mission: ["strategic_pillar"],
|
|
3407
3433
|
strategic_pillar: ["strategic_theme", "capability", "value_stream", "decision"],
|
|
@@ -12541,16 +12567,18 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12541
12567
|
// StrategicPillarProperties: StrategicPillar entity. Durable multi-year direction the product commits to.
|
|
12542
12568
|
strategic_pillar: {
|
|
12543
12569
|
owner: { type: "string", description: "Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
12544
|
-
description: { type: "string", description: "Narrative of the pillar's intent" },
|
|
12545
|
-
scope: { type: "string", description: "
|
|
12546
|
-
time_horizon: { type: "string", description: '
|
|
12547
|
-
success_indicator: { type: "string", description: "How the business knows
|
|
12548
|
-
},
|
|
12549
|
-
// StrategicThemeProperties: StrategicTheme entity.
|
|
12570
|
+
description: { type: "string", description: "Narrative of the pillar's intent as a durable strategic area" },
|
|
12571
|
+
scope: { type: "string", description: "The standing organisational area this pillar owns" },
|
|
12572
|
+
time_horizon: { type: "string", description: 'Standing / multi-year horizon, often open-ended (a pillar is durable). @example "3 years", "2026-2028", "ongoing"' },
|
|
12573
|
+
success_indicator: { type: "string", description: "How the business knows this durable pillar is on track. Narrative, not a metric edge. A strategic_theme deliberately has no success_indicator: it is measured through its child objectives, not on its own." }
|
|
12574
|
+
},
|
|
12575
|
+
// StrategicThemeProperties: StrategicTheme entity. A time-bound thrust WITHIN a
|
|
12576
|
+
// strategic_pillar (distinct cascade level, UPG-692 T3.3) — measured through its
|
|
12577
|
+
// child objectives, so it carries no success_indicator of its own.
|
|
12550
12578
|
strategic_theme: {
|
|
12551
12579
|
owner: { type: "string", description: "Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
12552
|
-
time_horizon: { type: "string", description: '
|
|
12553
|
-
description: { type: "string", description: "Short narrative of
|
|
12580
|
+
time_horizon: { type: "string", description: 'Bounded period this theme is active (a theme is time-bound, within a pillar). @example "Q1 2026", "FY26"' },
|
|
12581
|
+
description: { type: "string", description: "Short narrative of this time-bound thrust within its pillar" },
|
|
12554
12582
|
scope: { type: "string", description: "What the theme explicitly includes or excludes" }
|
|
12555
12583
|
},
|
|
12556
12584
|
// SubscriptionProperties: Subscription.
|
|
@@ -29222,7 +29250,7 @@ function isCanonical(text) {
|
|
|
29222
29250
|
}
|
|
29223
29251
|
|
|
29224
29252
|
// src/index.ts
|
|
29225
|
-
var UPG_VERSION = "0.12.
|
|
29253
|
+
var UPG_VERSION = "0.12.7";
|
|
29226
29254
|
var UPG_FORMAT_VERSION = "0.4.0";
|
|
29227
29255
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
29228
29256
|
var UPG_TYPES = getTypes();
|