@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/README.md +4 -1
- package/dist/index.cjs +90 -33
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -31
- package/dist/index.d.ts +1 -31
- package/dist/index.js +90 -33
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
# @unified-product-graph/core
|
|
2
2
|
|
|
3
3
|
[](https://opensource.org/licenses/MIT)
|
|
4
|
+
[](https://unifiedproductgraph.org)
|
|
5
|
+
|
|
6
|
+
> **Early alpha.** The specification is still evolving and breaking changes can land between versions. Pin a version if you need stability.
|
|
4
7
|
|
|
5
8
|
The TypeScript core for the **Unified Product Graph (UPG)**, an open specification that gives product tools a shared vocabulary for entities, edges, and frameworks.
|
|
6
9
|
|
|
7
|
-
|
|
10
|
+
318 entity types across 37 domains. 1017 typed edges. 46 canonical framework definitions, with more added as each is reviewed.
|
|
8
11
|
|
|
9
12
|
## Install
|
|
10
13
|
|
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.
|
|
29675
|
+
var UPG_VERSION = "0.16.1";
|
|
29619
29676
|
var UPG_FORMAT_VERSION = "0.4.0";
|
|
29620
29677
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
29621
29678
|
var UPG_TYPES = getTypes();
|