@unified-product-graph/core 0.12.8 → 0.13.1
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 +63 -49
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +31 -10
- package/dist/index.d.ts +31 -10
- package/dist/index.js +63 -49
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -1724,6 +1724,34 @@ declare const UPG_EDGE_CATALOG: {
|
|
|
1724
1724
|
source_type: string;
|
|
1725
1725
|
target_type: string;
|
|
1726
1726
|
};
|
|
1727
|
+
screen_targets_competitor: {
|
|
1728
|
+
forward_verb: string;
|
|
1729
|
+
reverse_verb: string;
|
|
1730
|
+
classification: "semantic";
|
|
1731
|
+
source_type: string;
|
|
1732
|
+
target_type: string;
|
|
1733
|
+
};
|
|
1734
|
+
feature_surfaces_product: {
|
|
1735
|
+
forward_verb: string;
|
|
1736
|
+
reverse_verb: string;
|
|
1737
|
+
classification: "semantic";
|
|
1738
|
+
source_type: string;
|
|
1739
|
+
target_type: string;
|
|
1740
|
+
};
|
|
1741
|
+
feature_uses_design_component: {
|
|
1742
|
+
forward_verb: string;
|
|
1743
|
+
reverse_verb: string;
|
|
1744
|
+
classification: "semantic";
|
|
1745
|
+
source_type: string;
|
|
1746
|
+
target_type: string;
|
|
1747
|
+
};
|
|
1748
|
+
product_implements_design_system: {
|
|
1749
|
+
forward_verb: string;
|
|
1750
|
+
reverse_verb: string;
|
|
1751
|
+
classification: "semantic";
|
|
1752
|
+
source_type: string;
|
|
1753
|
+
target_type: string;
|
|
1754
|
+
};
|
|
1727
1755
|
screen_navigates_to_screen: {
|
|
1728
1756
|
forward_verb: string;
|
|
1729
1757
|
reverse_verb: string;
|
|
@@ -3565,13 +3593,6 @@ declare const UPG_EDGE_CATALOG: {
|
|
|
3565
3593
|
source_type: string;
|
|
3566
3594
|
target_type: string;
|
|
3567
3595
|
};
|
|
3568
|
-
revenue_stream_measured_by_metric_cross_domain: {
|
|
3569
|
-
forward_verb: string;
|
|
3570
|
-
reverse_verb: string;
|
|
3571
|
-
classification: "cross-domain";
|
|
3572
|
-
source_type: string;
|
|
3573
|
-
target_type: string;
|
|
3574
|
-
};
|
|
3575
3596
|
pricing_tier_targets_behavioral_segment: {
|
|
3576
3597
|
forward_verb: string;
|
|
3577
3598
|
reverse_verb: string;
|
|
@@ -7496,7 +7517,7 @@ interface UPGProduct {
|
|
|
7496
7517
|
/** Product lifecycle stages. Covers the full arc from napkin idea to end-of-life. */
|
|
7497
7518
|
type UPGProductStage = 'concept' | 'validation' | 'build' | 'beta' | 'launch' | 'growth' | 'mature' | 'maintenance' | 'sunset';
|
|
7498
7519
|
/** The set of valid cross-product relationship types */
|
|
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';
|
|
7520
|
+
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' | 'shares_job' | 'shares_need' | 'persona_delegates_to_persona' | 'screen_targets_competitor' | 'feature_surfaces_product' | 'feature_uses_design_component' | 'product_implements_design_system';
|
|
7500
7521
|
/**
|
|
7501
7522
|
* Runtime-checkable list of valid cross-product edge types. Mirrors
|
|
7502
7523
|
* `UPGCrossEdgeType` for use in validators and writers that need to test
|
|
@@ -8464,7 +8485,7 @@ declare const UPG_LIFECYCLES: readonly UPGLifecycle[];
|
|
|
8464
8485
|
*
|
|
8465
8486
|
* @example
|
|
8466
8487
|
* const lifecycle = getLifecycleForType('hypothesis')
|
|
8467
|
-
* // →
|
|
8488
|
+
* // → HYPOTHESIS_CLAIM_LIFECYCLE
|
|
8468
8489
|
*
|
|
8469
8490
|
* const noLifecycle = getLifecycleForType('persona')
|
|
8470
8491
|
* // → undefined
|
|
@@ -21920,7 +21941,7 @@ declare function isCanonical(text: string): boolean;
|
|
|
21920
21941
|
* it stamps the `upg_version` field of every `.upg` file written by the SDK.
|
|
21921
21942
|
* The `check:version-lockstep` gate enforces this at release time.
|
|
21922
21943
|
*/
|
|
21923
|
-
declare const UPG_VERSION: "0.
|
|
21944
|
+
declare const UPG_VERSION: "0.13.1";
|
|
21924
21945
|
/**
|
|
21925
21946
|
* The `.upg` JSON document format version. Written to the `upg_version` field.
|
|
21926
21947
|
* Evolves independently from `UPG_VERSION` (the catalogue version).
|
package/dist/index.d.ts
CHANGED
|
@@ -1724,6 +1724,34 @@ declare const UPG_EDGE_CATALOG: {
|
|
|
1724
1724
|
source_type: string;
|
|
1725
1725
|
target_type: string;
|
|
1726
1726
|
};
|
|
1727
|
+
screen_targets_competitor: {
|
|
1728
|
+
forward_verb: string;
|
|
1729
|
+
reverse_verb: string;
|
|
1730
|
+
classification: "semantic";
|
|
1731
|
+
source_type: string;
|
|
1732
|
+
target_type: string;
|
|
1733
|
+
};
|
|
1734
|
+
feature_surfaces_product: {
|
|
1735
|
+
forward_verb: string;
|
|
1736
|
+
reverse_verb: string;
|
|
1737
|
+
classification: "semantic";
|
|
1738
|
+
source_type: string;
|
|
1739
|
+
target_type: string;
|
|
1740
|
+
};
|
|
1741
|
+
feature_uses_design_component: {
|
|
1742
|
+
forward_verb: string;
|
|
1743
|
+
reverse_verb: string;
|
|
1744
|
+
classification: "semantic";
|
|
1745
|
+
source_type: string;
|
|
1746
|
+
target_type: string;
|
|
1747
|
+
};
|
|
1748
|
+
product_implements_design_system: {
|
|
1749
|
+
forward_verb: string;
|
|
1750
|
+
reverse_verb: string;
|
|
1751
|
+
classification: "semantic";
|
|
1752
|
+
source_type: string;
|
|
1753
|
+
target_type: string;
|
|
1754
|
+
};
|
|
1727
1755
|
screen_navigates_to_screen: {
|
|
1728
1756
|
forward_verb: string;
|
|
1729
1757
|
reverse_verb: string;
|
|
@@ -3565,13 +3593,6 @@ declare const UPG_EDGE_CATALOG: {
|
|
|
3565
3593
|
source_type: string;
|
|
3566
3594
|
target_type: string;
|
|
3567
3595
|
};
|
|
3568
|
-
revenue_stream_measured_by_metric_cross_domain: {
|
|
3569
|
-
forward_verb: string;
|
|
3570
|
-
reverse_verb: string;
|
|
3571
|
-
classification: "cross-domain";
|
|
3572
|
-
source_type: string;
|
|
3573
|
-
target_type: string;
|
|
3574
|
-
};
|
|
3575
3596
|
pricing_tier_targets_behavioral_segment: {
|
|
3576
3597
|
forward_verb: string;
|
|
3577
3598
|
reverse_verb: string;
|
|
@@ -7496,7 +7517,7 @@ interface UPGProduct {
|
|
|
7496
7517
|
/** Product lifecycle stages. Covers the full arc from napkin idea to end-of-life. */
|
|
7497
7518
|
type UPGProductStage = 'concept' | 'validation' | 'build' | 'beta' | 'launch' | 'growth' | 'mature' | 'maintenance' | 'sunset';
|
|
7498
7519
|
/** The set of valid cross-product relationship types */
|
|
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';
|
|
7520
|
+
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' | 'shares_job' | 'shares_need' | 'persona_delegates_to_persona' | 'screen_targets_competitor' | 'feature_surfaces_product' | 'feature_uses_design_component' | 'product_implements_design_system';
|
|
7500
7521
|
/**
|
|
7501
7522
|
* Runtime-checkable list of valid cross-product edge types. Mirrors
|
|
7502
7523
|
* `UPGCrossEdgeType` for use in validators and writers that need to test
|
|
@@ -8464,7 +8485,7 @@ declare const UPG_LIFECYCLES: readonly UPGLifecycle[];
|
|
|
8464
8485
|
*
|
|
8465
8486
|
* @example
|
|
8466
8487
|
* const lifecycle = getLifecycleForType('hypothesis')
|
|
8467
|
-
* // →
|
|
8488
|
+
* // → HYPOTHESIS_CLAIM_LIFECYCLE
|
|
8468
8489
|
*
|
|
8469
8490
|
* const noLifecycle = getLifecycleForType('persona')
|
|
8470
8491
|
* // → undefined
|
|
@@ -21920,7 +21941,7 @@ declare function isCanonical(text: string): boolean;
|
|
|
21920
21941
|
* it stamps the `upg_version` field of every `.upg` file written by the SDK.
|
|
21921
21942
|
* The `check:version-lockstep` gate enforces this at release time.
|
|
21922
21943
|
*/
|
|
21923
|
-
declare const UPG_VERSION: "0.
|
|
21944
|
+
declare const UPG_VERSION: "0.13.1";
|
|
21924
21945
|
/**
|
|
21925
21946
|
* The `.upg` JSON document format version. Written to the `upg_version` field.
|
|
21926
21947
|
* Evolves independently from `UPG_VERSION` (the catalogue version).
|
package/dist/index.js
CHANGED
|
@@ -1466,6 +1466,25 @@ var UPG_EDGE_CATALOG = {
|
|
|
1466
1466
|
// the common case where the product lives in another graph; this catalog entry is
|
|
1467
1467
|
// the within-graph degenerate case (a product's own landing page).
|
|
1468
1468
|
screen_markets_product: { forward_verb: "markets", reverse_verb: "marketed_by", classification: "semantic", source_type: "screen", target_type: "product" },
|
|
1469
|
+
// Connective cross-product references (0.13.1, Data's connective-layer brief).
|
|
1470
|
+
// Dual-registered (also in UPG_CROSS_EDGE_TYPES) for the common cross-graph case;
|
|
1471
|
+
// these catalog entries are the within-graph degenerate case.
|
|
1472
|
+
// - screen_targets_competitor: a comparison / "vs" / positioning screen targets a
|
|
1473
|
+
// competitor (the competitor typically lives in a watched competitor-intel graph).
|
|
1474
|
+
// - feature_surfaces_product: a feature surfaces / embeds another product (a "Canvas"
|
|
1475
|
+
// feature that IS the Canvas product embedded). The feature-granular sibling of
|
|
1476
|
+
// depends_on_product; wires the portfolio from islands into a mesh.
|
|
1477
|
+
// - feature_uses_design_component: a feature consumes a shared design_component (the
|
|
1478
|
+
// feature sibling of screen_renders_design_component; the component lives in the
|
|
1479
|
+
// design-system product graph).
|
|
1480
|
+
// - product_implements_design_system: a product adopts / implements the shared design
|
|
1481
|
+
// system (the adoption semantic, mirroring product_implements_specification). Distinct
|
|
1482
|
+
// from the hierarchy `product_systematised_in_design_system` (structural containment):
|
|
1483
|
+
// same pattern as brand (branded_as = hierarchy, expresses = semantic).
|
|
1484
|
+
screen_targets_competitor: { forward_verb: "targets", reverse_verb: "targeted_by", classification: "semantic", source_type: "screen", target_type: "competitor" },
|
|
1485
|
+
feature_surfaces_product: { forward_verb: "surfaces", reverse_verb: "surfaced_by", classification: "semantic", source_type: "feature", target_type: "product" },
|
|
1486
|
+
feature_uses_design_component: { forward_verb: "uses", reverse_verb: "used_by", classification: "semantic", source_type: "feature", target_type: "design_component" },
|
|
1487
|
+
product_implements_design_system: { forward_verb: "implements", reverse_verb: "implemented_by", classification: "semantic", source_type: "product", target_type: "design_system" },
|
|
1469
1488
|
screen_navigates_to_screen: { forward_verb: "navigates_to", reverse_verb: "navigated_from", classification: "hierarchy", source_type: "screen", target_type: "screen" },
|
|
1470
1489
|
screen_surfaces_feature: { forward_verb: "surfaces", reverse_verb: "surfaced_on", classification: "cross-domain", source_type: "screen", target_type: "feature" },
|
|
1471
1490
|
screen_wireframed_as_wireframe: { forward_verb: "wireframed_as", reverse_verb: "wireframes", classification: "hierarchy", source_type: "screen", target_type: "wireframe" },
|
|
@@ -1835,7 +1854,9 @@ var UPG_EDGE_CATALOG = {
|
|
|
1835
1854
|
persona_belongs_to_market_segment: { forward_verb: "belongs_to", reverse_verb: "includes_persona", classification: "cross-domain", source_type: "persona", target_type: "market_segment" },
|
|
1836
1855
|
revenue_stream_priced_by_pricing_strategy: { forward_verb: "priced_by", reverse_verb: "prices", classification: "cross-domain", source_type: "revenue_stream", target_type: "pricing_strategy" },
|
|
1837
1856
|
revenue_stream_drives_outcome: { forward_verb: "drives", reverse_verb: "driven_by", classification: "cross-domain", source_type: "revenue_stream", target_type: "outcome" },
|
|
1838
|
-
revenue_stream_measured_by_metric_cross_domain
|
|
1857
|
+
// revenue_stream_measured_by_metric_cross_domain dropped in 0.13.0 Wave 1 (UPG-685 T0.1):
|
|
1858
|
+
// a cross-domain-classified shadow of revenue_stream_measured_by_metric (same measured_by
|
|
1859
|
+
// verbs); pickCanonicalEdge never returned it. Dual-read to the canonical in UPG_EDGE_MIGRATIONS.
|
|
1839
1860
|
pricing_tier_targets_behavioral_segment: { forward_verb: "targets", reverse_verb: "targeted_by", classification: "cross-domain", source_type: "pricing_tier", target_type: "behavioral_segment" },
|
|
1840
1861
|
key_resource_enables_value_proposition: { forward_verb: "enables", reverse_verb: "enabled_by", classification: "cross-domain", source_type: "key_resource", target_type: "value_proposition" },
|
|
1841
1862
|
// 4.3 Go-To-Market Domain
|
|
@@ -3145,7 +3166,15 @@ var UPG_CROSS_EDGE_TYPES = [
|
|
|
3145
3166
|
"journey_phase_realises_operating_stage",
|
|
3146
3167
|
"screen_markets_product",
|
|
3147
3168
|
"screen_renders_design_component",
|
|
3148
|
-
"product_expresses_brand_identity"
|
|
3169
|
+
"product_expresses_brand_identity",
|
|
3170
|
+
// Connective cross-product layer (0.13.1) — see UPGCrossEdgeType above.
|
|
3171
|
+
"shares_job",
|
|
3172
|
+
"shares_need",
|
|
3173
|
+
"persona_delegates_to_persona",
|
|
3174
|
+
"screen_targets_competitor",
|
|
3175
|
+
"feature_surfaces_product",
|
|
3176
|
+
"feature_uses_design_component",
|
|
3177
|
+
"product_implements_design_system"
|
|
3149
3178
|
];
|
|
3150
3179
|
var REGISTRY_PRODUCT_ID = "registry";
|
|
3151
3180
|
|
|
@@ -3602,7 +3631,12 @@ var UPG_VALID_CHILDREN = {
|
|
|
3602
3631
|
],
|
|
3603
3632
|
// ── Data & Analytics hierarchy ───────────────────────────────────────────────
|
|
3604
3633
|
data_source: ["metric", "data_pipeline", "data_lineage", "event_schema"],
|
|
3605
|
-
|
|
3634
|
+
// UPG-685 T0.4 (0.13.0 Wave 1): `outcome` removed as a metric child. It closed a
|
|
3635
|
+
// containment cycle (outcome ⊃ metric ⊃ outcome) and was backed only by the CAUSAL
|
|
3636
|
+
// `metric_drives_outcome` edge, not a hierarchy edge — the "metric leads to outcome"
|
|
3637
|
+
// meaning lives correctly on that causal edge. The real containment (outcome ⊃ metric)
|
|
3638
|
+
// is kept. Sub-metric trees (metric ⊃ metric) stay.
|
|
3639
|
+
metric: ["metric", "data_quality_rule", "metric_quality_assessment"],
|
|
3606
3640
|
data_domain: ["data_product", "data_source", "glossary_term", "data_model", "dashboard"],
|
|
3607
3641
|
dashboard: ["report", "experiment_run"],
|
|
3608
3642
|
// ── Content & Knowledge hierarchy ────────────────────────────────────────────
|
|
@@ -4005,43 +4039,6 @@ var SOLUTION_LIFECYCLE = {
|
|
|
4005
4039
|
}
|
|
4006
4040
|
]
|
|
4007
4041
|
};
|
|
4008
|
-
var HYPOTHESIS_LIFECYCLE = {
|
|
4009
|
-
entity_type: "hypothesis",
|
|
4010
|
-
initial_phase: "untested",
|
|
4011
|
-
terminal_phases: ["resolved"],
|
|
4012
|
-
phases: [
|
|
4013
|
-
{
|
|
4014
|
-
id: "untested",
|
|
4015
|
-
label: "Untested",
|
|
4016
|
-
description: "The belief is stated. No experiment has been designed or run.",
|
|
4017
|
-
transitions_to: ["testing"]
|
|
4018
|
-
},
|
|
4019
|
-
{
|
|
4020
|
-
id: "testing",
|
|
4021
|
-
label: "Testing",
|
|
4022
|
-
description: "An experiment is actively running to test this hypothesis. Evidence is being gathered.",
|
|
4023
|
-
transitions_to: ["resolved"]
|
|
4024
|
-
},
|
|
4025
|
-
{
|
|
4026
|
-
id: "resolved",
|
|
4027
|
-
label: "Resolved",
|
|
4028
|
-
description: "The hypothesis has been tested and a conclusion reached. The resolved phase has two states: validated (belief held) or invalidated (belief did not hold).",
|
|
4029
|
-
transitions_to: [],
|
|
4030
|
-
core_states: [
|
|
4031
|
-
{
|
|
4032
|
-
id: "validated",
|
|
4033
|
-
label: "Validated",
|
|
4034
|
-
description: "Evidence supports the hypothesis. The belief held. Learnings can inform solution design."
|
|
4035
|
-
},
|
|
4036
|
-
{
|
|
4037
|
-
id: "invalidated",
|
|
4038
|
-
label: "Invalidated",
|
|
4039
|
-
description: "Evidence contradicts the hypothesis. The belief did not hold. Learnings prevent investment in the wrong direction."
|
|
4040
|
-
}
|
|
4041
|
-
]
|
|
4042
|
-
}
|
|
4043
|
-
]
|
|
4044
|
-
};
|
|
4045
4042
|
var HYPOTHESIS_CLAIM_LIFECYCLE = {
|
|
4046
4043
|
entity_type: "hypothesis",
|
|
4047
4044
|
initial_phase: "drafted",
|
|
@@ -6194,9 +6191,7 @@ var UPG_LIFECYCLES = [
|
|
|
6194
6191
|
OPPORTUNITY_LIFECYCLE,
|
|
6195
6192
|
SOLUTION_LIFECYCLE,
|
|
6196
6193
|
HYPOTHESIS_CLAIM_LIFECYCLE,
|
|
6197
|
-
// v0.
|
|
6198
|
-
HYPOTHESIS_LIFECYCLE,
|
|
6199
|
-
// pre-v0.2.8 legacy (retained for migration compat)
|
|
6194
|
+
// canonical 'hypothesis' lifecycle. The pre-v0.2.8 legacy binding (untested → testing → resolved) was removed in 0.13.0 Wave 1 (UPG-685 T0.3): it was a dead second binding for the same entity_type, always shadowed by this one, and the legacy-status remap lives in UPG_*_MIGRATIONS, not a live lifecycle.
|
|
6200
6195
|
EXPERIMENT_LIFECYCLE,
|
|
6201
6196
|
EXPERIMENT_PLAN_LIFECYCLE,
|
|
6202
6197
|
EXPERIMENT_RUN_LIFECYCLE,
|
|
@@ -8804,6 +8799,7 @@ var UPG_EDGE_MIGRATIONS = {
|
|
|
8804
8799
|
{ kind: "rename", from: "value_proposition_targets_persona_cross_domain", to: "value_proposition_targets_persona", requires_source_type: "value_proposition", requires_target_type: "persona", reason: "Duplicate collapse (UPG-677). Byte-identical shadow of value_proposition_targets_persona; the suffixed twin never resolved." },
|
|
8805
8800
|
{ kind: "rename", from: "metric_measures_metric_cross_domain", to: "metric_measures_metric", requires_source_type: "metric", requires_target_type: "metric", reason: "Duplicate collapse (UPG-677). Byte-identical shadow of metric_measures_metric; the suffixed twin never resolved." },
|
|
8806
8801
|
{ kind: "rename", from: "insight_validates_need_cross_domain", to: "insight_validates_need", requires_source_type: "insight", requires_target_type: "need", reason: "Duplicate collapse (UPG-677). Byte-identical shadow of insight_validates_need; the suffixed twin never resolved." },
|
|
8802
|
+
{ kind: "rename", from: "revenue_stream_measured_by_metric_cross_domain", to: "revenue_stream_measured_by_metric", requires_source_type: "revenue_stream", requires_target_type: "metric", reason: "Duplicate collapse (UPG-685 T0.1, 0.13.0 Wave 1). Cross-domain-classified shadow of revenue_stream_measured_by_metric (same measured_by/measures verbs); pickCanonicalEdge never returned it (the semantic key wins the pair; revenue_stream_drives_metric serves the cross-domain ask). Verb-preserving collapse onto the semantic canonical." },
|
|
8807
8803
|
// ── Tier 2: tense / suffix twins ──
|
|
8808
8804
|
{ kind: "rename", from: "metric_decomposed_into_metric", to: "metric_decomposes_into_metric", requires_source_type: "metric", requires_target_type: "metric", reason: "Duplicate collapse (UPG-677). Tense-twin of the active-voice metric_decomposes_into_metric." },
|
|
8809
8805
|
{ kind: "rename", from: "product_decided_via_decision_hierarchy", to: "product_decided_via_decision", requires_source_type: "product", requires_target_type: "decision", reason: "Duplicate collapse (UPG-677). Suffix-twin of product_decided_via_decision." },
|
|
@@ -20873,6 +20869,29 @@ var UPG_TREE_PATTERNS = [
|
|
|
20873
20869
|
// readable money-model overview; `depth` extends into the metric -> metric
|
|
20874
20870
|
// decomposition waterfall.
|
|
20875
20871
|
natural_depth: 3
|
|
20872
|
+
},
|
|
20873
|
+
{
|
|
20874
|
+
id: "north_star",
|
|
20875
|
+
label: "North Star impact",
|
|
20876
|
+
description: "A north-star metric, the input/sub-metrics it decomposes into, and the outcomes it drives. The metric-rooted, leading-indicator view: outcomes hang off the metric by influence (the causal `drives` edge), distinct from the OKR view where the outcome sits on top and the metric measures it.",
|
|
20877
|
+
framework_id: "north-star-metric",
|
|
20878
|
+
region: "strategy_outcomes",
|
|
20879
|
+
gap_policy: "all-optional",
|
|
20880
|
+
anchor_type: "metric",
|
|
20881
|
+
// A north-star tree roots at a metric by definition; no fallback (no metric =
|
|
20882
|
+
// no north-star view, honestly empty rather than rooting elsewhere).
|
|
20883
|
+
fallback_anchors: [],
|
|
20884
|
+
child_map: {
|
|
20885
|
+
// A metric decomposes into its input/sub-metrics (the `metric_decomposes_into_metric`
|
|
20886
|
+
// hierarchy) AND drives the outcomes it predicts (the causal `metric_drives_outcome`).
|
|
20887
|
+
// The outcome is a child by INFLUENCE, not containment — the leading-to-lagging chain.
|
|
20888
|
+
// Following the causal edge by type-adjacency (cf. `strategy`'s initiative -> outcome)
|
|
20889
|
+
// is how the metric-rooted view renders without re-creating the metric ⊃ outcome
|
|
20890
|
+
// containment cycle removed in UPG-685 T0.4. The assembler's `seen` set terminates the
|
|
20891
|
+
// metric -> metric recursion for free.
|
|
20892
|
+
metric: [opt("metric"), opt("outcome")]
|
|
20893
|
+
},
|
|
20894
|
+
natural_depth: 3
|
|
20876
20895
|
}
|
|
20877
20896
|
];
|
|
20878
20897
|
var UPG_TREE_PATTERNS_BY_ID = Object.fromEntries(
|
|
@@ -28281,11 +28300,6 @@ var UPG_REGIONS = [
|
|
|
28281
28300
|
edge_id: "key_result_quantified_by_metric",
|
|
28282
28301
|
crosses_into: "strategy_outcomes"
|
|
28283
28302
|
},
|
|
28284
|
-
{
|
|
28285
|
-
direction: "import",
|
|
28286
|
-
edge_id: "revenue_stream_measured_by_metric_cross_domain",
|
|
28287
|
-
crosses_into: "business_gtm_growth"
|
|
28288
|
-
},
|
|
28289
28303
|
{
|
|
28290
28304
|
direction: "import",
|
|
28291
28305
|
edge_id: "service_level_objective_tracks_metric",
|
|
@@ -29306,7 +29320,7 @@ function isCanonical(text) {
|
|
|
29306
29320
|
}
|
|
29307
29321
|
|
|
29308
29322
|
// src/index.ts
|
|
29309
|
-
var UPG_VERSION = "0.
|
|
29323
|
+
var UPG_VERSION = "0.13.1";
|
|
29310
29324
|
var UPG_FORMAT_VERSION = "0.4.0";
|
|
29311
29325
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
29312
29326
|
var UPG_TYPES = getTypes();
|