@unified-product-graph/core 0.23.1 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1476,6 +1476,7 @@ declare const UPG_EDGE_CATALOG: {
1476
1476
  classification: "hierarchy";
1477
1477
  source_type: string;
1478
1478
  target_type: string;
1479
+ cross_product_eligible: true;
1479
1480
  };
1480
1481
  epic_affected_by_bug: {
1481
1482
  forward_verb: string;
@@ -1483,6 +1484,7 @@ declare const UPG_EDGE_CATALOG: {
1483
1484
  classification: "hierarchy";
1484
1485
  source_type: string;
1485
1486
  target_type: string;
1487
+ cross_product_eligible: true;
1486
1488
  };
1487
1489
  task_has_subtask: {
1488
1490
  forward_verb: string;
@@ -7641,6 +7643,120 @@ declare const UPG_EDGE_CATALOG: {
7641
7643
  cross_product_eligible: true;
7642
7644
  deliberate_only: true;
7643
7645
  };
7646
+ deal_involves_contact: {
7647
+ forward_verb: string;
7648
+ reverse_verb: string;
7649
+ classification: "semantic";
7650
+ source_type: string;
7651
+ target_type: string;
7652
+ };
7653
+ deal_challenged_by_objection: {
7654
+ forward_verb: string;
7655
+ reverse_verb: string;
7656
+ classification: "cross-domain";
7657
+ source_type: string;
7658
+ target_type: string;
7659
+ };
7660
+ deal_armed_with_competitive_battle_card: {
7661
+ forward_verb: string;
7662
+ reverse_verb: string;
7663
+ classification: "cross-domain";
7664
+ source_type: string;
7665
+ target_type: string;
7666
+ };
7667
+ deal_lost_to_competitor: {
7668
+ forward_verb: string;
7669
+ reverse_verb: string;
7670
+ classification: "causal";
7671
+ source_type: string;
7672
+ target_type: string;
7673
+ };
7674
+ deal_closed_via_contract: {
7675
+ forward_verb: string;
7676
+ reverse_verb: string;
7677
+ classification: "cross-domain";
7678
+ source_type: string;
7679
+ target_type: string;
7680
+ };
7681
+ deal_blocked_by_feature: {
7682
+ forward_verb: string;
7683
+ reverse_verb: string;
7684
+ classification: "cross-domain";
7685
+ source_type: string;
7686
+ target_type: string;
7687
+ cross_product_eligible: true;
7688
+ };
7689
+ research_study_analyzes_deal: {
7690
+ forward_verb: string;
7691
+ reverse_verb: string;
7692
+ classification: "cross-domain";
7693
+ source_type: string;
7694
+ target_type: string;
7695
+ cross_product_eligible: true;
7696
+ };
7697
+ account_raises_support_ticket: {
7698
+ forward_verb: string;
7699
+ reverse_verb: string;
7700
+ classification: "cross-domain";
7701
+ source_type: string;
7702
+ target_type: string;
7703
+ };
7704
+ account_health_scored_via_customer_health_score: {
7705
+ forward_verb: string;
7706
+ reverse_verb: string;
7707
+ classification: "cross-domain";
7708
+ source_type: string;
7709
+ target_type: string;
7710
+ };
7711
+ account_lost_because_churn_reason: {
7712
+ forward_verb: string;
7713
+ reverse_verb: string;
7714
+ classification: "cross-domain";
7715
+ source_type: string;
7716
+ target_type: string;
7717
+ };
7718
+ account_implements_via_project: {
7719
+ forward_verb: string;
7720
+ reverse_verb: string;
7721
+ classification: "cross-domain";
7722
+ source_type: string;
7723
+ target_type: string;
7724
+ };
7725
+ subscription_renews_via_deal: {
7726
+ forward_verb: string;
7727
+ reverse_verb: string;
7728
+ classification: "causal";
7729
+ source_type: string;
7730
+ target_type: string;
7731
+ };
7732
+ account_participates_in_beta_program: {
7733
+ forward_verb: string;
7734
+ reverse_verb: string;
7735
+ classification: "cross-domain";
7736
+ source_type: string;
7737
+ target_type: string;
7738
+ };
7739
+ deal_gated_by_security_review: {
7740
+ forward_verb: string;
7741
+ reverse_verb: string;
7742
+ classification: "cross-domain";
7743
+ source_type: string;
7744
+ target_type: string;
7745
+ };
7746
+ feature_communicated_via_messaging: {
7747
+ forward_verb: string;
7748
+ reverse_verb: string;
7749
+ classification: "cross-domain";
7750
+ source_type: string;
7751
+ target_type: string;
7752
+ };
7753
+ launch_coordinated_via_project: {
7754
+ forward_verb: string;
7755
+ reverse_verb: string;
7756
+ classification: "cross-domain";
7757
+ source_type: string;
7758
+ target_type: string;
7759
+ };
7644
7760
  };
7645
7761
  /** The `UPGEdgeType` union derived from the registry above. Declared here (not
7646
7762
  * in `shapes/edges.ts`) so the polymorphic list below can reference it
@@ -11843,6 +11959,18 @@ interface EmptyCell {
11843
11959
  * const properties: ClassificationAxisProperties = {
11844
11960
  * axis_kind: 'categorical',
11845
11961
  * }
11962
+ *
11963
+ * @example
11964
+ * // Canonical governance axis `change_blast_radius` (ordinal): grade a change /
11965
+ * // feature / decision by how much risk it carries, so review ceremony and
11966
+ * // agent-autonomy gating scale with reach. Four ordered values —
11967
+ * // Trivial(0) < Standard(1) < Significant(2) < Critical(3) — classified via the
11968
+ * // polymorphic `node_classified_as_classification_value` edge. Report metrics
11969
+ * // WITHIN tier (pooling across tiers is Simpson's-paradox bait). See
11970
+ * // decisions/2026-07-15-change-blast-radius-axis.md.
11971
+ * const properties: ClassificationAxisProperties = {
11972
+ * axis_kind: 'ordinal',
11973
+ * }
11846
11974
  */
11847
11975
  interface ClassificationAxisProperties {
11848
11976
  /**
@@ -17496,8 +17624,10 @@ interface PositioningProperties {
17496
17624
  * }
17497
17625
  */
17498
17626
  interface MessagingProperties {
17499
- /** Channel this messaging variant is crafted for */
17500
- channel?: 'landing_page' | 'email' | 'social' | 'ad' | 'pitch' | 'press' | 'in_product' | 'other';
17627
+ /** Channel this messaging variant is crafted for. `enablement` is the internal
17628
+ * field-ops channel (SE/PMM/SA enablement one-pagers, battlecards' narrative),
17629
+ * distinct from `pitch` (external, customer-facing). */
17630
+ channel?: 'landing_page' | 'email' | 'social' | 'ad' | 'pitch' | 'press' | 'in_product' | 'enablement' | 'other';
17501
17631
  /** Marketing funnel stage this variant targets */
17502
17632
  funnel_stage?: 'awareness' | 'consideration' | 'conversion' | 'retention';
17503
17633
  /** Primary headline or hook */
@@ -17786,6 +17916,26 @@ interface AccountProperties {
17786
17916
  industry?: string;
17787
17917
  /** Number of employees at the account */
17788
17918
  employee_count?: number;
17919
+ /**
17920
+ * Go-to-market tier this account is served at. A segmentation *decision*
17921
+ * (how the field org treats the account), distinct from `employee_count`
17922
+ * (a raw fact) and aligned with but not identical to the ideal customer
17923
+ * profile's `company_size` buckets. `strategic` is the tier that escalates
17924
+ * to a dedicated account-plan graph (Tier 3 client model).
17925
+ */
17926
+ segment?: 'smb' | 'mid_market' | 'enterprise' | 'strategic';
17927
+ /**
17928
+ * Annual contract value in the account's billing currency. The single most
17929
+ * common enterprise account-tiering input; a snapshot that changes on
17930
+ * expansion or renewal.
17931
+ */
17932
+ annual_contract_value?: number;
17933
+ /**
17934
+ * Geographic region the account is managed in (e.g. "EMEA", "NA-West").
17935
+ * Free-form: territory taxonomies vary by org and are modelled structurally
17936
+ * via the `territory` entity when they need to be queryable.
17937
+ */
17938
+ region?: string;
17789
17939
  }
17790
17940
  /** Contact.
17791
17941
  *
@@ -17799,6 +17949,15 @@ interface ContactProperties {
17799
17949
  contact_role?: string;
17800
17950
  /** Whether this person has purchasing authority */
17801
17951
  is_decision_maker?: boolean;
17952
+ /**
17953
+ * Role this contact plays in the buying committee (the decision-making unit).
17954
+ * The substrate of enterprise multi-threading and of qualification frameworks
17955
+ * (MEDDICC/SPICED): a deal with no `champion` and no `economic_buyer` mapped is
17956
+ * single-threaded and at risk. `is_decision_maker` becomes largely derivable
17957
+ * (`buying_role = economic_buyer`) but is kept for back-compat.
17958
+ * @example 'economic_buyer'
17959
+ */
17960
+ buying_role?: 'champion' | 'economic_buyer' | 'technical_evaluator' | 'end_user' | 'detractor' | 'influencer' | 'procurement' | 'legal' | 'security';
17802
17961
  }
17803
17962
  /** Lead.
17804
17963
  *
@@ -17834,6 +17993,45 @@ interface DealProperties {
17834
17993
  close_date?: ISODate;
17835
17994
  /** Likelihood of closing (0-100%) */
17836
17995
  probability?: number;
17996
+ /**
17997
+ * Terminal result of the deal. An Event-axis outcome (the verdict on a
17998
+ * one-time event), NOT a lifecycle phase, so it is `deal_outcome` and not
17999
+ * `deal_status` per the status-convention Rule 3. Lifecycle (open/won/lost as
18000
+ * phases) belongs on the base `status` slot; this records the win/loss verdict
18001
+ * a closed deal carries and gives `deal_lost_to_competitor` / win-loss study
18002
+ * derivations their anchor.
18003
+ * @example 'won'
18004
+ */
18005
+ deal_outcome?: 'won' | 'lost' | 'no_decision';
18006
+ /**
18007
+ * Motion this deal belongs to. Mirrors `PipelineSales.pipeline_type` at the
18008
+ * deal grain; `renewal` is the value `subscription_renews_via_deal` points at.
18009
+ * @example 'expansion'
18010
+ */
18011
+ deal_type?: 'new_business' | 'expansion' | 'renewal';
18012
+ /**
18013
+ * The single most-used CRM field: the next concrete action to move the deal.
18014
+ * Free text on purpose (a coordination note, not a structured task).
18015
+ * @example 'Send security questionnaire to procurement'
18016
+ */
18017
+ next_step?: string;
18018
+ /** When the `next_step` is due (ISO format). */
18019
+ next_step_date?: ISODate;
18020
+ /**
18021
+ * Qualification framework this deal is scored against. Names the rubric so the
18022
+ * `qualification_score` is interpretable; per-pillar booleans (MEDDICC's Metrics /
18023
+ * Economic buyer / Decision criteria / …) are deferred until `custom` recurrence
18024
+ * proves the demand.
18025
+ * @example 'meddicc'
18026
+ */
18027
+ qualification_framework?: 'meddicc' | 'bant' | 'spiced' | 'custom';
18028
+ /**
18029
+ * How well-qualified the deal is, on the canonical `confidence_5` scale
18030
+ * (UPGAssessment: numeric value plus a high/medium/low label). Coarse by
18031
+ * design; the granular per-pillar breakdown is deferred (see
18032
+ * `qualification_framework`).
18033
+ */
18034
+ qualification_score?: UPGAssessment;
17837
18035
  }
17838
18036
  /** Sales pipeline.
17839
18037
  *
@@ -22540,7 +22738,7 @@ declare function isCanonical(text: string): boolean;
22540
22738
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
22541
22739
  * The `check:version-lockstep` gate enforces this at release time.
22542
22740
  */
22543
- declare const UPG_VERSION: "0.23.1";
22741
+ declare const UPG_VERSION: "0.24.0";
22544
22742
  /**
22545
22743
  * The `.upg` JSON document format version. Written to the `upg_version` field.
22546
22744
  * Evolves independently from `UPG_VERSION` (the catalogue version).
package/dist/index.d.ts CHANGED
@@ -1476,6 +1476,7 @@ declare const UPG_EDGE_CATALOG: {
1476
1476
  classification: "hierarchy";
1477
1477
  source_type: string;
1478
1478
  target_type: string;
1479
+ cross_product_eligible: true;
1479
1480
  };
1480
1481
  epic_affected_by_bug: {
1481
1482
  forward_verb: string;
@@ -1483,6 +1484,7 @@ declare const UPG_EDGE_CATALOG: {
1483
1484
  classification: "hierarchy";
1484
1485
  source_type: string;
1485
1486
  target_type: string;
1487
+ cross_product_eligible: true;
1486
1488
  };
1487
1489
  task_has_subtask: {
1488
1490
  forward_verb: string;
@@ -7641,6 +7643,120 @@ declare const UPG_EDGE_CATALOG: {
7641
7643
  cross_product_eligible: true;
7642
7644
  deliberate_only: true;
7643
7645
  };
7646
+ deal_involves_contact: {
7647
+ forward_verb: string;
7648
+ reverse_verb: string;
7649
+ classification: "semantic";
7650
+ source_type: string;
7651
+ target_type: string;
7652
+ };
7653
+ deal_challenged_by_objection: {
7654
+ forward_verb: string;
7655
+ reverse_verb: string;
7656
+ classification: "cross-domain";
7657
+ source_type: string;
7658
+ target_type: string;
7659
+ };
7660
+ deal_armed_with_competitive_battle_card: {
7661
+ forward_verb: string;
7662
+ reverse_verb: string;
7663
+ classification: "cross-domain";
7664
+ source_type: string;
7665
+ target_type: string;
7666
+ };
7667
+ deal_lost_to_competitor: {
7668
+ forward_verb: string;
7669
+ reverse_verb: string;
7670
+ classification: "causal";
7671
+ source_type: string;
7672
+ target_type: string;
7673
+ };
7674
+ deal_closed_via_contract: {
7675
+ forward_verb: string;
7676
+ reverse_verb: string;
7677
+ classification: "cross-domain";
7678
+ source_type: string;
7679
+ target_type: string;
7680
+ };
7681
+ deal_blocked_by_feature: {
7682
+ forward_verb: string;
7683
+ reverse_verb: string;
7684
+ classification: "cross-domain";
7685
+ source_type: string;
7686
+ target_type: string;
7687
+ cross_product_eligible: true;
7688
+ };
7689
+ research_study_analyzes_deal: {
7690
+ forward_verb: string;
7691
+ reverse_verb: string;
7692
+ classification: "cross-domain";
7693
+ source_type: string;
7694
+ target_type: string;
7695
+ cross_product_eligible: true;
7696
+ };
7697
+ account_raises_support_ticket: {
7698
+ forward_verb: string;
7699
+ reverse_verb: string;
7700
+ classification: "cross-domain";
7701
+ source_type: string;
7702
+ target_type: string;
7703
+ };
7704
+ account_health_scored_via_customer_health_score: {
7705
+ forward_verb: string;
7706
+ reverse_verb: string;
7707
+ classification: "cross-domain";
7708
+ source_type: string;
7709
+ target_type: string;
7710
+ };
7711
+ account_lost_because_churn_reason: {
7712
+ forward_verb: string;
7713
+ reverse_verb: string;
7714
+ classification: "cross-domain";
7715
+ source_type: string;
7716
+ target_type: string;
7717
+ };
7718
+ account_implements_via_project: {
7719
+ forward_verb: string;
7720
+ reverse_verb: string;
7721
+ classification: "cross-domain";
7722
+ source_type: string;
7723
+ target_type: string;
7724
+ };
7725
+ subscription_renews_via_deal: {
7726
+ forward_verb: string;
7727
+ reverse_verb: string;
7728
+ classification: "causal";
7729
+ source_type: string;
7730
+ target_type: string;
7731
+ };
7732
+ account_participates_in_beta_program: {
7733
+ forward_verb: string;
7734
+ reverse_verb: string;
7735
+ classification: "cross-domain";
7736
+ source_type: string;
7737
+ target_type: string;
7738
+ };
7739
+ deal_gated_by_security_review: {
7740
+ forward_verb: string;
7741
+ reverse_verb: string;
7742
+ classification: "cross-domain";
7743
+ source_type: string;
7744
+ target_type: string;
7745
+ };
7746
+ feature_communicated_via_messaging: {
7747
+ forward_verb: string;
7748
+ reverse_verb: string;
7749
+ classification: "cross-domain";
7750
+ source_type: string;
7751
+ target_type: string;
7752
+ };
7753
+ launch_coordinated_via_project: {
7754
+ forward_verb: string;
7755
+ reverse_verb: string;
7756
+ classification: "cross-domain";
7757
+ source_type: string;
7758
+ target_type: string;
7759
+ };
7644
7760
  };
7645
7761
  /** The `UPGEdgeType` union derived from the registry above. Declared here (not
7646
7762
  * in `shapes/edges.ts`) so the polymorphic list below can reference it
@@ -11843,6 +11959,18 @@ interface EmptyCell {
11843
11959
  * const properties: ClassificationAxisProperties = {
11844
11960
  * axis_kind: 'categorical',
11845
11961
  * }
11962
+ *
11963
+ * @example
11964
+ * // Canonical governance axis `change_blast_radius` (ordinal): grade a change /
11965
+ * // feature / decision by how much risk it carries, so review ceremony and
11966
+ * // agent-autonomy gating scale with reach. Four ordered values —
11967
+ * // Trivial(0) < Standard(1) < Significant(2) < Critical(3) — classified via the
11968
+ * // polymorphic `node_classified_as_classification_value` edge. Report metrics
11969
+ * // WITHIN tier (pooling across tiers is Simpson's-paradox bait). See
11970
+ * // decisions/2026-07-15-change-blast-radius-axis.md.
11971
+ * const properties: ClassificationAxisProperties = {
11972
+ * axis_kind: 'ordinal',
11973
+ * }
11846
11974
  */
11847
11975
  interface ClassificationAxisProperties {
11848
11976
  /**
@@ -17496,8 +17624,10 @@ interface PositioningProperties {
17496
17624
  * }
17497
17625
  */
17498
17626
  interface MessagingProperties {
17499
- /** Channel this messaging variant is crafted for */
17500
- channel?: 'landing_page' | 'email' | 'social' | 'ad' | 'pitch' | 'press' | 'in_product' | 'other';
17627
+ /** Channel this messaging variant is crafted for. `enablement` is the internal
17628
+ * field-ops channel (SE/PMM/SA enablement one-pagers, battlecards' narrative),
17629
+ * distinct from `pitch` (external, customer-facing). */
17630
+ channel?: 'landing_page' | 'email' | 'social' | 'ad' | 'pitch' | 'press' | 'in_product' | 'enablement' | 'other';
17501
17631
  /** Marketing funnel stage this variant targets */
17502
17632
  funnel_stage?: 'awareness' | 'consideration' | 'conversion' | 'retention';
17503
17633
  /** Primary headline or hook */
@@ -17786,6 +17916,26 @@ interface AccountProperties {
17786
17916
  industry?: string;
17787
17917
  /** Number of employees at the account */
17788
17918
  employee_count?: number;
17919
+ /**
17920
+ * Go-to-market tier this account is served at. A segmentation *decision*
17921
+ * (how the field org treats the account), distinct from `employee_count`
17922
+ * (a raw fact) and aligned with but not identical to the ideal customer
17923
+ * profile's `company_size` buckets. `strategic` is the tier that escalates
17924
+ * to a dedicated account-plan graph (Tier 3 client model).
17925
+ */
17926
+ segment?: 'smb' | 'mid_market' | 'enterprise' | 'strategic';
17927
+ /**
17928
+ * Annual contract value in the account's billing currency. The single most
17929
+ * common enterprise account-tiering input; a snapshot that changes on
17930
+ * expansion or renewal.
17931
+ */
17932
+ annual_contract_value?: number;
17933
+ /**
17934
+ * Geographic region the account is managed in (e.g. "EMEA", "NA-West").
17935
+ * Free-form: territory taxonomies vary by org and are modelled structurally
17936
+ * via the `territory` entity when they need to be queryable.
17937
+ */
17938
+ region?: string;
17789
17939
  }
17790
17940
  /** Contact.
17791
17941
  *
@@ -17799,6 +17949,15 @@ interface ContactProperties {
17799
17949
  contact_role?: string;
17800
17950
  /** Whether this person has purchasing authority */
17801
17951
  is_decision_maker?: boolean;
17952
+ /**
17953
+ * Role this contact plays in the buying committee (the decision-making unit).
17954
+ * The substrate of enterprise multi-threading and of qualification frameworks
17955
+ * (MEDDICC/SPICED): a deal with no `champion` and no `economic_buyer` mapped is
17956
+ * single-threaded and at risk. `is_decision_maker` becomes largely derivable
17957
+ * (`buying_role = economic_buyer`) but is kept for back-compat.
17958
+ * @example 'economic_buyer'
17959
+ */
17960
+ buying_role?: 'champion' | 'economic_buyer' | 'technical_evaluator' | 'end_user' | 'detractor' | 'influencer' | 'procurement' | 'legal' | 'security';
17802
17961
  }
17803
17962
  /** Lead.
17804
17963
  *
@@ -17834,6 +17993,45 @@ interface DealProperties {
17834
17993
  close_date?: ISODate;
17835
17994
  /** Likelihood of closing (0-100%) */
17836
17995
  probability?: number;
17996
+ /**
17997
+ * Terminal result of the deal. An Event-axis outcome (the verdict on a
17998
+ * one-time event), NOT a lifecycle phase, so it is `deal_outcome` and not
17999
+ * `deal_status` per the status-convention Rule 3. Lifecycle (open/won/lost as
18000
+ * phases) belongs on the base `status` slot; this records the win/loss verdict
18001
+ * a closed deal carries and gives `deal_lost_to_competitor` / win-loss study
18002
+ * derivations their anchor.
18003
+ * @example 'won'
18004
+ */
18005
+ deal_outcome?: 'won' | 'lost' | 'no_decision';
18006
+ /**
18007
+ * Motion this deal belongs to. Mirrors `PipelineSales.pipeline_type` at the
18008
+ * deal grain; `renewal` is the value `subscription_renews_via_deal` points at.
18009
+ * @example 'expansion'
18010
+ */
18011
+ deal_type?: 'new_business' | 'expansion' | 'renewal';
18012
+ /**
18013
+ * The single most-used CRM field: the next concrete action to move the deal.
18014
+ * Free text on purpose (a coordination note, not a structured task).
18015
+ * @example 'Send security questionnaire to procurement'
18016
+ */
18017
+ next_step?: string;
18018
+ /** When the `next_step` is due (ISO format). */
18019
+ next_step_date?: ISODate;
18020
+ /**
18021
+ * Qualification framework this deal is scored against. Names the rubric so the
18022
+ * `qualification_score` is interpretable; per-pillar booleans (MEDDICC's Metrics /
18023
+ * Economic buyer / Decision criteria / …) are deferred until `custom` recurrence
18024
+ * proves the demand.
18025
+ * @example 'meddicc'
18026
+ */
18027
+ qualification_framework?: 'meddicc' | 'bant' | 'spiced' | 'custom';
18028
+ /**
18029
+ * How well-qualified the deal is, on the canonical `confidence_5` scale
18030
+ * (UPGAssessment: numeric value plus a high/medium/low label). Coarse by
18031
+ * design; the granular per-pillar breakdown is deferred (see
18032
+ * `qualification_framework`).
18033
+ */
18034
+ qualification_score?: UPGAssessment;
17837
18035
  }
17838
18036
  /** Sales pipeline.
17839
18037
  *
@@ -22540,7 +22738,7 @@ declare function isCanonical(text: string): boolean;
22540
22738
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
22541
22739
  * The `check:version-lockstep` gate enforces this at release time.
22542
22740
  */
22543
- declare const UPG_VERSION: "0.23.1";
22741
+ declare const UPG_VERSION: "0.24.0";
22544
22742
  /**
22545
22743
  * The `.upg` JSON document format version. Written to the `upg_version` field.
22546
22744
  * Evolves independently from `UPG_VERSION` (the catalogue version).