@unified-product-graph/core 0.17.4 → 0.17.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.cjs +26 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +35 -1
- package/dist/index.d.ts +35 -1
- package/dist/index.js +26 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
The TypeScript core for the **Unified Product Graph (UPG)**, an open specification that gives product tools a shared vocabulary for entities, edges, and frameworks.
|
|
9
9
|
|
|
10
|
-
319 entity types across 37 domains.
|
|
10
|
+
319 entity types across 37 domains. 1026 typed edges. 46 canonical framework definitions, with more added as each is reviewed.
|
|
11
11
|
|
|
12
12
|
## Install
|
|
13
13
|
|
package/dist/index.cjs
CHANGED
|
@@ -1386,7 +1386,13 @@ var UPG_EDGE_CATALOG = {
|
|
|
1386
1386
|
research_study_collects_survey_response: { forward_verb: "collects", reverse_verb: "collected_in", classification: "hierarchy", source_type: "research_study", target_type: "survey_response" },
|
|
1387
1387
|
observation_evidenced_by_quote: { forward_verb: "evidenced_by", reverse_verb: "evidences", classification: "hierarchy", source_type: "observation", target_type: "quote" },
|
|
1388
1388
|
affinity_cluster_synthesises_insight: { forward_verb: "synthesises", reverse_verb: "synthesised_from", classification: "hierarchy", source_type: "affinity_cluster", target_type: "insight" },
|
|
1389
|
-
|
|
1389
|
+
// deliberate_only (0.17.6): "this insight informs that opportunity" is a
|
|
1390
|
+
// PM-judgment link — which of many opportunities a finding actually feeds is
|
|
1391
|
+
// authored, never inferred from a source's hierarchy. Auto-nest / adapter
|
|
1392
|
+
// parentage resolvers decline to materialise it (fall through to a
|
|
1393
|
+
// node_informs_node link or a decline+warn); explicit create_edge /
|
|
1394
|
+
// resolve_edge_for_pair still return it. Fixes the latent auto-emission.
|
|
1395
|
+
insight_informs_opportunity: { forward_verb: "informs", reverse_verb: "informed_by", classification: "cross-domain", source_type: "insight", target_type: "opportunity", deliberate_only: true },
|
|
1390
1396
|
// 1.5 Market Intelligence Domain
|
|
1391
1397
|
// product → competitive_analysis closes the parallel gap to
|
|
1392
1398
|
// product → persona. competitive_analysis is the anchor of the
|
|
@@ -2304,6 +2310,11 @@ var UPG_EDGE_CATALOG = {
|
|
|
2304
2310
|
document_describes_positioning: { forward_verb: "describes", reverse_verb: "described_by", classification: "semantic", source_type: "document", target_type: "positioning" },
|
|
2305
2311
|
document_describes_decision: { forward_verb: "describes", reverse_verb: "described_by", classification: "semantic", source_type: "document", target_type: "decision" },
|
|
2306
2312
|
document_contains_insight: { forward_verb: "contains", reverse_verb: "contained_in", classification: "semantic", source_type: "document", target_type: "insight" },
|
|
2313
|
+
// Research-provenance containment (0.17.5): a synthesis document is walkable
|
|
2314
|
+
// to the evidence it sourced. Within-graph containment (the document and the
|
|
2315
|
+
// evidence co-reside), so NOT cross_product_eligible.
|
|
2316
|
+
document_contains_quote: { forward_verb: "contains", reverse_verb: "contained_in", classification: "semantic", source_type: "document", target_type: "quote" },
|
|
2317
|
+
document_contains_observation: { forward_verb: "contains", reverse_verb: "contained_in", classification: "semantic", source_type: "document", target_type: "observation" },
|
|
2307
2318
|
// 5.3 Customer Education & Training Domain
|
|
2308
2319
|
product_educates_via_education_program: { forward_verb: "educates_via", reverse_verb: "educates", classification: "hierarchy", source_type: "product", target_type: "education_program" },
|
|
2309
2320
|
education_program_teaches_via_tutorial: { forward_verb: "teaches_via", reverse_verb: "teaches", classification: "hierarchy", source_type: "education_program", target_type: "tutorial" },
|
|
@@ -12350,7 +12361,8 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12350
12361
|
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
12362
|
is_highlighted: { type: "boolean", description: "Flagged as a highlight. Absorbed from the deprecated Highlight entity." },
|
|
12352
12363
|
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." }
|
|
12364
|
+
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." },
|
|
12365
|
+
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
12366
|
},
|
|
12355
12367
|
// OnCallRotationProperties: On-call rotation.
|
|
12356
12368
|
on_call_rotation: {
|
|
@@ -12394,7 +12406,8 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12394
12406
|
participant: {
|
|
12395
12407
|
alias: { type: "string", description: 'Anonymous alias for privacy (e.g. "P01")' },
|
|
12396
12408
|
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" }
|
|
12409
|
+
consent_status: { type: "string", enum: ["pending", "given", "withdrawn"], description: "Current consent status for data usage" },
|
|
12410
|
+
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
12411
|
},
|
|
12399
12412
|
// PartnerProgramProperties: Partner program.
|
|
12400
12413
|
partner_program: {
|
|
@@ -12617,7 +12630,8 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12617
12630
|
// QuoteProperties: Verbatim quote from a participant.
|
|
12618
12631
|
quote: {
|
|
12619
12632
|
text: { type: "string", description: "Quoted text" },
|
|
12620
|
-
timestamp: { type: "string", description: "When said (ISO timestamp or session offset)" }
|
|
12633
|
+
timestamp: { type: "string", description: "When said (ISO timestamp or session offset)" },
|
|
12634
|
+
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
12635
|
},
|
|
12622
12636
|
// QuoteDocumentProperties: Quote document.
|
|
12623
12637
|
quote_document: {
|
|
@@ -23057,7 +23071,13 @@ var USER_RESEARCH_GUIDE = {
|
|
|
23057
23071
|
anti_patterns: [
|
|
23058
23072
|
{ description: "Insights without evidence: every insight must trace back to observations and quotes" },
|
|
23059
23073
|
{ 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" }
|
|
23074
|
+
{ description: "Research studies without questions: always define what you want to learn before starting" },
|
|
23075
|
+
{
|
|
23076
|
+
name: "Study conflation",
|
|
23077
|
+
affected_entity: "research_study",
|
|
23078
|
+
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.",
|
|
23079
|
+
remediation: "Verify against the *original* recording or session metadata, not the synthesis doc's grouping."
|
|
23080
|
+
}
|
|
23061
23081
|
]
|
|
23062
23082
|
};
|
|
23063
23083
|
var MARKET_INTELLIGENCE_GUIDE = {
|
|
@@ -29967,7 +29987,7 @@ function isCanonical(text) {
|
|
|
29967
29987
|
}
|
|
29968
29988
|
|
|
29969
29989
|
// src/index.ts
|
|
29970
|
-
var UPG_VERSION = "0.17.
|
|
29990
|
+
var UPG_VERSION = "0.17.6";
|
|
29971
29991
|
var UPG_FORMAT_VERSION = "0.4.0";
|
|
29972
29992
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
29973
29993
|
var UPG_TYPES = getTypes();
|