@unified-product-graph/core 0.14.1 → 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.js CHANGED
@@ -7381,6 +7381,187 @@ 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
+ ],
7453
+ // ── v0.15.0: Pattern D — collapse *_status shadows into the lifecycle ─────────
7454
+ //
7455
+ // 14 `*_status` enum properties whose values ARE the entity's own lifecycle
7456
+ // phase set (UPG-689 Pattern D, the T1.1 guardrail set). They re-encoded the
7457
+ // lifecycle as a property, shadowing the base-node `status` field that the
7458
+ // lifecycle already drives. Each property is removed and any authored value
7459
+ // LIFTS to `UPGBaseNode.status` (same convention as 0.9.14 kr_status). Two
7460
+ // diverge in vocabulary from their own lifecycle and remap on lift:
7461
+ // - marketing_channel.channel_status: deprecated -> sunset
7462
+ // - security_audit.audit_status: scheduled -> planning, in_progress -> active
7463
+ "0.15.0": [
7464
+ {
7465
+ kind: "lift_property_to_top_level",
7466
+ type: "agent_definition",
7467
+ from_property: "agent_status",
7468
+ to: "status",
7469
+ reason: "UPG-689 Pattern D: agent_status duplicated the agent_definition lifecycle (testing/active/disabled). Removed in 0.15.0; the authored value lifts to UPGBaseNode.status."
7470
+ },
7471
+ {
7472
+ kind: "lift_property_to_top_level",
7473
+ type: "data_pipeline",
7474
+ from_property: "pipeline_status",
7475
+ to: "status",
7476
+ reason: "UPG-689 Pattern D: pipeline_status duplicated the data_pipeline lifecycle (active/paused/failed/deprecated). Removed in 0.15.0; lifts to status."
7477
+ },
7478
+ {
7479
+ kind: "lift_property_to_top_level",
7480
+ type: "database_schema",
7481
+ from_property: "migration_status",
7482
+ to: "status",
7483
+ reason: "UPG-689 Pattern D: migration_status duplicated the database_schema lifecycle (current/pending/failed). Removed in 0.15.0; lifts to status."
7484
+ },
7485
+ {
7486
+ kind: "lift_property_to_top_level",
7487
+ type: "deployment",
7488
+ from_property: "deploy_status",
7489
+ to: "status",
7490
+ reason: "UPG-689 Pattern D: deploy_status duplicated the deployment lifecycle (rolling/success/failure). Removed in 0.15.0; lifts to status."
7491
+ },
7492
+ {
7493
+ kind: "lift_property_to_top_level",
7494
+ type: "external_api",
7495
+ from_property: "api_status",
7496
+ to: "status",
7497
+ reason: "UPG-689 Pattern D: api_status duplicated the external_api lifecycle (beta/active/deprecated/unavailable). Removed in 0.15.0; lifts to status."
7498
+ },
7499
+ {
7500
+ kind: "lift_property_to_top_level",
7501
+ type: "feature_area",
7502
+ from_property: "area_status",
7503
+ to: "status",
7504
+ reason: "UPG-689 Pattern D: area_status duplicated the feature_area lifecycle (planned/active/deprecated). Removed in 0.15.0; lifts to status."
7505
+ },
7506
+ {
7507
+ kind: "lift_property_to_top_level",
7508
+ type: "feature_flag",
7509
+ from_property: "flag_status",
7510
+ to: "status",
7511
+ reason: "UPG-689 Pattern D: flag_status duplicated the feature_flag lifecycle (off/rollout/on). Removed in 0.15.0; lifts to status."
7512
+ },
7513
+ {
7514
+ kind: "lift_property_to_top_level",
7515
+ type: "objective",
7516
+ from_property: "objective_status",
7517
+ to: "status",
7518
+ reason: "UPG-689 Pattern D: objective_status duplicated the objective lifecycle (active/achieved/deferred). Removed in 0.15.0; lifts to status."
7519
+ },
7520
+ {
7521
+ kind: "lift_property_to_top_level",
7522
+ type: "outcome",
7523
+ from_property: "outcome_status",
7524
+ to: "status",
7525
+ reason: "UPG-689 Pattern D: outcome_status duplicated the outcome lifecycle (identified/measuring/achieved/abandoned). Removed in 0.15.0; lifts to status."
7526
+ },
7527
+ {
7528
+ kind: "lift_property_to_top_level",
7529
+ type: "prototype",
7530
+ from_property: "test_status",
7531
+ to: "status",
7532
+ reason: "UPG-689 Pattern D: test_status duplicated the prototype lifecycle (untested/testing/passed/failed). Removed in 0.15.0; lifts to status."
7533
+ },
7534
+ {
7535
+ kind: "lift_property_to_top_level",
7536
+ type: "review_gate",
7537
+ from_property: "gate_status",
7538
+ to: "status",
7539
+ reason: "UPG-689 Pattern D: gate_status duplicated the review_gate lifecycle (pending/approved/rejected/bypassed). Removed in 0.15.0; lifts to status."
7540
+ },
7541
+ {
7542
+ kind: "lift_property_to_top_level",
7543
+ type: "roadmap_item",
7544
+ from_property: "item_status",
7545
+ to: "status",
7546
+ reason: "UPG-689 Pattern D: item_status duplicated the roadmap_item lifecycle (planned/in_progress/shipped/deferred). Removed in 0.15.0; lifts to status."
7547
+ },
7548
+ {
7549
+ kind: "lift_property_to_top_level",
7550
+ type: "marketing_channel",
7551
+ from_property: "channel_status",
7552
+ to: "status",
7553
+ value_map: { deprecated: "sunset" },
7554
+ reason: "UPG-689 Pattern D: channel_status (active/paused/deprecated) re-encoded the marketing_channel lifecycle (planning/active/paused/completed/sunset). Removed in 0.15.0; lifts to status with deprecated -> sunset."
7555
+ },
7556
+ {
7557
+ kind: "lift_property_to_top_level",
7558
+ type: "security_audit",
7559
+ from_property: "audit_status",
7560
+ to: "status",
7561
+ value_map: { scheduled: "planning", in_progress: "active" },
7562
+ reason: "UPG-689 Pattern D: audit_status (scheduled/in_progress/completed) re-encoded the security_audit lifecycle (planning/active/paused/completed/sunset). Removed in 0.15.0; lifts to status with scheduled -> planning, in_progress -> active."
7563
+ }
7564
+ ],
7384
7565
  // ── v0.14.0: Pattern E — remove deprecated/ghost properties (UPG-574) ────────
7385
7566
  //
7386
7567
  // Properties marked deprecated (some "Removed in 0.9.1") that were never
@@ -9830,8 +10011,8 @@ var UPG_PROPERTY_SCHEMA = {
9830
10011
  rule_id: { type: "string", description: "Identifier of the rule that flagged the issue" },
9831
10012
  help_url: { type: "string", description: "URL to documentation explaining the issue and how to fix it" },
9832
10013
  affected_element: { type: "string", description: "Description of the affected UI element" },
9833
- css_selector: { type: "string", description: "CSS selector targeting the affected element" },
9834
- 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" },
9835
10016
  tags: { type: "string[]", description: 'Tags from the audit tool (e.g. "wcag2aa", "cat.color")' },
9836
10017
  remediation: { type: "string", description: "Recommended fix for the issue" },
9837
10018
  impact_description: { type: "string", description: "Description of the user impact" }
@@ -9858,8 +10039,7 @@ var UPG_PROPERTY_SCHEMA = {
9858
10039
  account: {
9859
10040
  account_type: { type: "string", enum: ["prospect", "customer", "partner", "churned"], description: "Relationship status of this account" },
9860
10041
  industry: { type: "string", description: "Industry vertical the account operates in" },
9861
- employee_count: { type: "number", description: "Number of employees at the account", modifier: "snapshot" },
9862
- annual_revenue: { type: "number", description: "Annual revenue of the account" }
10042
+ employee_count: { type: "number", description: "Number of employees at the account", modifier: "snapshot" }
9863
10043
  },
9864
10044
  // AcquisitionChannelProperties: AcquisitionChannel entity.
9865
10045
  acquisition_channel: {
@@ -9906,7 +10086,6 @@ var UPG_PROPERTY_SCHEMA = {
9906
10086
  max_execution_time_seconds: { type: "number", description: "Hard timeout for agent execution in seconds" },
9907
10087
  allow_code_execution: { type: "boolean", description: "Whether the agent can execute generated code" },
9908
10088
  multimodal: { type: "boolean", description: "Whether the agent can process images and other media" },
9909
- agent_status: { type: "string", enum: ["active", "disabled", "testing"], description: "Operational status of this agent definition" },
9910
10089
  version: { type: "string", description: 'Version label for this agent definition (e.g. "1.4.2")' }
9911
10090
  },
9912
10091
  // AgentHookProperties: Agent hook.
@@ -9965,7 +10144,7 @@ var UPG_PROPERTY_SCHEMA = {
9965
10144
  version: { type: "string", description: "Version" },
9966
10145
  record_count: { type: "number", description: "Records", modifier: "snapshot" },
9967
10146
  format: { type: "string", description: 'Format (e.g. "jsonl", "csv", "parquet")' },
9968
- storage_uri: { type: "string", description: "Storage URI" },
10147
+ storage_uri: { type: "string", description: "Storage URI", modifier: "volatile" },
9969
10148
  checksum: { type: "string", description: "Integrity hash" },
9970
10149
  provenance: { type: "string", enum: ["human_labelled", "synthetic", "scraped", "converted", "mixed"], description: "Origin" },
9971
10150
  license: { type: "string", description: "SPDX license identifier" },
@@ -9980,7 +10159,7 @@ var UPG_PROPERTY_SCHEMA = {
9980
10159
  started_at: { type: "string", description: "ISO timestamp started" },
9981
10160
  completed_at: { type: "string", description: "ISO timestamp completed" },
9982
10161
  training_steps: { type: "number", description: "Training steps or epochs completed" },
9983
- artifact_uri: { type: "string", description: "Produced artifact URI" },
10162
+ artifact_uri: { type: "string", description: "Produced artifact URI", modifier: "volatile" },
9984
10163
  notes: { type: "string", description: "Free-text notes" },
9985
10164
  tags: { type: "string[]", description: "Free-form classification tags" }
9986
10165
  },
@@ -9993,10 +10172,9 @@ var UPG_PROPERTY_SCHEMA = {
9993
10172
  // AiModelProperties: AI model.
9994
10173
  ai_model: {
9995
10174
  model_provider: { type: "string", enum: ["anthropic", "openai", "google", "meta", "mistral", "custom"], description: "Provider or vendor" },
9996
- 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" },
9997
10176
  model_version: { type: "string", description: "Specific version" },
9998
10177
  model_purpose: { type: "string", description: "Intended use case" },
9999
- cost_per_1k_tokens: { type: "number", description: "Cost per 1,000 tokens", modifier: "snapshot" },
10000
10178
  context_window: { type: "number", description: "Maximum context window (tokens)" },
10001
10179
  latency_p50_ms: { type: "number", description: "Median latency (p50, ms)", modifier: "snapshot" },
10002
10180
  latency_p99_ms: { type: "number", description: "Tail latency (p99, ms)", modifier: "snapshot" },
@@ -10035,7 +10213,7 @@ var UPG_PROPERTY_SCHEMA = {
10035
10213
  },
10036
10214
  // ApiContractProperties: API contract.
10037
10215
  api_contract: {
10038
- spec_url: { type: "string", description: "URL of the specification document" },
10216
+ spec_url: { type: "string", description: "URL of the specification document", modifier: "volatile" },
10039
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." },
10040
10218
  version: { type: "string", description: "API version" },
10041
10219
  owner: { type: "string", description: "Maintaining person or team. Promote to a `node_owned_by_team` edge if ownership must be queryable." }
@@ -10125,7 +10303,7 @@ var UPG_PROPERTY_SCHEMA = {
10125
10303
  // BrandAssetProperties: Brand asset.
10126
10304
  brand_asset: {
10127
10305
  asset_type: { type: "string", enum: ["logo", "icon", "illustration", "photo", "video", "template"], description: "Category of the brand asset" },
10128
- 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" },
10129
10307
  usage_rights: { type: "string", description: "Usage rights or licensing restrictions" }
10130
10308
  },
10131
10309
  // BrandColourProperties: Brand colour. A single colour in the brand palette.
@@ -10167,7 +10345,7 @@ var UPG_PROPERTY_SCHEMA = {
10167
10345
  approved_backgrounds: { type: "string[]", description: 'Background colours the logo is approved for use on. @example ["#FFFFFF", "#1A1A1A", "#F5F5F5"]' },
10168
10346
  forbidden_backgrounds: { type: "string[]", description: 'Background colours or contexts where the logo must NOT be placed. @example ["busy photography", "low-contrast surfaces"]' },
10169
10347
  file_formats: { type: "string[]", description: 'File formats this logo variant is available in. @example ["svg", "png", "eps", "pdf"]' },
10170
- 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" }
10171
10349
  },
10172
10350
  // BrandTypographyProperties: Brand typography. A font family and its usage rules.
10173
10351
  brand_typography: {
@@ -10216,8 +10394,8 @@ var UPG_PROPERTY_SCHEMA = {
10216
10394
  artifact_type: { type: "string", enum: ["docker_image", "npm_package", "binary", "static_assets", "other"], description: "Type" },
10217
10395
  version: { type: "string", description: "Version" },
10218
10396
  size: { type: "string", description: 'Human-readable size (e.g. "12.4 MB")' },
10219
- registry: { type: "string", description: "Registry or storage location" },
10220
- 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" }
10221
10399
  },
10222
10400
  // BusinessModelProperties: BusinessModel: root of a BMC-style model.
10223
10401
  business_model: {
@@ -10450,8 +10628,6 @@ var UPG_PROPERTY_SCHEMA = {
10450
10628
  // ContactProperties: Contact.
10451
10629
  contact: {
10452
10630
  contact_role: { type: "string", description: "Job title or role within the account" },
10453
- email: { type: "string", description: "Email address" },
10454
- phone: { type: "string", description: "Phone number" },
10455
10631
  is_decision_maker: { type: "boolean", description: "Whether this person has purchasing authority" }
10456
10632
  },
10457
10633
  // ContentCalendarProperties: Content calendar.
@@ -10555,7 +10731,7 @@ var UPG_PROPERTY_SCHEMA = {
10555
10731
  // DashboardProperties: Dashboard entity.
10556
10732
  dashboard: {
10557
10733
  tool: { type: "string", enum: ["looker", "amplitude", "mixpanel", "posthog", "custom"], description: "Analytics tool hosting this dashboard" },
10558
- url: { type: "string", description: "URL to the live dashboard" },
10734
+ url: { type: "string", description: "URL to the live dashboard", modifier: "volatile" },
10559
10735
  audience: { type: "string", description: "Intended audience for this dashboard" },
10560
10736
  element_count: { type: "number", description: "Number of widgets or panels on the dashboard", modifier: "derived" },
10561
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." },
@@ -10607,7 +10783,6 @@ var UPG_PROPERTY_SCHEMA = {
10607
10783
  },
10608
10784
  // DataPipelineProperties: DataPipeline entity.
10609
10785
  data_pipeline: {
10610
- pipeline_status: { type: "string", enum: ["active", "paused", "failed", "deprecated"], description: "Operational status of the pipeline" },
10611
10786
  schedule: { type: "string", description: "Cron or scheduling expression" },
10612
10787
  avg_runtime: { type: "string", description: "Average wall-clock runtime per execution" },
10613
10788
  orchestrator: { type: "string", description: 'Orchestration tool (e.g. "Airflow", "Dagster", "dbt Cloud")' },
@@ -10642,7 +10817,6 @@ var UPG_PROPERTY_SCHEMA = {
10642
10817
  database_schema: {
10643
10818
  db_type: { type: "string", enum: ["postgres", "mysql", "mongodb", "redis", "other"], description: "Engine" },
10644
10819
  schema_version: { type: "string", description: "Current schema version" },
10645
- migration_status: { type: "string", enum: ["current", "pending", "failed"], description: "Pending-migration status" },
10646
10820
  owner: { type: "string", description: "Owning person or team responsible for design and migrations. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
10647
10821
  table_count: { type: "number", description: "Tables or collections in this schema. Useful for migration scope estimation.", modifier: "derived" }
10648
10822
  },
@@ -10697,7 +10871,6 @@ var UPG_PROPERTY_SCHEMA = {
10697
10871
  deployment: {
10698
10872
  environment: { type: "string", enum: ["dev", "staging", "prod"], description: "Target environment" },
10699
10873
  timestamp: { type: "string", description: "ISO timestamp" },
10700
- deploy_status: { type: "string", enum: ["success", "failure", "rolling"], description: "Current status" },
10701
10874
  sha: { type: "string", description: "Git SHA of the deployed commit" },
10702
10875
  duration_seconds: { type: "number", description: "Wall-clock duration in seconds. Tracks deployment speed trends." },
10703
10876
  deployer: { type: "string", description: "Triggering person or system. Promote to a `node_owned_by_person` edge if ownership must be queryable." }
@@ -10713,7 +10886,7 @@ var UPG_PROPERTY_SCHEMA = {
10713
10886
  },
10714
10887
  // DesignConceptProperties: Design concept being explored.
10715
10888
  design_concept: {
10716
- 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" },
10717
10890
  rationale: { type: "string", description: "Selection or rejection rationale" },
10718
10891
  concept_status: { type: "string", enum: ["exploring", "validated", "selected", "rejected"], description: "Current selection status" },
10719
10892
  maturity: { type: "string", enum: ["sketch", "refined", "final"], description: "Development stage, from rough idea to presentation-ready" },
@@ -10807,7 +10980,7 @@ var UPG_PROPERTY_SCHEMA = {
10807
10980
  },
10808
10981
  // DeveloperPortalProperties: Developer portal.
10809
10982
  developer_portal: {
10810
- portal_url: { type: "string", description: "URL of the developer portal" },
10983
+ portal_url: { type: "string", description: "URL of the developer portal", modifier: "volatile" },
10811
10984
  doc_count: { type: "number", description: "Number of documentation pages", modifier: "derived" },
10812
10985
  sandbox_available: { type: "boolean", description: "Whether a sandbox environment is available" }
10813
10986
  },
@@ -10830,7 +11003,6 @@ var UPG_PROPERTY_SCHEMA = {
10830
11003
  source_url: { type: "string", description: "Canonical retrievable URL" },
10831
11004
  platform: { type: "string", enum: ["markdown", "notion", "figma", "google_docs", "confluence", "github", "linear", "other"], description: "Hosting platform" },
10832
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" },
10833
- author: { type: "string", description: "Author (free-form: name, email, or handle). Promote to a `node_owned_by_person` edge if ownership must be queryable." },
10834
11006
  last_updated: { type: "string", description: "ISO 8601 last-meaningful-update" },
10835
11007
  word_count: { type: "number", description: "Approximate word count. Useful for planning, indexing, summarisation.", modifier: "snapshot" },
10836
11008
  content_summary: { type: "string", description: "1\u20133 sentence summary. Drives previews, search snippets, embedding context." },
@@ -11025,8 +11197,7 @@ var UPG_PROPERTY_SCHEMA = {
11025
11197
  provider: { type: "string", description: "Provider" },
11026
11198
  base_url: { type: "string", description: "Base URL" },
11027
11199
  auth_type: { type: "string", enum: ["api_key", "oauth2", "jwt", "basic", "none"], description: "Authentication method" },
11028
- rate_limits: { type: "string", description: "Rate limit description" },
11029
- api_status: { type: "string", enum: ["active", "deprecated", "beta", "unavailable"], description: "Availability" }
11200
+ rate_limits: { type: "string", description: "Rate limit description" }
11030
11201
  },
11031
11202
  // FeasibilityStudyProperties: FeasibilityStudy entity.
11032
11203
  feasibility_study: {
@@ -11060,13 +11231,11 @@ var UPG_PROPERTY_SCHEMA = {
11060
11231
  feature_count: { type: "number", description: "Approximate feature count under this area. Snapshot; `feature_area_contains_feature` edges are the source of truth.", modifier: "derived" },
11061
11232
  owner: { type: "string", description: "Area owner (handle or email). Promote to a `node_owned_by_team` edge if ownership must be queryable." },
11062
11233
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance to the product overall" },
11063
- maturity: { type: "string", enum: ["nascent", "growing", "mature", "legacy"], description: "Maturity. `nascent` = newly-formed grouping. `mature` = established surface. `legacy` = being phased out for a successor." },
11064
- area_status: { type: "string", enum: ["active", "planned", "deprecated"], description: "Status in the product structure" }
11234
+ maturity: { type: "string", enum: ["nascent", "growing", "mature", "legacy"], description: "Maturity. `nascent` = newly-formed grouping. `mature` = established surface. `legacy` = being phased out for a successor." }
11065
11235
  },
11066
11236
  // FeatureFlagProperties: Feature flag.
11067
11237
  feature_flag: {
11068
11238
  key: { type: "string", description: 'Required. Stable flag key used in code (e.g. "new-checkout-flow").' },
11069
- flag_status: { type: "string", enum: ["on", "off", "rollout"], description: "Activation state. `on` = enabled for all. `off` = disabled for all. `rollout` = partial via targeting_rules." },
11070
11239
  rollout_pct: { type: "number", description: "Percentage enabled (0\u2013100). Meaningful when `flag_status === 'rollout'`.", modifier: "snapshot" },
11071
11240
  targeting_rules: { type: "string", description: "Human-readable targeting rules. Full rule evaluation happens in the flag service." },
11072
11241
  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." },
@@ -11142,7 +11311,7 @@ var UPG_PROPERTY_SCHEMA = {
11142
11311
  fix: {
11143
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." },
11144
11313
  commit: { type: "string", description: "Git commit SHA" },
11145
- files_changed: { type: "string[]", description: "Files changed" },
11314
+ files_changed: { type: "string[]", description: "Files changed", modifier: "volatile" },
11146
11315
  deployed_at: { type: "string", description: "ISO timestamp landed in the target environment." },
11147
11316
  fixed_date: { type: "string", description: "Application date (ISO date). Coarser-grained complement to `deployed_at`." },
11148
11317
  verified: { type: "boolean", description: "Verified in production" },
@@ -11235,7 +11404,7 @@ var UPG_PROPERTY_SCHEMA = {
11235
11404
  video_type: { type: "string", enum: ["how_to", "overview", "troubleshooting", "best_practice"], description: "Purpose of the video" },
11236
11405
  duration_seconds: { type: "number", description: "Duration of the video in seconds" },
11237
11406
  views: { type: "number", description: "Total number of views" },
11238
- url: { type: "string", description: "URL where the video is hosted" }
11407
+ url: { type: "string", description: "URL where the video is hosted", modifier: "volatile" }
11239
11408
  },
11240
11409
  // HypothesisProperties: A testable belief. The canonical design artefact for validating product assumptions.
11241
11410
  hypothesis: {
@@ -11378,7 +11547,6 @@ var UPG_PROPERTY_SCHEMA = {
11378
11547
  started_at: { type: "string", description: "ISO timestamp the investigation began" },
11379
11548
  resolved_at: { type: "string", description: "ISO timestamp the investigation was concluded. Pairs with `status === 'resolved' | 'abandoned'`." },
11380
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." },
11381
- session_id: { type: "string", description: "Originating session" },
11382
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*." }
11383
11551
  },
11384
11552
  // InvoiceProperties: Invoice.
@@ -11583,9 +11751,6 @@ var UPG_PROPERTY_SCHEMA = {
11583
11751
  entity_type: { type: "string", enum: ["corporation", "llc", "partnership", "sole_proprietor", "nonprofit"], description: "Legal structure of the entity" },
11584
11752
  jurisdiction: { type: "string", description: "Jurisdiction where the entity is registered" },
11585
11753
  ip_ownership: { type: "string", description: "Description of intellectual property ownership" },
11586
- principal_address: { type: "string", description: "Principal business address" },
11587
- tax_id: { type: "string", description: "Tax identification number" },
11588
- registration_number: { type: "string", description: "Official registration or incorporation number" },
11589
11754
  date_incorporated: { type: "string", description: "Date the entity was incorporated (ISO format)" }
11590
11755
  },
11591
11756
  // LibraryDependencyProperties: Library or package dependency.
@@ -11673,8 +11838,7 @@ var UPG_PROPERTY_SCHEMA = {
11673
11838
  marketing_channel: {
11674
11839
  channel_type: { type: "string", enum: ["social", "email", "seo", "sem", "content", "events", "other"], description: "Category of marketing channel" },
11675
11840
  monthly_budget: { type: "number", description: "Monthly spend allocated to this channel", modifier: "snapshot" },
11676
- roi: { type: "number", description: "Return on investment ratio" },
11677
- channel_status: { type: "string", enum: ["active", "paused", "deprecated"], description: "Operational status of the channel" }
11841
+ roi: { type: "number", description: "Return on investment ratio" }
11678
11842
  },
11679
11843
  // MarketingStrategyProperties: Marketing strategy.
11680
11844
  marketing_strategy: {
@@ -11832,7 +11996,6 @@ var UPG_PROPERTY_SCHEMA = {
11832
11996
  // ObjectiveProperties: A high-level strategic goal. The O in OKR.
11833
11997
  objective: {
11834
11998
  timeframe: { type: "string", description: 'Planning timeframe (e.g. "Q1 2026", "H1 2026")' },
11835
- objective_status: { type: "string", enum: ["active", "achieved", "deferred"], description: "Current status" },
11836
11999
  progress: { type: "number", description: "Overall progress (0\u2013100)" }
11837
12000
  },
11838
12001
  // ObservationProperties: Discrete observation captured during research. Absorbed from the deprecated Highlight entity.
@@ -11858,8 +12021,7 @@ var UPG_PROPERTY_SCHEMA = {
11858
12021
  opportunity: {},
11859
12022
  // OrganizationProperties: Organization entity.
11860
12023
  organization: {
11861
- logo_url: { type: "string", description: "URL of the organisation's logo" },
11862
- billing_plan: { type: "string", description: "Current billing / subscription plan" },
12024
+ logo_url: { type: "string", description: "URL of the organisation's logo", modifier: "volatile" },
11863
12025
  industry: { type: "string", description: "Industry vertical the organisation operates in" }
11864
12026
  },
11865
12027
  // OutcomeProperties: A measurable change in user or business state the product drives.
@@ -11881,8 +12043,7 @@ var UPG_PROPERTY_SCHEMA = {
11881
12043
  normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11882
12044
  },
11883
12045
  required: ["value", "label"]
11884
- },
11885
- outcome_status: { type: "string", enum: ["identified", "measuring", "achieved", "abandoned"], description: "Current lifecycle phase, mirroring the `outcome` lifecycle in `grammar/lifecycles.ts` (UPG-579 Option B): `identified` -> `measuring` -> `achieved` | `abandoned`." }
12046
+ }
11886
12047
  },
11887
12048
  // ParticipantProperties: Research participant.
11888
12049
  participant: {
@@ -11946,7 +12107,6 @@ var UPG_PROPERTY_SCHEMA = {
11946
12107
  },
11947
12108
  // PersonProperties: Person entity. A named, accountable individual.
11948
12109
  person: {
11949
- email: { type: "string", description: "Primary contact email. Stable identifier for de-duplication." },
11950
12110
  role_title: { type: "string", description: "Free-text job title. Distinct from the structured `role` entity." },
11951
12111
  time_zone: { type: "string", description: 'IANA time zone (e.g. "Europe/Berlin"). Useful for capacity / on-call planning.' }
11952
12112
  },
@@ -12044,8 +12204,8 @@ var UPG_PROPERTY_SCHEMA = {
12044
12204
  product: {
12045
12205
  stage: { type: "string", enum: ["concept", "validation", "build", "beta", "launch", "growth", "mature", "maintenance", "sunset"], description: "Lifecycle stage" },
12046
12206
  health_status: { type: "string", enum: ["on_track", "at_risk", "off_track"], description: "Overall health" },
12047
- url: { type: "string", description: "Where the product lives. Marketing site, app store URL, etc." },
12048
- 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" },
12049
12209
  launched_at: { type: "string", description: "When the product became generally available (ISO 8601)" }
12050
12210
  },
12051
12211
  // ProductAreaProperties: ProductArea entity.
@@ -12094,7 +12254,6 @@ var UPG_PROPERTY_SCHEMA = {
12094
12254
  // PrototypeProperties: Prototype.
12095
12255
  prototype: {
12096
12256
  fidelity: { type: "string", enum: ["low", "medium", "high"], description: "Detail level" },
12097
- test_status: { type: "string", enum: ["untested", "testing", "passed", "failed"], description: "User-test status" },
12098
12257
  tool: { type: "string", description: "Authoring tool" }
12099
12258
  },
12100
12259
  // QaSessionProperties: QA session.
@@ -12224,8 +12383,7 @@ var UPG_PROPERTY_SCHEMA = {
12224
12383
  // ReviewGateProperties: Review gate.
12225
12384
  review_gate: {
12226
12385
  gate_type: { type: "string", enum: ["human_review", "automated_check", "approval"], description: "Kind of review required at this gate" },
12227
- required_approvers: { type: "string[]", description: "People or roles that must approve. Promote to `node_owned_by_person` edges (one per name) if ownership must be queryable." },
12228
- gate_status: { type: "string", enum: ["pending", "approved", "rejected", "bypassed"], description: "Current approval status of the gate" }
12386
+ required_approvers: { type: "string[]", description: "People or roles that must approve. Promote to `node_owned_by_person` edges (one per name) if ownership must be queryable." }
12229
12387
  },
12230
12388
  // RiskProperties: Risk.
12231
12389
  risk: {
@@ -12270,7 +12428,6 @@ var UPG_PROPERTY_SCHEMA = {
12270
12428
  roadmap_item: {
12271
12429
  quarter: { type: "string", description: 'Planning quarter (e.g. "Q2 2026"). Pair with `start_date`/`target_date` for precise scheduling.' },
12272
12430
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance against other items" },
12273
- item_status: { type: "string", enum: ["planned", "in_progress", "shipped", "deferred"], description: "Status. `deferred` = explicitly pushed to a later period." },
12274
12431
  confidence: {
12275
12432
  type: "assessment",
12276
12433
  scale_id: "confidence_5",
@@ -12350,7 +12507,6 @@ var UPG_PROPERTY_SCHEMA = {
12350
12507
  // SecurityAuditProperties: Security audit.
12351
12508
  security_audit: {
12352
12509
  audit_scope: { type: "string", description: "Systems or processes covered by the audit" },
12353
- audit_status: { type: "string", enum: ["scheduled", "in_progress", "completed"], description: "Current progress of the audit" },
12354
12510
  findings_count: { type: "number", description: "Total number of findings", modifier: "derived" },
12355
12511
  critical_findings: { type: "number", description: "Number of critical-severity findings" }
12356
12512
  },
@@ -12925,7 +13081,7 @@ var UPG_PROPERTY_SCHEMA = {
12925
13081
  version: { type: "string", description: 'Version or iteration (e.g. "v2", "2026-04-B")' },
12926
13082
  tool: { type: "string", description: 'Authoring tool. @example "Figma", "Balsamiq", "pen and paper"' },
12927
13083
  review_status: { type: "string", enum: ["draft", "in_review", "approved", "rejected"], description: "Review gate status" },
12928
- 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" }
12929
13085
  },
12930
13086
  // WorkflowArtifactProperties: Workflow artifact.
12931
13087
  workflow_artifact: {
@@ -12957,7 +13113,6 @@ var UPG_PROPERTY_SCHEMA = {
12957
13113
  },
12958
13114
  // WorkspaceProperties: Workspace: a spatial thinking space for arranging entities.
12959
13115
  workspace: {
12960
- slug: { type: "string", description: "URL-friendly identifier" },
12961
13116
  visibility: { type: "string", enum: ["private", "shared", "public"], description: "Who can see this workspace" },
12962
13117
  purpose: { type: "string", description: "Free-text description. Pairs with the closed-enum `workspace_purpose`." },
12963
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." },
@@ -29283,7 +29438,7 @@ function isCanonical(text) {
29283
29438
  }
29284
29439
 
29285
29440
  // src/index.ts
29286
- var UPG_VERSION = "0.14.1";
29441
+ var UPG_VERSION = "0.16.0";
29287
29442
  var UPG_FORMAT_VERSION = "0.4.0";
29288
29443
  var MARKDOWN_FORMAT_VERSION = "0.1";
29289
29444
  var UPG_TYPES = getTypes();