@unified-product-graph/core 0.15.0 → 0.16.0

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
@@ -7615,6 +7615,75 @@ function getDeprecatedTypes() {
7615
7615
  return deprecated;
7616
7616
  }
7617
7617
  var UPG_PROPERTY_MIGRATIONS = {
7618
+ // ── v0.16.0: Pattern G — open-standard data boundary (UPG-691) ───────────────
7619
+ //
7620
+ // The portable graph holds modeling knowledge, not PII, registry filings,
7621
+ // app-session ids, or live vendor figures. These flowed through every export /
7622
+ // snapshot / sync. They are dropped from the body and belong to the hosting
7623
+ // app's identity / tenancy / measurement layer instead (boundary ADR
7624
+ // 2026-06-16-open-standard-data-boundary). The infra-pointer URLs that stay
7625
+ // (repo_url, storage_uri, *.logo_url, help_video.url, ...) were marked
7626
+ // `modifier:'volatile'` in this release rather than dropped, so a consumer
7627
+ // knows they are environment-specific and may be stripped on export. The
7628
+ // `owner: string` -> ownership-edge migration (C1) is a separate, larger wave
7629
+ // (0.17.0). (FALSE-POSITIVE guard kept: specification.spec_url, design_token.value,
7630
+ // vulnerability.cve_id, screen.route, bug.environment -- content / standard refs.)
7631
+ "0.16.0": [
7632
+ {
7633
+ kind: "drop_props",
7634
+ type: "person",
7635
+ drop_props: ["email"],
7636
+ reason: "UPG-691 boundary: person.email is PII for the hosting app identity layer, not the portable graph. Reference the modeled actor by edge; do not inline contact details."
7637
+ },
7638
+ {
7639
+ kind: "drop_props",
7640
+ type: "contact",
7641
+ drop_props: ["email", "phone"],
7642
+ reason: "UPG-691 boundary: contact.email / contact.phone are PII for the app identity layer, not the portable graph."
7643
+ },
7644
+ {
7645
+ kind: "drop_props",
7646
+ type: "document",
7647
+ drop_props: ["author"],
7648
+ reason: "UPG-691 boundary: document.author was free-text name/email (PII). The authoring actor is referenced by edge, not inlined."
7649
+ },
7650
+ {
7651
+ kind: "drop_props",
7652
+ type: "legal_entity",
7653
+ drop_props: ["tax_id", "registration_number", "principal_address"],
7654
+ reason: "UPG-691 boundary: government / registry identifiers belong to the tenancy / records system, not the open interchange body."
7655
+ },
7656
+ {
7657
+ kind: "drop_props",
7658
+ type: "investigation",
7659
+ drop_props: ["session_id"],
7660
+ reason: "UPG-691 boundary: investigation.session_id is an app-runtime / routing artifact, not modeling knowledge."
7661
+ },
7662
+ {
7663
+ kind: "drop_props",
7664
+ type: "workspace",
7665
+ drop_props: ["slug"],
7666
+ reason: "UPG-691 boundary: workspace.slug is an app-routing artifact, not modeling knowledge."
7667
+ },
7668
+ {
7669
+ kind: "drop_props",
7670
+ type: "organization",
7671
+ drop_props: ["billing_plan"],
7672
+ reason: "UPG-691 boundary: organization.billing_plan is a SaaS-account/tenancy concept. Model it via subscription / pricing_tier, not on the structural entity."
7673
+ },
7674
+ {
7675
+ kind: "drop_props",
7676
+ type: "account",
7677
+ drop_props: ["annual_revenue"],
7678
+ reason: "UPG-691 boundary: account.annual_revenue is live firmographic vendor data. Route live figures to a metric node, not the definition entity."
7679
+ },
7680
+ {
7681
+ kind: "drop_props",
7682
+ type: "ai_model",
7683
+ drop_props: ["cost_per_1k_tokens"],
7684
+ reason: "UPG-691 boundary: ai_model.cost_per_1k_tokens is a live vendor price. Route it to a metric / record entity, not the model definition."
7685
+ }
7686
+ ],
7618
7687
  // ── v0.15.0: Pattern D — collapse *_status shadows into the lifecycle ─────────
7619
7688
  //
7620
7689
  // 14 `*_status` enum properties whose values ARE the entity's own lifecycle
@@ -10176,8 +10245,8 @@ var UPG_PROPERTY_SCHEMA = {
10176
10245
  rule_id: { type: "string", description: "Identifier of the rule that flagged the issue" },
10177
10246
  help_url: { type: "string", description: "URL to documentation explaining the issue and how to fix it" },
10178
10247
  affected_element: { type: "string", description: "Description of the affected UI element" },
10179
- css_selector: { type: "string", description: "CSS selector targeting the affected element" },
10180
- html_snippet: { type: "string", description: "HTML snippet containing the violation" },
10248
+ css_selector: { type: "string", description: "CSS selector targeting the affected element", modifier: "volatile" },
10249
+ html_snippet: { type: "string", description: "HTML snippet containing the violation", modifier: "volatile" },
10181
10250
  tags: { type: "string[]", description: 'Tags from the audit tool (e.g. "wcag2aa", "cat.color")' },
10182
10251
  remediation: { type: "string", description: "Recommended fix for the issue" },
10183
10252
  impact_description: { type: "string", description: "Description of the user impact" }
@@ -10204,8 +10273,7 @@ var UPG_PROPERTY_SCHEMA = {
10204
10273
  account: {
10205
10274
  account_type: { type: "string", enum: ["prospect", "customer", "partner", "churned"], description: "Relationship status of this account" },
10206
10275
  industry: { type: "string", description: "Industry vertical the account operates in" },
10207
- employee_count: { type: "number", description: "Number of employees at the account", modifier: "snapshot" },
10208
- annual_revenue: { type: "number", description: "Annual revenue of the account" }
10276
+ employee_count: { type: "number", description: "Number of employees at the account", modifier: "snapshot" }
10209
10277
  },
10210
10278
  // AcquisitionChannelProperties: AcquisitionChannel entity.
10211
10279
  acquisition_channel: {
@@ -10310,7 +10378,7 @@ var UPG_PROPERTY_SCHEMA = {
10310
10378
  version: { type: "string", description: "Version" },
10311
10379
  record_count: { type: "number", description: "Records", modifier: "snapshot" },
10312
10380
  format: { type: "string", description: 'Format (e.g. "jsonl", "csv", "parquet")' },
10313
- storage_uri: { type: "string", description: "Storage URI" },
10381
+ storage_uri: { type: "string", description: "Storage URI", modifier: "volatile" },
10314
10382
  checksum: { type: "string", description: "Integrity hash" },
10315
10383
  provenance: { type: "string", enum: ["human_labelled", "synthetic", "scraped", "converted", "mixed"], description: "Origin" },
10316
10384
  license: { type: "string", description: "SPDX license identifier" },
@@ -10325,7 +10393,7 @@ var UPG_PROPERTY_SCHEMA = {
10325
10393
  started_at: { type: "string", description: "ISO timestamp started" },
10326
10394
  completed_at: { type: "string", description: "ISO timestamp completed" },
10327
10395
  training_steps: { type: "number", description: "Training steps or epochs completed" },
10328
- artifact_uri: { type: "string", description: "Produced artifact URI" },
10396
+ artifact_uri: { type: "string", description: "Produced artifact URI", modifier: "volatile" },
10329
10397
  notes: { type: "string", description: "Free-text notes" },
10330
10398
  tags: { type: "string[]", description: "Free-form classification tags" }
10331
10399
  },
@@ -10338,10 +10406,9 @@ var UPG_PROPERTY_SCHEMA = {
10338
10406
  // AiModelProperties: AI model.
10339
10407
  ai_model: {
10340
10408
  model_provider: { type: "string", enum: ["anthropic", "openai", "google", "meta", "mistral", "custom"], description: "Provider or vendor" },
10341
- model_id: { type: "string", description: 'Unique model identifier (e.g. "claude-sonnet-4-20250514")' },
10409
+ model_id: { type: "string", description: 'Unique model identifier (e.g. "claude-sonnet-4-20250514")', modifier: "volatile" },
10342
10410
  model_version: { type: "string", description: "Specific version" },
10343
10411
  model_purpose: { type: "string", description: "Intended use case" },
10344
- cost_per_1k_tokens: { type: "number", description: "Cost per 1,000 tokens", modifier: "snapshot" },
10345
10412
  context_window: { type: "number", description: "Maximum context window (tokens)" },
10346
10413
  latency_p50_ms: { type: "number", description: "Median latency (p50, ms)", modifier: "snapshot" },
10347
10414
  latency_p99_ms: { type: "number", description: "Tail latency (p99, ms)", modifier: "snapshot" },
@@ -10380,7 +10447,7 @@ var UPG_PROPERTY_SCHEMA = {
10380
10447
  },
10381
10448
  // ApiContractProperties: API contract.
10382
10449
  api_contract: {
10383
- spec_url: { type: "string", description: "URL of the specification document" },
10450
+ spec_url: { type: "string", description: "URL of the specification document", modifier: "volatile" },
10384
10451
  protocol: { type: "string", enum: ["REST", "GraphQL", "gRPC", "AsyncAPI", "SOAP", "WebSocket", "MQTT", "SSE", "other"], description: "Communication protocol. `SSE` (server-sent events) added in 0.9.12." },
10385
10452
  version: { type: "string", description: "API version" },
10386
10453
  owner: { type: "string", description: "Maintaining person or team. Promote to a `node_owned_by_team` edge if ownership must be queryable." }
@@ -10470,7 +10537,7 @@ var UPG_PROPERTY_SCHEMA = {
10470
10537
  // BrandAssetProperties: Brand asset.
10471
10538
  brand_asset: {
10472
10539
  asset_type: { type: "string", enum: ["logo", "icon", "illustration", "photo", "video", "template"], description: "Category of the brand asset" },
10473
- url: { type: "string", description: "URL or path to the asset file" },
10540
+ url: { type: "string", description: "URL or path to the asset file", modifier: "volatile" },
10474
10541
  usage_rights: { type: "string", description: "Usage rights or licensing restrictions" }
10475
10542
  },
10476
10543
  // BrandColourProperties: Brand colour. A single colour in the brand palette.
@@ -10512,7 +10579,7 @@ var UPG_PROPERTY_SCHEMA = {
10512
10579
  approved_backgrounds: { type: "string[]", description: 'Background colours the logo is approved for use on. @example ["#FFFFFF", "#1A1A1A", "#F5F5F5"]' },
10513
10580
  forbidden_backgrounds: { type: "string[]", description: 'Background colours or contexts where the logo must NOT be placed. @example ["busy photography", "low-contrast surfaces"]' },
10514
10581
  file_formats: { type: "string[]", description: 'File formats this logo variant is available in. @example ["svg", "png", "eps", "pdf"]' },
10515
- asset_url: { type: "string", description: "URL to the logo asset file or asset library entry." }
10582
+ asset_url: { type: "string", description: "URL to the logo asset file or asset library entry.", modifier: "volatile" }
10516
10583
  },
10517
10584
  // BrandTypographyProperties: Brand typography. A font family and its usage rules.
10518
10585
  brand_typography: {
@@ -10561,8 +10628,8 @@ var UPG_PROPERTY_SCHEMA = {
10561
10628
  artifact_type: { type: "string", enum: ["docker_image", "npm_package", "binary", "static_assets", "other"], description: "Type" },
10562
10629
  version: { type: "string", description: "Version" },
10563
10630
  size: { type: "string", description: 'Human-readable size (e.g. "12.4 MB")' },
10564
- registry: { type: "string", description: "Registry or storage location" },
10565
- build_url: { type: "string", description: "URL of the producing CI/CD build run (GitHub Actions, CircleCI, etc.)." }
10631
+ registry: { type: "string", description: "Registry or storage location", modifier: "volatile" },
10632
+ build_url: { type: "string", description: "URL of the producing CI/CD build run (GitHub Actions, CircleCI, etc.).", modifier: "volatile" }
10566
10633
  },
10567
10634
  // BusinessModelProperties: BusinessModel: root of a BMC-style model.
10568
10635
  business_model: {
@@ -10795,8 +10862,6 @@ var UPG_PROPERTY_SCHEMA = {
10795
10862
  // ContactProperties: Contact.
10796
10863
  contact: {
10797
10864
  contact_role: { type: "string", description: "Job title or role within the account" },
10798
- email: { type: "string", description: "Email address" },
10799
- phone: { type: "string", description: "Phone number" },
10800
10865
  is_decision_maker: { type: "boolean", description: "Whether this person has purchasing authority" }
10801
10866
  },
10802
10867
  // ContentCalendarProperties: Content calendar.
@@ -10900,7 +10965,7 @@ var UPG_PROPERTY_SCHEMA = {
10900
10965
  // DashboardProperties: Dashboard entity.
10901
10966
  dashboard: {
10902
10967
  tool: { type: "string", enum: ["looker", "amplitude", "mixpanel", "posthog", "custom"], description: "Analytics tool hosting this dashboard" },
10903
- url: { type: "string", description: "URL to the live dashboard" },
10968
+ url: { type: "string", description: "URL to the live dashboard", modifier: "volatile" },
10904
10969
  audience: { type: "string", description: "Intended audience for this dashboard" },
10905
10970
  element_count: { type: "number", description: "Number of widgets or panels on the dashboard", modifier: "derived" },
10906
10971
  refresh_cadence: { type: "string", enum: ["continuous", "hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "on_demand", "other"], description: "How often the dashboard data refreshes. Uses the shared `Cadence` scale." },
@@ -11055,7 +11120,7 @@ var UPG_PROPERTY_SCHEMA = {
11055
11120
  },
11056
11121
  // DesignConceptProperties: Design concept being explored.
11057
11122
  design_concept: {
11058
- sketch_url: { type: "string", description: "URL of the sketch or visual" },
11123
+ sketch_url: { type: "string", description: "URL of the sketch or visual", modifier: "volatile" },
11059
11124
  rationale: { type: "string", description: "Selection or rejection rationale" },
11060
11125
  concept_status: { type: "string", enum: ["exploring", "validated", "selected", "rejected"], description: "Current selection status" },
11061
11126
  maturity: { type: "string", enum: ["sketch", "refined", "final"], description: "Development stage, from rough idea to presentation-ready" },
@@ -11149,7 +11214,7 @@ var UPG_PROPERTY_SCHEMA = {
11149
11214
  },
11150
11215
  // DeveloperPortalProperties: Developer portal.
11151
11216
  developer_portal: {
11152
- portal_url: { type: "string", description: "URL of the developer portal" },
11217
+ portal_url: { type: "string", description: "URL of the developer portal", modifier: "volatile" },
11153
11218
  doc_count: { type: "number", description: "Number of documentation pages", modifier: "derived" },
11154
11219
  sandbox_available: { type: "boolean", description: "Whether a sandbox environment is available" }
11155
11220
  },
@@ -11172,7 +11237,6 @@ var UPG_PROPERTY_SCHEMA = {
11172
11237
  source_url: { type: "string", description: "Canonical retrievable URL" },
11173
11238
  platform: { type: "string", enum: ["markdown", "notion", "figma", "google_docs", "confluence", "github", "linear", "other"], description: "Hosting platform" },
11174
11239
  document_type: { type: "string", enum: ["vision", "plan", "decision", "research", "spec", "audit", "session", "feedback", "case-study", "narrative", "bug-report", "archive-collection", "rfc", "runbook", "guide", "onboarding", "brief", "report", "reference"], description: "Purpose classification" },
11175
- author: { type: "string", description: "Author (free-form: name, email, or handle). Promote to a `node_owned_by_person` edge if ownership must be queryable." },
11176
11240
  last_updated: { type: "string", description: "ISO 8601 last-meaningful-update" },
11177
11241
  word_count: { type: "number", description: "Approximate word count. Useful for planning, indexing, summarisation.", modifier: "snapshot" },
11178
11242
  content_summary: { type: "string", description: "1\u20133 sentence summary. Drives previews, search snippets, embedding context." },
@@ -11481,7 +11545,7 @@ var UPG_PROPERTY_SCHEMA = {
11481
11545
  fix: {
11482
11546
  fix_type: { type: "string", enum: ["hotfix", "permanent", "workaround", "configuration", "process_change"], description: "Kind of fix. `hotfix` = urgent patch. `permanent` = proper structural fix. `workaround` = mitigates symptom without addressing root cause; should track a follow-up." },
11483
11547
  commit: { type: "string", description: "Git commit SHA" },
11484
- files_changed: { type: "string[]", description: "Files changed" },
11548
+ files_changed: { type: "string[]", description: "Files changed", modifier: "volatile" },
11485
11549
  deployed_at: { type: "string", description: "ISO timestamp landed in the target environment." },
11486
11550
  fixed_date: { type: "string", description: "Application date (ISO date). Coarser-grained complement to `deployed_at`." },
11487
11551
  verified: { type: "boolean", description: "Verified in production" },
@@ -11574,7 +11638,7 @@ var UPG_PROPERTY_SCHEMA = {
11574
11638
  video_type: { type: "string", enum: ["how_to", "overview", "troubleshooting", "best_practice"], description: "Purpose of the video" },
11575
11639
  duration_seconds: { type: "number", description: "Duration of the video in seconds" },
11576
11640
  views: { type: "number", description: "Total number of views" },
11577
- url: { type: "string", description: "URL where the video is hosted" }
11641
+ url: { type: "string", description: "URL where the video is hosted", modifier: "volatile" }
11578
11642
  },
11579
11643
  // HypothesisProperties: A testable belief. The canonical design artefact for validating product assumptions.
11580
11644
  hypothesis: {
@@ -11717,7 +11781,6 @@ var UPG_PROPERTY_SCHEMA = {
11717
11781
  started_at: { type: "string", description: "ISO timestamp the investigation began" },
11718
11782
  resolved_at: { type: "string", description: "ISO timestamp the investigation was concluded. Pairs with `status === 'resolved' | 'abandoned'`." },
11719
11783
  lead_investigator: { type: "string", description: "Lead investigator (email or handle). Distinct from the team owning the affected service. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
11720
- session_id: { type: "string", description: "Originating session" },
11721
11784
  category: { type: "string", enum: ["performance", "security", "data_quality", "reliability", "cost", "compliance", "other"], description: "Kind of issue under investigation. Distinct from `RootCauseProperties.cause_category`, which captures *why something went wrong*." }
11722
11785
  },
11723
11786
  // InvoiceProperties: Invoice.
@@ -11922,9 +11985,6 @@ var UPG_PROPERTY_SCHEMA = {
11922
11985
  entity_type: { type: "string", enum: ["corporation", "llc", "partnership", "sole_proprietor", "nonprofit"], description: "Legal structure of the entity" },
11923
11986
  jurisdiction: { type: "string", description: "Jurisdiction where the entity is registered" },
11924
11987
  ip_ownership: { type: "string", description: "Description of intellectual property ownership" },
11925
- principal_address: { type: "string", description: "Principal business address" },
11926
- tax_id: { type: "string", description: "Tax identification number" },
11927
- registration_number: { type: "string", description: "Official registration or incorporation number" },
11928
11988
  date_incorporated: { type: "string", description: "Date the entity was incorporated (ISO format)" }
11929
11989
  },
11930
11990
  // LibraryDependencyProperties: Library or package dependency.
@@ -12195,8 +12255,7 @@ var UPG_PROPERTY_SCHEMA = {
12195
12255
  opportunity: {},
12196
12256
  // OrganizationProperties: Organization entity.
12197
12257
  organization: {
12198
- logo_url: { type: "string", description: "URL of the organisation's logo" },
12199
- billing_plan: { type: "string", description: "Current billing / subscription plan" },
12258
+ logo_url: { type: "string", description: "URL of the organisation's logo", modifier: "volatile" },
12200
12259
  industry: { type: "string", description: "Industry vertical the organisation operates in" }
12201
12260
  },
12202
12261
  // OutcomeProperties: A measurable change in user or business state the product drives.
@@ -12282,7 +12341,6 @@ var UPG_PROPERTY_SCHEMA = {
12282
12341
  },
12283
12342
  // PersonProperties: Person entity. A named, accountable individual.
12284
12343
  person: {
12285
- email: { type: "string", description: "Primary contact email. Stable identifier for de-duplication." },
12286
12344
  role_title: { type: "string", description: "Free-text job title. Distinct from the structured `role` entity." },
12287
12345
  time_zone: { type: "string", description: 'IANA time zone (e.g. "Europe/Berlin"). Useful for capacity / on-call planning.' }
12288
12346
  },
@@ -12380,8 +12438,8 @@ var UPG_PROPERTY_SCHEMA = {
12380
12438
  product: {
12381
12439
  stage: { type: "string", enum: ["concept", "validation", "build", "beta", "launch", "growth", "mature", "maintenance", "sunset"], description: "Lifecycle stage" },
12382
12440
  health_status: { type: "string", enum: ["on_track", "at_risk", "off_track"], description: "Overall health" },
12383
- url: { type: "string", description: "Where the product lives. Marketing site, app store URL, etc." },
12384
- logo_url: { type: "string", description: "Logo or icon URL. Used to render product cards and lists." },
12441
+ url: { type: "string", description: "Where the product lives. Marketing site, app store URL, etc.", modifier: "volatile" },
12442
+ logo_url: { type: "string", description: "Logo or icon URL. Used to render product cards and lists.", modifier: "volatile" },
12385
12443
  launched_at: { type: "string", description: "When the product became generally available (ISO 8601)" }
12386
12444
  },
12387
12445
  // ProductAreaProperties: ProductArea entity.
@@ -13257,7 +13315,7 @@ var UPG_PROPERTY_SCHEMA = {
13257
13315
  version: { type: "string", description: 'Version or iteration (e.g. "v2", "2026-04-B")' },
13258
13316
  tool: { type: "string", description: 'Authoring tool. @example "Figma", "Balsamiq", "pen and paper"' },
13259
13317
  review_status: { type: "string", enum: ["draft", "in_review", "approved", "rejected"], description: "Review gate status" },
13260
- linked_prototype_url: { type: "string", description: "URL of the corresponding interactive prototype" }
13318
+ linked_prototype_url: { type: "string", description: "URL of the corresponding interactive prototype", modifier: "volatile" }
13261
13319
  },
13262
13320
  // WorkflowArtifactProperties: Workflow artifact.
13263
13321
  workflow_artifact: {
@@ -13289,7 +13347,6 @@ var UPG_PROPERTY_SCHEMA = {
13289
13347
  },
13290
13348
  // WorkspaceProperties: Workspace: a spatial thinking space for arranging entities.
13291
13349
  workspace: {
13292
- slug: { type: "string", description: "URL-friendly identifier" },
13293
13350
  visibility: { type: "string", enum: ["private", "shared", "public"], description: "Who can see this workspace" },
13294
13351
  purpose: { type: "string", description: "Free-text description. Pairs with the closed-enum `workspace_purpose`." },
13295
13352
  workspace_purpose: { type: "string", enum: ["discovery", "planning", "retrospective", "design", "research", "strategy", "general"], description: "Closed-enum classifier. Drives template suggestions and surfaces in workspace browsers. `discovery` = persona/job/opportunity exploration. `planning` = roadmap and decision sessions. `retrospective` = reflection on shipped work. `design` = experience or UI exploration. `research` = organising study data and synthesis. `strategy` = high-level direction setting. `general` = catch-all." },
@@ -29615,7 +29672,7 @@ function isCanonical(text) {
29615
29672
  }
29616
29673
 
29617
29674
  // src/index.ts
29618
- var UPG_VERSION = "0.15.0";
29675
+ var UPG_VERSION = "0.16.0";
29619
29676
  var UPG_FORMAT_VERSION = "0.4.0";
29620
29677
  var MARKDOWN_FORMAT_VERSION = "0.1";
29621
29678
  var UPG_TYPES = getTypes();