@unified-product-graph/mcp-server 0.8.16 → 0.9.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.js +313 -40
- package/dist/index.js.map +1 -1
- package/dist/tools-manifest.json +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -116,7 +116,7 @@ var UPG_DOMAINS = [
|
|
|
116
116
|
{
|
|
117
117
|
id: "product_spec",
|
|
118
118
|
label: "Product Specification",
|
|
119
|
-
description: "What you are building and shipping. Feature areas group related capabilities. Features, epics, and user stories break work down. Acceptance criteria define done. Tasks and bugs track execution. Releases and changelogs mark what shipped. Roadmaps and roadmap items plan what comes next.
|
|
119
|
+
description: "What you are building and shipping. Feature areas group related capabilities. Features, epics, and user stories break work down. Acceptance criteria define done. Tasks and bugs track execution. Releases and changelogs mark what shipped. Roadmaps and roadmap items plan what comes next. Roadmap themes group roadmap work around the customer problem it solves, one level down from the strategic themes in Strategy. Translates Strategy into Engineering and tracks delivery through Program Management.",
|
|
120
120
|
types: [
|
|
121
121
|
"feature",
|
|
122
122
|
"feature_area",
|
|
@@ -128,7 +128,7 @@ var UPG_DOMAINS = [
|
|
|
128
128
|
"bug",
|
|
129
129
|
"roadmap",
|
|
130
130
|
"roadmap_item",
|
|
131
|
-
"
|
|
131
|
+
"roadmap_theme",
|
|
132
132
|
"changelog"
|
|
133
133
|
]
|
|
134
134
|
},
|
|
@@ -556,8 +556,8 @@ var UPG_ENTITY_META = [
|
|
|
556
556
|
{ name: "need", type_id: "ent_313", maturity: "stable", since: "0.1.0" },
|
|
557
557
|
{ name: "switching_cost", type_id: "ent_022", maturity: "stable", since: "0.1.0" },
|
|
558
558
|
// ── Discovery ──
|
|
559
|
-
{ name: "opportunity", type_id: "ent_023", maturity: "stable", since: "0.1.0" },
|
|
560
|
-
{ name: "solution", type_id: "ent_024", maturity: "stable", since: "0.1.0" },
|
|
559
|
+
{ name: "opportunity", type_id: "ent_023", maturity: "stable", since: "0.1.0", default_frameworks: ["opportunity-sizing", "rice-scoring"] },
|
|
560
|
+
{ name: "solution", type_id: "ent_024", maturity: "stable", since: "0.1.0", default_frameworks: ["rice-scoring"] },
|
|
561
561
|
{ name: "feasibility_study", type_id: "ent_025", maturity: "stable", since: "0.1.0" },
|
|
562
562
|
{ name: "design_sprint", type_id: "ent_026", maturity: "stable", since: "0.1.0" },
|
|
563
563
|
// ── Validation ──
|
|
@@ -658,7 +658,8 @@ var UPG_ENTITY_META = [
|
|
|
658
658
|
{ name: "bug", type_id: "ent_077", maturity: "stable", since: "0.1.0" },
|
|
659
659
|
{ name: "roadmap", type_id: "ent_078", maturity: "stable", since: "0.1.0" },
|
|
660
660
|
{ name: "roadmap_item", type_id: "ent_079", maturity: "stable", since: "0.1.0" },
|
|
661
|
-
{ name: "theme", type_id: "ent_080", maturity: "
|
|
661
|
+
{ name: "theme", type_id: "ent_080", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.9.0", replacement: "roadmap_theme" },
|
|
662
|
+
{ name: "roadmap_theme", type_id: "ent_351", maturity: "stable", since: "0.1.0" },
|
|
662
663
|
{ name: "changelog", type_id: "ent_081", maturity: "stable", since: "0.1.0" },
|
|
663
664
|
// ── Engineering ──
|
|
664
665
|
{ name: "bounded_context", type_id: "ent_082", maturity: "stable", since: "0.1.0" },
|
|
@@ -1165,6 +1166,12 @@ var UPG_EDGE_CATALOG = {
|
|
|
1165
1166
|
strategic_pillar_delivers_value_stream: { forward_verb: "delivers", reverse_verb: "delivered_by", classification: "hierarchy", source_type: "strategic_pillar", target_type: "value_stream" },
|
|
1166
1167
|
strategic_pillar_decided_via_decision: { forward_verb: "decided_via", reverse_verb: "decided_for", classification: "hierarchy", source_type: "strategic_pillar", target_type: "decision" },
|
|
1167
1168
|
strategic_theme_pursues_initiative: { forward_verb: "pursues", reverse_verb: "pursued_under", classification: "hierarchy", source_type: "strategic_theme", target_type: "initiative" },
|
|
1169
|
+
// v0.9.0 (UPG-660): the soft bridge from the annual strategy focus area to the
|
|
1170
|
+
// roadmap grouping that realises it. Semantic, NOT hierarchy: strategic_theme and
|
|
1171
|
+
// roadmap_theme sit on different spines (strategy cascade vs roadmap cascade), so
|
|
1172
|
+
// this is a cross-reference, not containment. Pairs with the theme → roadmap_theme
|
|
1173
|
+
// rename that removed the bare-'theme' collision (N6/UPG-652 lineage).
|
|
1174
|
+
strategic_theme_realised_by_roadmap_theme: { forward_verb: "realised_by", reverse_verb: "realises", classification: "semantic", source_type: "strategic_theme", target_type: "roadmap_theme" },
|
|
1168
1175
|
// v0.5.4 (UPG-511): three edges that lift strategic_theme from structural
|
|
1169
1176
|
// isolation to a conceptually central strategy node.
|
|
1170
1177
|
//
|
|
@@ -1222,7 +1229,7 @@ var UPG_EDGE_CATALOG = {
|
|
|
1222
1229
|
product_builds_feature: { forward_verb: "builds", reverse_verb: "built_by", classification: "hierarchy", source_type: "product", target_type: "feature" },
|
|
1223
1230
|
product_ships_via_release: { forward_verb: "ships_via", reverse_verb: "ships", classification: "hierarchy", source_type: "product", target_type: "release" },
|
|
1224
1231
|
product_plans_via_roadmap: { forward_verb: "plans_via", reverse_verb: "plans_for", classification: "hierarchy", source_type: "product", target_type: "roadmap" },
|
|
1225
|
-
|
|
1232
|
+
product_categorises_by_roadmap_theme: { forward_verb: "categorises_by", reverse_verb: "categorises", classification: "hierarchy", source_type: "product", target_type: "roadmap_theme" },
|
|
1226
1233
|
feature_area_contains_feature: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "feature_area", target_type: "feature" },
|
|
1227
1234
|
feature_area_contains_feature_area: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "feature_area", target_type: "feature_area" },
|
|
1228
1235
|
outcome_delivered_by_feature: { forward_verb: "delivered_by", reverse_verb: "delivers", classification: "cross-domain", source_type: "outcome", target_type: "feature" },
|
|
@@ -1246,12 +1253,12 @@ var UPG_EDGE_CATALOG = {
|
|
|
1246
1253
|
release_contains_bug: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "release", target_type: "bug" },
|
|
1247
1254
|
release_documented_in_changelog: { forward_verb: "documented_in", reverse_verb: "documents", classification: "hierarchy", source_type: "release", target_type: "changelog" },
|
|
1248
1255
|
roadmap_contains_roadmap_item: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "roadmap", target_type: "roadmap_item" },
|
|
1249
|
-
|
|
1256
|
+
roadmap_categorised_by_roadmap_theme: { forward_verb: "categorised_by", reverse_verb: "categorises", classification: "hierarchy", source_type: "roadmap", target_type: "roadmap_theme" },
|
|
1250
1257
|
roadmap_schedules_release: { forward_verb: "schedules", reverse_verb: "scheduled_in", classification: "hierarchy", source_type: "roadmap", target_type: "release" },
|
|
1251
|
-
|
|
1252
|
-
// feature_area is not contained by
|
|
1258
|
+
roadmap_theme_groups_feature: { forward_verb: "groups", reverse_verb: "grouped_in", classification: "hierarchy", source_type: "roadmap_theme", target_type: "feature" },
|
|
1259
|
+
// feature_area is not contained by roadmap_theme; roadmap themes span multiple
|
|
1253
1260
|
// areas cross-cuttingly. Containment path: product → feature_area.
|
|
1254
|
-
|
|
1261
|
+
roadmap_theme_spans_feature_area: { forward_verb: "spans", reverse_verb: "spanned_by", classification: "semantic", source_type: "roadmap_theme", target_type: "feature_area" },
|
|
1255
1262
|
// The legacy `story_task` collapsed into `task` (v0.4.0), so the implements
|
|
1256
1263
|
// relationship is the canonical `task_implements_user_story` above; there is
|
|
1257
1264
|
// no separate story_task edge. (v0.2.7 introduced the Statement/Implementation
|
|
@@ -2828,7 +2835,7 @@ var UPG_VALID_CHILDREN = {
|
|
|
2828
2835
|
"feature_area",
|
|
2829
2836
|
"release",
|
|
2830
2837
|
"roadmap",
|
|
2831
|
-
"
|
|
2838
|
+
"roadmap_theme",
|
|
2832
2839
|
// Engineering
|
|
2833
2840
|
"bounded_context",
|
|
2834
2841
|
"code_repository",
|
|
@@ -3224,8 +3231,8 @@ var UPG_VALID_CHILDREN = {
|
|
|
3224
3231
|
a11y_standard: ["a11y_guideline", "a11y_audit", "a11y_annotation"],
|
|
3225
3232
|
a11y_audit: ["a11y_issue"],
|
|
3226
3233
|
// ── Product Specification expansion ─────────────────────────────────────────
|
|
3227
|
-
roadmap: ["roadmap_item", "
|
|
3228
|
-
|
|
3234
|
+
roadmap: ["roadmap_item", "roadmap_theme", "release"],
|
|
3235
|
+
roadmap_theme: ["feature"],
|
|
3229
3236
|
// ── Unified Context Layer hierarchy ─────────────────────────────────────────
|
|
3230
3237
|
design_system: [
|
|
3231
3238
|
"design_component",
|
|
@@ -5821,7 +5828,7 @@ var UPG_LIFECYCLE_FREE_TYPES = /* @__PURE__ */ new Set([
|
|
|
5821
5828
|
// v0.7.0/UPG-571. ─
|
|
5822
5829
|
"acceptance_criterion",
|
|
5823
5830
|
"changelog",
|
|
5824
|
-
"
|
|
5831
|
+
"roadmap_theme",
|
|
5825
5832
|
"user_story",
|
|
5826
5833
|
// ── Strategy: metric is a measurement definition; metric_quality_assessment
|
|
5827
5834
|
// is a point-in-time snapshot; value_stream is a mapped flow;
|
|
@@ -6122,6 +6129,21 @@ var UPG_SCALES = {
|
|
|
6122
6129
|
}
|
|
6123
6130
|
};
|
|
6124
6131
|
var UPG_MIGRATIONS = {
|
|
6132
|
+
"0.9.0": [
|
|
6133
|
+
// (since v0.9.0, UPG-660) theme → roadmap_theme. `theme` was the only bare,
|
|
6134
|
+
// unqualified theme among four domain-prefixed siblings (strategic_theme,
|
|
6135
|
+
// content_theme, feedback_theme); it claimed the unqualified word and read as
|
|
6136
|
+
// interchangeable with strategic_theme (the N6/UPG-652 confusion). Renamed to
|
|
6137
|
+
// roadmap_theme so all four read consistently and the customer-problem roadmap
|
|
6138
|
+
// grouping is explicit. Lifecycle-free, identical property surface (theme_scope
|
|
6139
|
+
// / priority); no property migration required. Paired edge renames live in
|
|
6140
|
+
// UPG_EDGE_MIGRATIONS['0.9.0'].
|
|
6141
|
+
{
|
|
6142
|
+
from: "theme",
|
|
6143
|
+
to: "roadmap_theme",
|
|
6144
|
+
reason: 'theme renamed to roadmap_theme (UPG-660). The bare "theme" was the only domain-unprefixed theme among strategic_theme / content_theme / feedback_theme; it grabbed the unqualified word and read as interchangeable with strategic_theme. roadmap_theme makes the customer-problem roadmap grouping explicit and consistent across the four. Same property surface (theme_scope / priority); no property migration needed.'
|
|
6145
|
+
}
|
|
6146
|
+
],
|
|
6125
6147
|
"0.7.0": [
|
|
6126
6148
|
// (since v0.7.0, UPG-571) story_statement → user_story. The v0.2.7 split
|
|
6127
6149
|
// correctly separated the templated promise from the engineering work
|
|
@@ -7104,6 +7126,17 @@ var UPG_SPLIT_MIGRATIONS = {
|
|
|
7104
7126
|
]
|
|
7105
7127
|
};
|
|
7106
7128
|
var UPG_EDGE_MIGRATIONS = {
|
|
7129
|
+
"0.9.0": [
|
|
7130
|
+
// (since v0.9.0, UPG-660) theme → roadmap_theme. The four canonical edges that
|
|
7131
|
+
// touch the roadmap theme are renamed to the roadmap_theme form. Endpoint guards
|
|
7132
|
+
// reference the POST-migration (roadmap_theme) types; edge migration runs after
|
|
7133
|
+
// node migration, so by the time these rules apply the node has already been
|
|
7134
|
+
// renamed theme → roadmap_theme (UPG_MIGRATIONS['0.9.0']).
|
|
7135
|
+
{ kind: "rename", from: "product_categorises_by_theme", to: "product_categorises_by_roadmap_theme", requires_source_type: "product", requires_target_type: "roadmap_theme", reason: "theme \u2192 roadmap_theme (UPG-660). Product categorises by the roadmap theme; edge key updated to the renamed target type." },
|
|
7136
|
+
{ kind: "rename", from: "roadmap_categorised_by_theme", to: "roadmap_categorised_by_roadmap_theme", requires_source_type: "roadmap", requires_target_type: "roadmap_theme", reason: "theme \u2192 roadmap_theme (UPG-660). Roadmap is categorised by the roadmap theme; edge key updated to the renamed target type." },
|
|
7137
|
+
{ kind: "rename", from: "theme_groups_feature", to: "roadmap_theme_groups_feature", requires_source_type: "roadmap_theme", requires_target_type: "feature", reason: "theme \u2192 roadmap_theme (UPG-660). The roadmap theme groups features; edge key updated to the renamed source type." },
|
|
7138
|
+
{ kind: "rename", from: "theme_spans_feature_area", to: "roadmap_theme_spans_feature_area", requires_source_type: "roadmap_theme", requires_target_type: "feature_area", reason: "theme \u2192 roadmap_theme (UPG-660). The roadmap theme spans feature areas; edge key updated to the renamed source type." }
|
|
7139
|
+
],
|
|
7107
7140
|
"0.7.0": [
|
|
7108
7141
|
// (since v0.7.0, UPG-571) story_statement → user_story re-canon. The four
|
|
7109
7142
|
// canonical edges that touch the statement are renamed to the user_story
|
|
@@ -9920,7 +9953,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9920
9953
|
reach: {
|
|
9921
9954
|
type: "assessment",
|
|
9922
9955
|
scale_id: "reach_5",
|
|
9923
|
-
description: "How many users experience this problem",
|
|
9956
|
+
description: "How many users experience this problem. @deprecated 0.9.0:a framework-scoped scoring input, not an intrinsic property. Apply the `opportunity-sizing` framework; the value lives on the framework_exercise includes-edge. Removed in 0.9.1.",
|
|
9924
9957
|
properties: {
|
|
9925
9958
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
9926
9959
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -9932,7 +9965,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9932
9965
|
frequency: {
|
|
9933
9966
|
type: "assessment",
|
|
9934
9967
|
scale_id: "frequency_5",
|
|
9935
|
-
description: "How often users experience this problem",
|
|
9968
|
+
description: "How often users experience this problem. @deprecated 0.9.0:framework-scoped (opportunity-sizing). Removed in 0.9.1.",
|
|
9936
9969
|
properties: {
|
|
9937
9970
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
9938
9971
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -9944,7 +9977,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9944
9977
|
pain: {
|
|
9945
9978
|
type: "assessment",
|
|
9946
9979
|
scale_id: "pain_5",
|
|
9947
|
-
description: "How painful it is when unaddressed",
|
|
9980
|
+
description: "How painful it is when unaddressed. @deprecated 0.9.0:framework-scoped (opportunity-sizing). Removed in 0.9.1.",
|
|
9948
9981
|
properties: {
|
|
9949
9982
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
9950
9983
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -9953,7 +9986,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9953
9986
|
},
|
|
9954
9987
|
required: ["value", "label"]
|
|
9955
9988
|
},
|
|
9956
|
-
opportunity_score: { type: "number", description: "Computed: normalized_reach x normalized_frequency x normalized_pain (0-1)" }
|
|
9989
|
+
opportunity_score: { type: "number", description: "Computed: normalized_reach x normalized_frequency x normalized_pain (0-1). @deprecated 0.9.0:computed by the `opportunity-sizing` framework on its application edge, not stored on the entity. Removed in 0.9.1." }
|
|
9957
9990
|
},
|
|
9958
9991
|
// OrganizationProperties: Organization entity.
|
|
9959
9992
|
organization: {
|
|
@@ -10367,6 +10400,11 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10367
10400
|
start_date: { type: "string", description: "ISO date work begins. More precise than `quarter` for continuous planning." },
|
|
10368
10401
|
target_date: { type: "string", description: "ISO date completion is expected. For shipped items, the actual completion date." }
|
|
10369
10402
|
},
|
|
10403
|
+
// RoadmapThemeProperties: Thematic grouping of roadmap work, around the customer problem it solves.
|
|
10404
|
+
roadmap_theme: {
|
|
10405
|
+
theme_scope: { type: "string", description: "Scope description" },
|
|
10406
|
+
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Priority" }
|
|
10407
|
+
},
|
|
10370
10408
|
// RoleProperties: Role entity.
|
|
10371
10409
|
role: {
|
|
10372
10410
|
responsibilities: { type: "string[]", description: "Key responsibilities of the role" },
|
|
@@ -10552,7 +10590,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10552
10590
|
reach: {
|
|
10553
10591
|
type: "assessment",
|
|
10554
10592
|
scale_id: "reach_5",
|
|
10555
|
-
description: "How many users this solution reaches (1 = few, 5 = most)",
|
|
10593
|
+
description: "How many users this solution reaches (1 = few, 5 = most). @deprecated 0.9.0:a framework-scoped scoring input, not an intrinsic property. Apply the `rice-scoring` framework; the value lives on the framework_exercise includes-edge. Removed in 0.9.1.",
|
|
10556
10594
|
properties: {
|
|
10557
10595
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
10558
10596
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -10564,7 +10602,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10564
10602
|
impact: {
|
|
10565
10603
|
type: "assessment",
|
|
10566
10604
|
scale_id: "impact_5",
|
|
10567
|
-
description: "Expected impact on the target outcome (1 = minimal, 5 = transformative)",
|
|
10605
|
+
description: "Expected impact on the target outcome (1 = minimal, 5 = transformative). @deprecated 0.9.0:framework-scoped (rice-scoring). Removed in 0.9.1.",
|
|
10568
10606
|
properties: {
|
|
10569
10607
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
10570
10608
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -10576,7 +10614,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10576
10614
|
confidence: {
|
|
10577
10615
|
type: "assessment",
|
|
10578
10616
|
scale_id: "confidence_5",
|
|
10579
|
-
description: "How confident the team is in this solution (1 = speculative, 5 = proven)",
|
|
10617
|
+
description: "How confident the team is in this solution (1 = speculative, 5 = proven). @deprecated 0.9.0:framework-scoped (rice-scoring). Removed in 0.9.1.",
|
|
10580
10618
|
properties: {
|
|
10581
10619
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
10582
10620
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -10588,7 +10626,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10588
10626
|
effort: {
|
|
10589
10627
|
type: "assessment",
|
|
10590
10628
|
scale_id: "effort_5",
|
|
10591
|
-
description: "Level of effort required to implement (1 = trivial, 5 = very large)",
|
|
10629
|
+
description: "Level of effort required to implement (1 = trivial, 5 = very large). @deprecated 0.9.0:effort is a framework-scoped scoring input (it varies by assessor and method), not an intrinsic property. Removed in 0.9.1.",
|
|
10592
10630
|
properties: {
|
|
10593
10631
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
10594
10632
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -10597,7 +10635,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10597
10635
|
},
|
|
10598
10636
|
required: ["value", "label"]
|
|
10599
10637
|
},
|
|
10600
|
-
rice_score: { type: "number", description: "Computed: (reach \xD7 impact \xD7 confidence) / effort" }
|
|
10638
|
+
rice_score: { type: "number", description: "Computed: (reach \xD7 impact \xD7 confidence) / effort. @deprecated 0.9.0:computed by the `rice-scoring` framework on its application edge, not stored on the entity. Removed in 0.9.1." }
|
|
10601
10639
|
},
|
|
10602
10640
|
// StakeholderProperties: Stakeholder entity.
|
|
10603
10641
|
stakeholder: {
|
|
@@ -10844,11 +10882,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10844
10882
|
skipped_count: { type: "number", description: "Number of tests that were skipped in the last run" },
|
|
10845
10883
|
flaky_count: { type: "number", description: "Number of tests that passed only on retry (flaky) in the last run" }
|
|
10846
10884
|
},
|
|
10847
|
-
// ThemeProperties: Thematic grouping of work.
|
|
10848
|
-
theme: {
|
|
10849
|
-
theme_scope: { type: "string", description: "Scope description" },
|
|
10850
|
-
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Priority" }
|
|
10851
|
-
},
|
|
10852
10885
|
// ThreatProperties: Threat.
|
|
10853
10886
|
threat: {
|
|
10854
10887
|
category: { type: "string", description: 'Attack or threat scenario. @example "injection", "misconfiguration", "social engineering", "supply chain"' },
|
|
@@ -11077,6 +11110,188 @@ function getPropertySchema(entityType) {
|
|
|
11077
11110
|
return UPG_PROPERTY_SCHEMA[entityType];
|
|
11078
11111
|
}
|
|
11079
11112
|
var UPG_FRAMEWORKS = [
|
|
11113
|
+
{
|
|
11114
|
+
"id": "opportunity-sizing",
|
|
11115
|
+
"approach_ids": [
|
|
11116
|
+
"prioritise"
|
|
11117
|
+
],
|
|
11118
|
+
"name": "Opportunity Sizing",
|
|
11119
|
+
"version": "1.0.0",
|
|
11120
|
+
"description": "Size opportunities by Reach, Frequency, and Pain to rank which problems are most worth solving before committing to solutions.",
|
|
11121
|
+
"category": "prioritization",
|
|
11122
|
+
"origin": {
|
|
11123
|
+
"type": "practitioner",
|
|
11124
|
+
"attribution": "Continuous discovery practice",
|
|
11125
|
+
"description": "A lightweight discovery-prioritisation method: weigh how many users hit a problem, how often, and how much it hurts, to rank opportunities before investing in solutions.",
|
|
11126
|
+
"url": "https://www.producttalk.org/2016/08/opportunity-solution-tree/",
|
|
11127
|
+
"year": 2016,
|
|
11128
|
+
"license": "open_attribution"
|
|
11129
|
+
},
|
|
11130
|
+
"tags": [
|
|
11131
|
+
"prioritization",
|
|
11132
|
+
"discovery",
|
|
11133
|
+
"table"
|
|
11134
|
+
],
|
|
11135
|
+
"slots": [
|
|
11136
|
+
{
|
|
11137
|
+
"label": "Opportunities to size",
|
|
11138
|
+
"entityTypeId": "opportunity",
|
|
11139
|
+
"description": "Opportunities scored on Reach, Frequency, and Pain."
|
|
11140
|
+
}
|
|
11141
|
+
],
|
|
11142
|
+
"data": {
|
|
11143
|
+
"entity_types": [
|
|
11144
|
+
{
|
|
11145
|
+
"type": "opportunity",
|
|
11146
|
+
"role": "scored_item"
|
|
11147
|
+
}
|
|
11148
|
+
],
|
|
11149
|
+
"required_properties": {
|
|
11150
|
+
"opportunity": [
|
|
11151
|
+
{
|
|
11152
|
+
"property": "reach",
|
|
11153
|
+
"type": "assessment",
|
|
11154
|
+
"scale_id": "reach_5",
|
|
11155
|
+
"required": true,
|
|
11156
|
+
"scope": "framework",
|
|
11157
|
+
"label": "Reach",
|
|
11158
|
+
"description": "How many users experience this problem?"
|
|
11159
|
+
},
|
|
11160
|
+
{
|
|
11161
|
+
"property": "frequency",
|
|
11162
|
+
"type": "assessment",
|
|
11163
|
+
"scale_id": "frequency_5",
|
|
11164
|
+
"required": true,
|
|
11165
|
+
"scope": "framework",
|
|
11166
|
+
"label": "Frequency",
|
|
11167
|
+
"description": "How often do they run into it?"
|
|
11168
|
+
},
|
|
11169
|
+
{
|
|
11170
|
+
"property": "pain",
|
|
11171
|
+
"type": "assessment",
|
|
11172
|
+
"scale_id": "pain_5",
|
|
11173
|
+
"required": true,
|
|
11174
|
+
"scope": "framework",
|
|
11175
|
+
"label": "Pain",
|
|
11176
|
+
"description": "How painful is it when left unaddressed?"
|
|
11177
|
+
}
|
|
11178
|
+
]
|
|
11179
|
+
},
|
|
11180
|
+
"computed_properties": [
|
|
11181
|
+
{
|
|
11182
|
+
"property": "opportunity_score",
|
|
11183
|
+
"expression": "reach * frequency * pain",
|
|
11184
|
+
"entity_type": "opportunity",
|
|
11185
|
+
"label": "Opportunity Score",
|
|
11186
|
+
"format": "number"
|
|
11187
|
+
}
|
|
11188
|
+
],
|
|
11189
|
+
"scoring_method": {
|
|
11190
|
+
"applies_to": [
|
|
11191
|
+
"opportunity"
|
|
11192
|
+
],
|
|
11193
|
+
"inputs": [
|
|
11194
|
+
{
|
|
11195
|
+
"property": "reach",
|
|
11196
|
+
"type": "assessment",
|
|
11197
|
+
"scale_id": "reach_5",
|
|
11198
|
+
"required": true,
|
|
11199
|
+
"scope": "framework",
|
|
11200
|
+
"label": "Reach",
|
|
11201
|
+
"description": "How many users experience this problem?"
|
|
11202
|
+
},
|
|
11203
|
+
{
|
|
11204
|
+
"property": "frequency",
|
|
11205
|
+
"type": "assessment",
|
|
11206
|
+
"scale_id": "frequency_5",
|
|
11207
|
+
"required": true,
|
|
11208
|
+
"scope": "framework",
|
|
11209
|
+
"label": "Frequency",
|
|
11210
|
+
"description": "How often do they run into it?"
|
|
11211
|
+
},
|
|
11212
|
+
{
|
|
11213
|
+
"property": "pain",
|
|
11214
|
+
"type": "assessment",
|
|
11215
|
+
"scale_id": "pain_5",
|
|
11216
|
+
"required": true,
|
|
11217
|
+
"scope": "framework",
|
|
11218
|
+
"label": "Pain",
|
|
11219
|
+
"description": "How painful is it when left unaddressed?"
|
|
11220
|
+
}
|
|
11221
|
+
],
|
|
11222
|
+
"computed": [
|
|
11223
|
+
{
|
|
11224
|
+
"property": "opportunity_score",
|
|
11225
|
+
"expression": "reach * frequency * pain",
|
|
11226
|
+
"label": "Opportunity Score",
|
|
11227
|
+
"format": "number"
|
|
11228
|
+
}
|
|
11229
|
+
]
|
|
11230
|
+
}
|
|
11231
|
+
},
|
|
11232
|
+
"structure": {
|
|
11233
|
+
"pattern": "table"
|
|
11234
|
+
},
|
|
11235
|
+
"presentation": {
|
|
11236
|
+
"layout": {
|
|
11237
|
+
"type": "table",
|
|
11238
|
+
"columns": [
|
|
11239
|
+
{
|
|
11240
|
+
"property": "title",
|
|
11241
|
+
"label": "Opportunities to size",
|
|
11242
|
+
"sortable": true
|
|
11243
|
+
},
|
|
11244
|
+
{
|
|
11245
|
+
"property": "reach",
|
|
11246
|
+
"label": "Reach",
|
|
11247
|
+
"sortable": true,
|
|
11248
|
+
"format": "number"
|
|
11249
|
+
},
|
|
11250
|
+
{
|
|
11251
|
+
"property": "frequency",
|
|
11252
|
+
"label": "Frequency",
|
|
11253
|
+
"sortable": true,
|
|
11254
|
+
"format": "number"
|
|
11255
|
+
},
|
|
11256
|
+
{
|
|
11257
|
+
"property": "pain",
|
|
11258
|
+
"label": "Pain",
|
|
11259
|
+
"sortable": true,
|
|
11260
|
+
"format": "number"
|
|
11261
|
+
},
|
|
11262
|
+
{
|
|
11263
|
+
"property": "opportunity_score",
|
|
11264
|
+
"label": "Opportunity Score",
|
|
11265
|
+
"sortable": true,
|
|
11266
|
+
"format": "score_pill"
|
|
11267
|
+
}
|
|
11268
|
+
]
|
|
11269
|
+
},
|
|
11270
|
+
"sort_by": {
|
|
11271
|
+
"property": "opportunity_score",
|
|
11272
|
+
"direction": "desc"
|
|
11273
|
+
},
|
|
11274
|
+
"colour_by": "score",
|
|
11275
|
+
"card_fields": [
|
|
11276
|
+
"title",
|
|
11277
|
+
"description",
|
|
11278
|
+
"status"
|
|
11279
|
+
]
|
|
11280
|
+
},
|
|
11281
|
+
"education": {
|
|
11282
|
+
"purpose": "Rank opportunities by how widely, how often, and how painfully a problem is felt, so discovery effort flows to the problems most worth solving.",
|
|
11283
|
+
"core_question": "Of the problems we could pursue, which affect the most users, most often, with the most pain?",
|
|
11284
|
+
"when_to_use": [
|
|
11285
|
+
"You have more opportunities than you can pursue",
|
|
11286
|
+
"You need to compare problems before committing to solutions",
|
|
11287
|
+
"You want a defensible, transparent way to choose what to explore"
|
|
11288
|
+
],
|
|
11289
|
+
"when_not_to_use": [
|
|
11290
|
+
"A single opportunity is already validated and obvious",
|
|
11291
|
+
"You have no signal yet on reach, frequency, or pain"
|
|
11292
|
+
]
|
|
11293
|
+
}
|
|
11294
|
+
},
|
|
11080
11295
|
{
|
|
11081
11296
|
"id": "opportunity-solution-tree",
|
|
11082
11297
|
"approach_ids": [
|
|
@@ -12333,7 +12548,7 @@ var UPG_FRAMEWORKS = [
|
|
|
12333
12548
|
],
|
|
12334
12549
|
"name": "RICE Scoring",
|
|
12335
12550
|
"version": "1.0.0",
|
|
12336
|
-
"description": "Score features, opportunities, and needs by Reach, Impact, Confidence, and Effort to produce a ranked priority list.",
|
|
12551
|
+
"description": "Score features, solutions, opportunities, and needs by Reach, Impact, Confidence, and Effort to produce a ranked priority list.",
|
|
12337
12552
|
"category": "prioritization",
|
|
12338
12553
|
"origin": {
|
|
12339
12554
|
"type": "practitioner",
|
|
@@ -12358,6 +12573,11 @@ var UPG_FRAMEWORKS = [
|
|
|
12358
12573
|
"entityTypeId": "opportunity",
|
|
12359
12574
|
"description": "Opportunities scored on the same RICE Scoring inputs as features."
|
|
12360
12575
|
},
|
|
12576
|
+
{
|
|
12577
|
+
"label": "Solutions to score",
|
|
12578
|
+
"entityTypeId": "solution",
|
|
12579
|
+
"description": "Solutions scored on the same RICE Scoring inputs as features."
|
|
12580
|
+
},
|
|
12361
12581
|
{
|
|
12362
12582
|
"label": "Needs to score",
|
|
12363
12583
|
"entityTypeId": "need",
|
|
@@ -12374,6 +12594,10 @@ var UPG_FRAMEWORKS = [
|
|
|
12374
12594
|
"type": "opportunity",
|
|
12375
12595
|
"role": "scored_item"
|
|
12376
12596
|
},
|
|
12597
|
+
{
|
|
12598
|
+
"type": "solution",
|
|
12599
|
+
"role": "scored_item"
|
|
12600
|
+
},
|
|
12377
12601
|
{
|
|
12378
12602
|
"type": "need",
|
|
12379
12603
|
"role": "scored_item"
|
|
@@ -12456,6 +12680,44 @@ var UPG_FRAMEWORKS = [
|
|
|
12456
12680
|
"description": "How much work is required to build and ship this, on the effort scale?"
|
|
12457
12681
|
}
|
|
12458
12682
|
],
|
|
12683
|
+
"solution": [
|
|
12684
|
+
{
|
|
12685
|
+
"property": "reach",
|
|
12686
|
+
"type": "assessment",
|
|
12687
|
+
"scale_id": "reach_5",
|
|
12688
|
+
"required": true,
|
|
12689
|
+
"scope": "framework",
|
|
12690
|
+
"label": "Reach",
|
|
12691
|
+
"description": "How many users will this impact per quarter?"
|
|
12692
|
+
},
|
|
12693
|
+
{
|
|
12694
|
+
"property": "impact",
|
|
12695
|
+
"type": "assessment",
|
|
12696
|
+
"scale_id": "impact_5",
|
|
12697
|
+
"required": true,
|
|
12698
|
+
"scope": "framework",
|
|
12699
|
+
"label": "Impact",
|
|
12700
|
+
"description": "How much will this impact each user, on the impact scale?"
|
|
12701
|
+
},
|
|
12702
|
+
{
|
|
12703
|
+
"property": "confidence",
|
|
12704
|
+
"type": "assessment",
|
|
12705
|
+
"scale_id": "confidence_5",
|
|
12706
|
+
"required": true,
|
|
12707
|
+
"scope": "framework",
|
|
12708
|
+
"label": "Confidence",
|
|
12709
|
+
"description": "How confident are you in the reach, impact, and effort estimates?"
|
|
12710
|
+
},
|
|
12711
|
+
{
|
|
12712
|
+
"property": "effort",
|
|
12713
|
+
"type": "assessment",
|
|
12714
|
+
"scale_id": "effort_5",
|
|
12715
|
+
"required": true,
|
|
12716
|
+
"scope": "framework",
|
|
12717
|
+
"label": "Effort",
|
|
12718
|
+
"description": "How much work is required to build and ship this, on the effort scale?"
|
|
12719
|
+
}
|
|
12720
|
+
],
|
|
12459
12721
|
"need": [
|
|
12460
12722
|
{
|
|
12461
12723
|
"property": "reach",
|
|
@@ -12510,6 +12772,13 @@ var UPG_FRAMEWORKS = [
|
|
|
12510
12772
|
"label": "RICE Score",
|
|
12511
12773
|
"format": "number"
|
|
12512
12774
|
},
|
|
12775
|
+
{
|
|
12776
|
+
"property": "rice_score",
|
|
12777
|
+
"expression": "(reach * impact * confidence) / effort",
|
|
12778
|
+
"entity_type": "solution",
|
|
12779
|
+
"label": "RICE Score",
|
|
12780
|
+
"format": "number"
|
|
12781
|
+
},
|
|
12513
12782
|
{
|
|
12514
12783
|
"property": "rice_score",
|
|
12515
12784
|
"expression": "(reach * impact * confidence) / effort",
|
|
@@ -12522,6 +12791,7 @@ var UPG_FRAMEWORKS = [
|
|
|
12522
12791
|
"applies_to": [
|
|
12523
12792
|
"feature",
|
|
12524
12793
|
"opportunity",
|
|
12794
|
+
"solution",
|
|
12525
12795
|
"need"
|
|
12526
12796
|
],
|
|
12527
12797
|
"inputs": [
|
|
@@ -16768,7 +17038,8 @@ var STANDARD_LABELS = {
|
|
|
16768
17038
|
product: { alt_labels: ["offering", "app", "service", "platform"] },
|
|
16769
17039
|
vision: { alt_labels: ["product vision", "north star vision", "long-term vision"] },
|
|
16770
17040
|
mission: { alt_labels: ["mission statement", "purpose"] },
|
|
16771
|
-
strategic_theme: { alt_labels: ["
|
|
17041
|
+
strategic_theme: { alt_labels: ["focus area", "strategic focus area"] },
|
|
17042
|
+
// N6: not 'theme'/'strategic pillar' (own types)
|
|
16772
17043
|
initiative: { alt_labels: ["strategic initiative", "program initiative", "workstream"] },
|
|
16773
17044
|
capability: { alt_labels: ["business capability", "organizational capability"] },
|
|
16774
17045
|
value_stream: { alt_labels: ["value chain", "stream"] },
|
|
@@ -16830,7 +17101,8 @@ var STANDARD_LABELS = {
|
|
|
16830
17101
|
fix: { alt_labels: ["bugfix", "patch", "remediation"] },
|
|
16831
17102
|
roadmap: { alt_labels: ["product roadmap", "release plan", "timeline"] },
|
|
16832
17103
|
roadmap_item: { alt_labels: ["roadmap entry", "planned item"] },
|
|
16833
|
-
|
|
17104
|
+
roadmap_theme: { alt_labels: ["product theme", "roadmap theme"] },
|
|
17105
|
+
// UPG-660: renamed from bare 'theme' (N6 lineage)
|
|
16834
17106
|
// Engineering layer
|
|
16835
17107
|
bounded_context: { alt_labels: ["context", "domain boundary", "module boundary"] },
|
|
16836
17108
|
service: { alt_labels: ["microservice", "backend service", "api service"] },
|
|
@@ -17029,7 +17301,8 @@ var STANDARD_LABELS = {
|
|
|
17029
17301
|
feedback_vote: { alt_labels: ["upvote", "vote", "user vote"] },
|
|
17030
17302
|
user_advisory_board: { alt_labels: ["cab", "customer advisory board", "advisory council"] },
|
|
17031
17303
|
beta_program: { alt_labels: ["beta", "early access", "preview program"] },
|
|
17032
|
-
feedback_theme: { alt_labels: ["feedback cluster", "
|
|
17304
|
+
feedback_theme: { alt_labels: ["feedback cluster", "feedback category"] },
|
|
17305
|
+
// N6: not bare 'theme'
|
|
17033
17306
|
// Pricing & Packaging layer
|
|
17034
17307
|
pricing_strategy: { alt_labels: ["pricing model", "monetization strategy"] },
|
|
17035
17308
|
package: { alt_labels: ["product package", "bundle", "sku"] },
|
|
@@ -17533,9 +17806,9 @@ var PRODUCT_DELIVERY_PLAYBOOK = {
|
|
|
17533
17806
|
),
|
|
17534
17807
|
seqStep(
|
|
17535
17808
|
6,
|
|
17536
|
-
"Themes & Changelog",
|
|
17537
|
-
["
|
|
17538
|
-
"Group
|
|
17809
|
+
"Roadmap Themes & Changelog",
|
|
17810
|
+
["roadmap_theme", "changelog"],
|
|
17811
|
+
"Group roadmap work into roadmap themes around the customer problem. Maintain a changelog the team and customers can read together."
|
|
17539
17812
|
)
|
|
17540
17813
|
]
|
|
17541
17814
|
};
|
|
@@ -18789,7 +19062,7 @@ var PRODUCT_SPEC_GUIDE = {
|
|
|
18789
19062
|
// registered to product_spec but missing from the navigation order).
|
|
18790
19063
|
// `changelog` lives here because it is a structural product-shipping
|
|
18791
19064
|
// artefact; content domain references it only via cross-domain bridges.
|
|
18792
|
-
creation_sequence: ["feature_area", "feature", "epic", "user_story", "acceptance_criterion", "task", "bug", "release", "roadmap", "roadmap_item", "
|
|
19065
|
+
creation_sequence: ["feature_area", "feature", "epic", "user_story", "acceptance_criterion", "task", "bug", "release", "roadmap", "roadmap_item", "roadmap_theme", "changelog"],
|
|
18793
19066
|
patterns: [
|
|
18794
19067
|
{
|
|
18795
19068
|
name: "Feature Decomposition",
|
|
@@ -23214,7 +23487,7 @@ var UPG_REGIONS = [
|
|
|
23214
23487
|
role: "leaf"
|
|
23215
23488
|
},
|
|
23216
23489
|
{
|
|
23217
|
-
type: "
|
|
23490
|
+
type: "roadmap_theme",
|
|
23218
23491
|
role: "container",
|
|
23219
23492
|
notes: "semantic spanner, not containment"
|
|
23220
23493
|
},
|
|
@@ -23250,10 +23523,10 @@ var UPG_REGIONS = [
|
|
|
23250
23523
|
"user_story_verified_by_acceptance_criterion",
|
|
23251
23524
|
"task_implements_user_story",
|
|
23252
23525
|
"roadmap_contains_roadmap_item",
|
|
23253
|
-
"
|
|
23526
|
+
"roadmap_categorised_by_roadmap_theme",
|
|
23254
23527
|
"roadmap_schedules_release",
|
|
23255
23528
|
"release_documented_in_changelog",
|
|
23256
|
-
"
|
|
23529
|
+
"roadmap_theme_spans_feature_area",
|
|
23257
23530
|
"milestone_gates_release",
|
|
23258
23531
|
"roadmap_item_references_feature",
|
|
23259
23532
|
"feature_request_voted_on_by_feedback_vote"
|
|
@@ -24373,7 +24646,7 @@ function serializePortfolioWithHeader(doc, opts) {
|
|
|
24373
24646
|
header.integrity = { algorithm: INTEGRITY_ALGORITHM, body: computeBodyChecksum(doc) };
|
|
24374
24647
|
return JSON.stringify({ $upg: header, ...body }, null, 2) + "\n";
|
|
24375
24648
|
}
|
|
24376
|
-
var UPG_VERSION = "0.
|
|
24649
|
+
var UPG_VERSION = "0.9.0";
|
|
24377
24650
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
24378
24651
|
var UPG_TYPES = getTypes();
|
|
24379
24652
|
var UPG_TYPES_SET = new Set(UPG_TYPES);
|