@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.cjs CHANGED
@@ -2059,7 +2059,9 @@ var UPG_EDGE_CATALOG = {
2059
2059
  persona_belongs_to_market_segment: { forward_verb: "belongs_to", reverse_verb: "includes_persona", classification: "cross-domain", source_type: "persona", target_type: "market_segment" },
2060
2060
  revenue_stream_priced_by_pricing_strategy: { forward_verb: "priced_by", reverse_verb: "prices", classification: "cross-domain", source_type: "revenue_stream", target_type: "pricing_strategy" },
2061
2061
  revenue_stream_drives_outcome: { forward_verb: "drives", reverse_verb: "driven_by", classification: "cross-domain", source_type: "revenue_stream", target_type: "outcome" },
2062
- revenue_stream_measured_by_metric_cross_domain: { forward_verb: "measured_by", reverse_verb: "measures", classification: "cross-domain", source_type: "revenue_stream", target_type: "metric" },
2062
+ // revenue_stream_measured_by_metric_cross_domain dropped in 0.13.0 Wave 1 (UPG-685 T0.1):
2063
+ // a cross-domain-classified shadow of revenue_stream_measured_by_metric (same measured_by
2064
+ // verbs); pickCanonicalEdge never returned it. Dual-read to the canonical in UPG_EDGE_MIGRATIONS.
2063
2065
  pricing_tier_targets_behavioral_segment: { forward_verb: "targets", reverse_verb: "targeted_by", classification: "cross-domain", source_type: "pricing_tier", target_type: "behavioral_segment" },
2064
2066
  key_resource_enables_value_proposition: { forward_verb: "enables", reverse_verb: "enabled_by", classification: "cross-domain", source_type: "key_resource", target_type: "value_proposition" },
2065
2067
  // 4.3 Go-To-Market Domain
@@ -3826,7 +3828,12 @@ var UPG_VALID_CHILDREN = {
3826
3828
  ],
3827
3829
  // ── Data & Analytics hierarchy ───────────────────────────────────────────────
3828
3830
  data_source: ["metric", "data_pipeline", "data_lineage", "event_schema"],
3829
- metric: ["metric", "outcome", "data_quality_rule", "metric_quality_assessment"],
3831
+ // UPG-685 T0.4 (0.13.0 Wave 1): `outcome` removed as a metric child. It closed a
3832
+ // containment cycle (outcome ⊃ metric ⊃ outcome) and was backed only by the CAUSAL
3833
+ // `metric_drives_outcome` edge, not a hierarchy edge — the "metric leads to outcome"
3834
+ // meaning lives correctly on that causal edge. The real containment (outcome ⊃ metric)
3835
+ // is kept. Sub-metric trees (metric ⊃ metric) stay.
3836
+ metric: ["metric", "data_quality_rule", "metric_quality_assessment"],
3830
3837
  data_domain: ["data_product", "data_source", "glossary_term", "data_model", "dashboard"],
3831
3838
  dashboard: ["report", "experiment_run"],
3832
3839
  // ── Content & Knowledge hierarchy ────────────────────────────────────────────
@@ -4229,43 +4236,6 @@ var SOLUTION_LIFECYCLE = {
4229
4236
  }
4230
4237
  ]
4231
4238
  };
4232
- var HYPOTHESIS_LIFECYCLE = {
4233
- entity_type: "hypothesis",
4234
- initial_phase: "untested",
4235
- terminal_phases: ["resolved"],
4236
- phases: [
4237
- {
4238
- id: "untested",
4239
- label: "Untested",
4240
- description: "The belief is stated. No experiment has been designed or run.",
4241
- transitions_to: ["testing"]
4242
- },
4243
- {
4244
- id: "testing",
4245
- label: "Testing",
4246
- description: "An experiment is actively running to test this hypothesis. Evidence is being gathered.",
4247
- transitions_to: ["resolved"]
4248
- },
4249
- {
4250
- id: "resolved",
4251
- label: "Resolved",
4252
- 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).",
4253
- transitions_to: [],
4254
- core_states: [
4255
- {
4256
- id: "validated",
4257
- label: "Validated",
4258
- description: "Evidence supports the hypothesis. The belief held. Learnings can inform solution design."
4259
- },
4260
- {
4261
- id: "invalidated",
4262
- label: "Invalidated",
4263
- description: "Evidence contradicts the hypothesis. The belief did not hold. Learnings prevent investment in the wrong direction."
4264
- }
4265
- ]
4266
- }
4267
- ]
4268
- };
4269
4239
  var HYPOTHESIS_CLAIM_LIFECYCLE = {
4270
4240
  entity_type: "hypothesis",
4271
4241
  initial_phase: "drafted",
@@ -6418,9 +6388,7 @@ var UPG_LIFECYCLES = [
6418
6388
  OPPORTUNITY_LIFECYCLE,
6419
6389
  SOLUTION_LIFECYCLE,
6420
6390
  HYPOTHESIS_CLAIM_LIFECYCLE,
6421
- // v0.4.0 canonical (re-promoted as 'hypothesis')
6422
- HYPOTHESIS_LIFECYCLE,
6423
- // pre-v0.2.8 legacy (retained for migration compat)
6391
+ // 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.
6424
6392
  EXPERIMENT_LIFECYCLE,
6425
6393
  EXPERIMENT_PLAN_LIFECYCLE,
6426
6394
  EXPERIMENT_RUN_LIFECYCLE,
@@ -9028,6 +8996,7 @@ var UPG_EDGE_MIGRATIONS = {
9028
8996
  { 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." },
9029
8997
  { 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." },
9030
8998
  { 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." },
8999
+ { 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." },
9031
9000
  // ── Tier 2: tense / suffix twins ──
9032
9001
  { 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." },
9033
9002
  { 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." },
@@ -21097,6 +21066,29 @@ var UPG_TREE_PATTERNS = [
21097
21066
  // readable money-model overview; `depth` extends into the metric -> metric
21098
21067
  // decomposition waterfall.
21099
21068
  natural_depth: 3
21069
+ },
21070
+ {
21071
+ id: "north_star",
21072
+ label: "North Star impact",
21073
+ 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.",
21074
+ framework_id: "north-star-metric",
21075
+ region: "strategy_outcomes",
21076
+ gap_policy: "all-optional",
21077
+ anchor_type: "metric",
21078
+ // A north-star tree roots at a metric by definition; no fallback (no metric =
21079
+ // no north-star view, honestly empty rather than rooting elsewhere).
21080
+ fallback_anchors: [],
21081
+ child_map: {
21082
+ // A metric decomposes into its input/sub-metrics (the `metric_decomposes_into_metric`
21083
+ // hierarchy) AND drives the outcomes it predicts (the causal `metric_drives_outcome`).
21084
+ // The outcome is a child by INFLUENCE, not containment — the leading-to-lagging chain.
21085
+ // Following the causal edge by type-adjacency (cf. `strategy`'s initiative -> outcome)
21086
+ // is how the metric-rooted view renders without re-creating the metric ⊃ outcome
21087
+ // containment cycle removed in UPG-685 T0.4. The assembler's `seen` set terminates the
21088
+ // metric -> metric recursion for free.
21089
+ metric: [opt("metric"), opt("outcome")]
21090
+ },
21091
+ natural_depth: 3
21100
21092
  }
21101
21093
  ];
21102
21094
  var UPG_TREE_PATTERNS_BY_ID = Object.fromEntries(
@@ -28505,11 +28497,6 @@ var UPG_REGIONS = [
28505
28497
  edge_id: "key_result_quantified_by_metric",
28506
28498
  crosses_into: "strategy_outcomes"
28507
28499
  },
28508
- {
28509
- direction: "import",
28510
- edge_id: "revenue_stream_measured_by_metric_cross_domain",
28511
- crosses_into: "business_gtm_growth"
28512
- },
28513
28500
  {
28514
28501
  direction: "import",
28515
28502
  edge_id: "service_level_objective_tracks_metric",
@@ -29530,7 +29517,7 @@ function isCanonical(text) {
29530
29517
  }
29531
29518
 
29532
29519
  // src/index.ts
29533
- var UPG_VERSION = "0.12.8";
29520
+ var UPG_VERSION = "0.13.0";
29534
29521
  var UPG_FORMAT_VERSION = "0.4.0";
29535
29522
  var MARKDOWN_FORMAT_VERSION = "0.1";
29536
29523
  var UPG_TYPES = getTypes();