@unified-product-graph/core 0.9.15 → 0.9.16

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/CHANGELOG.md CHANGED
@@ -7,6 +7,21 @@ This project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
8
  ---
9
9
 
10
+ ## [0.9.16] - 2026-06-11
11
+
12
+ **get_tree reaches the cloud, the show-tree skill calls it, and the three "area" taxonomies get a documented cross-walk.** 0.9.15 shipped `get_tree` local-only and left the show-tree skill on its interim hardcoded chains; this release finishes the loop and closes the deferred A4 introspection gap.
13
+
14
+ ### Added
15
+ - **`get_tree` on the cloud server** (cloud tools 94 to 95; local unchanged at 121). The assembler (`assembleTree` + the `GraphReader` interface) moved to the shared `@unified-product-graph/mcp-tooling` package, so the local file-backed server and the cloud Postgres-backed server assemble byte-identical trees from one source. The cloud handler builds an in-memory `GraphReader` from a one-shot product node+edge load. `get_tree` leaves the CLOUD_NA parity list.
16
+ - **`UPG_AREA_TAXONOMY`** (core): the documented cross-walk between the three overlapping "area" groupings that skills kept conflating into a stale coverage denominator: the 10 `get_graph_digest.coverage` keys, the 11 canonical regions, and the 8 "business areas". Keyed by coverage key; each row names the matching business area (null for `validation` and `operations`, which the 8-area grouping folds into discovery / omits) and the region ids its entities live in. Helpers `getCoverageKeysForRegion` / `getBusinessAreasForRegion`. Surfaced on `list_regions` (an `area_taxonomy` block plus per-region `coverage_keys` / `business_areas`) and `get_region` (per-region `coverage_keys` / `business_areas`), local and cloud. An SDK drift test pins the key sets against the runtime sources (`BUSINESS_AREAS`, `BUSINESS_AREA_META`).
17
+
18
+ ### Changed
19
+ - **`/upg-show-tree` calls `get_tree`** instead of building traverse chains and resolving edge names. The skill now renders the returned roots / children, surfaces `gaps`, and notes anchor fallback; it no longer carries the edge-name chains that drifted (the exact failure `get_tree` exists to prevent). Adds the `feature_areas` pattern. Skills ship in the mcp-server package, so this reaches users with the release.
20
+
21
+ No entity, domain, region, playbook, framework, or edge-count change, and no change to the local tool surface (entities 315, edges 980, local tools 121, regions 11).
22
+
23
+ ---
24
+
10
25
  ## [0.9.15] - 2026-06-11
11
26
 
12
27
  **get_tree: server-side tree assembly.** Tree views (OST, OKR, user, product, validation, strategy, feature areas) were assembled client-side by the show-tree skill out of multiple query calls and hardcoded edge chains that drifted with the spec. This release relocates assembly to the server, which owns the catalogue.
package/dist/index.cjs CHANGED
@@ -44,6 +44,8 @@ __export(index_exports, {
44
44
  UPG_ANTI_PATTERNS: () => UPG_ANTI_PATTERNS,
45
45
  UPG_APPROACHES: () => UPG_APPROACHES,
46
46
  UPG_APPROACHES_BY_ID: () => UPG_APPROACHES_BY_ID,
47
+ UPG_AREA_TAXONOMY: () => UPG_AREA_TAXONOMY,
48
+ UPG_AREA_TAXONOMY_BY_COVERAGE_KEY: () => UPG_AREA_TAXONOMY_BY_COVERAGE_KEY,
47
49
  UPG_CANONICAL_FORMAT_VERSION: () => UPG_CANONICAL_FORMAT_VERSION,
48
50
  UPG_CONTAINMENT_FREE_TYPES: () => UPG_CONTAINMENT_FREE_TYPES,
49
51
  UPG_COUNT_BENCHMARKS: () => UPG_COUNT_BENCHMARKS,
@@ -121,9 +123,12 @@ __export(index_exports, {
121
123
  getAntiPatterns: () => getAntiPatterns,
122
124
  getAntiPatternsBySeverity: () => getAntiPatternsBySeverity,
123
125
  getAntiPatternsForStage: () => getAntiPatternsForStage,
126
+ getAreaTaxonomyEntry: () => getAreaTaxonomyEntry,
124
127
  getBenchmark: () => getBenchmark,
125
128
  getBenchmarksByDomain: () => getBenchmarksByDomain,
129
+ getBusinessAreasForRegion: () => getBusinessAreasForRegion,
126
130
  getCanonicalPlaybookForRegion: () => getCanonicalPlaybookForRegion,
131
+ getCoverageKeysForRegion: () => getCoverageKeysForRegion,
127
132
  getDefaultLens: () => getDefaultLens,
128
133
  getDeprecatedTypes: () => getDeprecatedTypes,
129
134
  getDomainForType: () => getDomainForType,
@@ -19969,6 +19974,36 @@ function getTreePattern(id) {
19969
19974
  return UPG_TREE_PATTERNS_BY_ID[id];
19970
19975
  }
19971
19976
 
19977
+ // src/presentation/area-taxonomy.ts
19978
+ var UPG_AREA_TAXONOMY = [
19979
+ { coverage_key: "identity", label: "Identity", business_area: "identity", regions: ["strategy_outcomes"] },
19980
+ { coverage_key: "understanding", label: "Understanding", business_area: "understanding", regions: ["users_needs", "discovery_research_validation"] },
19981
+ { coverage_key: "discovery", label: "Discovery", business_area: "discovery", regions: ["discovery_research_validation", "market_competitive"] },
19982
+ { coverage_key: "validation", label: "Validation", business_area: null, regions: ["discovery_research_validation"] },
19983
+ { coverage_key: "reaching", label: "Reaching", business_area: "reaching", regions: ["business_gtm_growth"] },
19984
+ { coverage_key: "converting", label: "Converting", business_area: "converting", regions: ["business_gtm_growth"] },
19985
+ { coverage_key: "building", label: "Building", business_area: "building", regions: ["product_delivery", "experience_design_brand"] },
19986
+ { coverage_key: "sustaining", label: "Sustaining", business_area: "sustaining", regions: ["business_gtm_growth"] },
19987
+ { coverage_key: "learning", label: "Learning", business_area: "learning", regions: ["strategy_outcomes", "analytics_data", "operations_quality"] },
19988
+ { coverage_key: "operations", label: "Operations", business_area: null, regions: ["operations_quality"] }
19989
+ ];
19990
+ var UPG_AREA_TAXONOMY_BY_COVERAGE_KEY = Object.fromEntries(UPG_AREA_TAXONOMY.map((e) => [e.coverage_key, e]));
19991
+ function getAreaTaxonomyEntry(coverageKey) {
19992
+ return UPG_AREA_TAXONOMY_BY_COVERAGE_KEY[coverageKey];
19993
+ }
19994
+ function getCoverageKeysForRegion(regionId) {
19995
+ return UPG_AREA_TAXONOMY.filter((e) => e.regions.includes(regionId)).map((e) => e.coverage_key);
19996
+ }
19997
+ function getBusinessAreasForRegion(regionId) {
19998
+ const out = [];
19999
+ for (const e of UPG_AREA_TAXONOMY) {
20000
+ if (e.regions.includes(regionId) && e.business_area && !out.includes(e.business_area)) {
20001
+ out.push(e.business_area);
20002
+ }
20003
+ }
20004
+ return out;
20005
+ }
20006
+
19972
20007
  // src/playbooks/definitions/index.ts
19973
20008
  function seqStep(order, phase, entity_types, prompt_hint, options) {
19974
20009
  return {
@@ -28242,7 +28277,7 @@ function isCanonical(text) {
28242
28277
  }
28243
28278
 
28244
28279
  // src/index.ts
28245
- var UPG_VERSION = "0.9.15";
28280
+ var UPG_VERSION = "0.9.16";
28246
28281
  var UPG_FORMAT_VERSION = "0.4.0";
28247
28282
  var MARKDOWN_FORMAT_VERSION = "0.1";
28248
28283
  var UPG_TYPES = getTypes();
@@ -28331,6 +28366,8 @@ var UPG_META_COUNT = UPG_ENTITY_META.length;
28331
28366
  UPG_ANTI_PATTERNS,
28332
28367
  UPG_APPROACHES,
28333
28368
  UPG_APPROACHES_BY_ID,
28369
+ UPG_AREA_TAXONOMY,
28370
+ UPG_AREA_TAXONOMY_BY_COVERAGE_KEY,
28334
28371
  UPG_CANONICAL_FORMAT_VERSION,
28335
28372
  UPG_CONTAINMENT_FREE_TYPES,
28336
28373
  UPG_COUNT_BENCHMARKS,
@@ -28408,9 +28445,12 @@ var UPG_META_COUNT = UPG_ENTITY_META.length;
28408
28445
  getAntiPatterns,
28409
28446
  getAntiPatternsBySeverity,
28410
28447
  getAntiPatternsForStage,
28448
+ getAreaTaxonomyEntry,
28411
28449
  getBenchmark,
28412
28450
  getBenchmarksByDomain,
28451
+ getBusinessAreasForRegion,
28413
28452
  getCanonicalPlaybookForRegion,
28453
+ getCoverageKeysForRegion,
28414
28454
  getDefaultLens,
28415
28455
  getDeprecatedTypes,
28416
28456
  getDomainForType,