@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 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: internal (a self-imposed principle or operating tenet) or external (a limit, requirement, or ceiling imposed from outside)." },
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 `flag_status === 'rollout'`.", modifier: "snapshot" },
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: "Who performs the work: a human archetype (default; absent = human, no migration), an autonomous AI agent (e.g. Content Agent), or a non-agentic platform service. An agent persona participates in journeys via the same persona machinery and is delegated to via persona_delegates_to_persona. Human-coverage / segmentation metrics count human only; agent/system opt-in." }
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. An open coordination or
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. A time-bound thrust WITHIN a
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 switching barrier is (UPGAssessment on the `severity_5` scale). Steered onto the canonical scale to match sibling assessments. Migrated from the `high | medium | low` enum (UPG-579 Option C): map `high` -> 4, `medium` -> 3, `low` -> 2; carry the old word in `label`.",
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)". Promote individuals to `node_owned_by_person` edges if participation must be queryable.' },
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: "Single north-star metric or statement" },
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.6";
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();