@unified-product-graph/mcp-server 0.8.7 → 0.8.8

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
@@ -11079,7 +11079,6 @@ var UPG_PROPERTY_SCHEMA = {
11079
11079
  function getPropertySchema(entityType) {
11080
11080
  return UPG_PROPERTY_SCHEMA[entityType];
11081
11081
  }
11082
- var crossProductEdgeTypeSet = new Set(UPG_CROSS_EDGE_TYPES);
11083
11082
  var UPG_FRAMEWORKS = [
11084
11083
  {
11085
11084
  "id": "opportunity-solution-tree",
@@ -11297,31 +11296,37 @@ var UPG_FRAMEWORKS = [
11297
11296
  "slots": [
11298
11297
  {
11299
11298
  "label": "Customer Jobs",
11299
+ "role": "customer_job",
11300
11300
  "entityTypeId": "job",
11301
11301
  "description": "Place job entities in the Customer Jobs position of the matrix"
11302
11302
  },
11303
11303
  {
11304
11304
  "label": "Pains",
11305
+ "role": "pain",
11305
11306
  "entityTypeId": "need",
11306
11307
  "description": "Place need entities in the Pains position of the matrix"
11307
11308
  },
11308
11309
  {
11309
11310
  "label": "Gains",
11311
+ "role": "gain",
11310
11312
  "entityTypeId": "desired_outcome",
11311
11313
  "description": "Place desired outcome entities in the Gains position of the matrix"
11312
11314
  },
11313
11315
  {
11314
11316
  "label": "Products & Services",
11317
+ "role": "product_or_service",
11315
11318
  "entityTypeId": "feature",
11316
11319
  "description": "Place feature entities in the Products & Services position of the matrix"
11317
11320
  },
11318
11321
  {
11319
11322
  "label": "Pain Relievers",
11323
+ "role": "pain_reliever",
11320
11324
  "entityTypeId": "feature",
11321
11325
  "description": "Place feature entities in the Pain Relievers position of the matrix"
11322
11326
  },
11323
11327
  {
11324
11328
  "label": "Gain Creators",
11329
+ "role": "gain_creator",
11325
11330
  "entityTypeId": "feature",
11326
11331
  "description": "Place feature entities in the Gain Creators position of the matrix"
11327
11332
  }
@@ -11950,26 +11955,31 @@ var UPG_FRAMEWORKS = [
11950
11955
  "slots": [
11951
11956
  {
11952
11957
  "label": "Competitive Rivalry",
11958
+ "role": "competitive_rivalry",
11953
11959
  "entityTypeId": "competitor",
11954
11960
  "description": "Intensity of competition among existing players"
11955
11961
  },
11956
11962
  {
11957
11963
  "label": "Threat of New Entrants",
11964
+ "role": "new_entrants",
11958
11965
  "entityTypeId": "competitor",
11959
11966
  "description": "How easy is it for new competitors to enter?"
11960
11967
  },
11961
11968
  {
11962
11969
  "label": "Threat of Substitutes",
11970
+ "role": "substitutes",
11963
11971
  "entityTypeId": "competitor",
11964
11972
  "description": "Can customers switch to alternatives?"
11965
11973
  },
11966
11974
  {
11967
11975
  "label": "Buyer Power",
11976
+ "role": "buyer_power",
11968
11977
  "entityTypeId": "persona",
11969
11978
  "description": "How much leverage do buyers have?"
11970
11979
  },
11971
11980
  {
11972
11981
  "label": "Supplier Power",
11982
+ "role": "supplier_power",
11973
11983
  "entityTypeId": "persona",
11974
11984
  "description": "How much leverage do suppliers have?"
11975
11985
  }
@@ -12137,31 +12147,37 @@ var UPG_FRAMEWORKS = [
12137
12147
  "slots": [
12138
12148
  {
12139
12149
  "label": "Inbound Logistics",
12150
+ "role": "inbound_logistics",
12140
12151
  "entityTypeId": "key_activity",
12141
12152
  "description": "Inbound Logistics phase: key activity entities move through this stage"
12142
12153
  },
12143
12154
  {
12144
12155
  "label": "Operations",
12156
+ "role": "operations",
12145
12157
  "entityTypeId": "key_activity",
12146
12158
  "description": "Operations phase: key activity entities move through this stage"
12147
12159
  },
12148
12160
  {
12149
12161
  "label": "Outbound Logistics",
12162
+ "role": "outbound_logistics",
12150
12163
  "entityTypeId": "key_activity",
12151
12164
  "description": "Outbound Logistics phase: key activity entities move through this stage"
12152
12165
  },
12153
12166
  {
12154
12167
  "label": "Marketing & Sales",
12168
+ "role": "marketing_and_sales",
12155
12169
  "entityTypeId": "key_activity",
12156
12170
  "description": "Marketing & Sales phase: key activity entities move through this stage"
12157
12171
  },
12158
12172
  {
12159
12173
  "label": "Service",
12174
+ "role": "service",
12160
12175
  "entityTypeId": "key_activity",
12161
12176
  "description": "Service phase: key activity entities move through this stage"
12162
12177
  },
12163
12178
  {
12164
12179
  "label": "Support Activities",
12180
+ "role": "support_activity",
12165
12181
  "entityTypeId": "capability",
12166
12182
  "description": "Support Activities phase: capability entities move through this stage"
12167
12183
  }
@@ -12232,26 +12248,31 @@ var UPG_FRAMEWORKS = [
12232
12248
  "slots": [
12233
12249
  {
12234
12250
  "label": "Portfolio",
12251
+ "role": "portfolio",
12235
12252
  "entityTypeId": "portfolio",
12236
12253
  "description": "Innovation portfolio balanced across three horizons: core performance, emerging growth, and future creation"
12237
12254
  },
12238
12255
  {
12239
12256
  "label": "Product",
12257
+ "role": "product",
12240
12258
  "entityTypeId": "product",
12241
12259
  "description": "Product or business unit assigned to a horizon: H1 (defend and extend), H2 (build), or H3 (seed and explore)"
12242
12260
  },
12243
12261
  {
12244
12262
  "label": "Initiative",
12263
+ "role": "initiative",
12245
12264
  "entityTypeId": "portfolio",
12246
12265
  "description": "Growth initiative positioned in a horizon, with appropriate funding model, governance, and success metrics"
12247
12266
  },
12248
12267
  {
12249
12268
  "label": "Product Area",
12269
+ "role": "product_area",
12250
12270
  "entityTypeId": "product_area",
12251
12271
  "description": "Product area representing a horizon: core products (H1), adjacent expansions (H2), or experimental ventures (H3)"
12252
12272
  },
12253
12273
  {
12254
12274
  "label": "Capability",
12275
+ "role": "capability",
12255
12276
  "entityTypeId": "capability",
12256
12277
  "description": "Capability needed to execute across horizons: H1 needs efficiency, H2 needs scaling, H3 needs discovery"
12257
12278
  }
@@ -12731,21 +12752,25 @@ var UPG_FRAMEWORKS = [
12731
12752
  "slots": [
12732
12753
  {
12733
12754
  "label": "Must-haves",
12755
+ "role": "must_have",
12734
12756
  "entityTypeId": "feature",
12735
12757
  "description": "Expected features: absence causes dissatisfaction"
12736
12758
  },
12737
12759
  {
12738
12760
  "label": "Performance",
12761
+ "role": "performance",
12739
12762
  "entityTypeId": "feature",
12740
12763
  "description": "More is better: linear satisfaction increase"
12741
12764
  },
12742
12765
  {
12743
12766
  "label": "Delighters",
12767
+ "role": "delighter",
12744
12768
  "entityTypeId": "feature",
12745
12769
  "description": "Unexpected features: presence creates delight"
12746
12770
  },
12747
12771
  {
12748
12772
  "label": "Indifferent",
12773
+ "role": "indifferent",
12749
12774
  "entityTypeId": "feature",
12750
12775
  "description": "Features users don't care about either way"
12751
12776
  }
@@ -12754,7 +12779,7 @@ var UPG_FRAMEWORKS = [
12754
12779
  "entity_types": [
12755
12780
  {
12756
12781
  "type": "feature",
12757
- "role": "item"
12782
+ "role": "scored_item"
12758
12783
  }
12759
12784
  ],
12760
12785
  "required_properties": {
@@ -12838,7 +12863,90 @@ var UPG_FRAMEWORKS = [
12838
12863
  "label": "Dissatisfaction Coefficient",
12839
12864
  "format": "number"
12840
12865
  }
12841
- ]
12866
+ ],
12867
+ "scoring_lens": {
12868
+ "applies_to": [
12869
+ "feature"
12870
+ ],
12871
+ "inputs": [
12872
+ {
12873
+ "property": "functional_response",
12874
+ "type": "enum",
12875
+ "required": true,
12876
+ "scope": "framework",
12877
+ "label": "Functional Response",
12878
+ "description": "How users feel when the feature IS present",
12879
+ "enum_values": [
12880
+ "i_like_it",
12881
+ "i_expect_it",
12882
+ "i_am_neutral",
12883
+ "i_can_tolerate_it",
12884
+ "i_dislike_it"
12885
+ ]
12886
+ },
12887
+ {
12888
+ "property": "dysfunctional_response",
12889
+ "type": "enum",
12890
+ "required": true,
12891
+ "scope": "framework",
12892
+ "label": "Dysfunctional Response",
12893
+ "description": "How users feel when the feature IS NOT present",
12894
+ "enum_values": [
12895
+ "i_like_it",
12896
+ "i_expect_it",
12897
+ "i_am_neutral",
12898
+ "i_can_tolerate_it",
12899
+ "i_dislike_it"
12900
+ ]
12901
+ },
12902
+ {
12903
+ "property": "delighter_count",
12904
+ "type": "number",
12905
+ "required": false,
12906
+ "scope": "framework",
12907
+ "label": "Delighter classifications",
12908
+ "description": "Count of survey responses classifying this feature as a delighter (attractive)"
12909
+ },
12910
+ {
12911
+ "property": "performance_count",
12912
+ "type": "number",
12913
+ "required": false,
12914
+ "scope": "framework",
12915
+ "label": "Performance classifications",
12916
+ "description": "Count of survey responses classifying this feature as performance (one-dimensional)"
12917
+ },
12918
+ {
12919
+ "property": "must_be_count",
12920
+ "type": "number",
12921
+ "required": false,
12922
+ "scope": "framework",
12923
+ "label": "Must-be classifications",
12924
+ "description": "Count of survey responses classifying this feature as must-be (basic)"
12925
+ },
12926
+ {
12927
+ "property": "indifferent_count",
12928
+ "type": "number",
12929
+ "required": false,
12930
+ "scope": "framework",
12931
+ "label": "Indifferent classifications",
12932
+ "description": "Count of survey responses classifying this feature as indifferent"
12933
+ }
12934
+ ],
12935
+ "computed": [
12936
+ {
12937
+ "property": "satisfaction_coefficient",
12938
+ "expression": "(delighter_count + performance_count) / (delighter_count + performance_count + must_be_count + indifferent_count)",
12939
+ "label": "Satisfaction Coefficient",
12940
+ "format": "number"
12941
+ },
12942
+ {
12943
+ "property": "dissatisfaction_coefficient",
12944
+ "expression": "(must_be_count + performance_count) / (delighter_count + performance_count + must_be_count + indifferent_count) * -1",
12945
+ "label": "Dissatisfaction Coefficient",
12946
+ "format": "number"
12947
+ }
12948
+ ]
12949
+ }
12842
12950
  },
12843
12951
  "structure": {
12844
12952
  "pattern": "matrix"
@@ -12893,16 +13001,19 @@ var UPG_FRAMEWORKS = [
12893
13001
  "slots": [
12894
13002
  {
12895
13003
  "label": "Now",
13004
+ "role": "now",
12896
13005
  "entityTypeId": "feature",
12897
13006
  "description": "Committed work in progress"
12898
13007
  },
12899
13008
  {
12900
13009
  "label": "Next",
13010
+ "role": "next",
12901
13011
  "entityTypeId": "feature",
12902
13012
  "description": "High-confidence upcoming work"
12903
13013
  },
12904
13014
  {
12905
13015
  "label": "Later",
13016
+ "role": "later",
12906
13017
  "entityTypeId": "initiative",
12907
13018
  "description": "Exploratory, needs more discovery"
12908
13019
  }
@@ -13418,26 +13529,31 @@ var UPG_FRAMEWORKS = [
13418
13529
  "slots": [
13419
13530
  {
13420
13531
  "label": "Atoms",
13532
+ "role": "atom",
13421
13533
  "entityTypeId": "design_component",
13422
13534
  "description": "Atoms: design component entities for this dimension of the framework"
13423
13535
  },
13424
13536
  {
13425
13537
  "label": "Molecules",
13538
+ "role": "molecule",
13426
13539
  "entityTypeId": "design_component",
13427
13540
  "description": "Molecules: design token entities for this dimension of the framework"
13428
13541
  },
13429
13542
  {
13430
13543
  "label": "Organisms",
13544
+ "role": "organism",
13431
13545
  "entityTypeId": "design_pattern",
13432
13546
  "description": "Organisms: design pattern entities for this dimension of the framework"
13433
13547
  },
13434
13548
  {
13435
13549
  "label": "Templates",
13550
+ "role": "template",
13436
13551
  "entityTypeId": "wireframe",
13437
13552
  "description": "Templates: design system entities for this dimension of the framework"
13438
13553
  },
13439
13554
  {
13440
13555
  "label": "Pages",
13556
+ "role": "page",
13441
13557
  "entityTypeId": "screen",
13442
13558
  "description": "Pages: screen entities for this dimension of the framework"
13443
13559
  }
@@ -14102,26 +14218,31 @@ var UPG_FRAMEWORKS = [
14102
14218
  "slots": [
14103
14219
  {
14104
14220
  "label": "Outer Ring",
14221
+ "role": "outer_ring",
14105
14222
  "entityTypeId": "acquisition_channel",
14106
14223
  "description": "All 19 traction channels brainstormed"
14107
14224
  },
14108
14225
  {
14109
14226
  "label": "Middle Ring",
14227
+ "role": "middle_ring",
14110
14228
  "entityTypeId": "acquisition_channel",
14111
14229
  "description": "Top 6 channels worth testing"
14112
14230
  },
14113
14231
  {
14114
14232
  "label": "Inner Ring",
14233
+ "role": "inner_ring",
14115
14234
  "entityTypeId": "acquisition_channel",
14116
14235
  "description": "Top 3 channels to focus on"
14117
14236
  },
14118
14237
  {
14119
14238
  "label": "Traction Test",
14239
+ "role": "traction_test",
14120
14240
  "entityTypeId": "growth_campaign",
14121
14241
  "description": "Cheap test for each channel"
14122
14242
  },
14123
14243
  {
14124
14244
  "label": "Bullseye Channel",
14245
+ "role": "bullseye_channel",
14125
14246
  "entityTypeId": "acquisition_channel",
14126
14247
  "description": "The single best-performing channel"
14127
14248
  }
@@ -14191,26 +14312,31 @@ var UPG_FRAMEWORKS = [
14191
14312
  "slots": [
14192
14313
  {
14193
14314
  "label": "Free Entry",
14315
+ "role": "free_entry",
14194
14316
  "entityTypeId": "gtm_strategy",
14195
14317
  "description": "How users access the product for free"
14196
14318
  },
14197
14319
  {
14198
14320
  "label": "Aha Moment",
14321
+ "role": "aha_moment",
14199
14322
  "entityTypeId": "gtm_strategy",
14200
14323
  "description": "First experience of core value"
14201
14324
  },
14202
14325
  {
14203
14326
  "label": "Expansion Motion",
14327
+ "role": "expansion_motion",
14204
14328
  "entityTypeId": "sales_motion",
14205
14329
  "description": "How usage spreads within accounts"
14206
14330
  },
14207
14331
  {
14208
14332
  "label": "Monetisation Trigger",
14333
+ "role": "monetisation_trigger",
14209
14334
  "entityTypeId": "gtm_strategy",
14210
14335
  "description": "When and how to convert to paid"
14211
14336
  },
14212
14337
  {
14213
14338
  "label": "Metric",
14339
+ "role": "metric",
14214
14340
  "entityTypeId": "metric",
14215
14341
  "description": "Key metric driving the PLG motion"
14216
14342
  }
@@ -14285,21 +14411,25 @@ var UPG_FRAMEWORKS = [
14285
14411
  "slots": [
14286
14412
  {
14287
14413
  "label": "Objective",
14414
+ "role": "objective",
14288
14415
  "entityTypeId": "objective",
14289
14416
  "description": "Qualitative, inspiring goal"
14290
14417
  },
14291
14418
  {
14292
14419
  "label": "Key Result 1",
14420
+ "role": "key_result",
14293
14421
  "entityTypeId": "key_result",
14294
14422
  "description": "Measurable outcome proving progress"
14295
14423
  },
14296
14424
  {
14297
14425
  "label": "Key Result 2",
14426
+ "role": "key_result",
14298
14427
  "entityTypeId": "key_result",
14299
14428
  "description": "Measurable outcome proving progress"
14300
14429
  },
14301
14430
  {
14302
14431
  "label": "Initiatives",
14432
+ "role": "initiative",
14303
14433
  "entityTypeId": "initiative",
14304
14434
  "description": "Work streams that drive key results"
14305
14435
  }
@@ -14373,26 +14503,31 @@ var UPG_FRAMEWORKS = [
14373
14503
  "slots": [
14374
14504
  {
14375
14505
  "label": "Activity",
14506
+ "role": "activity",
14376
14507
  "entityTypeId": "key_activity",
14377
14508
  "description": "Place persona entities in the Activity position of the matrix"
14378
14509
  },
14379
14510
  {
14380
14511
  "label": "Responsible",
14512
+ "role": "responsible",
14381
14513
  "entityTypeId": "role",
14382
14514
  "description": "Does the work"
14383
14515
  },
14384
14516
  {
14385
14517
  "label": "Accountable",
14518
+ "role": "accountable",
14386
14519
  "entityTypeId": "role",
14387
14520
  "description": "Makes the final call"
14388
14521
  },
14389
14522
  {
14390
14523
  "label": "Consulted",
14524
+ "role": "consulted",
14391
14525
  "entityTypeId": "role",
14392
14526
  "description": "Gives input"
14393
14527
  },
14394
14528
  {
14395
14529
  "label": "Informed",
14530
+ "role": "informed",
14396
14531
  "entityTypeId": "role",
14397
14532
  "description": "Kept in the loop"
14398
14533
  }
@@ -14466,21 +14601,25 @@ var UPG_FRAMEWORKS = [
14466
14601
  "slots": [
14467
14602
  {
14468
14603
  "label": "What Went Well",
14604
+ "role": "went_well",
14469
14605
  "entityTypeId": "outcome",
14470
14606
  "description": "Practices to continue"
14471
14607
  },
14472
14608
  {
14473
14609
  "label": "What Didn't Go Well",
14610
+ "role": "went_poorly",
14474
14611
  "entityTypeId": "need",
14475
14612
  "description": "Issues to address"
14476
14613
  },
14477
14614
  {
14478
14615
  "label": "Action Items",
14616
+ "role": "action_item",
14479
14617
  "entityTypeId": "learning",
14480
14618
  "description": "Changes for next iteration"
14481
14619
  },
14482
14620
  {
14483
14621
  "label": "Learnings",
14622
+ "role": "learning",
14484
14623
  "entityTypeId": "learning",
14485
14624
  "description": "Insights to carry forward"
14486
14625
  }
@@ -14841,7 +14980,36 @@ var UPG_FRAMEWORKS = [
14841
14980
  "label": "Severity",
14842
14981
  "format": "number"
14843
14982
  }
14844
- ]
14983
+ ],
14984
+ "scoring_lens": {
14985
+ "applies_to": [
14986
+ "risk"
14987
+ ],
14988
+ "inputs": [
14989
+ {
14990
+ "property": "probability",
14991
+ "type": "number",
14992
+ "required": true,
14993
+ "label": "Probability",
14994
+ "description": "Likelihood the risk materialises (risk.probability assessment)"
14995
+ },
14996
+ {
14997
+ "property": "impact",
14998
+ "type": "number",
14999
+ "required": true,
15000
+ "label": "Impact",
15001
+ "description": "Consequence severity if the risk materialises (risk.impact assessment)"
15002
+ }
15003
+ ],
15004
+ "computed": [
15005
+ {
15006
+ "property": "severity",
15007
+ "expression": "probability * impact",
15008
+ "label": "Severity",
15009
+ "format": "number"
15010
+ }
15011
+ ]
15012
+ }
14845
15013
  },
14846
15014
  "structure": {
14847
15015
  "pattern": "table"
@@ -14917,31 +15085,37 @@ var UPG_FRAMEWORKS = [
14917
15085
  "slots": [
14918
15086
  {
14919
15087
  "label": "Items to score",
15088
+ "role": "candidate",
14920
15089
  "entityTypeId": "feature",
14921
15090
  "description": "Features or experiments being evaluated"
14922
15091
  },
14923
15092
  {
14924
15093
  "label": "Impact",
15094
+ "role": "impact",
14925
15095
  "entityTypeId": "outcome",
14926
15096
  "description": "How much will this move the needle?"
14927
15097
  },
14928
15098
  {
14929
15099
  "label": "Confidence",
15100
+ "role": "confidence",
14930
15101
  "entityTypeId": "assumption",
14931
15102
  "description": "How sure are we about the impact?"
14932
15103
  },
14933
15104
  {
14934
15105
  "label": "Ease",
15106
+ "role": "ease",
14935
15107
  "entityTypeId": "feature",
14936
15108
  "description": "How easy is this to implement?"
14937
15109
  },
14938
15110
  {
14939
15111
  "label": "Opportunities to score",
15112
+ "role": "candidate",
14940
15113
  "entityTypeId": "opportunity",
14941
15114
  "description": "Opportunities scored on the same ICE Scoring inputs as features."
14942
15115
  },
14943
15116
  {
14944
15117
  "label": "Needs to score",
15118
+ "role": "candidate",
14945
15119
  "entityTypeId": "need",
14946
15120
  "description": "Needs scored on the same ICE Scoring inputs as features."
14947
15121
  }
@@ -15192,31 +15366,37 @@ var UPG_FRAMEWORKS = [
15192
15366
  "slots": [
15193
15367
  {
15194
15368
  "label": "Backlog Items",
15369
+ "role": "candidate",
15195
15370
  "entityTypeId": "feature",
15196
15371
  "description": "Backlog Items: feature entries to evaluate"
15197
15372
  },
15198
15373
  {
15199
15374
  "label": "User/Business Value",
15375
+ "role": "user_business_value",
15200
15376
  "entityTypeId": "metric",
15201
15377
  "description": "User/Business Value: metric entries to evaluate"
15202
15378
  },
15203
15379
  {
15204
15380
  "label": "Time Criticality",
15381
+ "role": "time_criticality",
15205
15382
  "entityTypeId": "metric",
15206
15383
  "description": "How much value decays if delivery is delayed (deadlines, competition, seasonal windows)"
15207
15384
  },
15208
15385
  {
15209
15386
  "label": "Risk Reduction / Opportunity Enablement",
15387
+ "role": "risk_reduction",
15210
15388
  "entityTypeId": "metric",
15211
15389
  "description": "Risk Reduction / Opportunity Enablement: metric entries to evaluate"
15212
15390
  },
15213
15391
  {
15214
15392
  "label": "Job Size",
15393
+ "role": "job_size",
15215
15394
  "entityTypeId": "metric",
15216
15395
  "description": "Estimated effort (story points, t-shirt size, or person-weeks)"
15217
15396
  },
15218
15397
  {
15219
15398
  "label": "Opportunities to score",
15399
+ "role": "candidate",
15220
15400
  "entityTypeId": "opportunity",
15221
15401
  "description": "Opportunities scored on the same WSJF (Weighted Shortest Job First) inputs as features."
15222
15402
  }
@@ -15672,16 +15852,19 @@ var UPG_FRAMEWORKS = [
15672
15852
  "slots": [
15673
15853
  {
15674
15854
  "label": "Symptom",
15855
+ "role": "symptom",
15675
15856
  "entityTypeId": "need",
15676
15857
  "description": "The observed problem the analysis starts from."
15677
15858
  },
15678
15859
  {
15679
15860
  "label": "Why chain",
15861
+ "role": "why",
15680
15862
  "entityTypeId": "insight",
15681
15863
  "description": 'Each "why?" answer along the chain, typically five iterations deep.'
15682
15864
  },
15683
15865
  {
15684
15866
  "label": "Root cause",
15867
+ "role": "root_cause",
15685
15868
  "entityTypeId": "insight",
15686
15869
  "description": "The terminal answer at the bottom of the chain: the underlying cause to address."
15687
15870
  }
@@ -16026,16 +16209,19 @@ var UPG_FRAMEWORKS = [
16026
16209
  "slots": [
16027
16210
  {
16028
16211
  "label": "First-order move",
16212
+ "role": "first_order",
16029
16213
  "entityTypeId": "decision",
16030
16214
  "description": "The decision or move under consideration."
16031
16215
  },
16032
16216
  {
16033
16217
  "label": "Second-order consequences",
16218
+ "role": "second_order",
16034
16219
  "entityTypeId": "insight",
16035
16220
  "description": "Downstream effects that follow from the first-order move."
16036
16221
  },
16037
16222
  {
16038
16223
  "label": "Higher-order consequences",
16224
+ "role": "higher_order",
16039
16225
  "entityTypeId": "insight",
16040
16226
  "description": "Third-, fourth-, fifth-order ripples: second-order consequences of the second-order consequences."
16041
16227
  }
@@ -16094,6 +16280,7 @@ for (const fw of UPG_FRAMEWORKS) {
16094
16280
  if (!UPG_FRAMEWORKS_BY_CATEGORY[fw.category]) UPG_FRAMEWORKS_BY_CATEGORY[fw.category] = [];
16095
16281
  UPG_FRAMEWORKS_BY_CATEGORY[fw.category].push(fw);
16096
16282
  }
16283
+ var crossProductEdgeTypeSet = new Set(UPG_CROSS_EDGE_TYPES);
16097
16284
  var PRIORITY_LABELS = [
16098
16285
  // ── need (CONSOLIDATED: replaces pain_point + user_need) ─────────────────────
16099
16286
  {
@@ -24888,12 +25075,13 @@ var listNodes = (args, ctx) => {
24888
25075
  };
24889
25076
  var getNode = (args, ctx) => {
24890
25077
  const { store } = ctx;
24891
- if (!args.node_id) return textError(`Missing required parameter: node_id`);
25078
+ const nodeId2 = args.node_id ?? args.id;
25079
+ if (!nodeId2) return textError(`Missing required parameter: node_id (alias: id)`);
24892
25080
  const result = getNodeLib(store, {
24893
- node_id: args.node_id,
25081
+ node_id: nodeId2,
24894
25082
  compact_edges: args.compact_edges ?? false
24895
25083
  });
24896
- if (!result) return textError(`Node not found: ${args.node_id}`);
25084
+ if (!result) return textError(`Node not found: ${nodeId2}`);
24897
25085
  const typed = result;
24898
25086
  if (typed.node.properties) {
24899
25087
  const { unknown_properties, warning } = checkUnknownProperties(typed.node.type, typed.node.properties);
@@ -26332,7 +26520,10 @@ var listLocalProducts = (_args, _ctx) => {
26332
26520
  };
26333
26521
  var switchProduct = async (args, ctx) => {
26334
26522
  const { store } = ctx;
26335
- const fileArg = args.file;
26523
+ const fileArg = args.file ?? args.product;
26524
+ if (typeof fileArg !== "string" || fileArg.length === 0) {
26525
+ return textError("Missing required parameter: file (alias: product). Pass a .upg path or a bare product name.");
26526
+ }
26336
26527
  let resolved = path3.resolve(fileArg);
26337
26528
  if (!fs.existsSync(resolved)) {
26338
26529
  const cwd = process.cwd();
@@ -27130,9 +27321,11 @@ var validateGraph = (args, ctx) => {
27130
27321
  argsHint: `scope=${scope}, limit=${limit}`
27131
27322
  });
27132
27323
  if (guardOutcome.kind === "refuse") return guardOutcome.result;
27133
- const driftClean = skipDrift || summary.entity_drift === 0 && summary.edge_drift === 0 && summary.top_level_drift === 0 && summary.lifecycle_drift === 0 && summary.self_referential === 0 && summary.property_drift === 0 && edgeTypePairDrift.length === 0 && graphTopologySelfLoops.length === 0 && propertyTypeDrift.length === 0;
27324
+ const structurallyClean = summary.entity_drift === 0 && summary.edge_drift === 0 && summary.top_level_drift === 0 && summary.lifecycle_drift === 0 && summary.self_referential === 0 && summary.property_drift === 0 && edgeTypePairDrift.length === 0 && graphTopologySelfLoops.length === 0 && propertyTypeDrift.length === 0;
27325
+ const driftClean = skipDrift || structurallyClean;
27134
27326
  const antiPatternClean = skipAntiPatterns || (antiPatternViolations?.length ?? 0) === 0;
27135
27327
  const valid = driftClean && antiPatternClean;
27328
+ const structurallyValid = skipDrift ? void 0 : structurallyClean;
27136
27329
  let highCount = 0;
27137
27330
  let mediumCount = 0;
27138
27331
  let lowCount = 0;
@@ -27145,6 +27338,11 @@ var validateGraph = (args, ctx) => {
27145
27338
  }
27146
27339
  const response = {
27147
27340
  valid,
27341
+ // N4 (UPG QA 0.8.7): additive structural-conformance signal. true ⟺ every
27342
+ // drift class is 0, independent of anti-pattern health. Omitted when
27343
+ // `skip_drift` is true (structure was not assessed). A CI gate that wants
27344
+ // "is this graph spec-shaped?" should read this, not `valid`.
27345
+ ...structurallyValid !== void 0 ? { structurally_valid: structurallyValid } : {},
27148
27346
  summary: {
27149
27347
  ...summary,
27150
27348
  spec_version: UPG_VERSION,
@@ -27468,8 +27666,8 @@ var listFrameworks = (args) => {
27468
27666
  return text(JSON.stringify(body, null, 2));
27469
27667
  };
27470
27668
  var getFramework = (args) => {
27471
- const id = args.id;
27472
- if (!id) return textError("Missing required parameter: id");
27669
+ const id = args.id ?? args.framework_id;
27670
+ if (!id) return textError("Missing required parameter: id (alias: framework_id)");
27473
27671
  const framework = UPG_FRAMEWORKS_BY_ID[id];
27474
27672
  if (!framework)
27475
27673
  return textError(
@@ -28440,7 +28638,8 @@ var TOOL_DEFINITIONS = [
28440
28638
  inputSchema: {
28441
28639
  type: "object",
28442
28640
  properties: {
28443
- node_id: { type: "string", description: "The node ID" },
28641
+ node_id: { type: "string", description: "The node ID. Alias: `id`." },
28642
+ id: { type: "string", description: "Alias for `node_id`." },
28444
28643
  compact_edges: { type: "boolean", description: "Omit source_title/target_title from edges (saves ~30% on edge-heavy nodes)" }
28445
28644
  },
28446
28645
  required: ["node_id"]
@@ -28882,7 +29081,11 @@ var TOOL_DEFINITIONS = [
28882
29081
  properties: {
28883
29082
  file: {
28884
29083
  type: "string",
28885
- description: "Path to the .upg file (relative, absolute, or a bare product name in workspace mode)."
29084
+ description: "Path to the .upg file (relative, absolute, or a bare product name in workspace mode). Alias: `product`."
29085
+ },
29086
+ product: {
29087
+ type: "string",
29088
+ description: "Alias for `file`."
28886
29089
  }
28887
29090
  },
28888
29091
  required: ["file"]
@@ -29181,7 +29384,8 @@ var TOOL_DEFINITIONS = [
29181
29384
  inputSchema: {
29182
29385
  type: "object",
29183
29386
  properties: {
29184
- id: { type: "string", description: "Framework id (kebab-case)." }
29387
+ id: { type: "string", description: "Framework id (kebab-case). Alias: `framework_id`." },
29388
+ framework_id: { type: "string", description: "Alias for `id` (matches the key used by apply_framework / prioritise)." }
29185
29389
  },
29186
29390
  required: ["id"]
29187
29391
  }