@unified-product-graph/core 0.8.1 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/index.cjs +1253 -306
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +62 -15
- package/dist/index.d.ts +62 -15
- package/dist/index.js +1253 -306
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -946,7 +946,7 @@ var UPG_EDGE_CATALOG = {
|
|
|
946
946
|
// product → persona is the most fundamental relationship in the
|
|
947
947
|
// user domain ("who is this product for?") and was the only way to
|
|
948
948
|
// anchor a fresh persona to its product before this edge existed. Without
|
|
949
|
-
// it, the natural agent path through `/upg-persona` produced an orphan
|
|
949
|
+
// it, the natural agent path through `/upg-new-persona` produced an orphan
|
|
950
950
|
// persona only attached laterally via `ideal_customer_profile_maps_to_persona`
|
|
951
951
|
// or `positioning_resonates_with_persona`. Semantic, not hierarchy: a
|
|
952
952
|
// product doesn't "contain" personas; it targets them.
|
|
@@ -2161,6 +2161,13 @@ var UPG_EDGE_CATALOG = {
|
|
|
2161
2161
|
// release strategy to the concrete deployments it governs.
|
|
2162
2162
|
incident_affects_feature: { forward_verb: "affects", reverse_verb: "affected_by", classification: "cross-domain", source_type: "incident", target_type: "feature" },
|
|
2163
2163
|
release_strategy_used_by_deployment: { forward_verb: "used_by", reverse_verb: "uses", classification: "cross-domain", source_type: "release_strategy", target_type: "deployment" },
|
|
2164
|
+
// v0.8.2 (UPG-615): ITIL/ITSM incident management explicitly links an incident
|
|
2165
|
+
// to the customer-facing support tickets/cases it spawns — when a service
|
|
2166
|
+
// breaks, customers raise tickets; the incident is the cause, the ticket the
|
|
2167
|
+
// effect. Closes the otherwise-unmediated "Customer Support" island in
|
|
2168
|
+
// `playbook:operations-quality`, binding `support_ticket` to the incident/ops
|
|
2169
|
+
// spine. Source: ITIL v4 incident management; DORA/SRE customer-facing impact.
|
|
2170
|
+
incident_generates_support_ticket: { forward_verb: "generates", reverse_verb: "generated_by", classification: "cross-domain", source_type: "incident", target_type: "support_ticket" },
|
|
2164
2171
|
// Cluster C: User Research linkage matrix.
|
|
2165
2172
|
// research_study → {participant, research_question, survey_response,
|
|
2166
2173
|
// interview_guide} containment edges already exist (49/49 in Wave 4).
|
|
@@ -11968,6 +11975,9 @@ var UPG_FRAMEWORKS = [
|
|
|
11968
11975
|
},
|
|
11969
11976
|
{
|
|
11970
11977
|
"id": "value-proposition-canvas",
|
|
11978
|
+
"approach_ids": [
|
|
11979
|
+
"trace"
|
|
11980
|
+
],
|
|
11971
11981
|
"name": "Value Proposition Canvas",
|
|
11972
11982
|
"version": "1.0.0",
|
|
11973
11983
|
"description": "Map customer jobs, pains, and gains on one side, then align product features, pain relievers, and gain creators on the other to achieve product-market fit.",
|
|
@@ -12072,6 +12082,9 @@ var UPG_FRAMEWORKS = [
|
|
|
12072
12082
|
},
|
|
12073
12083
|
{
|
|
12074
12084
|
"id": "persona-canvas",
|
|
12085
|
+
"approach_ids": [
|
|
12086
|
+
"trace"
|
|
12087
|
+
],
|
|
12075
12088
|
"name": "Persona Canvas",
|
|
12076
12089
|
"version": "1.0.0",
|
|
12077
12090
|
"description": "Demographics, goals, frustrations, JTBD: a structured template for creating research-backed personas.",
|
|
@@ -12184,6 +12197,9 @@ var UPG_FRAMEWORKS = [
|
|
|
12184
12197
|
},
|
|
12185
12198
|
{
|
|
12186
12199
|
"id": "empathy-map",
|
|
12200
|
+
"approach_ids": [
|
|
12201
|
+
"trace"
|
|
12202
|
+
],
|
|
12187
12203
|
"name": "Empathy Map",
|
|
12188
12204
|
"version": "1.0.0",
|
|
12189
12205
|
"description": "Visualise what a user says, thinks, does, and feels to build deeper empathy and uncover hidden needs.",
|
|
@@ -12344,6 +12360,7 @@ var UPG_FRAMEWORKS = [
|
|
|
12344
12360
|
"property": "evolution_stage",
|
|
12345
12361
|
"type": "enum",
|
|
12346
12362
|
"required": true,
|
|
12363
|
+
"scope": "framework",
|
|
12347
12364
|
"label": "Evolution Stage",
|
|
12348
12365
|
"description": "Where this component sits on the evolution axis",
|
|
12349
12366
|
"enum_values": [
|
|
@@ -12357,6 +12374,7 @@ var UPG_FRAMEWORKS = [
|
|
|
12357
12374
|
"property": "visibility",
|
|
12358
12375
|
"type": "number",
|
|
12359
12376
|
"required": true,
|
|
12377
|
+
"scope": "framework",
|
|
12360
12378
|
"label": "Visibility",
|
|
12361
12379
|
"description": "Y-axis position (0=infrastructure, 1=anchor/user)"
|
|
12362
12380
|
}
|
|
@@ -12366,6 +12384,7 @@ var UPG_FRAMEWORKS = [
|
|
|
12366
12384
|
"property": "evolution_stage",
|
|
12367
12385
|
"type": "enum",
|
|
12368
12386
|
"required": true,
|
|
12387
|
+
"scope": "framework",
|
|
12369
12388
|
"label": "Evolution Stage",
|
|
12370
12389
|
"description": "Where this component sits on the evolution axis",
|
|
12371
12390
|
"enum_values": [
|
|
@@ -12379,6 +12398,7 @@ var UPG_FRAMEWORKS = [
|
|
|
12379
12398
|
"property": "visibility",
|
|
12380
12399
|
"type": "number",
|
|
12381
12400
|
"required": true,
|
|
12401
|
+
"scope": "framework",
|
|
12382
12402
|
"label": "Visibility",
|
|
12383
12403
|
"description": "Y-axis position (0=infrastructure, 1=anchor/user)"
|
|
12384
12404
|
}
|
|
@@ -12388,6 +12408,7 @@ var UPG_FRAMEWORKS = [
|
|
|
12388
12408
|
"property": "evolution_stage",
|
|
12389
12409
|
"type": "enum",
|
|
12390
12410
|
"required": true,
|
|
12411
|
+
"scope": "framework",
|
|
12391
12412
|
"label": "Evolution Stage",
|
|
12392
12413
|
"description": "Where this component sits on the evolution axis",
|
|
12393
12414
|
"enum_values": [
|
|
@@ -12401,6 +12422,7 @@ var UPG_FRAMEWORKS = [
|
|
|
12401
12422
|
"property": "visibility",
|
|
12402
12423
|
"type": "number",
|
|
12403
12424
|
"required": true,
|
|
12425
|
+
"scope": "framework",
|
|
12404
12426
|
"label": "Visibility",
|
|
12405
12427
|
"description": "Y-axis position (0=infrastructure, 1=anchor/user)"
|
|
12406
12428
|
}
|
|
@@ -12410,6 +12432,7 @@ var UPG_FRAMEWORKS = [
|
|
|
12410
12432
|
"property": "evolution_stage",
|
|
12411
12433
|
"type": "enum",
|
|
12412
12434
|
"required": true,
|
|
12435
|
+
"scope": "framework",
|
|
12413
12436
|
"label": "Evolution Stage",
|
|
12414
12437
|
"description": 'Where this component sits on the evolution axis (need anchor is usually at "product" or "commodity")',
|
|
12415
12438
|
"enum_values": [
|
|
@@ -12423,6 +12446,7 @@ var UPG_FRAMEWORKS = [
|
|
|
12423
12446
|
"property": "visibility",
|
|
12424
12447
|
"type": "number",
|
|
12425
12448
|
"required": true,
|
|
12449
|
+
"scope": "framework",
|
|
12426
12450
|
"label": "Visibility",
|
|
12427
12451
|
"description": "Y-axis position (0=infrastructure, 1=anchor/user); needs sit at 1.0"
|
|
12428
12452
|
}
|
|
@@ -12463,6 +12487,9 @@ var UPG_FRAMEWORKS = [
|
|
|
12463
12487
|
},
|
|
12464
12488
|
{
|
|
12465
12489
|
"id": "business-model-canvas",
|
|
12490
|
+
"approach_ids": [
|
|
12491
|
+
"plan"
|
|
12492
|
+
],
|
|
12466
12493
|
"name": "Business Model Canvas",
|
|
12467
12494
|
"version": "1.0.0",
|
|
12468
12495
|
"description": "Nine building blocks that describe how an organisation creates, delivers, and captures value.",
|
|
@@ -12602,6 +12629,9 @@ var UPG_FRAMEWORKS = [
|
|
|
12602
12629
|
},
|
|
12603
12630
|
{
|
|
12604
12631
|
"id": "porter-five-forces",
|
|
12632
|
+
"approach_ids": [
|
|
12633
|
+
"inspect"
|
|
12634
|
+
],
|
|
12605
12635
|
"name": "Porter Five Forces",
|
|
12606
12636
|
"version": "1.0.0",
|
|
12607
12637
|
"description": "Analyse industry competitiveness through five forces: rivalry, new entrants, substitutes, buyer power, and supplier power.",
|
|
@@ -12691,6 +12721,9 @@ var UPG_FRAMEWORKS = [
|
|
|
12691
12721
|
},
|
|
12692
12722
|
{
|
|
12693
12723
|
"id": "swot-analysis",
|
|
12724
|
+
"approach_ids": [
|
|
12725
|
+
"inspect"
|
|
12726
|
+
],
|
|
12694
12727
|
"name": "SWOT Analysis",
|
|
12695
12728
|
"version": "1.0.0",
|
|
12696
12729
|
"description": "Map Strengths, Weaknesses, Opportunities, and Threats in a 2x2 grid. Internal vs external, helpful vs harmful.",
|
|
@@ -13017,6 +13050,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13017
13050
|
"type": "assessment",
|
|
13018
13051
|
"scale_id": "reach_5",
|
|
13019
13052
|
"required": true,
|
|
13053
|
+
"scope": "framework",
|
|
13020
13054
|
"label": "Reach",
|
|
13021
13055
|
"description": "How many users will this impact per quarter?"
|
|
13022
13056
|
},
|
|
@@ -13025,6 +13059,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13025
13059
|
"type": "assessment",
|
|
13026
13060
|
"scale_id": "impact_5",
|
|
13027
13061
|
"required": true,
|
|
13062
|
+
"scope": "framework",
|
|
13028
13063
|
"label": "Impact",
|
|
13029
13064
|
"description": "How much will this impact each user, on the impact scale?"
|
|
13030
13065
|
},
|
|
@@ -13033,6 +13068,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13033
13068
|
"type": "assessment",
|
|
13034
13069
|
"scale_id": "confidence_5",
|
|
13035
13070
|
"required": true,
|
|
13071
|
+
"scope": "framework",
|
|
13036
13072
|
"label": "Confidence",
|
|
13037
13073
|
"description": "How confident are you in the reach, impact, and effort estimates?"
|
|
13038
13074
|
},
|
|
@@ -13041,6 +13077,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13041
13077
|
"type": "assessment",
|
|
13042
13078
|
"scale_id": "effort_5",
|
|
13043
13079
|
"required": true,
|
|
13080
|
+
"scope": "framework",
|
|
13044
13081
|
"label": "Effort",
|
|
13045
13082
|
"description": "How much work is required to build and ship this, on the effort scale?"
|
|
13046
13083
|
}
|
|
@@ -13127,6 +13164,9 @@ var UPG_FRAMEWORKS = [
|
|
|
13127
13164
|
},
|
|
13128
13165
|
{
|
|
13129
13166
|
"id": "build-measure-learn",
|
|
13167
|
+
"approach_ids": [
|
|
13168
|
+
"reflect"
|
|
13169
|
+
],
|
|
13130
13170
|
"name": "Build-Measure-Learn",
|
|
13131
13171
|
"version": "1.0.0",
|
|
13132
13172
|
"description": "The core Lean Startup feedback loop: build a minimum viable product, measure its impact with actionable metrics, and learn whether to pivot or persevere.",
|
|
@@ -13262,6 +13302,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13262
13302
|
"property": "functional_response",
|
|
13263
13303
|
"type": "enum",
|
|
13264
13304
|
"required": true,
|
|
13305
|
+
"scope": "framework",
|
|
13265
13306
|
"label": "Functional Response",
|
|
13266
13307
|
"description": "How users feel when the feature IS present",
|
|
13267
13308
|
"enum_values": [
|
|
@@ -13276,6 +13317,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13276
13317
|
"property": "dysfunctional_response",
|
|
13277
13318
|
"type": "enum",
|
|
13278
13319
|
"required": true,
|
|
13320
|
+
"scope": "framework",
|
|
13279
13321
|
"label": "Dysfunctional Response",
|
|
13280
13322
|
"description": "How users feel when the feature IS NOT present",
|
|
13281
13323
|
"enum_values": [
|
|
@@ -13290,6 +13332,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13290
13332
|
"property": "delighter_count",
|
|
13291
13333
|
"type": "number",
|
|
13292
13334
|
"required": false,
|
|
13335
|
+
"scope": "framework",
|
|
13293
13336
|
"label": "Delighter classifications",
|
|
13294
13337
|
"description": "Count of survey responses classifying this feature as a delighter (attractive)"
|
|
13295
13338
|
},
|
|
@@ -13297,6 +13340,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13297
13340
|
"property": "performance_count",
|
|
13298
13341
|
"type": "number",
|
|
13299
13342
|
"required": false,
|
|
13343
|
+
"scope": "framework",
|
|
13300
13344
|
"label": "Performance classifications",
|
|
13301
13345
|
"description": "Count of survey responses classifying this feature as performance (one-dimensional)"
|
|
13302
13346
|
},
|
|
@@ -13304,6 +13348,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13304
13348
|
"property": "must_be_count",
|
|
13305
13349
|
"type": "number",
|
|
13306
13350
|
"required": false,
|
|
13351
|
+
"scope": "framework",
|
|
13307
13352
|
"label": "Must-be classifications",
|
|
13308
13353
|
"description": "Count of survey responses classifying this feature as must-be (basic)"
|
|
13309
13354
|
},
|
|
@@ -13311,6 +13356,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13311
13356
|
"property": "indifferent_count",
|
|
13312
13357
|
"type": "number",
|
|
13313
13358
|
"required": false,
|
|
13359
|
+
"scope": "framework",
|
|
13314
13360
|
"label": "Indifferent classifications",
|
|
13315
13361
|
"description": "Count of survey responses classifying this feature as indifferent"
|
|
13316
13362
|
}
|
|
@@ -13503,6 +13549,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13503
13549
|
"property": "moscow",
|
|
13504
13550
|
"type": "enum",
|
|
13505
13551
|
"required": true,
|
|
13552
|
+
"scope": "framework",
|
|
13506
13553
|
"label": "MoSCoW priority",
|
|
13507
13554
|
"description": "Which scope bucket this requirement falls into for the current release",
|
|
13508
13555
|
"enum_values": [
|
|
@@ -13513,16 +13560,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13513
13560
|
]
|
|
13514
13561
|
}
|
|
13515
13562
|
]
|
|
13516
|
-
}
|
|
13517
|
-
"computed_properties": [
|
|
13518
|
-
{
|
|
13519
|
-
"property": "must_have_ratio",
|
|
13520
|
-
"expression": "must_count / total_count",
|
|
13521
|
-
"entity_type": "feature",
|
|
13522
|
-
"label": "Must-have Ratio",
|
|
13523
|
-
"format": "percentage"
|
|
13524
|
-
}
|
|
13525
|
-
]
|
|
13563
|
+
}
|
|
13526
13564
|
},
|
|
13527
13565
|
"structure": {
|
|
13528
13566
|
"pattern": "table"
|
|
@@ -13686,6 +13724,9 @@ var UPG_FRAMEWORKS = [
|
|
|
13686
13724
|
},
|
|
13687
13725
|
{
|
|
13688
13726
|
"id": "c4-model",
|
|
13727
|
+
"approach_ids": [
|
|
13728
|
+
"trace"
|
|
13729
|
+
],
|
|
13689
13730
|
"name": "C4 Model",
|
|
13690
13731
|
"version": "1.0.0",
|
|
13691
13732
|
"description": "Visualise software architecture at four levels of abstraction: System Context, Container, Component, and Code. Each level zooms in to reveal more detail.",
|
|
@@ -13778,6 +13819,9 @@ var UPG_FRAMEWORKS = [
|
|
|
13778
13819
|
},
|
|
13779
13820
|
{
|
|
13780
13821
|
"id": "adr-log",
|
|
13822
|
+
"approach_ids": [
|
|
13823
|
+
"inspect"
|
|
13824
|
+
],
|
|
13781
13825
|
"name": "ADR Log",
|
|
13782
13826
|
"version": "1.0.0",
|
|
13783
13827
|
"description": "Architecture Decision Records: log decisions with context, options, and rationale.",
|
|
@@ -13891,6 +13935,9 @@ var UPG_FRAMEWORKS = [
|
|
|
13891
13935
|
},
|
|
13892
13936
|
{
|
|
13893
13937
|
"id": "atomic-design",
|
|
13938
|
+
"approach_ids": [
|
|
13939
|
+
"trace"
|
|
13940
|
+
],
|
|
13894
13941
|
"name": "Atomic Design",
|
|
13895
13942
|
"version": "1.0.0",
|
|
13896
13943
|
"description": "Atoms, Molecules, Organisms, Templates, Pages: a methodology for creating design systems from the smallest elements up.",
|
|
@@ -13988,6 +14035,9 @@ var UPG_FRAMEWORKS = [
|
|
|
13988
14035
|
},
|
|
13989
14036
|
{
|
|
13990
14037
|
"id": "double-diamond",
|
|
14038
|
+
"approach_ids": [
|
|
14039
|
+
"plan"
|
|
14040
|
+
],
|
|
13991
14041
|
"name": "Double Diamond",
|
|
13992
14042
|
"version": "1.0.0",
|
|
13993
14043
|
"description": "Discover, Define, Develop, Deliver: a four-phase divergent/convergent design process.",
|
|
@@ -14078,6 +14128,9 @@ var UPG_FRAMEWORKS = [
|
|
|
14078
14128
|
},
|
|
14079
14129
|
{
|
|
14080
14130
|
"id": "dora-metrics",
|
|
14131
|
+
"approach_ids": [
|
|
14132
|
+
"inspect"
|
|
14133
|
+
],
|
|
14081
14134
|
"name": "DORA Metrics",
|
|
14082
14135
|
"version": "1.0.0",
|
|
14083
14136
|
"description": "Four key metrics for software delivery performance: deployment frequency, lead time, change failure rate, and time to restore.",
|
|
@@ -14137,16 +14190,7 @@ var UPG_FRAMEWORKS = [
|
|
|
14137
14190
|
]
|
|
14138
14191
|
}
|
|
14139
14192
|
]
|
|
14140
|
-
}
|
|
14141
|
-
"computed_properties": [
|
|
14142
|
-
{
|
|
14143
|
-
"property": "stability_index",
|
|
14144
|
-
"expression": "change_failure_rate * mean_time_to_recovery",
|
|
14145
|
-
"entity_type": "metric",
|
|
14146
|
-
"label": "Stability Index",
|
|
14147
|
-
"format": "number"
|
|
14148
|
-
}
|
|
14149
|
-
]
|
|
14193
|
+
}
|
|
14150
14194
|
},
|
|
14151
14195
|
"structure": {
|
|
14152
14196
|
"pattern": "collection"
|
|
@@ -14275,6 +14319,9 @@ var UPG_FRAMEWORKS = [
|
|
|
14275
14319
|
},
|
|
14276
14320
|
{
|
|
14277
14321
|
"id": "pirate-metrics-aarrr",
|
|
14322
|
+
"approach_ids": [
|
|
14323
|
+
"trace"
|
|
14324
|
+
],
|
|
14278
14325
|
"name": "Pirate Metrics AARRR",
|
|
14279
14326
|
"version": "1.0.0",
|
|
14280
14327
|
"description": "Track user lifecycle across five stages: Acquisition, Activation, Retention, Revenue, and Referral.",
|
|
@@ -14308,7 +14355,7 @@ var UPG_FRAMEWORKS = [
|
|
|
14308
14355
|
"required_properties": {
|
|
14309
14356
|
"metric": [
|
|
14310
14357
|
{
|
|
14311
|
-
"property": "
|
|
14358
|
+
"property": "metric_category",
|
|
14312
14359
|
"type": "enum",
|
|
14313
14360
|
"required": true,
|
|
14314
14361
|
"label": "Lifecycle stage",
|
|
@@ -14322,16 +14369,7 @@ var UPG_FRAMEWORKS = [
|
|
|
14322
14369
|
]
|
|
14323
14370
|
}
|
|
14324
14371
|
]
|
|
14325
|
-
}
|
|
14326
|
-
"computed_properties": [
|
|
14327
|
-
{
|
|
14328
|
-
"property": "conversion_rate",
|
|
14329
|
-
"expression": "(stage_exits / stage_entries) * 100",
|
|
14330
|
-
"entity_type": "metric",
|
|
14331
|
-
"label": "Stage Conversion",
|
|
14332
|
-
"format": "percentage"
|
|
14333
|
-
}
|
|
14334
|
-
]
|
|
14372
|
+
}
|
|
14335
14373
|
},
|
|
14336
14374
|
"structure": {
|
|
14337
14375
|
"pattern": "funnel",
|
|
@@ -14395,6 +14433,9 @@ var UPG_FRAMEWORKS = [
|
|
|
14395
14433
|
},
|
|
14396
14434
|
{
|
|
14397
14435
|
"id": "north-star-metric",
|
|
14436
|
+
"approach_ids": [
|
|
14437
|
+
"plan"
|
|
14438
|
+
],
|
|
14398
14439
|
"name": "North Star Metric",
|
|
14399
14440
|
"version": "1.0.0",
|
|
14400
14441
|
"description": "One metric that best captures the core value you deliver. Supported by 3-5 input metrics that drive it.",
|
|
@@ -14428,7 +14469,7 @@ var UPG_FRAMEWORKS = [
|
|
|
14428
14469
|
"required_properties": {
|
|
14429
14470
|
"metric": [
|
|
14430
14471
|
{
|
|
14431
|
-
"property": "
|
|
14472
|
+
"property": "designation",
|
|
14432
14473
|
"type": "enum",
|
|
14433
14474
|
"required": true,
|
|
14434
14475
|
"label": "Metric role",
|
|
@@ -14446,16 +14487,7 @@ var UPG_FRAMEWORKS = [
|
|
|
14446
14487
|
"description": "How strongly this input metric moves the North Star (input metrics only)"
|
|
14447
14488
|
}
|
|
14448
14489
|
]
|
|
14449
|
-
}
|
|
14450
|
-
"computed_properties": [
|
|
14451
|
-
{
|
|
14452
|
-
"property": "nsm_impact",
|
|
14453
|
-
"expression": "input_metric_value * leverage",
|
|
14454
|
-
"entity_type": "metric",
|
|
14455
|
-
"label": "NSM Impact",
|
|
14456
|
-
"format": "number"
|
|
14457
|
-
}
|
|
14458
|
-
]
|
|
14490
|
+
}
|
|
14459
14491
|
},
|
|
14460
14492
|
"structure": {
|
|
14461
14493
|
"pattern": "collection"
|
|
@@ -14491,6 +14523,9 @@ var UPG_FRAMEWORKS = [
|
|
|
14491
14523
|
},
|
|
14492
14524
|
{
|
|
14493
14525
|
"id": "marketing-mix-4ps",
|
|
14526
|
+
"approach_ids": [
|
|
14527
|
+
"plan"
|
|
14528
|
+
],
|
|
14494
14529
|
"name": "Marketing Mix 4Ps",
|
|
14495
14530
|
"version": "1.0.0",
|
|
14496
14531
|
"description": "The foundational marketing framework. Every marketing strategy must address four decisions: what to sell (Product), what to charge (Price), where to sell (Place), and how to promote (Promotion).",
|
|
@@ -14584,6 +14619,9 @@ var UPG_FRAMEWORKS = [
|
|
|
14584
14619
|
},
|
|
14585
14620
|
{
|
|
14586
14621
|
"id": "bullseye-framework",
|
|
14622
|
+
"approach_ids": [
|
|
14623
|
+
"plan"
|
|
14624
|
+
],
|
|
14587
14625
|
"name": "Bullseye Framework",
|
|
14588
14626
|
"version": "1.0.0",
|
|
14589
14627
|
"description": "Test 19 traction channels systematically. Start with the outer ring (what's possible), narrow to the middle ring (what's probable), then focus on the inner ring (what's working). Run cheap tests across all channels to find your bullseye.",
|
|
@@ -14670,6 +14708,9 @@ var UPG_FRAMEWORKS = [
|
|
|
14670
14708
|
},
|
|
14671
14709
|
{
|
|
14672
14710
|
"id": "product-led-growth-framework",
|
|
14711
|
+
"approach_ids": [
|
|
14712
|
+
"plan"
|
|
14713
|
+
],
|
|
14673
14714
|
"name": "PLG Framework",
|
|
14674
14715
|
"version": "1.0.0",
|
|
14675
14716
|
"description": "Product-led go-to-market motion. Free entry gives users access, the aha moment hooks them, they expand usage within their team, and monetisation captures value from power users.",
|
|
@@ -14852,6 +14893,9 @@ var UPG_FRAMEWORKS = [
|
|
|
14852
14893
|
},
|
|
14853
14894
|
{
|
|
14854
14895
|
"id": "raci-matrix",
|
|
14896
|
+
"approach_ids": [
|
|
14897
|
+
"inspect"
|
|
14898
|
+
],
|
|
14855
14899
|
"name": "RACI Matrix",
|
|
14856
14900
|
"version": "1.0.0",
|
|
14857
14901
|
"description": "Assign roles: Responsible, Accountable, Consulted, Informed for each activity.",
|
|
@@ -14903,16 +14947,7 @@ var UPG_FRAMEWORKS = [
|
|
|
14903
14947
|
"role": "item"
|
|
14904
14948
|
}
|
|
14905
14949
|
],
|
|
14906
|
-
"required_properties": {}
|
|
14907
|
-
"computed_properties": [
|
|
14908
|
-
{
|
|
14909
|
-
"property": "coverage_score",
|
|
14910
|
-
"expression": "assigned_count / total_activities",
|
|
14911
|
-
"entity_type": "team",
|
|
14912
|
-
"label": "RACI Coverage",
|
|
14913
|
-
"format": "percentage"
|
|
14914
|
-
}
|
|
14915
|
-
]
|
|
14950
|
+
"required_properties": {}
|
|
14916
14951
|
},
|
|
14917
14952
|
"structure": {
|
|
14918
14953
|
"pattern": "matrix"
|
|
@@ -15050,328 +15085,1253 @@ var UPG_FRAMEWORKS = [
|
|
|
15050
15085
|
"category": "data_analytics",
|
|
15051
15086
|
"origin": {
|
|
15052
15087
|
"type": "practitioner",
|
|
15053
|
-
"attribution": "Amplitude/Reforge",
|
|
15054
|
-
"description": "Popularised by Amplitude and Reforge around 2018 as growth teams needed to decompose north star metrics into actionable component metrics and identify the highest-leverage improvement opportunities.",
|
|
15055
|
-
"url": "https://amplitude.com/blog/north-star-metric",
|
|
15056
|
-
"year": 2018,
|
|
15057
|
-
"license": "open_attribution"
|
|
15088
|
+
"attribution": "Amplitude/Reforge",
|
|
15089
|
+
"description": "Popularised by Amplitude and Reforge around 2018 as growth teams needed to decompose north star metrics into actionable component metrics and identify the highest-leverage improvement opportunities.",
|
|
15090
|
+
"url": "https://amplitude.com/blog/north-star-metric",
|
|
15091
|
+
"year": 2018,
|
|
15092
|
+
"license": "open_attribution"
|
|
15093
|
+
},
|
|
15094
|
+
"tags": [
|
|
15095
|
+
"data_analytics",
|
|
15096
|
+
"tree"
|
|
15097
|
+
],
|
|
15098
|
+
"slots": [
|
|
15099
|
+
{
|
|
15100
|
+
"label": "Metric",
|
|
15101
|
+
"entityTypeId": "metric",
|
|
15102
|
+
"description": "A measurable indicator at any level of the tree: north star at the root, driver and input metrics as children"
|
|
15103
|
+
},
|
|
15104
|
+
{
|
|
15105
|
+
"label": "Outcome",
|
|
15106
|
+
"entityTypeId": "outcome",
|
|
15107
|
+
"description": "The business or product outcome the north-star metric is designed to represent"
|
|
15108
|
+
},
|
|
15109
|
+
{
|
|
15110
|
+
"label": "Dashboard",
|
|
15111
|
+
"entityTypeId": "dashboard",
|
|
15112
|
+
"description": "Dashboard visualising the metrics tree and showing real-time progress across levels"
|
|
15113
|
+
},
|
|
15114
|
+
{
|
|
15115
|
+
"label": "Report",
|
|
15116
|
+
"entityTypeId": "report",
|
|
15117
|
+
"description": "Periodic report analysing movement across the tree and attributing changes to specific inputs"
|
|
15118
|
+
}
|
|
15119
|
+
],
|
|
15120
|
+
"data": {
|
|
15121
|
+
"entity_types": [
|
|
15122
|
+
{
|
|
15123
|
+
"type": "metric",
|
|
15124
|
+
"role": "item"
|
|
15125
|
+
},
|
|
15126
|
+
{
|
|
15127
|
+
"type": "outcome",
|
|
15128
|
+
"role": "root"
|
|
15129
|
+
},
|
|
15130
|
+
{
|
|
15131
|
+
"type": "dashboard",
|
|
15132
|
+
"role": "item"
|
|
15133
|
+
},
|
|
15134
|
+
{
|
|
15135
|
+
"type": "report",
|
|
15136
|
+
"role": "item"
|
|
15137
|
+
}
|
|
15138
|
+
],
|
|
15139
|
+
"required_properties": {}
|
|
15140
|
+
},
|
|
15141
|
+
"structure": {
|
|
15142
|
+
"pattern": "tree"
|
|
15143
|
+
},
|
|
15144
|
+
"presentation": {
|
|
15145
|
+
"layout": {
|
|
15146
|
+
"type": "tree",
|
|
15147
|
+
"direction": "TB",
|
|
15148
|
+
"engine": "dagre"
|
|
15149
|
+
},
|
|
15150
|
+
"colour_by": "type",
|
|
15151
|
+
"collapsible": true,
|
|
15152
|
+
"card_fields": [
|
|
15153
|
+
"title",
|
|
15154
|
+
"description",
|
|
15155
|
+
"status"
|
|
15156
|
+
]
|
|
15157
|
+
},
|
|
15158
|
+
"education": {
|
|
15159
|
+
"purpose": "Decompose a top-level business metric into its component parts and drivers, creating a tree that shows exactly which levers move the number.",
|
|
15160
|
+
"core_question": "What are the component metrics that drive our north star, and which lever has the most headroom for improvement?",
|
|
15161
|
+
"when_to_use": [
|
|
15162
|
+
"You need to structure your data architecture or analytics practice",
|
|
15163
|
+
"Data quality, governance, or accessibility is a problem",
|
|
15164
|
+
"You want to move from ad-hoc analysis to systematic data practices"
|
|
15165
|
+
],
|
|
15166
|
+
"when_not_to_use": [
|
|
15167
|
+
"The product generates minimal data that does not warrant formal practices",
|
|
15168
|
+
"You are in very early stage where data infrastructure is premature"
|
|
15169
|
+
]
|
|
15170
|
+
}
|
|
15171
|
+
},
|
|
15172
|
+
{
|
|
15173
|
+
"id": "team-health-check",
|
|
15174
|
+
"approach_ids": [
|
|
15175
|
+
"inspect"
|
|
15176
|
+
],
|
|
15177
|
+
"name": "Team Health Check",
|
|
15178
|
+
"version": "1.0.0",
|
|
15179
|
+
"description": "A facilitated team self-assessment across dimensions like mission, fun, learning, speed, and support, using traffic-light voting to surface strengths and improvement areas in a safe format.",
|
|
15180
|
+
"category": "team_process",
|
|
15181
|
+
"origin": {
|
|
15182
|
+
"type": "practitioner",
|
|
15183
|
+
"attribution": "Spotify / Kniberg",
|
|
15184
|
+
"description": "Popularised by Spotify and Henrik Kniberg's Squad Health Check model (2014). Teams self-assess health across dimensions like mission clarity, psychological safety, speed, and learning.",
|
|
15185
|
+
"url": "https://engineering.atspotify.com/2014/09/squad-health-check-model/",
|
|
15186
|
+
"year": 2014,
|
|
15187
|
+
"license": "open_attribution"
|
|
15188
|
+
},
|
|
15189
|
+
"tags": [
|
|
15190
|
+
"team_process",
|
|
15191
|
+
"table"
|
|
15192
|
+
],
|
|
15193
|
+
"slots": [
|
|
15194
|
+
{
|
|
15195
|
+
"label": "Team",
|
|
15196
|
+
"entityTypeId": "team",
|
|
15197
|
+
"description": "Team conducting the health check; all members vote anonymously on each dimension"
|
|
15198
|
+
},
|
|
15199
|
+
{
|
|
15200
|
+
"label": "Retrospective",
|
|
15201
|
+
"entityTypeId": "retrospective",
|
|
15202
|
+
"description": "Health check session results feeding into the retrospective discussion and action items"
|
|
15203
|
+
},
|
|
15204
|
+
{
|
|
15205
|
+
"label": "Metric",
|
|
15206
|
+
"entityTypeId": "metric",
|
|
15207
|
+
"description": "Health dimension scored, e.g. delivering value, teamwork, fun, learning, mission clarity, speed"
|
|
15208
|
+
},
|
|
15209
|
+
{
|
|
15210
|
+
"label": "Team OKR",
|
|
15211
|
+
"entityTypeId": "team_okr",
|
|
15212
|
+
"description": "Team OKR or improvement goal derived from consistently red health check dimensions"
|
|
15213
|
+
}
|
|
15214
|
+
],
|
|
15215
|
+
"data": {
|
|
15216
|
+
"entity_types": [
|
|
15217
|
+
{
|
|
15218
|
+
"type": "team",
|
|
15219
|
+
"role": "scored_item"
|
|
15220
|
+
},
|
|
15221
|
+
{
|
|
15222
|
+
"type": "retrospective",
|
|
15223
|
+
"role": "item"
|
|
15224
|
+
},
|
|
15225
|
+
{
|
|
15226
|
+
"type": "metric",
|
|
15227
|
+
"role": "item"
|
|
15228
|
+
},
|
|
15229
|
+
{
|
|
15230
|
+
"type": "team_okr",
|
|
15231
|
+
"role": "item"
|
|
15232
|
+
}
|
|
15233
|
+
],
|
|
15234
|
+
"required_properties": {}
|
|
15235
|
+
},
|
|
15236
|
+
"structure": {
|
|
15237
|
+
"pattern": "table"
|
|
15238
|
+
},
|
|
15239
|
+
"presentation": {
|
|
15240
|
+
"layout": {
|
|
15241
|
+
"type": "table",
|
|
15242
|
+
"columns": [
|
|
15243
|
+
{
|
|
15244
|
+
"property": "title",
|
|
15245
|
+
"label": "Team",
|
|
15246
|
+
"sortable": true
|
|
15247
|
+
},
|
|
15248
|
+
{
|
|
15249
|
+
"property": "title",
|
|
15250
|
+
"label": "Retrospective",
|
|
15251
|
+
"sortable": true
|
|
15252
|
+
},
|
|
15253
|
+
{
|
|
15254
|
+
"property": "description",
|
|
15255
|
+
"label": "Metric"
|
|
15256
|
+
},
|
|
15257
|
+
{
|
|
15258
|
+
"property": "title",
|
|
15259
|
+
"label": "Team OKR",
|
|
15260
|
+
"sortable": true
|
|
15261
|
+
}
|
|
15262
|
+
]
|
|
15263
|
+
},
|
|
15264
|
+
"sort_by": {
|
|
15265
|
+
"property": "title",
|
|
15266
|
+
"direction": "asc"
|
|
15267
|
+
},
|
|
15268
|
+
"colour_by": "type",
|
|
15269
|
+
"card_fields": [
|
|
15270
|
+
"title",
|
|
15271
|
+
"description",
|
|
15272
|
+
"status"
|
|
15273
|
+
]
|
|
15274
|
+
},
|
|
15275
|
+
"education": {
|
|
15276
|
+
"purpose": "Regularly assess team health across dimensions (psychological safety, autonomy, mission clarity, fun, speed, learning) to catch problems early and celebrate strengths.",
|
|
15277
|
+
"core_question": "How is the team really doing: where do they feel strong, where do they feel stuck, and what has changed since last check?",
|
|
15278
|
+
"when_to_use": [
|
|
15279
|
+
"You need to improve team collaboration, clarity, or effectiveness",
|
|
15280
|
+
"Roles and responsibilities are unclear or causing friction",
|
|
15281
|
+
"You want to establish or improve team processes and ceremonies"
|
|
15282
|
+
],
|
|
15283
|
+
"when_not_to_use": [
|
|
15284
|
+
"The team is small and informal coordination works well",
|
|
15285
|
+
"Process overhead would slow down a team that needs speed"
|
|
15286
|
+
]
|
|
15287
|
+
}
|
|
15288
|
+
},
|
|
15289
|
+
{
|
|
15290
|
+
"id": "raid-log",
|
|
15291
|
+
"approach_ids": [
|
|
15292
|
+
"inspect"
|
|
15293
|
+
],
|
|
15294
|
+
"name": "RAID Log",
|
|
15295
|
+
"version": "1.0.0",
|
|
15296
|
+
"description": "A project management register tracking Risks, Assumptions, Issues, and Dependencies, the four categories most likely to derail a project if left unmanaged.",
|
|
15297
|
+
"category": "program_mgmt",
|
|
15298
|
+
"origin": {
|
|
15299
|
+
"type": "practitioner",
|
|
15300
|
+
"description": "Standard project management tool used across methodologies. The RAID log (Risks, Assumptions, Issues, Dependencies) provides a single living document for tracking all factors that could derail a programme.",
|
|
15301
|
+
"license": "cc_by"
|
|
15302
|
+
},
|
|
15303
|
+
"tags": [
|
|
15304
|
+
"program_mgmt",
|
|
15305
|
+
"table"
|
|
15306
|
+
],
|
|
15307
|
+
"slots": [
|
|
15308
|
+
{
|
|
15309
|
+
"label": "Risk Register",
|
|
15310
|
+
"entityTypeId": "risk_register",
|
|
15311
|
+
"description": "Risk or assumption logged with likelihood, impact, owner, and mitigation strategy"
|
|
15312
|
+
},
|
|
15313
|
+
{
|
|
15314
|
+
"label": "Risk",
|
|
15315
|
+
"entityTypeId": "risk",
|
|
15316
|
+
"description": "Individual risk scored by probability and impact; severity = probability * impact"
|
|
15317
|
+
},
|
|
15318
|
+
{
|
|
15319
|
+
"label": "Dependency",
|
|
15320
|
+
"entityTypeId": "dependency",
|
|
15321
|
+
"description": "Dependency on another team, system, or deliverable that could block progress if not resolved"
|
|
15322
|
+
},
|
|
15323
|
+
{
|
|
15324
|
+
"label": "Status Report",
|
|
15325
|
+
"entityTypeId": "status_report",
|
|
15326
|
+
"description": "Status update summarising RAID log changes: new risks, resolved issues, and dependency updates"
|
|
15327
|
+
},
|
|
15328
|
+
{
|
|
15329
|
+
"label": "Deliverable",
|
|
15330
|
+
"entityTypeId": "deliverable",
|
|
15331
|
+
"description": "Deliverable affected by logged risks, issues, or dependencies, linking RAID items to project scope"
|
|
15332
|
+
}
|
|
15333
|
+
],
|
|
15334
|
+
"data": {
|
|
15335
|
+
"entity_types": [
|
|
15336
|
+
{
|
|
15337
|
+
"type": "risk_register",
|
|
15338
|
+
"role": "item"
|
|
15339
|
+
},
|
|
15340
|
+
{
|
|
15341
|
+
"type": "risk",
|
|
15342
|
+
"role": "scored_item"
|
|
15343
|
+
},
|
|
15344
|
+
{
|
|
15345
|
+
"type": "dependency",
|
|
15346
|
+
"role": "item"
|
|
15347
|
+
},
|
|
15348
|
+
{
|
|
15349
|
+
"type": "status_report",
|
|
15350
|
+
"role": "item"
|
|
15351
|
+
},
|
|
15352
|
+
{
|
|
15353
|
+
"type": "deliverable",
|
|
15354
|
+
"role": "item"
|
|
15355
|
+
}
|
|
15356
|
+
],
|
|
15357
|
+
"required_properties": {
|
|
15358
|
+
"risk": [
|
|
15359
|
+
{
|
|
15360
|
+
"property": "probability",
|
|
15361
|
+
"type": "number",
|
|
15362
|
+
"required": true,
|
|
15363
|
+
"label": "Probability",
|
|
15364
|
+
"description": "Likelihood the risk materialises (risk.probability assessment)"
|
|
15365
|
+
},
|
|
15366
|
+
{
|
|
15367
|
+
"property": "impact",
|
|
15368
|
+
"type": "number",
|
|
15369
|
+
"required": true,
|
|
15370
|
+
"label": "Impact",
|
|
15371
|
+
"description": "Consequence severity if the risk materialises (risk.impact assessment)"
|
|
15372
|
+
}
|
|
15373
|
+
]
|
|
15374
|
+
},
|
|
15375
|
+
"computed_properties": [
|
|
15376
|
+
{
|
|
15377
|
+
"property": "severity",
|
|
15378
|
+
"expression": "probability * impact",
|
|
15379
|
+
"entity_type": "risk",
|
|
15380
|
+
"label": "Severity",
|
|
15381
|
+
"format": "number"
|
|
15382
|
+
}
|
|
15383
|
+
]
|
|
15384
|
+
},
|
|
15385
|
+
"structure": {
|
|
15386
|
+
"pattern": "table"
|
|
15387
|
+
},
|
|
15388
|
+
"presentation": {
|
|
15389
|
+
"layout": {
|
|
15390
|
+
"type": "table",
|
|
15391
|
+
"columns": [
|
|
15392
|
+
{
|
|
15393
|
+
"property": "title",
|
|
15394
|
+
"label": "Item",
|
|
15395
|
+
"sortable": true
|
|
15396
|
+
},
|
|
15397
|
+
{
|
|
15398
|
+
"property": "description",
|
|
15399
|
+
"label": "Category"
|
|
15400
|
+
},
|
|
15401
|
+
{
|
|
15402
|
+
"property": "status",
|
|
15403
|
+
"label": "Status"
|
|
15404
|
+
},
|
|
15405
|
+
{
|
|
15406
|
+
"property": "description",
|
|
15407
|
+
"label": "Owner / Action"
|
|
15408
|
+
}
|
|
15409
|
+
]
|
|
15410
|
+
},
|
|
15411
|
+
"sort_by": {
|
|
15412
|
+
"property": "title",
|
|
15413
|
+
"direction": "asc"
|
|
15414
|
+
},
|
|
15415
|
+
"colour_by": "type",
|
|
15416
|
+
"card_fields": [
|
|
15417
|
+
"title",
|
|
15418
|
+
"description",
|
|
15419
|
+
"status"
|
|
15420
|
+
]
|
|
15421
|
+
},
|
|
15422
|
+
"education": {
|
|
15423
|
+
"purpose": "Track Risks, Assumptions, Issues, and Dependencies in a single living document so the project manager sees all potential blockers in one place.",
|
|
15424
|
+
"core_question": "What are the current risks, untested assumptions, open issues, and external dependencies that could derail this programme?",
|
|
15425
|
+
"when_to_use": [
|
|
15426
|
+
"You are managing complex, multi-team initiatives with dependencies",
|
|
15427
|
+
"You need to track risks, decisions, and milestones across workstreams",
|
|
15428
|
+
"Stakeholders need visibility into programme-level progress"
|
|
15429
|
+
],
|
|
15430
|
+
"when_not_to_use": [
|
|
15431
|
+
"The project is small enough for a single team to manage",
|
|
15432
|
+
"Formal programme management would create overhead without value"
|
|
15433
|
+
]
|
|
15434
|
+
}
|
|
15435
|
+
},
|
|
15436
|
+
{
|
|
15437
|
+
"id": "ice-scoring",
|
|
15438
|
+
"approach_ids": [
|
|
15439
|
+
"prioritise"
|
|
15440
|
+
],
|
|
15441
|
+
"name": "ICE Scoring",
|
|
15442
|
+
"version": "1.0.0",
|
|
15443
|
+
"description": "Rate ideas by Impact, Confidence, and Ease on a 1-10 scale. Multiply for a composite score. Fast and lightweight.",
|
|
15444
|
+
"category": "prioritization",
|
|
15445
|
+
"origin": {
|
|
15446
|
+
"type": "practitioner",
|
|
15447
|
+
"attribution": "Sean Ellis",
|
|
15448
|
+
"description": "Created by Sean Ellis as a lightweight growth experiment scoring method. Widely adopted in growth teams.",
|
|
15449
|
+
"year": 2010,
|
|
15450
|
+
"license": "open_attribution"
|
|
15451
|
+
},
|
|
15452
|
+
"tags": [
|
|
15453
|
+
"prioritization",
|
|
15454
|
+
"table"
|
|
15455
|
+
],
|
|
15456
|
+
"slots": [
|
|
15457
|
+
{
|
|
15458
|
+
"label": "Items to score",
|
|
15459
|
+
"entityTypeId": "feature",
|
|
15460
|
+
"description": "Features or experiments being evaluated"
|
|
15461
|
+
},
|
|
15462
|
+
{
|
|
15463
|
+
"label": "Impact",
|
|
15464
|
+
"entityTypeId": "outcome",
|
|
15465
|
+
"description": "How much will this move the needle?"
|
|
15466
|
+
},
|
|
15467
|
+
{
|
|
15468
|
+
"label": "Confidence",
|
|
15469
|
+
"entityTypeId": "assumption",
|
|
15470
|
+
"description": "How sure are we about the impact?"
|
|
15471
|
+
},
|
|
15472
|
+
{
|
|
15473
|
+
"label": "Ease",
|
|
15474
|
+
"entityTypeId": "feature",
|
|
15475
|
+
"description": "How easy is this to implement?"
|
|
15476
|
+
}
|
|
15477
|
+
],
|
|
15478
|
+
"data": {
|
|
15479
|
+
"entity_types": [
|
|
15480
|
+
{
|
|
15481
|
+
"type": "feature",
|
|
15482
|
+
"role": "scored_item"
|
|
15483
|
+
},
|
|
15484
|
+
{
|
|
15485
|
+
"type": "outcome",
|
|
15486
|
+
"role": "item"
|
|
15487
|
+
},
|
|
15488
|
+
{
|
|
15489
|
+
"type": "assumption",
|
|
15490
|
+
"role": "item"
|
|
15491
|
+
}
|
|
15492
|
+
],
|
|
15493
|
+
"required_properties": {
|
|
15494
|
+
"feature": [
|
|
15495
|
+
{
|
|
15496
|
+
"property": "impact",
|
|
15497
|
+
"type": "number",
|
|
15498
|
+
"required": true,
|
|
15499
|
+
"scope": "framework",
|
|
15500
|
+
"label": "Impact",
|
|
15501
|
+
"description": "Expected impact on the target metric (1-10)"
|
|
15502
|
+
},
|
|
15503
|
+
{
|
|
15504
|
+
"property": "confidence",
|
|
15505
|
+
"type": "number",
|
|
15506
|
+
"required": true,
|
|
15507
|
+
"scope": "framework",
|
|
15508
|
+
"label": "Confidence",
|
|
15509
|
+
"description": "Confidence in the impact estimate (1-10)"
|
|
15510
|
+
},
|
|
15511
|
+
{
|
|
15512
|
+
"property": "ease",
|
|
15513
|
+
"type": "number",
|
|
15514
|
+
"required": true,
|
|
15515
|
+
"scope": "framework",
|
|
15516
|
+
"label": "Ease",
|
|
15517
|
+
"description": "Ease of implementation (1-10)"
|
|
15518
|
+
}
|
|
15519
|
+
]
|
|
15520
|
+
},
|
|
15521
|
+
"computed_properties": [
|
|
15522
|
+
{
|
|
15523
|
+
"property": "ice_score",
|
|
15524
|
+
"expression": "impact * confidence * ease",
|
|
15525
|
+
"entity_type": "feature",
|
|
15526
|
+
"label": "ICE Score",
|
|
15527
|
+
"format": "number"
|
|
15528
|
+
}
|
|
15529
|
+
]
|
|
15530
|
+
},
|
|
15531
|
+
"structure": {
|
|
15532
|
+
"pattern": "table"
|
|
15533
|
+
},
|
|
15534
|
+
"presentation": {
|
|
15535
|
+
"layout": {
|
|
15536
|
+
"type": "table",
|
|
15537
|
+
"columns": [
|
|
15538
|
+
{
|
|
15539
|
+
"property": "title",
|
|
15540
|
+
"label": "Items to score",
|
|
15541
|
+
"sortable": true
|
|
15542
|
+
},
|
|
15543
|
+
{
|
|
15544
|
+
"property": "impact",
|
|
15545
|
+
"label": "Impact",
|
|
15546
|
+
"sortable": true
|
|
15547
|
+
},
|
|
15548
|
+
{
|
|
15549
|
+
"property": "confidence",
|
|
15550
|
+
"label": "Confidence",
|
|
15551
|
+
"sortable": true
|
|
15552
|
+
},
|
|
15553
|
+
{
|
|
15554
|
+
"property": "ease",
|
|
15555
|
+
"label": "Ease",
|
|
15556
|
+
"sortable": true
|
|
15557
|
+
}
|
|
15558
|
+
]
|
|
15559
|
+
},
|
|
15560
|
+
"sort_by": {
|
|
15561
|
+
"property": "title",
|
|
15562
|
+
"direction": "asc"
|
|
15563
|
+
},
|
|
15564
|
+
"colour_by": "type",
|
|
15565
|
+
"card_fields": [
|
|
15566
|
+
"title",
|
|
15567
|
+
"description",
|
|
15568
|
+
"status"
|
|
15569
|
+
]
|
|
15570
|
+
},
|
|
15571
|
+
"education": {
|
|
15572
|
+
"purpose": "Provide a lightweight scoring model for early-stage ideas when detailed effort estimates are unavailable. Faster than RICE and useful for brainstorm triage.",
|
|
15573
|
+
"core_question": "Which ideas should we investigate further based on their potential impact, confidence in our assumptions, and implementation ease?",
|
|
15574
|
+
"when_to_use": [
|
|
15575
|
+
"You have more ideas or features than capacity to build them",
|
|
15576
|
+
"Stakeholders disagree on what to build next",
|
|
15577
|
+
"You need a transparent, defensible prioritisation process"
|
|
15578
|
+
],
|
|
15579
|
+
"when_not_to_use": [
|
|
15580
|
+
"You have a single obvious next step with no contention",
|
|
15581
|
+
"The backlog is small enough to sequence intuitively"
|
|
15582
|
+
]
|
|
15583
|
+
}
|
|
15584
|
+
},
|
|
15585
|
+
{
|
|
15586
|
+
"id": "wsjf",
|
|
15587
|
+
"approach_ids": [
|
|
15588
|
+
"prioritise"
|
|
15589
|
+
],
|
|
15590
|
+
"name": "WSJF (Weighted Shortest Job First)",
|
|
15591
|
+
"version": "1.0.0",
|
|
15592
|
+
"description": "Prioritise work by dividing Cost of Delay (user value + time criticality + risk reduction) by job duration to maximise economic throughput.",
|
|
15593
|
+
"category": "planning",
|
|
15594
|
+
"origin": {
|
|
15595
|
+
"type": "practitioner",
|
|
15596
|
+
"attribution": "Reinertsen / SAFe",
|
|
15597
|
+
"description": "Developed by Don Reinertsen and adopted as a core practice in the Scaled Agile Framework (SAFe). Combines urgency (Cost of Delay) with job size to produce an economic prioritisation sequence.",
|
|
15598
|
+
"url": "https://www.scaledagileframework.com/wsjf/",
|
|
15599
|
+
"year": 2011,
|
|
15600
|
+
"license": "open_attribution"
|
|
15601
|
+
},
|
|
15602
|
+
"tags": [
|
|
15603
|
+
"planning",
|
|
15604
|
+
"table"
|
|
15605
|
+
],
|
|
15606
|
+
"slots": [
|
|
15607
|
+
{
|
|
15608
|
+
"label": "Backlog Items",
|
|
15609
|
+
"entityTypeId": "feature",
|
|
15610
|
+
"description": "Backlog Items: feature entries to evaluate"
|
|
15611
|
+
},
|
|
15612
|
+
{
|
|
15613
|
+
"label": "User/Business Value",
|
|
15614
|
+
"entityTypeId": "metric",
|
|
15615
|
+
"description": "User/Business Value: metric entries to evaluate"
|
|
15616
|
+
},
|
|
15617
|
+
{
|
|
15618
|
+
"label": "Time Criticality",
|
|
15619
|
+
"entityTypeId": "metric",
|
|
15620
|
+
"description": "How much value decays if delivery is delayed (deadlines, competition, seasonal windows)"
|
|
15621
|
+
},
|
|
15622
|
+
{
|
|
15623
|
+
"label": "Risk Reduction / Opportunity Enablement",
|
|
15624
|
+
"entityTypeId": "metric",
|
|
15625
|
+
"description": "Risk Reduction / Opportunity Enablement: metric entries to evaluate"
|
|
15626
|
+
},
|
|
15627
|
+
{
|
|
15628
|
+
"label": "Job Size",
|
|
15629
|
+
"entityTypeId": "metric",
|
|
15630
|
+
"description": "Estimated effort (story points, t-shirt size, or person-weeks)"
|
|
15631
|
+
}
|
|
15632
|
+
],
|
|
15633
|
+
"data": {
|
|
15634
|
+
"entity_types": [
|
|
15635
|
+
{
|
|
15636
|
+
"type": "feature",
|
|
15637
|
+
"role": "scored_item"
|
|
15638
|
+
},
|
|
15639
|
+
{
|
|
15640
|
+
"type": "metric",
|
|
15641
|
+
"role": "item"
|
|
15642
|
+
}
|
|
15643
|
+
],
|
|
15644
|
+
"required_properties": {
|
|
15645
|
+
"feature": [
|
|
15646
|
+
{
|
|
15647
|
+
"property": "user_value",
|
|
15648
|
+
"type": "number",
|
|
15649
|
+
"required": true,
|
|
15650
|
+
"scope": "framework",
|
|
15651
|
+
"label": "User/Business Value",
|
|
15652
|
+
"description": "Relative value to users and the business if delivered"
|
|
15653
|
+
},
|
|
15654
|
+
{
|
|
15655
|
+
"property": "time_criticality",
|
|
15656
|
+
"type": "number",
|
|
15657
|
+
"required": true,
|
|
15658
|
+
"scope": "framework",
|
|
15659
|
+
"label": "Time Criticality",
|
|
15660
|
+
"description": "How much value decays if delivery is delayed (deadlines, competition, seasonal windows)"
|
|
15661
|
+
},
|
|
15662
|
+
{
|
|
15663
|
+
"property": "risk_reduction",
|
|
15664
|
+
"type": "number",
|
|
15665
|
+
"required": true,
|
|
15666
|
+
"scope": "framework",
|
|
15667
|
+
"label": "Risk Reduction / Opportunity Enablement",
|
|
15668
|
+
"description": "Value from reducing risk or enabling future opportunities"
|
|
15669
|
+
},
|
|
15670
|
+
{
|
|
15671
|
+
"property": "job_size",
|
|
15672
|
+
"type": "number",
|
|
15673
|
+
"required": true,
|
|
15674
|
+
"scope": "framework",
|
|
15675
|
+
"label": "Job Size",
|
|
15676
|
+
"description": "Estimated effort (story points, t-shirt size, or person-weeks)"
|
|
15677
|
+
}
|
|
15678
|
+
]
|
|
15679
|
+
},
|
|
15680
|
+
"computed_properties": [
|
|
15681
|
+
{
|
|
15682
|
+
"property": "wsjf_score",
|
|
15683
|
+
"expression": "(user_value + time_criticality + risk_reduction) / job_size",
|
|
15684
|
+
"entity_type": "feature",
|
|
15685
|
+
"label": "WSJF Score",
|
|
15686
|
+
"format": "number"
|
|
15687
|
+
}
|
|
15688
|
+
]
|
|
15689
|
+
},
|
|
15690
|
+
"structure": {
|
|
15691
|
+
"pattern": "table"
|
|
15692
|
+
},
|
|
15693
|
+
"presentation": {
|
|
15694
|
+
"layout": {
|
|
15695
|
+
"type": "table",
|
|
15696
|
+
"columns": [
|
|
15697
|
+
{
|
|
15698
|
+
"property": "title",
|
|
15699
|
+
"label": "Backlog Items",
|
|
15700
|
+
"sortable": true
|
|
15701
|
+
},
|
|
15702
|
+
{
|
|
15703
|
+
"property": "user_value",
|
|
15704
|
+
"label": "User/Business Value",
|
|
15705
|
+
"sortable": true
|
|
15706
|
+
},
|
|
15707
|
+
{
|
|
15708
|
+
"property": "time_criticality",
|
|
15709
|
+
"label": "Time Criticality",
|
|
15710
|
+
"sortable": true
|
|
15711
|
+
},
|
|
15712
|
+
{
|
|
15713
|
+
"property": "risk_reduction",
|
|
15714
|
+
"label": "Risk Reduction / Opportunity Enablement",
|
|
15715
|
+
"sortable": true
|
|
15716
|
+
},
|
|
15717
|
+
{
|
|
15718
|
+
"property": "job_size",
|
|
15719
|
+
"label": "Job Size",
|
|
15720
|
+
"sortable": true
|
|
15721
|
+
},
|
|
15722
|
+
{
|
|
15723
|
+
"property": "wsjf_score",
|
|
15724
|
+
"label": "WSJF Score",
|
|
15725
|
+
"sortable": true
|
|
15726
|
+
}
|
|
15727
|
+
]
|
|
15728
|
+
},
|
|
15729
|
+
"sort_by": {
|
|
15730
|
+
"property": "title",
|
|
15731
|
+
"direction": "asc"
|
|
15732
|
+
},
|
|
15733
|
+
"colour_by": "type",
|
|
15734
|
+
"card_fields": [
|
|
15735
|
+
"title",
|
|
15736
|
+
"description",
|
|
15737
|
+
"status"
|
|
15738
|
+
]
|
|
15739
|
+
},
|
|
15740
|
+
"education": {
|
|
15741
|
+
"purpose": "Prioritise work by dividing the Cost of Delay by job duration, ensuring the most time-sensitive, valuable items are done first.",
|
|
15742
|
+
"core_question": "Considering the cost of waiting, which items should we start now to maximise economic benefit?",
|
|
15743
|
+
"when_to_use": [
|
|
15744
|
+
"You need to coordinate work across multiple teams or time horizons",
|
|
15745
|
+
"Stakeholders need visibility into what is coming and when",
|
|
15746
|
+
"You want to balance commitments with flexibility"
|
|
15747
|
+
],
|
|
15748
|
+
"when_not_to_use": [
|
|
15749
|
+
"The team is small enough that informal coordination works",
|
|
15750
|
+
"Plans would create false precision about uncertain outcomes"
|
|
15751
|
+
]
|
|
15752
|
+
}
|
|
15753
|
+
},
|
|
15754
|
+
{
|
|
15755
|
+
"id": "cost-of-delay",
|
|
15756
|
+
"approach_ids": [
|
|
15757
|
+
"prioritise"
|
|
15758
|
+
],
|
|
15759
|
+
"name": "Cost of Delay",
|
|
15760
|
+
"version": "1.0.0",
|
|
15761
|
+
"description": "Quantify the economic cost of not shipping a feature to drive priority decisions. Combines urgency with value.",
|
|
15762
|
+
"category": "prioritization",
|
|
15763
|
+
"origin": {
|
|
15764
|
+
"type": "practitioner",
|
|
15765
|
+
"attribution": "Don Reinertsen",
|
|
15766
|
+
"description": "Formalised in The Principles of Product Development Flow (Celeritas Publishing). Foundational to lean product economics.",
|
|
15767
|
+
"year": 2009,
|
|
15768
|
+
"license": "public_domain"
|
|
15769
|
+
},
|
|
15770
|
+
"tags": [
|
|
15771
|
+
"prioritization",
|
|
15772
|
+
"table"
|
|
15773
|
+
],
|
|
15774
|
+
"slots": [
|
|
15775
|
+
{
|
|
15776
|
+
"label": "Items to evaluate",
|
|
15777
|
+
"entityTypeId": "feature",
|
|
15778
|
+
"description": "Features or initiatives being assessed"
|
|
15779
|
+
},
|
|
15780
|
+
{
|
|
15781
|
+
"label": "User-Business Value",
|
|
15782
|
+
"entityTypeId": "outcome",
|
|
15783
|
+
"description": "Revenue, retention, or strategic value"
|
|
15784
|
+
},
|
|
15785
|
+
{
|
|
15786
|
+
"label": "Time Criticality",
|
|
15787
|
+
"entityTypeId": "metric",
|
|
15788
|
+
"description": "How much value decays with delay"
|
|
15789
|
+
},
|
|
15790
|
+
{
|
|
15791
|
+
"label": "Risk Reduction",
|
|
15792
|
+
"entityTypeId": "risk",
|
|
15793
|
+
"description": "What risk does this mitigate?"
|
|
15794
|
+
}
|
|
15795
|
+
],
|
|
15796
|
+
"data": {
|
|
15797
|
+
"entity_types": [
|
|
15798
|
+
{
|
|
15799
|
+
"type": "feature",
|
|
15800
|
+
"role": "scored_item"
|
|
15801
|
+
},
|
|
15802
|
+
{
|
|
15803
|
+
"type": "metric",
|
|
15804
|
+
"role": "item"
|
|
15805
|
+
},
|
|
15806
|
+
{
|
|
15807
|
+
"type": "outcome",
|
|
15808
|
+
"role": "item"
|
|
15809
|
+
},
|
|
15810
|
+
{
|
|
15811
|
+
"type": "risk",
|
|
15812
|
+
"role": "item"
|
|
15813
|
+
}
|
|
15814
|
+
],
|
|
15815
|
+
"required_properties": {
|
|
15816
|
+
"feature": [
|
|
15817
|
+
{
|
|
15818
|
+
"property": "cost_of_delay",
|
|
15819
|
+
"type": "number",
|
|
15820
|
+
"required": true,
|
|
15821
|
+
"scope": "framework",
|
|
15822
|
+
"label": "Cost of Delay",
|
|
15823
|
+
"description": "Weekly revenue impact of not shipping"
|
|
15824
|
+
},
|
|
15825
|
+
{
|
|
15826
|
+
"property": "job_size",
|
|
15827
|
+
"type": "number",
|
|
15828
|
+
"required": true,
|
|
15829
|
+
"scope": "framework",
|
|
15830
|
+
"label": "Job Size",
|
|
15831
|
+
"description": "Weeks of development effort"
|
|
15832
|
+
}
|
|
15833
|
+
]
|
|
15834
|
+
},
|
|
15835
|
+
"computed_properties": [
|
|
15836
|
+
{
|
|
15837
|
+
"property": "wsjf_score",
|
|
15838
|
+
"expression": "cost_of_delay / job_size",
|
|
15839
|
+
"entity_type": "feature",
|
|
15840
|
+
"label": "WSJF Score",
|
|
15841
|
+
"format": "number"
|
|
15842
|
+
}
|
|
15843
|
+
]
|
|
15844
|
+
},
|
|
15845
|
+
"structure": {
|
|
15846
|
+
"pattern": "table"
|
|
15847
|
+
},
|
|
15848
|
+
"presentation": {
|
|
15849
|
+
"layout": {
|
|
15850
|
+
"type": "table",
|
|
15851
|
+
"columns": [
|
|
15852
|
+
{
|
|
15853
|
+
"property": "title",
|
|
15854
|
+
"label": "Items to evaluate",
|
|
15855
|
+
"sortable": true
|
|
15856
|
+
},
|
|
15857
|
+
{
|
|
15858
|
+
"property": "cost_of_delay",
|
|
15859
|
+
"label": "User-Business Value",
|
|
15860
|
+
"sortable": true
|
|
15861
|
+
},
|
|
15862
|
+
{
|
|
15863
|
+
"property": "job_size",
|
|
15864
|
+
"label": "Job Size",
|
|
15865
|
+
"sortable": true
|
|
15866
|
+
},
|
|
15867
|
+
{
|
|
15868
|
+
"property": "wsjf_score",
|
|
15869
|
+
"label": "CoD Score",
|
|
15870
|
+
"sortable": true
|
|
15871
|
+
}
|
|
15872
|
+
]
|
|
15873
|
+
},
|
|
15874
|
+
"sort_by": {
|
|
15875
|
+
"property": "title",
|
|
15876
|
+
"direction": "asc"
|
|
15877
|
+
},
|
|
15878
|
+
"colour_by": "type",
|
|
15879
|
+
"card_fields": [
|
|
15880
|
+
"title",
|
|
15881
|
+
"description",
|
|
15882
|
+
"status"
|
|
15883
|
+
]
|
|
15884
|
+
},
|
|
15885
|
+
"education": {
|
|
15886
|
+
"purpose": "Quantify the economic impact of not delivering a feature by a given date, making urgency visible and enabling time-sensitive prioritisation.",
|
|
15887
|
+
"core_question": "How much value are we losing every week this feature is not in production, and does that urgency justify fast-tracking it?",
|
|
15888
|
+
"when_to_use": [
|
|
15889
|
+
"You have more ideas or features than capacity to build them",
|
|
15890
|
+
"Stakeholders disagree on what to build next",
|
|
15891
|
+
"You need a transparent, defensible prioritisation process"
|
|
15892
|
+
],
|
|
15893
|
+
"when_not_to_use": [
|
|
15894
|
+
"You have a single obvious next step with no contention",
|
|
15895
|
+
"The backlog is small enough to sequence intuitively"
|
|
15896
|
+
]
|
|
15897
|
+
}
|
|
15898
|
+
},
|
|
15899
|
+
{
|
|
15900
|
+
"id": "five-whys",
|
|
15901
|
+
"approach_ids": [
|
|
15902
|
+
"reflect",
|
|
15903
|
+
"inspect"
|
|
15904
|
+
],
|
|
15905
|
+
"name": "Five Whys",
|
|
15906
|
+
"version": "1.0.0",
|
|
15907
|
+
"description": 'Iteratively ask "why?", typically five times, starting from a symptom; each answer becomes the subject of the next question. The chain of answers reveals the underlying root cause behind the surface problem.',
|
|
15908
|
+
"category": "team_process",
|
|
15909
|
+
"origin": {
|
|
15910
|
+
"type": "practitioner",
|
|
15911
|
+
"attribution": "Sakichi Toyoda / Toyota Production System",
|
|
15912
|
+
"description": "Developed within the Toyota Production System as a root-cause analysis technique. Popularised through Lean and Six Sigma practice; now a widely used incident-review and design-debug staple.",
|
|
15913
|
+
"year": 1930,
|
|
15914
|
+
"license": "public_domain"
|
|
15915
|
+
},
|
|
15916
|
+
"tags": [
|
|
15917
|
+
"team_process",
|
|
15918
|
+
"reflection",
|
|
15919
|
+
"root_cause",
|
|
15920
|
+
"tree"
|
|
15921
|
+
],
|
|
15922
|
+
"slots": [
|
|
15923
|
+
{
|
|
15924
|
+
"label": "Symptom",
|
|
15925
|
+
"entityTypeId": "need",
|
|
15926
|
+
"description": "The observed problem the analysis starts from."
|
|
15927
|
+
},
|
|
15928
|
+
{
|
|
15929
|
+
"label": "Why chain",
|
|
15930
|
+
"entityTypeId": "insight",
|
|
15931
|
+
"description": 'Each "why?" answer along the chain, typically five iterations deep.'
|
|
15932
|
+
},
|
|
15933
|
+
{
|
|
15934
|
+
"label": "Root cause",
|
|
15935
|
+
"entityTypeId": "insight",
|
|
15936
|
+
"description": "The terminal answer at the bottom of the chain: the underlying cause to address."
|
|
15937
|
+
}
|
|
15938
|
+
],
|
|
15939
|
+
"data": {
|
|
15940
|
+
"entity_types": [
|
|
15941
|
+
{
|
|
15942
|
+
"type": "need",
|
|
15943
|
+
"role": "root"
|
|
15944
|
+
},
|
|
15945
|
+
{
|
|
15946
|
+
"type": "insight",
|
|
15947
|
+
"role": "branch"
|
|
15948
|
+
}
|
|
15949
|
+
],
|
|
15950
|
+
"required_properties": {}
|
|
15951
|
+
},
|
|
15952
|
+
"structure": {
|
|
15953
|
+
"pattern": "tree"
|
|
15954
|
+
},
|
|
15955
|
+
"presentation": {
|
|
15956
|
+
"layout": {
|
|
15957
|
+
"type": "tree",
|
|
15958
|
+
"direction": "TB"
|
|
15959
|
+
},
|
|
15960
|
+
"sort_by": {
|
|
15961
|
+
"property": "title",
|
|
15962
|
+
"direction": "asc"
|
|
15963
|
+
},
|
|
15964
|
+
"card_fields": [
|
|
15965
|
+
"title",
|
|
15966
|
+
"description"
|
|
15967
|
+
]
|
|
15968
|
+
},
|
|
15969
|
+
"education": {
|
|
15970
|
+
"purpose": 'Move past surface symptoms by chaining "why?" questions until the underlying root cause surfaces, so fixes target the real driver rather than a downstream effect.',
|
|
15971
|
+
"core_question": "Why is this happening, and why is THAT happening, until we reach a cause we can act on?",
|
|
15972
|
+
"when_to_use": [
|
|
15973
|
+
"A problem keeps recurring after surface fixes",
|
|
15974
|
+
"Post-incident review where the obvious cause feels too obvious",
|
|
15975
|
+
"Designing a fix and you want to confirm you understand the actual driver"
|
|
15976
|
+
],
|
|
15977
|
+
"when_not_to_use": [
|
|
15978
|
+
"The problem has multiple independent root causes (use a fishbone or richer RCA tool)",
|
|
15979
|
+
"You need quantitative attribution rather than a single-thread narrative",
|
|
15980
|
+
'Five linear "whys" oversimplify a systems problem with feedback loops'
|
|
15981
|
+
]
|
|
15982
|
+
}
|
|
15983
|
+
},
|
|
15984
|
+
{
|
|
15985
|
+
"id": "pre-mortem",
|
|
15986
|
+
"approach_ids": [
|
|
15987
|
+
"reflect"
|
|
15988
|
+
],
|
|
15989
|
+
"name": "Pre-mortem",
|
|
15990
|
+
"version": "1.0.0",
|
|
15991
|
+
"description": "Imagine the project has already failed; work backward listing the plausible causes of the failure. Produce a risk register and matching mitigations before the work starts.",
|
|
15992
|
+
"category": "team_process",
|
|
15993
|
+
"origin": {
|
|
15994
|
+
"type": "practitioner",
|
|
15995
|
+
"attribution": "Gary Klein",
|
|
15996
|
+
"description": "Popularised by Gary Klein in Harvard Business Review (2007) as a prospective-hindsight technique. Inverts the post-mortem: imagine failure first, then list causes, while there is still time to act.",
|
|
15997
|
+
"url": "https://hbr.org/2007/09/performing-a-project-premortem",
|
|
15998
|
+
"year": 2007,
|
|
15999
|
+
"license": "published_methodology"
|
|
16000
|
+
},
|
|
16001
|
+
"tags": [
|
|
16002
|
+
"team_process",
|
|
16003
|
+
"reflection",
|
|
16004
|
+
"risk",
|
|
16005
|
+
"collection"
|
|
16006
|
+
],
|
|
16007
|
+
"slots": [
|
|
16008
|
+
{
|
|
16009
|
+
"label": "Imagined failures",
|
|
16010
|
+
"entityTypeId": "risk",
|
|
16011
|
+
"description": "Plausible failure modes named as if they had already occurred."
|
|
16012
|
+
},
|
|
16013
|
+
{
|
|
16014
|
+
"label": "Causes",
|
|
16015
|
+
"entityTypeId": "insight",
|
|
16016
|
+
"description": "For each imagined failure, the contributing causes the team can foresee."
|
|
16017
|
+
},
|
|
16018
|
+
{
|
|
16019
|
+
"label": "Mitigations",
|
|
16020
|
+
"entityTypeId": "initiative",
|
|
16021
|
+
"description": "Mitigation actions the team will take before failure can occur."
|
|
16022
|
+
}
|
|
16023
|
+
],
|
|
16024
|
+
"data": {
|
|
16025
|
+
"entity_types": [
|
|
16026
|
+
{
|
|
16027
|
+
"type": "risk",
|
|
16028
|
+
"role": "bucket"
|
|
16029
|
+
},
|
|
16030
|
+
{
|
|
16031
|
+
"type": "insight",
|
|
16032
|
+
"role": "bucket"
|
|
16033
|
+
},
|
|
16034
|
+
{
|
|
16035
|
+
"type": "initiative",
|
|
16036
|
+
"role": "bucket"
|
|
16037
|
+
}
|
|
16038
|
+
],
|
|
16039
|
+
"required_properties": {}
|
|
16040
|
+
},
|
|
16041
|
+
"structure": {
|
|
16042
|
+
"pattern": "collection"
|
|
16043
|
+
},
|
|
16044
|
+
"presentation": {
|
|
16045
|
+
"layout": {
|
|
16046
|
+
"type": "grid",
|
|
16047
|
+
"groupBy": "type"
|
|
16048
|
+
},
|
|
16049
|
+
"sort_by": {
|
|
16050
|
+
"property": "title",
|
|
16051
|
+
"direction": "asc"
|
|
16052
|
+
},
|
|
16053
|
+
"colour_by": "group",
|
|
16054
|
+
"card_fields": [
|
|
16055
|
+
"title",
|
|
16056
|
+
"description"
|
|
16057
|
+
]
|
|
16058
|
+
},
|
|
16059
|
+
"education": {
|
|
16060
|
+
"purpose": "Surface project risks early by inverting hindsight: imagine the project has already failed and ask why, while there is still time to mitigate.",
|
|
16061
|
+
"core_question": "It is six months from now and the project has failed catastrophically. What happened, and why?",
|
|
16062
|
+
"when_to_use": [
|
|
16063
|
+
"Kicking off a project with significant downside or irreversible commitment",
|
|
16064
|
+
"A plan looks too clean and the team senses unspoken concerns",
|
|
16065
|
+
"Stakeholders disagree on risk; the exercise externalises and ranks them"
|
|
16066
|
+
],
|
|
16067
|
+
"when_not_to_use": [
|
|
16068
|
+
"The work is small, reversible, and cheap to course-correct",
|
|
16069
|
+
"The team is in execution mode and reflective ceremonies will derail momentum",
|
|
16070
|
+
"Risk surfacing has become performative: the team names risks but never mitigates them"
|
|
16071
|
+
]
|
|
16072
|
+
}
|
|
16073
|
+
},
|
|
16074
|
+
{
|
|
16075
|
+
"id": "red-team",
|
|
16076
|
+
"approach_ids": [
|
|
16077
|
+
"reflect",
|
|
16078
|
+
"inspect"
|
|
16079
|
+
],
|
|
16080
|
+
"name": "Red Team",
|
|
16081
|
+
"version": "1.0.0",
|
|
16082
|
+
"description": "Structured adversarial review. A designated group is assigned to attack a plan, design, or proposal from an outside-in stance, surfacing weaknesses the inside-out builders cannot see.",
|
|
16083
|
+
"category": "team_process",
|
|
16084
|
+
"origin": {
|
|
16085
|
+
"type": "practitioner",
|
|
16086
|
+
"attribution": "US Department of Defense (Cold War era); broadened by security and intelligence practice",
|
|
16087
|
+
"description": `Originated in Cold War-era military strategic exercises ("red" team takes the adversary role against the "blue" team's defence). Adopted by cybersecurity, intelligence analysis, and product teams as a structured contrarian-review practice.`,
|
|
16088
|
+
"year": 1960,
|
|
16089
|
+
"license": "public_domain"
|
|
15058
16090
|
},
|
|
15059
16091
|
"tags": [
|
|
15060
|
-
"
|
|
15061
|
-
"
|
|
16092
|
+
"team_process",
|
|
16093
|
+
"reflection",
|
|
16094
|
+
"adversarial",
|
|
16095
|
+
"collection"
|
|
15062
16096
|
],
|
|
15063
16097
|
"slots": [
|
|
15064
16098
|
{
|
|
15065
|
-
"label": "
|
|
15066
|
-
"entityTypeId": "
|
|
15067
|
-
"description": "
|
|
15068
|
-
},
|
|
15069
|
-
{
|
|
15070
|
-
"label": "Outcome",
|
|
15071
|
-
"entityTypeId": "outcome",
|
|
15072
|
-
"description": "The business or product outcome the north-star metric is designed to represent"
|
|
16099
|
+
"label": "Target",
|
|
16100
|
+
"entityTypeId": "initiative",
|
|
16101
|
+
"description": "The plan, design, or proposal under adversarial review."
|
|
15073
16102
|
},
|
|
15074
16103
|
{
|
|
15075
|
-
"label": "
|
|
15076
|
-
"entityTypeId": "
|
|
15077
|
-
"description": "
|
|
16104
|
+
"label": "Attack vectors",
|
|
16105
|
+
"entityTypeId": "risk",
|
|
16106
|
+
"description": "The angles the red team uses to probe weaknesses."
|
|
15078
16107
|
},
|
|
15079
16108
|
{
|
|
15080
|
-
"label": "
|
|
15081
|
-
"entityTypeId": "
|
|
15082
|
-
"description": "
|
|
16109
|
+
"label": "Findings",
|
|
16110
|
+
"entityTypeId": "insight",
|
|
16111
|
+
"description": "Weaknesses, blind spots, or unstated assumptions surfaced by the review."
|
|
15083
16112
|
}
|
|
15084
16113
|
],
|
|
15085
16114
|
"data": {
|
|
15086
16115
|
"entity_types": [
|
|
15087
16116
|
{
|
|
15088
|
-
"type": "
|
|
15089
|
-
"role": "item"
|
|
15090
|
-
},
|
|
15091
|
-
{
|
|
15092
|
-
"type": "outcome",
|
|
16117
|
+
"type": "initiative",
|
|
15093
16118
|
"role": "root"
|
|
15094
16119
|
},
|
|
15095
16120
|
{
|
|
15096
|
-
"type": "
|
|
15097
|
-
"role": "
|
|
16121
|
+
"type": "risk",
|
|
16122
|
+
"role": "bucket"
|
|
15098
16123
|
},
|
|
15099
16124
|
{
|
|
15100
|
-
"type": "
|
|
15101
|
-
"role": "
|
|
16125
|
+
"type": "insight",
|
|
16126
|
+
"role": "bucket"
|
|
15102
16127
|
}
|
|
15103
16128
|
],
|
|
15104
16129
|
"required_properties": {}
|
|
15105
16130
|
},
|
|
15106
16131
|
"structure": {
|
|
15107
|
-
"pattern": "
|
|
16132
|
+
"pattern": "collection"
|
|
15108
16133
|
},
|
|
15109
16134
|
"presentation": {
|
|
15110
16135
|
"layout": {
|
|
15111
|
-
"type": "
|
|
15112
|
-
"
|
|
15113
|
-
"engine": "dagre"
|
|
16136
|
+
"type": "grid",
|
|
16137
|
+
"groupBy": "type"
|
|
15114
16138
|
},
|
|
15115
|
-
"
|
|
15116
|
-
|
|
16139
|
+
"sort_by": {
|
|
16140
|
+
"property": "title",
|
|
16141
|
+
"direction": "asc"
|
|
16142
|
+
},
|
|
16143
|
+
"colour_by": "group",
|
|
15117
16144
|
"card_fields": [
|
|
15118
16145
|
"title",
|
|
15119
|
-
"description"
|
|
15120
|
-
"status"
|
|
16146
|
+
"description"
|
|
15121
16147
|
]
|
|
15122
16148
|
},
|
|
15123
16149
|
"education": {
|
|
15124
|
-
"purpose": "
|
|
15125
|
-
"core_question": "
|
|
16150
|
+
"purpose": "Stress-test a plan against an explicit adversary by assigning reviewers to attack rather than agree, so weaknesses surface before reality finds them.",
|
|
16151
|
+
"core_question": "If a competent adversary wanted this to fail, where would they push first, and would we hold?",
|
|
15126
16152
|
"when_to_use": [
|
|
15127
|
-
"
|
|
15128
|
-
"
|
|
15129
|
-
"
|
|
16153
|
+
"A high-stakes decision, launch, or security posture needs hardening",
|
|
16154
|
+
"Inside-out thinking is dominant and dissent has gone quiet",
|
|
16155
|
+
"Risk register is suspiciously short for the size of the bet"
|
|
15130
16156
|
],
|
|
15131
16157
|
"when_not_to_use": [
|
|
15132
|
-
"
|
|
15133
|
-
"
|
|
16158
|
+
"Early-stage exploration where adversarial framing would crush a fragile idea prematurely",
|
|
16159
|
+
"Team trust is too low: red-teaming will read as personal attack rather than role-play",
|
|
16160
|
+
"The work is small enough that a lightweight devil's-advocate pass is sufficient"
|
|
15134
16161
|
]
|
|
15135
16162
|
}
|
|
15136
16163
|
},
|
|
15137
16164
|
{
|
|
15138
|
-
"id": "
|
|
15139
|
-
"
|
|
16165
|
+
"id": "devils-advocate",
|
|
16166
|
+
"approach_ids": [
|
|
16167
|
+
"reflect"
|
|
16168
|
+
],
|
|
16169
|
+
"name": "Devil's Advocate",
|
|
15140
16170
|
"version": "1.0.0",
|
|
15141
|
-
"description": "
|
|
16171
|
+
"description": "Designate one reviewer to formally take the opposing position regardless of personal view. The assigned-role contrarian defangs groupthink by making dissent legitimate and structured.",
|
|
15142
16172
|
"category": "team_process",
|
|
15143
16173
|
"origin": {
|
|
15144
16174
|
"type": "practitioner",
|
|
15145
|
-
"attribution": "
|
|
15146
|
-
"description": "
|
|
15147
|
-
"
|
|
15148
|
-
"
|
|
15149
|
-
"license": "open_attribution"
|
|
16175
|
+
"attribution": "Roman Catholic Church (advocatus diaboli); broadened by decision-quality practice",
|
|
16176
|
+
"description": "Originated in 16th-century canonisation proceedings as the advocatus diaboli, an official assigned to argue against canonising a candidate. Adopted by decision-science and product-team practice as a structured antidote to groupthink.",
|
|
16177
|
+
"year": 1587,
|
|
16178
|
+
"license": "public_domain"
|
|
15150
16179
|
},
|
|
15151
16180
|
"tags": [
|
|
15152
16181
|
"team_process",
|
|
15153
|
-
"
|
|
16182
|
+
"reflection",
|
|
16183
|
+
"decision_quality",
|
|
16184
|
+
"collection"
|
|
15154
16185
|
],
|
|
15155
16186
|
"slots": [
|
|
15156
16187
|
{
|
|
15157
|
-
"label": "
|
|
15158
|
-
"entityTypeId": "
|
|
15159
|
-
"description": "
|
|
15160
|
-
},
|
|
15161
|
-
{
|
|
15162
|
-
"label": "Retrospective",
|
|
15163
|
-
"entityTypeId": "retrospective",
|
|
15164
|
-
"description": "Health check session results feeding into the retrospective discussion and action items"
|
|
16188
|
+
"label": "Proposal",
|
|
16189
|
+
"entityTypeId": "initiative",
|
|
16190
|
+
"description": "The plan or recommendation under consideration."
|
|
15165
16191
|
},
|
|
15166
16192
|
{
|
|
15167
|
-
"label": "
|
|
15168
|
-
"entityTypeId": "
|
|
15169
|
-
"description": "
|
|
16193
|
+
"label": "Opposing arguments",
|
|
16194
|
+
"entityTypeId": "insight",
|
|
16195
|
+
"description": "The case against the proposal, voiced by the assigned contrarian regardless of personal view."
|
|
15170
16196
|
},
|
|
15171
16197
|
{
|
|
15172
|
-
"label": "
|
|
15173
|
-
"entityTypeId": "
|
|
15174
|
-
"description": "
|
|
16198
|
+
"label": "Counter-evidence",
|
|
16199
|
+
"entityTypeId": "evidence",
|
|
16200
|
+
"description": "Data points the contrarian raises that the proposal does not yet account for."
|
|
15175
16201
|
}
|
|
15176
16202
|
],
|
|
15177
16203
|
"data": {
|
|
15178
16204
|
"entity_types": [
|
|
15179
16205
|
{
|
|
15180
|
-
"type": "
|
|
15181
|
-
"role": "
|
|
15182
|
-
},
|
|
15183
|
-
{
|
|
15184
|
-
"type": "retrospective",
|
|
15185
|
-
"role": "item"
|
|
16206
|
+
"type": "initiative",
|
|
16207
|
+
"role": "root"
|
|
15186
16208
|
},
|
|
15187
16209
|
{
|
|
15188
|
-
"type": "
|
|
15189
|
-
"role": "
|
|
16210
|
+
"type": "insight",
|
|
16211
|
+
"role": "bucket"
|
|
15190
16212
|
},
|
|
15191
16213
|
{
|
|
15192
|
-
"type": "
|
|
15193
|
-
"role": "
|
|
16214
|
+
"type": "evidence",
|
|
16215
|
+
"role": "bucket"
|
|
15194
16216
|
}
|
|
15195
16217
|
],
|
|
15196
|
-
"required_properties": {}
|
|
15197
|
-
"computed_properties": [
|
|
15198
|
-
{
|
|
15199
|
-
"property": "health_index",
|
|
15200
|
-
"expression": "(green_count - red_count) / total_indicators",
|
|
15201
|
-
"entity_type": "team",
|
|
15202
|
-
"label": "Health Index",
|
|
15203
|
-
"format": "number"
|
|
15204
|
-
}
|
|
15205
|
-
]
|
|
16218
|
+
"required_properties": {}
|
|
15206
16219
|
},
|
|
15207
16220
|
"structure": {
|
|
15208
|
-
"pattern": "
|
|
16221
|
+
"pattern": "collection"
|
|
15209
16222
|
},
|
|
15210
16223
|
"presentation": {
|
|
15211
16224
|
"layout": {
|
|
15212
|
-
"type": "
|
|
15213
|
-
"
|
|
15214
|
-
{
|
|
15215
|
-
"property": "title",
|
|
15216
|
-
"label": "Team",
|
|
15217
|
-
"sortable": true
|
|
15218
|
-
},
|
|
15219
|
-
{
|
|
15220
|
-
"property": "title",
|
|
15221
|
-
"label": "Retrospective",
|
|
15222
|
-
"sortable": true
|
|
15223
|
-
},
|
|
15224
|
-
{
|
|
15225
|
-
"property": "description",
|
|
15226
|
-
"label": "Metric"
|
|
15227
|
-
},
|
|
15228
|
-
{
|
|
15229
|
-
"property": "title",
|
|
15230
|
-
"label": "Team OKR",
|
|
15231
|
-
"sortable": true
|
|
15232
|
-
}
|
|
15233
|
-
]
|
|
16225
|
+
"type": "grid",
|
|
16226
|
+
"groupBy": "type"
|
|
15234
16227
|
},
|
|
15235
16228
|
"sort_by": {
|
|
15236
16229
|
"property": "title",
|
|
15237
16230
|
"direction": "asc"
|
|
15238
16231
|
},
|
|
15239
|
-
"colour_by": "
|
|
16232
|
+
"colour_by": "group",
|
|
15240
16233
|
"card_fields": [
|
|
15241
16234
|
"title",
|
|
15242
|
-
"description"
|
|
15243
|
-
"status"
|
|
16235
|
+
"description"
|
|
15244
16236
|
]
|
|
15245
16237
|
},
|
|
15246
16238
|
"education": {
|
|
15247
|
-
"purpose": "
|
|
15248
|
-
"core_question": "
|
|
16239
|
+
"purpose": "Make dissent a legitimate role rather than a personal stance. Assigning one reviewer to argue against the proposal forces the team to confront the strongest counter-case.",
|
|
16240
|
+
"core_question": "If we had to argue against this proposal (not because we believe it, but because the role demands it) what is the strongest case?",
|
|
15249
16241
|
"when_to_use": [
|
|
15250
|
-
"
|
|
15251
|
-
"
|
|
15252
|
-
"
|
|
16242
|
+
"A decision is heading toward consensus and you suspect groupthink",
|
|
16243
|
+
"Stakes are high and the team has not heard a serious counter-argument",
|
|
16244
|
+
"Cultural norms make raw dissent costly; assigning the role lowers the social cost"
|
|
15253
16245
|
],
|
|
15254
16246
|
"when_not_to_use": [
|
|
15255
|
-
"
|
|
15256
|
-
"
|
|
16247
|
+
"Genuine disagreement already exists in the room (let it surface; do not theatricalise it)",
|
|
16248
|
+
"The decision is small enough that the ceremony costs more than the insight returned",
|
|
16249
|
+
"The assigned contrarian will be punished socially for the role; set the norms first or skip"
|
|
15257
16250
|
]
|
|
15258
16251
|
}
|
|
15259
16252
|
},
|
|
15260
16253
|
{
|
|
15261
|
-
"id": "
|
|
15262
|
-
"
|
|
16254
|
+
"id": "second-order-thinking",
|
|
16255
|
+
"approach_ids": [
|
|
16256
|
+
"reflect"
|
|
16257
|
+
],
|
|
16258
|
+
"name": "Second-order Thinking",
|
|
15263
16259
|
"version": "1.0.0",
|
|
15264
|
-
"description":
|
|
15265
|
-
"category": "
|
|
16260
|
+
"description": 'After deciding a move, ask "and then what?" repeatedly. Trace second-, third-, and higher-order consequences to surface downstream effects that first-order reasoning misses.',
|
|
16261
|
+
"category": "team_process",
|
|
15266
16262
|
"origin": {
|
|
15267
16263
|
"type": "practitioner",
|
|
15268
|
-
"
|
|
15269
|
-
"
|
|
16264
|
+
"attribution": "Howard Marks / Charlie Munger",
|
|
16265
|
+
"description": `Howard Marks distinguished first-order vs second-order thinking in The Most Important Thing (2011) as the essential discipline of consequential decision-making. Charlie Munger's "and then what?" framing is the practical heuristic.`,
|
|
16266
|
+
"url": "https://www.oaktreecapital.com/insights/memo/dare-to-be-great-ii",
|
|
16267
|
+
"year": 2011,
|
|
16268
|
+
"license": "published_methodology"
|
|
15270
16269
|
},
|
|
15271
16270
|
"tags": [
|
|
15272
|
-
"
|
|
15273
|
-
"
|
|
16271
|
+
"team_process",
|
|
16272
|
+
"reflection",
|
|
16273
|
+
"consequences",
|
|
16274
|
+
"tree"
|
|
15274
16275
|
],
|
|
15275
16276
|
"slots": [
|
|
15276
16277
|
{
|
|
15277
|
-
"label": "
|
|
15278
|
-
"entityTypeId": "
|
|
15279
|
-
"description": "
|
|
15280
|
-
},
|
|
15281
|
-
{
|
|
15282
|
-
"label": "Dependency",
|
|
15283
|
-
"entityTypeId": "dependency",
|
|
15284
|
-
"description": "Dependency on another team, system, or deliverable that could block progress if not resolved"
|
|
16278
|
+
"label": "First-order move",
|
|
16279
|
+
"entityTypeId": "decision",
|
|
16280
|
+
"description": "The decision or move under consideration."
|
|
15285
16281
|
},
|
|
15286
16282
|
{
|
|
15287
|
-
"label": "
|
|
15288
|
-
"entityTypeId": "
|
|
15289
|
-
"description": "
|
|
16283
|
+
"label": "Second-order consequences",
|
|
16284
|
+
"entityTypeId": "insight",
|
|
16285
|
+
"description": "Downstream effects that follow from the first-order move."
|
|
15290
16286
|
},
|
|
15291
16287
|
{
|
|
15292
|
-
"label": "
|
|
15293
|
-
"entityTypeId": "
|
|
15294
|
-
"description": "
|
|
16288
|
+
"label": "Higher-order consequences",
|
|
16289
|
+
"entityTypeId": "insight",
|
|
16290
|
+
"description": "Third-, fourth-, fifth-order ripples: second-order consequences of the second-order consequences."
|
|
15295
16291
|
}
|
|
15296
16292
|
],
|
|
15297
16293
|
"data": {
|
|
15298
16294
|
"entity_types": [
|
|
15299
16295
|
{
|
|
15300
|
-
"type": "
|
|
15301
|
-
"role": "
|
|
15302
|
-
},
|
|
15303
|
-
{
|
|
15304
|
-
"type": "dependency",
|
|
15305
|
-
"role": "item"
|
|
15306
|
-
},
|
|
15307
|
-
{
|
|
15308
|
-
"type": "status_report",
|
|
15309
|
-
"role": "item"
|
|
16296
|
+
"type": "decision",
|
|
16297
|
+
"role": "root"
|
|
15310
16298
|
},
|
|
15311
16299
|
{
|
|
15312
|
-
"type": "
|
|
15313
|
-
"role": "
|
|
16300
|
+
"type": "insight",
|
|
16301
|
+
"role": "branch"
|
|
15314
16302
|
}
|
|
15315
16303
|
],
|
|
15316
|
-
"required_properties": {}
|
|
15317
|
-
"computed_properties": [
|
|
15318
|
-
{
|
|
15319
|
-
"property": "severity",
|
|
15320
|
-
"expression": "probability * impact",
|
|
15321
|
-
"entity_type": "risk",
|
|
15322
|
-
"label": "Severity",
|
|
15323
|
-
"format": "number"
|
|
15324
|
-
}
|
|
15325
|
-
]
|
|
16304
|
+
"required_properties": {}
|
|
15326
16305
|
},
|
|
15327
16306
|
"structure": {
|
|
15328
|
-
"pattern": "
|
|
16307
|
+
"pattern": "tree"
|
|
15329
16308
|
},
|
|
15330
16309
|
"presentation": {
|
|
15331
16310
|
"layout": {
|
|
15332
|
-
"type": "
|
|
15333
|
-
"
|
|
15334
|
-
{
|
|
15335
|
-
"property": "title",
|
|
15336
|
-
"label": "Item",
|
|
15337
|
-
"sortable": true
|
|
15338
|
-
},
|
|
15339
|
-
{
|
|
15340
|
-
"property": "description",
|
|
15341
|
-
"label": "Category"
|
|
15342
|
-
},
|
|
15343
|
-
{
|
|
15344
|
-
"property": "status",
|
|
15345
|
-
"label": "Status"
|
|
15346
|
-
},
|
|
15347
|
-
{
|
|
15348
|
-
"property": "description",
|
|
15349
|
-
"label": "Owner / Action"
|
|
15350
|
-
}
|
|
15351
|
-
]
|
|
16311
|
+
"type": "tree",
|
|
16312
|
+
"direction": "TB"
|
|
15352
16313
|
},
|
|
15353
16314
|
"sort_by": {
|
|
15354
16315
|
"property": "title",
|
|
15355
16316
|
"direction": "asc"
|
|
15356
16317
|
},
|
|
15357
|
-
"colour_by": "type",
|
|
15358
16318
|
"card_fields": [
|
|
15359
16319
|
"title",
|
|
15360
|
-
"description"
|
|
15361
|
-
"status"
|
|
16320
|
+
"description"
|
|
15362
16321
|
]
|
|
15363
16322
|
},
|
|
15364
16323
|
"education": {
|
|
15365
|
-
"purpose":
|
|
15366
|
-
"core_question": "
|
|
16324
|
+
"purpose": 'Resist first-order reasoning by chaining "and then what?" until non-obvious downstream consequences come into view.',
|
|
16325
|
+
"core_question": "If we make this move and it works, what does the world look like next, and is that the world we want?",
|
|
15367
16326
|
"when_to_use": [
|
|
15368
|
-
"
|
|
15369
|
-
"
|
|
15370
|
-
"
|
|
16327
|
+
"A decision has feedback loops, market reactions, or behavioural ripples",
|
|
16328
|
+
"The first-order case is compelling, which is exactly when downstream effects bite",
|
|
16329
|
+
"Considering an irreversible or large-scale commitment"
|
|
15371
16330
|
],
|
|
15372
16331
|
"when_not_to_use": [
|
|
15373
|
-
"
|
|
15374
|
-
"
|
|
16332
|
+
"Routine, reversible, low-blast-radius decisions where deliberation costs more than mistakes",
|
|
16333
|
+
"Higher-order branches diverge into pure speculation with no anchor in evidence",
|
|
16334
|
+
"Time pressure makes a deeper trace expensive and the first-order call is good enough"
|
|
15375
16335
|
]
|
|
15376
16336
|
}
|
|
15377
16337
|
}
|
|
@@ -16325,7 +17285,10 @@ var STRATEGY_OUTCOMES_PLAYBOOK = {
|
|
|
16325
17285
|
region: "strategy_outcomes",
|
|
16326
17286
|
is_canonical: true,
|
|
16327
17287
|
related_framework_ids: ["okr-framework", "three-horizons", "north-star-metric", "metrics-tree", "wardley-map"],
|
|
16328
|
-
|
|
17288
|
+
// DT-PB-3: anchor is `outcome`, not `objective`. The creation_sequence
|
|
17289
|
+
// creates outcome (step 3) before objective (step 4), and outcome is the
|
|
17290
|
+
// strategy region's gravitational centre (objectives translate outcomes).
|
|
17291
|
+
target_anchor_entity: "outcome",
|
|
16329
17292
|
creation_sequence: [
|
|
16330
17293
|
seqStep(
|
|
16331
17294
|
1,
|
|
@@ -16481,8 +17444,12 @@ var DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK = {
|
|
|
16481
17444
|
seqStep(
|
|
16482
17445
|
8,
|
|
16483
17446
|
"Test",
|
|
16484
|
-
|
|
16485
|
-
|
|
17447
|
+
// DT-PB-1: was `experiment` — which resolves to NO canonical edge with
|
|
17448
|
+
// hypothesis or test_plan, forcing an orphan. `experiment_run` is the
|
|
17449
|
+
// hypothesis-linked test unit (experiment_run_validates_hypothesis,
|
|
17450
|
+
// test_plan_ran_as_experiment_run, experiment_run_yields_evidence).
|
|
17451
|
+
["experiment_run", "test_plan", "evidence"],
|
|
17452
|
+
"Validate with targeted experiment runs. Close the loop between research and action."
|
|
16486
17453
|
)
|
|
16487
17454
|
]
|
|
16488
17455
|
};
|
|
@@ -16529,8 +17496,8 @@ var MARKET_COMPETITIVE_PLAYBOOK = {
|
|
|
16529
17496
|
seqStep(
|
|
16530
17497
|
6,
|
|
16531
17498
|
"Moves",
|
|
16532
|
-
["
|
|
16533
|
-
"Look where competitors are weak and trends are strong. That intersection is where your moves live
|
|
17499
|
+
["competitive_battle_card"],
|
|
17500
|
+
"Look where competitors are weak and trends are strong. That intersection is where your moves live: arm the team with battle cards that turn each competitor weakness into a position you can win. (Partnership moves belong in the business & GTM playbook, where `partnership` connects.)"
|
|
16534
17501
|
)
|
|
16535
17502
|
]
|
|
16536
17503
|
};
|
|
@@ -16943,8 +17910,8 @@ var OPERATIONS_QUALITY_PLAYBOOK = {
|
|
|
16943
17910
|
seqStep(
|
|
16944
17911
|
5,
|
|
16945
17912
|
"Quality Gates",
|
|
16946
|
-
["test_suite", "test_case", "regression_test", "qa_session"],
|
|
16947
|
-
"Establish what does not ship until tests pass. Define the test pyramid: unit, integration, end-to-end."
|
|
17913
|
+
["test_suite", "test_case", "regression_test", "qa_session", "feature", "bug"],
|
|
17914
|
+
"Establish what does not ship until tests pass. Define the test pyramid: unit, integration, end-to-end. Quality is a delivery concern: gates guard the features they cover and the bugs they catch, which is also where incidents trace back (a shipped defect becomes a production incident)."
|
|
16948
17915
|
),
|
|
16949
17916
|
seqStep(
|
|
16950
17917
|
6,
|
|
@@ -21011,7 +21978,7 @@ var UPG_ANTI_PATTERNS = [
|
|
|
21011
21978
|
]
|
|
21012
21979
|
},
|
|
21013
21980
|
why_it_matters: "Without any chain link, every downstream artefact (need, opportunity, feature) loses its anchor. Features end up addressing demographics instead of struggles.",
|
|
21014
|
-
remediation: "For each persona, connect it into the user chain via at least one of: `persona_pursues_job`, `persona_experiences_need`, `persona_aspires_to_desired_outcome`, or `persona_incurs_switching_cost`. Use `/upg-persona` or the JTBD canvas workflow.",
|
|
21981
|
+
remediation: "For each persona, connect it into the user chain via at least one of: `persona_pursues_job`, `persona_experiences_need`, `persona_aspires_to_desired_outcome`, or `persona_incurs_switching_cost`. Use `/upg-new-persona` or the JTBD canvas workflow.",
|
|
21015
21982
|
stages: ["concept", "validation", "build", "beta", "launch", "growth", "mature"],
|
|
21016
21983
|
severity: "high",
|
|
21017
21984
|
source: { kind: "practitioner", attribution: "Clayton Christensen, Jobs to Be Done" }
|
|
@@ -21151,7 +22118,7 @@ var UPG_ANTI_PATTERNS = [
|
|
|
21151
22118
|
]
|
|
21152
22119
|
},
|
|
21153
22120
|
why_it_matters: "OKRs without measurable key results cannot be tracked, debated, or learned from. The graph carries intent but not accountability.",
|
|
21154
|
-
remediation: "For each `objective`, define 2\u20134 `key_result` entities and link via `objective_achieved_through_key_result`. Use `/upg-okr` to author.",
|
|
22121
|
+
remediation: "For each `objective`, define 2\u20134 `key_result` entities and link via `objective_achieved_through_key_result`. Use `/upg-new-okr` to author.",
|
|
21155
22122
|
stages: ["validation", "build", "beta", "launch", "growth", "mature"],
|
|
21156
22123
|
severity: "high",
|
|
21157
22124
|
source: { kind: "book", citation: "Measure What Matters, John Doerr (2017)" }
|
|
@@ -21211,7 +22178,7 @@ var UPG_ANTI_PATTERNS = [
|
|
|
21211
22178
|
}
|
|
21212
22179
|
},
|
|
21213
22180
|
why_it_matters: 'A graph with one persona past validation is usually carrying an unexamined "everyone is the same user" assumption.',
|
|
21214
|
-
remediation: "Add personas representing the next 1\u20132 most distinct user segments. Use `/upg-persona`.",
|
|
22181
|
+
remediation: "Add personas representing the next 1\u20132 most distinct user segments. Use `/upg-new-persona`.",
|
|
21215
22182
|
stages: ["validation", "build", "beta", "launch", "growth", "mature"],
|
|
21216
22183
|
severity: "medium",
|
|
21217
22184
|
source: { kind: "practitioner", attribution: "Alan Cooper, The Inmates Are Running the Asylum" }
|
|
@@ -21229,7 +22196,7 @@ var UPG_ANTI_PATTERNS = [
|
|
|
21229
22196
|
]
|
|
21230
22197
|
},
|
|
21231
22198
|
why_it_matters: "Build-only graphs commit the team to delivery without a learning loop. Every shipped feature becomes a permanent assumption.",
|
|
21232
|
-
remediation: "Spin up at least one `experiment_plan` or `hypothesis` per quarter's build batch. Use `/upg-
|
|
22199
|
+
remediation: "Spin up at least one `experiment_plan` or `hypothesis` per quarter's build batch. Use `/upg-new-discovery` or `/upg-new-hypothesis`.",
|
|
21233
22200
|
stages: ["build", "beta", "launch", "growth"],
|
|
21234
22201
|
severity: "high",
|
|
21235
22202
|
source: { kind: "practitioner", attribution: "Marty Cagan, Inspired (continuous discovery)" }
|
|
@@ -21520,19 +22487,31 @@ var REFLECT_MODES = [
|
|
|
21520
22487
|
];
|
|
21521
22488
|
|
|
21522
22489
|
// src/approaches/definitions/index.ts
|
|
22490
|
+
function deriveFrameworkExamples() {
|
|
22491
|
+
const byApproach = {
|
|
22492
|
+
plan: [],
|
|
22493
|
+
inspect: [],
|
|
22494
|
+
prioritise: [],
|
|
22495
|
+
trace: [],
|
|
22496
|
+
reflect: []
|
|
22497
|
+
};
|
|
22498
|
+
for (const fw of UPG_FRAMEWORKS) {
|
|
22499
|
+
for (const approachId of fw.approach_ids ?? []) {
|
|
22500
|
+
if (approachId in byApproach) {
|
|
22501
|
+
byApproach[approachId].push(fw.id);
|
|
22502
|
+
}
|
|
22503
|
+
}
|
|
22504
|
+
}
|
|
22505
|
+
return byApproach;
|
|
22506
|
+
}
|
|
22507
|
+
var FRAMEWORK_EXAMPLES = deriveFrameworkExamples();
|
|
21523
22508
|
var PLAN = {
|
|
21524
22509
|
id: "plan",
|
|
21525
22510
|
label: "Plan",
|
|
21526
22511
|
description: 'The path of arrival to "what should I build next?". Plan engages a region by surveying its entity coverage against canonical expectations and surfacing the missing scaffolding: the entities a healthy region carries that this graph does not. Cartographic sense: you are walking the coastline of a region and noting where the contour is incomplete, not deciding a strategy. Frameworks like Now/Next/Later, MoSCoW, and Wardley Mapping live within Plan as the named techniques for organising the gap-filling sequence.',
|
|
21527
22512
|
question_answered: "what should I build next?",
|
|
21528
22513
|
signature_hint: "({ region?: UPGRegionId }) \u2192 { missing_entities, coverage_score }",
|
|
21529
|
-
framework_id_examples:
|
|
21530
|
-
"now-next-later",
|
|
21531
|
-
"moscow",
|
|
21532
|
-
"wardley-map",
|
|
21533
|
-
"okr-framework",
|
|
21534
|
-
"three-horizons"
|
|
21535
|
-
]
|
|
22514
|
+
framework_id_examples: FRAMEWORK_EXAMPLES.plan
|
|
21536
22515
|
};
|
|
21537
22516
|
var INSPECT = {
|
|
21538
22517
|
id: "inspect",
|
|
@@ -21540,28 +22519,15 @@ var INSPECT = {
|
|
|
21540
22519
|
description: 'The path of arrival to "what\'s broken?". Inspect engages a region or a set of entities by running canonical health checks (anti-pattern audits, drift reports, lint passes) and emitting a structured violation list with severity, kind, target entity, description, and fix hint. Cartographic sense: you are surveying the coastline for hazards before approach; the violations are the rocks marked on the chart. The named techniques inside Inspect are the audit catalogues themselves (`UPG_ANTI_PATTERNS` and the lint passes built on the structural rules).',
|
|
21541
22520
|
question_answered: "what's broken?",
|
|
21542
22521
|
signature_hint: "({ region?: UPGRegionId, entities?: entity_ids[] }) \u2192 { violations: [{ severity, kind, entity_id, description, fix_hint }] }",
|
|
21543
|
-
framework_id_examples:
|
|
21544
|
-
"heuristic-evaluation",
|
|
21545
|
-
"tech-debt-tracker",
|
|
21546
|
-
"accessibility-maturity-model",
|
|
21547
|
-
"cognitive-walkthrough",
|
|
21548
|
-
"blameless-postmortem"
|
|
21549
|
-
]
|
|
22522
|
+
framework_id_examples: FRAMEWORK_EXAMPLES.inspect
|
|
21550
22523
|
};
|
|
21551
22524
|
var PRIORITISE = {
|
|
21552
22525
|
id: "prioritise",
|
|
21553
22526
|
label: "Prioritise",
|
|
21554
|
-
description: `The path of arrival to "what's most important?". Prioritise engages an explicit candidate set (entity ids the caller passes in) and ranks it by an explicit framework: RICE,
|
|
22527
|
+
description: `The path of arrival to "what's most important?". Prioritise engages an explicit candidate set (entity ids the caller passes in) and ranks it by an explicit framework: RICE, Kano, MoSCoW. The framework_id is required because prioritisation without a declared scoring lens is incoherent. Cartographic sense: you have a set of charted destinations and you are computing the order of arrival from a chosen vantage. Different frameworks weight the same candidate set differently; the approach delegates the actual ranking math to the named technique (the framework definition).`,
|
|
21555
22528
|
question_answered: "what's most important?",
|
|
21556
22529
|
signature_hint: "({ candidates: entity_ids[], framework_id }) \u2192 { ranked: [{ entity_id, score, rationale }], framework_used }",
|
|
21557
|
-
framework_id_examples:
|
|
21558
|
-
"rice-scoring",
|
|
21559
|
-
"ice-scoring",
|
|
21560
|
-
"kano-model",
|
|
21561
|
-
"cost-of-delay",
|
|
21562
|
-
"moscow",
|
|
21563
|
-
"wsjf"
|
|
21564
|
-
]
|
|
22530
|
+
framework_id_examples: FRAMEWORK_EXAMPLES.prioritise
|
|
21565
22531
|
};
|
|
21566
22532
|
var TRACE = {
|
|
21567
22533
|
id: "trace",
|
|
@@ -21569,34 +22535,15 @@ var TRACE = {
|
|
|
21569
22535
|
description: 'The path of arrival to "walk a meaningful path through existing graph". Trace engages an anchor entity and follows a path expressed as a UPGEntityType[] shorthand. Example: `["persona", "job", "feature"]` walks persona\u2192job\u2192feature using the canonical edge for each pair (resolved via `resolve_edge_for_pair`). An optional `edges_override` array selects non-canonical edges per hop when a pair has multiple resolutions. Cartographic sense: you are tracing a route across charted terrain; anchor is the departure, path is the heading sequence, the canonical edges are the roads. No DSL invented; the shorthand IS the path expression.',
|
|
21570
22536
|
question_answered: "walk a meaningful path through existing graph",
|
|
21571
22537
|
signature_hint: "({ anchor: entity_id, path: UPGEntityType[], edges_override?: (string | null)[] }) \u2192 { trail: [{ depth, entity_id, edge_type_in }], reached: entity_id[] }",
|
|
21572
|
-
framework_id_examples:
|
|
21573
|
-
"opportunity-solution-tree",
|
|
21574
|
-
"strategic-cascade",
|
|
21575
|
-
"metrics-tree",
|
|
21576
|
-
"user-journey-map",
|
|
21577
|
-
"impact-map",
|
|
21578
|
-
"dependency-map"
|
|
21579
|
-
]
|
|
22538
|
+
framework_id_examples: FRAMEWORK_EXAMPLES.trace
|
|
21580
22539
|
};
|
|
21581
22540
|
var REFLECT = {
|
|
21582
22541
|
id: "reflect",
|
|
21583
22542
|
label: "Reflect",
|
|
21584
|
-
description: 'The path of arrival to "what should I be questioning?". Reflect engages an optional scope (region, entity, or `null` for the whole graph) and emits structured prompts a thinker should consider: assumptions to test, alternatives to weigh, blind-spots to surface, load-bearing claims to verify. Mode is optional; absence is open reflection. Cartographic sense: before approaching the coastline, you are asking which features of your chart you have not actually verified; the prompts mark the parts of the map that may be conjecture.
|
|
22543
|
+
description: 'The path of arrival to "what should I be questioning?". Reflect engages an optional scope (region, entity, or `null` for the whole graph) and emits structured prompts a thinker should consider: assumptions to test, alternatives to weigh, blind-spots to surface, load-bearing claims to verify. Mode is optional; absence is open reflection. Cartographic sense: before approaching the coastline, you are asking which features of your chart you have not actually verified; the prompts mark the parts of the map that may be conjecture. Retrospective and Build-Measure-Learn are the named reflective techniques in the canonical surface.',
|
|
21585
22544
|
question_answered: "what should I be questioning?",
|
|
21586
22545
|
signature_hint: "({ scope?: UPGRegionId | entity_id | null, mode?: 'assumptions' | 'alternatives' | 'blind-spots' | 'load-bearing' }) \u2192 { prompts: [{ kind, question, target_entities? }] }",
|
|
21587
|
-
framework_id_examples:
|
|
21588
|
-
// Reflection classics: the five canonical reflect frameworks.
|
|
21589
|
-
"five-whys",
|
|
21590
|
-
"pre-mortem",
|
|
21591
|
-
"red-team",
|
|
21592
|
-
"devils-advocate",
|
|
21593
|
-
"second-order-thinking",
|
|
21594
|
-
// Reflective ceremonies + reflective JTBD lens already in the catalog.
|
|
21595
|
-
"retrospective",
|
|
21596
|
-
"four-forces-of-progress",
|
|
21597
|
-
"assumption-canvas",
|
|
21598
|
-
"win-loss-analysis"
|
|
21599
|
-
]
|
|
22546
|
+
framework_id_examples: FRAMEWORK_EXAMPLES.reflect
|
|
21600
22547
|
};
|
|
21601
22548
|
var UPG_APPROACHES = [PLAN, INSPECT, PRIORITISE, TRACE, REFLECT];
|
|
21602
22549
|
var UPG_APPROACHES_BY_ID = Object.fromEntries(
|
|
@@ -23793,7 +24740,7 @@ function isCanonical(text) {
|
|
|
23793
24740
|
}
|
|
23794
24741
|
|
|
23795
24742
|
// src/index.ts
|
|
23796
|
-
var UPG_VERSION = "0.8.
|
|
24743
|
+
var UPG_VERSION = "0.8.2";
|
|
23797
24744
|
var UPG_FORMAT_VERSION = "0.4.0";
|
|
23798
24745
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
23799
24746
|
var UPG_TYPES = getTypes();
|