@unified-product-graph/core 0.9.7 → 0.9.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -315,10 +315,17 @@ declare const UPG_EDGE_CATALOG: {
315
315
  source_type: string;
316
316
  target_type: string;
317
317
  };
318
- hypothesis_planned_via_test_plan: {
318
+ hypothesis_tested_by_experiment: {
319
319
  forward_verb: string;
320
320
  reverse_verb: string;
321
- classification: "hierarchy";
321
+ classification: "causal";
322
+ source_type: string;
323
+ target_type: string;
324
+ };
325
+ experiment_validates_hypothesis: {
326
+ forward_verb: string;
327
+ reverse_verb: string;
328
+ classification: "causal";
322
329
  source_type: string;
323
330
  target_type: string;
324
331
  };
@@ -329,6 +336,20 @@ declare const UPG_EDGE_CATALOG: {
329
336
  source_type: string;
330
337
  target_type: string;
331
338
  };
339
+ insight_generates_hypothesis: {
340
+ forward_verb: string;
341
+ reverse_verb: string;
342
+ classification: "cross-domain";
343
+ source_type: string;
344
+ target_type: string;
345
+ };
346
+ research_plan_conducted_as_research_study: {
347
+ forward_verb: string;
348
+ reverse_verb: string;
349
+ classification: "cross-domain";
350
+ source_type: string;
351
+ target_type: string;
352
+ };
332
353
  experiment_run_produces_learning: {
333
354
  forward_verb: string;
334
355
  reverse_verb: string;
@@ -406,7 +427,7 @@ declare const UPG_EDGE_CATALOG: {
406
427
  source_type: string;
407
428
  target_type: string;
408
429
  };
409
- experiment_has_plan: {
430
+ experiment_plan_designs_experiment: {
410
431
  forward_verb: string;
411
432
  reverse_verb: string;
412
433
  classification: "hierarchy";
@@ -882,13 +903,6 @@ declare const UPG_EDGE_CATALOG: {
882
903
  source_type: string;
883
904
  target_type: string;
884
905
  };
885
- outcome_tracked_by_metric: {
886
- forward_verb: string;
887
- reverse_verb: string;
888
- classification: "hierarchy";
889
- source_type: string;
890
- target_type: string;
891
- };
892
906
  objective_achieved_through_key_result: {
893
907
  forward_verb: string;
894
908
  reverse_verb: string;
@@ -910,13 +924,6 @@ declare const UPG_EDGE_CATALOG: {
910
924
  source_type: string;
911
925
  target_type: string;
912
926
  };
913
- key_result_tracked_by_metric: {
914
- forward_verb: string;
915
- reverse_verb: string;
916
- classification: "hierarchy";
917
- source_type: string;
918
- target_type: string;
919
- };
920
927
  vision_realised_through_mission: {
921
928
  forward_verb: string;
922
929
  reverse_verb: string;
@@ -987,7 +994,7 @@ declare const UPG_EDGE_CATALOG: {
987
994
  source_type: string;
988
995
  target_type: string;
989
996
  };
990
- objective_rolls_up_to_strategic_theme: {
997
+ strategic_theme_contains_objective: {
991
998
  forward_verb: string;
992
999
  reverse_verb: string;
993
1000
  classification: "hierarchy";
@@ -2359,13 +2366,6 @@ declare const UPG_EDGE_CATALOG: {
2359
2366
  source_type: string;
2360
2367
  target_type: string;
2361
2368
  };
2362
- product_experiences_incident_hierarchy: {
2363
- forward_verb: string;
2364
- reverse_verb: string;
2365
- classification: "hierarchy";
2366
- source_type: string;
2367
- target_type: string;
2368
- };
2369
2369
  product_tested_by_penetration_test: {
2370
2370
  forward_verb: string;
2371
2371
  reverse_verb: string;
@@ -2499,6 +2499,27 @@ declare const UPG_EDGE_CATALOG: {
2499
2499
  source_type: string;
2500
2500
  target_type: string;
2501
2501
  };
2502
+ product_plans_qa_via_test_plan: {
2503
+ forward_verb: string;
2504
+ reverse_verb: string;
2505
+ classification: "hierarchy";
2506
+ source_type: string;
2507
+ target_type: string;
2508
+ };
2509
+ test_plan_executed_by_test_suite: {
2510
+ forward_verb: string;
2511
+ reverse_verb: string;
2512
+ classification: "hierarchy";
2513
+ source_type: string;
2514
+ target_type: string;
2515
+ };
2516
+ test_plan_specifies_test_environment: {
2517
+ forward_verb: string;
2518
+ reverse_verb: string;
2519
+ classification: "hierarchy";
2520
+ source_type: string;
2521
+ target_type: string;
2522
+ };
2502
2523
  product_maintains_test_suite: {
2503
2524
  forward_verb: string;
2504
2525
  reverse_verb: string;
@@ -2702,7 +2723,14 @@ declare const UPG_EDGE_CATALOG: {
2702
2723
  source_type: string;
2703
2724
  target_type: string;
2704
2725
  };
2705
- ai_model_prompted_via_prompt_version: {
2726
+ ai_model_defines_prompt_template: {
2727
+ forward_verb: string;
2728
+ reverse_verb: string;
2729
+ classification: "hierarchy";
2730
+ source_type: string;
2731
+ target_type: string;
2732
+ };
2733
+ prompt_template_contains_prompt_version: {
2706
2734
  forward_verb: string;
2707
2735
  reverse_verb: string;
2708
2736
  classification: "hierarchy";
@@ -2758,10 +2786,10 @@ declare const UPG_EDGE_CATALOG: {
2758
2786
  source_type: string;
2759
2787
  target_type: string;
2760
2788
  };
2761
- prompt_version_evolves_prompt_template: {
2789
+ prompt_version_supersedes_prompt_version: {
2762
2790
  forward_verb: string;
2763
2791
  reverse_verb: string;
2764
- classification: "cross-domain";
2792
+ classification: "semantic";
2765
2793
  source_type: string;
2766
2794
  target_type: string;
2767
2795
  };
@@ -2814,6 +2842,48 @@ declare const UPG_EDGE_CATALOG: {
2814
2842
  source_type: string;
2815
2843
  target_type: string;
2816
2844
  };
2845
+ eval_run_evaluates_ai_model: {
2846
+ forward_verb: string;
2847
+ reverse_verb: string;
2848
+ classification: "cross-domain";
2849
+ source_type: string;
2850
+ target_type: string;
2851
+ };
2852
+ eval_run_scores_prompt_version: {
2853
+ forward_verb: string;
2854
+ reverse_verb: string;
2855
+ classification: "cross-domain";
2856
+ source_type: string;
2857
+ target_type: string;
2858
+ };
2859
+ hallucination_report_traces_to_ai_trace: {
2860
+ forward_verb: string;
2861
+ reverse_verb: string;
2862
+ classification: "cross-domain";
2863
+ source_type: string;
2864
+ target_type: string;
2865
+ };
2866
+ hallucination_report_caused_by_root_cause: {
2867
+ forward_verb: string;
2868
+ reverse_verb: string;
2869
+ classification: "cross-domain";
2870
+ source_type: string;
2871
+ target_type: string;
2872
+ };
2873
+ ai_trace_executed_prompt_version: {
2874
+ forward_verb: string;
2875
+ reverse_verb: string;
2876
+ classification: "cross-domain";
2877
+ source_type: string;
2878
+ target_type: string;
2879
+ };
2880
+ ai_dataset_sourced_from_data_source: {
2881
+ forward_verb: string;
2882
+ reverse_verb: string;
2883
+ classification: "cross-domain";
2884
+ source_type: string;
2885
+ target_type: string;
2886
+ };
2817
2887
  product_automated_via_workflow_template: {
2818
2888
  forward_verb: string;
2819
2889
  reverse_verb: string;
@@ -3031,13 +3101,6 @@ declare const UPG_EDGE_CATALOG: {
3031
3101
  source_type: string;
3032
3102
  target_type: string;
3033
3103
  };
3034
- metric_decomposed_into_metric: {
3035
- forward_verb: string;
3036
- reverse_verb: string;
3037
- classification: "hierarchy";
3038
- source_type: string;
3039
- target_type: string;
3040
- };
3041
3104
  metric_drives_metric: {
3042
3105
  forward_verb: string;
3043
3106
  reverse_verb: string;
@@ -3220,13 +3283,6 @@ declare const UPG_EDGE_CATALOG: {
3220
3283
  source_type: string;
3221
3284
  target_type: string;
3222
3285
  };
3223
- business_model_reaches_via_distribution_channel: {
3224
- forward_verb: string;
3225
- reverse_verb: string;
3226
- classification: "hierarchy";
3227
- source_type: string;
3228
- target_type: string;
3229
- };
3230
3286
  business_model_maintains_customer_relationship: {
3231
3287
  forward_verb: string;
3232
3288
  reverse_verb: string;
@@ -3290,13 +3346,6 @@ declare const UPG_EDGE_CATALOG: {
3290
3346
  source_type: string;
3291
3347
  target_type: string;
3292
3348
  };
3293
- value_proposition_targets_persona_cross_domain: {
3294
- forward_verb: string;
3295
- reverse_verb: string;
3296
- classification: "cross-domain";
3297
- source_type: string;
3298
- target_type: string;
3299
- };
3300
3349
  revenue_stream_drives_metric: {
3301
3350
  forward_verb: string;
3302
3351
  reverse_verb: string;
@@ -4284,13 +4333,6 @@ declare const UPG_EDGE_CATALOG: {
4284
4333
  source_type: string;
4285
4334
  target_type: string;
4286
4335
  };
4287
- support_ticket_reveals_need_cross_domain: {
4288
- forward_verb: string;
4289
- reverse_verb: string;
4290
- classification: "cross-domain";
4291
- source_type: string;
4292
- target_type: string;
4293
- };
4294
4336
  churn_reason_reveals_need: {
4295
4337
  forward_verb: string;
4296
4338
  reverse_verb: string;
@@ -4326,13 +4368,6 @@ declare const UPG_EDGE_CATALOG: {
4326
4368
  source_type: string;
4327
4369
  target_type: string;
4328
4370
  };
4329
- product_prompted_via_prompt_template: {
4330
- forward_verb: string;
4331
- reverse_verb: string;
4332
- classification: "hierarchy";
4333
- source_type: string;
4334
- target_type: string;
4335
- };
4336
4371
  product_templated_via_documentation_template: {
4337
4372
  forward_verb: string;
4338
4373
  reverse_verb: string;
@@ -4396,13 +4431,6 @@ declare const UPG_EDGE_CATALOG: {
4396
4431
  source_type: string;
4397
4432
  target_type: string;
4398
4433
  };
4399
- content_calendar_schedules_prompt_template: {
4400
- forward_verb: string;
4401
- reverse_verb: string;
4402
- classification: "hierarchy";
4403
- source_type: string;
4404
- target_type: string;
4405
- };
4406
4434
  content_calendar_schedules_documentation_template: {
4407
4435
  forward_verb: string;
4408
4436
  reverse_verb: string;
@@ -4431,13 +4459,6 @@ declare const UPG_EDGE_CATALOG: {
4431
4459
  source_type: string;
4432
4460
  target_type: string;
4433
4461
  };
4434
- changelog_documents_release: {
4435
- forward_verb: string;
4436
- reverse_verb: string;
4437
- classification: "cross-domain";
4438
- source_type: string;
4439
- target_type: string;
4440
- };
4441
4462
  prompt_template_powers_feature: {
4442
4463
  forward_verb: string;
4443
4464
  reverse_verb: string;
@@ -4648,13 +4669,6 @@ declare const UPG_EDGE_CATALOG: {
4648
4669
  source_type: string;
4649
4670
  target_type: string;
4650
4671
  };
4651
- product_decided_via_decision_hierarchy: {
4652
- forward_verb: string;
4653
- reverse_verb: string;
4654
- classification: "hierarchy";
4655
- source_type: string;
4656
- target_type: string;
4657
- };
4658
4672
  product_organised_into_department: {
4659
4673
  forward_verb: string;
4660
4674
  reverse_verb: string;
@@ -5299,13 +5313,6 @@ declare const UPG_EDGE_CATALOG: {
5299
5313
  source_type: string;
5300
5314
  target_type: string;
5301
5315
  };
5302
- metric_measures_metric_cross_domain: {
5303
- forward_verb: string;
5304
- reverse_verb: string;
5305
- classification: "cross-domain";
5306
- source_type: string;
5307
- target_type: string;
5308
- };
5309
5316
  event_schema_tracks_funnel_step: {
5310
5317
  forward_verb: string;
5311
5318
  reverse_verb: string;
@@ -5383,13 +5390,6 @@ declare const UPG_EDGE_CATALOG: {
5383
5390
  source_type: string;
5384
5391
  target_type: string;
5385
5392
  };
5386
- product_categorised_in_product_area: {
5387
- forward_verb: string;
5388
- reverse_verb: string;
5389
- classification: "hierarchy";
5390
- source_type: string;
5391
- target_type: string;
5392
- };
5393
5393
  product_has_competitor: {
5394
5394
  forward_verb: string;
5395
5395
  reverse_verb: string;
@@ -5712,13 +5712,6 @@ declare const UPG_EDGE_CATALOG: {
5712
5712
  source_type: string;
5713
5713
  target_type: string;
5714
5714
  };
5715
- insight_validates_need_cross_domain: {
5716
- forward_verb: string;
5717
- reverse_verb: string;
5718
- classification: "cross-domain";
5719
- source_type: string;
5720
- target_type: string;
5721
- };
5722
5715
  observation_reveals_need: {
5723
5716
  forward_verb: string;
5724
5717
  reverse_verb: string;
@@ -5810,13 +5803,6 @@ declare const UPG_EDGE_CATALOG: {
5810
5803
  source_type: string;
5811
5804
  target_type: string;
5812
5805
  };
5813
- insight_informs_opportunity_cross_domain: {
5814
- forward_verb: string;
5815
- reverse_verb: string;
5816
- classification: "cross-domain";
5817
- source_type: string;
5818
- target_type: string;
5819
- };
5820
5806
  insight_validates_persona: {
5821
5807
  forward_verb: string;
5822
5808
  reverse_verb: string;
@@ -6014,13 +6000,6 @@ declare const UPG_EDGE_CATALOG: {
6014
6000
  source_type: string;
6015
6001
  target_type: string;
6016
6002
  };
6017
- prompt_template_targets_ai_model: {
6018
- forward_verb: string;
6019
- reverse_verb: string;
6020
- classification: "cross-domain";
6021
- source_type: string;
6022
- target_type: string;
6023
- };
6024
6003
  education_program_targets_persona: {
6025
6004
  forward_verb: string;
6026
6005
  reverse_verb: string;
@@ -6453,13 +6432,6 @@ declare const UPG_EDGE_CATALOG: {
6453
6432
  source_type: string;
6454
6433
  target_type: string;
6455
6434
  };
6456
- test_plan_ran_as_experiment_run: {
6457
- forward_verb: string;
6458
- reverse_verb: string;
6459
- classification: "hierarchy";
6460
- source_type: string;
6461
- target_type: string;
6462
- };
6463
6435
  evidence_interpreted_as_learning: {
6464
6436
  forward_verb: string;
6465
6437
  reverse_verb: string;
@@ -7172,7 +7144,7 @@ interface UPGProduct {
7172
7144
  /** Product lifecycle stages. Covers the full arc from napkin idea to end-of-life. */
7173
7145
  type UPGProductStage = 'concept' | 'validation' | 'build' | 'beta' | 'launch' | 'growth' | 'mature' | 'maintenance' | 'sunset';
7174
7146
  /** The set of valid cross-product relationship types */
7175
- type UPGCrossEdgeType = 'shares_persona' | 'shares_competitor' | 'shares_metric' | 'depends_on_product' | 'cannibalises' | 'succeeds' | 'hosts' | 'contributes_to' | 'instance_of';
7147
+ type UPGCrossEdgeType = 'shares_persona' | 'shares_competitor' | 'shares_metric' | 'depends_on_product' | 'cannibalises' | 'succeeds' | 'hosts' | 'contributes_to' | 'instance_of' | 'area_serves_persona' | 'area_targets_market_segment' | 'rolls_up_to';
7176
7148
  /**
7177
7149
  * Runtime-checkable list of valid cross-product edge types. Mirrors
7178
7150
  * `UPGCrossEdgeType` for use in validators and writers that need to test
@@ -7207,6 +7179,26 @@ interface UPGCrossEdge {
7207
7179
  target_product_id?: string;
7208
7180
  /** Confidence level if this edge was inferred during import */
7209
7181
  mapping_confidence?: UPGMappingConfidence;
7182
+ /**
7183
+ * Sanctioned divergence marker (`instance_of` only). When true, registry drift
7184
+ * detection treats an instance title that differs from its canonical as
7185
+ * intentional (an informative product-local name, e.g. "Vercel Platform / SDK"
7186
+ * vs canonical "Vercel"), excluding it from the `title_divergence` count so
7187
+ * `clean` reflects only un-sanctioned drift.
7188
+ */
7189
+ alias?: boolean;
7190
+ /**
7191
+ * Audience relevance for `area_serves_persona` / `area_targets_market_segment`:
7192
+ * whether the audience is a primary or secondary focus of this area. The
7193
+ * primary-vs-secondary distinction is the core value of the area-to-audience matrix.
7194
+ */
7195
+ relevance?: 'primary' | 'secondary';
7196
+ /**
7197
+ * Audience role in this area's context (`area_serves_persona`). Mirrors
7198
+ * `PersonaProperties.audience_role`: the same persona can be a `buyer` for one
7199
+ * area and a `user` for another.
7200
+ */
7201
+ audience_role?: 'buyer' | 'user' | 'champion' | 'influencer' | 'partner';
7210
7202
  }
7211
7203
  /**
7212
7204
  * A product area within a portfolio. The organisational axis (who owns
@@ -7657,8 +7649,8 @@ declare const UPG_DOMAINS: readonly [{
7657
7649
  }, {
7658
7650
  readonly id: "validation";
7659
7651
  readonly label: "Validation";
7660
- readonly description: "Testing ideas before committing to build them. Hypotheses state testable beliefs. Experiments run the tests. Evidence captures what was observed. Learnings distill what was understood. Test plans structure the approach. Research plans coordinate broader investigation. Consumes opportunities from Discovery and insights from User Research, producing evidence that informs Strategy and Product Specification.";
7661
- readonly types: readonly ["hypothesis", "experiment", "experiment_plan", "experiment_run", "learning", "test_plan", "evidence", "research_plan"];
7652
+ readonly description: "Testing ideas before committing to build them. Hypotheses state testable beliefs. Experiment plans structure the validation design. Experiments run the tests, with experiment runs capturing replication. Evidence captures what was observed. Learnings distill what was understood. Research plans coordinate broader investigation. Consumes opportunities from Discovery and insights from User Research, producing evidence that informs Strategy and Product Specification.";
7653
+ readonly types: readonly ["hypothesis", "experiment", "experiment_plan", "experiment_run", "learning", "evidence", "research_plan"];
7662
7654
  }, {
7663
7655
  readonly id: "market_intelligence";
7664
7656
  readonly label: "Market Intelligence";
@@ -7747,8 +7739,8 @@ declare const UPG_DOMAINS: readonly [{
7747
7739
  }, {
7748
7740
  readonly id: "testing";
7749
7741
  readonly label: "Quality Assurance";
7750
- readonly description: "Verifying your product works correctly. Test suites group related tests. Test cases define individual checks. QA sessions capture exploratory testing. Regression tests guard against regressions. Test coverage reports measure completeness. Test environments define where tests run. Test results record outcomes. Validates Engineering (code quality) and Product Specification (acceptance criteria). Feeds DevOps (release confidence).";
7751
- readonly types: readonly ["test_suite", "test_case", "qa_session", "regression_test", "test_coverage_report", "test_environment", "test_result"];
7742
+ readonly description: "Verifying your product works correctly. Test plans define the verification approach (scope, environments, pass criteria). Test suites group related tests. Test cases define individual checks. QA sessions capture exploratory testing. Regression tests guard against regressions. Test coverage reports measure completeness. Test environments define where tests run. Test results record outcomes. Validates Engineering (code quality) and Product Specification (acceptance criteria). Feeds DevOps (release confidence).";
7743
+ readonly types: readonly ["test_plan", "test_suite", "test_case", "qa_session", "regression_test", "test_coverage_report", "test_environment", "test_result"];
7752
7744
  }, {
7753
7745
  readonly id: "feedback";
7754
7746
  readonly label: "Customer Feedback";
@@ -7762,7 +7754,7 @@ declare const UPG_DOMAINS: readonly [{
7762
7754
  }, {
7763
7755
  readonly id: "ai";
7764
7756
  readonly label: "AI & Machine Learning";
7765
- readonly description: "AI and machine learning capabilities within your product. AI models track deployed models. Prompt versions manage prompt evolution. Eval benchmarks and eval runs measure quality. AI cost trackers monitor spend. Hallucination reports flag reliability issues. AI guardrails set safety boundaries. Model comparisons evaluate alternatives. AI experiments test new approaches. AI datasets track training data. AI traces log inference chains. Connects to Engineering, Data & Analytics, and Product Specification.";
7757
+ readonly description: "AI and machine learning capabilities within your product. AI models track deployed models. Prompt templates define reusable prompts; prompt versions manage their evolution. Eval benchmarks and eval runs measure quality. AI cost trackers monitor spend. Hallucination reports flag reliability issues. AI guardrails set safety boundaries. Model comparisons evaluate alternatives. AI experiments test new approaches. AI datasets track training data. AI traces log inference chains. Connects to Engineering, Data & Analytics, and Product Specification.";
7766
7758
  readonly types: readonly ["ai_model", "prompt_version", "eval_benchmark", "eval_run", "ai_cost_tracker", "hallucination_report", "ai_guardrail", "model_comparison", "ai_experiment", "ai_dataset", "ai_trace", "prompt_template"];
7767
7759
  }, {
7768
7760
  readonly id: "automation";
@@ -10097,7 +10089,8 @@ interface DesignSprintProperties {
10097
10089
 
10098
10090
  /**
10099
10091
  * UPG Property Schemas: Validation Domain.
10100
- * Hypothesis, Experiment, Learning, TestPlan, Evidence, ResearchPlan.
10092
+ * Hypothesis, ExperimentPlan, Experiment, ExperimentRun, Learning, Evidence,
10093
+ * ResearchPlan. (`test_plan` re-homed to the QA/testing domain — UPG-678.)
10101
10094
  * https://unifiedproductgraph.org/spec | MIT
10102
10095
  */
10103
10096
 
@@ -10170,16 +10163,15 @@ interface HypothesisEvidenceProperties {
10170
10163
  /** ISO date observed. */
10171
10164
  observed_at?: ISODate;
10172
10165
  }
10173
- /** A structured activity designed to test a hypothesis.
10174
- *
10175
- * `experiment` is canonical-stable. Split into `experiment_plan` + `experiment_run`
10176
- * in v0.2.6 for teams needing fine-grained plan/run separation, then re-promoted
10177
- * as the general-purpose option. The plan/run split remains the fine-grained
10178
- * alternative, not a replacement.
10166
+ /** A structured test designed to validate a hypothesis. The canonical unit of
10167
+ * a test.
10179
10168
  *
10180
- * Use `experiment` for a single entity capturing method, dates, and outcome.
10181
- * Use `experiment_plan` + `experiment_run` when lifecycle separation between
10182
- * planning and execution matters to your workflow.
10169
+ * `experiment` is canonical-stable and the spine of the validation chain
10170
+ * `hypothesis → experiment_plan → experiment → experiment_run`: the
10171
+ * `experiment_plan` is the validation design, the `experiment` is the
10172
+ * structured test it produces, and the optional `experiment_run` child captures
10173
+ * the multi-run / replication case (longitudinal or replicated tests). For a
10174
+ * single everyday A/B test, `experiment` alone (with its plan) suffices.
10183
10175
  *
10184
10176
  * @example
10185
10177
  * const properties: ExperimentProperties = {
@@ -10204,21 +10196,22 @@ interface ExperimentProperties {
10204
10196
  /** Observed change in the primary metric */
10205
10197
  actual_lift?: number;
10206
10198
  }
10207
- /** Planning intent for a structured test of a hypothesis (UCS pattern P4: work-unit).
10199
+ /** The validation PLAN: the design for a structured test of a hypothesis
10200
+ * (UCS pattern P4: work-unit).
10208
10201
  *
10209
- * Plan-shape fields only: method, success criteria, target metric, projected
10210
- * reach/impact, ownership, intended dates. Once approved and an actual run
10211
- * begins, an `experiment_run` links back via
10212
- * `experiment_plan_ran_as_experiment_run`.
10213
- *
10214
- * Pairs with `experiment_run` (UCS pattern P6: event-occurrence). Replaces the
10215
- * deprecated `experiment` type along with `experiment_run` (v0.2.6 split 1).
10202
+ * `experiment_plan` is the canonical validation plan type (graduated
10203
+ * `proposed → stable` in UPG-664). It carries the plan-shape fields — method,
10204
+ * success criteria, sample size, projected reach/impact, intended dates — and
10205
+ * designs the `experiment` it produces (`experiment_plan_designs_experiment`).
10206
+ * It absorbed `test_plan`'s planning properties when `test_plan` re-homed to
10207
+ * the QA/testing domain (UPG-678): `test_plan` is now the QA
10208
+ * verification-procedure plan, not a validation-planning artefact.
10216
10209
  *
10217
10210
  * @example
10218
10211
  * const plan: ExperimentPlanProperties = {
10219
10212
  * method: 'a_b_test',
10220
10213
  * success_criteria: 'Day-7 activation rate +5% lift, p<0.05',
10221
- * target_metric_id: 'mtr_day7_activation',
10214
+ * sample_size: 4000,
10222
10215
  * projected_reach: { value: 4, scale: 'reach_5', evidence: 'Cohort sizing' },
10223
10216
  * confidence: { value: 3, scale: 'confidence_5' },
10224
10217
  * planned_start_date: '2026-05-01',
@@ -10230,6 +10223,12 @@ interface ExperimentPlanProperties {
10230
10223
  method?: 'a_b_test' | 'multivariate' | 'qual_interview' | 'prototype_test' | 'fake_door' | 'wizard_of_oz' | 'longitudinal';
10231
10224
  /** Plain-English description of "passing" */
10232
10225
  success_criteria?: string;
10226
+ /**
10227
+ * Targeted participants or observations for the planned test. Absorbed from
10228
+ * `test_plan` (UPG-678) when it re-homed to QA; the planning sample size now
10229
+ * lives on the validation plan.
10230
+ */
10231
+ sample_size?: number;
10233
10232
  /** Projected reach: how many people the run is expected to touch (UPGAssessment) */
10234
10233
  projected_reach?: UPGAssessment;
10235
10234
  /** Projected impact on the target metric (UPGAssessment) */
@@ -10245,13 +10244,11 @@ interface ExperimentPlanProperties {
10245
10244
  }
10246
10245
  /** Execution evidence for a structured test of a hypothesis (UCS pattern P6: event-occurrence).
10247
10246
  *
10248
- * Created when an `experiment_plan` actually starts collecting data. Run-shape
10249
- * fields only: actual dates, observed reach, outcome summary, severity of
10250
- * finding, learning, and disposition. Multiple runs may spawn from the same
10251
- * plan when re-executed; each run is its own event with its own evidence.
10252
- *
10253
- * Pairs with `experiment_plan` (UCS pattern P4: work-unit). Replaces the
10254
- * deprecated `experiment` type along with `experiment_plan` (v0.2.6 split 1).
10247
+ * The optional multi-run / replication child of `experiment` (UPG-664). A
10248
+ * single `experiment` produces one or more runs; each run is its own event
10249
+ * with its own dates, observed reach, outcome summary, severity of finding,
10250
+ * learning, and disposition. Use runs only when longitudinal or replicated
10251
+ * execution matters — an everyday single test needs only the `experiment`.
10255
10252
  *
10256
10253
  * @example
10257
10254
  * const run: ExperimentRunProperties = {
@@ -10314,28 +10311,6 @@ interface LearningProperties {
10314
10311
  /** Confidence impact on the parent hypothesis */
10315
10312
  confidence_impact?: 'strengthens' | 'weakens' | 'neutral';
10316
10313
  }
10317
- /** TestPlan entity.
10318
- *
10319
- * @example
10320
- * const properties: TestPlanProperties = {
10321
- * plan_type: 'usability',
10322
- * sample_size: 42,
10323
- * duration: '5 days',
10324
- * }
10325
- */
10326
- interface TestPlanProperties {
10327
- /** Test type */
10328
- plan_type?: 'usability' | 'concept' | 'ab_test' | 'beta' | 'smoke';
10329
- /** Participants or observations */
10330
- sample_size?: number;
10331
- /**
10332
- * Run duration.
10333
- * @example "2 weeks"
10334
- */
10335
- duration?: string;
10336
- /** Criteria determining whether the test passes */
10337
- success_criteria?: string;
10338
- }
10339
10314
  /** ResearchPlan entity.
10340
10315
  *
10341
10316
  * @example
@@ -10941,8 +10916,17 @@ interface SurveyResponseProperties {
10941
10916
  * https://unifiedproductgraph.org/spec | MIT
10942
10917
  */
10943
10918
 
10944
- /** Whether a journey maps current or future state */
10945
- type JourneyType = 'current_state' | 'future_state' | 'day_in_the_life' | 'service_blueprint';
10919
+ /** Whether a journey maps current or future state.
10920
+ *
10921
+ * BREAKING in v0.9.9 (UPG-675): the `'service_blueprint'` value is deprecated
10922
+ * and removed from the union. A service blueprint is a first-class
10923
+ * `service_blueprint` *entity* (in the customer_success domain), not a *type of*
10924
+ * `user_journey`. Migration: a `user_journey` carrying
10925
+ * `journey_type: 'service_blueprint'` should be re-modelled as a
10926
+ * `service_blueprint` node; drop the journey_type value (it no longer
10927
+ * type-checks). `current_state` / `future_state` / `day_in_the_life` are kept.
10928
+ */
10929
+ type JourneyType = 'current_state' | 'future_state' | 'day_in_the_life';
10946
10930
  /** User journey map.
10947
10931
  *
10948
10932
  * @example
@@ -11030,7 +11014,14 @@ interface JourneyStepProperties {
11030
11014
  * explicit `journey_step_precedes_journey_step` edge captures the chain.
11031
11015
  */
11032
11016
  step_order?: number;
11033
- /** Interaction touchpoint */
11017
+ /**
11018
+ * @deprecated since v0.9.9 (UPG-675). Touchpoints are modelled in two places,
11019
+ * neither of which is this string: the `touchpoint` *entity* is the
11020
+ * cross-channel customer-success layer (`touchpoint_occurs_in_journey_step`),
11021
+ * and `journey_action` is the in-product blueprint layer (the finest band of
11022
+ * a `journey_step`). Use one of those rather than a free-text string here.
11023
+ * Removed in a future major.
11024
+ */
11034
11025
  touchpoint?: string;
11035
11026
  /** Channel (e.g. "web", "email", "in-store") */
11036
11027
  channel?: string;
@@ -13344,11 +13335,40 @@ interface InfrastructureComponentProperties {
13344
13335
 
13345
13336
  /**
13346
13337
  * UPG Property Schemas: QA & Testing Domain.
13347
- * TestSuite, TestCase, QaSession, RegressionTest, TestCoverageReport,
13338
+ * TestPlan, TestSuite, TestCase, QaSession, RegressionTest, TestCoverageReport,
13348
13339
  * TestEnvironment, TestResult.
13349
13340
  * https://unifiedproductgraph.org/spec | MIT
13350
13341
  */
13351
13342
 
13343
+ /** Test plan: the QA verification procedure for a product or release.
13344
+ *
13345
+ * Re-homed validation → QA in UPG-678. A `test_plan` defines HOW the team
13346
+ * verifies the software works — the scope under test, the environments it runs
13347
+ * in, the entry/exit (pass) criteria — and groups the `test_suite`s that carry
13348
+ * it out. Its former validation-planning role (designing an experiment for a
13349
+ * hypothesis) is now carried by `experiment_plan`.
13350
+ *
13351
+ * @example
13352
+ * const properties: TestPlanProperties = {
13353
+ * test_scope: 'Checkout, billing settlement, and refund flows.',
13354
+ * plan_type: 'release',
13355
+ * environments: ['staging', 'production_mirror'],
13356
+ * entry_criteria: 'Build deployed to staging; seed data loaded.',
13357
+ * pass_criteria: 'All P0/P1 suites green; no open blocker bugs.',
13358
+ * }
13359
+ */
13360
+ interface TestPlanProperties {
13361
+ /** What the plan covers (e.g. "checkout flow", "auth module", "release 2.4"). */
13362
+ test_scope?: string;
13363
+ /** Kind of verification effort this plan governs. */
13364
+ plan_type?: 'release' | 'regression' | 'integration' | 'acceptance' | 'smoke' | 'exploratory';
13365
+ /** Environments the plan exercises (mirrors `TestEnvironmentProperties.env_type`). */
13366
+ environments?: Array<'local' | 'ci' | 'staging' | 'sandbox' | 'production_mirror'>;
13367
+ /** Conditions that must hold before execution may begin. */
13368
+ entry_criteria?: string;
13369
+ /** Exit / pass criteria determining whether the plan succeeds. */
13370
+ pass_criteria?: string;
13371
+ }
13352
13372
  /** Test suite.
13353
13373
  *
13354
13374
  * @example
@@ -14357,7 +14377,8 @@ interface ReportProperties {
14357
14377
  /**
14358
14378
  * UPG Property Schemas: Content & Knowledge Domain.
14359
14379
  * ContentPiece, KnowledgeBaseArticle, BrandAsset, InternalDoc,
14360
- * PromptTemplate, ContentCalendar, ContentTheme, DocumentationTemplate, Document.
14380
+ * ContentCalendar, ContentTheme, DocumentationTemplate, Document.
14381
+ * (`PromptTemplate` moved to the AI domain file — UPG-665.)
14361
14382
  * https://unifiedproductgraph.org/spec | MIT
14362
14383
  */
14363
14384
 
@@ -14467,23 +14488,6 @@ interface DocumentProperties {
14467
14488
  /** Primary language (BCP 47 tag, e.g. "en", "en-GB", "fr") */
14468
14489
  language?: string;
14469
14490
  }
14470
- /** Prompt template.
14471
- *
14472
- * @example
14473
- * const properties: PromptTemplateProperties = {
14474
- * use_case: 'Kick off a discovery sprint with a fresh persona set.',
14475
- * variables: ['user_name', 'workspace_slug', 'cta_url'],
14476
- * version: '0.3.1',
14477
- * }
14478
- */
14479
- interface PromptTemplateProperties {
14480
- /** Intended use case for the prompt */
14481
- use_case?: string;
14482
- /** Variable names expected by the template */
14483
- variables?: string[];
14484
- /** Version identifier of the template */
14485
- version?: string;
14486
- }
14487
14491
  /** Content calendar.
14488
14492
  *
14489
14493
  * @example
@@ -15168,9 +15172,10 @@ interface StatusReportProperties {
15168
15172
 
15169
15173
  /**
15170
15174
  * UPG Property Schemas: AI & ML Domain.
15171
- * AiModel, PromptVersion, EvalBenchmark, EvalRun, AiCostTracker,
15172
- * HallucinationReport, AiGuardrail, ModelComparison, AiExperiment,
15173
- * AiDataset, AiTrace.
15175
+ * AiModel, PromptTemplate, PromptVersion, EvalBenchmark, EvalRun,
15176
+ * AiCostTracker, HallucinationReport, AiGuardrail, ModelComparison,
15177
+ * AiExperiment, AiDataset, AiTrace.
15178
+ * Creation order: ai_model → prompt_template → prompt_version (UPG-665).
15174
15179
  * https://unifiedproductgraph.org/spec | MIT
15175
15180
  */
15176
15181
 
@@ -15209,6 +15214,27 @@ interface AiModelProperties {
15209
15214
  /** Free-form classification tags */
15210
15215
  tags?: string[];
15211
15216
  }
15217
+ /** Prompt template.
15218
+ *
15219
+ * The canonical parent of `prompt_version` (UPG-665): a template contains its
15220
+ * versions the way a file contains its commits. Lives in the AI domain, owned
15221
+ * by the `ai_model` that defines it (ai_model → prompt_template → prompt_version).
15222
+ *
15223
+ * @example
15224
+ * const properties: PromptTemplateProperties = {
15225
+ * use_case: 'Kick off a discovery sprint with a fresh persona set.',
15226
+ * variables: ['user_name', 'workspace_slug', 'cta_url'],
15227
+ * version: '0.3.1',
15228
+ * }
15229
+ */
15230
+ interface PromptTemplateProperties {
15231
+ /** Intended use case for the prompt */
15232
+ use_case?: string;
15233
+ /** Variable names expected by the template */
15234
+ variables?: string[];
15235
+ /** Version identifier of the template */
15236
+ version?: string;
15237
+ }
15212
15238
  /** Prompt version.
15213
15239
  *
15214
15240
  * @example
@@ -17115,6 +17141,7 @@ interface ServiceLevelAgreementProperties {
17115
17141
  * @example
17116
17142
  * const properties: CustomerJourneyStageProperties = {
17117
17143
  * stage_type: 'awareness',
17144
+ * stage_order: 0,
17118
17145
  * avg_duration: '45m',
17119
17146
  * conversion_rate: 0.08,
17120
17147
  * }
@@ -17122,6 +17149,13 @@ interface ServiceLevelAgreementProperties {
17122
17149
  interface CustomerJourneyStageProperties {
17123
17150
  /** Which pirate metric (AAARRR) this stage maps to */
17124
17151
  stage_type?: 'awareness' | 'acquisition' | 'activation' | 'retention' | 'revenue' | 'referral';
17152
+ /**
17153
+ * Display order along the lifecycle timeline (0-indexed). The `*_order`
17154
+ * convention shared with `journey_phase.phase_order` and
17155
+ * `journey_step.step_order` (UPG-675 / CS-8), so two same-`stage_type` stages
17156
+ * are orderable.
17157
+ */
17158
+ stage_order?: number;
17125
17159
  /** Average time a customer spends in this stage */
17126
17160
  avg_duration?: string;
17127
17161
  /** Percentage of customers who advance to the next stage */
@@ -17131,14 +17165,18 @@ interface CustomerJourneyStageProperties {
17131
17165
  *
17132
17166
  * @example
17133
17167
  * const properties: TouchpointProperties = {
17134
- * touchpoint_channel: 'in-product',
17168
+ * touchpoint_channel: 'in_app',
17135
17169
  * touchpoint_type: 'reactive',
17136
17170
  * satisfaction_score: 42,
17137
17171
  * }
17138
17172
  */
17139
17173
  interface TouchpointProperties {
17140
- /** Channel where the interaction occurs (e.g. "email", "in-app", "call") */
17141
- touchpoint_channel?: string;
17174
+ /**
17175
+ * Medium (modality) of the interaction: how it physically happens. Distinct
17176
+ * from a go-to-market *channel* (`marketing_channel`/`acquisition_channel`/
17177
+ * `distribution_channel`), which are market routes, not interaction media. (UPG-679)
17178
+ */
17179
+ touchpoint_channel?: 'in_app' | 'email' | 'phone' | 'chat' | 'sms' | 'in_person' | 'mail';
17142
17180
  /** Whether the touchpoint is initiated by the customer, CSM, or system */
17143
17181
  touchpoint_type?: 'reactive' | 'proactive' | 'automated';
17144
17182
  /** Customer satisfaction score for this touchpoint */
@@ -18337,7 +18375,7 @@ type UPGNode<T extends keyof UPGPropertyMap = keyof UPGPropertyMap> = UPGBaseNod
18337
18375
  * AUTO-GENERATED by scripts/generate-property-registry.ts
18338
18376
  * Do not edit manually. Run: npx tsx scripts/generate-property-registry.ts
18339
18377
  *
18340
- * Generated: 2026-06-10T00:33:26.360Z
18378
+ * Generated: 2026-06-10T09:09:38.050Z
18341
18379
  * Entity types with properties: 316
18342
18380
  */
18343
18381
  interface PropertyDefinition {
@@ -20778,7 +20816,7 @@ declare function isCanonical(text: string): boolean;
20778
20816
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
20779
20817
  * The `check:version-lockstep` gate enforces this at release time.
20780
20818
  */
20781
- declare const UPG_VERSION: "0.9.7";
20819
+ declare const UPG_VERSION: "0.9.9";
20782
20820
  /**
20783
20821
  * The `.upg` JSON document format version. Written to the `upg_version` field.
20784
20822
  * Evolves independently from `UPG_VERSION` (the catalogue version).