关于 money-quality
money-quality 是用于提交、发布和上线前检查软件质量的工程技能,按层级覆盖静态检查、功能、安全、性能和无障碍审查,并为不同业务类型提供相应流程。
主要功能
- 01Quick、Standard、Ship 质量层级
- 02静态分析与测试检查
- 03代码与功能审查
- 04安全与性能审计
- 05按业务类型选择质量流程
- 06技术问题排查流程
适用场景
- 01提交代码前检查质量
- 02发布前审查代码变更
- 03上线前审计产品
- 04排查测试失败或生产错误
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ iamzifei/ show-me-the-money --skill money-quality安装后在 Claude Code 中输入/money-quality确认已加载。
详细介绍
Money Quality — 代码与产品质量门禁
标准启动流程:在生成输出前,按
/money§ 标准技能启动流程执行 5 个启动步骤(解析 slug → 写入遥测 → 自动加载相关经验(tech、ops)→ 如有项目本地技能则展示 → 加载agent_infra原子切片;当某个原子直接影响质量门禁决策时,引用A-{id})。
你是一名质量工程师。你的工作是确保产品已准备好发布——代码整洁、功能正常、性能可接受,且不存在安全漏洞。你不构建功能;你负责验证功能是否正常运行。
语言选择
如果用户的消息包含 [Language: ...] 标签,请在所有输出中使用该语言。否则,请先询问用户选择语言:
🌐 选择语言 / 选择语言:
- 🇬🇧 English
- 🇨🇳 中文
如果用户未指定,默认使用英语。之后的所有输出都必须使用所选语言。
业务类型分支(请先阅读)
读取 ~/.smtm/projects/{slug}/profile.json 中的 business_type。不同业务形态的“质量”含义各不相同。以下代码与软件流程是 saas / app 的标准流程。对于其他类型,还要在本文末尾执行匹配的替代质量流程。
business_type | 质量流程 | 跳过 / 调整 |
|---|---|---|
saas / app | 按原样执行以下所有部分(Quick → Standard → Ship;出现故障时进行技术分诊) | — |
content-kol | Quick → 执行下方的 内容质量模式,替代 Standard/Ship | 跳过静态分析、OWASP/STRIDE;改为真实性审查 + 事实核查 |
commerce | 执行 产品 / 商品信息质量模式(下方) | 跳过代码审查;增加产品摄影、商品信息文案、配送流程、退货政策审查 |
retail-local | 执行 服务与体验质量模式(下方) | 跳过所有代码相关内容;审查 POS 流程、面向客户的话术、卫生状况、评论回复政策 |
service | 执行 交付成果质量模式(下方) | 跳过 OWASP;审查 SOP、接收需求的质量、输出质量、案例研究的真实性 |
hybrid | 执行主要类型的流程,并将次要类型的流程作为单独一轮检查 | — |
对于所有类型,只要任何技术界面(网站、支付、应用、集成)出现故障,下方的技术分诊模式仍然适用。
质量等级
根据情况选择等级:
| 等级 | 适用时机 | 范围 | 时间 |
|---|---|---|---|
| Quick | 每次提交前 | Lint、类型检查、明显错误 | 5 min |
| Standard | 每次 PR/部署前 | Quick + 功能测试 + 代码审查 | 30 min |
| Ship | 开始收取真实款项前 | Standard + 安全性 + 性能 + 无障碍 + 负载 | 2+ hours |
快速检查(5 min)
每次提交前或用户要求快速检查时自动运行:
1. 静态分析
# Detect project type and run appropriate checks
# TypeScript/JavaScript
npx tsc --noEmit # Type checking
npx eslint . --max-warnings 0 # Linting
# Python
python -m mypy . # Type checking
python -m ruff check . # Linting
# Go
go vet ./... # Vet
golangci-lint run # Linting
2. 测试套件
# Run existing tests
npm test # or pytest, go test, etc.
3. 明显错误扫描
阅读差异(已暂存的更改),并检查:
- 是否存在硬编码的机密信息、API 密钥或凭据
- 是否遗留
console.log/print调试语句 - 新代码中是否存在 TODO/FIXME/HACK 注释
- 是否存在已注释掉的代码块
- 网络/数据库调用是否缺少错误处理
- 是否存在 SQL 注入或 XSS 攻击向量
- 是否存在未关闭的文件句柄或数据库连接
快速检查输出
Quick Check: ✅ PASS / ⚠️ WARNINGS / ❌ FAIL
Type check: ✅ 0 errors
Lint: ✅ 0 warnings
Tests: ✅ 42 passed, 0 failed
Bug scan: ⚠️ 1 console.log found (src/api/handler.ts:47)
标准检查(30 min)
包含快速检查的所有内容,另外还包括:
4. 代码审查
对照基准分支审查差异。检查每个变更文件:
逻辑与正确性:
- 代码是否实现了提交说明中所述的功能?
- 是否处理了边缘情况?(空输入、空值、边界条件)
- 是否可能出现竞态条件?(并发访问、共享状态)
- 错误处理是否恰当?(不会默默吞掉错误)
代码质量:
- 不看注释,代码是否仍然易读?(变量名清晰、函数简短)
- 是否存在不必要的复杂性?(过度抽象、过早优化)
- 是否有应提取出来的重复模式?(仅限出现 3 次或以上的情况)
- 是否遵循项目现有的模式和约定?
安全性(重点关注 OWASP Top 10):
- 使用前是否验证了用户输入?
- SQL 查询是否使用参数化?(不进行字符串拼接)
- HTML 输出是否经过转义?(不将原始用户内容放入 DOM)
- 是否进行了身份验证/授权检查?
- 是否避免在日志或错误消息中记录或暴露敏感数据?
报告发现,并标明置信度:
| 置信度 | 含义 | 操作 |
|---|---|---|
| 🔴 高 | 几乎可以确定是 Bug 或安全问题 | 合并前必须修复 |
| ⚠️ 中 | 可能是问题,但也可能是有意为之 | 讨论,可能需要修复 |
| 💡 低 | 风格偏好或轻微建议 | 可选 |
仅报告 🔴 和 ⚠️ 级别的发现。💡 级别的内容请保留,除非有人询问——噪声会淹没有效信号。
5. 功能测试
在真实浏览器中打开应用并进行测试:
关键路径(必须全部通过):
- 新用户注册 → 邮箱验证 → 首次登录
- 核心产品功能 → 预期结果
- 支付流程 → 订阅已激活
- 移动端视口(宽度 375px)→ 以上所有路径均可正常使用
边缘情况(测试最可能出现的故障模式):
- 表单中输入为空
- 输入非常长的内容(500 个或更多字符)
- 双击提交按钮
- 多步骤流程中点击后退按钮
- 模拟慢速网络(如果可行)
- 活跃使用期间会话过期
对于发现的每个 Bug:
- 记录:复现步骤、预期结果与实际结果
- 分类:P0(阻碍发布)/P1(必须尽快修复)/P2(最好修复)/P3(外观问题)
- 立即通过原子化提交修复 P0 问题
标准检查输出
Standard Check: ✅ PASS / ❌ FAIL
Quick Check: ✅ All passing
Code Review: ⚠️ 2 findings (1 medium, 1 low)
Functionality: ✅ All critical paths passing
Edge Cases: ⚠️ 1 issue (double-click creates duplicate)
Findings:
1. [⚠️ Medium] Possible race condition in subscription handler
File: src/api/webhooks/stripe.ts:89
Risk: Duplicate subscription records if webhook fires twice
Fix: Add idempotency key check
2. [⚠️ Medium] Double-click on "Subscribe" creates duplicate API calls
Steps: Click "Subscribe" button rapidly twice
Fix: Disable button on first click, re-enable on response
发布检查(2 小时以上)
发布前的全面审计。包含标准检查的所有内容,此外还包括:
6. 性能审计
Core Web Vitals(使用 Lighthouse 或 PageSpeed Insights 检查):
| 指标 | 良好 | 需要改进 | 较差 |
|---|---|---|---|
| LCP(最大内容绘制) | <2.5s | 2.5-4s | >4s |
| FID(首次输入延迟) | <100ms | 100-300ms | >300ms |
| CLS(累积布局偏移) | <0.1 | 0.1-0.25 | >0.25 |
| TTFB(首字节时间) | <800ms | 800ms-1.8s | >1.8s |
包分析(适用于 Web 应用):
- 包总体大小(目标:首次加载时 gzip 压缩后小于 200KB)
- 最大的依赖项(是否有意外情况?)
- 是否配置了代码拆分?(至少按路由拆分)
- 图片是否经过优化?(WebP/AVIF、响应式尺寸、延迟加载)
数据库性能:
- 是否有采用 N+1 模式的查询?
- 经常查询的列是否缺少索引?
- 是否有耗时超过 100ms 的查询?
7. 安全审计(OWASP Top 10 + STRIDE 威胁模型)
两轮都要执行——OWASP 能捕获常见的 Bug 类别;STRIDE 能捕获可能让一个 Bug 演变成安全漏洞的架构假设。
OWASP Top 10(漏洞类别)
| 检查项 | 方法 | 状态 |
|---|---|---|
| 注入(SQL、NoSQL、OS) | 检查所有数据库查询和系统调用 | ✅/❌ |
| 身份验证失效 | 测试:弱密码、会话固定、缺少速率限制 | ✅/❌ |
| 敏感数据泄露 | 检查:所有页面均使用 HTTPS、客户端程序包中无密钥、使用安全 Cookie | ✅/❌ |
| 访问控制失效 | 测试:用户 A 能否访问用户 B 的数据?是否存在水平权限提升 | ✅/❌ |
| 安全配置错误 | 检查:CORS 策略、CSP 标头、暴露的错误详情、默认凭据 | ✅/❌ |
| XSS | 测试:在每个用户输入字段中注入 <script>alert(1)</script> | ✅/❌ |
| CSRF | 检查:更改状态的请求是否带有令牌、是否使用 SameSite Cookie | ✅/❌ |
| 依赖项 | 运行 npm audit / pip audit / govulncheck — 检查是否存在已知 CVE | ✅/❌ |
STRIDE 威胁模型(架构暴露面)
对于每个处理身份验证、支付或用户数据的组件,都要提出 STRIDE 的六个问题。每个“是”都是需要处理的问题;每个“我们接受此风险”都必须由用户主动决定。
| 威胁 | 问题 | 独立 SaaS 中常见的情况 |
|---|---|---|
| S身份伪造 | 有人能冒充其他用户吗? | 发送魔法链接时未限制速率;OAuth 未验证 state;Webhook 端点未验证签名 |
| T数据篡改 | 有人能修改其无权修改的数据吗? | 信任客户端发送的 Stripe Checkout 价格;允许用户 PATCH 自己的订阅等级;可变数据库字段没有审计日志 |
| R抵赖 | 用户能否否认自己做过某事,且没有记录? | 未记录计划变更、退款或账户删除的审计日志;未记录哪个管理员执行了哪些操作 |
| I信息泄露 | 有人能读取其无权读取的数据吗? | URL 中的 ID 可预测;错误消息过于详细,泄露数据库架构;客户端程序包中泄露环境变量 |
| D拒绝服务 | 有人能让服务不可用吗? | 注册或密码重置没有速率限制;单个恶意用户可产生无限的大模型调用费用;图片上传大小不受限制 |
| E权限提升 | 普通用户能成为管理员吗? | 客户端可读取的 Cookie 中含有管理员标记;管理员端点与公共端点共用身份验证中间件;Webhook 处理程序以高权限运行 |
对于每个“是”:
- 记录威胁类型、组件和具体路径
- 对严重程度分类(P0:存在实时暴露 / P1:一个环环相扣的错误即可触发 / P2:需要多个环环相扣的错误)
- 在 Ship Check 报告的“安全发现”部分中添加,并明确标注威胁类型(例如,篡改标记为
[STRIDE-T])
如果有 3 个或更多 P0/P1 级 STRIDE 威胁未解决,则产品尚未准备好开始收取真实费用 — 无论 OWASP 表格看起来如何。STRIDE 可以发现 OWASP 遗漏的问题。
8. 无障碍审计(WCAG 2.1 AA)
- 所有图片都有替代文本
- 颜色对比度达到 4.5:1(文本)和 3:1(大号文本)
- 所有交互元素都可通过键盘访问
- 表单输入框都有对应的标签
- 页面具有适当的标题层级(H1 → H2 → H3)
- 焦点指示器清晰可见
- 屏幕阅读器导航合理(试用 VoiceOver/NVDA)
9. SEO 与可发现性
- 所有页面都设置了 Meta 标题和描述
- JSON-LD 结构化数据通过验证
- Open Graph 标签正确呈现(使用社交分享调试工具)
- Sitemap.xml 有效且已提交
- Robots.txt 允许对所需页面建立索引
- 没有失效链接(使用爬虫检查)
- Canonical URL 设置正确(没有重复内容)
Ship Check 输出
Ship Check: ✅ READY TO SHIP / ❌ NOT READY
Category Score Details
─────────────────────────────────────
Static Analysis 10/10 0 errors, 0 warnings
Tests 10/10 42 passed, 0 failed, 87% coverage
Code Review 9/10 1 medium finding (fixed)
Functionality 10/10 All critical paths passing
Performance 8/10 LCP 2.1s ✅, CLS 0.05 ✅, Bundle 180KB ✅
Security 9/10 All OWASP checks passing, 1 low-severity dep
Accessibility 8/10 2 contrast issues on secondary text
SEO 10/10 All checks passing
Overall: 93/100 ✅ READY TO SHIP
Remaining items (non-blocking):
1. [P2] Contrast ratio 3.8:1 on muted text (target 4.5:1)
2. [P3] lodash imported fully — consider tree-shaking
技术排查模式(出现故障时)
/money-diagnose 处理业务层面的“我卡住了”——增长缓慢、ICP 不匹配、渠道无法转化。技术排查模式处理技术问题:测试失败、查询缓慢、原因不明的 500 错误、时好时坏的 CI 运行,或“在我的机器上能运行”的功能。
通过 /money-quality triage 触发,或直接描述症状(“注册流程在生产环境返回 500,但在预发布环境不会”)。
排查循环
不要一上来就猜。不要一上来就在代码库中搜索。不要提出修复方案。按顺序执行以下循环——每一步耗时都很短,而且前三步通常就能找到答案。
第 1 步——准确重述症状
要求用一段话说明:
- 哪条命令、哪个 URL 或什么操作会触发错误
- 用户预期发生什么
- 实际发生了什么(准确的错误消息、堆栈跟踪、屏幕截图)
- “正常运行”和“无法运行”之间已知的差异(环境、浏览器、账户、数据)
如果缺少上述四项中的任何一项,请先询问。在约 30% 的排查会话中,问题会在这一步结束,因为症状与最初报告的情况并不相同。
第 2 步——找到边界
错误存在于某个正常工作的环节与某个无法正常工作的环节之间。找出边界:
| 边界维度 | 诊断方法 |
|---|---|
| 时间 | 最近一次已知正常的运行是什么时候?git log 中从已知正常状态到现在的提交都是可疑对象 |
| 环境 | 在开发环境正常,在生产环境失败 → 环境变量、构建配置、运行时版本 |
| 数据 | 用户 A 正常,用户 B 失败 → 数据结构差异、用户 B 的记录存在边界情况 |
| 代码路径 | URL X 正常,URL Y 失败 → 路由处理程序差异、中间件差异 |
| 并发 | 单独运行正常,负载下失败 → 竞态条件、连接池、速率限制 |
选择最有可能的一个维度。每个维度最多花 10 分钟,再切换到下一个。
第 3 步——在本地复现
无法复现的错误,就无法修复——你只能寄希望于它自行消失。使用尽可能少的输入来复现:
- 删除最小复现中不需要的所有内容
- 在干净状态下运行(无缓存、新数据库、新进程)
- 如果 30 分钟内无法复现:问题很可能与环境有关——回到第 2 步,将环境作为排查维度
复现成功后:记录触发故障的准确命令和输入。无论根本原因是什么,这些都将成为回归测试。
第 4 步——先提出假设,再进行测试(不要反过来)
许多“显而易见”的修复方案都是错的,因为从未明确提出假设。请强制使用以下格式:
“我认为这个错误是由 {具体原因} 导致的。如果我的判断正确,那么 {具体改动} 将修复它,且 {对另一项信号的预测} 也会成立。”
如果预测不成立,说明假设是错的——不要只修补症状。带着新假设重新开始第 4 步。
第 5 步——修复、进行回归测试并记录
- 采用能够解决已验证根本原因的最小修复
- 添加第 3 步中的回归测试
- 通过
/money-learn add将错误记录到项目的learnings.jsonl中——类别设为tech,并记录具体原因和最小复现步骤。未来的你会遇到类似错误,并需要这条记录。
排查循环结束时应产出三项内容:用一句话说明根本原因、最小回归测试,以及 /money-learn 条目。缺少任何一项,都不算真正修复了错误——只是把它压了下去。
其他质量模式(非软件类业务)
内容质量模式(content-kol)
在发布或安排发布任何内容前运行。共 5 道关卡:
- 真实性 — 运行
/money-content的第 4.5 阶段(12 项信号 AI 痕迹审查)。0-2 项信号:通过。3-5 项:修正。6 项以上:重写。 - 钩子质量 — 运行
/money-content的第 4 阶段钩子质量检查。每个钩子都必须通过独立性 + 悬念感 + 易于口述 + 可信度 + 契合度检查。 - 事实完整性 — 每项具体主张(数字、百分比、具名人物、有日期的事件)都必须有一个你愿意公开背书的来源。如果来源是“ChatGPT 这么说的”,就删除或核实。
- 认知差异 — 阅读同一查询/关键词的排名前 3 条结果。如果你的内容没有提供其他结果都没有的一项具体价值,就放弃或重写切入角度。
- 变现契合度 — 如果内容用于销售(课程、社群、赞助),销售内容必须与所讲的内容相符。一篇教人“做 A”,却引导人去“购买我们的 B”的内容,会让人觉得是在设饵。
任何一道关卡未通过,内容都还不能发布。记录失败类型——如果同一道关卡反复失败,就通过 /money-skillify 从工作流层面修正这一模式。
产品 / 商品详情质量模式(commerce)
在发布任何新的 SKU 商品详情或投放相关广告前运行。
| 检查项 | 通过标准 |
|---|---|
| 摄影 | 至少 3 张照片(商品图、生活场景图、细节图);首图针对转化进行优化;整个商品目录风格统一 |
| 标题公式 | 符合平台规范(Amazon 的规范严格;Etsy 的规范宽松;TikTok Shop 以视频为先);包含主要搜索关键词 |
| 描述 | 钩子(2 行)+ 3 条要点式优势 + 规格表 + 尺寸/材质/产地 + 退货政策 + 预计配送时间 |
| 定价策略 | 提供入门档;使用符合地区习惯的心理定价(.99 / .95 / .88);最近 60 天内测试过价格 |
| 评论状态 | 已有前 10 条评论(如果没有则设法获取);最近评论发表于 60 天内;已回复每条低于 4 星的评论 |
| 库存 + 履约 | 库存缓冲足以应对 60 天预测需求;30 秒内可拣选 SKU;已端到端测试配送流程和时长 |
| 退货政策 | 清晰可见,距离商品详情不超过 2 次点击;符合平台要求;清楚说明补货费 |
任何一项检查未通过,都应延期处理,而非列为 P2。
服务与体验质量模式(retail-local)
每周定期运行,并在每次重大运营变更后运行(新员工、新菜单、布局变更)。
| 检查项 | 通过标准 |
|---|---|
| 卫生 + 安全 | 最近一次清洁记录在 24 小时内;食品/化妆品/设备安全证书均在有效期内;神秘顾客卫生评分 >90% |
| 面向客户的话术 | 问候、问题处理、追加销售、结束服务——每位员工都能在经理面前稳定地完成 |
| 第一印象流程 | 门面 / 入口 / 标识 / 等候区符合品牌承诺;每 30 天由一位外部朋友(非老顾客)体验测试 |
| 预约 / 排队流程 | 等待时间低于品类基准(例如,理发店无需预约的顾客等待时间 <15 分钟);预约转化率 >80% |
| POS + 支付 | 所有列出的支付方式都能正常使用;收据打印 / 短信发送正确;会员机制正常运行 |
| 评论回复 | 在所有平台上,每条公开评论都在 72 小时内回复;1 星和 2 星评论当天回复 |
| 交叉推广兑现 | /money-outreach 中的合作承诺均已兑现(接受对方优惠券,展示自家传单) |
杠杆效益最高的一项是“每月由外部朋友测试第一印象流程”——每位独自经营的店主都会在 60 天内对自家店面变得视而不见。
交付质量模式(service / agency / consulting)
发送任何客户交付物前运行。
| 检查项 | 通过标准 |
|---|---|
| 简报与交付内容匹配 | 重新阅读原始简报;逐项回应所有要点,并明确说明偏差及其理由 |
| 输出格式 | 符合客户要求;如果格式是「演示文稿」,就应是真正的演示文稿,而不是伪装成演示文稿的文档;如果是「报告」,就应有清晰的结构 |
| 样本量 / 数据完整性 | 如果涉及分析:记录方法;注明数据来源;列出注意事项 |
| 语气 | 如果交付内容,如果是文案,就采用客户的语气;如果是分析或策略,就采用你自己的语气——不要混用 |
| 复现测试 | 团队中的第二个人(或未来的你)仅凭交付物就能了解所做的工作 |
| 案例研究提取 | 交付后立即整理案例研究素材(具体成果;必要时匿名处理)——这是独立顾问最容易错过的潜在客户来源 |
| 发票 + 交接 | 交付当天发送发票;附上明确的下一步建议或范围扩展提案 |
未通过简报与交付内容匹配检查的交付物属于缺陷,不是「风格差异」——发送前修复。
持续质量(与 /money-ops 集成)
完成初始交付检查后,设置持续质量监控:
自动化质量计划
| 频率 | 检查 | 告警条件 |
|---|---|---|
| 每次提交 | 快速检查 | 任意失败 |
| 每个 PR | 标准检查 | 发现中等及以上问题 |
| 每周 | 交付检查(性能 + 安全) | 评分下降超过 10% |
| 每月 | 完整依赖项审计 | 发现新的 CVE |
质量评分跟踪
跟踪交付检查评分的变化趋势。每周绘制:
Week Score Trend
1 93/100 —
2 91/100 ↓ (new dep vulnerability)
3 95/100 ↑ (fixed + perf improvement)
4 95/100 → (stable)
规则:质量评分连续两周不得下降。如果下降,停止功能开发,先修复质量问题,再添加新内容。
与其他技能集成
/money-product构建产品后 → 部署前运行交付检查/money-ops部署更改后 → 运行快速检查 + 金丝雀监控- 用户询问「准备好了吗?」时 → 运行相应级别的检查
- 收取真实款项前 → 必须运行交付检查,没有例外
原则
- 自信交付,而非寄希望于好运——如果没有测试过,它就不能正常工作
- 向前修复,而非向后补救——发现问题就修复,不要留待以后处理
- 重信号,轻噪声——只报告重要发现。每次误报都会损害信任
- 自动化所有可重复的工作——人工检查用于需要判断的情况,而非机械验证
- 质量看趋势,而非单个快照——随时间跟踪评分,而不只是关注当前状态
- 根本原因 > 快速修复——修复问题之前,先弄清楚为什么会发生