@unified-product-graph/core 0.12.8 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -3565,13 +3565,6 @@ declare const UPG_EDGE_CATALOG: {
3565
3565
  source_type: string;
3566
3566
  target_type: string;
3567
3567
  };
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
3568
  pricing_tier_targets_behavioral_segment: {
3576
3569
  forward_verb: string;
3577
3570
  reverse_verb: string;
@@ -8464,7 +8457,7 @@ declare const UPG_LIFECYCLES: readonly UPGLifecycle[];
8464
8457
  *
8465
8458
  * @example
8466
8459
  * const lifecycle = getLifecycleForType('hypothesis')
8467
- * // → HYPOTHESIS_LIFECYCLE
8460
+ * // → HYPOTHESIS_CLAIM_LIFECYCLE
8468
8461
  *
8469
8462
  * const noLifecycle = getLifecycleForType('persona')
8470
8463
  * // → undefined
@@ -21920,7 +21913,7 @@ declare function isCanonical(text: string): boolean;
21920
21913
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
21921
21914
  * The `check:version-lockstep` gate enforces this at release time.
21922
21915
  */
21923
- declare const UPG_VERSION: "0.12.8";
21916
+ declare const UPG_VERSION: "0.13.0";
21924
21917
  /**
21925
21918
  * The `.upg` JSON document format version. Written to the `upg_version` field.
21926
21919
  * Evolves independently from `UPG_VERSION` (the catalogue version).
package/dist/index.d.ts CHANGED
@@ -3565,13 +3565,6 @@ declare const UPG_EDGE_CATALOG: {
3565
3565
  source_type: string;
3566
3566
  target_type: string;
3567
3567
  };
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
3568
  pricing_tier_targets_behavioral_segment: {
3576
3569
  forward_verb: string;
3577
3570
  reverse_verb: string;
@@ -8464,7 +8457,7 @@ declare const UPG_LIFECYCLES: readonly UPGLifecycle[];
8464
8457
  *
8465
8458
  * @example
8466
8459
  * const lifecycle = getLifecycleForType('hypothesis')
8467
- * // → HYPOTHESIS_LIFECYCLE
8460
+ * // → HYPOTHESIS_CLAIM_LIFECYCLE
8468
8461
  *
8469
8462
  * const noLifecycle = getLifecycleForType('persona')
8470
8463
  * // → undefined
@@ -21920,7 +21913,7 @@ declare function isCanonical(text: string): boolean;
21920
21913
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
21921
21914
  * The `check:version-lockstep` gate enforces this at release time.
21922
21915
  */
21923
- declare const UPG_VERSION: "0.12.8";
21916
+ declare const UPG_VERSION: "0.13.0";
21924
21917
  /**
21925
21918
  * The `.upg` JSON document format version. Written to the `upg_version` field.
21926
21919
  * Evolves independently from `UPG_VERSION` (the catalogue version).
package/dist/index.js CHANGED
@@ -1835,7 +1835,9 @@ var UPG_EDGE_CATALOG = {
1835
1835
  persona_belongs_to_market_segment: { forward_verb: "belongs_to", reverse_verb: "includes_persona", classification: "cross-domain", source_type: "persona", target_type: "market_segment" },
1836
1836
  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
1837
  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: { forward_verb: "measured_by", reverse_verb: "measures", classification: "cross-domain", source_type: "revenue_stream", target_type: "metric" },
1838
+ // revenue_stream_measured_by_metric_cross_domain dropped in 0.13.0 Wave 1 (UPG-685 T0.1):
1839
+ // a cross-domain-classified shadow of revenue_stream_measured_by_metric (same measured_by
1840
+ // verbs); pickCanonicalEdge never returned it. Dual-read to the canonical in UPG_EDGE_MIGRATIONS.
1839
1841
  pricing_tier_targets_behavioral_segment: { forward_verb: "targets", reverse_verb: "targeted_by", classification: "cross-domain", source_type: "pricing_tier", target_type: "behavioral_segment" },
1840
1842
  key_resource_enables_value_proposition: { forward_verb: "enables", reverse_verb: "enabled_by", classification: "cross-domain", source_type: "key_resource", target_type: "value_proposition" },
1841
1843
  // 4.3 Go-To-Market Domain
@@ -3602,7 +3604,12 @@ var UPG_VALID_CHILDREN = {
3602
3604
  ],
3603
3605
  // ── Data & Analytics hierarchy ───────────────────────────────────────────────
3604
3606
  data_source: ["metric", "data_pipeline", "data_lineage", "event_schema"],
3605
- metric: ["metric", "outcome", "data_quality_rule", "metric_quality_assessment"],
3607
+ // UPG-685 T0.4 (0.13.0 Wave 1): `outcome` removed as a metric child. It closed a
3608
+ // containment cycle (outcome ⊃ metric ⊃ outcome) and was backed only by the CAUSAL
3609
+ // `metric_drives_outcome` edge, not a hierarchy edge — the "metric leads to outcome"
3610
+ // meaning lives correctly on that causal edge. The real containment (outcome ⊃ metric)
3611
+ // is kept. Sub-metric trees (metric ⊃ metric) stay.
3612
+ metric: ["metric", "data_quality_rule", "metric_quality_assessment"],
3606
3613
  data_domain: ["data_product", "data_source", "glossary_term", "data_model", "dashboard"],
3607
3614
  dashboard: ["report", "experiment_run"],
3608
3615
  // ── Content & Knowledge hierarchy ────────────────────────────────────────────
@@ -4005,43 +4012,6 @@ var SOLUTION_LIFECYCLE = {
4005
4012
  }
4006
4013
  ]
4007
4014
  };
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
4015
  var HYPOTHESIS_CLAIM_LIFECYCLE = {
4046
4016
  entity_type: "hypothesis",
4047
4017
  initial_phase: "drafted",
@@ -6194,9 +6164,7 @@ var UPG_LIFECYCLES = [
6194
6164
  OPPORTUNITY_LIFECYCLE,
6195
6165
  SOLUTION_LIFECYCLE,
6196
6166
  HYPOTHESIS_CLAIM_LIFECYCLE,
6197
- // v0.4.0 canonical (re-promoted as 'hypothesis')
6198
- HYPOTHESIS_LIFECYCLE,
6199
- // pre-v0.2.8 legacy (retained for migration compat)
6167
+ // 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
6168
  EXPERIMENT_LIFECYCLE,
6201
6169
  EXPERIMENT_PLAN_LIFECYCLE,
6202
6170
  EXPERIMENT_RUN_LIFECYCLE,
@@ -8804,6 +8772,7 @@ var UPG_EDGE_MIGRATIONS = {
8804
8772
  { 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
8773
  { 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
8774
  { 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." },
8775
+ { 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
8776
  // ── Tier 2: tense / suffix twins ──
8808
8777
  { 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
8778
  { 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 +20842,29 @@ var UPG_TREE_PATTERNS = [
20873
20842
  // readable money-model overview; `depth` extends into the metric -> metric
20874
20843
  // decomposition waterfall.
20875
20844
  natural_depth: 3
20845
+ },
20846
+ {
20847
+ id: "north_star",
20848
+ label: "North Star impact",
20849
+ 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.",
20850
+ framework_id: "north-star-metric",
20851
+ region: "strategy_outcomes",
20852
+ gap_policy: "all-optional",
20853
+ anchor_type: "metric",
20854
+ // A north-star tree roots at a metric by definition; no fallback (no metric =
20855
+ // no north-star view, honestly empty rather than rooting elsewhere).
20856
+ fallback_anchors: [],
20857
+ child_map: {
20858
+ // A metric decomposes into its input/sub-metrics (the `metric_decomposes_into_metric`
20859
+ // hierarchy) AND drives the outcomes it predicts (the causal `metric_drives_outcome`).
20860
+ // The outcome is a child by INFLUENCE, not containment — the leading-to-lagging chain.
20861
+ // Following the causal edge by type-adjacency (cf. `strategy`'s initiative -> outcome)
20862
+ // is how the metric-rooted view renders without re-creating the metric ⊃ outcome
20863
+ // containment cycle removed in UPG-685 T0.4. The assembler's `seen` set terminates the
20864
+ // metric -> metric recursion for free.
20865
+ metric: [opt("metric"), opt("outcome")]
20866
+ },
20867
+ natural_depth: 3
20876
20868
  }
20877
20869
  ];
20878
20870
  var UPG_TREE_PATTERNS_BY_ID = Object.fromEntries(
@@ -28281,11 +28273,6 @@ var UPG_REGIONS = [
28281
28273
  edge_id: "key_result_quantified_by_metric",
28282
28274
  crosses_into: "strategy_outcomes"
28283
28275
  },
28284
- {
28285
- direction: "import",
28286
- edge_id: "revenue_stream_measured_by_metric_cross_domain",
28287
- crosses_into: "business_gtm_growth"
28288
- },
28289
28276
  {
28290
28277
  direction: "import",
28291
28278
  edge_id: "service_level_objective_tracks_metric",
@@ -29306,7 +29293,7 @@ function isCanonical(text) {
29306
29293
  }
29307
29294
 
29308
29295
  // src/index.ts
29309
- var UPG_VERSION = "0.12.8";
29296
+ var UPG_VERSION = "0.13.0";
29310
29297
  var UPG_FORMAT_VERSION = "0.4.0";
29311
29298
  var MARKDOWN_FORMAT_VERSION = "0.1";
29312
29299
  var UPG_TYPES = getTypes();