覆盖度审计做三个方向的差集:注册表有但站点无(待建页面)、站点有但注册表无(未纳管页面,风险最高)、注册表有页面但未被索引(GSC 验证)。脚本负责集合运算,模型负责按 priority×搜索量排序并输出建页优先级清单。
AI Skill:页面覆盖度审计——找出注册表中无对应页面的词
三个方向的差集
覆盖度审计不只是“哪些词还没页面”,而是三个方向的完整比对:
注册表 实际站点
┌──────────────┐ ┌──────────────┐
│ │ │ │
│ A 区 │ B 区 │ C 区 │
│ 有词无页面 │ 已覆盖 │ 有页面无词 │
│ │ │ │
└──────────────┘ └──────────────┘
| 区域 | 含义 | 风险/机会 |
|---|---|---|
| A 区 | 注册表有词,站点无页面 | 机会:待建页面清单 |
| B 区 | 两边都有 | 正常,但要验证是否被 GSC 索引 |
| C 区 | 站点有页面,注册表无记录 | 风险最高:未纳管页面,可能正在抢词 |
C 区最危险:一个没有在注册表登记的页面,意味着它的 PKW 和 NKW 都没有定义,可能正在和 Pillar 页抢词而无人知晓。
Skill 说明书
# Skill:页面覆盖度审计
## 何时使用
- 用户要求检查内容缺口
- 规划下一季度内容日历前
- 定期(每月)覆盖度检查
## 输入
- `registry.json`(注册表)
- `sitemap.xml` 的 URL 或本地路径(实际站点页面清单)
- 可选:GSC 导出的 Coverage 报告 CSV(验证索引状态)
## 执行步骤
### Step 1:运行确定性脚本
执行 `scripts/coverage-audit.mjs`,获得三个区的 URL 清单。
必须跑脚本,不要人工比对 sitemap。
### Step 2:C 区优先处理(你来判断)
对每个未纳管页面(C 区),判断:
1. 这个页面应该存在吗?
- 应该 → 输出补登注册表的建议(含推断的 PKW/intent_type/page_type)
- 不应该(测试页/重复页/过时页)→ 建议 noindex 或 301 重定向
2. 如果应该存在,它的 PKW 是否与已有页面冲突?
- 冲突 → 标为 error,需要先解决冲突再补登
### Step 3:A 区排序(你来判断)
对待建页面清单,按以下加权排序:
- priority 字段(注册表已有,权重 40%)
- monthly_volume(如有,权重 30%)
- 意图类型(commercial > engineering > informational,权重 20%)
- 是否有对应的 Pillar 已上线(有 Pillar 的 Cluster 优先,权重 10%)
输出 Top 10 待建页面,每项给出建议的 page_type 和内容要点。
### Step 4:B 区索引验证(如提供 GSC 数据)
比对 B 区页面与 GSC Coverage 报告:
- 已索引 → 通过
- 未索引(Discovered/Crawled but not indexed)→ 标为 warn,
可能原因:内容太薄、无内链、canonical 指向别处
## 输出格式
页面覆盖度审计报告
生成时间:[YYYY-MM-DD] 注册表词数:[N] 站点页面数:[N] 覆盖率:[N]%(B 区 / 注册表总数)
ERROR:未纳管页面且存在词冲突([N] 项)
E1. /products/pump-manufacturer-china/
- 未在注册表登记
- 推断 PKW:
pump manufacturer china - 冲突:与 /products/centrifugal-pumps/ 的 PKW
centrifugal pump manufacturer语义重叠 - 建议动作:301 重定向到 /products/centrifugal-pumps/
WARN:未纳管页面([N] 项)
W1. /blog/pump-maintenance-tips/
- 未在注册表登记
- 推断 PKW:
centrifugal pump maintenance - 推断 intent_type:informational
- 推断 page_type:cluster-resource
- 建议动作:补登注册表,NKW 加入
manufacturer, supplier, OEM, buy, quote
待建页面清单(Top 10,按优先级)
| # | PKW | intent | page_type | priority | 月搜索量 | 建议 slug |
|---|---|---|---|---|---|---|
| 1 | centrifugal pump for mining dewatering | engineering | cluster-app | 5 | 320 | /applications/centrifugal-pump-mining/ |
| 2 | … |
每项附内容要点(3–5 条)。
已覆盖但未被索引([N] 项,如有 GSC 数据)
/applications/pump-hvac/
- GSC 状态:Crawled - currently not indexed
- 可能原因:内容 320 词(偏薄),无内链指向该页
- 建议动作:扩充内容至 800+ 词,从 Pillar 页添加内链
## 禁止行为
- 不要自动创建页面(只输出清单)
- 不要跳过 C 区分析——未纳管页面是最高优先级
- 待建页面清单不要超过 10 项(避免清单太长无法执行)
确定性脚本
// scripts/coverage-audit.mjs
import fs from 'fs/promises';
const registry = JSON.parse(await fs.readFile('registry.json', 'utf8'));
// 从 sitemap 提取实际页面 URL
async function getSitemapUrls(sitemapPath) {
const xml = await fs.readFile(sitemapPath, 'utf8');
const matches = [...xml.matchAll(/<loc>(.*?)<\/loc>/g)];
return matches.map(m => {
const url = new URL(m[1]);
return url.pathname;
});
}
const sitemapUrls = await getSitemapUrls('dist/sitemap-0.xml');
const sitemapSet = new Set(sitemapUrls);
// 注册表中的 page_slug 集合(去重,因为一个页面可以有多行)
const registrySlugs = new Set(
registry
.filter(r => r.status === 'active')
.map(r => r.page_slug)
);
// A 区:注册表有,站点无
const missingPages = [...registrySlugs].filter(s => !sitemapSet.has(s));
// C 区:站点有,注册表无
const unmanagedPages = sitemapUrls.filter(u => !registrySlugs.has(u));
// B 区:两边都有
const covered = [...registrySlugs].filter(s => sitemapSet.has(s));
// A 区页面的详细信息(含 priority 和搜索量,供模型排序)
const missingDetails = missingPages.map(slug => {
const rows = registry.filter(r => r.page_slug === slug);
return {
slug,
pkw: rows[0]?.pkw,
intent: rows[0]?.intent_type,
pageType: rows[0]?.page_type,
priority: rows[0]?.priority,
monthlyVolume: rows[0]?.monthly_volume ?? null,
allKeywords: rows.map(r => r.keyword),
};
});
console.log(JSON.stringify({
summary: {
registryPages: registrySlugs.size,
sitemapPages: sitemapUrls.length,
covered: covered.length,
missing: missingPages.length,
unmanaged: unmanagedPages.length,
coverageRate: ((covered.length / registrySlugs.size) * 100).toFixed(1) + '%',
},
// A 区:待建页面
missingPages: missingDetails,
// C 区:未纳管页面(最高优先级)
unmanagedPages,
// B 区:已覆盖(供 GSC 索引状态验证)
coveredPages: covered,
}, null, 2));
与死链审计的边界
站内已有的「Sitemap × 实际路由差异审计」Skill 检查的是技术层面的一致性(sitemap 里有但实际 404、实际存在但 sitemap 遗漏)。
覆盖度审计检查的是策略层面的一致性(注册表规划了但没建、建了但没规划)。
两者输入不同、判定标准不同、修复动作不同——不要合并成一个 Skill,会让说明书的判定规则变得模糊。
GSC 索引验证的补充说明
B 区页面存在不等于被索引。常见的“建了但没进索引”原因:
| GSC 状态 | 含义 | 修复方向 |
|---|---|---|
| Discovered - currently not indexed | 发现了但没爬 | 增加内链,提交 URL |
| Crawled - currently not indexed | 爬了但没收录 | 内容太薄或价值不足,扩充内容 |
| Duplicate without user-selected canonical | 判定为重复内容 | 检查是否与其他页面内容过于相似 |
| Excluded by ‘noindex’ tag | 被 noindex 了 | 检查是否误加了 noindex |
pSEO 批量生成的页面最容易出现 Crawled - currently not indexed——因为内容相似度高。这也是为什么第27篇强调每个场景页必须有独有的技术内容。
→ AI Skill:Cannibalization 诊断——同站竞争页面识别
RELATED / 相关推荐
接着读这些
按同一分类、系列与标签为你挑选。
AI Skill:注册表健康度报告——全站 SEO 状态一键快照
前五个审计 Skill 各查一个维度,GEO 意图注册表补充覆盖、一致性与引用数据;这个 Skill 把它们编排成一条流水线,产出可直接汇报的季度健康度报告。
GEO 审计升级:从「结构合规」到「有没有被引用」
之前那个 GEO 覆盖审计 Skill 只能查结构,查不了覆盖——因为它没有期望值可比。补上意图注册表之后,审计从一层变三层:结构、覆盖与一致性、引用实测。其中复述块与主答块的一致性检查是纯确定性的,脚本能百分之百判定,这是升级带来的最大收益。
AI Skill:GEO 覆盖审计——多语言与 AI 可见性缺口分析
GEO 优化做了没做、做到什么程度,肉眼看不出来。这个 Skill 把第 40–44 篇的所有 GEO 规范转成可自动检查的规则:FAQ 是否自包含、参数表是否语义化、hreflang 是否双向、AI 爬虫是否被放行,并输出优先级排序的缺口清单。