@unified-product-graph/core 0.23.0 → 0.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -7597,6 +7597,14 @@ declare const UPG_EDGE_CATALOG: {
7597
7597
  target_type: string;
7598
7598
  cross_product_eligible: true;
7599
7599
  };
7600
+ dependency_resolved_by_objective: {
7601
+ forward_verb: string;
7602
+ reverse_verb: string;
7603
+ classification: "cross-domain";
7604
+ source_type: string;
7605
+ target_type: string;
7606
+ cross_product_eligible: true;
7607
+ };
7600
7608
  objective_raises_strategic_question: {
7601
7609
  forward_verb: string;
7602
7610
  reverse_verb: string;
@@ -8202,7 +8210,7 @@ interface UPGPortfolioDocument {
8202
8210
  /**
8203
8211
  * Legacy product-stage aliases (UPG-509 Part 2).
8204
8212
  *
8205
- * Existing graphs (`entopo.upg`, `sanity.upg`, `maximum-minimum.upg`,
8213
+ * Existing graphs (`entopo.upg`, `nimbus.upg`, `maximum-minimum.upg`,
8206
8214
  * `notion-saturated.upg`, etc.) carry `product.stage` values that pre-date
8207
8215
  * the canonical `UPGProductStage` enum
8208
8216
  * (`concept | validation | build | beta | launch | growth | mature |
@@ -8645,7 +8653,7 @@ declare const UPG_DOMAINS: readonly [{
8645
8653
  }, {
8646
8654
  readonly id: "foundations";
8647
8655
  readonly label: "Foundations";
8648
- readonly description: "The shared specifications and foundational primitives a product organisation stewards or implements everywhere. Specifications are governed specs (query languages, protocols, data formats, encodings) like GROQ or Portable Text; primitives are the compositional units those specs define (a block, a reference, a query value). Both are registry-hostable canonicals that products implement, expose, or conform to. Distinct from a product feature: a specification has no single owner, no P&L, and no buyer; it is the rulebook many products point at.";
8656
+ readonly description: "The shared specifications and foundational primitives a product organisation stewards or implements everywhere. Specifications are governed specs (query languages, protocols, data formats, encodings) like NQL or Structured Text; primitives are the compositional units those specs define (a block, a reference, a query value). Both are registry-hostable canonicals that products implement, expose, or conform to. Distinct from a product feature: a specification has no single owner, no P&L, and no buyer; it is the rulebook many products point at.";
8649
8657
  readonly types: readonly ["specification", "primitive", "operating_lifecycle", "operating_stage"];
8650
8658
  }];
8651
8659
  /**
@@ -9839,7 +9847,7 @@ declare function migrateEdge<T extends {
9839
9847
  * type's lifecycle exists but the graph carries pre-canonical status values
9840
9848
  * the lifecycle never had.
9841
9849
  *
9842
- * Source: live drift in `.upg/entopo.upg`, `.upg/sanity.upg`, and
9850
+ * Source: live drift in `.upg/entopo.upg`, `.upg/nimbus.upg`, and
9843
9851
  * `.upg/inkling.upg` surveyed during the v0.5 launch train (UPG-527).
9844
9852
  * Highest single drift class: 173 `service` nodes with `status: "active"`
9845
9853
  * against the canonical `[development, staging, production, deprecated]`
@@ -11466,7 +11474,7 @@ interface CompetitorProperties {
11466
11474
  /**
11467
11475
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11468
11476
  * an analyst report, or a research note.
11469
- * @example "https://www.contentful.com/pricing/"
11477
+ * @example "https://docs.larch.example/pricing/"
11470
11478
  */
11471
11479
  source?: string;
11472
11480
  /**
@@ -11518,7 +11526,7 @@ interface CompetitorFeatureProperties {
11518
11526
  /**
11519
11527
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11520
11528
  * an analyst report, or a research note.
11521
- * @example "https://www.contentful.com/changelog/"
11529
+ * @example "https://docs.larch.example/changelog/"
11522
11530
  */
11523
11531
  source?: string;
11524
11532
  /**
@@ -11640,7 +11648,7 @@ interface CompetitiveAnalysisProperties {
11640
11648
  *
11641
11649
  * @example
11642
11650
  * [
11643
- * { axis_a_value_ref: 'val-git-based', axis_b_value_ref: 'val-portable-text',
11651
+ * { axis_a_value_ref: 'val-git-based', axis_b_value_ref: 'val-structured-text',
11644
11652
  * rationale_kind: 'opportunity',
11645
11653
  * rationale_md: 'No technical reason; only adoption inertia. Watching brief.' },
11646
11654
  * { axis_a_value_ref: 'val-composable', axis_b_value_ref: 'val-wysiwyg',
@@ -11658,7 +11666,7 @@ interface CompetitiveAnalysisProperties {
11658
11666
  /**
11659
11667
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11660
11668
  * an analyst report, or a research note.
11661
- * @example "https://www.contentful.com/changelog/"
11669
+ * @example "https://docs.larch.example/changelog/"
11662
11670
  */
11663
11671
  source?: string;
11664
11672
  /**
@@ -11737,7 +11745,7 @@ interface CompetitorSignalProperties {
11737
11745
  /**
11738
11746
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11739
11747
  * an analyst report, or a research note.
11740
- * @example "https://www.contentful.com/changelog/"
11748
+ * @example "https://docs.larch.example/changelog/"
11741
11749
  */
11742
11750
  source?: string;
11743
11751
  /**
@@ -11865,14 +11873,14 @@ interface ClassificationAxisProperties {
11865
11873
  * @example
11866
11874
  * const properties: ClassificationValueProperties = {
11867
11875
  * rationale: 'Composable extends headless with three load-bearing commitments.',
11868
- * exemplars: ['Sanity', 'Contentful', 'Hygraph'],
11876
+ * exemplars: ['Nimbus', 'Larch', 'Prism'],
11869
11877
  * commitments: [
11870
11878
  * { name: 'Typed content graph', description: 'Schemas in code; references as edges.' },
11871
11879
  * { name: 'Real-time backend', description: 'Live queries, CRDT collaboration.' },
11872
11880
  * { name: 'Embeddable studio', description: 'Editor is a library hosted inside the team app.' },
11873
11881
  * ],
11874
11882
  * capabilities: [
11875
- * { surface: 'delivery', bullets: ['GROQ', 'GraphQL', 'REST', 'Live Content API'] },
11883
+ * { surface: 'delivery', bullets: ['NQL', 'GraphQL', 'REST', 'Live Sync API'] },
11876
11884
  * ],
11877
11885
  * }
11878
11886
  */
@@ -11885,7 +11893,7 @@ interface ClassificationValueProperties {
11885
11893
  /**
11886
11894
  * Free-text examples of products occupying this value.
11887
11895
  * For queryable occupancy, prefer `competitor` nodes with `classified_as` edges.
11888
- * @example ['Sanity', 'Contentful', 'Hygraph']
11896
+ * @example ['Nimbus', 'Larch', 'Prism']
11889
11897
  */
11890
11898
  exemplars?: string[];
11891
11899
  /**
@@ -11912,8 +11920,8 @@ interface ClassificationValueProperties {
11912
11920
  *
11913
11921
  * @example
11914
11922
  * [
11915
- * { surface: 'delivery', bullets: ['GROQ', 'GraphQL', 'REST', 'Live Content API', 'Asset CDN'] },
11916
- * { surface: 'extensibility', bullets: ['Custom input components', 'Studio plugins'] },
11923
+ * { surface: 'delivery', bullets: ['NQL', 'GraphQL', 'REST', 'Live Sync API', 'Asset CDN'] },
11924
+ * { surface: 'extensibility', bullets: ['Custom input components', 'editor plugins'] },
11917
11925
  * ]
11918
11926
  */
11919
11927
  capabilities?: Array<ClassificationCapability>;
@@ -18857,9 +18865,9 @@ interface FrameworkExerciseProperties {
18857
18865
  * kind: 'language',
18858
18866
  * language_flavor: 'query',
18859
18867
  * governance: 'open_spec_stewarded',
18860
- * steward: 'Sanity',
18868
+ * steward: 'Nimbus',
18861
18869
  * openness: 'open',
18862
- * spec_url: 'https://sanity.io/docs/groq',
18870
+ * spec_url: 'https://nimbus.example/docs/nql',
18863
18871
  * current_version: '1.0',
18864
18872
  * since: '2019',
18865
18873
  * }
@@ -18889,13 +18897,13 @@ interface SpecificationProperties {
18889
18897
  conformance?: string;
18890
18898
  }
18891
18899
  /** A foundational compositional unit a specification defines: the noun products
18892
- * pass around and compose with (a Portable Text block, a Sanity reference, a
18900
+ * pass around and compose with (a Structured Text block, a typed reference, a
18893
18901
  * Git commit, a Stripe PaymentIntent). Lifecycle-free, like `metric`.
18894
18902
  *
18895
18903
  * @example
18896
18904
  * const properties: PrimitiveProperties = {
18897
18905
  * primitive_kind: 'block',
18898
- * defined_by: 'specification/portable_text',
18906
+ * defined_by: 'specification/structured_text',
18899
18907
  * since: '2018',
18900
18908
  * }
18901
18909
  */
@@ -18908,7 +18916,7 @@ interface PrimitiveProperties {
18908
18916
  since?: string;
18909
18917
  }
18910
18918
  /** An operating_lifecycle: a canonical, ordered (often cyclic) operating process
18911
- * that many products' journey phases map onto — e.g. Sanity's content-operations
18919
+ * that many products' journey phases map onto — e.g. Nimbus's content-operations
18912
18920
  * lifecycle. Registry-hostable like a `specification`; the cross-product join key
18913
18921
  * that turns per-surface journeys into one operation. Distinct from the per-entity
18914
18922
  * status `lifecycle` grammar concept (this is an entity, not a state machine).
@@ -18916,13 +18924,13 @@ interface PrimitiveProperties {
18916
18924
  * @example
18917
18925
  * const properties: OperatingLifecycleProperties = {
18918
18926
  * cyclic: true,
18919
- * source: 'Sanity official 5-stage content-ops lifecycle',
18927
+ * source: 'a canonical 5-stage content-ops lifecycle',
18920
18928
  * }
18921
18929
  */
18922
18930
  interface OperatingLifecycleProperties {
18923
18931
  /** True if the process loops (e.g. Analyze → Extend → Plan). The sequence is fully expressed by the stages' `stage_order`; `cyclic` adds the wrap from the last stage back to the first. */
18924
18932
  cyclic?: boolean;
18925
- /** Origin of the canonical model (e.g. "Sanity official content-ops lifecycle"). Optional provenance; promote to an edge if it names a real `specification`/`document`. */
18933
+ /** Origin of the canonical model (e.g. "a published content-ops lifecycle"). Optional provenance; promote to an edge if it names a real `specification`/`document`. */
18926
18934
  source?: string;
18927
18935
  }
18928
18936
  /** An operating_stage: one ordered stage of an `operating_lifecycle`. A product's
@@ -22532,7 +22540,7 @@ declare function isCanonical(text: string): boolean;
22532
22540
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
22533
22541
  * The `check:version-lockstep` gate enforces this at release time.
22534
22542
  */
22535
- declare const UPG_VERSION: "0.23.0";
22543
+ declare const UPG_VERSION: "0.23.1";
22536
22544
  /**
22537
22545
  * The `.upg` JSON document format version. Written to the `upg_version` field.
22538
22546
  * Evolves independently from `UPG_VERSION` (the catalogue version).
package/dist/index.d.ts CHANGED
@@ -7597,6 +7597,14 @@ declare const UPG_EDGE_CATALOG: {
7597
7597
  target_type: string;
7598
7598
  cross_product_eligible: true;
7599
7599
  };
7600
+ dependency_resolved_by_objective: {
7601
+ forward_verb: string;
7602
+ reverse_verb: string;
7603
+ classification: "cross-domain";
7604
+ source_type: string;
7605
+ target_type: string;
7606
+ cross_product_eligible: true;
7607
+ };
7600
7608
  objective_raises_strategic_question: {
7601
7609
  forward_verb: string;
7602
7610
  reverse_verb: string;
@@ -8202,7 +8210,7 @@ interface UPGPortfolioDocument {
8202
8210
  /**
8203
8211
  * Legacy product-stage aliases (UPG-509 Part 2).
8204
8212
  *
8205
- * Existing graphs (`entopo.upg`, `sanity.upg`, `maximum-minimum.upg`,
8213
+ * Existing graphs (`entopo.upg`, `nimbus.upg`, `maximum-minimum.upg`,
8206
8214
  * `notion-saturated.upg`, etc.) carry `product.stage` values that pre-date
8207
8215
  * the canonical `UPGProductStage` enum
8208
8216
  * (`concept | validation | build | beta | launch | growth | mature |
@@ -8645,7 +8653,7 @@ declare const UPG_DOMAINS: readonly [{
8645
8653
  }, {
8646
8654
  readonly id: "foundations";
8647
8655
  readonly label: "Foundations";
8648
- readonly description: "The shared specifications and foundational primitives a product organisation stewards or implements everywhere. Specifications are governed specs (query languages, protocols, data formats, encodings) like GROQ or Portable Text; primitives are the compositional units those specs define (a block, a reference, a query value). Both are registry-hostable canonicals that products implement, expose, or conform to. Distinct from a product feature: a specification has no single owner, no P&L, and no buyer; it is the rulebook many products point at.";
8656
+ readonly description: "The shared specifications and foundational primitives a product organisation stewards or implements everywhere. Specifications are governed specs (query languages, protocols, data formats, encodings) like NQL or Structured Text; primitives are the compositional units those specs define (a block, a reference, a query value). Both are registry-hostable canonicals that products implement, expose, or conform to. Distinct from a product feature: a specification has no single owner, no P&L, and no buyer; it is the rulebook many products point at.";
8649
8657
  readonly types: readonly ["specification", "primitive", "operating_lifecycle", "operating_stage"];
8650
8658
  }];
8651
8659
  /**
@@ -9839,7 +9847,7 @@ declare function migrateEdge<T extends {
9839
9847
  * type's lifecycle exists but the graph carries pre-canonical status values
9840
9848
  * the lifecycle never had.
9841
9849
  *
9842
- * Source: live drift in `.upg/entopo.upg`, `.upg/sanity.upg`, and
9850
+ * Source: live drift in `.upg/entopo.upg`, `.upg/nimbus.upg`, and
9843
9851
  * `.upg/inkling.upg` surveyed during the v0.5 launch train (UPG-527).
9844
9852
  * Highest single drift class: 173 `service` nodes with `status: "active"`
9845
9853
  * against the canonical `[development, staging, production, deprecated]`
@@ -11466,7 +11474,7 @@ interface CompetitorProperties {
11466
11474
  /**
11467
11475
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11468
11476
  * an analyst report, or a research note.
11469
- * @example "https://www.contentful.com/pricing/"
11477
+ * @example "https://docs.larch.example/pricing/"
11470
11478
  */
11471
11479
  source?: string;
11472
11480
  /**
@@ -11518,7 +11526,7 @@ interface CompetitorFeatureProperties {
11518
11526
  /**
11519
11527
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11520
11528
  * an analyst report, or a research note.
11521
- * @example "https://www.contentful.com/changelog/"
11529
+ * @example "https://docs.larch.example/changelog/"
11522
11530
  */
11523
11531
  source?: string;
11524
11532
  /**
@@ -11640,7 +11648,7 @@ interface CompetitiveAnalysisProperties {
11640
11648
  *
11641
11649
  * @example
11642
11650
  * [
11643
- * { axis_a_value_ref: 'val-git-based', axis_b_value_ref: 'val-portable-text',
11651
+ * { axis_a_value_ref: 'val-git-based', axis_b_value_ref: 'val-structured-text',
11644
11652
  * rationale_kind: 'opportunity',
11645
11653
  * rationale_md: 'No technical reason; only adoption inertia. Watching brief.' },
11646
11654
  * { axis_a_value_ref: 'val-composable', axis_b_value_ref: 'val-wysiwyg',
@@ -11658,7 +11666,7 @@ interface CompetitiveAnalysisProperties {
11658
11666
  /**
11659
11667
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11660
11668
  * an analyst report, or a research note.
11661
- * @example "https://www.contentful.com/changelog/"
11669
+ * @example "https://docs.larch.example/changelog/"
11662
11670
  */
11663
11671
  source?: string;
11664
11672
  /**
@@ -11737,7 +11745,7 @@ interface CompetitorSignalProperties {
11737
11745
  /**
11738
11746
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11739
11747
  * an analyst report, or a research note.
11740
- * @example "https://www.contentful.com/changelog/"
11748
+ * @example "https://docs.larch.example/changelog/"
11741
11749
  */
11742
11750
  source?: string;
11743
11751
  /**
@@ -11865,14 +11873,14 @@ interface ClassificationAxisProperties {
11865
11873
  * @example
11866
11874
  * const properties: ClassificationValueProperties = {
11867
11875
  * rationale: 'Composable extends headless with three load-bearing commitments.',
11868
- * exemplars: ['Sanity', 'Contentful', 'Hygraph'],
11876
+ * exemplars: ['Nimbus', 'Larch', 'Prism'],
11869
11877
  * commitments: [
11870
11878
  * { name: 'Typed content graph', description: 'Schemas in code; references as edges.' },
11871
11879
  * { name: 'Real-time backend', description: 'Live queries, CRDT collaboration.' },
11872
11880
  * { name: 'Embeddable studio', description: 'Editor is a library hosted inside the team app.' },
11873
11881
  * ],
11874
11882
  * capabilities: [
11875
- * { surface: 'delivery', bullets: ['GROQ', 'GraphQL', 'REST', 'Live Content API'] },
11883
+ * { surface: 'delivery', bullets: ['NQL', 'GraphQL', 'REST', 'Live Sync API'] },
11876
11884
  * ],
11877
11885
  * }
11878
11886
  */
@@ -11885,7 +11893,7 @@ interface ClassificationValueProperties {
11885
11893
  /**
11886
11894
  * Free-text examples of products occupying this value.
11887
11895
  * For queryable occupancy, prefer `competitor` nodes with `classified_as` edges.
11888
- * @example ['Sanity', 'Contentful', 'Hygraph']
11896
+ * @example ['Nimbus', 'Larch', 'Prism']
11889
11897
  */
11890
11898
  exemplars?: string[];
11891
11899
  /**
@@ -11912,8 +11920,8 @@ interface ClassificationValueProperties {
11912
11920
  *
11913
11921
  * @example
11914
11922
  * [
11915
- * { surface: 'delivery', bullets: ['GROQ', 'GraphQL', 'REST', 'Live Content API', 'Asset CDN'] },
11916
- * { surface: 'extensibility', bullets: ['Custom input components', 'Studio plugins'] },
11923
+ * { surface: 'delivery', bullets: ['NQL', 'GraphQL', 'REST', 'Live Sync API', 'Asset CDN'] },
11924
+ * { surface: 'extensibility', bullets: ['Custom input components', 'editor plugins'] },
11917
11925
  * ]
11918
11926
  */
11919
11927
  capabilities?: Array<ClassificationCapability>;
@@ -18857,9 +18865,9 @@ interface FrameworkExerciseProperties {
18857
18865
  * kind: 'language',
18858
18866
  * language_flavor: 'query',
18859
18867
  * governance: 'open_spec_stewarded',
18860
- * steward: 'Sanity',
18868
+ * steward: 'Nimbus',
18861
18869
  * openness: 'open',
18862
- * spec_url: 'https://sanity.io/docs/groq',
18870
+ * spec_url: 'https://nimbus.example/docs/nql',
18863
18871
  * current_version: '1.0',
18864
18872
  * since: '2019',
18865
18873
  * }
@@ -18889,13 +18897,13 @@ interface SpecificationProperties {
18889
18897
  conformance?: string;
18890
18898
  }
18891
18899
  /** A foundational compositional unit a specification defines: the noun products
18892
- * pass around and compose with (a Portable Text block, a Sanity reference, a
18900
+ * pass around and compose with (a Structured Text block, a typed reference, a
18893
18901
  * Git commit, a Stripe PaymentIntent). Lifecycle-free, like `metric`.
18894
18902
  *
18895
18903
  * @example
18896
18904
  * const properties: PrimitiveProperties = {
18897
18905
  * primitive_kind: 'block',
18898
- * defined_by: 'specification/portable_text',
18906
+ * defined_by: 'specification/structured_text',
18899
18907
  * since: '2018',
18900
18908
  * }
18901
18909
  */
@@ -18908,7 +18916,7 @@ interface PrimitiveProperties {
18908
18916
  since?: string;
18909
18917
  }
18910
18918
  /** An operating_lifecycle: a canonical, ordered (often cyclic) operating process
18911
- * that many products' journey phases map onto — e.g. Sanity's content-operations
18919
+ * that many products' journey phases map onto — e.g. Nimbus's content-operations
18912
18920
  * lifecycle. Registry-hostable like a `specification`; the cross-product join key
18913
18921
  * that turns per-surface journeys into one operation. Distinct from the per-entity
18914
18922
  * status `lifecycle` grammar concept (this is an entity, not a state machine).
@@ -18916,13 +18924,13 @@ interface PrimitiveProperties {
18916
18924
  * @example
18917
18925
  * const properties: OperatingLifecycleProperties = {
18918
18926
  * cyclic: true,
18919
- * source: 'Sanity official 5-stage content-ops lifecycle',
18927
+ * source: 'a canonical 5-stage content-ops lifecycle',
18920
18928
  * }
18921
18929
  */
18922
18930
  interface OperatingLifecycleProperties {
18923
18931
  /** True if the process loops (e.g. Analyze → Extend → Plan). The sequence is fully expressed by the stages' `stage_order`; `cyclic` adds the wrap from the last stage back to the first. */
18924
18932
  cyclic?: boolean;
18925
- /** Origin of the canonical model (e.g. "Sanity official content-ops lifecycle"). Optional provenance; promote to an edge if it names a real `specification`/`document`. */
18933
+ /** Origin of the canonical model (e.g. "a published content-ops lifecycle"). Optional provenance; promote to an edge if it names a real `specification`/`document`. */
18926
18934
  source?: string;
18927
18935
  }
18928
18936
  /** An operating_stage: one ordered stage of an `operating_lifecycle`. A product's
@@ -22532,7 +22540,7 @@ declare function isCanonical(text: string): boolean;
22532
22540
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
22533
22541
  * The `check:version-lockstep` gate enforces this at release time.
22534
22542
  */
22535
- declare const UPG_VERSION: "0.23.0";
22543
+ declare const UPG_VERSION: "0.23.1";
22536
22544
  /**
22537
22545
  * The `.upg` JSON document format version. Written to the `upg_version` field.
22538
22546
  * Evolves independently from `UPG_VERSION` (the catalogue version).
package/dist/index.js CHANGED
@@ -495,7 +495,7 @@ var UPG_DOMAINS = [
495
495
  {
496
496
  id: "foundations",
497
497
  label: "Foundations",
498
- description: "The shared specifications and foundational primitives a product organisation stewards or implements everywhere. Specifications are governed specs (query languages, protocols, data formats, encodings) like GROQ or Portable Text; primitives are the compositional units those specs define (a block, a reference, a query value). Both are registry-hostable canonicals that products implement, expose, or conform to. Distinct from a product feature: a specification has no single owner, no P&L, and no buyer; it is the rulebook many products point at.",
498
+ description: "The shared specifications and foundational primitives a product organisation stewards or implements everywhere. Specifications are governed specs (query languages, protocols, data formats, encodings) like NQL or Structured Text; primitives are the compositional units those specs define (a block, a reference, a query value). Both are registry-hostable canonicals that products implement, expose, or conform to. Distinct from a product feature: a specification has no single owner, no P&L, and no buyer; it is the rulebook many products point at.",
499
499
  types: ["specification", "primitive", "operating_lifecycle", "operating_stage"]
500
500
  }
501
501
  ];
@@ -3216,6 +3216,15 @@ var UPG_EDGE_CATALOG = {
3216
3216
  // by another team's graph within the portfolio (0.17.3 locked predicate).
3217
3217
  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 },
3218
3218
  dependency_blocks_objective: { forward_verb: "blocks", reverse_verb: "blocked_by", classification: "cross-domain", source_type: "dependency", target_type: "objective", cross_product_eligible: true },
3219
+ // The RESOLVING side, distinct from the two blocking edges above.
3220
+ // `dependency_blocks_objective` names an objective the dependency holds up (the
3221
+ // waiting side); this names the objective whose completion CLEARS the
3222
+ // dependency (the providing side). In a portfolio, a dependency in one
3223
+ // product's graph points at the objective in another product's graph that
3224
+ // delivers the awaited work, instead of recording it only in the free-text
3225
+ // `resolution` property. cross_product_eligible — the resolving objective
3226
+ // lives in another product's graph.
3227
+ dependency_resolved_by_objective: { forward_verb: "resolved_by", reverse_verb: "resolves", classification: "cross-domain", source_type: "dependency", target_type: "objective", cross_product_eligible: true },
3219
3228
  // objective / initiative → strategic_question. A planning doc's "Risks & Open
3220
3229
  // Questions" section names unresolved coordination questions the plan is
3221
3230
  // exposed to (who owns a capability across teams after a reorg). The
@@ -10476,9 +10485,9 @@ var UPG_PROPERTY_SCHEMA = {
10476
10485
  // ClassificationValueProperties: ClassificationValue: a value on a classification axis.
10477
10486
  classification_value: {
10478
10487
  rationale: { type: "string", description: "Short paragraph: why this value earns its own row/column. Longer narrative belongs in `summary_md` or attached `content_piece` nodes." },
10479
- exemplars: { type: "string[]", description: "Free-text examples of products occupying this value. For queryable occupancy, prefer `competitor` nodes with `classified_as` edges. @example ['Sanity', 'Contentful', 'Hygraph']" },
10488
+ exemplars: { type: "string[]", description: "Free-text examples of products occupying this value. For queryable occupancy, prefer `competitor` nodes with `classified_as` edges. @example ['Nimbus', 'Larch', 'Prism']" },
10480
10489
  commitments: { type: "object[]", description: "The N (typically 2\u20134) load-bearing commitments that define this category. Each commitment is a structural axis; removing it changes the category. Pairs with `capabilities`: commitments are the *load-bearing definition*; capabilities are the *surface offering*. @example [ { name: 'Typed content graph', description: 'Schemas in code; references as edges; content is structured data.' }, { name: 'Real-time backend', description: 'Live queries, CRDT collaboration, sub-second propagation.' }, { name: 'Embeddable studio', description: 'Editor is a library hosted inside the team app, not an external portal.' }, ]" },
10481
- capabilities: { type: "object[]", description: "Structured capability bullets across the six canonical surfaces. Each surface appears at most once per `classification_value`. Pairs with `commitments`: capabilities describe what the category *offers*; commitments describe what *defines* it. @example [ { surface: 'delivery', bullets: ['GROQ', 'GraphQL', 'REST', 'Live Content API', 'Asset CDN'] }, { surface: 'extensibility', bullets: ['Custom input components', 'Studio plugins'] }, ]" }
10490
+ capabilities: { type: "object[]", description: "Structured capability bullets across the six canonical surfaces. Each surface appears at most once per `classification_value`. Pairs with `commitments`: capabilities describe what the category *offers*; commitments describe what *defines* it. @example [ { surface: 'delivery', bullets: ['NQL', 'GraphQL', 'REST', 'Live Sync API', 'Asset CDN'] }, { surface: 'extensibility', bullets: ['Custom input components', 'editor plugins'] }, ]" }
10482
10491
  },
10483
10492
  // CodeRepositoryProperties: Code repository.
10484
10493
  code_repository: {
@@ -10513,9 +10522,9 @@ var UPG_PROPERTY_SCHEMA = {
10513
10522
  analysis_type: { type: "string", enum: ["feature_comparison", "positioning", "swot", "pricing"], description: "Type of analysis. `feature_comparison` = side-by-side matrix. `positioning` = competitor positioning relative to each other. `swot` = strengths, weaknesses, opportunities, threats. `pricing` = pricing structure comparison." },
10514
10523
  analysis_date: { type: "string", description: 'ISO date conducted. Competitive intelligence decays quickly; track snapshot age. @example "2026-03-15"' },
10515
10524
  framework_id: { type: "string", description: 'Framework ID (references `UPGFramework.id`). @example "porter-five-forces", "swot-analysis", "competitive-matrix"' },
10516
- empty_cells: { type: "object[]", description: "Empty cells in a 2-axis classification matrix that earn explicit commentary. Only the strategically interesting cells. Opportunity-kind cells are the most valuable; they identify unoccupied strategic space. Each entry references two `classification_value` nodes by id (one from each `classification_axis` child of this `competitive_analysis`). `validate_graph` enforces that the refs resolve to `classification_value` nodes whose parents are distinct `classification_axis` instances. See `ClassificationValueProperties.commitments` for the inverse \"occupied cell\" structural-definition shape. @example [ { axis_a_value_ref: 'val-git-based', axis_b_value_ref: 'val-portable-text', rationale_kind: 'opportunity', rationale_md: 'No technical reason; only adoption inertia. Watching brief.' }, { axis_a_value_ref: 'val-composable', axis_b_value_ref: 'val-wysiwyg', rationale_kind: 'structural', rationale_md: 'Composable rejects HTML blobs; WYSIWYG requires them.' }, ]" },
10525
+ empty_cells: { type: "object[]", description: "Empty cells in a 2-axis classification matrix that earn explicit commentary. Only the strategically interesting cells. Opportunity-kind cells are the most valuable; they identify unoccupied strategic space. Each entry references two `classification_value` nodes by id (one from each `classification_axis` child of this `competitive_analysis`). `validate_graph` enforces that the refs resolve to `classification_value` nodes whose parents are distinct `classification_axis` instances. See `ClassificationValueProperties.commitments` for the inverse \"occupied cell\" structural-definition shape. @example [ { axis_a_value_ref: 'val-git-based', axis_b_value_ref: 'val-structured-text', rationale_kind: 'opportunity', rationale_md: 'No technical reason; only adoption inertia. Watching brief.' }, { axis_a_value_ref: 'val-composable', axis_b_value_ref: 'val-wysiwyg', rationale_kind: 'structural', rationale_md: 'Composable rejects HTML blobs; WYSIWYG requires them.' }, ]" },
10517
10526
  last_updated: { type: "string", description: 'Provenance: ISO date-time this record was last observed or refreshed. Distinct from `analysis_date` (when the analysis was conducted). @example "2026-06-13"' },
10518
- source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://www.contentful.com/changelog/"' },
10527
+ source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://docs.larch.example/changelog/"' },
10519
10528
  confidence: {
10520
10529
  type: "assessment",
10521
10530
  scale_id: "confidence_5",
@@ -10543,7 +10552,7 @@ var UPG_PROPERTY_SCHEMA = {
10543
10552
  strengths: { type: "string[]", description: "Bulleted factual strengths. Each item is a short statement, not prose. @example ['Real-time multiplayer canvas', 'Generous free tier']" },
10544
10553
  weaknesses: { type: "string[]", description: "Bulleted factual weaknesses: gaps, friction, or capabilities materially below market. @example ['Weak API query capabilities', 'No mobile companion']" },
10545
10554
  last_updated: { type: "string", description: 'Provenance: ISO date-time this record was last observed or refreshed. Lets a stale record be told apart from a fresh one. @example "2026-06-13"' },
10546
- source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://www.contentful.com/pricing/"' },
10555
+ source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://docs.larch.example/pricing/"' },
10547
10556
  confidence: {
10548
10557
  type: "assessment",
10549
10558
  scale_id: "confidence_5",
@@ -10565,7 +10574,7 @@ var UPG_PROPERTY_SCHEMA = {
10565
10574
  quality: { type: "string", enum: ["better", "same", "worse", "missing"], description: "Quality comparison. `better` = ours is meaningfully superior. `same` = roughly equivalent. `worse` = theirs is meaningfully superior. `missing` = we have no equivalent." },
10566
10575
  parity_status: { type: "string", enum: ["ahead", "behind", "parity", "unique_to_us", "unique_to_them"], description: "Parity. More granular than `quality`; captures whether the gap is offensive or defensive. `ahead` = we lead. `behind` = they lead. `parity` = equivalent. `unique_to_us` / `unique_to_them` = only one side offers it." },
10567
10576
  last_updated: { type: "string", description: 'ISO date this assessment was last updated. Competitor feature landscapes change quickly. @example "2026-02-15"' },
10568
- source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://www.contentful.com/changelog/"' },
10577
+ source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://docs.larch.example/changelog/"' },
10569
10578
  confidence: {
10570
10579
  type: "assessment",
10571
10580
  scale_id: "confidence_5",
@@ -10591,7 +10600,7 @@ var UPG_PROPERTY_SCHEMA = {
10591
10600
  from_value: { type: "string", description: "Reclassification only. The prior `classification_value` id the competitor was classified as before this move (the superseded cell). Absent for a first-time classification (nothing was superseded)." },
10592
10601
  to_value: { type: "string", description: "Reclassification only. The new `classification_value` id the competitor is classified as after this move (the cell the new classify edge points at)." },
10593
10602
  last_updated: { type: "string", description: 'Provenance: ISO date-time this record was last observed or refreshed. @example "2026-06-13"' },
10594
- source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://www.contentful.com/changelog/"' },
10603
+ source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://docs.larch.example/changelog/"' },
10595
10604
  confidence: {
10596
10605
  type: "assessment",
10597
10606
  scale_id: "confidence_5",
@@ -12022,7 +12031,7 @@ var UPG_PROPERTY_SCHEMA = {
12022
12031
  // OperatingLifecycleProperties: An operating_lifecycle: a canonical, ordered (often cyclic) operating process
12023
12032
  operating_lifecycle: {
12024
12033
  cyclic: { type: "boolean", description: "True if the process loops (e.g. Analyze \u2192 Extend \u2192 Plan). The sequence is fully expressed by the stages' `stage_order`; `cyclic` adds the wrap from the last stage back to the first." },
12025
- source: { type: "string", description: 'Origin of the canonical model (e.g. "Sanity official content-ops lifecycle"). Optional provenance; promote to an edge if it names a real `specification`/`document`.' }
12034
+ source: { type: "string", description: 'Origin of the canonical model (e.g. "a published content-ops lifecycle"). Optional provenance; promote to an edge if it names a real `specification`/`document`.' }
12026
12035
  },
12027
12036
  // OperatingStageProperties: An operating_stage: one ordered stage of an `operating_lifecycle`. A product's
12028
12037
  operating_stage: {
@@ -29712,7 +29721,7 @@ function isCanonical(text) {
29712
29721
  }
29713
29722
 
29714
29723
  // src/index.ts
29715
- var UPG_VERSION = "0.23.0";
29724
+ var UPG_VERSION = "0.23.1";
29716
29725
  var UPG_FORMAT_VERSION = "0.4.0";
29717
29726
  var MARKDOWN_FORMAT_VERSION = "0.1";
29718
29727
  var UPG_TYPES = getTypes();