@unified-product-graph/mcp-server 0.8.0 → 0.8.2

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.
Files changed (61) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +1 -1
  3. package/TOOLS.md +20 -14
  4. package/dist/index.js +1289 -485
  5. package/dist/index.js.map +1 -1
  6. package/dist/tools-manifest.json +95 -76
  7. package/package.json +1 -1
  8. package/scripts/claudemd-snippet.md +7 -7
  9. package/scripts/install-skills.sh +2 -2
  10. package/skills/upg/SKILL.md +41 -41
  11. package/skills/{upg-gaps → upg-check-gaps}/SKILL.md +40 -43
  12. package/skills/{upg-schema-health → upg-check-schema}/SKILL.md +7 -7
  13. package/skills/{upg-schema-evolve → upg-check-schema-coverage}/SKILL.md +12 -12
  14. package/skills/{upg-schema-edges → upg-check-schema-edges}/SKILL.md +3 -3
  15. package/skills/{upg-schema-consolidate → upg-check-schema-merge}/SKILL.md +5 -5
  16. package/skills/upg-context/SKILL.md +96 -72
  17. package/skills/upg-context-intelligence/SKILL.md +23 -27
  18. package/skills/upg-design-system/SKILL.md +21 -26
  19. package/skills/{upg-verify → upg-find-untracked}/SKILL.md +7 -12
  20. package/skills/{upg-rollback → upg-fix-rollback}/SKILL.md +6 -12
  21. package/skills/{upg-migrate → upg-fix-types}/SKILL.md +5 -9
  22. package/skills/upg-link/SKILL.md +125 -0
  23. package/skills/{upg-discover → upg-new-discovery}/SKILL.md +42 -58
  24. package/skills/{upg-capture → upg-new-from-session}/SKILL.md +13 -15
  25. package/skills/{upg-template → upg-new-from-template}/SKILL.md +8 -12
  26. package/skills/{upg-init → upg-new-graph}/SKILL.md +50 -82
  27. package/skills/{upg-hypothesis → upg-new-hypothesis}/SKILL.md +27 -36
  28. package/skills/{upg-launch → upg-new-launch}/SKILL-DETAIL.md +36 -92
  29. package/skills/{upg-launch → upg-new-launch}/SKILL.md +8 -18
  30. package/skills/{upg-okr → upg-new-okr}/SKILL-DETAIL.md +28 -46
  31. package/skills/{upg-okr → upg-new-okr}/SKILL.md +3 -3
  32. package/skills/{upg-persona → upg-new-persona}/SKILL.md +35 -67
  33. package/skills/{upg-research → upg-new-research}/SKILL.md +25 -33
  34. package/skills/{upg-schema-update → upg-new-schema-type}/SKILL.md +2 -2
  35. package/skills/{upg-strategy → upg-new-strategy}/SKILL.md +21 -27
  36. package/skills/upg-prioritise/SKILL.md +4 -4
  37. package/skills/upg-reflect/SKILL.md +7 -7
  38. package/skills/{upg-feedback → upg-send-feedback}/SKILL.md +30 -51
  39. package/skills/{upg-diff → upg-show-diff}/SKILL.md +6 -12
  40. package/skills/{upg-inspect → upg-show-entity}/SKILL.md +7 -9
  41. package/skills/{upg-impact → upg-show-impact}/SKILL.md +11 -15
  42. package/skills/{upg-journey → upg-show-journey}/SKILL.md +31 -32
  43. package/skills/{upg-analytics → upg-show-metrics}/SKILL.md +9 -12
  44. package/skills/{upg-schema-changelog → upg-show-schema-changelog}/SKILL.md +5 -5
  45. package/skills/{upg-status → upg-show-status}/SKILL.md +39 -40
  46. package/skills/{upg-tree → upg-show-tree}/SKILL.md +15 -15
  47. package/skills/{upg-export → upg-sync-export}/SKILL.md +10 -13
  48. package/skills/{upg-import → upg-sync-import}/SKILL.md +7 -13
  49. package/skills/{upg-pull → upg-sync-pull}/SKILL-DETAIL.md +13 -17
  50. package/skills/{upg-pull → upg-sync-pull}/SKILL.md +3 -3
  51. package/skills/{upg-push → upg-sync-push}/SKILL-DETAIL.md +4 -10
  52. package/skills/{upg-push → upg-sync-push}/SKILL.md +4 -4
  53. package/skills/{upg-snapshot → upg-sync-snapshot}/SKILL.md +2 -6
  54. package/skills/upg-trace/SKILL.md +7 -7
  55. package/skills/{upg-workspace → upg-use-workspace}/SKILL.md +8 -14
  56. package/skills/{upg-run → upg-walk-playbook}/SKILL.md +14 -14
  57. package/skills/upg-walk-region/SKILL-DETAIL.md +320 -0
  58. package/skills/upg-walk-region/SKILL.md +89 -0
  59. package/skills/upg-connect/SKILL.md +0 -167
  60. package/skills/upg-explore/SKILL-DETAIL.md +0 -481
  61. package/skills/upg-explore/SKILL.md +0 -297
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema_version": "2",
3
3
  "package": "@unified-product-graph/mcp-server",
4
- "package_version": "0.8.0",
4
+ "package_version": "0.8.2",
5
5
  "tool_count": 94,
6
6
  "domains": [
7
7
  "context",
@@ -153,11 +153,11 @@
153
153
  "properties": {
154
154
  "skill_invoked": {
155
155
  "type": "string",
156
- "description": "Register that this skill was just invoked (e.g. \"upg-status\")"
156
+ "description": "Register that this skill was just invoked (e.g. \"upg-show-status\")"
157
157
  },
158
158
  "recommendation": {
159
159
  "type": "string",
160
- "description": "Record a recommendation given to the user (e.g. \"Run /upg-strategy to fill strategy gap\")"
160
+ "description": "Record a recommendation given to the user (e.g. \"Run /upg-new-strategy to fill strategy gap\")"
161
161
  },
162
162
  "focus_area": {
163
163
  "type": "string",
@@ -167,11 +167,15 @@
167
167
  "type": "string",
168
168
  "enum": [
169
169
  "product",
170
+ "ux_design",
170
171
  "engineering",
171
- "design",
172
- "growth"
172
+ "growth",
173
+ "business",
174
+ "research",
175
+ "marketing",
176
+ "full"
173
177
  ],
174
- "description": "Switch the active lens. Changes what context, skills, and gaps are surfaced first."
178
+ "description": "Switch the active lens. Changes what context, skills, and gaps are surfaced first. Canonical lens ids (derived from core): product, ux_design, engineering, growth, business, research, marketing, full."
175
179
  },
176
180
  "persist_lens": {
177
181
  "type": "boolean",
@@ -304,7 +308,7 @@
304
308
  "create_node",
305
309
  "batch_create_edges"
306
310
  ],
307
- "source": "src/tools/nodes.ts:991",
311
+ "source": "src/tools/nodes.ts:1013",
308
312
  "symbol": "batchCreateNodes",
309
313
  "returns": "JSON: `{ created, edges_created, count, edges_count, warnings? }`.",
310
314
  "return_shape": "{ created, edges_created, count, edges_count, warnings? }",
@@ -343,7 +347,7 @@
343
347
  "see": [
344
348
  "delete_node"
345
349
  ],
346
- "source": "src/tools/nodes.ts:1095",
350
+ "source": "src/tools/nodes.ts:1117",
347
351
  "symbol": "batchDeleteNodes",
348
352
  "returns": "JSON: `{ deleted, edges_removed, count }`.",
349
353
  "return_shape": "{ deleted, edges_removed, count }",
@@ -404,7 +408,7 @@
404
408
  "see": [
405
409
  "update_node"
406
410
  ],
407
- "source": "src/tools/nodes.ts:1019",
411
+ "source": "src/tools/nodes.ts:1041",
408
412
  "symbol": "batchUpdateNodes",
409
413
  "returns": "JSON: `{ updated, count, warnings? }`. `warnings` carries\nlifecycle-phase hints aggregated across the batch.",
410
414
  "return_shape": "{ updated, count, warnings? }",
@@ -528,7 +532,7 @@
528
532
  "batch_delete_nodes",
529
533
  "validate_graph"
530
534
  ],
531
- "source": "src/tools/nodes.ts:1340",
535
+ "source": "src/tools/nodes.ts:1362",
532
536
  "symbol": "deduplicateNodes",
533
537
  "returns": "JSON: with `dry_run: true`, `{ duplicates, total_groups,\ntotal_duplicate_nodes, dry_run, message }`. With `dry_run: false`,\n`{ merged: true, groups_merged, nodes_removed, edges_redirected,\nstrategy }`.",
534
538
  "return_notes": [
@@ -567,7 +571,7 @@
567
571
  "see": [
568
572
  "batch_delete_nodes"
569
573
  ],
570
- "source": "src/tools/nodes.ts:965",
574
+ "source": "src/tools/nodes.ts:987",
571
575
  "symbol": "deleteNode",
572
576
  "returns": "JSON: `{ node, removed_edge_ids }`.",
573
577
  "return_shape": "{ node, removed_edge_ids }",
@@ -769,7 +773,7 @@
769
773
  "validate_graph",
770
774
  "list_type_migrations"
771
775
  ],
772
- "source": "src/tools/nodes.ts:1286",
776
+ "source": "src/tools/nodes.ts:1308",
773
777
  "symbol": "migrateProperties",
774
778
  "returns": "JSON: `{ top_level_renames, lifted_properties, dropped_props,\ndropped_self_referential, dry_run }`.",
775
779
  "return_shape": "{ top_level_renames, lifted_properties, dropped_props, dropped_self_referential, dry_run }",
@@ -868,7 +872,7 @@
868
872
  "export_edges",
869
873
  "update_node"
870
874
  ],
871
- "source": "src/tools/nodes.ts:1149",
875
+ "source": "src/tools/nodes.ts:1171",
872
876
  "symbol": "migrateType",
873
877
  "returns": "JSON: `{ migrated_nodes, migrated_edges, edge_renames,\ndropped_edges, unmapped_legacy_edges, defaults_applied, dry_run }`.\n`edge_renames` is `[{ id, from, to, flipped }]`; `dropped_edges` is\n`[{ id, from }]`; `unmapped_legacy_edges` is `[{ type, count }]`.\n`migrated_edges` is the total mutated count (renames + drops).",
874
878
  "return_shape": "{ migrated_nodes, migrated_edges, edge_renames, dropped_edges, unmapped_legacy_edges, defaults_applied, dry_run }",
@@ -1046,6 +1050,13 @@
1046
1050
  "properties": {
1047
1051
  "type": "object",
1048
1052
  "description": "Merged with existing properties"
1053
+ },
1054
+ "unset_properties": {
1055
+ "type": "array",
1056
+ "items": {
1057
+ "type": "string"
1058
+ },
1059
+ "description": "Property keys to DELETE. Applied after the `properties` merge, so one call can set some keys and drop others. Writing `{ key: null }` only stores a literal null; use this to actually remove a key. Unknown keys are ignored."
1049
1060
  }
1050
1061
  },
1051
1062
  "required": [
@@ -1053,7 +1064,7 @@
1053
1064
  ]
1054
1065
  },
1055
1066
  "throws": [
1056
- "Returns a textError when `node_id` is missing, the type migration\nfails, when `strict: true` and unknown properties are present, or when\nthe underlying store rejects the patch."
1067
+ "Returns a textError when `node_id` is missing, the type migration\nfails, the `status` is not a valid lifecycle phase for the type, when\n`strict: true` and unknown properties are present, or when the underlying\nstore rejects the patch."
1057
1068
  ],
1058
1069
  "examples": [
1059
1070
  {
@@ -1067,13 +1078,14 @@
1067
1078
  "migrate_type",
1068
1079
  "batch_update_nodes"
1069
1080
  ],
1070
- "source": "src/tools/nodes.ts:874",
1081
+ "source": "src/tools/nodes.ts:880",
1071
1082
  "symbol": "updateNode",
1072
- "returns": "JSON: `{ node, warning?, unknown_properties? }`. `warning`\naggregates lifecycle-status hints, migration warnings, and any\nunknown-property notice. `unknown_properties` lists property\nkeys not in the entity's schema. Pass `strict: true` to reject unknown\nproperties instead of warning.",
1073
- "return_shape": "{ node, warning?, unknown_properties? }",
1083
+ "returns": "JSON: `{ node, warning?, unknown_properties?, unset? }`. `warning`\naggregates migration warnings and any unknown-property notice.\n`unknown_properties` lists property keys not in the entity's schema.\n`unset` lists the keys actually removed. Pass `strict: true` to reject\nunknown properties instead of warning.",
1084
+ "return_shape": "{ node, warning?, unknown_properties?, unset? }",
1074
1085
  "return_notes": [
1075
- "`warning` aggregates lifecycle-status hints, migration warnings, and any unknown-property notice.",
1086
+ "`warning` aggregates migration warnings and any unknown-property notice.",
1076
1087
  "`unknown_properties` lists property keys not in the entity's schema.",
1088
+ "`unset` lists the keys actually removed.",
1077
1089
  "Pass `strict: true` to reject unknown properties instead of warning."
1078
1090
  ],
1079
1091
  "atomicity": "atomic-with-rollback (when `type` is changed); atomic for\nshallow-merge patches."
@@ -1162,7 +1174,7 @@
1162
1174
  "see": [
1163
1175
  "delete_edge"
1164
1176
  ],
1165
- "source": "src/tools/edges.ts:293",
1177
+ "source": "src/tools/edges.ts:297",
1166
1178
  "symbol": "batchDeleteEdges",
1167
1179
  "returns": "JSON: `{ deleted, count }`.",
1168
1180
  "return_shape": "{ deleted, count }",
@@ -1352,7 +1364,7 @@
1352
1364
  "query",
1353
1365
  "list_nodes"
1354
1366
  ],
1355
- "source": "src/tools/edges.ts:403",
1367
+ "source": "src/tools/edges.ts:407",
1356
1368
  "symbol": "exportEdges",
1357
1369
  "returns": "JSON: `{ edges, total, offset, limit, types?, _hash }`. Each edge\ncarries `{ id, source, target, type, mapping_confidence? }`.",
1358
1370
  "return_shape": "{ edges, total, offset, limit, types?, _hash }",
@@ -1445,7 +1457,7 @@
1445
1457
  "migrate_type",
1446
1458
  "export_edges"
1447
1459
  ],
1448
- "source": "src/tools/edges.ts:490",
1460
+ "source": "src/tools/edges.ts:494",
1449
1461
  "symbol": "renameEdgeType",
1450
1462
  "returns": "JSON: with `dry_run: true`, `{ dry_run, from, to, flip, would_rename, sample }`.\nWith `dry_run: false`, `{ dry_run, from, to, flip, renamed, ids }`.",
1451
1463
  "return_notes": [
@@ -1493,7 +1505,7 @@
1493
1505
  "Dropping `corrupt` edges is irreversible. The integrity stamp is\nre-computed on next save; a subsequent reload won't bring them back."
1494
1506
  ],
1495
1507
  "see": [],
1496
- "source": "src/tools/edges.ts:337",
1508
+ "source": "src/tools/edges.ts:341",
1497
1509
  "symbol": "repairDanglingEdges",
1498
1510
  "returns": "JSON: `{ dry_run, report, dropped?, remaining? }`. `report` is\nthe pre-action classification. With `dry_run: false`, `dropped` is the\ncount of edges removed and `remaining` is the post-action report.",
1499
1511
  "return_shape": "{ dry_run, report, dropped?, remaining? }",
@@ -1742,7 +1754,7 @@
1742
1754
  "list_portfolio_cross_edges",
1743
1755
  "migrate_cross_edges"
1744
1756
  ],
1745
- "source": "src/tools/workspace.ts:395",
1757
+ "source": "src/tools/workspace.ts:403",
1746
1758
  "symbol": "createCrossProductEdge",
1747
1759
  "returns": "JSON: `{ edge, portfolio_file }`.",
1748
1760
  "return_shape": "{ edge, portfolio_file }",
@@ -1794,7 +1806,7 @@
1794
1806
  "see": [
1795
1807
  "init_workspace"
1796
1808
  ],
1797
- "source": "src/tools/workspace.ts:275",
1809
+ "source": "src/tools/workspace.ts:283",
1798
1810
  "symbol": "createProductTool",
1799
1811
  "returns": "JSON: `{ message, ...result }`. `result` carries `id`, `title`,\n`slug`, `file_path`, and the optional portfolio edge.",
1800
1812
  "return_shape": "{ message,...result }",
@@ -1823,7 +1835,7 @@
1823
1835
  "see": [
1824
1836
  "list_portfolios"
1825
1837
  ],
1826
- "source": "src/tools/workspace.ts:344",
1838
+ "source": "src/tools/workspace.ts:352",
1827
1839
  "symbol": "getOrganization",
1828
1840
  "returns": "JSON: `{ organization: UPGOrganization | null, portfolio_file? }`.\nReturns `{ organization: null }` when no portfolio document exists yet.",
1829
1841
  "return_shape": "{ organization: UPGOrganization | null, portfolio_file? }",
@@ -1852,7 +1864,7 @@
1852
1864
  "see": [
1853
1865
  "init_workspace"
1854
1866
  ],
1855
- "source": "src/tools/workspace.ts:163",
1867
+ "source": "src/tools/workspace.ts:171",
1856
1868
  "symbol": "getWorkspaceInfo",
1857
1869
  "returns": "JSON: `{ mode, workspace_path?, current_product?, current_file?,\nproducts }`. The shape depends on whether `.upg/workspace.json` exists.",
1858
1870
  "return_shape": "{ mode, workspace_path?, current_product?, current_file?, products }",
@@ -1892,7 +1904,7 @@
1892
1904
  "switch_product",
1893
1905
  "get_workspace_info"
1894
1906
  ],
1895
- "source": "src/tools/workspace.ts:239",
1907
+ "source": "src/tools/workspace.ts:247",
1896
1908
  "symbol": "initWorkspaceTool",
1897
1909
  "returns": "JSON: `{ message, ...result }`. `result` carries the workspace\npath and the moved file's new location.",
1898
1910
  "return_shape": "{ message,...result }",
@@ -1922,10 +1934,13 @@
1922
1934
  "switch_product",
1923
1935
  "get_workspace_info"
1924
1936
  ],
1925
- "source": "src/tools/workspace.ts:40",
1937
+ "source": "src/tools/workspace.ts:44",
1926
1938
  "symbol": "listLocalProducts",
1927
- "returns": "JSON: `{ products: Array<{ file, title, stage, nodes, edges }> }`.",
1939
+ "returns": "JSON: `{ products: Array<{ file, title, stage, nodes, edges }> }`.\n`stage` is the CANONICAL UPGProductStage (legacy values like `idea` are\ncoerced to `concept`), or `null` when unset — matching what\n`get_product_context` reports for the same product (UPG-611 / DT-MCP-3).",
1928
1940
  "return_shape": "{ products: Array<{ file, title, stage, nodes, edges }> }",
1941
+ "return_notes": [
1942
+ "`stage` is the CANONICAL UPGProductStage (legacy values like `idea` are coerced to `concept`), or `null` when unset — matching what `get_product_context` reports for the same product (UPG-611 / DT-MCP-3)."
1943
+ ],
1929
1944
  "atomicity": "atomic (read-only)"
1930
1945
  },
1931
1946
  {
@@ -1942,7 +1957,7 @@
1942
1957
  "see": [
1943
1958
  "create_cross_product_edge"
1944
1959
  ],
1945
- "source": "src/tools/workspace.ts:534",
1960
+ "source": "src/tools/workspace.ts:542",
1946
1961
  "symbol": "listPortfolioCrossEdges",
1947
1962
  "returns": "JSON: `{ cross_edges: UPGCrossEdge[], total, portfolio_file? }`.",
1948
1963
  "return_shape": "{ cross_edges: UPGCrossEdge[], total, portfolio_file? }",
@@ -1969,7 +1984,7 @@
1969
1984
  "create_cross_product_edge",
1970
1985
  "get_organization"
1971
1986
  ],
1972
- "source": "src/tools/workspace.ts:317",
1987
+ "source": "src/tools/workspace.ts:325",
1973
1988
  "symbol": "listPortfolios",
1974
1989
  "returns": "JSON: `{ portfolios: Array<{ id, title, description?,\nparent_portfolio_id?, hierarchy_model?, products? }>, total }`.",
1975
1990
  "return_shape": "{ portfolios: Array<{ id, title, description?, parent_portfolio_id?, hierarchy_model?, products? }>, total }",
@@ -2012,7 +2027,7 @@
2012
2027
  "list_cross_edge_types",
2013
2028
  "init_workspace"
2014
2029
  ],
2015
- "source": "src/tools/workspace.ts:603",
2030
+ "source": "src/tools/workspace.ts:611",
2016
2031
  "symbol": "migrateCrossEdges",
2017
2032
  "returns": "JSON: `{ migrated, skipped, dry_run, portfolio_file? }`.",
2018
2033
  "return_shape": "{ migrated, skipped, dry_run, portfolio_file? }",
@@ -2046,7 +2061,7 @@
2046
2061
  "list_local_products",
2047
2062
  "init_workspace"
2048
2063
  ],
2049
- "source": "src/tools/workspace.ts:108",
2064
+ "source": "src/tools/workspace.ts:116",
2050
2065
  "symbol": "switchProduct",
2051
2066
  "returns": "JSON: `{ message, file, product: { title, stage }, entities }`.",
2052
2067
  "return_shape": "{ message, file, product: { title, stage }, entities }",
@@ -2127,7 +2142,7 @@
2127
2142
  "inspect",
2128
2143
  "validate_graph"
2129
2144
  ],
2130
- "source": "src/tools/spec.ts:1425",
2145
+ "source": "src/tools/spec.ts:1434",
2131
2146
  "symbol": "getAntiPattern",
2132
2147
  "returns": "JSON: `UPGCuratedAntiPattern`",
2133
2148
  "return_notes": [
@@ -2218,7 +2233,7 @@
2218
2233
  "list_anti_patterns",
2219
2234
  "get_playbook"
2220
2235
  ],
2221
- "source": "src/tools/spec.ts:746",
2236
+ "source": "src/tools/spec.ts:755",
2222
2237
  "symbol": "getDomainGuide",
2223
2238
  "returns": "JSON: the full `UPGDomainUsageGuide` record.",
2224
2239
  "return_notes": [
@@ -2256,7 +2271,7 @@
2256
2271
  "list_domains",
2257
2272
  "get_domain_guide"
2258
2273
  ],
2259
- "source": "src/tools/spec.ts:1881",
2274
+ "source": "src/tools/spec.ts:1890",
2260
2275
  "symbol": "getDomainRing",
2261
2276
  "returns": "JSON: the full `UPGDomainRing` record.",
2262
2277
  "return_notes": [
@@ -2297,7 +2312,7 @@
2297
2312
  "list_edge_migrations",
2298
2313
  "rename_edge_type"
2299
2314
  ],
2300
- "source": "src/tools/spec.ts:877",
2315
+ "source": "src/tools/spec.ts:886",
2301
2316
  "symbol": "getEdgeType",
2302
2317
  "returns": "JSON: `{ type, forward_verb, reverse_verb, classification, source_type, target_type }`",
2303
2318
  "return_shape": "{ type, forward_verb, reverse_verb, classification, source_type, target_type }",
@@ -2336,7 +2351,7 @@
2336
2351
  "get_entity_schema",
2337
2352
  "list_type_migrations"
2338
2353
  ],
2339
- "source": "src/tools/spec.ts:1340",
2354
+ "source": "src/tools/spec.ts:1349",
2340
2355
  "symbol": "getEntityMeta",
2341
2356
  "returns": "JSON: `EntityTypeMeta & { domain_id: string | null }`",
2342
2357
  "return_notes": [
@@ -2377,7 +2392,7 @@
2377
2392
  "get_playbook",
2378
2393
  "get_approach"
2379
2394
  ],
2380
- "source": "src/tools/spec.ts:814",
2395
+ "source": "src/tools/spec.ts:823",
2381
2396
  "symbol": "getFramework",
2382
2397
  "returns": "JSON: the full `UPGFramework` record.",
2383
2398
  "return_notes": [
@@ -2418,7 +2433,7 @@
2418
2433
  "get_framework",
2419
2434
  "list_entity_types"
2420
2435
  ],
2421
- "source": "src/tools/spec.ts:1134",
2436
+ "source": "src/tools/spec.ts:1143",
2422
2437
  "symbol": "getLensTool",
2423
2438
  "returns": "JSON: `{ ...UPGLens, visible_types: string[] }`",
2424
2439
  "return_shape": "{...UPGLens, visible_types: string[] }",
@@ -2454,7 +2469,7 @@
2454
2469
  "get_entity_meta",
2455
2470
  "get_entity_schema"
2456
2471
  ],
2457
- "source": "src/tools/spec.ts:1751",
2472
+ "source": "src/tools/spec.ts:1760",
2458
2473
  "symbol": "getLifecycle",
2459
2474
  "returns": "JSON: the full `UPGLifecycle` record, or a descriptive message.",
2460
2475
  "return_notes": [
@@ -2464,7 +2479,7 @@
2464
2479
  },
2465
2480
  {
2466
2481
  "name": "get_playbook",
2467
- "description": "Return one `UPGPlaybook` by id (e.g. \"playbook:strategy-outcomes\", \"playbook:business-model-bmc\"). Includes the ordered `creation_sequence` with step kinds and prompts. IDs are namespace-prefixed `playbook:*`. For approaches, use `get_approach`.",
2482
+ "description": "Return one `UPGPlaybook` by id (e.g. \"playbook:strategy-outcomes\", \"playbook:business-gtm-growth\"). Includes the ordered `creation_sequence` with step kinds and prompts. IDs are namespace-prefixed `playbook:*`. For approaches, use `get_approach`.",
2468
2483
  "domain": "spec",
2469
2484
  "inputSchema": {
2470
2485
  "type": "object",
@@ -2536,7 +2551,7 @@
2536
2551
  "get_playbook",
2537
2552
  "list_lenses"
2538
2553
  ],
2539
- "source": "src/tools/spec.ts:936",
2554
+ "source": "src/tools/spec.ts:945",
2540
2555
  "symbol": "getRegion",
2541
2556
  "returns": "JSON: the full `UPGRegion` record.",
2542
2557
  "return_notes": [
@@ -2577,7 +2592,7 @@
2577
2592
  "get_entity_meta",
2578
2593
  "list_entity_types"
2579
2594
  ],
2580
- "source": "src/tools/spec.ts:958",
2595
+ "source": "src/tools/spec.ts:967",
2581
2596
  "symbol": "getRegionForEntity",
2582
2597
  "returns": "JSON: the full `UPGRegion` record.",
2583
2598
  "return_notes": [
@@ -2608,7 +2623,7 @@
2608
2623
  "list_scales",
2609
2624
  "get_entity_schema"
2610
2625
  ],
2611
- "source": "src/tools/spec.ts:1797",
2626
+ "source": "src/tools/spec.ts:1806",
2612
2627
  "symbol": "getScale",
2613
2628
  "returns": "JSON: the full `UPGScaleDefinition` record including all points.",
2614
2629
  "return_notes": [
@@ -2639,7 +2654,7 @@
2639
2654
  "list_edge_types",
2640
2655
  "list_regions"
2641
2656
  ],
2642
- "source": "src/tools/spec.ts:986",
2657
+ "source": "src/tools/spec.ts:995",
2643
2658
  "symbol": "getSpecVersion",
2644
2659
  "returns": "JSON: `{ upg_version, markdown_format_version, entity_count, edge_count, domain_count, region_count }`",
2645
2660
  "return_shape": "{ upg_version, markdown_format_version, entity_count, edge_count, domain_count, region_count }",
@@ -2685,7 +2700,7 @@
2685
2700
  "get_entity_meta",
2686
2701
  "list_frameworks"
2687
2702
  ],
2688
- "source": "src/tools/spec.ts:1202",
2703
+ "source": "src/tools/spec.ts:1211",
2689
2704
  "symbol": "getTypeLabel",
2690
2705
  "returns": "JSON: `{ ...UPGTypeLabel, resolved_label: string }`",
2691
2706
  "return_shape": "{...UPGTypeLabel, resolved_label: string }",
@@ -2724,7 +2739,7 @@
2724
2739
  "get_entity_meta",
2725
2740
  "create_node"
2726
2741
  ],
2727
- "source": "src/tools/spec.ts:1232",
2742
+ "source": "src/tools/spec.ts:1241",
2728
2743
  "symbol": "getValidChildrenTool",
2729
2744
  "returns": "JSON: `{ parent_type, valid_children: string[] }`",
2730
2745
  "return_shape": "{ parent_type, valid_children: string[] }",
@@ -2732,7 +2747,7 @@
2732
2747
  },
2733
2748
  {
2734
2749
  "name": "inspect",
2735
- "description": "[LLM-mediated] This tool returns a routing envelope, not computed results. For user-facing inspection, invoke the /upg-inspect skill instead of calling this tool directly. Inspect approach: path of arrival to \"what's broken?\". Returns the Inspect record + invocation params in the family-resemblance envelope. The LLM consumes `signature_hint` and emits `{ violations: [{ severity, kind, entity_id, description, fix_hint }] }` against `UPG_ANTI_PATTERNS` + the live graph. Optional `region` or `entities[]` scope the audit.",
2750
+ "description": "[LLM-mediated] This tool returns a routing envelope, not computed results. For user-facing inspection, invoke the /upg-show-entity skill instead of calling this tool directly. Inspect approach: path of arrival to \"what's broken?\". Returns the Inspect record + invocation params in the family-resemblance envelope. The LLM consumes `signature_hint` and emits `{ violations: [{ severity, kind, entity_id, description, fix_hint }] }` against `UPG_ANTI_PATTERNS` + the live graph. Optional `region` or `entities[]` scope the audit.",
2736
2751
  "domain": "spec",
2737
2752
  "inputSchema": {
2738
2753
  "type": "object",
@@ -2762,7 +2777,7 @@
2762
2777
  "plan",
2763
2778
  "reflect"
2764
2779
  ],
2765
- "source": "src/tools/spec.ts:459",
2780
+ "source": "src/tools/spec.ts:468",
2766
2781
  "symbol": "inspect",
2767
2782
  "returns": "JSON envelope: `{ approach_id, scope, generated_at, approach,\nparams, violations, summary, execution_mode: \"execution_v0_4_0\" }`",
2768
2783
  "return_notes": [
@@ -2827,7 +2842,7 @@
2827
2842
  "inspect",
2828
2843
  "get_domain_guide"
2829
2844
  ],
2830
- "source": "src/tools/spec.ts:1383",
2845
+ "source": "src/tools/spec.ts:1392",
2831
2846
  "symbol": "listAntiPatterns",
2832
2847
  "returns": "JSON: `{ total, count, next_cursor?, anti_patterns: UPGCuratedAntiPattern[] }`",
2833
2848
  "return_shape": "{ total, count, next_cursor?, anti_patterns: UPGCuratedAntiPattern[] }",
@@ -2928,7 +2943,7 @@
2928
2943
  "list_domains",
2929
2944
  "list_anti_patterns"
2930
2945
  ],
2931
- "source": "src/tools/spec.ts:1472",
2946
+ "source": "src/tools/spec.ts:1481",
2932
2947
  "symbol": "listBenchmarks",
2933
2948
  "returns": "JSON: `{ kind, total, count, benchmarks: ... }`",
2934
2949
  "return_shape": "{ kind, total, count, benchmarks:... }",
@@ -2956,7 +2971,7 @@
2956
2971
  "list_portfolio_cross_edges",
2957
2972
  "migrate_cross_edges"
2958
2973
  ],
2959
- "source": "src/tools/spec.ts:1072",
2974
+ "source": "src/tools/spec.ts:1081",
2960
2975
  "symbol": "listCrossEdgeTypes",
2961
2976
  "returns": "JSON: `{ count, types: readonly UPGCrossEdgeType[] }`",
2962
2977
  "return_shape": "{ count, types: readonly UPGCrossEdgeType[] }",
@@ -2984,7 +2999,7 @@
2984
2999
  "list_domains",
2985
3000
  "get_domain_guide"
2986
3001
  ],
2987
- "source": "src/tools/spec.ts:1860",
3002
+ "source": "src/tools/spec.ts:1869",
2988
3003
  "symbol": "listDomainRings",
2989
3004
  "returns": "JSON: `{ rings: UPGDomainRing[], total: number }`",
2990
3005
  "return_shape": "{ rings: UPGDomainRing[], total: number }",
@@ -3019,7 +3034,7 @@
3019
3034
  "list_regions",
3020
3035
  "list_entity_types"
3021
3036
  ],
3022
- "source": "src/tools/spec.ts:711",
3037
+ "source": "src/tools/spec.ts:720",
3023
3038
  "symbol": "listDomains",
3024
3039
  "returns": "JSON: `{ count, domains: Array<{ domain_id, anchor_entity, creation_sequence } | { domain_id, label, description, types, has_guide }> }`",
3025
3040
  "return_shape": "{ count, domains: Array<{ domain_id, anchor_entity, creation_sequence } | { domain_id, label, description, types, has_guide }> }",
@@ -3054,7 +3069,7 @@
3054
3069
  "list_edge_types",
3055
3070
  "validate_graph"
3056
3071
  ],
3057
- "source": "src/tools/spec.ts:1644",
3072
+ "source": "src/tools/spec.ts:1653",
3058
3073
  "symbol": "listEdgeMigrations",
3059
3074
  "returns": "JSON: `{ migrations: [{ kind, from, to?, since }], total: number }`",
3060
3075
  "return_shape": "{ migrations: [{ kind, from, to?, since }], total: number }",
@@ -3093,7 +3108,7 @@
3093
3108
  "list_edge_migrations",
3094
3109
  "create_edge"
3095
3110
  ],
3096
- "source": "src/tools/spec.ts:858",
3111
+ "source": "src/tools/spec.ts:867",
3097
3112
  "symbol": "listEdgeTypes",
3098
3113
  "returns": "JSON: `{ count, edges: Array<{ type, forward_verb, reverse_verb, classification, source_type, target_type }> }`",
3099
3114
  "return_shape": "{ count, edges: Array<{ type, forward_verb, reverse_verb, classification, source_type, target_type }> }",
@@ -3151,7 +3166,7 @@
3151
3166
  "list_type_migrations",
3152
3167
  "list_domains"
3153
3168
  ],
3154
- "source": "src/tools/spec.ts:1284",
3169
+ "source": "src/tools/spec.ts:1293",
3155
3170
  "symbol": "listEntityTypes",
3156
3171
  "returns": "JSON: `{ total, count, next_cursor?, types: Array<EntityTypeMeta & { domain_id: string | null }> }`",
3157
3172
  "return_shape": "{ total, count, next_cursor?, types: Array<EntityTypeMeta & { domain_id: string | null }> }",
@@ -3178,7 +3193,7 @@
3178
3193
  "list_frameworks",
3179
3194
  "list_framework_structure_patterns"
3180
3195
  ],
3181
- "source": "src/tools/spec.ts:1816",
3196
+ "source": "src/tools/spec.ts:1825",
3182
3197
  "symbol": "listFrameworkCategories",
3183
3198
  "returns": "JSON: `{ categories: string[], total: number }`",
3184
3199
  "return_shape": "{ categories: string[], total: number }",
@@ -3206,7 +3221,7 @@
3206
3221
  "list_framework_categories",
3207
3222
  "get_framework"
3208
3223
  ],
3209
- "source": "src/tools/spec.ts:1837",
3224
+ "source": "src/tools/spec.ts:1846",
3210
3225
  "symbol": "listFrameworkStructurePatterns",
3211
3226
  "returns": "JSON: `{ patterns: string[], total: number }`",
3212
3227
  "return_shape": "{ patterns: string[], total: number }",
@@ -3249,7 +3264,7 @@
3249
3264
  "prioritise",
3250
3265
  "list_approaches"
3251
3266
  ],
3252
- "source": "src/tools/spec.ts:778",
3267
+ "source": "src/tools/spec.ts:787",
3253
3268
  "symbol": "listFrameworks",
3254
3269
  "returns": "JSON: `{ total, count, next_cursor?, frameworks: UPGFramework[] }`",
3255
3270
  "return_shape": "{ total, count, next_cursor?, frameworks: UPGFramework[] }",
@@ -3278,7 +3293,7 @@
3278
3293
  "list_playbooks",
3279
3294
  "list_frameworks"
3280
3295
  ],
3281
- "source": "src/tools/spec.ts:1101",
3296
+ "source": "src/tools/spec.ts:1110",
3282
3297
  "symbol": "listLenses",
3283
3298
  "returns": "JSON: `{ count, lenses: Array<{ id, name, description, icon, audience, perspective, framework_id?, playbook_id?, visible_domain_count, intelligence_prompt_count }> }`",
3284
3299
  "return_shape": "{ count, lenses: Array<{ id, name, description, icon, audience, perspective, framework_id?, playbook_id?, visible_domain_count, intelligence_prompt_count }> }",
@@ -3315,7 +3330,7 @@
3315
3330
  "list_entity_types",
3316
3331
  "get_entity_meta"
3317
3332
  ],
3318
- "source": "src/tools/spec.ts:1709",
3333
+ "source": "src/tools/spec.ts:1718",
3319
3334
  "symbol": "listLifecycles",
3320
3335
  "returns": "JSON: `{ lifecycles, total, free_types: string[], planned_types: string[] }`",
3321
3336
  "return_shape": "{ lifecycles, total, free_types: string[], planned_types: string[] }",
@@ -3386,7 +3401,7 @@
3386
3401
  "list_domain_rings",
3387
3402
  "create_product"
3388
3403
  ],
3389
- "source": "src/tools/spec.ts:1580",
3404
+ "source": "src/tools/spec.ts:1589",
3390
3405
  "symbol": "listProductStages",
3391
3406
  "returns": "JSON: `{ count, stages: readonly UPGProductStage[] }`",
3392
3407
  "return_shape": "{ count, stages: readonly UPGProductStage[] }",
@@ -3415,7 +3430,7 @@
3415
3430
  "list_domains",
3416
3431
  "list_playbooks"
3417
3432
  ],
3418
- "source": "src/tools/spec.ts:904",
3433
+ "source": "src/tools/spec.ts:913",
3419
3434
  "symbol": "listRegions",
3420
3435
  "returns": "JSON: `{ count, regions: Array<{ id, label, order, shape, mental_model, anchor_type, composes_atomic_domains, entity_count, intra_edge_count, boundary_edge_count }> }`",
3421
3436
  "return_shape": "{ count, regions: Array<{ id, label, order, shape, mental_model, anchor_type, composes_atomic_domains, entity_count, intra_edge_count, boundary_edge_count }> }",
@@ -3442,7 +3457,7 @@
3442
3457
  "get_scale",
3443
3458
  "get_entity_schema"
3444
3459
  ],
3445
- "source": "src/tools/spec.ts:1782",
3460
+ "source": "src/tools/spec.ts:1791",
3446
3461
  "symbol": "listScales",
3447
3462
  "returns": "JSON: `{ scales: UPGScaleDefinition[], total: number }`",
3448
3463
  "return_shape": "{ scales: UPGScaleDefinition[], total: number }",
@@ -3471,7 +3486,7 @@
3471
3486
  "migrate_type",
3472
3487
  "validate_graph"
3473
3488
  ],
3474
- "source": "src/tools/spec.ts:1681",
3489
+ "source": "src/tools/spec.ts:1690",
3475
3490
  "symbol": "listSplitMigrations",
3476
3491
  "returns": "JSON: `{ splits: [...], total: number }`",
3477
3492
  "return_shape": "{ splits: [...], total: number }",
@@ -3508,7 +3523,7 @@
3508
3523
  "list_entity_types",
3509
3524
  "get_entity_meta"
3510
3525
  ],
3511
- "source": "src/tools/spec.ts:1167",
3526
+ "source": "src/tools/spec.ts:1176",
3512
3527
  "symbol": "listTypeLabels",
3513
3528
  "returns": "JSON: `{ total, count, next_cursor?, labels: UPGTypeLabel[] }`",
3514
3529
  "return_shape": "{ total, count, next_cursor?, labels: UPGTypeLabel[] }",
@@ -3544,7 +3559,7 @@
3544
3559
  "validate_graph",
3545
3560
  "list_entity_types"
3546
3561
  ],
3547
- "source": "src/tools/spec.ts:1613",
3562
+ "source": "src/tools/spec.ts:1622",
3548
3563
  "symbol": "listTypeMigrations",
3549
3564
  "returns": "JSON: `{ migrations: [{ from, to, since }], total: number }`",
3550
3565
  "return_shape": "{ migrations: [{ from, to, since }], total: number }",
@@ -3552,14 +3567,18 @@
3552
3567
  },
3553
3568
  {
3554
3569
  "name": "plan",
3555
- "description": "Plan approach: path of arrival to \"what should I build next?\". Returns the Plan record + invocation params wrapped in `{ approach_id, scope, generated_at, approach, params }`. The LLM consumes `signature_hint` and synthesises `{ missing_entities, coverage_score }` against the live graph. Optional `region` narrows scope.",
3570
+ "description": "Plan approach: path of arrival to \"what should I build next?\". Returns the Plan record + invocation params wrapped in `{ approach_id, scope, generated_at, approach, params }`. The LLM consumes `signature_hint` and synthesises `{ missing_entities, coverage_score }` against the live graph. Optional `region` narrows scope; omit `region` to scope to the product's ACTIVE regions; pass `exhaustive:true` to score the full type universe (UPG-601).",
3556
3571
  "domain": "spec",
3557
3572
  "inputSchema": {
3558
3573
  "type": "object",
3559
3574
  "properties": {
3560
3575
  "region": {
3561
3576
  "type": "string",
3562
- "description": "Optional UPGRegionId. Narrows planning scope to a single region (e.g. \"users_needs\", \"business_gtm_growth\"). Omit for whole-graph planning."
3577
+ "description": "Optional UPGRegionId or atomic-domain id. Narrows planning scope to a single region (e.g. \"users_needs\", \"business_gtm_growth\"). Omit to scope to the product's active regions."
3578
+ },
3579
+ "exhaustive": {
3580
+ "type": "boolean",
3581
+ "description": "If true, score against the entire 312-type universe (every domain creation sequence). Off by default; whole-universe gap scoring is noisy for a focused product. Only applies when `region` is omitted."
3563
3582
  }
3564
3583
  }
3565
3584
  },
@@ -3623,7 +3642,7 @@
3623
3642
  "plan",
3624
3643
  "trace"
3625
3644
  ],
3626
- "source": "src/tools/spec.ts:518",
3645
+ "source": "src/tools/spec.ts:527",
3627
3646
  "symbol": "prioritise",
3628
3647
  "returns": "JSON envelope: `{ approach_id, scope, generated_at, approach,\nparams, framework_resolved, ranked?, required_properties?,\nhint?, execution_mode }`. Execution mode is `\"execution_v0_4_0\"` when\nthe framework has an expression, `\"definition_lookup_v0_4_0\"` otherwise.",
3629
3648
  "return_notes": [
@@ -3675,7 +3694,7 @@
3675
3694
  "plan",
3676
3695
  "get_anti_pattern"
3677
3696
  ],
3678
- "source": "src/tools/spec.ts:661",
3697
+ "source": "src/tools/spec.ts:670",
3679
3698
  "symbol": "reflect",
3680
3699
  "returns": "JSON envelope: `{ approach_id, scope, generated_at, approach,\nparams, prompts, execution_mode: \"execution_v0_4_0\" }`",
3681
3700
  "return_notes": [
@@ -3723,7 +3742,7 @@
3723
3742
  "create_edge",
3724
3743
  "trace"
3725
3744
  ],
3726
- "source": "src/tools/spec.ts:1040",
3745
+ "source": "src/tools/spec.ts:1049",
3727
3746
  "symbol": "resolveEdgeForPair",
3728
3747
  "returns": "JSON: `{ source_type, target_type, edge_type: string | null,\nanchor_hint?, alternate_anchors?, adjacent_edges? }`",
3729
3748
  "return_shape": "{ source_type, target_type, edge_type: string | null, anchor_hint?, alternate_anchors?, adjacent_edges? }",
@@ -3782,7 +3801,7 @@
3782
3801
  "plan",
3783
3802
  "prioritise"
3784
3803
  ],
3785
- "source": "src/tools/spec.ts:598",
3804
+ "source": "src/tools/spec.ts:607",
3786
3805
  "symbol": "trace",
3787
3806
  "returns": "JSON envelope: `{ approach_id, scope, generated_at, approach,\nparams, trail, reached, error?, halted_at_depth?,\nexecution_mode: \"execution_v0_4_0\" }`",
3788
3807
  "return_notes": [
@@ -3999,7 +4018,7 @@
3999
4018
  ],
4000
4019
  "warnings": [],
4001
4020
  "see": [],
4002
- "source": "src/tools/skills.ts:191",
4021
+ "source": "src/tools/skills.ts:207",
4003
4022
  "symbol": "skillAudit",
4004
4023
  "returns": "`{ skills: SkillAuditRecord[] }`",
4005
4024
  "return_shape": "{ skills: SkillAuditRecord[] }",