@unified-product-graph/core 0.17.4 → 0.17.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -2304,6 +2304,11 @@ var UPG_EDGE_CATALOG = {
2304
2304
  document_describes_positioning: { forward_verb: "describes", reverse_verb: "described_by", classification: "semantic", source_type: "document", target_type: "positioning" },
2305
2305
  document_describes_decision: { forward_verb: "describes", reverse_verb: "described_by", classification: "semantic", source_type: "document", target_type: "decision" },
2306
2306
  document_contains_insight: { forward_verb: "contains", reverse_verb: "contained_in", classification: "semantic", source_type: "document", target_type: "insight" },
2307
+ // Research-provenance containment (0.17.5): a synthesis document is walkable
2308
+ // to the evidence it sourced. Within-graph containment (the document and the
2309
+ // evidence co-reside), so NOT cross_product_eligible.
2310
+ document_contains_quote: { forward_verb: "contains", reverse_verb: "contained_in", classification: "semantic", source_type: "document", target_type: "quote" },
2311
+ document_contains_observation: { forward_verb: "contains", reverse_verb: "contained_in", classification: "semantic", source_type: "document", target_type: "observation" },
2307
2312
  // 5.3 Customer Education & Training Domain
2308
2313
  product_educates_via_education_program: { forward_verb: "educates_via", reverse_verb: "educates", classification: "hierarchy", source_type: "product", target_type: "education_program" },
2309
2314
  education_program_teaches_via_tutorial: { forward_verb: "teaches_via", reverse_verb: "teaches", classification: "hierarchy", source_type: "education_program", target_type: "tutorial" },
@@ -12350,7 +12355,8 @@ var UPG_PROPERTY_SCHEMA = {
12350
12355
  session_ref: { type: "string", description: "Capturing session reference. Convenience field; the canonical relationship to study/session is an edge per P14. Retained as a lightweight context anchor for AI inference." },
12351
12356
  is_highlighted: { type: "boolean", description: "Flagged as a highlight. Absorbed from the deprecated Highlight entity." },
12352
12357
  highlight_tag: { type: "string", description: 'Free-form highlight type tag. @example "pain", "delight", "behaviour", "moment of clarity"' },
12353
- sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Structured sentiment. Tools like Dovetail and EnjoyHQ converge on these four values. More precise than `highlight_tag` for aggregation." }
12358
+ sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Structured sentiment. Tools like Dovetail and EnjoyHQ converge on these four values. More precise than `highlight_tag` for aggregation." },
12359
+ source_url: { type: "string", description: "Stable deep-link to the exact moment this observation was captured in the originating recording or transcript. A per-moment locator, not a study-level link. Distinct from `session_ref`, which holds an opaque session ID.", modifier: "volatile" }
12354
12360
  },
12355
12361
  // OnCallRotationProperties: On-call rotation.
12356
12362
  on_call_rotation: {
@@ -12394,7 +12400,8 @@ var UPG_PROPERTY_SCHEMA = {
12394
12400
  participant: {
12395
12401
  alias: { type: "string", description: 'Anonymous alias for privacy (e.g. "P01")' },
12396
12402
  recruit_source: { type: "string", description: "How the participant was recruited" },
12397
- consent_status: { type: "string", enum: ["pending", "given", "withdrawn"], description: "Current consent status for data usage" }
12403
+ consent_status: { type: "string", enum: ["pending", "given", "withdrawn"], description: "Current consent status for data usage" },
12404
+ source_url: { type: "string", description: "Stable deep-link to the exact moment this participant appears in the originating recording or transcript. A per-moment locator, not a study-level link.", modifier: "volatile" }
12398
12405
  },
12399
12406
  // PartnerProgramProperties: Partner program.
12400
12407
  partner_program: {
@@ -12617,7 +12624,8 @@ var UPG_PROPERTY_SCHEMA = {
12617
12624
  // QuoteProperties: Verbatim quote from a participant.
12618
12625
  quote: {
12619
12626
  text: { type: "string", description: "Quoted text" },
12620
- timestamp: { type: "string", description: "When said (ISO timestamp or session offset)" }
12627
+ timestamp: { type: "string", description: "When said (ISO timestamp or session offset)" },
12628
+ source_url: { type: "string", description: "Stable deep-link to the exact moment this quote was spoken in the originating recording or transcript. A per-moment locator, not a study-level link.", modifier: "volatile" }
12621
12629
  },
12622
12630
  // QuoteDocumentProperties: Quote document.
12623
12631
  quote_document: {
@@ -23057,7 +23065,13 @@ var USER_RESEARCH_GUIDE = {
23057
23065
  anti_patterns: [
23058
23066
  { description: "Insights without evidence: every insight must trace back to observations and quotes" },
23059
23067
  { description: "Orphan quotes: quotes should belong to observations, not float independently" },
23060
- { description: "Research studies without questions: always define what you want to learn before starting" }
23068
+ { description: "Research studies without questions: always define what you want to learn before starting" },
23069
+ {
23070
+ name: "Study conflation",
23071
+ affected_entity: "research_study",
23072
+ description: "Do not merge multiple research rounds with different stated goals into one `research_study` (or one participant pool) just because they were synthesized into the same downstream document. If two rounds have different research questions, they are different `research_study` nodes, even if an analyst wrote them up together.",
23073
+ remediation: "Verify against the *original* recording or session metadata, not the synthesis doc's grouping."
23074
+ }
23061
23075
  ]
23062
23076
  };
23063
23077
  var MARKET_INTELLIGENCE_GUIDE = {
@@ -29967,7 +29981,7 @@ function isCanonical(text) {
29967
29981
  }
29968
29982
 
29969
29983
  // src/index.ts
29970
- var UPG_VERSION = "0.17.4";
29984
+ var UPG_VERSION = "0.17.5";
29971
29985
  var UPG_FORMAT_VERSION = "0.4.0";
29972
29986
  var MARKDOWN_FORMAT_VERSION = "0.1";
29973
29987
  var UPG_TYPES = getTypes();