@unified-product-graph/core 0.17.3 → 0.17.5
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/README.md +1 -1
- package/dist/index.cjs +120 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +175 -4
- package/dist/index.d.ts +175 -4
- package/dist/index.js +117 -12
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -20,7 +20,8 @@ var UPG_DOMAINS = [
|
|
|
20
20
|
"strategic_pillar",
|
|
21
21
|
"assumption",
|
|
22
22
|
"decision",
|
|
23
|
-
"constraint"
|
|
23
|
+
"constraint",
|
|
24
|
+
"strategic_question"
|
|
24
25
|
]
|
|
25
26
|
},
|
|
26
27
|
{
|
|
@@ -539,6 +540,10 @@ var UPG_ENTITY_META = [
|
|
|
539
540
|
{ name: "assumption", type_id: "ent_014", maturity: "stable", since: "0.1.0" },
|
|
540
541
|
{ name: "decision", type_id: "ent_015", maturity: "stable", since: "0.1.0" },
|
|
541
542
|
{ name: "constraint", type_id: "ent_348", maturity: "stable", since: "0.4.3" },
|
|
543
|
+
// (0.17.4) Strategy-domain sibling of research_question / design_question,
|
|
544
|
+
// completing the domain-question triad. An open coordination/ownership question
|
|
545
|
+
// a plan is exposed to (distinct from `assumption`, which the plan is built on).
|
|
546
|
+
{ name: "strategic_question", type_id: "ent_357", maturity: "proposed", since: "0.17.4" },
|
|
542
547
|
// ── User ──
|
|
543
548
|
{ name: "persona", type_id: "ent_016", maturity: "stable", since: "0.1.0" },
|
|
544
549
|
{ name: "job", type_id: "ent_017", maturity: "stable", since: "0.1.0" },
|
|
@@ -1013,6 +1018,12 @@ var CLASSIFICATION_EDGE_PROPERTY_SCHEMA = {
|
|
|
1013
1018
|
description: "Optional. A source URL, or a competitor_signal / evidence node id backing the classification. Mirrors feature_rivals_competitor_feature.evidence (free text or a node id)."
|
|
1014
1019
|
}
|
|
1015
1020
|
};
|
|
1021
|
+
var DEFER_EDGE_PROPERTY_SCHEMA = {
|
|
1022
|
+
deferred_to: {
|
|
1023
|
+
type: "string",
|
|
1024
|
+
description: 'Target period the parked work is deferred to. Freeform, mirroring strategic_theme.time_horizon. @example "Q4 2026", "FY27", "next release".'
|
|
1025
|
+
}
|
|
1026
|
+
};
|
|
1016
1027
|
var UPG_EDGE_CATALOG = {
|
|
1017
1028
|
// ── Part 1: Core Narrative Spine (Ring 1) ──────────────────────────────────
|
|
1018
1029
|
// 1.1 User Domain
|
|
@@ -2043,6 +2054,11 @@ var UPG_EDGE_CATALOG = {
|
|
|
2043
2054
|
document_describes_positioning: { forward_verb: "describes", reverse_verb: "described_by", classification: "semantic", source_type: "document", target_type: "positioning" },
|
|
2044
2055
|
document_describes_decision: { forward_verb: "describes", reverse_verb: "described_by", classification: "semantic", source_type: "document", target_type: "decision" },
|
|
2045
2056
|
document_contains_insight: { forward_verb: "contains", reverse_verb: "contained_in", classification: "semantic", source_type: "document", target_type: "insight" },
|
|
2057
|
+
// Research-provenance containment (0.17.5): a synthesis document is walkable
|
|
2058
|
+
// to the evidence it sourced. Within-graph containment (the document and the
|
|
2059
|
+
// evidence co-reside), so NOT cross_product_eligible.
|
|
2060
|
+
document_contains_quote: { forward_verb: "contains", reverse_verb: "contained_in", classification: "semantic", source_type: "document", target_type: "quote" },
|
|
2061
|
+
document_contains_observation: { forward_verb: "contains", reverse_verb: "contained_in", classification: "semantic", source_type: "document", target_type: "observation" },
|
|
2046
2062
|
// 5.3 Customer Education & Training Domain
|
|
2047
2063
|
product_educates_via_education_program: { forward_verb: "educates_via", reverse_verb: "educates", classification: "hierarchy", source_type: "product", target_type: "education_program" },
|
|
2048
2064
|
education_program_teaches_via_tutorial: { forward_verb: "teaches_via", reverse_verb: "teaches", classification: "hierarchy", source_type: "education_program", target_type: "tutorial" },
|
|
@@ -3087,7 +3103,45 @@ var UPG_EDGE_CATALOG = {
|
|
|
3087
3103
|
// Operating-lifecycle cross-edges (0.11.6): a product's journey phase realises a canonical
|
|
3088
3104
|
// operating stage (the cross-surface join key); a stage is measured by a rollup metric (loop close).
|
|
3089
3105
|
journey_phase_realises_operating_stage: { forward_verb: "realises", reverse_verb: "realised_by", classification: "cross-domain", source_type: "journey_phase", target_type: "operating_stage", cross_product_eligible: true },
|
|
3090
|
-
operating_stage_measured_by_metric: { forward_verb: "measured_by", reverse_verb: "measures", classification: "cross-domain", source_type: "operating_stage", target_type: "metric" }
|
|
3106
|
+
operating_stage_measured_by_metric: { forward_verb: "measured_by", reverse_verb: "measures", classification: "cross-domain", source_type: "operating_stage", target_type: "metric" },
|
|
3107
|
+
// ── OKR planning coverage (0.17.4) ──────────────────────────────────────────
|
|
3108
|
+
// Reconciling the strategy graph against a live planning doc surfaced texture
|
|
3109
|
+
// the objective — the node every OKR doc organises itself around — could not
|
|
3110
|
+
// reach: cross-team dependencies and deferred (out-of-scope) work.
|
|
3111
|
+
// objective ↔ dependency. Every OKR in the source doc carries a dependency
|
|
3112
|
+
// table ("which other team's work this depends on"). `dependency` (team_org)
|
|
3113
|
+
// already carries dependency_type / criticality / target_date; it was
|
|
3114
|
+
// reachable only from `team`. An objective DEPENDS ON a dependency; the
|
|
3115
|
+
// dependency BLOCKS the objective (explicit mirror, not left implicit).
|
|
3116
|
+
// Cross-domain, not hierarchy: a dependency is parented under its owning team,
|
|
3117
|
+
// so an objective references it laterally rather than containing it. Both are
|
|
3118
|
+
// cross_product_eligible — a Studio objective can depend on a dependency owned
|
|
3119
|
+
// by another team's graph within the portfolio (0.17.3 locked predicate).
|
|
3120
|
+
objective_depends_on_dependency: { forward_verb: "depends_on", reverse_verb: "dependency_of", classification: "cross-domain", source_type: "objective", target_type: "dependency", cross_product_eligible: true },
|
|
3121
|
+
dependency_blocks_objective: { forward_verb: "blocks", reverse_verb: "blocked_by", classification: "cross-domain", source_type: "dependency", target_type: "objective", cross_product_eligible: true },
|
|
3122
|
+
// objective / initiative → strategic_question. A planning doc's "Risks & Open
|
|
3123
|
+
// Questions" section names unresolved coordination questions the plan is
|
|
3124
|
+
// exposed to (who owns a capability across teams after a reorg). The
|
|
3125
|
+
// strategy-domain sibling of research_question / design_question. The question
|
|
3126
|
+
// is raised under (contained by) the objective or initiative that surfaces it,
|
|
3127
|
+
// so hierarchy — mirroring initiative_assumes_assumption. Within-graph: the
|
|
3128
|
+
// question node is authored alongside its objective, so NOT
|
|
3129
|
+
// cross_product_eligible (the cross-team nature lives in the question text, not
|
|
3130
|
+
// in a cross-graph edge).
|
|
3131
|
+
objective_raises_strategic_question: { forward_verb: "raises", reverse_verb: "raised_by", classification: "hierarchy", source_type: "objective", target_type: "strategic_question" },
|
|
3132
|
+
initiative_raises_strategic_question: { forward_verb: "raises", reverse_verb: "raised_by", classification: "hierarchy", source_type: "initiative", target_type: "strategic_question" },
|
|
3133
|
+
// objective → feature / capability (the defer / out-of-scope edge). Every OKR
|
|
3134
|
+
// in the source doc carries an explicit "Out of scope" list, load-bearing for
|
|
3135
|
+
// keeping a quarter from silently expanding (localization deferred to Q4,
|
|
3136
|
+
// another team's feature work parked). Modelled as an edge to the real feature
|
|
3137
|
+
// or capability parked for later, not a scalar exclusion string, so the parked
|
|
3138
|
+
// work stays queryable and connected. The `deferred_to` edge property carries
|
|
3139
|
+
// the temporal target. feature is product_spec (cross-domain); capability is
|
|
3140
|
+
// intra-strategy (semantic). Both cross_product_eligible: deferring another
|
|
3141
|
+
// product's feature or capability, authored in a different graph within the
|
|
3142
|
+
// portfolio, fits the 0.17.3 locked predicate.
|
|
3143
|
+
objective_defers_feature: { forward_verb: "defers", reverse_verb: "deferred_by", classification: "cross-domain", source_type: "objective", target_type: "feature", carries_properties: true, property_schema: DEFER_EDGE_PROPERTY_SCHEMA, cross_product_eligible: true, deliberate_only: true },
|
|
3144
|
+
objective_defers_capability: { forward_verb: "defers", reverse_verb: "deferred_by", classification: "semantic", source_type: "objective", target_type: "capability", carries_properties: true, property_schema: DEFER_EDGE_PROPERTY_SCHEMA, cross_product_eligible: true, deliberate_only: true }
|
|
3091
3145
|
};
|
|
3092
3146
|
var UPG_CROSS_ELIGIBLE_CATALOG_EDGE_TYPES = Object.keys(UPG_EDGE_CATALOG).filter(
|
|
3093
3147
|
(k) => UPG_EDGE_CATALOG[k].cross_product_eligible === true
|
|
@@ -3096,6 +3150,13 @@ function isCrossProductEligible(type) {
|
|
|
3096
3150
|
const def = UPG_EDGE_CATALOG[type];
|
|
3097
3151
|
return def?.cross_product_eligible === true;
|
|
3098
3152
|
}
|
|
3153
|
+
var UPG_DELIBERATE_ONLY_EDGE_TYPES = Object.keys(UPG_EDGE_CATALOG).filter(
|
|
3154
|
+
(k) => UPG_EDGE_CATALOG[k].deliberate_only === true
|
|
3155
|
+
);
|
|
3156
|
+
function isDeliberateOnlyEdge(type) {
|
|
3157
|
+
const def = UPG_EDGE_CATALOG[type];
|
|
3158
|
+
return def?.deliberate_only === true;
|
|
3159
|
+
}
|
|
3099
3160
|
var UPG_POLYMORPHIC_EDGE_KEYS = [
|
|
3100
3161
|
// Universal semantic verbs
|
|
3101
3162
|
"node_informs_node",
|
|
@@ -3463,7 +3524,9 @@ var UPG_VALID_CHILDREN = {
|
|
|
3463
3524
|
// where self-nesting genuinely lives, not on `experiment`).
|
|
3464
3525
|
experiment_run: ["learning", "evidence", "metric", "experiment_run"],
|
|
3465
3526
|
// ── OKR hierarchy ──────────────────────────────────────────────────────────
|
|
3466
|
-
|
|
3527
|
+
// strategic_question (0.17.4): an open coordination question raised under an
|
|
3528
|
+
// objective (objective_raises_strategic_question, hierarchy).
|
|
3529
|
+
objective: ["key_result", "metric", "strategic_question"],
|
|
3467
3530
|
key_result: ["metric"],
|
|
3468
3531
|
// ── Strategic cascade: vision → mission → strategic_pillar → strategic_theme →
|
|
3469
3532
|
// { initiative, objective } ───────────────────────────────────────────────
|
|
@@ -3488,7 +3551,7 @@ var UPG_VALID_CHILDREN = {
|
|
|
3488
3551
|
// catalog (hierarchy, strategic_theme → objective, reverse_verb: rolls_up_to;
|
|
3489
3552
|
// renamed from objective_rolls_up_to_strategic_theme in UPG-676).
|
|
3490
3553
|
strategic_theme: ["initiative", "objective"],
|
|
3491
|
-
initiative: ["assumption"],
|
|
3554
|
+
initiative: ["assumption", "strategic_question"],
|
|
3492
3555
|
// v0.5.2 (UPG-528): capability decomposes into sub-capabilities (Wardley
|
|
3493
3556
|
// value-chain spine) and is realised by user-facing features. Pairs with
|
|
3494
3557
|
// `capability_depends_on_capability` and `capability_implemented_by_feature`
|
|
@@ -4561,6 +4624,15 @@ var ASSUMPTION_LIFECYCLE = {
|
|
|
4561
4624
|
}
|
|
4562
4625
|
]
|
|
4563
4626
|
};
|
|
4627
|
+
var STRATEGIC_QUESTION_LIFECYCLE = {
|
|
4628
|
+
entity_type: "strategic_question",
|
|
4629
|
+
initial_phase: "open",
|
|
4630
|
+
terminal_phases: ["resolved"],
|
|
4631
|
+
phases: [
|
|
4632
|
+
{ id: "open", label: "Open", description: "The question has been raised but not yet answered. The plan is exposed to it.", transitions_to: ["resolved"] },
|
|
4633
|
+
{ id: "resolved", label: "Resolved", description: "The question has been answered; the resolution is captured. The plan is no longer exposed to it. May reopen if the answer unravels.", transitions_to: ["open"] }
|
|
4634
|
+
]
|
|
4635
|
+
};
|
|
4564
4636
|
var OUTCOME_LIFECYCLE = {
|
|
4565
4637
|
entity_type: "outcome",
|
|
4566
4638
|
initial_phase: "identified",
|
|
@@ -6238,6 +6310,7 @@ var UPG_LIFECYCLES = [
|
|
|
6238
6310
|
INITIATIVE_LIFECYCLE,
|
|
6239
6311
|
STRATEGIC_PILLAR_LIFECYCLE,
|
|
6240
6312
|
ASSUMPTION_LIFECYCLE,
|
|
6313
|
+
STRATEGIC_QUESTION_LIFECYCLE,
|
|
6241
6314
|
FEATURE_AREA_LIFECYCLE,
|
|
6242
6315
|
FEATURE_LIFECYCLE,
|
|
6243
6316
|
EPIC_LIFECYCLE,
|
|
@@ -12032,7 +12105,8 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12032
12105
|
session_ref: { type: "string", description: "Capturing session reference. Convenience field; the canonical relationship to study/session is an edge per P14. Retained as a lightweight context anchor for AI inference." },
|
|
12033
12106
|
is_highlighted: { type: "boolean", description: "Flagged as a highlight. Absorbed from the deprecated Highlight entity." },
|
|
12034
12107
|
highlight_tag: { type: "string", description: 'Free-form highlight type tag. @example "pain", "delight", "behaviour", "moment of clarity"' },
|
|
12035
|
-
sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Structured sentiment. Tools like Dovetail and EnjoyHQ converge on these four values. More precise than `highlight_tag` for aggregation." }
|
|
12108
|
+
sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Structured sentiment. Tools like Dovetail and EnjoyHQ converge on these four values. More precise than `highlight_tag` for aggregation." },
|
|
12109
|
+
source_url: { type: "string", description: "Stable deep-link to the exact moment this observation was captured in the originating recording or transcript. A per-moment locator, not a study-level link. Distinct from `session_ref`, which holds an opaque session ID.", modifier: "volatile" }
|
|
12036
12110
|
},
|
|
12037
12111
|
// OnCallRotationProperties: On-call rotation.
|
|
12038
12112
|
on_call_rotation: {
|
|
@@ -12076,7 +12150,8 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12076
12150
|
participant: {
|
|
12077
12151
|
alias: { type: "string", description: 'Anonymous alias for privacy (e.g. "P01")' },
|
|
12078
12152
|
recruit_source: { type: "string", description: "How the participant was recruited" },
|
|
12079
|
-
consent_status: { type: "string", enum: ["pending", "given", "withdrawn"], description: "Current consent status for data usage" }
|
|
12153
|
+
consent_status: { type: "string", enum: ["pending", "given", "withdrawn"], description: "Current consent status for data usage" },
|
|
12154
|
+
source_url: { type: "string", description: "Stable deep-link to the exact moment this participant appears in the originating recording or transcript. A per-moment locator, not a study-level link.", modifier: "volatile" }
|
|
12080
12155
|
},
|
|
12081
12156
|
// PartnerProgramProperties: Partner program.
|
|
12082
12157
|
partner_program: {
|
|
@@ -12299,7 +12374,8 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12299
12374
|
// QuoteProperties: Verbatim quote from a participant.
|
|
12300
12375
|
quote: {
|
|
12301
12376
|
text: { type: "string", description: "Quoted text" },
|
|
12302
|
-
timestamp: { type: "string", description: "When said (ISO timestamp or session offset)" }
|
|
12377
|
+
timestamp: { type: "string", description: "When said (ISO timestamp or session offset)" },
|
|
12378
|
+
source_url: { type: "string", description: "Stable deep-link to the exact moment this quote was spoken in the originating recording or transcript. A per-moment locator, not a study-level link.", modifier: "volatile" }
|
|
12303
12379
|
},
|
|
12304
12380
|
// QuoteDocumentProperties: Quote document.
|
|
12305
12381
|
quote_document: {
|
|
@@ -12714,6 +12790,15 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12714
12790
|
time_horizon: { type: "string", description: 'Standing / multi-year horizon, often open-ended (a pillar is durable). @example "3 years", "2026-2028", "ongoing"' },
|
|
12715
12791
|
success_indicator: { type: "string", description: "How the business knows this durable pillar is on track. Narrative, not a metric edge. A strategic_theme deliberately has no success_indicator: it is measured through its child objectives, not on its own." }
|
|
12716
12792
|
},
|
|
12793
|
+
// StrategicQuestionProperties: StrategicQuestion entity. An open coordination or
|
|
12794
|
+
// ownership question a plan is exposed to (strategy sibling of research_question /
|
|
12795
|
+
// design_question). `status` is the node lifecycle (open -> resolved).
|
|
12796
|
+
strategic_question: {
|
|
12797
|
+
question: { type: "string", description: "The question itself. Primary content." },
|
|
12798
|
+
context: { type: "string", description: "Context that surfaced the question: the reorg, the boundary, the unowned area." },
|
|
12799
|
+
resolution: { type: "string", description: "The answer, captured when the question moves to `resolved`." },
|
|
12800
|
+
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance to resolve relative to other open questions." }
|
|
12801
|
+
},
|
|
12717
12802
|
// StrategicThemeProperties: StrategicTheme entity. A time-bound thrust WITHIN a
|
|
12718
12803
|
// strategic_pillar (distinct cascade level, UPG-692 T3.3) — measured through its
|
|
12719
12804
|
// child objectives, so it carries no success_indicator of its own.
|
|
@@ -19742,6 +19827,7 @@ var ENTITY_EMOJI = {
|
|
|
19742
19827
|
stakeholder: "\u{1F9D1}\u200D\u{1F4BC}",
|
|
19743
19828
|
status_report: "\u{1F4C4}",
|
|
19744
19829
|
strategic_pillar: "\u{1F3DB}\uFE0F",
|
|
19830
|
+
strategic_question: "\u2754",
|
|
19745
19831
|
strategic_theme: "\u{1F9F5}",
|
|
19746
19832
|
subscription: "\u{1F502}",
|
|
19747
19833
|
success_milestone: "\u{1F389}",
|
|
@@ -20299,6 +20385,7 @@ var STANDARD_LABELS = {
|
|
|
20299
20385
|
value_stream: { alt_labels: ["value chain", "stream"] },
|
|
20300
20386
|
strategic_pillar: { alt_labels: ["pillar", "foundation"] },
|
|
20301
20387
|
assumption: { alt_labels: ["belief", "working assumption", "premise"] },
|
|
20388
|
+
strategic_question: { alt_labels: ["open question", "coordination question", "ownership question"] },
|
|
20302
20389
|
// User layer
|
|
20303
20390
|
job_step: { alt_labels: ["job stage", "job phase", "job map step"] },
|
|
20304
20391
|
switching_cost: { alt_labels: ["lock-in", "migration cost", "switching barrier"] },
|
|
@@ -22728,7 +22815,13 @@ var USER_RESEARCH_GUIDE = {
|
|
|
22728
22815
|
anti_patterns: [
|
|
22729
22816
|
{ description: "Insights without evidence: every insight must trace back to observations and quotes" },
|
|
22730
22817
|
{ description: "Orphan quotes: quotes should belong to observations, not float independently" },
|
|
22731
|
-
{ description: "Research studies without questions: always define what you want to learn before starting" }
|
|
22818
|
+
{ description: "Research studies without questions: always define what you want to learn before starting" },
|
|
22819
|
+
{
|
|
22820
|
+
name: "Study conflation",
|
|
22821
|
+
affected_entity: "research_study",
|
|
22822
|
+
description: "Do not merge multiple research rounds with different stated goals into one `research_study` (or one participant pool) just because they were synthesized into the same downstream document. If two rounds have different research questions, they are different `research_study` nodes, even if an analyst wrote them up together.",
|
|
22823
|
+
remediation: "Verify against the *original* recording or session metadata, not the synthesis doc's grouping."
|
|
22824
|
+
}
|
|
22732
22825
|
]
|
|
22733
22826
|
};
|
|
22734
22827
|
var MARKET_INTELLIGENCE_GUIDE = {
|
|
@@ -22843,7 +22936,7 @@ var STRATEGY_GUIDE = {
|
|
|
22843
22936
|
// entries are later additions appended in chronological-introduction
|
|
22844
22937
|
// order. Placement reflects the order in which they would naturally be
|
|
22845
22938
|
// authored after the canonical strategy spine.
|
|
22846
|
-
creation_sequence: ["product", "vision", "mission", "outcome", "objective", "key_result", "metric", "metric_quality_assessment", "strategic_theme", "strategic_pillar", "initiative", "capability", "value_stream", "assumption", "decision", "constraint"],
|
|
22939
|
+
creation_sequence: ["product", "vision", "mission", "outcome", "objective", "key_result", "metric", "metric_quality_assessment", "strategic_theme", "strategic_pillar", "initiative", "capability", "value_stream", "assumption", "strategic_question", "decision", "constraint"],
|
|
22847
22940
|
patterns: [
|
|
22848
22941
|
{
|
|
22849
22942
|
name: "Strategic Cascade",
|
|
@@ -22861,13 +22954,16 @@ var STRATEGY_GUIDE = {
|
|
|
22861
22954
|
required_bridges: [
|
|
22862
22955
|
{ edge_type: "outcome_reveals_opportunity", target_domain: "discovery", when: "Outcomes should connect to the opportunities that deliver them" },
|
|
22863
22956
|
{ edge_type: "outcome_delivered_by_feature", target_domain: "product_spec", when: "Strategic outcomes should decompose into shipped features" },
|
|
22864
|
-
{ edge_type: "assumption_becomes_hypothesis", target_domain: "validation", when: "Risky assumptions should become testable hypotheses" }
|
|
22957
|
+
{ edge_type: "assumption_becomes_hypothesis", target_domain: "validation", when: "Risky assumptions should become testable hypotheses" },
|
|
22958
|
+
{ edge_type: "objective_depends_on_dependency", target_domain: "team_org", when: "An objective that hinges on cross-team work should name the dependency it is exposed to" },
|
|
22959
|
+
{ edge_type: "objective_defers_feature", target_domain: "product_spec", when: "Work an objective explicitly puts out of scope for now should point at the deferred feature with a deferred_to period, not silently vanish from the quarter" }
|
|
22865
22960
|
],
|
|
22866
22961
|
anti_patterns: [
|
|
22867
22962
|
{ description: "Outcomes without metrics. Measurement is the signal an outcome happened." },
|
|
22868
22963
|
{ description: "Objectives without key results: an objective without measurement is a wish" },
|
|
22869
22964
|
{ description: "Too many strategic themes: focus beats breadth, aim for 2-4 active themes" },
|
|
22870
|
-
{ description: "Constraints without an origin: a qualitative guardrail lives on a constraint, so set constraint_origin to say where it comes from. internal marks a self-imposed principle or operating tenet the team commits to; external marks a limit, requirement, or ceiling imposed from outside (a regulation, a budget cap, a platform bound)." }
|
|
22965
|
+
{ description: "Constraints without an origin: a qualitative guardrail lives on a constraint, so set constraint_origin to say where it comes from. internal marks a self-imposed principle or operating tenet the team commits to; external marks a limit, requirement, or ceiling imposed from outside (a regulation, a budget cap, a platform bound)." },
|
|
22966
|
+
{ description: "Overloading assumption for open questions: an assumption is a premise the plan is built on and resolves by being tested (assumption_becomes_hypothesis). An unresolved coordination or ownership question the plan is exposed to (who owns a capability across teams, where a boundary falls after a reorg) is a strategic_question, raised under the objective or initiative it hangs off. Do not force one into the other." }
|
|
22871
22967
|
]
|
|
22872
22968
|
};
|
|
22873
22969
|
var PRODUCT_SPEC_GUIDE = {
|
|
@@ -26920,6 +27016,10 @@ var UPG_REGIONS = [
|
|
|
26920
27016
|
type: "assumption",
|
|
26921
27017
|
role: "leaf"
|
|
26922
27018
|
},
|
|
27019
|
+
{
|
|
27020
|
+
type: "strategic_question",
|
|
27021
|
+
role: "leaf"
|
|
27022
|
+
},
|
|
26923
27023
|
{
|
|
26924
27024
|
type: "constraint",
|
|
26925
27025
|
role: "leaf"
|
|
@@ -26945,6 +27045,8 @@ var UPG_REGIONS = [
|
|
|
26945
27045
|
"strategic_pillar_decided_via_decision",
|
|
26946
27046
|
"strategic_theme_pursues_initiative",
|
|
26947
27047
|
"initiative_assumes_assumption",
|
|
27048
|
+
"objective_raises_strategic_question",
|
|
27049
|
+
"initiative_raises_strategic_question",
|
|
26948
27050
|
"initiative_drives_outcome",
|
|
26949
27051
|
"objective_achieved_through_key_result",
|
|
26950
27052
|
"objective_measured_by_metric",
|
|
@@ -29629,7 +29731,7 @@ function isCanonical(text) {
|
|
|
29629
29731
|
}
|
|
29630
29732
|
|
|
29631
29733
|
// src/index.ts
|
|
29632
|
-
var UPG_VERSION = "0.17.
|
|
29734
|
+
var UPG_VERSION = "0.17.5";
|
|
29633
29735
|
var UPG_FORMAT_VERSION = "0.4.0";
|
|
29634
29736
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
29635
29737
|
var UPG_TYPES = getTypes();
|
|
@@ -29702,6 +29804,7 @@ export {
|
|
|
29702
29804
|
COVERAGE_ANTI_PATTERNS,
|
|
29703
29805
|
DEFAULT_ENTITY_EMOJI,
|
|
29704
29806
|
DEFERRED_PROPOSED_BY_CONTRACT,
|
|
29807
|
+
DEFER_EDGE_PROPERTY_SCHEMA,
|
|
29705
29808
|
DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK,
|
|
29706
29809
|
ENGINEERING_PLATFORM_PLAYBOOK,
|
|
29707
29810
|
ENTITY_EMOJI,
|
|
@@ -29733,6 +29836,7 @@ export {
|
|
|
29733
29836
|
UPG_CROSS_EDGE_TYPES,
|
|
29734
29837
|
UPG_CROSS_ELIGIBLE_CATALOG_EDGE_TYPES,
|
|
29735
29838
|
UPG_CROSS_ONLY_EDGE_TYPES,
|
|
29839
|
+
UPG_DELIBERATE_ONLY_EDGE_TYPES,
|
|
29736
29840
|
UPG_DEPRECATED_TYPES,
|
|
29737
29841
|
UPG_DOMAINS,
|
|
29738
29842
|
UPG_DOMAIN_ACTIVATION,
|
|
@@ -29864,6 +29968,7 @@ export {
|
|
|
29864
29968
|
isCanonicalProductStage,
|
|
29865
29969
|
isContainmentFreeType,
|
|
29866
29970
|
isCrossProductEligible,
|
|
29971
|
+
isDeliberateOnlyEdge,
|
|
29867
29972
|
isDeprecatedType,
|
|
29868
29973
|
isDomainGuideStep,
|
|
29869
29974
|
isEntitySequenceStep,
|