@unified-product-graph/core 0.8.16 → 0.9.1
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/CHANGELOG.md +59 -0
- package/dist/index.cjs +315 -41
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +76 -26
- package/dist/index.d.ts +76 -26
- package/dist/index.js +315 -41
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -283,7 +283,7 @@ var UPG_DOMAINS = [
|
|
|
283
283
|
{
|
|
284
284
|
id: "product_spec",
|
|
285
285
|
label: "Product Specification",
|
|
286
|
-
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.
|
|
286
|
+
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.",
|
|
287
287
|
types: [
|
|
288
288
|
"feature",
|
|
289
289
|
"feature_area",
|
|
@@ -295,7 +295,7 @@ var UPG_DOMAINS = [
|
|
|
295
295
|
"bug",
|
|
296
296
|
"roadmap",
|
|
297
297
|
"roadmap_item",
|
|
298
|
-
"
|
|
298
|
+
"roadmap_theme",
|
|
299
299
|
"changelog"
|
|
300
300
|
]
|
|
301
301
|
},
|
|
@@ -728,8 +728,8 @@ var UPG_ENTITY_META = [
|
|
|
728
728
|
{ name: "need", type_id: "ent_313", maturity: "stable", since: "0.1.0" },
|
|
729
729
|
{ name: "switching_cost", type_id: "ent_022", maturity: "stable", since: "0.1.0" },
|
|
730
730
|
// ── Discovery ──
|
|
731
|
-
{ name: "opportunity", type_id: "ent_023", maturity: "stable", since: "0.1.0" },
|
|
732
|
-
{ name: "solution", type_id: "ent_024", maturity: "stable", since: "0.1.0" },
|
|
731
|
+
{ name: "opportunity", type_id: "ent_023", maturity: "stable", since: "0.1.0", default_frameworks: ["opportunity-sizing", "rice-scoring"] },
|
|
732
|
+
{ name: "solution", type_id: "ent_024", maturity: "stable", since: "0.1.0", default_frameworks: ["rice-scoring"] },
|
|
733
733
|
{ name: "feasibility_study", type_id: "ent_025", maturity: "stable", since: "0.1.0" },
|
|
734
734
|
{ name: "design_sprint", type_id: "ent_026", maturity: "stable", since: "0.1.0" },
|
|
735
735
|
// ── Validation ──
|
|
@@ -830,7 +830,8 @@ var UPG_ENTITY_META = [
|
|
|
830
830
|
{ name: "bug", type_id: "ent_077", maturity: "stable", since: "0.1.0" },
|
|
831
831
|
{ name: "roadmap", type_id: "ent_078", maturity: "stable", since: "0.1.0" },
|
|
832
832
|
{ name: "roadmap_item", type_id: "ent_079", maturity: "stable", since: "0.1.0" },
|
|
833
|
-
{ name: "theme", type_id: "ent_080", maturity: "
|
|
833
|
+
{ name: "theme", type_id: "ent_080", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.9.0", replacement: "roadmap_theme" },
|
|
834
|
+
{ name: "roadmap_theme", type_id: "ent_351", maturity: "stable", since: "0.1.0" },
|
|
834
835
|
{ name: "changelog", type_id: "ent_081", maturity: "stable", since: "0.1.0" },
|
|
835
836
|
// ── Engineering ──
|
|
836
837
|
{ name: "bounded_context", type_id: "ent_082", maturity: "stable", since: "0.1.0" },
|
|
@@ -1346,6 +1347,12 @@ var UPG_EDGE_CATALOG = {
|
|
|
1346
1347
|
strategic_pillar_delivers_value_stream: { forward_verb: "delivers", reverse_verb: "delivered_by", classification: "hierarchy", source_type: "strategic_pillar", target_type: "value_stream" },
|
|
1347
1348
|
strategic_pillar_decided_via_decision: { forward_verb: "decided_via", reverse_verb: "decided_for", classification: "hierarchy", source_type: "strategic_pillar", target_type: "decision" },
|
|
1348
1349
|
strategic_theme_pursues_initiative: { forward_verb: "pursues", reverse_verb: "pursued_under", classification: "hierarchy", source_type: "strategic_theme", target_type: "initiative" },
|
|
1350
|
+
// v0.9.0 (UPG-660): the soft bridge from the annual strategy focus area to the
|
|
1351
|
+
// roadmap grouping that realises it. Semantic, NOT hierarchy: strategic_theme and
|
|
1352
|
+
// roadmap_theme sit on different spines (strategy cascade vs roadmap cascade), so
|
|
1353
|
+
// this is a cross-reference, not containment. Pairs with the theme → roadmap_theme
|
|
1354
|
+
// rename that removed the bare-'theme' collision (N6/UPG-652 lineage).
|
|
1355
|
+
strategic_theme_realised_by_roadmap_theme: { forward_verb: "realised_by", reverse_verb: "realises", classification: "semantic", source_type: "strategic_theme", target_type: "roadmap_theme" },
|
|
1349
1356
|
// v0.5.4 (UPG-511): three edges that lift strategic_theme from structural
|
|
1350
1357
|
// isolation to a conceptually central strategy node.
|
|
1351
1358
|
//
|
|
@@ -1403,7 +1410,7 @@ var UPG_EDGE_CATALOG = {
|
|
|
1403
1410
|
product_builds_feature: { forward_verb: "builds", reverse_verb: "built_by", classification: "hierarchy", source_type: "product", target_type: "feature" },
|
|
1404
1411
|
product_ships_via_release: { forward_verb: "ships_via", reverse_verb: "ships", classification: "hierarchy", source_type: "product", target_type: "release" },
|
|
1405
1412
|
product_plans_via_roadmap: { forward_verb: "plans_via", reverse_verb: "plans_for", classification: "hierarchy", source_type: "product", target_type: "roadmap" },
|
|
1406
|
-
|
|
1413
|
+
product_categorises_by_roadmap_theme: { forward_verb: "categorises_by", reverse_verb: "categorises", classification: "hierarchy", source_type: "product", target_type: "roadmap_theme" },
|
|
1407
1414
|
feature_area_contains_feature: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "feature_area", target_type: "feature" },
|
|
1408
1415
|
feature_area_contains_feature_area: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "feature_area", target_type: "feature_area" },
|
|
1409
1416
|
outcome_delivered_by_feature: { forward_verb: "delivered_by", reverse_verb: "delivers", classification: "cross-domain", source_type: "outcome", target_type: "feature" },
|
|
@@ -1427,12 +1434,12 @@ var UPG_EDGE_CATALOG = {
|
|
|
1427
1434
|
release_contains_bug: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "release", target_type: "bug" },
|
|
1428
1435
|
release_documented_in_changelog: { forward_verb: "documented_in", reverse_verb: "documents", classification: "hierarchy", source_type: "release", target_type: "changelog" },
|
|
1429
1436
|
roadmap_contains_roadmap_item: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "roadmap", target_type: "roadmap_item" },
|
|
1430
|
-
|
|
1437
|
+
roadmap_categorised_by_roadmap_theme: { forward_verb: "categorised_by", reverse_verb: "categorises", classification: "hierarchy", source_type: "roadmap", target_type: "roadmap_theme" },
|
|
1431
1438
|
roadmap_schedules_release: { forward_verb: "schedules", reverse_verb: "scheduled_in", classification: "hierarchy", source_type: "roadmap", target_type: "release" },
|
|
1432
|
-
|
|
1433
|
-
// feature_area is not contained by
|
|
1439
|
+
roadmap_theme_groups_feature: { forward_verb: "groups", reverse_verb: "grouped_in", classification: "hierarchy", source_type: "roadmap_theme", target_type: "feature" },
|
|
1440
|
+
// feature_area is not contained by roadmap_theme; roadmap themes span multiple
|
|
1434
1441
|
// areas cross-cuttingly. Containment path: product → feature_area.
|
|
1435
|
-
|
|
1442
|
+
roadmap_theme_spans_feature_area: { forward_verb: "spans", reverse_verb: "spanned_by", classification: "semantic", source_type: "roadmap_theme", target_type: "feature_area" },
|
|
1436
1443
|
// The legacy `story_task` collapsed into `task` (v0.4.0), so the implements
|
|
1437
1444
|
// relationship is the canonical `task_implements_user_story` above; there is
|
|
1438
1445
|
// no separate story_task edge. (v0.2.7 introduced the Statement/Implementation
|
|
@@ -2944,7 +2951,8 @@ var UPG_CROSS_EDGE_TYPES = [
|
|
|
2944
2951
|
"depends_on_product",
|
|
2945
2952
|
"cannibalises",
|
|
2946
2953
|
"succeeds",
|
|
2947
|
-
"hosts"
|
|
2954
|
+
"hosts",
|
|
2955
|
+
"contributes_to"
|
|
2948
2956
|
];
|
|
2949
2957
|
|
|
2950
2958
|
// src/registry/entity-type-resolution.ts
|
|
@@ -3042,7 +3050,7 @@ var UPG_VALID_CHILDREN = {
|
|
|
3042
3050
|
"feature_area",
|
|
3043
3051
|
"release",
|
|
3044
3052
|
"roadmap",
|
|
3045
|
-
"
|
|
3053
|
+
"roadmap_theme",
|
|
3046
3054
|
// Engineering
|
|
3047
3055
|
"bounded_context",
|
|
3048
3056
|
"code_repository",
|
|
@@ -3438,8 +3446,8 @@ var UPG_VALID_CHILDREN = {
|
|
|
3438
3446
|
a11y_standard: ["a11y_guideline", "a11y_audit", "a11y_annotation"],
|
|
3439
3447
|
a11y_audit: ["a11y_issue"],
|
|
3440
3448
|
// ── Product Specification expansion ─────────────────────────────────────────
|
|
3441
|
-
roadmap: ["roadmap_item", "
|
|
3442
|
-
|
|
3449
|
+
roadmap: ["roadmap_item", "roadmap_theme", "release"],
|
|
3450
|
+
roadmap_theme: ["feature"],
|
|
3443
3451
|
// ── Unified Context Layer hierarchy ─────────────────────────────────────────
|
|
3444
3452
|
design_system: [
|
|
3445
3453
|
"design_component",
|
|
@@ -6052,7 +6060,7 @@ var UPG_LIFECYCLE_FREE_TYPES = /* @__PURE__ */ new Set([
|
|
|
6052
6060
|
// v0.7.0/UPG-571. ─
|
|
6053
6061
|
"acceptance_criterion",
|
|
6054
6062
|
"changelog",
|
|
6055
|
-
"
|
|
6063
|
+
"roadmap_theme",
|
|
6056
6064
|
"user_story",
|
|
6057
6065
|
// ── Strategy: metric is a measurement definition; metric_quality_assessment
|
|
6058
6066
|
// is a point-in-time snapshot; value_stream is a mapped flow;
|
|
@@ -6732,6 +6740,21 @@ function getEnumValueMeta(scaleName, value) {
|
|
|
6732
6740
|
|
|
6733
6741
|
// src/grammar/migrations.ts
|
|
6734
6742
|
var UPG_MIGRATIONS = {
|
|
6743
|
+
"0.9.0": [
|
|
6744
|
+
// (since v0.9.0, UPG-660) theme → roadmap_theme. `theme` was the only bare,
|
|
6745
|
+
// unqualified theme among four domain-prefixed siblings (strategic_theme,
|
|
6746
|
+
// content_theme, feedback_theme); it claimed the unqualified word and read as
|
|
6747
|
+
// interchangeable with strategic_theme (the N6/UPG-652 confusion). Renamed to
|
|
6748
|
+
// roadmap_theme so all four read consistently and the customer-problem roadmap
|
|
6749
|
+
// grouping is explicit. Lifecycle-free, identical property surface (theme_scope
|
|
6750
|
+
// / priority); no property migration required. Paired edge renames live in
|
|
6751
|
+
// UPG_EDGE_MIGRATIONS['0.9.0'].
|
|
6752
|
+
{
|
|
6753
|
+
from: "theme",
|
|
6754
|
+
to: "roadmap_theme",
|
|
6755
|
+
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.'
|
|
6756
|
+
}
|
|
6757
|
+
],
|
|
6735
6758
|
"0.7.0": [
|
|
6736
6759
|
// (since v0.7.0, UPG-571) story_statement → user_story. The v0.2.7 split
|
|
6737
6760
|
// correctly separated the templated promise from the engineering work
|
|
@@ -7774,6 +7797,17 @@ function getSplitMigrations(fromVersion, toVersion) {
|
|
|
7774
7797
|
return result;
|
|
7775
7798
|
}
|
|
7776
7799
|
var UPG_EDGE_MIGRATIONS = {
|
|
7800
|
+
"0.9.0": [
|
|
7801
|
+
// (since v0.9.0, UPG-660) theme → roadmap_theme. The four canonical edges that
|
|
7802
|
+
// touch the roadmap theme are renamed to the roadmap_theme form. Endpoint guards
|
|
7803
|
+
// reference the POST-migration (roadmap_theme) types; edge migration runs after
|
|
7804
|
+
// node migration, so by the time these rules apply the node has already been
|
|
7805
|
+
// renamed theme → roadmap_theme (UPG_MIGRATIONS['0.9.0']).
|
|
7806
|
+
{ 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." },
|
|
7807
|
+
{ 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." },
|
|
7808
|
+
{ 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." },
|
|
7809
|
+
{ 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." }
|
|
7810
|
+
],
|
|
7777
7811
|
"0.7.0": [
|
|
7778
7812
|
// (since v0.7.0, UPG-571) story_statement → user_story re-canon. The four
|
|
7779
7813
|
// canonical edges that touch the statement are renamed to the user_story
|
|
@@ -10670,7 +10704,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10670
10704
|
reach: {
|
|
10671
10705
|
type: "assessment",
|
|
10672
10706
|
scale_id: "reach_5",
|
|
10673
|
-
description: "How many users experience this problem",
|
|
10707
|
+
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.",
|
|
10674
10708
|
properties: {
|
|
10675
10709
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
10676
10710
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -10682,7 +10716,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10682
10716
|
frequency: {
|
|
10683
10717
|
type: "assessment",
|
|
10684
10718
|
scale_id: "frequency_5",
|
|
10685
|
-
description: "How often users experience this problem",
|
|
10719
|
+
description: "How often users experience this problem. @deprecated 0.9.0:framework-scoped (opportunity-sizing). Removed in 0.9.1.",
|
|
10686
10720
|
properties: {
|
|
10687
10721
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
10688
10722
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -10694,7 +10728,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10694
10728
|
pain: {
|
|
10695
10729
|
type: "assessment",
|
|
10696
10730
|
scale_id: "pain_5",
|
|
10697
|
-
description: "How painful it is when unaddressed",
|
|
10731
|
+
description: "How painful it is when unaddressed. @deprecated 0.9.0:framework-scoped (opportunity-sizing). Removed in 0.9.1.",
|
|
10698
10732
|
properties: {
|
|
10699
10733
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
10700
10734
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -10703,7 +10737,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10703
10737
|
},
|
|
10704
10738
|
required: ["value", "label"]
|
|
10705
10739
|
},
|
|
10706
|
-
opportunity_score: { type: "number", description: "Computed: normalized_reach x normalized_frequency x normalized_pain (0-1)" }
|
|
10740
|
+
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." }
|
|
10707
10741
|
},
|
|
10708
10742
|
// OrganizationProperties: Organization entity.
|
|
10709
10743
|
organization: {
|
|
@@ -11117,6 +11151,11 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11117
11151
|
start_date: { type: "string", description: "ISO date work begins. More precise than `quarter` for continuous planning." },
|
|
11118
11152
|
target_date: { type: "string", description: "ISO date completion is expected. For shipped items, the actual completion date." }
|
|
11119
11153
|
},
|
|
11154
|
+
// RoadmapThemeProperties: Thematic grouping of roadmap work, around the customer problem it solves.
|
|
11155
|
+
roadmap_theme: {
|
|
11156
|
+
theme_scope: { type: "string", description: "Scope description" },
|
|
11157
|
+
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Priority" }
|
|
11158
|
+
},
|
|
11120
11159
|
// RoleProperties: Role entity.
|
|
11121
11160
|
role: {
|
|
11122
11161
|
responsibilities: { type: "string[]", description: "Key responsibilities of the role" },
|
|
@@ -11302,7 +11341,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11302
11341
|
reach: {
|
|
11303
11342
|
type: "assessment",
|
|
11304
11343
|
scale_id: "reach_5",
|
|
11305
|
-
description: "How many users this solution reaches (1 = few, 5 = most)",
|
|
11344
|
+
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.",
|
|
11306
11345
|
properties: {
|
|
11307
11346
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
11308
11347
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -11314,7 +11353,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11314
11353
|
impact: {
|
|
11315
11354
|
type: "assessment",
|
|
11316
11355
|
scale_id: "impact_5",
|
|
11317
|
-
description: "Expected impact on the target outcome (1 = minimal, 5 = transformative)",
|
|
11356
|
+
description: "Expected impact on the target outcome (1 = minimal, 5 = transformative). @deprecated 0.9.0:framework-scoped (rice-scoring). Removed in 0.9.1.",
|
|
11318
11357
|
properties: {
|
|
11319
11358
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
11320
11359
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -11326,7 +11365,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11326
11365
|
confidence: {
|
|
11327
11366
|
type: "assessment",
|
|
11328
11367
|
scale_id: "confidence_5",
|
|
11329
|
-
description: "How confident the team is in this solution (1 = speculative, 5 = proven)",
|
|
11368
|
+
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.",
|
|
11330
11369
|
properties: {
|
|
11331
11370
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
11332
11371
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -11338,7 +11377,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11338
11377
|
effort: {
|
|
11339
11378
|
type: "assessment",
|
|
11340
11379
|
scale_id: "effort_5",
|
|
11341
|
-
description: "Level of effort required to implement (1 = trivial, 5 = very large)",
|
|
11380
|
+
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.",
|
|
11342
11381
|
properties: {
|
|
11343
11382
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
11344
11383
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -11347,7 +11386,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11347
11386
|
},
|
|
11348
11387
|
required: ["value", "label"]
|
|
11349
11388
|
},
|
|
11350
|
-
rice_score: { type: "number", description: "Computed: (reach \xD7 impact \xD7 confidence) / effort" }
|
|
11389
|
+
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." }
|
|
11351
11390
|
},
|
|
11352
11391
|
// StakeholderProperties: Stakeholder entity.
|
|
11353
11392
|
stakeholder: {
|
|
@@ -11594,11 +11633,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11594
11633
|
skipped_count: { type: "number", description: "Number of tests that were skipped in the last run" },
|
|
11595
11634
|
flaky_count: { type: "number", description: "Number of tests that passed only on retry (flaky) in the last run" }
|
|
11596
11635
|
},
|
|
11597
|
-
// ThemeProperties: Thematic grouping of work.
|
|
11598
|
-
theme: {
|
|
11599
|
-
theme_scope: { type: "string", description: "Scope description" },
|
|
11600
|
-
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Priority" }
|
|
11601
|
-
},
|
|
11602
11636
|
// ThreatProperties: Threat.
|
|
11603
11637
|
threat: {
|
|
11604
11638
|
category: { type: "string", description: 'Attack or threat scenario. @example "injection", "misconfiguration", "social engineering", "supply chain"' },
|
|
@@ -11829,6 +11863,188 @@ function getPropertySchema(entityType) {
|
|
|
11829
11863
|
|
|
11830
11864
|
// src/frameworks/canonical.ts
|
|
11831
11865
|
var UPG_FRAMEWORKS = [
|
|
11866
|
+
{
|
|
11867
|
+
"id": "opportunity-sizing",
|
|
11868
|
+
"approach_ids": [
|
|
11869
|
+
"prioritise"
|
|
11870
|
+
],
|
|
11871
|
+
"name": "Opportunity Sizing",
|
|
11872
|
+
"version": "1.0.0",
|
|
11873
|
+
"description": "Size opportunities by Reach, Frequency, and Pain to rank which problems are most worth solving before committing to solutions.",
|
|
11874
|
+
"category": "prioritization",
|
|
11875
|
+
"origin": {
|
|
11876
|
+
"type": "practitioner",
|
|
11877
|
+
"attribution": "Continuous discovery practice",
|
|
11878
|
+
"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.",
|
|
11879
|
+
"url": "https://www.producttalk.org/2016/08/opportunity-solution-tree/",
|
|
11880
|
+
"year": 2016,
|
|
11881
|
+
"license": "open_attribution"
|
|
11882
|
+
},
|
|
11883
|
+
"tags": [
|
|
11884
|
+
"prioritization",
|
|
11885
|
+
"discovery",
|
|
11886
|
+
"table"
|
|
11887
|
+
],
|
|
11888
|
+
"slots": [
|
|
11889
|
+
{
|
|
11890
|
+
"label": "Opportunities to size",
|
|
11891
|
+
"entityTypeId": "opportunity",
|
|
11892
|
+
"description": "Opportunities scored on Reach, Frequency, and Pain."
|
|
11893
|
+
}
|
|
11894
|
+
],
|
|
11895
|
+
"data": {
|
|
11896
|
+
"entity_types": [
|
|
11897
|
+
{
|
|
11898
|
+
"type": "opportunity",
|
|
11899
|
+
"role": "scored_item"
|
|
11900
|
+
}
|
|
11901
|
+
],
|
|
11902
|
+
"required_properties": {
|
|
11903
|
+
"opportunity": [
|
|
11904
|
+
{
|
|
11905
|
+
"property": "reach",
|
|
11906
|
+
"type": "assessment",
|
|
11907
|
+
"scale_id": "reach_5",
|
|
11908
|
+
"required": true,
|
|
11909
|
+
"scope": "framework",
|
|
11910
|
+
"label": "Reach",
|
|
11911
|
+
"description": "How many users experience this problem?"
|
|
11912
|
+
},
|
|
11913
|
+
{
|
|
11914
|
+
"property": "frequency",
|
|
11915
|
+
"type": "assessment",
|
|
11916
|
+
"scale_id": "frequency_5",
|
|
11917
|
+
"required": true,
|
|
11918
|
+
"scope": "framework",
|
|
11919
|
+
"label": "Frequency",
|
|
11920
|
+
"description": "How often do they run into it?"
|
|
11921
|
+
},
|
|
11922
|
+
{
|
|
11923
|
+
"property": "pain",
|
|
11924
|
+
"type": "assessment",
|
|
11925
|
+
"scale_id": "pain_5",
|
|
11926
|
+
"required": true,
|
|
11927
|
+
"scope": "framework",
|
|
11928
|
+
"label": "Pain",
|
|
11929
|
+
"description": "How painful is it when left unaddressed?"
|
|
11930
|
+
}
|
|
11931
|
+
]
|
|
11932
|
+
},
|
|
11933
|
+
"computed_properties": [
|
|
11934
|
+
{
|
|
11935
|
+
"property": "opportunity_score",
|
|
11936
|
+
"expression": "reach * frequency * pain",
|
|
11937
|
+
"entity_type": "opportunity",
|
|
11938
|
+
"label": "Opportunity Score",
|
|
11939
|
+
"format": "number"
|
|
11940
|
+
}
|
|
11941
|
+
],
|
|
11942
|
+
"scoring_method": {
|
|
11943
|
+
"applies_to": [
|
|
11944
|
+
"opportunity"
|
|
11945
|
+
],
|
|
11946
|
+
"inputs": [
|
|
11947
|
+
{
|
|
11948
|
+
"property": "reach",
|
|
11949
|
+
"type": "assessment",
|
|
11950
|
+
"scale_id": "reach_5",
|
|
11951
|
+
"required": true,
|
|
11952
|
+
"scope": "framework",
|
|
11953
|
+
"label": "Reach",
|
|
11954
|
+
"description": "How many users experience this problem?"
|
|
11955
|
+
},
|
|
11956
|
+
{
|
|
11957
|
+
"property": "frequency",
|
|
11958
|
+
"type": "assessment",
|
|
11959
|
+
"scale_id": "frequency_5",
|
|
11960
|
+
"required": true,
|
|
11961
|
+
"scope": "framework",
|
|
11962
|
+
"label": "Frequency",
|
|
11963
|
+
"description": "How often do they run into it?"
|
|
11964
|
+
},
|
|
11965
|
+
{
|
|
11966
|
+
"property": "pain",
|
|
11967
|
+
"type": "assessment",
|
|
11968
|
+
"scale_id": "pain_5",
|
|
11969
|
+
"required": true,
|
|
11970
|
+
"scope": "framework",
|
|
11971
|
+
"label": "Pain",
|
|
11972
|
+
"description": "How painful is it when left unaddressed?"
|
|
11973
|
+
}
|
|
11974
|
+
],
|
|
11975
|
+
"computed": [
|
|
11976
|
+
{
|
|
11977
|
+
"property": "opportunity_score",
|
|
11978
|
+
"expression": "reach * frequency * pain",
|
|
11979
|
+
"label": "Opportunity Score",
|
|
11980
|
+
"format": "number"
|
|
11981
|
+
}
|
|
11982
|
+
]
|
|
11983
|
+
}
|
|
11984
|
+
},
|
|
11985
|
+
"structure": {
|
|
11986
|
+
"pattern": "table"
|
|
11987
|
+
},
|
|
11988
|
+
"presentation": {
|
|
11989
|
+
"layout": {
|
|
11990
|
+
"type": "table",
|
|
11991
|
+
"columns": [
|
|
11992
|
+
{
|
|
11993
|
+
"property": "title",
|
|
11994
|
+
"label": "Opportunities to size",
|
|
11995
|
+
"sortable": true
|
|
11996
|
+
},
|
|
11997
|
+
{
|
|
11998
|
+
"property": "reach",
|
|
11999
|
+
"label": "Reach",
|
|
12000
|
+
"sortable": true,
|
|
12001
|
+
"format": "number"
|
|
12002
|
+
},
|
|
12003
|
+
{
|
|
12004
|
+
"property": "frequency",
|
|
12005
|
+
"label": "Frequency",
|
|
12006
|
+
"sortable": true,
|
|
12007
|
+
"format": "number"
|
|
12008
|
+
},
|
|
12009
|
+
{
|
|
12010
|
+
"property": "pain",
|
|
12011
|
+
"label": "Pain",
|
|
12012
|
+
"sortable": true,
|
|
12013
|
+
"format": "number"
|
|
12014
|
+
},
|
|
12015
|
+
{
|
|
12016
|
+
"property": "opportunity_score",
|
|
12017
|
+
"label": "Opportunity Score",
|
|
12018
|
+
"sortable": true,
|
|
12019
|
+
"format": "score_pill"
|
|
12020
|
+
}
|
|
12021
|
+
]
|
|
12022
|
+
},
|
|
12023
|
+
"sort_by": {
|
|
12024
|
+
"property": "opportunity_score",
|
|
12025
|
+
"direction": "desc"
|
|
12026
|
+
},
|
|
12027
|
+
"colour_by": "score",
|
|
12028
|
+
"card_fields": [
|
|
12029
|
+
"title",
|
|
12030
|
+
"description",
|
|
12031
|
+
"status"
|
|
12032
|
+
]
|
|
12033
|
+
},
|
|
12034
|
+
"education": {
|
|
12035
|
+
"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.",
|
|
12036
|
+
"core_question": "Of the problems we could pursue, which affect the most users, most often, with the most pain?",
|
|
12037
|
+
"when_to_use": [
|
|
12038
|
+
"You have more opportunities than you can pursue",
|
|
12039
|
+
"You need to compare problems before committing to solutions",
|
|
12040
|
+
"You want a defensible, transparent way to choose what to explore"
|
|
12041
|
+
],
|
|
12042
|
+
"when_not_to_use": [
|
|
12043
|
+
"A single opportunity is already validated and obvious",
|
|
12044
|
+
"You have no signal yet on reach, frequency, or pain"
|
|
12045
|
+
]
|
|
12046
|
+
}
|
|
12047
|
+
},
|
|
11832
12048
|
{
|
|
11833
12049
|
"id": "opportunity-solution-tree",
|
|
11834
12050
|
"approach_ids": [
|
|
@@ -13085,7 +13301,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13085
13301
|
],
|
|
13086
13302
|
"name": "RICE Scoring",
|
|
13087
13303
|
"version": "1.0.0",
|
|
13088
|
-
"description": "Score features, opportunities, and needs by Reach, Impact, Confidence, and Effort to produce a ranked priority list.",
|
|
13304
|
+
"description": "Score features, solutions, opportunities, and needs by Reach, Impact, Confidence, and Effort to produce a ranked priority list.",
|
|
13089
13305
|
"category": "prioritization",
|
|
13090
13306
|
"origin": {
|
|
13091
13307
|
"type": "practitioner",
|
|
@@ -13110,6 +13326,11 @@ var UPG_FRAMEWORKS = [
|
|
|
13110
13326
|
"entityTypeId": "opportunity",
|
|
13111
13327
|
"description": "Opportunities scored on the same RICE Scoring inputs as features."
|
|
13112
13328
|
},
|
|
13329
|
+
{
|
|
13330
|
+
"label": "Solutions to score",
|
|
13331
|
+
"entityTypeId": "solution",
|
|
13332
|
+
"description": "Solutions scored on the same RICE Scoring inputs as features."
|
|
13333
|
+
},
|
|
13113
13334
|
{
|
|
13114
13335
|
"label": "Needs to score",
|
|
13115
13336
|
"entityTypeId": "need",
|
|
@@ -13126,6 +13347,10 @@ var UPG_FRAMEWORKS = [
|
|
|
13126
13347
|
"type": "opportunity",
|
|
13127
13348
|
"role": "scored_item"
|
|
13128
13349
|
},
|
|
13350
|
+
{
|
|
13351
|
+
"type": "solution",
|
|
13352
|
+
"role": "scored_item"
|
|
13353
|
+
},
|
|
13129
13354
|
{
|
|
13130
13355
|
"type": "need",
|
|
13131
13356
|
"role": "scored_item"
|
|
@@ -13208,6 +13433,44 @@ var UPG_FRAMEWORKS = [
|
|
|
13208
13433
|
"description": "How much work is required to build and ship this, on the effort scale?"
|
|
13209
13434
|
}
|
|
13210
13435
|
],
|
|
13436
|
+
"solution": [
|
|
13437
|
+
{
|
|
13438
|
+
"property": "reach",
|
|
13439
|
+
"type": "assessment",
|
|
13440
|
+
"scale_id": "reach_5",
|
|
13441
|
+
"required": true,
|
|
13442
|
+
"scope": "framework",
|
|
13443
|
+
"label": "Reach",
|
|
13444
|
+
"description": "How many users will this impact per quarter?"
|
|
13445
|
+
},
|
|
13446
|
+
{
|
|
13447
|
+
"property": "impact",
|
|
13448
|
+
"type": "assessment",
|
|
13449
|
+
"scale_id": "impact_5",
|
|
13450
|
+
"required": true,
|
|
13451
|
+
"scope": "framework",
|
|
13452
|
+
"label": "Impact",
|
|
13453
|
+
"description": "How much will this impact each user, on the impact scale?"
|
|
13454
|
+
},
|
|
13455
|
+
{
|
|
13456
|
+
"property": "confidence",
|
|
13457
|
+
"type": "assessment",
|
|
13458
|
+
"scale_id": "confidence_5",
|
|
13459
|
+
"required": true,
|
|
13460
|
+
"scope": "framework",
|
|
13461
|
+
"label": "Confidence",
|
|
13462
|
+
"description": "How confident are you in the reach, impact, and effort estimates?"
|
|
13463
|
+
},
|
|
13464
|
+
{
|
|
13465
|
+
"property": "effort",
|
|
13466
|
+
"type": "assessment",
|
|
13467
|
+
"scale_id": "effort_5",
|
|
13468
|
+
"required": true,
|
|
13469
|
+
"scope": "framework",
|
|
13470
|
+
"label": "Effort",
|
|
13471
|
+
"description": "How much work is required to build and ship this, on the effort scale?"
|
|
13472
|
+
}
|
|
13473
|
+
],
|
|
13211
13474
|
"need": [
|
|
13212
13475
|
{
|
|
13213
13476
|
"property": "reach",
|
|
@@ -13262,6 +13525,13 @@ var UPG_FRAMEWORKS = [
|
|
|
13262
13525
|
"label": "RICE Score",
|
|
13263
13526
|
"format": "number"
|
|
13264
13527
|
},
|
|
13528
|
+
{
|
|
13529
|
+
"property": "rice_score",
|
|
13530
|
+
"expression": "(reach * impact * confidence) / effort",
|
|
13531
|
+
"entity_type": "solution",
|
|
13532
|
+
"label": "RICE Score",
|
|
13533
|
+
"format": "number"
|
|
13534
|
+
},
|
|
13265
13535
|
{
|
|
13266
13536
|
"property": "rice_score",
|
|
13267
13537
|
"expression": "(reach * impact * confidence) / effort",
|
|
@@ -13274,6 +13544,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13274
13544
|
"applies_to": [
|
|
13275
13545
|
"feature",
|
|
13276
13546
|
"opportunity",
|
|
13547
|
+
"solution",
|
|
13277
13548
|
"need"
|
|
13278
13549
|
],
|
|
13279
13550
|
"inputs": [
|
|
@@ -17956,7 +18227,8 @@ var STANDARD_LABELS = {
|
|
|
17956
18227
|
product: { alt_labels: ["offering", "app", "service", "platform"] },
|
|
17957
18228
|
vision: { alt_labels: ["product vision", "north star vision", "long-term vision"] },
|
|
17958
18229
|
mission: { alt_labels: ["mission statement", "purpose"] },
|
|
17959
|
-
strategic_theme: { alt_labels: ["
|
|
18230
|
+
strategic_theme: { alt_labels: ["focus area", "strategic focus area"] },
|
|
18231
|
+
// N6: not 'theme'/'strategic pillar' (own types)
|
|
17960
18232
|
initiative: { alt_labels: ["strategic initiative", "program initiative", "workstream"] },
|
|
17961
18233
|
capability: { alt_labels: ["business capability", "organizational capability"] },
|
|
17962
18234
|
value_stream: { alt_labels: ["value chain", "stream"] },
|
|
@@ -18018,7 +18290,8 @@ var STANDARD_LABELS = {
|
|
|
18018
18290
|
fix: { alt_labels: ["bugfix", "patch", "remediation"] },
|
|
18019
18291
|
roadmap: { alt_labels: ["product roadmap", "release plan", "timeline"] },
|
|
18020
18292
|
roadmap_item: { alt_labels: ["roadmap entry", "planned item"] },
|
|
18021
|
-
|
|
18293
|
+
roadmap_theme: { alt_labels: ["product theme", "roadmap theme"] },
|
|
18294
|
+
// UPG-660: renamed from bare 'theme' (N6 lineage)
|
|
18022
18295
|
// Engineering layer
|
|
18023
18296
|
bounded_context: { alt_labels: ["context", "domain boundary", "module boundary"] },
|
|
18024
18297
|
service: { alt_labels: ["microservice", "backend service", "api service"] },
|
|
@@ -18217,7 +18490,8 @@ var STANDARD_LABELS = {
|
|
|
18217
18490
|
feedback_vote: { alt_labels: ["upvote", "vote", "user vote"] },
|
|
18218
18491
|
user_advisory_board: { alt_labels: ["cab", "customer advisory board", "advisory council"] },
|
|
18219
18492
|
beta_program: { alt_labels: ["beta", "early access", "preview program"] },
|
|
18220
|
-
feedback_theme: { alt_labels: ["feedback cluster", "
|
|
18493
|
+
feedback_theme: { alt_labels: ["feedback cluster", "feedback category"] },
|
|
18494
|
+
// N6: not bare 'theme'
|
|
18221
18495
|
// Pricing & Packaging layer
|
|
18222
18496
|
pricing_strategy: { alt_labels: ["pricing model", "monetization strategy"] },
|
|
18223
18497
|
package: { alt_labels: ["product package", "bundle", "sku"] },
|
|
@@ -18723,9 +18997,9 @@ var PRODUCT_DELIVERY_PLAYBOOK = {
|
|
|
18723
18997
|
),
|
|
18724
18998
|
seqStep(
|
|
18725
18999
|
6,
|
|
18726
|
-
"Themes & Changelog",
|
|
18727
|
-
["
|
|
18728
|
-
"Group
|
|
19000
|
+
"Roadmap Themes & Changelog",
|
|
19001
|
+
["roadmap_theme", "changelog"],
|
|
19002
|
+
"Group roadmap work into roadmap themes around the customer problem. Maintain a changelog the team and customers can read together."
|
|
18729
19003
|
)
|
|
18730
19004
|
]
|
|
18731
19005
|
};
|
|
@@ -20030,7 +20304,7 @@ var PRODUCT_SPEC_GUIDE = {
|
|
|
20030
20304
|
// registered to product_spec but missing from the navigation order).
|
|
20031
20305
|
// `changelog` lives here because it is a structural product-shipping
|
|
20032
20306
|
// artefact; content domain references it only via cross-domain bridges.
|
|
20033
|
-
creation_sequence: ["feature_area", "feature", "epic", "user_story", "acceptance_criterion", "task", "bug", "release", "roadmap", "roadmap_item", "
|
|
20307
|
+
creation_sequence: ["feature_area", "feature", "epic", "user_story", "acceptance_criterion", "task", "bug", "release", "roadmap", "roadmap_item", "roadmap_theme", "changelog"],
|
|
20034
20308
|
patterns: [
|
|
20035
20309
|
{
|
|
20036
20310
|
name: "Feature Decomposition",
|
|
@@ -24512,7 +24786,7 @@ var UPG_REGIONS = [
|
|
|
24512
24786
|
role: "leaf"
|
|
24513
24787
|
},
|
|
24514
24788
|
{
|
|
24515
|
-
type: "
|
|
24789
|
+
type: "roadmap_theme",
|
|
24516
24790
|
role: "container",
|
|
24517
24791
|
notes: "semantic spanner, not containment"
|
|
24518
24792
|
},
|
|
@@ -24548,10 +24822,10 @@ var UPG_REGIONS = [
|
|
|
24548
24822
|
"user_story_verified_by_acceptance_criterion",
|
|
24549
24823
|
"task_implements_user_story",
|
|
24550
24824
|
"roadmap_contains_roadmap_item",
|
|
24551
|
-
"
|
|
24825
|
+
"roadmap_categorised_by_roadmap_theme",
|
|
24552
24826
|
"roadmap_schedules_release",
|
|
24553
24827
|
"release_documented_in_changelog",
|
|
24554
|
-
"
|
|
24828
|
+
"roadmap_theme_spans_feature_area",
|
|
24555
24829
|
"milestone_gates_release",
|
|
24556
24830
|
"roadmap_item_references_feature",
|
|
24557
24831
|
"feature_request_voted_on_by_feedback_vote"
|
|
@@ -25872,7 +26146,7 @@ function isCanonical(text) {
|
|
|
25872
26146
|
}
|
|
25873
26147
|
|
|
25874
26148
|
// src/index.ts
|
|
25875
|
-
var UPG_VERSION = "0.
|
|
26149
|
+
var UPG_VERSION = "0.9.1";
|
|
25876
26150
|
var UPG_FORMAT_VERSION = "0.4.0";
|
|
25877
26151
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
25878
26152
|
var UPG_TYPES = getTypes();
|