@unified-product-graph/mcp-server 0.9.1 → 0.9.2

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.js CHANGED
@@ -1303,8 +1303,24 @@ var UPG_EDGE_CATALOG = {
1303
1303
  journey_step_realised_by_feature: { forward_verb: "realised_by", reverse_verb: "realises", classification: "cross-domain", source_type: "journey_step", target_type: "feature" },
1304
1304
  opportunity_improves_user_journey: { forward_verb: "improves", reverse_verb: "improved_by", classification: "cross-domain", source_type: "opportunity", target_type: "user_journey" },
1305
1305
  user_journey_passes_through_journey_phase: { forward_verb: "passes_through", reverse_verb: "is_phase_of", classification: "hierarchy", source_type: "user_journey", target_type: "journey_phase" },
1306
- journey_phase_has_step: { forward_verb: "has_step", reverse_verb: "is_step_in", classification: "hierarchy", source_type: "journey_phase", target_type: "journey_step" },
1306
+ // (since v0.9.2, UPG-663) A journey_phase is a temporal BAND over the
1307
+ // journey's single step timeline, not a container that owns steps. Steps
1308
+ // belong to the journey via `user_journey_contains_journey_step` (the stable
1309
+ // 0.1.0 spine); a phase merely SPANS a range of them. Mirrors the marketing
1310
+ // precedent `customer_journey_stage_spans_journey_step`. Renamed from the
1311
+ // owning `journey_phase_has_step` (hierarchy) so a step has exactly one
1312
+ // containment parent. See UPG_EDGE_MIGRATIONS['0.9.2'].
1313
+ journey_phase_spans_journey_step: { forward_verb: "spans", reverse_verb: "spanned_by", classification: "cross-domain", source_type: "journey_phase", target_type: "journey_step" },
1307
1314
  journey_step_has_action: { forward_verb: "has_action", reverse_verb: "is_action_in", classification: "hierarchy", source_type: "journey_step", target_type: "journey_action" },
1315
+ // (since v0.9.2, UPG-663) journey_action outbound edges. Fixes the
1316
+ // discovery dead-end (D2). The finest blueprint layer carries pain_score /
1317
+ // opportunity_score "to drive opportunity discovery" but previously had zero
1318
+ // outbound edges. Opportunity discovery routes through `need` (mirroring
1319
+ // `journey_step_reveals_need`), which already reaches `opportunity` via the
1320
+ // user chain; the action does not link an opportunity directly. The feature
1321
+ // edge mirrors `journey_step_realised_by_feature` one level deeper.
1322
+ journey_action_surfaces_need: { forward_verb: "surfaces", reverse_verb: "surfaced_in", classification: "cross-domain", source_type: "journey_action", target_type: "need" },
1323
+ journey_action_realised_by_feature: { forward_verb: "realised_by", reverse_verb: "realises", classification: "cross-domain", source_type: "journey_action", target_type: "feature" },
1308
1324
  // 2.5 UI System Domain
1309
1325
  product_systematised_in_design_system: { forward_verb: "systematised_in", reverse_verb: "systematises", classification: "hierarchy", source_type: "product", target_type: "design_system" },
1310
1326
  product_built_with_design_component: { forward_verb: "built_with", reverse_verb: "built_for", classification: "hierarchy", source_type: "product", target_type: "design_component" },
@@ -3029,8 +3045,13 @@ var UPG_VALID_CHILDREN = {
3029
3045
  // parallel to `observation: ['quote']`. Research-synthesis canon.
3030
3046
  // Pairs with `insight_evidenced_by_quote` in the edge catalog.
3031
3047
  // ── Design hierarchy ────────────────────────────────────────────────────────
3048
+ // (UPG-663, v0.9.2) A user_journey owns its steps (the stable 0.1.0 spine)
3049
+ // and carries phases as a non-owning band overlay. A journey_phase is NO
3050
+ // LONGER a containment parent of journey_step: it SPANS steps via the
3051
+ // `journey_phase_spans_journey_step` edge (mirroring the marketing
3052
+ // `customer_journey_stage_spans_journey_step` precedent), so each step has
3053
+ // exactly one containment parent and the journey has one canonical step list.
3032
3054
  user_journey: ["journey_step", "journey_phase"],
3033
- journey_phase: ["journey_step"],
3034
3055
  journey_step: ["journey_action"],
3035
3056
  // v0.5.8 (UPG-528 Part 2d): insights own their evidencing quotes;
3036
3057
  // parallel to `observation: ['quote']`. Research-synthesis canon
@@ -7127,6 +7148,20 @@ var UPG_SPLIT_MIGRATIONS = {
7127
7148
  ]
7128
7149
  };
7129
7150
  var UPG_EDGE_MIGRATIONS = {
7151
+ "0.9.2": [
7152
+ // (since v0.9.2, UPG-663) Journey-model disambiguation. A journey_phase
7153
+ // is a temporal BAND over the journey's single step timeline, not a
7154
+ // container that owns steps. The owning hierarchy edge
7155
+ // `journey_phase_has_step` is renamed to the non-owning
7156
+ // `journey_phase_spans_journey_step` (mirroring the marketing precedent
7157
+ // `customer_journey_stage_spans_journey_step`). Steps stay owned by the
7158
+ // journey via `user_journey_contains_journey_step` (the stable 0.1.0
7159
+ // spine), so each step keeps a single containment parent and the journey
7160
+ // renders one canonical step list. Endpoints are unchanged
7161
+ // (journey_phase → journey_step); only the edge key and its grammar
7162
+ // (verb has_step → spans, classification hierarchy → cross-domain) change.
7163
+ { kind: "rename", from: "journey_phase_has_step", to: "journey_phase_spans_journey_step", requires_source_type: "journey_phase", requires_target_type: "journey_step", reason: "Journey-model disambiguation (UPG-663): a phase spans steps, it does not own them. The phase to step edge becomes non-owning (verb has_step to spans), so the step keeps a single containment parent (the journey) and the journey has one canonical step list." }
7164
+ ],
7130
7165
  "0.9.0": [
7131
7166
  // (since v0.9.0, UPG-660) theme → roadmap_theme. The four canonical edges that
7132
7167
  // touch the roadmap theme are renamed to the roadmap_theme form. Endpoint guards
@@ -9545,6 +9580,7 @@ var UPG_PROPERTY_SCHEMA = {
9545
9580
  },
9546
9581
  // JourneyActionProperties: Discrete action at a journey step, classified by service layer.
9547
9582
  journey_action: {
9583
+ action_order: { type: "number", description: "Display order of this action within its step (0-indexed). The scalar ordering convention shared with `journey_phase.phase_order` and `journey_step.step_order` (UPG-663). Orders the service-blueprint rows within a single moment." },
9548
9584
  layer: { type: "string", enum: ["user", "frontstage", "backstage", "support"], description: "Service layer" },
9549
9585
  action_description: { type: "string", description: "Plain-language description. Primary content of the action." },
9550
9586
  channel: { type: "string", enum: ["in-app", "email", "web", "mobile", "phone", "in-person", "sms", "social", "other"], description: "Channel or surface. Keeps service-blueprint columns consistent across the journey." },
@@ -9576,7 +9612,7 @@ var UPG_PROPERTY_SCHEMA = {
9576
9612
  system: { type: "string", description: "Performing system or service" },
9577
9613
  notes: { type: "string", description: "Free-text notes, observations, or follow-up questions" }
9578
9614
  },
9579
- // JourneyPhaseProperties: Phase within a user journey. Groups journey steps into stages.
9615
+ // JourneyPhaseProperties: Phase within a user journey. A temporal BAND over the journey's step
9580
9616
  journey_phase: {
9581
9617
  phase_order: { type: "number", description: "Display order within the journey (0-indexed)" },
9582
9618
  label: { type: "string", description: 'Short human-readable name. @example "Discovery", "Onboarding", "Activation"' },
@@ -9587,8 +9623,9 @@ var UPG_PROPERTY_SCHEMA = {
9587
9623
  key_questions: { type: "string[]", description: "Open questions the user asks themselves. Fuel for design and content priorities." },
9588
9624
  timeframe: { type: "string", description: 'Typical time window. @example "first 30 seconds", "days 1\u20137", "onboarding week"' }
9589
9625
  },
9590
- // JourneyStepProperties: Single step within a user journey.
9626
+ // JourneyStepProperties: Single step within a user journey. A user-moment on the journey's single
9591
9627
  journey_step: {
9628
+ step_order: { type: "number", description: "Display order within the journey's step timeline (0-indexed). The scalar ordering convention shared with `journey_phase.phase_order` and `journey_action.action_order` (UPG-663). For branching journeys, the explicit `journey_step_precedes_journey_step` edge captures the chain." },
9592
9629
  touchpoint: { type: "string", description: "Interaction touchpoint" },
9593
9630
  channel: { type: "string", description: 'Channel (e.g. "web", "email", "in-store")' },
9594
9631
  emotion_score: {
@@ -17073,8 +17110,13 @@ var STANDARD_LABELS = {
17073
17110
  interview_guide: { alt_labels: ["discussion guide", "interview script", "moderator guide"] },
17074
17111
  survey_response: { alt_labels: ["survey answer", "questionnaire response"] },
17075
17112
  // Design layer
17076
- user_journey: { alt_labels: ["journey map", "customer journey", "experience map", "journey"] },
17077
- journey_step: { alt_labels: ["touchpoint", "journey stage", "journey phase"] },
17113
+ // (UPG-663) alt_labels must not collide with other entity types' canonical
17114
+ // names or alt_labels, or the string->type resolver is ambiguous.
17115
+ // Dropped 'customer journey' (collides with customer_journey_stage),
17116
+ // 'touchpoint' and 'journey phase' (both distinct entity surfaces: a
17117
+ // touchpoint is the journey_step.touchpoint property, a phase is journey_phase).
17118
+ user_journey: { alt_labels: ["journey map", "experience map", "journey"] },
17119
+ journey_step: { alt_labels: ["journey moment", "journey stage"] },
17078
17120
  design_component: { alt_labels: ["component", "ui component", "design element"] },
17079
17121
  design_token: { alt_labels: ["token", "style token", "css variable"] },
17080
17122
  wireframe: { alt_labels: ["wireflow", "lo-fi mockup", "skeleton"] },
@@ -19086,7 +19128,11 @@ var PRODUCT_SPEC_GUIDE = {
19086
19128
  var UX_DESIGN_GUIDE = {
19087
19129
  domain_id: "ux_design",
19088
19130
  anchor_entity: "user_journey",
19089
- creation_sequence: ["user_journey", "journey_phase", "journey_action", "journey_step", "screen", "screen_state", "user_flow", "wireframe", "prototype", "design_question", "design_concept"],
19131
+ // (UPG-663) creation order follows containment: a journey_action is a child
19132
+ // of a journey_step, so the step must precede the action. The journey is the
19133
+ // anchor; phases are the band overlay; steps are the timeline; actions
19134
+ // decompose a step into service-blueprint rows.
19135
+ creation_sequence: ["user_journey", "journey_phase", "journey_step", "journey_action", "screen", "screen_state", "user_flow", "wireframe", "prototype", "design_question", "design_concept"],
19090
19136
  patterns: [
19091
19137
  {
19092
19138
  name: "Journey to Screen Flow",
@@ -22358,6 +22404,40 @@ var UPG_ANTI_PATTERNS = [
22358
22404
  stages: ["concept", "validation", "build", "beta", "launch", "growth", "mature"],
22359
22405
  severity: "medium",
22360
22406
  source: { kind: "fundamental" }
22407
+ },
22408
+ // ── Experience-design layer ─────────────────────────────────────────────
22409
+ {
22410
+ id: "journey-phases-without-canonical-steps",
22411
+ name: "Journey phases without a step spine",
22412
+ description: 'The graph has journey phases spanning steps (`journey_phase_spans_journey_step`), but no journey owns its steps via `user_journey_contains_journey_step`. A phase is a band over a step timeline, not a container. When the timeline itself is missing there is no canonical answer to "what are the steps of this journey?". The phase overlay points at steps the journey does not own.',
22413
+ structured_condition: {
22414
+ operator: "and",
22415
+ checks: [
22416
+ {
22417
+ check: {
22418
+ type: "relationship",
22419
+ source_type: "journey_phase",
22420
+ edge_type: "journey_phase_spans_journey_step",
22421
+ target_type: "journey_step",
22422
+ comparison: "exists"
22423
+ }
22424
+ },
22425
+ {
22426
+ check: {
22427
+ type: "relationship",
22428
+ source_type: "user_journey",
22429
+ edge_type: "user_journey_contains_journey_step",
22430
+ target_type: "journey_step",
22431
+ comparison: "not_exists"
22432
+ }
22433
+ }
22434
+ ]
22435
+ },
22436
+ why_it_matters: "Steps owned by no journey render a different step list per consumer: the phase overlay sees them, a journey-direct walk does not. The journey has no deterministic step spine to traverse, score, or map to screens.",
22437
+ remediation: "Own every step under its journey with `user_journey_contains_journey_step`, then let phases span ranges of that single timeline via `journey_phase_spans_journey_step`. The phase is a non-owning band overlay, not the step container.",
22438
+ stages: ["concept", "validation", "build", "beta", "launch", "growth"],
22439
+ severity: "high",
22440
+ source: { kind: "fundamental" }
22361
22441
  }
22362
22442
  ];
22363
22443
  var SEVERITY_ORDER = {
@@ -24647,7 +24727,7 @@ function serializePortfolioWithHeader(doc, opts) {
24647
24727
  header.integrity = { algorithm: INTEGRITY_ALGORITHM, body: computeBodyChecksum(doc) };
24648
24728
  return JSON.stringify({ $upg: header, ...body }, null, 2) + "\n";
24649
24729
  }
24650
- var UPG_VERSION = "0.9.1";
24730
+ var UPG_VERSION = "0.9.2";
24651
24731
  var MARKDOWN_FORMAT_VERSION = "0.1";
24652
24732
  var UPG_TYPES = getTypes();
24653
24733
  var UPG_TYPES_SET = new Set(UPG_TYPES);