@unified-product-graph/cli 0.6.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.
Files changed (55) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +21 -0
  3. package/README.md +247 -0
  4. package/dist/cli.cjs +141010 -0
  5. package/package.json +65 -0
  6. package/skills/README.md +10 -0
  7. package/skills/upg/SKILL.md +245 -0
  8. package/skills/upg-analytics/SKILL.md +135 -0
  9. package/skills/upg-capture/SKILL.md +274 -0
  10. package/skills/upg-connect/SKILL.md +167 -0
  11. package/skills/upg-context/SKILL.md +506 -0
  12. package/skills/upg-context-intelligence/SKILL.md +227 -0
  13. package/skills/upg-design-system/SKILL.md +265 -0
  14. package/skills/upg-diff/SKILL.md +150 -0
  15. package/skills/upg-discover/SKILL.md +290 -0
  16. package/skills/upg-explore/SKILL-DETAIL.md +481 -0
  17. package/skills/upg-explore/SKILL.md +297 -0
  18. package/skills/upg-export/SKILL.md +385 -0
  19. package/skills/upg-feedback/SKILL.md +141 -0
  20. package/skills/upg-gaps/SKILL.md +376 -0
  21. package/skills/upg-hypothesis/SKILL.md +190 -0
  22. package/skills/upg-impact/SKILL.md +229 -0
  23. package/skills/upg-import/SKILL.md +189 -0
  24. package/skills/upg-init/SKILL.md +410 -0
  25. package/skills/upg-inspect/SKILL.md +167 -0
  26. package/skills/upg-journey/SKILL.md +207 -0
  27. package/skills/upg-launch/SKILL-DETAIL.md +392 -0
  28. package/skills/upg-launch/SKILL.md +141 -0
  29. package/skills/upg-migrate/SKILL.md +146 -0
  30. package/skills/upg-okr/SKILL-DETAIL.md +351 -0
  31. package/skills/upg-okr/SKILL.md +88 -0
  32. package/skills/upg-persona/SKILL.md +230 -0
  33. package/skills/upg-prioritise/SKILL.md +195 -0
  34. package/skills/upg-pull/SKILL-DETAIL.md +398 -0
  35. package/skills/upg-pull/SKILL.md +57 -0
  36. package/skills/upg-push/SKILL-DETAIL.md +385 -0
  37. package/skills/upg-push/SKILL.md +113 -0
  38. package/skills/upg-reflect/SKILL.md +201 -0
  39. package/skills/upg-research/SKILL.md +336 -0
  40. package/skills/upg-rollback/SKILL.md +163 -0
  41. package/skills/upg-run/SKILL.md +126 -0
  42. package/skills/upg-schema-changelog/SKILL.md +231 -0
  43. package/skills/upg-schema-consolidate/SKILL.md +243 -0
  44. package/skills/upg-schema-edges/SKILL.md +287 -0
  45. package/skills/upg-schema-evolve/SKILL.md +313 -0
  46. package/skills/upg-schema-health/SKILL.md +279 -0
  47. package/skills/upg-schema-update/SKILL.md +206 -0
  48. package/skills/upg-snapshot/SKILL.md +108 -0
  49. package/skills/upg-status/SKILL.md +340 -0
  50. package/skills/upg-strategy/SKILL.md +334 -0
  51. package/skills/upg-template/SKILL.md +145 -0
  52. package/skills/upg-trace/SKILL.md +197 -0
  53. package/skills/upg-tree/SKILL.md +233 -0
  54. package/skills/upg-verify/SKILL.md +223 -0
  55. package/skills/upg-workspace/SKILL.md +103 -0
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@unified-product-graph/cli",
3
+ "version": "0.6.0",
4
+ "description": "MCP server + CLI for the Unified Product Graph \u2014 drop into Claude Code or use the `upg` command.",
5
+ "license": "MIT",
6
+ "author": "The Product Creator <hello@theproductcreator.com>",
7
+ "homepage": "https://unifiedproductgraph.org",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/unified-product-graph/cli.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/unified-product-graph/cli/issues"
14
+ },
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "type": "module",
19
+ "bin": {
20
+ "upg": "dist/cli.cjs"
21
+ },
22
+ "main": "./dist/cli.cjs",
23
+ "files": [
24
+ "dist",
25
+ "skills",
26
+ "CHANGELOG.md"
27
+ ],
28
+ "scripts": {
29
+ "build": "node scripts/copy-skills.mjs && tsup",
30
+ "dev": "tsx src/cli.ts",
31
+ "postbuild": "chmod +x dist/cli.cjs",
32
+ "prepack": "node scripts/copy-skills.mjs",
33
+ "copy-skills": "node scripts/copy-skills.mjs",
34
+ "type-check": "tsc --noEmit",
35
+ "test": "vitest run",
36
+ "test:watch": "vitest",
37
+ "lint": "eslint src/",
38
+ "prepublishOnly": "npm run build"
39
+ },
40
+ "dependencies": {
41
+ "@linear/sdk": "^5.0.0",
42
+ "@octokit/rest": "^20.0.0",
43
+ "@unified-product-graph/core": "*",
44
+ "@unified-product-graph/sdk": "*",
45
+ "chalk": "^4.1.2",
46
+ "commander": "^13.0.0",
47
+ "inquirer": "^12.0.0",
48
+ "ora": "^8.0.0"
49
+ },
50
+ "devDependencies": {
51
+ "tsup": "^8.0.0",
52
+ "tsx": "^4.19.0",
53
+ "typescript": "^5.8.0",
54
+ "vitest": "^3.1.1",
55
+ "@unified-product-graph/adapters": "*"
56
+ },
57
+ "engines": {
58
+ "node": ">=18"
59
+ },
60
+ "keywords": [
61
+ "mcp",
62
+ "mcp-server",
63
+ "model-context-protocol"
64
+ ]
65
+ }
@@ -0,0 +1,10 @@
1
+ # @unified-product-graph/cli bundled skills
2
+
3
+ This folder is **regenerated** from `../upg-mcp-server/skills/` every time
4
+ `@unified-product-graph/cli` is built or packed (via `scripts/copy-skills.mjs`).
5
+
6
+ Do **not** edit files here. Edit the canonical source in
7
+ `packages/upg-mcp-server/skills/` and re-run `npm run build` in
8
+ `@unified-product-graph/cli` to sync.
9
+
10
+ These skills are consumed by `upg install-skills`.
@@ -0,0 +1,245 @@
1
+ ---
2
+ name: upg
3
+ description: "Unified Product Graph — your product graph, right here in the terminal"
4
+ user-invocable: true
5
+ argument-hint: "[command or natural-language question]"
6
+ category: aggregator
7
+ ---
8
+
9
+ # /upg — Unified Product Graph
10
+
11
+ You are the front door to the Unified Product Graph experience inside Claude Code. Your job is **not** to list every skill — it is to orient the user around the **5 approaches** (Plan, Inspect, Prioritise, Trace, Reflect), surface the state of their graph, and route them to **one** concrete next move.
12
+
13
+ If they want a phonebook, they can ask for it. The default is conversation.
14
+
15
+ **Before producing any output, load the design system:** `/upg-context` (interaction principles, design system, lens rules) and `/upg-context-intelligence` (benchmarks, user personas, product philosophy).
16
+
17
+ ## Tools
18
+
19
+ Use the `mcp__unified-product-graph__*` MCP tools:
20
+ - **State:** `get_product_context`, `get_graph_digest`, `get_session_context`
21
+ - **Approaches:** `list_approaches`, `get_approach`
22
+ - **Regions / playbooks (when relevant):** `list_regions`, `get_region`, `list_playbooks`, `get_playbook`
23
+
24
+ ## The Cartographic Frame
25
+
26
+ UPG is a chart of your product knowledge. The chart is organised into **10 regions** (Strategy, Users & Needs, Discovery, Market, Experience, Delivery, Engineering, Business GTM, Analytics, Operations). The chart is read through one of **5 approaches** — five paths of arrival to five different questions:
27
+
28
+ | Approach | Question | Cartographic sense |
29
+ |---|---|---|
30
+ | 🧠 **Plan** | *"What should I build next?"* | Walk the coastline, mark missing contour |
31
+ | 🔍 **Inspect** | *"What's broken?"* | Survey for hazards before approach |
32
+ | 📊 **Prioritise** | *"What's most important?"* | Compute order of arrival from a chosen vantage |
33
+ | 🧵 **Trace** | *"Walk a meaningful path through what exists"* | Trace a route across charted terrain |
34
+ | 🪞 **Reflect** | *"What should I be questioning?"* | Mark the parts of the chart that may be conjecture |
35
+
36
+ Skills (`/upg-*`) are the user-invocable surfaces. Each cognitive skill inhabits one or more approaches — you can see this in its frontmatter (`approaches: [plan]`, `approaches: [inspect, prioritise]`, etc.).
37
+
38
+ ## Behavior
39
+
40
+ ### Step 1 — Read state
41
+
42
+ Always start by checking:
43
+
44
+ ```
45
+ get_product_context() // graph exists? what's in it?
46
+ get_session_context() // what's the active lens?
47
+ ```
48
+
49
+ Branch based on whether a graph exists.
50
+
51
+ ---
52
+
53
+ ### Branch A — Graph exists
54
+
55
+ Render the orientation card (real markdown, NOT inside a code block):
56
+
57
+ ---
58
+
59
+ ```
60
+ · ·
61
+
62
+ · ·
63
+ ```
64
+ # Unified Product Graph
65
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
66
+
67
+ **<Product Name>** · *<stage>* · <N> entities · <N> edges · <N> regions active
68
+
69
+ Maturity ● ● ● ○ ○ **3/5** *<stage label>*
70
+
71
+ > **Lens:** `<active>` — <render the lens description from this table: product → "personas, outcomes, features" · engineering → "services, APIs, data flows" · design → "screens, flows, components" · growth → "funnels, channels, campaigns">. Say "switch to [product|engineering|design|growth]" to change.
72
+
73
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
74
+
75
+ **What do you want to do?**
76
+
77
+ | | Approach | Question | Common entry |
78
+ |---|---|---|---|
79
+ | 🧠 | **Plan** | What should I build next? | `/upg-explore <region>` · `/upg-strategy` · `/upg-journey` |
80
+ | 🔍 | **Inspect** | What's broken? | `/upg-status` · `/upg-tree` · `/upg-inspect <entity>` |
81
+ | 📊 | **Prioritise** | What's most important? | `/upg-prioritise` · `/upg-gaps` · `/upg-impact` |
82
+ | 🧵 | **Trace** | Walk a path through what exists | `/upg-trace <anchor> → <destination>` · `/upg-impact <entity>` · `/upg-connect` |
83
+ | 🪞 | **Reflect** | What should I be questioning? | `/upg-reflect` · *Five Whys · Pre-mortem · Red Team · Devil's Advocate · Second-order* |
84
+
85
+ **Tell me which approach, or just describe what's on your mind.**
86
+
87
+ ---
88
+
89
+ ### Routing Hints
90
+
91
+ When the user selects an approach (or you infer one from their description), pre-call the listed tool before routing — it gives the downstream skill the data it needs without a cold start.
92
+
93
+ | Approach | Pre-call | Entry skill |
94
+ |---|---|---|
95
+ | 🧠 Plan | `mcp__unified-product-graph__list_playbooks()` — see region options | `/upg-explore <region>` |
96
+ | 🔍 Inspect | `mcp__unified-product-graph__get_graph_digest()` — health metrics | `/upg-status` |
97
+ | 📊 Prioritise | `mcp__unified-product-graph__get_graph_digest()` — gap + coverage data | `/upg-gaps` |
98
+ | 🧵 Trace | `mcp__unified-product-graph__get_product_context()` — find anchor entities | `/upg-impact <entity>` |
99
+ | 🪞 Reflect | `mcp__unified-product-graph__get_session_context()` — recent decisions | `/upg-reflect` |
100
+
101
+ ---
102
+
103
+ After the card, **make ONE concrete suggestion** based on the graph state. Pick the highest-value next move from this priority order:
104
+
105
+ 1. **No anchor entity for an active region** → suggest `/upg-explore <region>` to fill the missing scaffolding (Plan)
106
+ 2. **Anti-pattern violations present** → suggest `/upg-status` then `/upg-gaps` (Inspect)
107
+ 3. **A `decision` entity has no rationale or has gone stale** → suggest `/upg-reflect <decision>` (Reflect)
108
+ 4. **A `hypothesis` has no `evidence`** → suggest `/upg-hypothesis` to design the experiment (Plan)
109
+ 5. **A `feature` is `in_progress` with no linked outcome** → suggest `/upg-impact <feature>` (Trace)
110
+ 6. **Otherwise** → suggest `/upg-status` for a 30-second pulse
111
+
112
+ Surface that one suggestion as: *"Looking at your graph, the highest-value next move is **X**. Want to start there?"*
113
+
114
+ ---
115
+
116
+ ### Branch B — No graph yet
117
+
118
+ Render (real markdown, NOT a code block):
119
+
120
+ ---
121
+
122
+ ```
123
+ · ·
124
+
125
+ · ·
126
+ ```
127
+ # Unified Product Graph
128
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
129
+
130
+ **Structure your product thinking as a connected graph — right here in the terminal.**
131
+
132
+ Your graph lives in a `.upg` file — a portable JSON format you own and track with git. No cloud required, no lock-in.
133
+
134
+ UPG is a chart of your product knowledge across **10 regions** — Strategy, Users & Needs, Discovery, Market, Experience, Delivery, Engineering, Business GTM, Analytics, Operations.
135
+
136
+ You read the chart through **5 approaches** — Plan, Inspect, Prioritise, Trace, Reflect.
137
+
138
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
139
+
140
+ **Get started**
141
+
142
+ | | Command | What it does |
143
+ |---|---|---|
144
+ | 🌱 | `/upg-init` | Bootstrap your first product graph (guided, ~5 minutes) |
145
+ | 📋 | `/upg-template` | Start from a proven pattern (SaaS, marketplace, mobile, OSS, agency) |
146
+
147
+ > Learn more: **unifiedproductgraph.org**
148
+
149
+ ---
150
+
151
+ ### Step 2 — If the user passes an argument
152
+
153
+ If `/upg <something>` is given:
154
+
155
+ 1. **Match a subcommand:** `init`, `status`, `tree`, `gaps`, `inspect`, `reflect`, `explore`, `journey`, etc. → run the corresponding `/upg-<x>` skill.
156
+ 2. **Match an approach name:** `plan`, `inspect`, `prioritise`, `trace`, `reflect` → call `get_approach({ approach_id })` and route the user to the most-fitting skill for their graph state.
157
+ 3. **Match a region name:** `strategy`, `users_needs`, `experience_design_brand`, etc. → suggest `/upg-explore <region>`.
158
+ 4. **Free-text question:** parse intent into one of the 5 approaches, then suggest a skill.
159
+
160
+ If unmatched, show the orientation card and ask: *"Did you mean one of these? Or tell me in your own words."*
161
+
162
+ ---
163
+
164
+ ### Step 3 — When the user asks "show me everything"
165
+
166
+ Only then, surface the complete catalogue. Default behaviour stays focused.
167
+
168
+ When asked, show this expanded view:
169
+
170
+ **Cognitive skills (organised by approach)**
171
+
172
+ 🧠 **Plan**
173
+ | Skill | What |
174
+ |---|---|
175
+ | `/upg-explore <region>` | Walk a region's canonical playbook |
176
+ | `/upg-run <playbook-id>` | Run any canonical playbook directly |
177
+ | `/upg-journey` | 7-phase product journey |
178
+ | `/upg-strategy` | Vision → mission → themes → outcomes |
179
+ | `/upg-okr` | Objectives & key results |
180
+ | `/upg-launch` | Go-to-market planning |
181
+ | `/upg-research` | User research session |
182
+ | `/upg-discover` | OST-guided discovery |
183
+ | `/upg-hypothesis` | Structured hypothesis creation |
184
+ | `/upg-persona` | Guided persona building |
185
+
186
+ 🔍 **Inspect**
187
+ | Skill | What |
188
+ |---|---|
189
+ | `/upg-status` | Health dashboard |
190
+ | `/upg-tree` | Framework-aware tree view |
191
+ | `/upg-inspect <entity>` | Deep-dive on one entity |
192
+ | `/upg-analytics` | Product thinking metrics |
193
+ | `/upg-verify` | Code-to-graph sync audit |
194
+ | `/upg-diff` | What changed since last commit |
195
+
196
+ 📊 **Prioritise**
197
+ | Skill | What |
198
+ |---|---|
199
+ | `/upg-prioritise` | RICE / WSJF / Eisenhower / ICE scoring across candidate items |
200
+ | `/upg-gaps` | Strategic gap analysis + maturity scoring |
201
+ | `/upg-impact` | Forward blast radius (Trace + Prioritise) |
202
+
203
+ 🧵 **Trace**
204
+ | Skill | What |
205
+ |---|---|
206
+ | `/upg-trace <anchor> → <destination>` | Walk a directed path through the graph (canonical Trace entry) |
207
+ | `/upg-impact <entity>` | Forward / `--upstream` causal chain |
208
+ | `/upg-connect` | Wire relationships between entities |
209
+
210
+ 🪞 **Reflect**
211
+ | Skill | What |
212
+ |---|---|
213
+ | `/upg-reflect [scope]` | Five Whys / Pre-mortem / Red Team / Devil's Advocate / Second-order |
214
+
215
+ **Tooling** (graph state operations — `/upg-init`, `/upg-capture`, `/upg-push`, `/upg-pull`, `/upg-snapshot`, `/upg-rollback`, `/upg-migrate`, `/upg-import`, `/upg-export`, `/upg-feedback`, `/upg-template`, `/upg-workspace`)
216
+
217
+ **Schema** (spec evolution — `/upg-schema-update`, `/upg-schema-consolidate`, `/upg-schema-evolve`, `/upg-schema-health`, `/upg-schema-changelog`, `/upg-schema-edges`)
218
+
219
+ **Meta** (system reference — `/upg-context`, `/upg-design-system`)
220
+
221
+ ---
222
+
223
+ ## Key Principles
224
+
225
+ - **Orient, don't overwhelm.** Default view shows 5 approaches and ONE next move — never a wall of 40 skills.
226
+ - **Approaches are the spine.** Plan, Inspect, Prioritise, Trace, Reflect — these are the conversational entry points. Skills implement them.
227
+ - **Tooling is plumbing.** `/upg-init`, `/upg-push`, `/upg-snapshot` etc. are real and important, but they don't belong in the main view. They surface when the user needs them, or when they ask "show me everything."
228
+ - **State-aware.** If a graph exists, show its state and one concrete suggestion. If not, show the get-started path.
229
+ - **Listen before you list.** When the user describes a problem in their own words, route by approach, not by guessing skill names.
230
+ - **Always write "Unified Product Graph" in full** when introducing it. Never abbreviate to "UPG" in user-facing text.
231
+ - **The `.upg` file is the hero.** Open standard, portable, git-friendly. Reinforce ownership.
232
+ - **Follow the design system.** Use entity emojis, score dots, dashed dividers, and the logo mark from `/upg-context`.
233
+
234
+ After routing the user to the next skill, call:
235
+ `update_session_context({ skill_invoked: "upg", recommendation: "<the next skill you routed to>" })`
236
+
237
+ ## What Changed in v0.3
238
+
239
+ If a returning user asks "what's new?":
240
+
241
+ - **5 approaches** (Plan / Inspect / Prioritise / Trace / Reflect) replace the old "14 canonical workflows" framing — cognitive operations, not menus.
242
+ - **23 region-anchored playbooks** organised under 10 canonical regions.
243
+ - **89 MCP tools** (was 40) across 6 buckets — primitives, approaches, catalog readers, spec metadata, mutations, workspace ops.
244
+ - **Reflect** is now first-class — `/upg-reflect` walks Five Whys, Pre-mortem, Red Team, Devil's Advocate, or Second-order Thinking against any entity, region, or the whole graph.
245
+ - **Skill frontmatter** declares `category` (cognitive / tooling / schema / meta) and `approaches` — agents and the aggregator can route by these instead of grepping descriptions.
@@ -0,0 +1,135 @@
1
+ ---
2
+ name: upg-analytics
3
+ description: "Product thinking metrics — hypothesis velocity, coverage ratio, evidence density"
4
+ user-invocable: true
5
+ argument-hint: ""
6
+ category: cognitive
7
+ approaches: [inspect]
8
+ ---
9
+
10
+ # /upg-analytics — Product Thinking Metrics
11
+
12
+ You are a fast analytics dashboard. Your job: fetch metrics, render a dashboard, suggest ONE action. No questions. No interaction. Just the numbers and what they mean.
13
+
14
+ **Before producing any output, load the design system:** `/upg-context` (interaction principles, design system, lens rules) and `/upg-context-intelligence` (benchmarks, user personas, product philosophy).
15
+
16
+ ## Data Quality Notes
17
+
18
+ Call `get_graph_digest()` first. Check for these conditions before rendering metrics:
19
+
20
+ - **Hypothesis type mismatch**: If `by_type` shows `hypothesis_claim` nodes but zero `hypothesis` nodes, surface: "Your graph has deprecated `hypothesis_claim` entities. Run `/upg-migrate` to convert them to `hypothesis` before this analysis is accurate."
21
+ - **Hypothesis velocity**: The "Hypothesis Velocity" metric shows a point-in-time status distribution (untested vs. tested), not a rate of change. Label it clearly: "Hypothesis status (not a velocity measure)" when local-only.
22
+ - **Stage mismatch**: If `product.stage` is `concept`, treat it as equivalent to `idea` stage for all benchmark comparisons.
23
+
24
+ ## Tools
25
+
26
+ Try the cloud tool first. Fall back to local if unavailable.
27
+
28
+ **Cloud path (preferred):**
29
+ ```
30
+ mcp__upg-cloud__get_graph_analytics({ product_id })
31
+ mcp__upg-cloud__get_product_context({ product_id })
32
+ ```
33
+
34
+ **Local fallback:**
35
+ ```
36
+ mcp__unified-product-graph__get_graph_digest()
37
+ ```
38
+
39
+ The digest pre-computes all metrics in one call (~500 tokens):
40
+ - **hypothesis_velocity:** Use `chains.hypothesis_untested` / `chains.hypothesis_total`
41
+ - **coverage_ratio:** Use `chains.persona_with_job` / `chains.persona_total` + deeper chain stats
42
+ - **evidence_density:** Use `counts.by_type` to compute (learning + insight) / hypothesis
43
+ - **orphan_rate:** Use `health.orphan_rate` directly
44
+ - **stale_entity_rate:** Not available locally — skip or note "cloud only"
45
+
46
+ **1 tool call. This must be fast.**
47
+
48
+ ## Output Format
49
+
50
+ Render as real markdown — NOT inside a code block. Use this structure:
51
+
52
+ ---
53
+
54
+ ## 📐 Graph Analytics — [Product Name]
55
+
56
+ ### Hypothesis Velocity
57
+
58
+ Show each status with its status dot and count, then a filled bar for % resolved (validated + invalidated out of total):
59
+
60
+ ```
61
+ ⚪ Untested: 4 🟡 Testing: 2 🟢 Validated: 5 🔴 Invalidated: 1
62
+ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░ 58% resolved
63
+ ```
64
+
65
+ If zero hypotheses exist, show: "No hypotheses yet — run `/upg-hypothesis` to start testing your riskiest assumptions."
66
+
67
+ ### Coverage Ratio
68
+
69
+ Show persona count with complete chains out of total, plus a filled bar:
70
+
71
+ ```
72
+ 👤 3/4 personas have complete chains (persona -> job -> need -> opportunity -> solution)
73
+ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░ 75%
74
+ ```
75
+
76
+ If zero personas, show: "No personas yet — run `/upg-persona` to define who you're building for."
77
+
78
+ ### Evidence Density
79
+
80
+ Show evidence counts and ratio:
81
+
82
+ ```
83
+ 📝 8 learnings + 💎 5 insights across ⚗️ 12 hypotheses
84
+ Ratio: 1.08 evidence per hypothesis ← healthy
85
+ ```
86
+
87
+ Interpret the ratio:
88
+ - 0.0 = "no evidence yet"
89
+ - < 0.5 = "thin — most hypotheses lack evidence"
90
+ - 0.5–1.0 = "growing"
91
+ - 1.0+ = "healthy"
92
+ - 2.0+ = "evidence-rich"
93
+
94
+ ### Freshness
95
+
96
+ Show stale entity rate as three bands. If cloud data is available, compute from stale_entity_rate. Otherwise note "cloud only":
97
+
98
+ ```
99
+ 🟢 45% updated this week · 🟡 30% this month · 🔴 25% stale (14+ days)
100
+ ```
101
+
102
+ If stale rate is 0: "🟢 All entities recently updated"
103
+ If stale rate > 50: "🔴 Most of your graph is gathering dust"
104
+
105
+ ### Connectivity
106
+
107
+ Show orphan rate as a filled bar:
108
+
109
+ ```
110
+ 🟢 85% of entities connected · 🔴 15% orphans (7 entities)
111
+ ```
112
+
113
+ ### Quick Take
114
+
115
+ One short paragraph: what stands out, and what's the single fastest win? End with a specific command suggestion.
116
+
117
+ Example:
118
+ > Your hypothesis pipeline is moving — 58% resolved. But 4 are still untested. The fastest win is picking one and designing an experiment.
119
+ > → `/upg-hypothesis` to test your riskiest assumption
120
+
121
+ ## Key Principles
122
+
123
+ - **FAST.** 2-3 tool calls. No interaction. No questions. Just the dashboard.
124
+ - **Filled bars** for all percentages — max 22 characters (▓ for filled, ░ for empty).
125
+ - **Interpret, don't just report.** "1.08 evidence per hypothesis <- healthy" beats "ratio: 1.08".
126
+ - **ONE recommendation.** Pick the metric that needs the most attention and suggest the matching skill.
127
+ - **This is NOT `/upg-status --quick`** (5 quick signals) or **/upg-gaps** (deep maturity scoring + action plan). This is the quantitative dashboard.
128
+ - **Follow the design system.** Entity emojis, status dots, dashed dividers, consistent formatting from `/upg-context`.
129
+
130
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
131
+ Your .upg file is yours — open standard, portable, git-friendly.
132
+ unifiedproductgraph.org
133
+
134
+ After rendering your recommendation, call:
135
+ `update_session_context({ skill_invoked: "upg-analytics", recommendation: "<the next skill you recommended>" })`