@unified-product-graph/core 0.15.0 → 0.16.1

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.d.cts CHANGED
@@ -10001,15 +10001,12 @@ type MarketingPlatform = 'discord' | 'email' | 'google' | 'instagram' | 'linkedi
10001
10001
  * @example
10002
10002
  * const properties: OrganizationProperties = {
10003
10003
  * logo_url: 'https://arkheiev.com/logo.svg',
10004
- * billing_plan: 'business-annual',
10005
10004
  * industry: 'Developer Tools',
10006
10005
  * }
10007
10006
  */
10008
10007
  interface OrganizationProperties {
10009
10008
  /** URL of the organisation's logo */
10010
10009
  logo_url?: string;
10011
- /** Current billing / subscription plan */
10012
- billing_plan?: string;
10013
10010
  /** Industry vertical the organisation operates in */
10014
10011
  industry?: string;
10015
10012
  }
@@ -13350,8 +13347,6 @@ interface InvestigationProperties {
13350
13347
  resolved_at?: ISODateTime;
13351
13348
  /** 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. */
13352
13349
  lead_investigator?: string;
13353
- /** Originating session */
13354
- session_id?: string;
13355
13350
  /**
13356
13351
  * Kind of issue under investigation. Distinct from `RootCauseProperties.cause_category`,
13357
13352
  * which captures *why something went wrong*.
@@ -15072,7 +15067,6 @@ interface InternalDocProperties {
15072
15067
  * source_url: 'https://github.com/unified-product-graph/core/blob/main/spec/v0.2/upg-core.md',
15073
15068
  * platform: 'markdown',
15074
15069
  * document_type: 'spec',
15075
- * author: 'fraan@theproductcreator.com',
15076
15070
  * last_updated: '2026-04-28T13:27:08Z',
15077
15071
  * word_count: 2480,
15078
15072
  * content_summary: 'Defines the v0.2 entity catalogue, edge catalogue, and migration adapters.',
@@ -15087,8 +15081,6 @@ interface DocumentProperties {
15087
15081
  platform?: 'markdown' | 'notion' | 'figma' | 'google_docs' | 'confluence' | 'github' | 'linear' | 'other';
15088
15082
  /** Purpose classification */
15089
15083
  document_type?: 'vision' | 'plan' | 'decision' | 'research' | 'spec' | 'audit' | 'session' | 'feedback' | 'case-study' | 'narrative' | 'bug-report' | 'archive-collection' | 'rfc' | 'runbook' | 'guide' | 'onboarding' | 'brief' | 'report' | 'reference';
15090
- /** Author (free-form: name, email, or handle). Promote to a `node_owned_by_person` edge if ownership must be queryable. */
15091
- author?: string;
15092
15084
  /** ISO 8601 last-meaningful-update */
15093
15085
  last_updated?: ISODateTime;
15094
15086
  /** Approximate word count. Useful for planning, indexing, summarisation. */
@@ -15176,12 +15168,6 @@ interface LegalEntityProperties {
15176
15168
  jurisdiction?: string;
15177
15169
  /** Description of intellectual property ownership */
15178
15170
  ip_ownership?: string;
15179
- /** Principal business address */
15180
- principal_address?: string;
15181
- /** Tax identification number */
15182
- tax_id?: string;
15183
- /** Official registration or incorporation number */
15184
- registration_number?: string;
15185
15171
  /** Date the entity was incorporated (ISO format) */
15186
15172
  date_incorporated?: string;
15187
15173
  }
@@ -15449,14 +15435,11 @@ interface RoleProperties {
15449
15435
  *
15450
15436
  * @example
15451
15437
  * const properties: PersonProperties = {
15452
- * email: 'ada@example.com',
15453
15438
  * role_title: 'Product Engineer',
15454
15439
  * time_zone: 'Europe/Berlin',
15455
15440
  * }
15456
15441
  */
15457
15442
  interface PersonProperties {
15458
- /** Primary contact email. Stable identifier for de-duplication. */
15459
- email?: string;
15460
15443
  /** Free-text job title. Distinct from the structured `role` entity. */
15461
15444
  role_title?: string;
15462
15445
  /** IANA time zone (e.g. "Europe/Berlin"). Useful for capacity / on-call planning. */
@@ -15800,8 +15783,6 @@ interface AiModelProperties {
15800
15783
  model_version?: string;
15801
15784
  /** Intended use case */
15802
15785
  model_purpose?: string;
15803
- /** Cost per 1,000 tokens */
15804
- cost_per_1k_tokens?: number;
15805
15786
  /** Maximum context window (tokens) */
15806
15787
  context_window?: number;
15807
15788
  /** Median latency (p50, ms) */
@@ -17186,25 +17167,17 @@ interface AccountProperties {
17186
17167
  industry?: string;
17187
17168
  /** Number of employees at the account */
17188
17169
  employee_count?: number;
17189
- /** Annual revenue of the account */
17190
- annual_revenue?: number;
17191
17170
  }
17192
17171
  /** Contact.
17193
17172
  *
17194
17173
  * @example
17195
17174
  * const properties: ContactProperties = {
17196
17175
  * contact_role: 'champion',
17197
- * email: 'sam.patel@arkheiev.com',
17198
- * phone: '+49 30 123456',
17199
17176
  * }
17200
17177
  */
17201
17178
  interface ContactProperties {
17202
17179
  /** Job title or role within the account */
17203
17180
  contact_role?: string;
17204
- /** Email address */
17205
- email?: string;
17206
- /** Phone number */
17207
- phone?: string;
17208
17181
  /** Whether this person has purchasing authority */
17209
17182
  is_decision_maker?: boolean;
17210
17183
  }
@@ -18190,7 +18163,6 @@ interface PartnerRevenueShareProperties {
18190
18163
  *
18191
18164
  * @example
18192
18165
  * const properties: WorkspaceProperties = {
18193
- * slug: 'q2-discovery',
18194
18166
  * visibility: 'shared',
18195
18167
  * purpose: 'Arrange personas, jobs, and opportunities for the Q2 discovery sprint.',
18196
18168
  * workspace_purpose: 'discovery',
@@ -18202,8 +18174,6 @@ interface PartnerRevenueShareProperties {
18202
18174
  * }
18203
18175
  */
18204
18176
  interface WorkspaceProperties {
18205
- /** URL-friendly identifier */
18206
- slug?: string;
18207
18177
  /** Who can see this workspace */
18208
18178
  visibility?: 'private' | 'shared' | 'public';
18209
18179
  /** Free-text description. Pairs with the closed-enum `workspace_purpose`. */
@@ -21839,7 +21809,7 @@ declare function isCanonical(text: string): boolean;
21839
21809
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
21840
21810
  * The `check:version-lockstep` gate enforces this at release time.
21841
21811
  */
21842
- declare const UPG_VERSION: "0.15.0";
21812
+ declare const UPG_VERSION: "0.16.1";
21843
21813
  /**
21844
21814
  * The `.upg` JSON document format version. Written to the `upg_version` field.
21845
21815
  * Evolves independently from `UPG_VERSION` (the catalogue version).
package/dist/index.d.ts CHANGED
@@ -10001,15 +10001,12 @@ type MarketingPlatform = 'discord' | 'email' | 'google' | 'instagram' | 'linkedi
10001
10001
  * @example
10002
10002
  * const properties: OrganizationProperties = {
10003
10003
  * logo_url: 'https://arkheiev.com/logo.svg',
10004
- * billing_plan: 'business-annual',
10005
10004
  * industry: 'Developer Tools',
10006
10005
  * }
10007
10006
  */
10008
10007
  interface OrganizationProperties {
10009
10008
  /** URL of the organisation's logo */
10010
10009
  logo_url?: string;
10011
- /** Current billing / subscription plan */
10012
- billing_plan?: string;
10013
10010
  /** Industry vertical the organisation operates in */
10014
10011
  industry?: string;
10015
10012
  }
@@ -13350,8 +13347,6 @@ interface InvestigationProperties {
13350
13347
  resolved_at?: ISODateTime;
13351
13348
  /** 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. */
13352
13349
  lead_investigator?: string;
13353
- /** Originating session */
13354
- session_id?: string;
13355
13350
  /**
13356
13351
  * Kind of issue under investigation. Distinct from `RootCauseProperties.cause_category`,
13357
13352
  * which captures *why something went wrong*.
@@ -15072,7 +15067,6 @@ interface InternalDocProperties {
15072
15067
  * source_url: 'https://github.com/unified-product-graph/core/blob/main/spec/v0.2/upg-core.md',
15073
15068
  * platform: 'markdown',
15074
15069
  * document_type: 'spec',
15075
- * author: 'fraan@theproductcreator.com',
15076
15070
  * last_updated: '2026-04-28T13:27:08Z',
15077
15071
  * word_count: 2480,
15078
15072
  * content_summary: 'Defines the v0.2 entity catalogue, edge catalogue, and migration adapters.',
@@ -15087,8 +15081,6 @@ interface DocumentProperties {
15087
15081
  platform?: 'markdown' | 'notion' | 'figma' | 'google_docs' | 'confluence' | 'github' | 'linear' | 'other';
15088
15082
  /** Purpose classification */
15089
15083
  document_type?: 'vision' | 'plan' | 'decision' | 'research' | 'spec' | 'audit' | 'session' | 'feedback' | 'case-study' | 'narrative' | 'bug-report' | 'archive-collection' | 'rfc' | 'runbook' | 'guide' | 'onboarding' | 'brief' | 'report' | 'reference';
15090
- /** Author (free-form: name, email, or handle). Promote to a `node_owned_by_person` edge if ownership must be queryable. */
15091
- author?: string;
15092
15084
  /** ISO 8601 last-meaningful-update */
15093
15085
  last_updated?: ISODateTime;
15094
15086
  /** Approximate word count. Useful for planning, indexing, summarisation. */
@@ -15176,12 +15168,6 @@ interface LegalEntityProperties {
15176
15168
  jurisdiction?: string;
15177
15169
  /** Description of intellectual property ownership */
15178
15170
  ip_ownership?: string;
15179
- /** Principal business address */
15180
- principal_address?: string;
15181
- /** Tax identification number */
15182
- tax_id?: string;
15183
- /** Official registration or incorporation number */
15184
- registration_number?: string;
15185
15171
  /** Date the entity was incorporated (ISO format) */
15186
15172
  date_incorporated?: string;
15187
15173
  }
@@ -15449,14 +15435,11 @@ interface RoleProperties {
15449
15435
  *
15450
15436
  * @example
15451
15437
  * const properties: PersonProperties = {
15452
- * email: 'ada@example.com',
15453
15438
  * role_title: 'Product Engineer',
15454
15439
  * time_zone: 'Europe/Berlin',
15455
15440
  * }
15456
15441
  */
15457
15442
  interface PersonProperties {
15458
- /** Primary contact email. Stable identifier for de-duplication. */
15459
- email?: string;
15460
15443
  /** Free-text job title. Distinct from the structured `role` entity. */
15461
15444
  role_title?: string;
15462
15445
  /** IANA time zone (e.g. "Europe/Berlin"). Useful for capacity / on-call planning. */
@@ -15800,8 +15783,6 @@ interface AiModelProperties {
15800
15783
  model_version?: string;
15801
15784
  /** Intended use case */
15802
15785
  model_purpose?: string;
15803
- /** Cost per 1,000 tokens */
15804
- cost_per_1k_tokens?: number;
15805
15786
  /** Maximum context window (tokens) */
15806
15787
  context_window?: number;
15807
15788
  /** Median latency (p50, ms) */
@@ -17186,25 +17167,17 @@ interface AccountProperties {
17186
17167
  industry?: string;
17187
17168
  /** Number of employees at the account */
17188
17169
  employee_count?: number;
17189
- /** Annual revenue of the account */
17190
- annual_revenue?: number;
17191
17170
  }
17192
17171
  /** Contact.
17193
17172
  *
17194
17173
  * @example
17195
17174
  * const properties: ContactProperties = {
17196
17175
  * contact_role: 'champion',
17197
- * email: 'sam.patel@arkheiev.com',
17198
- * phone: '+49 30 123456',
17199
17176
  * }
17200
17177
  */
17201
17178
  interface ContactProperties {
17202
17179
  /** Job title or role within the account */
17203
17180
  contact_role?: string;
17204
- /** Email address */
17205
- email?: string;
17206
- /** Phone number */
17207
- phone?: string;
17208
17181
  /** Whether this person has purchasing authority */
17209
17182
  is_decision_maker?: boolean;
17210
17183
  }
@@ -18190,7 +18163,6 @@ interface PartnerRevenueShareProperties {
18190
18163
  *
18191
18164
  * @example
18192
18165
  * const properties: WorkspaceProperties = {
18193
- * slug: 'q2-discovery',
18194
18166
  * visibility: 'shared',
18195
18167
  * purpose: 'Arrange personas, jobs, and opportunities for the Q2 discovery sprint.',
18196
18168
  * workspace_purpose: 'discovery',
@@ -18202,8 +18174,6 @@ interface PartnerRevenueShareProperties {
18202
18174
  * }
18203
18175
  */
18204
18176
  interface WorkspaceProperties {
18205
- /** URL-friendly identifier */
18206
- slug?: string;
18207
18177
  /** Who can see this workspace */
18208
18178
  visibility?: 'private' | 'shared' | 'public';
18209
18179
  /** Free-text description. Pairs with the closed-enum `workspace_purpose`. */
@@ -21839,7 +21809,7 @@ declare function isCanonical(text: string): boolean;
21839
21809
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
21840
21810
  * The `check:version-lockstep` gate enforces this at release time.
21841
21811
  */
21842
- declare const UPG_VERSION: "0.15.0";
21812
+ declare const UPG_VERSION: "0.16.1";
21843
21813
  /**
21844
21814
  * The `.upg` JSON document format version. Written to the `upg_version` field.
21845
21815
  * Evolves independently from `UPG_VERSION` (the catalogue version).
package/dist/index.js CHANGED
@@ -7381,6 +7381,75 @@ function getDeprecatedTypes() {
7381
7381
  return deprecated;
7382
7382
  }
7383
7383
  var UPG_PROPERTY_MIGRATIONS = {
7384
+ // ── v0.16.0: Pattern G — open-standard data boundary (UPG-691) ───────────────
7385
+ //
7386
+ // The portable graph holds modeling knowledge, not PII, registry filings,
7387
+ // app-session ids, or live vendor figures. These flowed through every export /
7388
+ // snapshot / sync. They are dropped from the body and belong to the hosting
7389
+ // app's identity / tenancy / measurement layer instead (boundary ADR
7390
+ // 2026-06-16-open-standard-data-boundary). The infra-pointer URLs that stay
7391
+ // (repo_url, storage_uri, *.logo_url, help_video.url, ...) were marked
7392
+ // `modifier:'volatile'` in this release rather than dropped, so a consumer
7393
+ // knows they are environment-specific and may be stripped on export. The
7394
+ // `owner: string` -> ownership-edge migration (C1) is a separate, larger wave
7395
+ // (0.17.0). (FALSE-POSITIVE guard kept: specification.spec_url, design_token.value,
7396
+ // vulnerability.cve_id, screen.route, bug.environment -- content / standard refs.)
7397
+ "0.16.0": [
7398
+ {
7399
+ kind: "drop_props",
7400
+ type: "person",
7401
+ drop_props: ["email"],
7402
+ 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."
7403
+ },
7404
+ {
7405
+ kind: "drop_props",
7406
+ type: "contact",
7407
+ drop_props: ["email", "phone"],
7408
+ reason: "UPG-691 boundary: contact.email / contact.phone are PII for the app identity layer, not the portable graph."
7409
+ },
7410
+ {
7411
+ kind: "drop_props",
7412
+ type: "document",
7413
+ drop_props: ["author"],
7414
+ reason: "UPG-691 boundary: document.author was free-text name/email (PII). The authoring actor is referenced by edge, not inlined."
7415
+ },
7416
+ {
7417
+ kind: "drop_props",
7418
+ type: "legal_entity",
7419
+ drop_props: ["tax_id", "registration_number", "principal_address"],
7420
+ reason: "UPG-691 boundary: government / registry identifiers belong to the tenancy / records system, not the open interchange body."
7421
+ },
7422
+ {
7423
+ kind: "drop_props",
7424
+ type: "investigation",
7425
+ drop_props: ["session_id"],
7426
+ reason: "UPG-691 boundary: investigation.session_id is an app-runtime / routing artifact, not modeling knowledge."
7427
+ },
7428
+ {
7429
+ kind: "drop_props",
7430
+ type: "workspace",
7431
+ drop_props: ["slug"],
7432
+ reason: "UPG-691 boundary: workspace.slug is an app-routing artifact, not modeling knowledge."
7433
+ },
7434
+ {
7435
+ kind: "drop_props",
7436
+ type: "organization",
7437
+ drop_props: ["billing_plan"],
7438
+ reason: "UPG-691 boundary: organization.billing_plan is a SaaS-account/tenancy concept. Model it via subscription / pricing_tier, not on the structural entity."
7439
+ },
7440
+ {
7441
+ kind: "drop_props",
7442
+ type: "account",
7443
+ drop_props: ["annual_revenue"],
7444
+ reason: "UPG-691 boundary: account.annual_revenue is live firmographic vendor data. Route live figures to a metric node, not the definition entity."
7445
+ },
7446
+ {
7447
+ kind: "drop_props",
7448
+ type: "ai_model",
7449
+ drop_props: ["cost_per_1k_tokens"],
7450
+ 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."
7451
+ }
7452
+ ],
7384
7453
  // ── v0.15.0: Pattern D — collapse *_status shadows into the lifecycle ─────────
7385
7454
  //
7386
7455
  // 14 `*_status` enum properties whose values ARE the entity's own lifecycle
@@ -9942,8 +10011,8 @@ var UPG_PROPERTY_SCHEMA = {
9942
10011
  rule_id: { type: "string", description: "Identifier of the rule that flagged the issue" },
9943
10012
  help_url: { type: "string", description: "URL to documentation explaining the issue and how to fix it" },
9944
10013
  affected_element: { type: "string", description: "Description of the affected UI element" },
9945
- css_selector: { type: "string", description: "CSS selector targeting the affected element" },
9946
- html_snippet: { type: "string", description: "HTML snippet containing the violation" },
10014
+ css_selector: { type: "string", description: "CSS selector targeting the affected element", modifier: "volatile" },
10015
+ html_snippet: { type: "string", description: "HTML snippet containing the violation", modifier: "volatile" },
9947
10016
  tags: { type: "string[]", description: 'Tags from the audit tool (e.g. "wcag2aa", "cat.color")' },
9948
10017
  remediation: { type: "string", description: "Recommended fix for the issue" },
9949
10018
  impact_description: { type: "string", description: "Description of the user impact" }
@@ -9970,8 +10039,7 @@ var UPG_PROPERTY_SCHEMA = {
9970
10039
  account: {
9971
10040
  account_type: { type: "string", enum: ["prospect", "customer", "partner", "churned"], description: "Relationship status of this account" },
9972
10041
  industry: { type: "string", description: "Industry vertical the account operates in" },
9973
- employee_count: { type: "number", description: "Number of employees at the account", modifier: "snapshot" },
9974
- annual_revenue: { type: "number", description: "Annual revenue of the account" }
10042
+ employee_count: { type: "number", description: "Number of employees at the account", modifier: "snapshot" }
9975
10043
  },
9976
10044
  // AcquisitionChannelProperties: AcquisitionChannel entity.
9977
10045
  acquisition_channel: {
@@ -10076,7 +10144,7 @@ var UPG_PROPERTY_SCHEMA = {
10076
10144
  version: { type: "string", description: "Version" },
10077
10145
  record_count: { type: "number", description: "Records", modifier: "snapshot" },
10078
10146
  format: { type: "string", description: 'Format (e.g. "jsonl", "csv", "parquet")' },
10079
- storage_uri: { type: "string", description: "Storage URI" },
10147
+ storage_uri: { type: "string", description: "Storage URI", modifier: "volatile" },
10080
10148
  checksum: { type: "string", description: "Integrity hash" },
10081
10149
  provenance: { type: "string", enum: ["human_labelled", "synthetic", "scraped", "converted", "mixed"], description: "Origin" },
10082
10150
  license: { type: "string", description: "SPDX license identifier" },
@@ -10091,7 +10159,7 @@ var UPG_PROPERTY_SCHEMA = {
10091
10159
  started_at: { type: "string", description: "ISO timestamp started" },
10092
10160
  completed_at: { type: "string", description: "ISO timestamp completed" },
10093
10161
  training_steps: { type: "number", description: "Training steps or epochs completed" },
10094
- artifact_uri: { type: "string", description: "Produced artifact URI" },
10162
+ artifact_uri: { type: "string", description: "Produced artifact URI", modifier: "volatile" },
10095
10163
  notes: { type: "string", description: "Free-text notes" },
10096
10164
  tags: { type: "string[]", description: "Free-form classification tags" }
10097
10165
  },
@@ -10104,10 +10172,9 @@ var UPG_PROPERTY_SCHEMA = {
10104
10172
  // AiModelProperties: AI model.
10105
10173
  ai_model: {
10106
10174
  model_provider: { type: "string", enum: ["anthropic", "openai", "google", "meta", "mistral", "custom"], description: "Provider or vendor" },
10107
- model_id: { type: "string", description: 'Unique model identifier (e.g. "claude-sonnet-4-20250514")' },
10175
+ model_id: { type: "string", description: 'Unique model identifier (e.g. "claude-sonnet-4-20250514")', modifier: "volatile" },
10108
10176
  model_version: { type: "string", description: "Specific version" },
10109
10177
  model_purpose: { type: "string", description: "Intended use case" },
10110
- cost_per_1k_tokens: { type: "number", description: "Cost per 1,000 tokens", modifier: "snapshot" },
10111
10178
  context_window: { type: "number", description: "Maximum context window (tokens)" },
10112
10179
  latency_p50_ms: { type: "number", description: "Median latency (p50, ms)", modifier: "snapshot" },
10113
10180
  latency_p99_ms: { type: "number", description: "Tail latency (p99, ms)", modifier: "snapshot" },
@@ -10146,7 +10213,7 @@ var UPG_PROPERTY_SCHEMA = {
10146
10213
  },
10147
10214
  // ApiContractProperties: API contract.
10148
10215
  api_contract: {
10149
- spec_url: { type: "string", description: "URL of the specification document" },
10216
+ spec_url: { type: "string", description: "URL of the specification document", modifier: "volatile" },
10150
10217
  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." },
10151
10218
  version: { type: "string", description: "API version" },
10152
10219
  owner: { type: "string", description: "Maintaining person or team. Promote to a `node_owned_by_team` edge if ownership must be queryable." }
@@ -10236,7 +10303,7 @@ var UPG_PROPERTY_SCHEMA = {
10236
10303
  // BrandAssetProperties: Brand asset.
10237
10304
  brand_asset: {
10238
10305
  asset_type: { type: "string", enum: ["logo", "icon", "illustration", "photo", "video", "template"], description: "Category of the brand asset" },
10239
- url: { type: "string", description: "URL or path to the asset file" },
10306
+ url: { type: "string", description: "URL or path to the asset file", modifier: "volatile" },
10240
10307
  usage_rights: { type: "string", description: "Usage rights or licensing restrictions" }
10241
10308
  },
10242
10309
  // BrandColourProperties: Brand colour. A single colour in the brand palette.
@@ -10278,7 +10345,7 @@ var UPG_PROPERTY_SCHEMA = {
10278
10345
  approved_backgrounds: { type: "string[]", description: 'Background colours the logo is approved for use on. @example ["#FFFFFF", "#1A1A1A", "#F5F5F5"]' },
10279
10346
  forbidden_backgrounds: { type: "string[]", description: 'Background colours or contexts where the logo must NOT be placed. @example ["busy photography", "low-contrast surfaces"]' },
10280
10347
  file_formats: { type: "string[]", description: 'File formats this logo variant is available in. @example ["svg", "png", "eps", "pdf"]' },
10281
- asset_url: { type: "string", description: "URL to the logo asset file or asset library entry." }
10348
+ asset_url: { type: "string", description: "URL to the logo asset file or asset library entry.", modifier: "volatile" }
10282
10349
  },
10283
10350
  // BrandTypographyProperties: Brand typography. A font family and its usage rules.
10284
10351
  brand_typography: {
@@ -10327,8 +10394,8 @@ var UPG_PROPERTY_SCHEMA = {
10327
10394
  artifact_type: { type: "string", enum: ["docker_image", "npm_package", "binary", "static_assets", "other"], description: "Type" },
10328
10395
  version: { type: "string", description: "Version" },
10329
10396
  size: { type: "string", description: 'Human-readable size (e.g. "12.4 MB")' },
10330
- registry: { type: "string", description: "Registry or storage location" },
10331
- build_url: { type: "string", description: "URL of the producing CI/CD build run (GitHub Actions, CircleCI, etc.)." }
10397
+ registry: { type: "string", description: "Registry or storage location", modifier: "volatile" },
10398
+ build_url: { type: "string", description: "URL of the producing CI/CD build run (GitHub Actions, CircleCI, etc.).", modifier: "volatile" }
10332
10399
  },
10333
10400
  // BusinessModelProperties: BusinessModel: root of a BMC-style model.
10334
10401
  business_model: {
@@ -10561,8 +10628,6 @@ var UPG_PROPERTY_SCHEMA = {
10561
10628
  // ContactProperties: Contact.
10562
10629
  contact: {
10563
10630
  contact_role: { type: "string", description: "Job title or role within the account" },
10564
- email: { type: "string", description: "Email address" },
10565
- phone: { type: "string", description: "Phone number" },
10566
10631
  is_decision_maker: { type: "boolean", description: "Whether this person has purchasing authority" }
10567
10632
  },
10568
10633
  // ContentCalendarProperties: Content calendar.
@@ -10666,7 +10731,7 @@ var UPG_PROPERTY_SCHEMA = {
10666
10731
  // DashboardProperties: Dashboard entity.
10667
10732
  dashboard: {
10668
10733
  tool: { type: "string", enum: ["looker", "amplitude", "mixpanel", "posthog", "custom"], description: "Analytics tool hosting this dashboard" },
10669
- url: { type: "string", description: "URL to the live dashboard" },
10734
+ url: { type: "string", description: "URL to the live dashboard", modifier: "volatile" },
10670
10735
  audience: { type: "string", description: "Intended audience for this dashboard" },
10671
10736
  element_count: { type: "number", description: "Number of widgets or panels on the dashboard", modifier: "derived" },
10672
10737
  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." },
@@ -10821,7 +10886,7 @@ var UPG_PROPERTY_SCHEMA = {
10821
10886
  },
10822
10887
  // DesignConceptProperties: Design concept being explored.
10823
10888
  design_concept: {
10824
- sketch_url: { type: "string", description: "URL of the sketch or visual" },
10889
+ sketch_url: { type: "string", description: "URL of the sketch or visual", modifier: "volatile" },
10825
10890
  rationale: { type: "string", description: "Selection or rejection rationale" },
10826
10891
  concept_status: { type: "string", enum: ["exploring", "validated", "selected", "rejected"], description: "Current selection status" },
10827
10892
  maturity: { type: "string", enum: ["sketch", "refined", "final"], description: "Development stage, from rough idea to presentation-ready" },
@@ -10915,7 +10980,7 @@ var UPG_PROPERTY_SCHEMA = {
10915
10980
  },
10916
10981
  // DeveloperPortalProperties: Developer portal.
10917
10982
  developer_portal: {
10918
- portal_url: { type: "string", description: "URL of the developer portal" },
10983
+ portal_url: { type: "string", description: "URL of the developer portal", modifier: "volatile" },
10919
10984
  doc_count: { type: "number", description: "Number of documentation pages", modifier: "derived" },
10920
10985
  sandbox_available: { type: "boolean", description: "Whether a sandbox environment is available" }
10921
10986
  },
@@ -10938,7 +11003,6 @@ var UPG_PROPERTY_SCHEMA = {
10938
11003
  source_url: { type: "string", description: "Canonical retrievable URL" },
10939
11004
  platform: { type: "string", enum: ["markdown", "notion", "figma", "google_docs", "confluence", "github", "linear", "other"], description: "Hosting platform" },
10940
11005
  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" },
10941
- author: { type: "string", description: "Author (free-form: name, email, or handle). Promote to a `node_owned_by_person` edge if ownership must be queryable." },
10942
11006
  last_updated: { type: "string", description: "ISO 8601 last-meaningful-update" },
10943
11007
  word_count: { type: "number", description: "Approximate word count. Useful for planning, indexing, summarisation.", modifier: "snapshot" },
10944
11008
  content_summary: { type: "string", description: "1\u20133 sentence summary. Drives previews, search snippets, embedding context." },
@@ -11247,7 +11311,7 @@ var UPG_PROPERTY_SCHEMA = {
11247
11311
  fix: {
11248
11312
  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." },
11249
11313
  commit: { type: "string", description: "Git commit SHA" },
11250
- files_changed: { type: "string[]", description: "Files changed" },
11314
+ files_changed: { type: "string[]", description: "Files changed", modifier: "volatile" },
11251
11315
  deployed_at: { type: "string", description: "ISO timestamp landed in the target environment." },
11252
11316
  fixed_date: { type: "string", description: "Application date (ISO date). Coarser-grained complement to `deployed_at`." },
11253
11317
  verified: { type: "boolean", description: "Verified in production" },
@@ -11340,7 +11404,7 @@ var UPG_PROPERTY_SCHEMA = {
11340
11404
  video_type: { type: "string", enum: ["how_to", "overview", "troubleshooting", "best_practice"], description: "Purpose of the video" },
11341
11405
  duration_seconds: { type: "number", description: "Duration of the video in seconds" },
11342
11406
  views: { type: "number", description: "Total number of views" },
11343
- url: { type: "string", description: "URL where the video is hosted" }
11407
+ url: { type: "string", description: "URL where the video is hosted", modifier: "volatile" }
11344
11408
  },
11345
11409
  // HypothesisProperties: A testable belief. The canonical design artefact for validating product assumptions.
11346
11410
  hypothesis: {
@@ -11483,7 +11547,6 @@ var UPG_PROPERTY_SCHEMA = {
11483
11547
  started_at: { type: "string", description: "ISO timestamp the investigation began" },
11484
11548
  resolved_at: { type: "string", description: "ISO timestamp the investigation was concluded. Pairs with `status === 'resolved' | 'abandoned'`." },
11485
11549
  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." },
11486
- session_id: { type: "string", description: "Originating session" },
11487
11550
  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*." }
11488
11551
  },
11489
11552
  // InvoiceProperties: Invoice.
@@ -11688,9 +11751,6 @@ var UPG_PROPERTY_SCHEMA = {
11688
11751
  entity_type: { type: "string", enum: ["corporation", "llc", "partnership", "sole_proprietor", "nonprofit"], description: "Legal structure of the entity" },
11689
11752
  jurisdiction: { type: "string", description: "Jurisdiction where the entity is registered" },
11690
11753
  ip_ownership: { type: "string", description: "Description of intellectual property ownership" },
11691
- principal_address: { type: "string", description: "Principal business address" },
11692
- tax_id: { type: "string", description: "Tax identification number" },
11693
- registration_number: { type: "string", description: "Official registration or incorporation number" },
11694
11754
  date_incorporated: { type: "string", description: "Date the entity was incorporated (ISO format)" }
11695
11755
  },
11696
11756
  // LibraryDependencyProperties: Library or package dependency.
@@ -11961,8 +12021,7 @@ var UPG_PROPERTY_SCHEMA = {
11961
12021
  opportunity: {},
11962
12022
  // OrganizationProperties: Organization entity.
11963
12023
  organization: {
11964
- logo_url: { type: "string", description: "URL of the organisation's logo" },
11965
- billing_plan: { type: "string", description: "Current billing / subscription plan" },
12024
+ logo_url: { type: "string", description: "URL of the organisation's logo", modifier: "volatile" },
11966
12025
  industry: { type: "string", description: "Industry vertical the organisation operates in" }
11967
12026
  },
11968
12027
  // OutcomeProperties: A measurable change in user or business state the product drives.
@@ -12048,7 +12107,6 @@ var UPG_PROPERTY_SCHEMA = {
12048
12107
  },
12049
12108
  // PersonProperties: Person entity. A named, accountable individual.
12050
12109
  person: {
12051
- email: { type: "string", description: "Primary contact email. Stable identifier for de-duplication." },
12052
12110
  role_title: { type: "string", description: "Free-text job title. Distinct from the structured `role` entity." },
12053
12111
  time_zone: { type: "string", description: 'IANA time zone (e.g. "Europe/Berlin"). Useful for capacity / on-call planning.' }
12054
12112
  },
@@ -12146,8 +12204,8 @@ var UPG_PROPERTY_SCHEMA = {
12146
12204
  product: {
12147
12205
  stage: { type: "string", enum: ["concept", "validation", "build", "beta", "launch", "growth", "mature", "maintenance", "sunset"], description: "Lifecycle stage" },
12148
12206
  health_status: { type: "string", enum: ["on_track", "at_risk", "off_track"], description: "Overall health" },
12149
- url: { type: "string", description: "Where the product lives. Marketing site, app store URL, etc." },
12150
- logo_url: { type: "string", description: "Logo or icon URL. Used to render product cards and lists." },
12207
+ url: { type: "string", description: "Where the product lives. Marketing site, app store URL, etc.", modifier: "volatile" },
12208
+ logo_url: { type: "string", description: "Logo or icon URL. Used to render product cards and lists.", modifier: "volatile" },
12151
12209
  launched_at: { type: "string", description: "When the product became generally available (ISO 8601)" }
12152
12210
  },
12153
12211
  // ProductAreaProperties: ProductArea entity.
@@ -13023,7 +13081,7 @@ var UPG_PROPERTY_SCHEMA = {
13023
13081
  version: { type: "string", description: 'Version or iteration (e.g. "v2", "2026-04-B")' },
13024
13082
  tool: { type: "string", description: 'Authoring tool. @example "Figma", "Balsamiq", "pen and paper"' },
13025
13083
  review_status: { type: "string", enum: ["draft", "in_review", "approved", "rejected"], description: "Review gate status" },
13026
- linked_prototype_url: { type: "string", description: "URL of the corresponding interactive prototype" }
13084
+ linked_prototype_url: { type: "string", description: "URL of the corresponding interactive prototype", modifier: "volatile" }
13027
13085
  },
13028
13086
  // WorkflowArtifactProperties: Workflow artifact.
13029
13087
  workflow_artifact: {
@@ -13055,7 +13113,6 @@ var UPG_PROPERTY_SCHEMA = {
13055
13113
  },
13056
13114
  // WorkspaceProperties: Workspace: a spatial thinking space for arranging entities.
13057
13115
  workspace: {
13058
- slug: { type: "string", description: "URL-friendly identifier" },
13059
13116
  visibility: { type: "string", enum: ["private", "shared", "public"], description: "Who can see this workspace" },
13060
13117
  purpose: { type: "string", description: "Free-text description. Pairs with the closed-enum `workspace_purpose`." },
13061
13118
  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." },
@@ -29381,7 +29438,7 @@ function isCanonical(text) {
29381
29438
  }
29382
29439
 
29383
29440
  // src/index.ts
29384
- var UPG_VERSION = "0.15.0";
29441
+ var UPG_VERSION = "0.16.1";
29385
29442
  var UPG_FORMAT_VERSION = "0.4.0";
29386
29443
  var MARKDOWN_FORMAT_VERSION = "0.1";
29387
29444
  var UPG_TYPES = getTypes();