@unified-product-graph/core 0.17.6 → 0.17.8
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 +27 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -26
- package/dist/index.d.ts +24 -26
- package/dist/index.js +27 -39
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -7070,6 +7070,8 @@ var PROPERTY_SCALE_MAP = {
|
|
|
7070
7070
|
// validation/experiment_run
|
|
7071
7071
|
bug_severity: "severity_5",
|
|
7072
7072
|
// product-spec/bug (UPG-579 Option C collapse)
|
|
7073
|
+
magnitude: "severity_5",
|
|
7074
|
+
// user/switching_cost barrier size (0.17.7; restores the documented UPG-579 intent that a missing entry had silently overridden to scale_5)
|
|
7073
7075
|
risk_level: "severity_5",
|
|
7074
7076
|
// compliance/risk (UPG-579 Option B)
|
|
7075
7077
|
scarcity_risk: "severity_5",
|
|
@@ -10757,8 +10759,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10757
10759
|
framework_id: { type: "string", description: "Framework ID (references `UPGFramework.id`)" },
|
|
10758
10760
|
stage: { type: "string", enum: ["draft", "validated", "active"], description: "Maturity" },
|
|
10759
10761
|
pattern: { type: "string", enum: ["freemium", "marketplace", "saas", "subscription", "transactional", "advertising", "licensing", "hybrid"], description: "Canonical pattern. Useful for benchmarking against peer businesses with the same shape." }
|
|
10760
|
-
// monetisation_basis removed in 0.12.0 (P14 Bucket C) — categorical rollup of revenue_stream.billing_model.
|
|
10761
|
-
// north_star_metric removed in 0.12.0 (P14) → `business_model_guided_by_metric` edge.
|
|
10762
10762
|
},
|
|
10763
10763
|
// CapabilityProperties: Capability entity.
|
|
10764
10764
|
capability: {
|
|
@@ -10975,7 +10975,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10975
10975
|
// ConstraintProperties: Constraint: a named limitation or boundary on product creation.
|
|
10976
10976
|
constraint: {
|
|
10977
10977
|
constraint_kind: { type: "string", enum: ["resource", "technical", "regulatory", "temporal", "compliance", "other"], description: "Limitation category" },
|
|
10978
|
-
constraint_origin: { type: "string", enum: ["internal", "external"], description: "Provenance:
|
|
10978
|
+
constraint_origin: { type: "string", enum: ["internal", "external"], description: "Provenance: a self-imposed tenet (`internal`) or an imposed-on-us limit/requirement (`external`)." },
|
|
10979
10979
|
constraint_status: { type: "string", enum: ["binding", "advisory", "lifted"], description: "Whether binding, advisory, or lifted" },
|
|
10980
10980
|
rule_strength: { type: "string", enum: ["must", "must_not", "exception", "warning", "guideline"], description: "Enforcement strictness. Reuses the governance/guideline rule vocabulary." },
|
|
10981
10981
|
source: { type: "string", description: "Free-text origin: policy document, regulation, stakeholder, technical doc." },
|
|
@@ -11592,7 +11592,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11592
11592
|
// FeatureFlagProperties: Feature flag.
|
|
11593
11593
|
feature_flag: {
|
|
11594
11594
|
key: { type: "string", description: 'Required. Stable flag key used in code (e.g. "new-checkout-flow").' },
|
|
11595
|
-
rollout_pct: { type: "number", description: "Percentage enabled (0\u2013100). Meaningful when `
|
|
11595
|
+
rollout_pct: { type: "number", description: "Percentage enabled (0\u2013100). Meaningful when the flag's `status === 'rollout'`.", modifier: "snapshot" },
|
|
11596
11596
|
targeting_rules: { type: "string", description: "Human-readable targeting rules. Full rule evaluation happens in the flag service." },
|
|
11597
11597
|
owner: { type: "string", description: "Owning person or team responsible for the flag's lifecycle. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
11598
11598
|
flag_type: { type: "string", enum: ["temporary", "permanent", "experiment"], description: "Lifecycle classification. `temporary` = should be removed after rollout (kill switch, gradual rollout). `permanent` = long-lived feature gate (entitlement flag). `experiment` = A/B test with a defined end condition." },
|
|
@@ -12362,7 +12362,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12362
12362
|
is_highlighted: { type: "boolean", description: "Flagged as a highlight. Absorbed from the deprecated Highlight entity." },
|
|
12363
12363
|
highlight_tag: { type: "string", description: 'Free-form highlight type tag. @example "pain", "delight", "behaviour", "moment of clarity"' },
|
|
12364
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" }
|
|
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 for AI inference. Rot-prone external pointer; treat as `volatile`.", modifier: "volatile" }
|
|
12366
12366
|
},
|
|
12367
12367
|
// OnCallRotationProperties: On-call rotation.
|
|
12368
12368
|
on_call_rotation: {
|
|
@@ -12371,10 +12371,18 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12371
12371
|
rotation_cadence: { type: "string", enum: ["daily", "weekly", "biweekly", "custom"], description: "Cycle cadence. `weekly` for standard team rotations. `daily` for high-incident-volume teams." },
|
|
12372
12372
|
handoff_time: { type: "string", description: 'Shift handoff time. Affects team coordination and sleep. @example "09:00 UTC", "17:00 local"' }
|
|
12373
12373
|
},
|
|
12374
|
+
// OperatingLifecycleProperties: An operating_lifecycle: a canonical, ordered (often cyclic) operating process
|
|
12375
|
+
operating_lifecycle: {
|
|
12376
|
+
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." },
|
|
12377
|
+
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`.' }
|
|
12378
|
+
},
|
|
12379
|
+
// OperatingStageProperties: An operating_stage: one ordered stage of an `operating_lifecycle`. A product's
|
|
12380
|
+
operating_stage: {
|
|
12381
|
+
stage_order: { type: "number", description: "Ordered position within the lifecycle, 0-indexed. The source of truth for sequence (pairs with `phase_order`/`step_order`/`action_order`)." },
|
|
12382
|
+
goal: { type: "string", description: "What this stage accomplishes." },
|
|
12383
|
+
owner_role: { type: "string", description: "Role that owns the stage (free-text role label). Optional; promote to a `node_owned_by_role` edge if ownership must be queryable across stages." }
|
|
12384
|
+
},
|
|
12374
12385
|
// OpportunityProperties: A problem worth solving, grounded in user need and business value.
|
|
12375
|
-
// No intrinsic scalar properties — defined by edges + framework-scoped scoring
|
|
12376
|
-
// (reach/frequency/pain/opportunity_score live on the `opportunity-sizing`
|
|
12377
|
-
// framework_exercise edge). Former props removed in 0.14.0 (UPG-574).
|
|
12378
12386
|
opportunity: {},
|
|
12379
12387
|
// OrganizationProperties: Organization entity.
|
|
12380
12388
|
organization: {
|
|
@@ -12407,7 +12415,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12407
12415
|
alias: { type: "string", description: 'Anonymous alias for privacy (e.g. "P01")' },
|
|
12408
12416
|
recruit_source: { type: "string", description: "How the participant was recruited" },
|
|
12409
12417
|
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" }
|
|
12418
|
+
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. Rot-prone external pointer; treat as `volatile`.", modifier: "volatile" }
|
|
12411
12419
|
},
|
|
12412
12420
|
// PartnerProgramProperties: Partner program.
|
|
12413
12421
|
partner_program: {
|
|
@@ -12477,7 +12485,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12477
12485
|
tech_comfort: { type: "string", enum: ["low", "medium", "high", "expert", "other"], description: "Tech comfort. Closed set so personas across products compare on the same axis. Free-text colour belongs in `context` or `motivation`." },
|
|
12478
12486
|
domain_expertise: { type: "string", description: 'Industry or domain knowledge this persona brings @example "10+ years SaaS experience", "New to healthcare IT"' },
|
|
12479
12487
|
audience_role: { type: "string", enum: ["buyer", "user", "champion", "influencer", "partner"], description: 'Role in the buying / adoption decision (the decision-making-unit split): who signs (buyer) vs who uses (user) vs who advocates internally (champion) vs who shapes the choice (influencer) vs who delivers / implements (partner). A portfolio must separate the economic buyer from the practitioner user; they are distinct personas with distinct jobs. Closed set so roles compare across products. @example "buyer"' },
|
|
12480
|
-
actor_kind: { type: "string", enum: ["human", "agent", "system"], description:
|
|
12488
|
+
actor_kind: { type: "string", enum: ["human", "agent", "system"], description: 'Who performs the work: a human archetype (default), an autonomous AI agent (e.g. Content Agent), or a non-agentic platform service. Absent = `human`, so existing personas need no migration. An `agent` persona is a first-class actor that participates in journeys via the same persona machinery and that humans delegate to via `persona_delegates_to_persona`. Human-coverage / segmentation metrics count `human` only; agent/system are opt-in. @example "agent"' }
|
|
12481
12489
|
},
|
|
12482
12490
|
// PipelineSalesProperties: Sales pipeline.
|
|
12483
12491
|
pipeline_sales: {
|
|
@@ -12540,17 +12548,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12540
12548
|
defined_by: { type: "string", description: "The `specification/<slug>` this primitive comes from; nullable for spec-less internal primitives. Mirrors the `primitive_defined_by_specification` edge for quick lookup." },
|
|
12541
12549
|
since: { type: "string", description: "Year or version the primitive was introduced." }
|
|
12542
12550
|
},
|
|
12543
|
-
// OperatingLifecycleProperties: a canonical ordered (often cyclic) operating process products' journey phases map onto.
|
|
12544
|
-
operating_lifecycle: {
|
|
12545
|
-
cyclic: { type: "boolean", description: "True if the process loops (e.g. Analyze \u2192 Extend \u2192 Plan). The sequence is expressed by the stages' stage_order; cyclic adds the wrap from last stage back to first." },
|
|
12546
|
-
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.' }
|
|
12547
|
-
},
|
|
12548
|
-
// OperatingStageProperties: one ordered stage of an operating_lifecycle.
|
|
12549
|
-
operating_stage: {
|
|
12550
|
-
stage_order: { type: "number", description: "Ordered position within the lifecycle, 0-indexed. Source of truth for sequence." },
|
|
12551
|
-
goal: { type: "string", description: "What this stage accomplishes." },
|
|
12552
|
-
owner_role: { type: "string", description: "Role that owns the stage (free-text role label). Optional; promote to a node_owned_by_role edge if ownership must be queryable." }
|
|
12553
|
-
},
|
|
12554
12551
|
// PrivacyPolicyProperties: Privacy policy.
|
|
12555
12552
|
privacy_policy: {
|
|
12556
12553
|
version: { type: "string", description: "Version identifier of the policy" },
|
|
@@ -12631,7 +12628,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12631
12628
|
quote: {
|
|
12632
12629
|
text: { type: "string", description: "Quoted text" },
|
|
12633
12630
|
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" }
|
|
12631
|
+
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. Rot-prone external pointer; treat as `volatile`.", modifier: "volatile" }
|
|
12635
12632
|
},
|
|
12636
12633
|
// QuoteDocumentProperties: Quote document.
|
|
12637
12634
|
quote_document: {
|
|
@@ -12660,7 +12657,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12660
12657
|
},
|
|
12661
12658
|
required: ["value", "label"]
|
|
12662
12659
|
},
|
|
12663
|
-
evidence_refs: { type: "string[]", description: "References to supporting evidence" }
|
|
12660
|
+
evidence_refs: { type: "string[]", description: "References to supporting evidence (e.g. interview or observation ids)." }
|
|
12664
12661
|
},
|
|
12665
12662
|
// RegionalPricingProperties: Regional pricing.
|
|
12666
12663
|
regional_pricing: {
|
|
@@ -12832,7 +12829,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12832
12829
|
cause_confidence: { type: "string", enum: ["hypothesised", "likely", "confirmed"], description: "Team certainty about this cause. `hypothesised` = educated guess. `likely` = evidence points here. `confirmed` = reproduced. Renamed from `confidence` in v0.4.0 to disambiguate from the entity-wide `UPGAssessment`-typed epistemic confidence used elsewhere. The 3-tier shape stays as a discrete RCA-lifecycle marker." },
|
|
12833
12830
|
evidence_summary: { type: "string", description: "One-paragraph evidence summary. Log lines, traces, repro steps. Detailed artefacts go on linked `evidence` nodes." },
|
|
12834
12831
|
affected_area: { type: "string", description: "Affected area of the system" }
|
|
12835
|
-
// `category` (legacy, -> `cause_category`) and `verified` (= `cause_confidence === 'confirmed'`) removed in 0.14.0 (UPG-574).
|
|
12836
12832
|
},
|
|
12837
12833
|
// RunbookProperties: Runbook.
|
|
12838
12834
|
runbook: {
|
|
@@ -12984,10 +12980,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12984
12980
|
post_type: { type: "string", enum: ["text", "image", "video", "carousel", "story"], description: "Format of the post" },
|
|
12985
12981
|
scheduled_date: { type: "string", description: "Date the post is scheduled to publish (ISO format)" }
|
|
12986
12982
|
},
|
|
12987
|
-
// SolutionProperties: A proposed response to an opportunity
|
|
12988
|
-
// RICE scoring inputs (reach/impact/confidence/effort) + computed rice_score
|
|
12989
|
-
// were framework-scoped from 0.9.0 and removed in 0.14.0 (UPG-574): they live
|
|
12990
|
-
// on the `rice-scoring` framework_exercise edge, not the entity.
|
|
12983
|
+
// SolutionProperties: A proposed response to an opportunity
|
|
12991
12984
|
solution: {
|
|
12992
12985
|
timeline: { type: "string", description: "Estimated delivery or target timeline" }
|
|
12993
12986
|
},
|
|
@@ -13046,18 +13039,14 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
13046
13039
|
time_horizon: { type: "string", description: 'Standing / multi-year horizon, often open-ended (a pillar is durable). @example "3 years", "2026-2028", "ongoing"' },
|
|
13047
13040
|
success_indicator: { type: "string", description: "How the business knows this durable pillar is on track. Narrative, not a metric edge. A strategic_theme deliberately has no success_indicator: it is measured through its child objectives, not on its own." }
|
|
13048
13041
|
},
|
|
13049
|
-
// StrategicQuestionProperties: StrategicQuestion entity.
|
|
13050
|
-
// ownership question a plan is exposed to (strategy sibling of research_question /
|
|
13051
|
-
// design_question). `status` is the node lifecycle (open -> resolved).
|
|
13042
|
+
// StrategicQuestionProperties: StrategicQuestion entity.
|
|
13052
13043
|
strategic_question: {
|
|
13053
13044
|
question: { type: "string", description: "The question itself. Primary content." },
|
|
13054
13045
|
context: { type: "string", description: "Context that surfaced the question: the reorg, the boundary, the unowned area." },
|
|
13055
13046
|
resolution: { type: "string", description: "The answer, captured when the question moves to `resolved`." },
|
|
13056
13047
|
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance to resolve relative to other open questions." }
|
|
13057
13048
|
},
|
|
13058
|
-
// StrategicThemeProperties: StrategicTheme entity.
|
|
13059
|
-
// strategic_pillar (distinct cascade level, UPG-692 T3.3) — measured through its
|
|
13060
|
-
// child objectives, so it carries no success_indicator of its own.
|
|
13049
|
+
// StrategicThemeProperties: StrategicTheme entity.
|
|
13061
13050
|
strategic_theme: {
|
|
13062
13051
|
owner: { type: "string", description: "Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
13063
13052
|
time_horizon: { type: "string", description: 'Bounded period this theme is active (a theme is time-bound, within a pillar). @example "Q1 2026", "FY26"' },
|
|
@@ -13110,7 +13099,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
13110
13099
|
magnitude: {
|
|
13111
13100
|
type: "assessment",
|
|
13112
13101
|
scale_id: "severity_5",
|
|
13113
|
-
description: "How large the
|
|
13102
|
+
description: "How large the barrier is (UPGAssessment on the `severity_5` scale).",
|
|
13114
13103
|
properties: {
|
|
13115
13104
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
13116
13105
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -13157,7 +13146,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
13157
13146
|
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Relative importance against other tasks" },
|
|
13158
13147
|
due_date: { type: "string", description: "ISO date due. Typically bounded by the containing story's due date." },
|
|
13159
13148
|
labels: { type: "string[]", description: "Free-form classification tags. Applied uniformly across work item types." }
|
|
13160
|
-
// `estimate` (story_task collapse relic, duplicated `effort`) removed in 0.14.0 (UPG-574).
|
|
13161
13149
|
},
|
|
13162
13150
|
// TeamProperties: Team entity.
|
|
13163
13151
|
team: {
|
|
@@ -13306,7 +13294,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
13306
13294
|
methodology: { type: "string", enum: ["stride", "dread", "pasta", "attack_tree", "other"], description: 'Methodology. `stride` = Spoofing, Tampering, Repudiation, Information Disclosure, DoS, Elevation of Privilege (OWASP standard). `dread` = Damage, Reproducibility, Exploitability, Affected users, Discoverability (numeric scoring). `pasta` = Process for Attack Simulation and Threat Analysis (7-stage). `attack_tree` = hierarchical tree of attack paths. @example "stride" is the most widely used methodology for web applications' },
|
|
13307
13295
|
scope: { type: "string", description: 'What system, feature, or data flow is being analysed. @example "user authentication", "payment processing", "admin API"' },
|
|
13308
13296
|
last_reviewed: { type: "string", description: 'ISO date last reviewed. Models become stale as systems evolve. @example "2026-03-01"' },
|
|
13309
|
-
participants: { type: "string", description: 'Participants in the exercise. @example "Alice Chen (security lead), Bob Park (backend engineer), Carol Liu (architect)"
|
|
13297
|
+
participants: { type: "string", description: 'Participants in the exercise. Promote individuals to `node_owned_by_person` edges if participation must be queryable. @example "Alice Chen (security lead), Bob Park (backend engineer), Carol Liu (architect)"' },
|
|
13310
13298
|
threat_count: { type: "number", description: "Threats identified. Key metric for scope and completeness. @example 12", modifier: "derived" }
|
|
13311
13299
|
},
|
|
13312
13300
|
// TouchpointProperties: Customer touchpoint.
|
|
@@ -13401,7 +13389,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
13401
13389
|
// VisionProperties: Vision entity.
|
|
13402
13390
|
vision: {
|
|
13403
13391
|
timeframe: { type: "string", description: 'Target timeframe. @example "3 years"' },
|
|
13404
|
-
north_star: { type: "string", description: "
|
|
13392
|
+
north_star: { type: "string", description: "The north-star statement: a prose slogan of the future the product steers toward. Legitimately free-text (graph-vs-prose). To link the *metric* a vision optimises for, use the `vision_anchored_by_metric` edge (P14 0.12.0)." },
|
|
13405
13393
|
success_looks_like: { type: "string", description: "Narrative of what success looks like" }
|
|
13406
13394
|
},
|
|
13407
13395
|
// VulnerabilityProperties: Vulnerability.
|
|
@@ -29987,7 +29975,7 @@ function isCanonical(text) {
|
|
|
29987
29975
|
}
|
|
29988
29976
|
|
|
29989
29977
|
// src/index.ts
|
|
29990
|
-
var UPG_VERSION = "0.17.
|
|
29978
|
+
var UPG_VERSION = "0.17.8";
|
|
29991
29979
|
var UPG_FORMAT_VERSION = "0.4.0";
|
|
29992
29980
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
29993
29981
|
var UPG_TYPES = getTypes();
|