@orrisai/show-me-the-money 2.3.1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
  [![Latest release](https://img.shields.io/github/v/release/iamzifei/show-me-the-money?label=release&color=green)](https://github.com/iamzifei/show-me-the-money/releases)
9
9
  [![License: CC BY-NC 4.0](https://img.shields.io/badge/license-CC%20BY--NC%204.0-orange.svg)](LICENSE)
10
10
 
11
- **Current version: `v2.3.1`** · [What's new →](#-whats-new-in-v231)
11
+ **Current version: `v2.4.0`** · [What's new →](#-whats-new-in-v240)
12
12
 
13
13
  [English](README.md) | [中文](README.zh-CN.md)
14
14
 
@@ -51,6 +51,76 @@ Works with **Claude Code**, **Codex CLI**, **Gemini CLI**, and other agents that
51
51
 
52
52
  ---
53
53
 
54
+ ## ✨ What's New in v2.4.0
55
+
56
+ **The "ship without nuking production" release.** Six things landed, all folded into existing skills — no new commands to remember, no skill-count explosion.
57
+
58
+ ### 1. Operating modes + edit perimeter + panic stop (in `/money-ops`)
59
+
60
+ Autonomy without guardrails is how solo founders break production at 2am. The ops layer now declares an **operating mode** — `open` / `staging` / `production` — and every destructive command (rm -rf, force push, DROP TABLE, kubectl delete, bulk Stripe operations) requires a confirmation in the higher modes. Add an **edit perimeter** to lock a debugging session to one subtree, and call `/money-ops stop` to halt every scheduled agent and outreach loop instantly.
61
+
62
+ ```
63
+ mode: production
64
+ → rm -rf production_users requires typing "yes-delete-production_users"
65
+ → npm publish requires explicit version confirmation
66
+ → Outreach batches > 10 recipients require explicit batch approval
67
+ ```
68
+
69
+ ### 2. Narrowest-bet pressure test (in `/money-discover`)
70
+
71
+ The 6 forcing questions surface the smallest version someone would pay for. v2.4 adds a **Phase 4.5 pressure test** that forces the wedge to be **demonstrable tomorrow** — not "in 2-3 weeks of prep". Output is a one-line falsifiable bet: "By {date}, I will put {artifact} in front of {named buyer} to test {specific price} for {one thing it does}. If no signal by {date+7}, the wedge is wrong."
72
+
73
+ This is the #1 reason solo founders end up at week 4 of "almost ready to show someone".
74
+
75
+ ### 3. Term-by-term audit + fuzzy-to-measurable (in `/money-strategy`)
76
+
77
+ Layer 1 of the premise audit now runs a loop: spot every load-bearing fuzzy word in the pitch, probe it ("how would a stranger measure this?"), and convert it to a measurable substitute. Every goal becomes `<verb> <metric> <threshold> <by date>` before strategy starts.
78
+
79
+ If the user can't convert their goals to measurable form, the strategy refuses to proceed and routes back to `/money-discover` Phase 4.5 first. No more strategizing on top of vague terms.
80
+
81
+ ### 4. Hook + title pattern library + Release-notes mode (in `/money-content`)
82
+
83
+ Stage 4.8 adds a **pattern library** — 12 hook patterns and 15 title patterns indexed by reader state (scrolling / searching / decision-making) plus platform-specific patterns for XHS and WeChat. A title must satisfy BOTH a library pattern AND 2+ mechanisms from the existing impact matrix before shipping.
84
+
85
+ Plus a new **Release-notes mode**: when `/money-product` ships a version, this mode generates three-tier release notes (one-line ship tweet, product email, full CHANGELOG entry + blog post). Release-note emails have the highest conversion rate of any content type — skipping them leaves free→paid upgrades on the table.
86
+
87
+ ### 5. Design system contract + ship lifecycle (in `/money-product`)
88
+
89
+ A new **Phase 0** writes `DESIGN.md` to the project root before any UI code — aesthetic stance, type/color/spacing tokens, motion rules, AND the rejection list (what the system explicitly does NOT do). Solves the "portfolio of 4 products that all look unrelated" problem.
90
+
91
+ A new **Phase 5.5 ship lifecycle** turns deployment into a 5-step protocol: VERSION bump (semver) → CHANGELOG entry → pre-deploy verification → deploy + tag → release-notes delivery. Skipping a step is what causes "production incidents" — every step has a refuse-if-missing gate.
92
+
93
+ ### 6. STRIDE threat model + Tech-triage mode (in `/money-quality`)
94
+
95
+ The security audit now runs BOTH OWASP Top 10 AND a STRIDE pass (spoofing / tampering / repudiation / information disclosure / DoS / elevation-of-privilege) — catches the architectural assumptions that OWASP misses. 3+ STRIDE threats at P0/P1 means NOT ready to charge real money, regardless of OWASP score.
96
+
97
+ New **Tech-triage mode** for when something is technically broken — failing test, slow query, mystery 500. A 5-step loop (restate → boundary → reproduce → hypothesize-then-test → fix + regression test + `/money-learn` row). Refuses to start guessing or grep before the symptom is restated precisely.
98
+
99
+ ### 7. Custom reviewer personas + architecture lens (in `/money-panel` + `/money-review-operator`)
100
+
101
+ `/money-panel --add "Enterprise IT buyer: needs SOC2 before signing"` inserts a domain-expert reviewer into the gauntlet. Useful when the four built-in lenses (investor / customer / operator / skeptic) don't capture the specific reviewer your plan needs to survive — enterprise procurement, privacy lawyer, open-source maintainer, regulated-industry compliance.
102
+
103
+ `/money-review-operator` gets a Q5: **Architecture & data-flow stress test** — five failure modes a solo operator can't escape from (hidden ops cost, data shape lock-in, single point of failure, cost-curve mismatch, debug accessibility). 2+ red flags here flips the verdict to NEEDS HIRE regardless of the other questions.
104
+
105
+ ### 8. Portfolio learnings — cross-project knowledge (in `/money-learn`)
106
+
107
+ Learnings used to be project-local. v2.4 adds a **portfolio layer** at `~/.smtm/portfolio/learnings.jsonl` that auto-loads into EVERY money-* skill in EVERY project. Run `/money-learn promote <L-id>` to lift a validated, replicated, domain-general pattern from one project to the portfolio. Demote if it turns out to be context-specific.
108
+
109
+ A solo operator running 6 products discovers patterns that apply to all of them ("Stripe webhook idempotency keys must be checked even when the API call is idempotent"). Those don't belong locked to one product — they belong in the operator's portfolio brain.
110
+
111
+ ### 9. Auto-update command (in `/money-upgrade`)
112
+
113
+ `/money-upgrade` is now a true auto-updater. One command:
114
+ - Checks npm for the latest version
115
+ - Shows the delta + headline changes
116
+ - Downloads + replaces installed skills
117
+ - Reads the CHANGELOG and surfaces what's new
118
+ - Prompts to restart Claude Code
119
+
120
+ No more "version compare by hand" or "did I run install or update". One command, idempotent.
121
+
122
+ ---
123
+
54
124
  ## ✨ What's New in v2.3.1
55
125
 
56
126
  **Polish patch following the v2.3.0 atom launch.** Five things landed:
@@ -300,35 +370,35 @@ cd ~/.claude/skills/show-me-the-money && node install.js
300
370
  | **Save** | `/money-save` | Checkpoint the current business state to `~/.smtm/sessions/{project}/` |
301
371
  | **Restore** | `/money-restore` | Resume from a prior saved state — pick up exactly where the last session left off |
302
372
  | **Report** | `/money-report` | Merge all saved states into a deliverable markdown report |
303
- | **Learn** | `/money-learn` | Manage atomic project learnings (auto-loaded into every other skill) |
373
+ | **Learn** | `/money-learn` | Manage atomic project learnings + portfolio learnings shared across every project |
304
374
  | **Skillify** | `/money-skillify` | Codify a successful workflow into a project-local reusable skill |
305
- | **Upgrade** | `/money-upgrade` | Update to the latest version |
375
+ | **Upgrade** | `/money-upgrade` | Auto-update: checks npm, downloads, replaces, reads CHANGELOG, prompts to restart |
306
376
 
307
377
  ### Discover · Strategy · Diagnose · Review
308
378
 
309
379
  | Skill | Command | What It Does |
310
380
  |-------|---------|-------------|
311
- | **Discover** | `/money-discover` | Find and validate profitable business ideas with competitive intelligence |
312
- | **Strategy** | `/money-strategy` | Premise deconstruction + market research + business model stress test |
381
+ | **Discover** | `/money-discover` | Find and validate profitable business ideas; ends with a tomorrow-shippable narrowest-bet statement |
382
+ | **Strategy** | `/money-strategy` | Term-by-term clarity audit + fuzzy-to-measurable goals + market research + business model stress test |
313
383
  | **Diagnose** | `/money-diagnose` | Deep diagnosis when business is stuck — root cause, not symptoms (with Iron Law phase gate) |
314
- | **Panel** | `/money-panel` | Run all four reviewers, find agreement, surface only taste decisions |
384
+ | **Panel** | `/money-panel` | Run all four reviewers (+ optional `--add` custom personas), find agreement, surface only taste decisions |
315
385
  | **Investor Review** | `/money-review-investor` | VC-mode review with funding viability verdict |
316
386
  | **Customer Review** | `/money-review-customer` | Named-ICP customer review with willingness-to-pay verdict |
317
- | **Operator Review** | `/money-review-operator` | Solo-founder execution feasibility review |
387
+ | **Operator Review** | `/money-review-operator` | Solo-founder execution feasibility + architecture & data-flow stress test |
318
388
  | **Skeptic Review** | `/money-review-skeptic` | Devil's advocate red-team review |
319
389
 
320
390
  ### Build · Quality
321
391
 
322
392
  | Skill | Command | What It Does |
323
393
  |-------|---------|-------------|
324
- | **Product** | `/money-product` | Build, deploy, QA test, and monitor MVP |
325
- | **Quality** | `/money-quality` | Code review, security audit, performance check, pre-launch gates |
394
+ | **Product** | `/money-product` | DESIGN.md design contract, build, ship lifecycle (VERSION + CHANGELOG + release notes), deploy, QA, canary |
395
+ | **Quality** | `/money-quality` | Code review, OWASP + STRIDE security, performance, pre-launch gates, tech-triage debugging mode |
326
396
 
327
397
  ### Grow
328
398
 
329
399
  | Skill | Command | What It Does |
330
400
  |-------|---------|-------------|
331
- | **Content** | `/money-content` | Content pipeline with authenticity audit and headline impact matrix |
401
+ | **Content** | `/money-content` | Content pipeline with authenticity audit, headline impact matrix, hook + title pattern library, release-notes mode |
332
402
  | **Outreach** | `/money-outreach` | Cold email sequences and partnership outreach |
333
403
  | **Social** | `/money-social` | Social media management with hook-writing frameworks |
334
404
  | **SEO** | `/money-seo` | SEO + GEO optimization for search engines and AI |
@@ -338,7 +408,7 @@ cd ~/.claude/skills/show-me-the-money && node install.js
338
408
 
339
409
  | Skill | Command | What It Does |
340
410
  |-------|---------|-------------|
341
- | **Ops** | `/money-ops` | 24/7 autonomous operations with health scoring and safety guardrails |
411
+ | **Ops** | `/money-ops` | 24/7 autonomous operations, health scoring, operating modes (open/staging/production), edit perimeter, panic stop |
342
412
  | **Finance** | `/money-finance` | Revenue tracking and financial reports |
343
413
  | **Retro** | `/money-retro` | Weekly retrospective: decided / shipped / stalled / unused-skills / focus |
344
414
 
package/README.zh-CN.md CHANGED
@@ -8,7 +8,7 @@
8
8
  [![Latest release](https://img.shields.io/github/v/release/iamzifei/show-me-the-money?label=release&color=green)](https://github.com/iamzifei/show-me-the-money/releases)
9
9
  [![License: CC BY-NC 4.0](https://img.shields.io/badge/license-CC%20BY--NC%204.0-orange.svg)](LICENSE)
10
10
 
11
- **当前版本:`v2.3.1`** · [更新内容 →](#-v231-更新内容)
11
+ **当前版本:`v2.4.0`** · [更新内容 →](#-v240-更新内容)
12
12
 
13
13
  [English](README.md) | [中文](README.zh-CN.md)
14
14
 
@@ -51,6 +51,76 @@ Show Me The Money 是一套开源的 [Claude Code](https://claude.ai/code) 技
51
51
 
52
52
  ---
53
53
 
54
+ ## ✨ v2.4.0 更新内容
55
+
56
+ **"自动化但不会把生产环境干爆"的一版。** 落地 9 项改进,**全部融进现有技能** —— 没有新命令要记、没有技能数量膨胀。
57
+
58
+ ### 1. 运行模式 + 编辑边界 + 紧急停止(`/money-ops`)
59
+
60
+ 自动化没有护栏,就是凌晨两点把生产环境炸了的快速通道。Ops 层现在声明一个**运行模式** —— `open` / `staging` / `production` —— 在更高级别的模式下,每一个破坏性命令(rm -rf、强制推送、DROP TABLE、kubectl delete、Stripe 批量操作)都需要明确确认。可以设置**编辑边界**把调试会话锁在一个子目录里;调 `/money-ops stop` 立刻停掉所有定时智能体和外展循环。
61
+
62
+ ```
63
+ mode: production
64
+ → rm -rf production_users 需要输入 "yes-delete-production_users"
65
+ → npm publish 需要明确确认版本号
66
+ → 超过 10 个收件人的外展批次需要明确批量审批
67
+ ```
68
+
69
+ ### 2. 最窄一注压力测试(`/money-discover`)
70
+
71
+ 6 个强制问题已经找出"最小可付费的版本"。v2.4 加了一个 **Phase 4.5 压力测试**,逼迫这个最窄版本必须**明天就能展示** —— 不是"再准备 2-3 周"。输出是一句可证伪的赌注:"到 {日期} 前,我会把 {一个工件} 摆到 {具名买家} 面前,测试他们是否愿意为 {一件事} 付 {具体价格}。如果到 {日期+7天} 还没信号,就是赌错了。"
72
+
73
+ 这是独立创业者卡在"差不多准备好可以给人看了"第 4 周最大的原因。
74
+
75
+ ### 3. 逐词审计 + 模糊转可测量(`/money-strategy`)
76
+
77
+ 前提审计 Layer 1 现在跑一个循环:找出 pitch 里每一个承重的模糊词,追问("陌生人要怎么测量这句话?"),并把它转换成可测量的替代。每一个目标都要变成 `<动词> <指标> <阈值> <截止时间>` 才能进入正式策略。
78
+
79
+ 如果用户没法把目标转成可测量形式,策略环节会拒绝继续,直接回路到 `/money-discover` 的 Phase 4.5。不能在含糊措辞上面继续做策略。
80
+
81
+ ### 4. Hook + 标题模式库 + 发布说明模式(`/money-content`)
82
+
83
+ Stage 4.8 新增了一个**模式库** —— 12 种 hook 模式 + 15 种标题模式,按读者状态(滑动中 / 搜索中 / 决策中)索引,外加针对 XHS 和微信的平台专属模式。一个标题必须**同时**命中库里的某个模式 **且** 触发现有冲击力矩阵里 2+ 个心理机制,才能放出。
84
+
85
+ 外加一个新的**发布说明模式**:当 `/money-product` 出版本时,自动生成三层发布说明(一行航班 tweet / 产品邮件 / 完整 CHANGELOG + 博客)。发布说明邮件是所有内容类型中转化率最高的 —— 不写就是白白漏掉免费→付费升级。
86
+
87
+ ### 5. 设计系统契约 + 出版生命周期(`/money-product`)
88
+
89
+ 新的 **Phase 0** 在写任何 UI 代码之前写 `DESIGN.md` —— 美学站位、字体/颜色/间距 token、动效规则,以及**拒绝清单**(这套系统明确**不做**什么)。解决"组合里 4 个产品看起来毫无亲缘关系"的问题。
90
+
91
+ 新的 **Phase 5.5 出版生命周期**把部署变成 5 步协议:版本号 bump(semver)→ CHANGELOG 条目 → 部署前验证 → 部署 + tag → 发布说明分发。跳过一步就是"生产事故"的成因 —— 每一步都有"缺失则拒绝"的门禁。
92
+
93
+ ### 6. STRIDE 威胁模型 + 技术分诊模式(`/money-quality`)
94
+
95
+ 安全审计现在跑 OWASP Top 10 **和** STRIDE(仿冒 / 篡改 / 抵赖 / 信息泄露 / 拒绝服务 / 提权)两遍 —— 抓住 OWASP 漏掉的架构性假设。3+ 个 STRIDE 威胁停在 P0/P1,意味着**不能**开始向真实用户收钱,跟 OWASP 分数无关。
96
+
97
+ 新的**技术分诊模式**面向技术层面坏了的场景 —— 测试挂、查询慢、神秘的 500。5 步循环(重述症状 → 找边界 → 复现 → 先假设再验证 → 修复 + 回归测试 + `/money-learn` 留痕)。在精确重述症状之前拒绝瞎猜、拒绝 grep 源码。
98
+
99
+ ### 7. 自定义评审角色 + 架构审视(`/money-panel` + `/money-review-operator`)
100
+
101
+ `/money-panel --add "Enterprise IT buyer: 签合同前必须 SOC2"` 把一个领域专家评审塞进 gauntlet。当内置 4 个角度(投资人 / 客户 / 操盘手 / 怀疑论者)不足以覆盖你的方案需要的特定视角时用 —— 企业采购、隐私律师、开源维护者、受监管行业合规。
102
+
103
+ `/money-review-operator` 加了 Q5:**架构与数据流压力测试** —— 独立操盘手逃不掉的 5 种失败模式(隐藏运营成本、数据形状锁定、单点故障、成本曲线错配、调试可达性)。2+ 项红灯就把判决拉到 NEEDS HIRE,无视其他问题的得分。
104
+
105
+ ### 8. 组合学习 —— 跨项目知识沉淀(`/money-learn`)
106
+
107
+ Learnings 之前只能项目内本地。v2.4 加了一个**组合层** `~/.smtm/portfolio/learnings.jsonl`,自动加载到**每个项目**的**每个 money-* 技能**里。跑 `/money-learn promote <L-id>` 把一条已验证、已复现、领域通用的项目级 pattern 提到组合层。如果发现它只在原来的项目里成立,可以降级。
108
+
109
+ 跑 6 个产品的独立操盘手会发现一些放之四海皆准的 pattern("Stripe webhook idempotency key 必须显式检查,即使 API 本身幂等")。这些不该锁在单一产品里 —— 它们属于操盘手的"组合大脑"。
110
+
111
+ ### 9. 自动更新命令(`/money-upgrade`)
112
+
113
+ `/money-upgrade` 现在是真正的自动更新器。一条命令:
114
+ - 查询 npm 上的最新版本
115
+ - 显示版本差 + 重点变更
116
+ - 下载 + 替换已安装的技能
117
+ - 读 CHANGELOG 摘要更新内容
118
+ - 提示重启 Claude Code
119
+
120
+ 不再"手动比对版本号"或"我应该跑 install 还是 update"。一条命令,幂等。
121
+
122
+ ---
123
+
54
124
  ## ✨ v2.3.1 更新内容
55
125
 
56
126
  **v2.3.0 原子发布之后的打磨补丁。** 落地 5 件事:
@@ -301,35 +371,35 @@ cd ~/.claude/skills/show-me-the-money && node install.js
301
371
  | **保存** | `/money-save` | 把当前业务状态检查点写入 `~/.smtm/sessions/{project}/` |
302
372
  | **恢复** | `/money-restore` | 从先前的检查点续接,无需重新解释 |
303
373
  | **报告** | `/money-report` | 把所有保存的状态合并成可交付的 markdown 报告 |
304
- | **学习** | `/money-learn` | 管理项目级原子学习(自动注入每个其他技能) |
374
+ | **学习** | `/money-learn` | 管理项目级原子学习 + 跨项目共享的组合学习层 |
305
375
  | **固化技能** | `/money-skillify` | 把一段成功的工作流固化为项目级可复用技能 |
306
- | **升级** | `/money-upgrade` | 更新到最新版本 |
376
+ | **升级** | `/money-upgrade` | 自动更新:查 npm、下载、替换、读 CHANGELOG、提示重启 |
307
377
 
308
378
  ### 发现 · 策略 · 诊断 · 评审
309
379
 
310
380
  | 技能 | 命令 | 功能 |
311
381
  |------|------|------|
312
- | **发现** | `/money-discover` | 发现并验证盈利商机 + 竞品情报 |
313
- | **策略** | `/money-strategy` | 前提解构 + 市场研究 + 商业模式压力测试 |
382
+ | **发现** | `/money-discover` | 发现并验证盈利商机 + 竞品情报;末尾给出明天就能展示的"最窄一注"赌注 |
383
+ | **策略** | `/money-strategy` | 逐词清晰度审计 + 模糊转可测量目标 + 市场研究 + 商业模式压力测试 |
314
384
  | **诊断** | `/money-diagnose` | 业务卡住时找根因,不是症状(带 Iron Law 阶段门) |
315
- | **评审委员会** | `/money-panel` | 4 个评审一起跑,只把品味分歧抛给你 |
385
+ | **评审委员会** | `/money-panel` | 4 个评审一起跑(+ 可选 `--add` 自定义角色),只把品味分歧抛给你 |
316
386
  | **投资人评审** | `/money-review-investor` | VC 视角的融资可行性评判 |
317
387
  | **客户评审** | `/money-review-customer` | 指定 ICP 视角的付费意愿评判 |
318
- | **操盘手评审** | `/money-review-operator` | 独立创始人执行可行性评判 |
388
+ | **操盘手评审** | `/money-review-operator` | 独立创始人执行可行性 + 架构与数据流压力测试 |
319
389
  | **质疑者评审** | `/money-review-skeptic` | 红队式质疑评审 |
320
390
 
321
391
  ### 构建 · 质量
322
392
 
323
393
  | 技能 | 命令 | 功能 |
324
394
  |------|------|------|
325
- | **产品** | `/money-product` | 构建、部署、QA、监控 MVP |
326
- | **质量** | `/money-quality` | 代码审查、安全审计、性能检查、上线前门禁 |
395
+ | **产品** | `/money-product` | DESIGN.md 设计契约、构建、出版生命周期(VERSION + CHANGELOG + 发布说明)、部署、QA、金丝雀 |
396
+ | **质量** | `/money-quality` | 代码审查、OWASP + STRIDE 安全、性能、上线前门禁、技术分诊调试模式 |
327
397
 
328
398
  ### 增长
329
399
 
330
400
  | 技能 | 命令 | 功能 |
331
401
  |------|------|------|
332
- | **内容** | `/money-content` | 内容管线 + 真实性审计 + 标题影响力矩阵 |
402
+ | **内容** | `/money-content` | 内容管线 + 真实性审计 + 标题影响力矩阵 + Hook & 标题模式库 + 发布说明模式 |
333
403
  | **外展** | `/money-outreach` | 冷邮件序列、合作伙伴拓展 |
334
404
  | **社交** | `/money-social` | 社交媒体管理 + Hook 写作框架 |
335
405
  | **SEO** | `/money-seo` | SEO + GEO 优化(含 AI 搜索) |
@@ -339,7 +409,7 @@ cd ~/.claude/skills/show-me-the-money && node install.js
339
409
 
340
410
  | 技能 | 命令 | 功能 |
341
411
  |------|------|------|
342
- | **运营** | `/money-ops` | 全天候运营 + 健康评分 + 安全护栏 |
412
+ | **运营** | `/money-ops` | 全天候运营 + 健康评分 + 运行模式(open/staging/production)+ 编辑边界 + 紧急停止 |
343
413
  | **财务** | `/money-finance` | 收入追踪、财务报告 |
344
414
  | **复盘** | `/money-retro` | 周复盘:决定 / 出货 / 卡住 / 未用技能 / 焦点 |
345
415
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.1
1
+ 2.4.0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orrisai/show-me-the-money",
3
- "version": "2.3.1",
3
+ "version": "2.4.0",
4
4
  "description": "AI agent skills that build and run your business autonomously — from idea to revenue, 24/7. Works with Claude Code, Codex CLI, and Gemini CLI.",
5
5
  "keywords": [
6
6
  "ai-agent",
@@ -30,6 +30,7 @@ Ranked by revenue impact:
30
30
  5. **Documentation** — Reduce churn, improve activation
31
31
  6. **Case studies** — Social proof for sales
32
32
  7. **Video scripts** — YouTube/TikTok/short-form content
33
+ 8. **Release notes** — Convert existing users on every ship (see "Release-notes mode" below)
33
34
 
34
35
  ## Pipeline: Research → Write → Diagnose → Optimize → Publish
35
36
 
@@ -209,11 +210,130 @@ Before finalizing any title/headline, evaluate it against these psychological me
209
210
  - [ ] Uses concrete nouns and verbs, not abstract concepts
210
211
  - [ ] Creates a question in the reader's mind that can only be answered by reading
211
212
 
213
+ ### Stage 4.8: Hook & Title Pattern Library
214
+
215
+ After the hook and headline checks pass, run the candidate against the curated pattern library. The mechanisms matrix tells you WHY a headline works; the pattern library gives you proven SHAPES that have already worked in the wild. Use both — patterns without mechanisms are templates; mechanisms without patterns are theory.
216
+
217
+ #### Hook patterns (short-form video and social opening)
218
+
219
+ 12 patterns, each indexed by the situation it fits. Match the candidate hook to the closest pattern. If no pattern fits, the hook may need more work — or it may be a new shape worth saving (run `/money-learn add` to log it).
220
+
221
+ | Pattern | Skeleton | Best for | Example |
222
+ |---|---|---|---|
223
+ | **Result-first reversal** | "I {achieved X}. The way I got there was {opposite of expected}." | Big result + counterintuitive path | "I hit $10K MRR in 6 weeks. I never wrote a single blog post." |
224
+ | **Single-number anchor** | "{Specific number}. {What the number means}." | Data-heavy stories | "$4,327. That's what one customer paid me last week — and I never spoke to them." |
225
+ | **The thing nobody admits** | "Nobody talks about this, but {industry truth}." | Insider takes | "Nobody talks about this, but the top SEO tools all share the same database." |
226
+ | **Yesterday's failure** | "Yesterday I {specific failure}. Here's what I'm changing." | Personal authenticity | "Yesterday I lost a $5K deal because I demoed before qualifying. Here's the new opener." |
227
+ | **N years, one lesson** | "I spent {N} years doing X. Here's the one thing I'd tell my younger self." | Authority + lesson | "I spent 8 years writing code in big tech. The one thing I'd tell my younger self: stop optimizing the wrong loop." |
228
+ | **Setup → flip** | "Everyone says {X}. But {X} is actually {opposite}." | Contrarian takes | "Everyone says raise prices. But for our segment, raising prices killed conversions." |
229
+ | **Watch what happens** | "{Specific action}. {What happened next}." | Story-driven | "I changed one word in our checkout copy. Conversion went from 3.1% to 4.8%." |
230
+ | **The question they're afraid to ask** | "Should you {decision}? Most people are afraid to ask. Here's the honest answer." | Decision content | "Should you quit your day job to ship your side project? Here's the honest math." |
231
+ | **Two roads** | "Two roads. {Road A leads to result Y}. {Road B leads to result Z}. Pick one." | Decision content | "Two roads. Stay in cold outreach and grind. Or wait 9 months for SEO. Pick one." |
232
+ | **The price of {X}** | "The price of {decision/inaction} is {specific cost}." | Loss-aversion | "The price of waiting one more quarter to charge for your beta is roughly $14,000 in lost revenue." |
233
+ | **Reverse credentials** | "I'm not a {expected authority}. But {what I know that they don't}." | Outsider authority | "I'm not a VC. But I've sold three startups for $20M+ each by ignoring everything VCs told me." |
234
+ | **The receipt** | "{Bold claim}. Receipts: {specific evidence}." | Proof-driven | "Cold email still works in 2026. Receipts: 47 booked meetings last quarter, $186K closed." |
235
+
236
+ #### Title patterns (blog posts, X threads, XHS posts)
237
+
238
+ 15 patterns organized by what the reader is doing the moment they encounter the title:
239
+
240
+ **For scrollers (need to be stopped):**
241
+ | Pattern | Skeleton | Example |
242
+ |---|---|---|
243
+ | Number + specific noun | "{Specific number} {specific things} that {specific outcome}" | "7 onboarding emails that doubled our trial-to-paid conversion" |
244
+ | Time-bound result | "From {start state} to {end state} in {timeframe}" | "From $0 to $10K MRR in 90 days (with screenshots)" |
245
+ | Anti-advice | "Why I stopped {common practice}" | "Why I stopped using TypeScript on solo projects" |
246
+ | The cost of habit | "What {common thing} is really costing you" | "What your free tier is really costing you" |
247
+
248
+ **For searchers (already typed a query):**
249
+ | Pattern | Skeleton | Example |
250
+ |---|---|---|
251
+ | Definitional + use | "{Topic}, explained for {specific audience}" | "RAG, explained for backend engineers who already know caching" |
252
+ | Comparison | "{A} vs {B}: which one for {specific use case}" | "Postgres vs DynamoDB: which one for a 2-person SaaS" |
253
+ | Decision framework | "How to choose {thing} (the {N}-question test)" | "How to choose a payment processor (the 5-question test)" |
254
+ | Step-by-step | "{Verb} {outcome} in {N} steps" | "Set up Stripe webhooks for subscriptions in 4 steps" |
255
+
256
+ **For decision-makers (need a confident take):**
257
+ | Pattern | Skeleton | Example |
258
+ |---|---|---|
259
+ | Strong opinion | "{Industry truth} is wrong. Here's why." | "The 'launch on Product Hunt' playbook is wrong. Here's what I'd do instead." |
260
+ | Receipts post | "I {tried/did X}. Here's what happened (with numbers)." | "I switched from Vercel to Cloudflare. Here's what happened (with numbers)." |
261
+ | Insider take | "What {role} actually look at when {decision}" | "What technical founders actually look at when picking a CRM" |
262
+ | Pattern naming | "The {memorable name} trap" | "The 'one more feature' trap (and how to spot it in week 2)" |
263
+
264
+ **For platform-specific situations:**
265
+ | Pattern | Skeleton | Best on |
266
+ |---|---|---|
267
+ | 我 + 数字 + 反差 | "我 {做了什么} 之后,{反直觉结果}" | XHS (中文) |
268
+ | 别再 + 行为 | "别再 {主流做法} 了" | XHS, WeChat |
269
+ | 一句话点破 | "{一个反直觉判断}" | X thread opener, XHS |
270
+
271
+ #### Pattern + Mechanism = Final Title
272
+
273
+ A strong final title satisfies BOTH:
274
+ - One pattern from the library (proven shape)
275
+ - Two+ mechanisms from the impact matrix at Stage 4.7 (psychological pull)
276
+
277
+ Output for every candidate title:
278
+
279
+ | Candidate | Pattern | Mechanisms | Status |
280
+ |---|---|---|---|
281
+ | "Why I stopped using TypeScript on solo projects" | Anti-advice | Cognitive dissonance, Social identity | ✅ Ship |
282
+ | "5 things to consider when choosing TypeScript" | (no clean pattern match) | Information gap (weak) | ❌ Rewrite |
283
+ | "TypeScript on solo projects: a 6-month receipt" | Receipts post | Specificity, Authority contrast | ✅ Ship |
284
+
212
285
  ### Stage 5: Publishing
213
286
  - Format content for the target platform
214
287
  - Schedule posts using the content calendar
215
288
  - Set up tracking (UTM parameters, conversion goals)
216
289
 
290
+ ## Release-Notes Mode
291
+
292
+ When a new product version ships, release notes are content with the highest conversion rate in the entire pipeline — every existing user reads them, and well-written ones move ≥1% of free users to paid on every ship. Run this mode when called via `/money-content release-notes` or when `/money-product` ships a version.
293
+
294
+ ### Inputs (auto-fetched)
295
+
296
+ - **VERSION** — current and previous version from the repo
297
+ - **CHANGELOG.md** — raw commit/PR titles between the two versions
298
+ - **The deploy log** — from `/money-product` (what shipped, what got fixed)
299
+ - **Recent learnings** — `~/.smtm/projects/{slug}/learnings.jsonl`, filtered to `conversion` and `retention`
300
+
301
+ ### The three-tier output
302
+
303
+ Generate three release-note variants from the same input, because different distribution channels need different lengths.
304
+
305
+ #### Tier 1 — The one-line ship tweet (X, in-app banner)
306
+ - ≤180 chars including emoji
307
+ - Lead with the one user benefit (not the feature)
308
+ - Include the version: "v2.4.0"
309
+
310
+ > Example: "v2.4.0 → Stripe webhooks now auto-retry on 5xx. No more silently-lost payments at 2am. 🛡"
311
+
312
+ #### Tier 2 — The product email (existing customers)
313
+ - Subject line: written using a pattern from the library (typically "Time-bound result" or "Anti-advice")
314
+ - 80-150 words
315
+ - Opening sentence: the user benefit, in user language
316
+ - Middle: 2-3 bullets of what changed (mapped to user pain, not feature)
317
+ - Closing: ONE call-to-action — upgrade path, docs link, or a question that prompts reply
318
+
319
+ #### Tier 3 — The full notes (CHANGELOG.md entry + blog post)
320
+ - 300-500 words
321
+ - Sections: "What's new" (benefit-first), "What we fixed" (one line per fix), "What we learned" (the story of why this ship matters)
322
+ - For SaaS: ALWAYS include the upgrade prompt for free users in the "What's new" section, framed as access not pressure
323
+
324
+ ### The "should we name this version?" check
325
+
326
+ Major versions deserve names (gives the marketing surface area). Minor patches don't. Use this filter:
327
+
328
+ | If the ship includes... | Then... |
329
+ |---|---|
330
+ | A new core feature (not just an improvement) | Name it. The name becomes the marketing handle for 2-4 weeks. |
331
+ | Breaking changes to API or UI | Name it AND publish a migration note. |
332
+ | 3+ small but related fixes that improve a single user journey | Optional name. Worth a short post regardless. |
333
+ | Pure infra / refactor / dependency bump | Don't name. Single line in CHANGELOG. Don't email. |
334
+
335
+ Names should be one or two words, lowercase if technical (`fastpath`), titlecase if product-facing (`Quiet Mode`). Avoid trendy adjectives — they age fast.
336
+
217
337
  ## Content-to-Format Matching
218
338
 
219
339
  Match content type to the optimal format based on topic:
@@ -125,6 +125,27 @@ This reveals UX assumptions and real-world friction.
125
125
 
126
126
  Avoid ideas that ride temporary hype. Look for compounding value — network effects, data moats, switching costs.
127
127
 
128
+ ## Phase 4.5: Narrowest-Bet Pressure Test
129
+
130
+ Q4 surfaced the smallest version someone would pay for. Before moving to strategy, prove that version is **demonstrable tomorrow**, not "in 2-3 weeks of prep". Most stuck founders skip this and end up at week 4 of "almost ready to show someone".
131
+
132
+ Force the founder to answer all four below. If any answer slides past tomorrow, the wedge is still too wide — narrow until it fits.
133
+
134
+ | Pressure point | Forcing question | Pass if |
135
+ |---|---|---|
136
+ | **Demo-able tomorrow** | What's the smallest artifact you could put in front of a real prospect within 24 hours? | A wireframe + Stripe payment link, a 60-second Loom of a no-code prototype, or a manual-fulfillment offer page |
137
+ | **One thing it does** | If you had to remove every feature except one, which one stays? | A single sentence answer. If the answer has "and" in it, it's two features |
138
+ | **One named buyer** | Which specific human — by name, role, or company type — would you DM tonight to test this? | First name + how you'd reach them within 24h |
139
+ | **One-week kill-switch** | If you can't get a single paying signal in 7 days, what does that prove? | A specific falsifiable read, not "I'll know it when I see it" |
140
+
141
+ If all four pass: the wedge is demonstrable. Move on. If any one fails: keep cutting — the wedge is still hiding behind preparation work.
142
+
143
+ Output a one-line **narrowest-bet statement** in the format:
144
+
145
+ > "By **{tomorrow's date}**, I will put **{one demo artifact}** in front of **{one named buyer}** to test whether they'll pay **{specific price}** for **{the one thing it does}**. If no signal by **{date + 7 days}**, the wedge is wrong."
146
+
147
+ This sentence is the strategy team's anchor for everything that follows. Every later decision either supports or contradicts this bet.
148
+
128
149
  ## Phase 5: Deep Dive & Competitive Intelligence
129
150
 
130
151
  After validation, run a rigorous competitive analysis. The goal is NOT to "understand the market" — it's to find ONE benchmark worth studying in detail and map the exact path to replicate their success.
@@ -43,6 +43,10 @@ These are atomic patterns. Each gets one row in `learnings.jsonl`. They're auto-
43
43
  | `/money-learn list <project>` | List learnings for another project |
44
44
  | `/money-learn prune` | Interactive: review old/contradicted learnings, mark as superseded or remove |
45
45
  | `/money-learn export` | Output all learnings as a markdown table |
46
+ | `/money-learn promote <L-id>` | Promote a project-local learning to the portfolio layer (see below) |
47
+ | `/money-learn portfolio` | Show portfolio-wide learnings shared across every project |
48
+ | `/money-learn portfolio search <query>` | Search portfolio-wide learnings |
49
+ | `/money-learn portfolio demote <L-id>` | Move a portfolio learning back to a single project (if it turned out to be context-specific) |
46
50
 
47
51
  **Natural-language equivalents**:
48
52
  - "Remember this", "Log this learning", "This is a pattern worth keeping"
@@ -125,6 +129,61 @@ This is how the library stays signal-dense.
125
129
 
126
130
  ---
127
131
 
132
+ ## Portfolio learnings (cross-project sharing)
133
+
134
+ A solo operator running multiple products discovers patterns that apply across all of them — not just to one. Examples:
135
+
136
+ - "$39 converts better than $29" probably only applies to one product's ICP. **Project-local.**
137
+ - "Cold email subject lines that name a specific revenue number outperform benefit-based subjects 4:1" applies to every cold-outreach campaign. **Portfolio-wide.**
138
+ - "Stripe webhook idempotency keys MUST be checked even when the underlying API call is idempotent" applies to every Stripe integration. **Portfolio-wide.**
139
+
140
+ The portfolio layer captures the second kind. Stored at `~/.smtm/portfolio/learnings.jsonl` (the same schema as project-local), it auto-loads into EVERY money-* skill in EVERY project, before the project-local learnings are loaded.
141
+
142
+ ### Promotion criteria
143
+
144
+ A project-local learning should be promoted to the portfolio when ALL of:
145
+
146
+ 1. **Validated** confidence — emerging or hypothesis don't qualify
147
+ 2. **Replicated** — observed in at least 2 different projects (or the founder believes it would apply to any future project of the same shape)
148
+ 3. **Domain-general** — describes a tactic, channel, tool behavior, or operator pattern; NOT a specific ICP, price point, or product-specific finding
149
+
150
+ Run `/money-learn promote <L-id>` to move a project learning to the portfolio. The skill confirms by re-reading the learning aloud, asks if it really generalizes, and writes to the portfolio file. The original project learning stays in place with a `promoted_to_portfolio: true` flag — so a future audit can trace where it originated.
151
+
152
+ ### Load order
153
+
154
+ When a money-* skill starts up, learnings are merged in this order (later sources override earlier ones for the same pattern):
155
+
156
+ 1. Atom corpus (read-only, ships with the package)
157
+ 2. Portfolio learnings (`~/.smtm/portfolio/learnings.jsonl`)
158
+ 3. Project learnings (`~/.smtm/projects/{slug}/learnings.jsonl`)
159
+
160
+ A project-specific finding always trumps a portfolio finding for that project — but the portfolio pattern is loaded for context. The agent surfaces both, marking the source:
161
+
162
+ > 📚 Loaded 6 relevant patterns (4 portfolio, 2 project-local). Notably:
163
+ > - L-port-3a8f (portfolio, validated, channel): "Subject lines with specific revenue numbers outperform benefit-based 4:1 across cold-email campaigns"
164
+ > - L-a7k2 (project, validated, pricing): "$39 converts 30% better than $29 in our ICP"
165
+
166
+ ### Demotion
167
+
168
+ If a learning turns out to be context-specific after all (e.g., the portfolio learning fails to replicate in a new project), demote it:
169
+
170
+ ```
171
+ /money-learn portfolio demote L-port-3a8f --back-to <project-slug>
172
+ ```
173
+
174
+ This moves the row back to a project-local file and removes it from portfolio auto-loading. The provenance is preserved — the row keeps a `was_portfolio: true` flag.
175
+
176
+ ### When NOT to promote
177
+
178
+ Resist promoting learnings that feel general but aren't:
179
+
180
+ - Pricing observations: almost always ICP-specific
181
+ - "Channel X works" — works for what offer? Resist generalization
182
+ - Tool preferences: founder's taste, not portfolio truth
183
+ - One-off wins: a single replication does not equal portfolio-grade
184
+
185
+ Rule of thumb: if you're about to start a new product, would the learning legitimately apply on day 1? If yes → promote. If you'd want to re-validate first → leave project-local.
186
+
128
187
  ## Auto-loading into other skills
129
188
 
130
189
  Every other `money-*` skill that does substantive work should load recent learnings before generating output. The standard pattern (added to those skills' preambles):
@@ -210,16 +210,75 @@ When a critical alert fires:
210
210
  4. **Notify** — Alert the user with a summary including: what broke, why, what was done, what to monitor
211
211
  5. **Review** — Root cause analysis and prevention. Document in a post-mortem: timeline, impact, root cause, fix, prevention
212
212
 
213
+ ## Operating Mode Switches
214
+
215
+ Autonomy without guardrails is how solo founders nuke production at 2am. Before doing destructive work, declare the **operating mode** the session is running in. Every skill that touches money, customer data, or live systems reads this setting and adjusts behavior.
216
+
217
+ ### The three modes
218
+
219
+ | Mode | When to use | What changes |
220
+ |---|---|---|
221
+ | **`open`** | Local dev, prototypes, throwaway repos | No prompts. Anything goes. Default for greenfield work. |
222
+ | **`staging`** | Pre-production work, customer-zero environments, anything where a screwup costs ≤1 hour to recover | Destructive commands require one confirmation. Edit perimeter optional. |
223
+ | **`production`** | Live customer-facing systems, anything touching payments, real customer email blasts | Destructive commands require typed confirmation. Edit perimeter strictly enforced. Multi-customer outreach capped at 10 recipients without explicit batch approval. |
224
+
225
+ Set the mode at the top of the session: `mode: production` in the user's first message, in a CLAUDE.md, or via `/money-ops set-mode production`. The mode persists for the conversation.
226
+
227
+ ### Destructive command gate
228
+
229
+ In `staging` or `production` mode, the following commands MUST surface a one-line "about to run X — confirm?" before execution:
230
+
231
+ - `rm -rf` of anything outside `/tmp` or `node_modules`
232
+ - `git push --force`, `git reset --hard`, `git checkout -- .`, `git branch -D`
233
+ - `DROP`, `TRUNCATE`, `DELETE` SQL without a narrow `WHERE`
234
+ - `kubectl delete`, `terraform destroy`, `wrangler delete`
235
+ - `vercel rm`, `supabase db reset`, `stripe products archive` (bulk)
236
+ - Cron / `/schedule` deletions in bulk
237
+ - Any `npm publish`, `gh release create`, or `git tag` that targets a published version
238
+
239
+ The confirmation prompt restates the exact target and the blast radius. "About to delete the `prod_subscribers` table (47,318 rows). Confirm with 'yes-delete-prod_subscribers' to proceed."
240
+
241
+ In `production` mode the confirmation MUST be the exact target string typed back — not a generic "yes". This is the single biggest reduction in fat-finger incidents per session.
242
+
243
+ ### Edit perimeter
244
+
245
+ For complex debugging sessions where a side-fix in an unrelated file would create noise, the user may set an **edit perimeter** — a directory the session is allowed to modify. Edits outside the perimeter are refused with a one-line "outside perimeter: `<path>`. Set a wider perimeter or remove the constraint."
246
+
247
+ | Command | Effect |
248
+ |---|---|
249
+ | `/money-ops perimeter <path>` | Lock edits to that subtree |
250
+ | `/money-ops perimeter` (no arg) | Show current perimeter |
251
+ | `/money-ops perimeter clear` | Remove the perimeter |
252
+
253
+ The perimeter is session-scoped, not persistent — a new conversation starts with no perimeter.
254
+
255
+ ### Panic stop
256
+
257
+ If something is going wrong and the user wants every autonomous behavior to halt immediately, the panic command stops all scheduled agents, all `/loop` runs, and all in-flight outreach batches owned by this project:
258
+
259
+ ```
260
+ /money-ops stop
261
+ ```
262
+
263
+ It does NOT roll back anything that already shipped — that's `/money-product` rollback territory. It just stops the next cycle from firing. Use this when:
264
+ - An outreach sequence is hitting the wrong segment
265
+ - A scheduled deployment is being canary-flagged repeatedly
266
+ - Stripe webhooks are erroring in a loop and creating noise
267
+ - The user is just done for the day and wants everything quiet
268
+
269
+ After a panic stop, `/money-ops resume` brings scheduled agents back online — but only after the user types `resume` explicitly. No accidental restarts.
270
+
213
271
  ## Setup Wizard
214
272
 
215
273
  When the user types `/money-ops` for the first time:
216
274
 
217
275
  1. **Audit current state** — What skills have been run? What's already set up?
218
276
  2. **Select operations** — Which operations does the user want automated?
219
- 3. **Configure schedule** — Set timezone and preferred hours
220
- 4. **Set up monitoring** — Configure health checks and alert channels
221
- 5. **Test run** — Execute each operation once to verify it works
222
- 6. **Activate** — Start the autonomous schedule
277
+ 3. **Pick operating mode** — `open` / `staging` / `production` (see above)
278
+ 4. **Configure schedule** — Set timezone and preferred hours
279
+ 5. **Set up monitoring** — Configure health checks and alert channels
280
+ 6. **Test run** — Execute each operation once to verify it works
281
+ 7. **Activate** — Start the autonomous schedule
223
282
 
224
283
  ## Provisioned Infrastructure
225
284
 
@@ -29,6 +29,8 @@ Output: ONE final verdict with the disagreements explicitly named, plus a punch
29
29
  | `/money-panel <path-to-plan.md>` | Panel-review a specific plan file |
30
30
  | `/money-panel --slug <project>` | Pull the latest snapshot from `~/.smtm/sessions/<project>/` and panel-review it |
31
31
  | `/money-panel --skip <reviewer>` | Skip a specific reviewer (e.g., `--skip skeptic`). Use sparingly — the whole point is the four-angle gauntlet |
32
+ | `/money-panel --add <persona>` | Add a custom reviewer persona to the gauntlet (see "Custom personas" below) |
33
+ | `/money-panel --only <persona>[,<persona>...]` | Run only the named reviewers. Useful when re-running after a fix to a specific dimension |
32
34
 
33
35
  **Natural-language equivalents**:
34
36
  - "Panel review", "Run all reviews", "Review gauntlet", "Stress test this plan"
@@ -194,6 +196,47 @@ Based on the verdict:
194
196
 
195
197
  ---
196
198
 
199
+ ## Custom personas (`--add` flag)
200
+
201
+ The four built-in reviewers cover business viability. Some plans need additional lenses — an enterprise procurement buyer, a hardware-supply expert, a privacy lawyer, a community manager, an open-source maintainer. Use `--add` to insert a domain expert into the gauntlet without changing the four core reviewers.
202
+
203
+ ### Syntax
204
+
205
+ ```
206
+ /money-panel --add "<role>: <one-sentence brief>"
207
+ ```
208
+
209
+ Example:
210
+
211
+ ```
212
+ /money-panel --add "Enterprise IT buyer: I need SOC2, SSO, and DPA before signing"
213
+ /money-panel --add "Open-source maintainer: I'm wary of vendoring this dependency"
214
+ ```
215
+
216
+ ### How a custom persona is run
217
+
218
+ For each `--add` persona, run a mini-review with this structure:
219
+
220
+ 1. **Role context**: Restate the persona as a one-paragraph self-introduction. Include incentives — what they're rewarded for, what they're punished for, what their day actually looks like.
221
+ 2. **Three questions**: Generate three questions ONLY that persona would ask of this plan. Not generic — questions that only make sense from that role.
222
+ 3. **Verdict in their language**: Output a verdict using the persona's own framing (an enterprise buyer doesn't say "shippable", they say "would I expense this through procurement").
223
+ 4. **The one thing the user is missing**: One sentence — the single thing the plan doesn't address that this persona considers a blocker.
224
+
225
+ The custom persona's verdict joins the matrix but doesn't count toward the 12-point score. It surfaces as a separate "additional perspectives" section. Use it for stress-testing, not gating.
226
+
227
+ ### Common custom personas worth adding
228
+
229
+ | Plan type | Custom personas worth adding |
230
+ |---|---|
231
+ | Enterprise SaaS | "Enterprise IT buyer", "Compliance officer", "Procurement lead" |
232
+ | Consumer app | "Casual user with no patience", "Privacy-conscious user", "Power user who customizes everything" |
233
+ | Developer tool | "Senior engineer evaluating dependencies", "Open-source maintainer", "Platform-team lead at a 50-person company" |
234
+ | Marketplace | "Two-sided market expert", "Liquidity-first investor" |
235
+ | Hardware / supply chain | "Operations / fulfillment lead", "Manufacturing partner" |
236
+ | Regulated industry | "Domain-specific lawyer (healthcare / finance / education)" |
237
+
238
+ For each plan type, the default `--add` set is roughly two extra personas. More than two adds noise; one rarely catches enough.
239
+
197
240
  ## After the panel
198
241
 
199
242
  If 🟢 or 🟡: hard-recommend `/money-save` to lock the verdict. Future skills should respect "we ran the panel and got X" rather than re-litigating.
@@ -38,6 +38,53 @@ Accept one of:
38
38
 
39
39
  The user only needs to confirm choices and provide any API keys or credentials they want to use.
40
40
 
41
+ ## Phase 0: Design System Contract
42
+
43
+ Before writing any UI code, write `DESIGN.md` at the project root. This is the source-of-truth for every visual decision and prevents the most common solo-founder failure: a portfolio of 4 products that all look unrelated because each was built from a different starter template at a different time.
44
+
45
+ If a `DESIGN.md` already exists in the repo, **read it and follow it** — don't re-derive choices the user already locked in. If one doesn't exist, generate one and ask the user to confirm before building.
46
+
47
+ ### `DESIGN.md` skeleton
48
+
49
+ ```markdown
50
+ # Design System — {product name}
51
+
52
+ ## Aesthetic stance
53
+ One sentence on the visual feel (e.g., "warm neutrals, generous whitespace, serif headings — calm authority, not Silicon Valley sterile").
54
+
55
+ ## Type
56
+ - Heading: {font, weight, sizes for h1/h2/h3}
57
+ - Body: {font, weight, line-height, max-width}
58
+ - Mono: {font, when to use}
59
+
60
+ ## Color
61
+ - Surface: {hex} — page background
62
+ - Surface alt: {hex} — cards, raised areas
63
+ - Text: {hex primary} / {hex muted}
64
+ - Accent: {hex} — single accent, used sparingly
65
+ - Success / warning / danger: {hex / hex / hex}
66
+
67
+ ## Spacing
68
+ - Base unit: {N}px
69
+ - Section vertical rhythm: {value}
70
+ - Card padding: {value}
71
+
72
+ ## Motion
73
+ - Default transition: {duration / easing}
74
+ - What animates and what doesn't (rule, not list)
75
+
76
+ ## What this system rejects
77
+ 3-5 bullet points of "we don't do X" — gradients, glassmorphism, neon, etc. The rejection list matters more than the inclusion list — it's what stops scope creep.
78
+ ```
79
+
80
+ Three rules for the design system:
81
+
82
+ 1. **One accent color.** Multiple accents read as "no point of view".
83
+ 2. **Type hierarchy uses size + weight only**, not color. Colored headings age badly.
84
+ 3. **Reject list is mandatory.** If `DESIGN.md` has no "what this system rejects" section, every contributor (including you in 3 months) will drift toward whatever's trendy that week.
85
+
86
+ After writing `DESIGN.md`, every UI choice in this skill — buttons, cards, hero layouts, pricing tables — must trace back to a line in the file. If something doesn't fit, update `DESIGN.md` first, then build.
87
+
41
88
  ## Phase 1: Architecture Decision
42
89
 
43
90
  Based on the product type, select the optimal stack:
@@ -168,6 +215,70 @@ After deployment, verify:
168
215
  - [ ] Mobile experience is smooth
169
216
  - [ ] Schema markup validates (schema.org validator)
170
217
 
218
+ ## Phase 5.5: Ship Lifecycle
219
+
220
+ Shipping isn't `vercel deploy`. It's a five-step lifecycle that turns a working build into a version users can be told about. Run every step, in order, every time. Most "production incidents" happen because a step was skipped.
221
+
222
+ ### Step 1 — Version bump
223
+
224
+ Read `VERSION` (create as `0.1.0` if missing). Bump using semver:
225
+
226
+ | Change | Bump |
227
+ |---|---|
228
+ | Backwards-compatible patch, internal refactor, fix | patch (`x.y.Z`) |
229
+ | New user-facing feature, additive API | minor (`x.Y.0`) |
230
+ | Breaking change to API, URL, or data model | major (`X.0.0`) |
231
+
232
+ Write the new version to `VERSION` and commit it as part of the ship — never separately.
233
+
234
+ ### Step 2 — CHANGELOG entry
235
+
236
+ Append (don't overwrite) a new entry to `CHANGELOG.md` at the top, under the new version header. Pull commit titles since the previous tag and group them:
237
+
238
+ ```markdown
239
+ ## v2.4.0 — 2026-05-11
240
+
241
+ ### Added
242
+ - {short user-facing description of additions}
243
+
244
+ ### Fixed
245
+ - {short description of fixes}
246
+
247
+ ### Changed
248
+ - {short description of changes}
249
+ ```
250
+
251
+ If a commit can't be grouped into Added/Fixed/Changed, it probably shouldn't ship in a public release — fold it into the next one.
252
+
253
+ ### Step 3 — Pre-deploy verification
254
+
255
+ Run, in order, and refuse to proceed if any step fails:
256
+
257
+ - [ ] `/money-quality` standard check (or ship check if charging real money)
258
+ - [ ] All tests pass locally and in CI
259
+ - [ ] `VERSION` and `CHANGELOG.md` updated, committed
260
+ - [ ] No secrets or `.env` files in the diff
261
+ - [ ] If schema changed: migration written AND tested against a copy of production
262
+ - [ ] If pricing or payment flow changed: tested in Stripe test mode end-to-end
263
+
264
+ ### Step 4 — Deploy
265
+
266
+ Deploy to production. Tag the commit with the version (`v2.4.0`). Push the tag. Open a PR if one isn't already merged. After deploy:
267
+
268
+ - Note the deploy timestamp
269
+ - Capture baseline metrics for canary (Phase 7)
270
+ - Trigger `/money-content release-notes` to draft the three-tier user comms (see `money-content` "Release-Notes Mode")
271
+
272
+ ### Step 5 — Release notes delivery
273
+
274
+ Once `/money-content release-notes` returns the three tiers:
275
+
276
+ - Tier 1 (one-line) → post to in-app banner, X, status page
277
+ - Tier 2 (email) → send to existing users (use `/money-outreach` with the "release-notes" template, not the cold-outreach template)
278
+ - Tier 3 (full notes) → append to CHANGELOG.md (already done in Step 2) + publish as a blog post via `/money-content`
279
+
280
+ The release-notes delivery is not optional for ships that include user-facing changes. The conversion rate on release-note emails is the highest of any content type — skipping them is leaving free→paid upgrades on the table.
281
+
171
282
  ## Phase 6: Quality Assurance
172
283
 
173
284
  After the launch checklist passes, run systematic QA testing. Don't ship what you haven't tested in a real browser.
@@ -192,7 +192,11 @@ The pre-launch comprehensive audit. Includes everything from Standard, plus:
192
192
  - Missing indexes on frequently queried columns?
193
193
  - Any query taking >100ms?
194
194
 
195
- ### 7. Security Audit (OWASP Top 10)
195
+ ### 7. Security Audit (OWASP Top 10 + STRIDE threat model)
196
+
197
+ Run BOTH passes — OWASP catches the well-known classes of bug; STRIDE catches the architectural assumptions that turn one bug into a breach.
198
+
199
+ #### OWASP Top 10 (vulnerability classes)
196
200
 
197
201
  | Check | How | Status |
198
202
  |-------|-----|--------|
@@ -205,6 +209,26 @@ The pre-launch comprehensive audit. Includes everything from Standard, plus:
205
209
  | CSRF | Check: tokens on state-changing requests, SameSite cookies | ✅/❌ |
206
210
  | Dependencies | Run `npm audit` / `pip audit` / `govulncheck` — check for known CVEs | ✅/❌ |
207
211
 
212
+ #### STRIDE threat model (architectural exposure)
213
+
214
+ For each component that handles auth, payments, or user data, ask the six STRIDE questions. Each "yes" is a finding to address; each "we accept this risk" is a decision the user has to actively make.
215
+
216
+ | Threat | Question | Common in solo SaaS |
217
+ |---|---|---|
218
+ | **S**poofing identity | Can someone claim to be another user? | Magic links sent without rate limits; OAuth without state validation; webhook endpoints without signature verification |
219
+ | **T**ampering with data | Can someone modify data they shouldn't? | Trusting client-sent prices in Stripe Checkout; allowing user to PATCH their own subscription tier; mutable database fields without audit logs |
220
+ | **R**epudiation | Can a user deny doing something with no record? | No audit log of plan changes, refunds, or account deletions; no record of which admin took which action |
221
+ | **I**nformation disclosure | Can someone read data they shouldn't? | Predictable IDs in URLs; verbose error messages leaking schema; environment-variable leaks in client bundles |
222
+ | **D**enial of service | Can someone make the service unavailable? | No rate limit on signup or password reset; unbounded LLM-call costs from one bad actor; unbounded image-upload size |
223
+ | **E**levation of privilege | Can a regular user become an admin? | Admin-flag in client-readable cookie; admin endpoints sharing the auth middleware of public ones; webhook handlers running with elevated permissions |
224
+
225
+ For each "yes":
226
+ 1. Note the threat type, the component, and the specific path
227
+ 2. Classify severity (P0: live exposure / P1: works with one chained mistake / P2: requires multiple chained mistakes)
228
+ 3. Add to the Ship Check report under "Security findings" with the explicit threat type tag (e.g., `[STRIDE-T]` for tampering)
229
+
230
+ If 3+ STRIDE threats are open at P0/P1, the product is NOT ready to charge real money — regardless of how the OWASP table looks. STRIDE catches the things OWASP misses.
231
+
208
232
  ### 8. Accessibility Audit (WCAG 2.1 AA)
209
233
 
210
234
  - [ ] All images have alt text
@@ -250,6 +274,74 @@ Remaining items (non-blocking):
250
274
 
251
275
  ---
252
276
 
277
+ ## Tech Triage Mode (when something is broken)
278
+
279
+ `/money-diagnose` handles business-level "I'm stuck" — slow growth, wrong ICP, channel doesn't convert. **Tech Triage Mode** handles the technical version: a failing test, a slow query, an unexplained 500, a flaky CI run, a feature that "works on my machine".
280
+
281
+ Trigger via `/money-quality triage` or by describing the symptom directly ("the signup flow returns 500 in production but not staging").
282
+
283
+ ### The triage loop
284
+
285
+ Do NOT start guessing. Do NOT start grepping the codebase. Do NOT propose fixes. Follow the loop in order — each step is cheap, and the first three usually reveal the answer.
286
+
287
+ #### Step 1 — Restate the symptom precisely
288
+
289
+ Force a one-paragraph statement of:
290
+ - What command/URL/action triggers the bug
291
+ - What the user expected to happen
292
+ - What actually happens (exact error message, stack trace, screenshot)
293
+ - What's known to be different between "works" and "doesn't work" (env, browser, account, data)
294
+
295
+ If any of those four is missing, ask for it before proceeding. ~30% of triage sessions end at this step because the symptom turned out to be different from what was first reported.
296
+
297
+ #### Step 2 — Find the boundary
298
+
299
+ The bug exists between something that works and something that doesn't. Find the boundary:
300
+
301
+ | Boundary axis | Diagnostic |
302
+ |---|---|
303
+ | Time | When was the last known-good run? `git log` between known-good and now is the suspect set |
304
+ | Environment | Works in dev, fails in prod → env vars, build config, runtime version |
305
+ | Data | Works for user A, fails for user B → data-shape difference, edge case on B's row |
306
+ | Code path | Works on URL X, fails on URL Y → route handler difference, middleware difference |
307
+ | Concurrency | Works in isolation, fails under load → race condition, connection pool, rate limit |
308
+
309
+ Pick the one most likely. Spend ≤10 minutes on each before switching.
310
+
311
+ #### Step 3 — Reproduce locally
312
+
313
+ A bug you can't reproduce, you can't fix — you can only hope. Reproduce with the smallest possible inputs:
314
+
315
+ - Strip everything not in the minimal repro
316
+ - Run it in a clean state (no cache, fresh DB, fresh process)
317
+ - If you can't reproduce in 30 minutes: it's likely environmental — go back to Step 2 with environment as the axis
318
+
319
+ Once reproducing: capture the exact command and inputs that trigger the failure. This becomes the regression test, regardless of root cause.
320
+
321
+ #### Step 4 — Hypothesize, then test (not the other way)
322
+
323
+ Most "obvious" fixes are wrong because the hypothesis was never explicit. Force the format:
324
+
325
+ > "I think the bug is caused by **{specific cause}**. If I'm right, then **{specific change}** will fix it AND **{prediction about another signal}** will also be true."
326
+
327
+ If the prediction doesn't pan out, the hypothesis was wrong — don't just patch the symptom. Restart Step 4 with a new hypothesis.
328
+
329
+ #### Step 5 — Fix, regression-test, document
330
+
331
+ - Smallest fix that resolves the verified root cause
332
+ - Add the regression test from Step 3
333
+ - Note the bug in the project's `learnings.jsonl` via `/money-learn add` — category `tech`, with the specific cause and the smallest reproducer. Future-you will hit a similar bug and want this trail.
334
+
335
+ ### What to refuse in triage mode
336
+
337
+ - "Try restarting it" — fine in panic; not in triage
338
+ - "Maybe it's a Heisenbug" — Heisenbugs are race conditions you haven't proven
339
+ - "Let's add error handling" without knowing what error — that hides the bug, doesn't fix it
340
+ - "Just wrap it in try/catch" — same
341
+ - Big refactors prompted by a small bug — fix the bug, log the refactor as a separate task
342
+
343
+ The triage loop ends with three artifacts: the root cause stated in one sentence, the minimal regression test, and the `/money-learn` row. Without all three, the bug isn't really fixed — it's just suppressed.
344
+
253
345
  ## Continuous Quality (Integration with /money-ops)
254
346
 
255
347
  After the initial ship check, set up ongoing quality monitoring:
@@ -82,6 +82,25 @@ If the User Profile doesn't include hours-per-week and cash runway, ask for both
82
82
  - 🔴 channels for solo without help: Enterprise sales, conference circuit, large paid-ads spend management, multi-platform content empire, building a sales team
83
83
  - **If the plan's primary channel is 🔴 for solo, that's NEEDS HIRE territory.**
84
84
 
85
+ ### Q5: Architecture & data-flow stress test
86
+
87
+ A plan that's solo-shippable on paper can still trap the founder in 6 months of maintenance work if the architecture is wrong. Audit the proposed tech against five failure modes a solo operator can't escape from:
88
+
89
+ | Failure mode | Question | Solo-killer if... |
90
+ |---|---|---|
91
+ | **Hidden ops cost** | What service runs that requires the founder's attention to keep alive? | Anything self-hosted that isn't trivially restartable. Anything requiring scheduled human action (manual backups, manual cert rotation, manual cron-job inspection) |
92
+ | **Data shape lock-in** | What's the data model commitment in week 1? | A schema that assumes a use case which may not be the actual use case after first 10 customers — re-shaping data later is the #1 solo-founder time sink |
93
+ | **Single point of failure** | If one third-party API goes down, does the whole product become unusable? | Yes, AND there's no graceful degradation, AND the founder has no fallback |
94
+ | **Cost-curve mismatch** | At 100x current usage, what does the infra cost? | The cost curve goes superlinear (per-user database charges, per-request LLM costs at default models, per-MB egress) and there's no way to throttle |
95
+ | **Debug accessibility** | When something breaks at 3am, what does the founder need to debug it? | The answer is "ssh into the box and grep logs" — not viable for solo. Needs centralized logs, error tracking, and a status URL the founder can hit from their phone |
96
+
97
+ For each, classify:
98
+ - 🟢 OK — solo-survivable as-is
99
+ - 🟡 Survivable with one specific change (name the change)
100
+ - 🔴 Not solo-survivable past 100 customers without changing this
101
+
102
+ If 2+ are 🔴, the operator verdict shifts to 🟠 NEEDS HIRE or 🟡 SHIPPABLE WITH DESCOPE regardless of how the other questions went. Architecture debt at the wrong layer is the failure mode most solo plans don't see until month 4.
103
+
85
104
  ---
86
105
 
87
106
  ## Output structure
@@ -125,6 +144,17 @@ If the User Profile doesn't include hours-per-week and cash runway, ask for both
125
144
 
126
145
  {Verdict on whether the GTM plan is executable solo.}
127
146
 
147
+ ### 5. Architecture & data-flow stress test
148
+ | Failure mode | Status | Note |
149
+ |---|---|---|
150
+ | Hidden ops cost | 🟢 / 🟡 / 🔴 | |
151
+ | Data shape lock-in | 🟢 / 🟡 / 🔴 | |
152
+ | Single point of failure | 🟢 / 🟡 / 🔴 | |
153
+ | Cost-curve mismatch | 🟢 / 🟡 / 🔴 | |
154
+ | Debug accessibility | 🟢 / 🟡 / 🔴 | |
155
+
156
+ {Verdict on whether the architecture is solo-survivable.}
157
+
128
158
  ---
129
159
 
130
160
  ## What you'd actually ship in 8 weeks
@@ -218,6 +218,30 @@ Common traps:
218
218
 
219
219
  If key terms can't be defined precisely, the idea needs narrowing, not strategizing.
220
220
 
221
+ #### Term-by-Term Audit Loop
222
+
223
+ For every load-bearing word in the pitch, run this loop until each term has a measurable substitute. Stop when no more vague terms remain or after 5 rounds (whichever comes first).
224
+
225
+ 1. **Spot it** — Underline the word. Examples: "easy", "smart", "intelligent", "best-in-class", "premium", "community-driven", "viral".
226
+ 2. **Probe it** — Ask the user: "If a stranger had to verify this is true without trusting your word, what would they measure?"
227
+ 3. **Convert it** — Replace the word with the measurable substitute the user offered. If the user can't offer one, the term is decoration — strike it from the pitch.
228
+ 4. **Re-read** — Read the whole sentence with the substitute in place. If the sentence now sounds embarrassingly small, that's the real proposition. Decide whether to ship the small thing or change the proposition.
229
+
230
+ The output of this loop is a one-paragraph pitch in which every claim is either measurable, time-bounded, or named to a specific person. Vague words have been either swapped or deleted. This rewritten pitch becomes the input to Layers 2-4.
231
+
232
+ #### Fuzzy-to-Measurable Conversion
233
+
234
+ Before exiting Layer 1, every goal the user mentioned must be converted to a measurable outcome in the format `<verb> <metric> <threshold> <by date>`:
235
+
236
+ | Original (fuzzy) | Converted (measurable) |
237
+ |---|---|
238
+ | "Get more customers" | "Acquire 50 paying users at ≥$29/mo by 2026-08-01" |
239
+ | "Build a community" | "Get 200 verified-email subscribers reading 2+ posts/mo by month 3" |
240
+ | "Become the best in the space" | "Rank in top 3 Google results for 'X' by month 6, with ≥5% CTR" |
241
+ | "Ship a great product" | "Ship feature X passing the QA tier 'Ship Check' with ≥9/10 score by date Y" |
242
+
243
+ If the user resists conversion ("I just want to make it big"), that resistance IS the signal — the strategy is not yet ready. Output: "Goal is not yet measurable. Run `/money-discover` Phase 4.5 (Narrowest-Bet Pressure Test) to extract a falsifiable one-week bet, then return for strategy."
244
+
221
245
  ### Layer 2: Assumption Audit (Inversion Method)
222
246
 
223
247
  List every assumption the business idea relies on. For each, apply Kahneman's pre-mortem: "Imagine this assumption is wrong. What happens?"
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: money-upgrade
3
- description: "Upgrade show-me-the-money skills to the latest version. Use when the user wants to update skills, check for new versions, or says 'upgrade money', 'update skills', or 'latest version'."
3
+ description: "Auto-update the show-me-the-money skill suite to the latest version. One command checks npm for a new version, downloads it, replaces the installed skills, and shows what changed. Use when the user wants to update skills, check for new versions, or says 'upgrade money', 'update skills', 'latest version', 'auto-update', or 'check for updates'."
4
4
  disable-model-invocation: true
5
5
  ---
6
6
 
7
- # Money Upgrade — Version Management
7
+ # Money Upgrade — Auto-Updater
8
8
 
9
- Upgrade the show-me-the-money skill suite to the latest version.
9
+ One command updates every money-* skill to the latest published version. No manual file copying, no version comparison by hand, no risk of partial installs.
10
10
 
11
11
  ## Language Selection
12
12
 
@@ -18,82 +18,150 @@ If the user's message contains a `[Language: ...]` tag, use that language for al
18
18
 
19
19
  Default to English if the user doesn't specify. All subsequent output must be in the chosen language.
20
20
 
21
- ## Quick Update (Recommended)
21
+ ## What this skill does
22
22
 
23
- The fastest way to update is the built-in CLI command. It checks for a new version,
24
- downloads it, and re-installs all skills in one step:
23
+ When the user invokes `/money-upgrade`, run the three steps in order:
24
+
25
+ 1. **Read the installed version** — `cat ~/.claude/skills/money/../../VERSION` if the file exists, otherwise read from the package metadata
26
+ 2. **Check npm for the latest version** — `npm view @orrisai/show-me-the-money version`
27
+ 3. **If outdated, run the auto-updater** — `npx @orrisai/show-me-the-money@latest update`
28
+
29
+ The CLI (`bin/cli.js`) handles the actual work: download, version compare, backup, install. This skill is the user-facing wrapper that decides when to call it.
30
+
31
+ ## The full auto-update command
32
+
33
+ This is the single command that does everything — version check, download, replace, verify:
25
34
 
26
35
  ```bash
27
- npx @orrisai/show-me-the-money update
36
+ npx @orrisai/show-me-the-money@latest update
28
37
  ```
29
38
 
30
- If you prefer more control, follow the manual steps below.
39
+ Run it for the user. It prints the before/after versions, lists which skills were re-installed, and exits cleanly.
31
40
 
32
- ## Manual Upgrade Process
41
+ ## Workflow
42
+
43
+ ### Step 1 — Print current state
33
44
 
34
- ### Step 1: Check Current Version
35
- Read the VERSION file from the installed skill directory:
36
- ```bash
37
- cat ~/.claude/skills/money/../../VERSION 2>/dev/null || echo "Unknown"
38
45
  ```
46
+ Current installation:
47
+ Version: v{current}
48
+ Location: ~/.claude/skills/
49
+ Skills installed: {count}
39
50
 
40
- Or check via CLI:
41
- ```bash
42
- npx @orrisai/show-me-the-money version
51
+ Checking npm for updates...
43
52
  ```
44
53
 
45
- ### Step 2: Check Latest Version
46
- ```bash
47
- npm view @orrisai/show-me-the-money version
54
+ ### Step 2 Check for updates
55
+
56
+ Run `npm view @orrisai/show-me-the-money version` (no arguments needed). Capture stdout. Compare to the local VERSION.
57
+
58
+ If equal, exit with:
59
+
60
+ ```
61
+ ✅ You're on the latest version (v{version}). Nothing to update.
48
62
  ```
49
63
 
50
- ### Step 3: Compare Versions
51
- - If current == latest: "You're on the latest version (vX.X.X)."
52
- - If current < latest: Proceed to upgrade.
64
+ If different (local < remote), proceed to Step 3.
65
+
66
+ ### Step 3 Run the updater
53
67
 
54
- ### Step 4: Backup Current Installation
55
68
  ```bash
56
- BACKUP_DIR=~/.claude/skills-backup/money-$(date +%Y%m%d-%H%M%S)
57
- mkdir -p "$BACKUP_DIR"
58
- for dir in money money-discover money-strategy money-product money-content money-outreach money-social money-seo money-ads money-ops money-finance money-upgrade; do
59
- [ -d ~/.claude/skills/$dir ] && cp -r ~/.claude/skills/$dir "$BACKUP_DIR/"
60
- done
61
- echo "Backup saved to $BACKUP_DIR"
69
+ npx @orrisai/show-me-the-money@latest update
62
70
  ```
63
71
 
64
- ### Step 5: Install Latest Version
72
+ The CLI prints its own progress. After it returns, verify success:
73
+
74
+ - Check that VERSION now matches the latest npm version
75
+ - Confirm all skill directories are present in `~/.claude/skills/`
76
+
77
+ ### Step 4 — Show what changed
78
+
79
+ After update succeeds, fetch the release notes for the new version and summarize:
80
+
65
81
  ```bash
66
- npx @orrisai/show-me-the-money@latest install
82
+ curl -s https://raw.githubusercontent.com/iamzifei/show-me-the-money/v{version}/CHANGELOG.md | head -80
83
+ ```
84
+
85
+ If CHANGELOG.md isn't available, fall back to the README's "What's new" section. Present the highlights in 5-10 bullets — not the full diff.
86
+
87
+ ### Step 5 — Remind to restart
88
+
89
+ ```
90
+ ✅ Updated to v{new}.
91
+
92
+ To pick up the new skills, restart Claude Code (or run /reload-plugins if available).
93
+
94
+ What's new in this version:
95
+ - [bullet 1]
96
+ - [bullet 2]
97
+ - ...
98
+
99
+ Run /money to start using the updated suite.
67
100
  ```
68
101
 
69
- ### Step 6: Verify Installation
70
- - Check that all 12 skill directories exist in `~/.claude/skills/`
71
- - Read the new VERSION file
72
- - Confirm the upgrade was successful
102
+ ## Manual fallback
73
103
 
74
- ### Step 7: Show Changelog
75
- Display what's new in this version (from the GitHub releases page or CHANGELOG).
104
+ If the auto-updater fails (npm offline, registry issue, permission error), fall back to the manual path. Read the error message and surface ONE specific reason it failed — not a wall of generic recovery options.
105
+
106
+ Common failures and the response:
107
+
108
+ | Failure | Diagnostic | Response |
109
+ |---|---|---|
110
+ | `npm: command not found` | Node/npm not installed | "Install Node.js from nodejs.org first, then re-run `/money-upgrade`." |
111
+ | Network unreachable | No internet or npm registry down | "Can't reach npm registry. Check your network — registry status: https://status.npmjs.org." |
112
+ | EACCES on `~/.claude/skills/` | Permission denied on the skills dir | "Permission denied writing to `~/.claude/skills/`. Run `sudo chown -R $(whoami) ~/.claude/` then re-run." |
113
+ | Tag exists but install fails | Likely a publish race or a broken release | "Latest release has an install issue. Run `npx @orrisai/show-me-the-money@{previous-stable}` to pin to the prior version." |
76
114
 
77
115
  ## Rollback
78
116
 
79
- If the upgrade fails or causes issues:
117
+ If the new version breaks something, roll back to the previous version explicitly:
118
+
80
119
  ```bash
81
- # Find the latest backup
82
- ls -la ~/.claude/skills-backup/
83
-
84
- # Restore from backup
85
- BACKUP_DIR=~/.claude/skills-backup/money-XXXXXXXX-XXXXXX
86
- for dir in "$BACKUP_DIR"/*/; do
87
- dir_name=$(basename "$dir")
88
- rm -rf ~/.claude/skills/$dir_name
89
- cp -r "$dir" ~/.claude/skills/$dir_name
90
- done
91
- echo "Rolled back to backup version."
120
+ # 1. Find the previous stable version on npm
121
+ npm view @orrisai/show-me-the-money versions --json | tail -20
122
+
123
+ # 2. Install that specific version
124
+ npx @orrisai/show-me-the-money@{previous-version} install
92
125
  ```
93
126
 
94
- ## Cleanup
127
+ The auto-updater does NOT auto-rollback on failure — it leaves the installation in whatever state the failed install ended at. If the user reports a regression after update, run the two-step rollback above and then file an issue at https://github.com/iamzifei/show-me-the-money/issues.
95
128
 
96
- Remove old backups (keep last 3):
97
- ```bash
98
- cd ~/.claude/skills-backup && ls -dt money-* | tail -n +4 | xargs rm -rf
129
+ ## When to auto-update vs ask first
130
+
131
+ Default: ask before updating. The user invoked `/money-upgrade`, so they want to update but show the version delta first and let them confirm. Example:
132
+
133
+ ```
134
+ Current: v2.3.1
135
+ Latest: v2.4.0 ← 1 minor version behind
136
+
137
+ New in v2.4.0:
138
+ - Tech-triage mode for technical debugging
139
+ - DESIGN.md design system contract in money-product
140
+ - Ship lifecycle: VERSION + CHANGELOG + release notes flow
141
+ - Cross-project portfolio learnings via /money-learn promote
142
+ - STRIDE threat model in money-quality
143
+ - Operating modes + edit perimeter + panic stop in money-ops
144
+
145
+ Proceed with update? [y/n]
99
146
  ```
147
+
148
+ **Skip the confirmation** only if the user explicitly said `--yes`, `--auto`, or "just update it" in their message.
149
+
150
+ ## Principles
151
+
152
+ - **One command, one outcome** — Don't ask the user to copy multiple shell snippets
153
+ - **Show the delta before changing anything** — Version numbers + headline changes, not full diffs
154
+ - **Don't auto-rollback** — Failed installs surface as failures; rollback is an explicit user action
155
+ - **Restart prompt at the end** — Skills don't always reload mid-session; remind the user
156
+ - **Read the CHANGELOG, not the commit log** — Users care about behavior changes, not implementation churn
157
+
158
+ ---
159
+
160
+ ## Value Quantification (Required at End of Output)
161
+
162
+ | | |
163
+ |---|---|
164
+ | ⏱ **Time saved** | ~10-15 minutes vs the manual upgrade path (compare versions, backup, install, verify, read release notes) |
165
+ | ⚠️ **Risks avoided** | (1) Partial install where some skills update and others don't; (2) backing up the wrong directory and losing project-local skills; (3) running an old skill alongside a new one and getting inconsistent behavior |
166
+ | ✅ **What you got** | A clean update from v{current} → v{new}, the relevant CHANGELOG bullets, and the restart prompt |
167
+ | 🚧 **Without this skill** | Most users put off the update for weeks, run old skills against new docs/atoms, and surface mystery bugs that turn out to be "you're on v2.1, that field was renamed in v2.3" |