关于 seo-roast
seo-roast 是面向处理网站 SEO 的团队的审查技能,按对收入的影响排序问题,并要求优先在代码中修复爬取、索引和转化障碍。
主要功能
- 01按致命、收入、增长和次要问题分级
- 02检查 robots.txt、站点地图与路由
- 03审查动态页面和本地化结构
- 04检查页面首屏与转化路径
- 05评估 AI 搜索可见性与定价
- 06核对重要页面索引及内链
适用场景
- 01排查搜索引擎无法抓取的营收页面
- 02修复薄弱的程序化 SEO 页面
- 03让价格与产品信息可被 AI 爬虫读取
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ illyism/ seo-skills --skill seo-roast安装后在 Claude Code 中输入/seo-roast确认已加载。
详细介绍
SEO 辣评:以收入为先的拆解,最终合并 PR
大多数审计都会交付一份 50 页的 PDF,列出 400 条警告:缺少替代文本、元描述超出 4 个字符、H3 出现在 H2 之前。网站持续亏损,是因为真正关键的 3 个问题藏在第 31 页。辣评则反其道而行:找出阻碍收入的问题,直言不讳地指出来,在代码中修复,并按影响收入的程度排列其余事项。
调用时: 先用一句话给出结论(“你的 robots.txt 让除了 Google 以外的所有搜索引擎都看不到你”),然后执行流程。绝不要以百分制评分开场。
核心规则:致命问题优先,绝不关注琐事(直到致命问题解决)
issue found
├── FATAL: blocks crawling, indexing, or rendering of a revenue page
│ └── Fix in this PR. Nothing else ships until this tier is empty.
├── REVENUE: page indexes but cannot rank or cannot convert
│ └── Fix in this PR if it takes under 1 hour of code, else top of roadmap.
├── COMPOUNDING: authority, links, AI visibility
│ └── Roadmap with owner and first action.
└── FLUFF: alt text, meta length, heading order, minor schema warnings
└── One line at the bottom of the roadmap. Do not fix while FATAL or REVENUE rows remain.
原因:Bing 无法抓取的页面,即使加上替代文本也毫无用处;先修琐事的团队会觉得自己很有成效,但阻碍因素却会继续存在整整一个季度。
信息收集(2 分钟)
- 域名、1-3 个营收页面,以及主要转化目标(注册、演示、购买)。
- 仓库访问权限:从
package.json检测框架,查找robots.txt/robots.ts、站点地图、中间件、动态路由(app/**/[slug]、pages/**/[slug])。 - 如有:GSC 热门页面、Ahrefs 或 DataForSEO 访问权限(参见 ahrefs-research 和 dataforseo-serp)。
6 点辣评决策流程
按顺序执行。每一点都包含检查项、通过/失败阈值,以及要交付的修复。
1. 自有爬取与 SafeSearch 屏蔽问题
1a. 默认拒绝的 robots.txt
curl -s https://deployfast.dev/robots.txt
失败模式:
User-agent: *
Disallow: /
User-agent: Googlebot
Allow: /
这会屏蔽 Bingbot、DuckDuckBot、Brave、Yandex、Naver 和所有 AI 搜索爬虫。为什么这很致命:Bing 的索引会被 ChatGPT 搜索、Copilot 和 DuckDuckGo 使用,因此这一个文件就会让网站从大多数 AI 回答中消失。
已发布的修复: 默认允许,只屏蔽私有路径。
User-agent: *
Allow: /
Disallow: /api/
Disallow: /app/
Disallow: /admin/
Sitemap: https://deployfast.dev/sitemap.xml
绝不要禁止访问 /_next/、/static/ 或 CSS/JS 路径。原因:Google 会使用这些文件渲染页面,屏蔽它们会导致页面布局无法正常显示。若要屏蔽 AI 训练爬虫,同时保留 AI 搜索,请使用 block-ai-scrapers 技能,而不是一概拒绝。
只禁止访问此仓库中确实存在的私有路径(/api/ 是,/app/ 仅当仪表板位于该路径时才是)。如果 curl -s https://deployfast.dev/sitemap.xml 未返回 XML,请在同一个 PR 中提交站点地图(Next.js 中为 app/sitemap.ts)。原因:指向 404 或 HTML 页面的一行 Sitemap: 会让修复白费。
1b. 语言区域泛滥
统计站点地图中的语言区域前缀(/de、/fr、/ru、/es,……)。没有站点地图时,请改为查看路由树(app/[locale]、i18n 配置、中间件中的语言区域列表)。
locale trees
├── >= 8 locales, or any locale with English strings left in templates, or hreflang not reciprocal
│ └── FAIL. Keep a locale only if it earns >= 5% of the default locale's clicks or revenue
│ AND you translate every string on it in this PR (max 3 kept).
│ Others: noindex + remove from sitemap, or 301 to the English page.
│ No locale qualifies → keep the default locale only, ship no hreflang.
└── <= 3 locales, fully translated, reciprocal hreflang + x-default → PASS
原因:只翻译了一半的语言区域路由树属于内容单薄的近似重复页面,会分散爬取预算,而且看起来像低质量机器翻译。互相引用意味着集合中的每个页面都列出其他所有页面,包括自身;单向 hreflang 会被忽略。
已发布的修复: 添加 hreflang 生成器,为保留的语言区域生成完整的互相引用集合;在布局中为移除的语言区域添加 noindex 保护;过滤站点地图,仅保留保留的语言区域。对于 Next.js redirects() 中的 301 重定向,每个移除的语言区域编写 2 条规则:/fr -> / 和 /fr/:path+ -> /:path+。原因:单条 /fr/:path* -> /:path* 规则会使裸路径 /fr 返回空的 Location 标头。Next.js 的 permanent: true 会返回 308,Google 将其视同 301。
1c. SafeSearch 降权
检查可爬取的 HTML 中是否有擦边或 NSFW 媒体:用户上传的头像和图库、挑逗性的图库主图、与成人内容相关的 UGC。比较开启与关闭 SafeSearch 时的 site:domain 结果数量。对于内容清白的产品,结果数量相差很大即为 FAIL。原因:Google 会在页面和网站层面判定露骨内容,而且许多用户默认开启 SafeSearch,因此少量露骨图片就可能过滤掉干净的核心词页面。
已发布的修复: 将 UGC 媒体页面设为 noindex 或置于身份验证之后;仅在成人页面上添加 <meta name="rating" content="adult">,以告知 Google 将这些页面单独处理,而不是据此评判整个网站。
1d. 全路径兜底软 404
curl -s -o /dev/null -w '%{http_code}\n' https://deployfast.dev/no-such-page-xyz # must print 404
任何 200 状态码都是 FAIL。通常的原因是顶层动态片段(app/[locale]/page.tsx、pages/[slug].tsx)会为所有路径渲染,包括在没有静态文件优先匹配时的 /sitemap.xml 和 /robots.txt。原因:每个拼写错误的 URL 都会变成可编入索引的首页副本,而且站点地图 URL 会返回 HTML。
已发布的修复: 在该片段上设置 export const dynamicParams = false(App Router)或 fallback: false(Pages Router),并对未知参数调用 notFound()。
2. 程序化 SEO 陷阱与矛盾的数量
列出每个动态路由,并从站点地图中为每个路由抽取 20 个在线 URL。没有站点地图:从 generateStaticParams 或路由读取的数据文件中枚举。
| 检查项 | 失败阈值 | 已交付的修复 |
|---|---|---|
| 结果页内容单薄 | 抽样页面中 > 10% 显示 0-1 条结果 | 当 results < 3 时设为 noindex, follow,并从站点地图中移除 |
| 数字或 ID slug | /near/18234、/tools/a7f3 | 根据实体名称生成 slug,将旧 ID 301 重定向 |
| 缺少交易意图词 | “Property near X” | 模板:“X 附近的出租公寓(42 套房源)” |
| FAQ 内容套话 | > 30% 的子页面 FAQ 答案文本相同 | 注入实体变量(数量、价格范围、热门项目),或删除该区块 |
| 搜索 URL 泛滥 | ?q=、?sort=、?page= URL 被索引 | 先设为 noindex,等它们从索引中消失后再设 Disallow |
| 数量相互矛盾 | H1、FAQ 和 llms.txt 中的数字不同 | 三者都读取同一个源常量 |
每项检查的重要性:
- 内容单薄的页面会让 Google 认为整个路由模式都价值较低,从而拖累同一模板下的优质页面。
- 搜索者会输入操作意图(“出租”“出售”“免费”),标题中没有这些词,就会输给包含这些词的结果。
- 先设
noindex,再设Disallow,因为禁止抓取的 URL 无法重新抓取以识别noindex,因此会继续留在索引中。 - Google 和大模型会引用某个数字。如果 H1 写着 1,200,FAQ 写着 900+,而
llms.txt写着 800,它们谁都不会相信。 - 静态的
public/llms.txt无法导入数量常量。将它替换为路由处理程序(app/llms.txt/route.ts),从与页面相同的常量渲染数量和价格,并删除静态文件。 - 从数据中推导常量(
TEMPLATES.length),不要手动输入数字。原因:只要有人在数据中添加一行,手动输入的数量就会立即过时。
3. 首屏布局与 Demo 墙修复
3a. 布局
在 1366x768 和 390x844 尺寸下加载营收页面和主要程序化模板。
first viewport
├── map, hero animation, or video takes >= 50% of the viewport
│ AND no result card or internal hub link is visible
│ └── FAIL. Collapse the map behind a "Show map" toggle, render cards first.
├── card attributes are icon-only SVGs (bed icon + "2")
│ └── FAIL. Write them as text: "2 bedrooms, 1 bathroom, 65 m²".
└── cards and hub links visible without scrolling → PASS
原因:爬虫和用户都会重点关注最先加载的内容,而仅含图标的属性对 Google 和读取 HTML 的大模型来说都是不可见文本。
3b. Demo 墙
primary CTA
├── only "Book a Demo" or "Talk to Sales"
├── or core value hidden behind "Create Account to View"
│ └── FAIL. Ship an instant interactive element on the page:
│ lookup, calculator, sample report, or live preview with no login.
│ Capture the email after the user sees their result.
└── visitor gets value in < 30 seconds without an account → PASS
原因:搜索访客往往毫无准备地到达,并在几秒内离开,而演示日历要求他们先腾出 30 分钟,才能看到任何内容。即时展示结果能转化同一位访客,并向 Google 提供参与度信号。
4. 虚假权威度与竞争对手优质链接情况核查
获取网站和 3 个竞争对手的 DR、org_keywords 以及干净的引荐域(ahrefs-research Workflow B:dofollow、正文内、每个域名 1 个、引荐页面流量 > 10)。
site profile
├── DR >= 40 and org_keywords < 100
│ └── FAIL: inflated. Links come from sitewides, widgets, or farms. Stop buying that kind.
├── competitor ranks top 3 on 25-40 clean editorial domains, site has fewer
│ └── That gap is the link target. Put the exact number in the roadmap.
└── clean domain count >= competitors' → links are not the bottleneck. Look at points 2, 3, 6.
原因:DR 很容易被人为抬高,造假也不花钱;精简型竞争对手排名所依靠的,是干净的编辑类域名。说出真实数字,团队才不会再追逐虚荣指标。
产品内置反向链接循环。 检查用户使用产品时是否会为产品带来链接:
- 在面向客户的输出(状态页面、表单、发票、报告)中添加
"Powered by [Brand]"或"Verified on [Brand]"徽章。 - 提供可公开分享的 URL(
/s/<id>、/r/<slug>),使其可被索引并带有品牌链接。 - 提供带有署名链接的可嵌入组件、地图或图表。
已交付的修复: 添加徽章组件和嵌入代码片段。使用品牌名称作为锚文本链接到首页。原因:Google 会将组件中包含关键词的锚文本视为链接操纵,而真实使用带来的品牌锚文本会在无需外联的情况下持续累积。
5. AI 搜索中的实体和价格可见性
for UA in GPTBot OAI-SearchBot PerplexityBot ClaudeBot; do
echo "$UA: $(curl -s -A "$UA" https://deployfast.dev/pricing \
| perl -0pe 's/<script\b.*?<\/script>//gs; s///gs; s/<head>.*?<\/head>//s' \
| grep -oE '\$[0-9][0-9,.]*' | sort -u | tr '\n' ' ')"
done
在 grep 前移除脚本、注释和 <head>。原因:Next.js 会在 <script> 标签中内联其 RSC 负载,其中 $1 和 $9 是引用,这会导致仅含 JavaScript 的价格页面通过原始 grep;React 还会将 ${price} 拆分为 $29,导致固定价格页面无法通过检查;而 <title> 中的价格并不是价格表。暂不部署:运行 next build && next start(或框架的生产服务器),并将循环指向 localhost。
pricing page raw HTML
├── no prices in the HTML (JS-only slider, client-fetched plans) → FAIL
├── docs or specs behind login → FAIL
├── crawler gets 403 / challenge page → FAIL (check WAF and bot rules)
└── plans, prices, and limits present as plain text → PASS
原因:大多数 AI 爬虫不会运行 JavaScript,因此仅含 JavaScript 的价格滑块会让 ChatGPT、Perplexity 和 Claude 认为产品没有公开价格,并推荐它们能读取到价格的竞品。
**已交付修复:**将价格表作为文本进行服务器端渲染,为核心功能发布公开文档,添加价格相同的 Product/Offer JSON-LD,并确保 llms.txt 与页面内容完全一致。
6. 商业页面的索引收录和内链现状
针对每个商业页面:
| 检查项 | 未通过标准 |
|---|---|
| 在站点地图中 | 缺失 |
已编入索引(GSC URL 检查或 site: 查询) | 未编入索引 |
| 规范链接 | 指向其他位置,或带有查询参数变体的页面缺少规范链接 |
| 从首页或主导航链接 | 否 |
| 指向该页面的正文上下文链接(不包括导航和页脚) | 少于 3 个 |
| 状态 | 存在任何重定向链或软 404 |
原因:商业页面通常藏在 4 次点击之后,而首页链接却指向博客,因此 Google 会为商业关键词排出博客页面,最终无法实现转化。
**已交付修复:**添加导航或首页链接、修正规范链接、添加站点地图条目。然后运行内链技能,从流量最高的帖子添加 3 个以上的上下文链接;该技能也采用排除导航的计数方式,因此其孤立页面列表与此检查结果一致。
必须交付的成果
1. 修复 PR
直接在代码库中应用所有 FATAL 和快速 REVENUE 修复:robots.txt、hreflang 和 noindex 防护、程序化标题模板、计数常量、可抓取的价格和卡片、徽章组件、内链。PR 描述格式:
## SEO Roast fixes
Verdict: <one blunt line>
### Fatal (fixed)
- robots.txt default-deny blocked Bing and AI crawlers → default-allow
### Revenue (fixed)
- /near/[slug] titles now "Condos for Rent near {city} ({count} listings)"
### Verify
- curl -A Bingbot https://<domain>/robots.txt
- view-source pricing page shows $ amounts
2. seo/roast-roadmap.md
按营收影响排序,而非按审计类别排序:
# SEO Roast Roadmap: invoicekit.io (2026-11-12)
Verdict: Google could see you. Nobody else could.
| # | Tier | Issue | Revenue impact | Fix | Owner | Status |
|---|---|---|---|---|---|---|
| 1 | FATAL | robots.txt blocked all non-Google crawlers | AI search + Bing traffic at 0 | default-allow | agent | shipped in PR |
| 2 | REVENUE | Pricing JS-only | Missing from AI recommendations | SSR table + JSON-LD | agent | shipped in PR |
| 3 | COMPOUNDING | 11 clean RDs vs competitor 34 | Money keyword stuck page 2 | 23-link gap plan | founder | next |
## Fluff (ignore until rows above ship)
- 14 images missing alt text
营收影响列需用一句简单的话说明该问题阻碍了哪些收入。不要使用严重程度评分或红绿灯颜色。
3. 可选的客户演示文稿
当要向创始人、董事会或客户展示 roast 时,可使用 GenPPT 将 seo/roast-roadmap.md 转换为 .pptx:每个 FATAL 问题各占一页,展示修复前后对比,然后附上路线图表格。
下一步
- **人工审查:**如需 Ilias 录制的 20 分钟直言不讳的网站视频 roast,请使用 SEO Roast。
- 弥补第 4 点中的链接差距:LinkDR(
https://linkdr.com/SKILL.md)可获取经过审核的 DR 30-60+ 编辑类链接和榜单提及,让 23 个链接的差距变成一笔订单,而不是耗费一个季度进行外联。 - 验证第 1a 点和第 5 点中的 AI 搜索恢复情况:AI SEO Tracker(MCP:
https://aiseotracker.com/api/agent/mcp)会追踪发布抓取和价格修复后,ChatGPT、Perplexity、Gemini 和 Google AI Overviews 是否开始引用你的页面。
完成清单
- FATAL 级问题已清零,所有修复都已包含在 PR 中
- 快速 REVENUE 修复已包含在 PR 中,其余事项已列在路线图顶部
-
seo/roast-roadmap.md已按营收影响排序并注明负责人 - PR 描述中的验证命令均已通过
- 空话内容只在底部列出一次,未作处理
相关内容
- 竞品差距和可靠的反向链接计算:ahrefs-research,https://il.ly/skills/ahrefs-research
- SERP 意图、主题聚类和 AI 引用来源:dataforseo-serp,https://il.ly/skills/dataforseo-serp
- 30 天内让一个商业页面登上搜索结果首页:blitz-seo,https://il.ly/skills/blitz-seo
- AI 爬虫策略:block-ai-scrapers,https://il.ly/skills/block-ai-scrapers
- 将博客流量引导至商业页面:internal-linking,https://il.ly/skills/internal-linking