健康度报告编排前五个专项审计,并读入 GEO 意图注册表提供的覆盖、一致性与引用数据,输出注册表完整性、页面覆盖率、内链闭环率和 GEO 就绪度四个指标,以及趋势对比和按 ROI 排序的行动清单。
AI Skill:注册表健康度报告——全站 SEO 状态一键快照
这个 Skill 和前面的关系
前五个 Skill 是专项检查,各查一个维度,输出的是问题清单。随后建立的 GEO 意图注册表,又补上了问题覆盖、一致性与引用实测三类站级数据。
这个 Skill 是编排层:按顺序调用专项审计,并读入 GEO 意图注册表的审计结果,把它们聚合成四个量化指标,输出一份可以直接给自己或团队看的季度报告。
第45篇 注册表审计 ─┐
第46篇 覆盖度审计 ─┤
第47篇 Cannibalization ─┤
第48篇 内链流审计 ─┼─→ 本 Skill 编排 ─→ 健康度报告
第49篇 GEO 结构审计 ─┘ (聚合 + 量化 + 排序)
第73–79篇 GEO 站级控制层 ───→ 补充意图覆盖、一致性与引用数据
为什么需要单独一个编排 Skill:单个专项报告告诉你“哪里有问题”,健康度报告告诉你“整体状态如何、这个季度该优先做什么”。后者才是决策依据。
四个量化指标
指标的价值在于可对比——这个季度和上个季度比,是变好还是变差。
指标一:注册表完整性(Registry Integrity)
计算:(1 - error数 / 注册表行数) × 100%
数据来源:第45篇 registry-lint.mjs
目标值:100%(error 必须为 0)
指标二:页面覆盖率(Page Coverage)
计算:已建页面数 / 注册表规划页面数 × 100%
数据来源:第46篇 coverage-audit.mjs
目标值:≥ 85%(留 15% 作为规划中的增长空间)
附加指标:未纳管页面数(应为 0)
指标三:内链闭环率(Link Flow Integrity)
计算:有精准锚文本内链的 Cluster 数 / 总 Cluster 数 × 100%
数据来源:第48篇 link-flow-audit.mjs
目标值:100%(每个 Cluster 都必须有)
指标四:GEO 就绪度(GEO Readiness)
计算:加权评分
致命项通过(robots + SSR):40 分(不通过则总分为 0)
FAQ 规范符合率:20 分
参数表规范符合率:20 分
Schema 完整率:20 分
数据来源:第49篇 geo-audit.mjs
目标值:≥ 85 分
GEO 意图注册表现在是这项指标的正式期望值来源。
上面这个算的是“结构合规率”——它只能说明格式对不对,说明不了该答的问题答了没有。有了注册表当期望值之后,改成三个串联的比率:
GEO 就绪度 = 落地率 × 一致率 × 引用率
落地率 = 已落地的 active 意图 / 全部 active 意图(排除 self_answerable: false)
一致率 = 无 error 的意图 / 已落地意图
引用率 = 实测 cited 的意图 / 本季度实测集(20–40 条)
数据来源:第78篇 geo-registry-audit.mjs + 季度实测记录
为什么相乘而不是分开列:三者是串联关系——没落地就谈不上一致,不一致就大概率不会被引。任何一环塌了整体就塌了,相乘能反映这一点,分开列会掩盖它。详见GEO 审计升级。第 49 篇负责结构层,第 78 篇负责意图覆盖与一致性,二者的结果在这里汇总。
Skill 说明书
# Skill:注册表健康度报告
## 何时使用
- 每季度定期执行(推荐固定日期,如每季度首个周一)
- 需要向团队/管理层汇报 SEO 状态时
- 大版本改动后的整体验证
## 前置条件
以下五个脚本必须已就位:
- scripts/registry-lint.mjs(第45篇)
- scripts/coverage-audit.mjs(第46篇)
- scripts/cannibalization-detect.mjs(第47篇,需 GSC 数据)
- scripts/link-flow-audit.mjs(第48篇)
- scripts/geo-audit.mjs(第49篇)
## 执行步骤
### Step 1:按顺序执行五个脚本
执行 `scripts/health-report.mjs`,它会依次调用五个脚本
并把结果聚合到一个 JSON。
注意顺序不能变——GEO 审计的致命项如果不通过,
后续指标的意义会打折扣,报告中需要标注这一点。
### Step 2:读取历史数据做趋势对比
读取 `reports/health-history.json`(如存在),
取上一期的四个指标值,计算变化量。
首次运行时无历史数据,趋势列标注"首次"。
### Step 3:行动项排序(你来判断)
把五个专项报告的所有 error 和 warn 汇总,按以下规则排序:
**排序权重**:
1. GEO 致命项(robots 屏蔽、客户端渲染)→ 最高优先级
2. 注册表 error(唯一性冲突)→ 高
3. 已确认的 Cannibalization(有 GSC 证据)→ 高
4. 内链完全断流的 Cluster → 中高
5. 未纳管页面 → 中高
6. 无效锚文本 → 中
7. FAQ/参数表格式问题 → 中
8. 部分匹配锚文本、缺英制单位 → 低
**只输出 Top 5**。超过 5 项的行动清单在实践中执行不完,
剩余项放在附录里列出数量即可。
每个行动项必须包含:
- 具体动作(可以直接执行的,不是"优化 XX")
- 涉及的文件数
- 预估工时
- 预期影响(哪个指标会改善多少)
### Step 4:说明不需要处理的项
这一节容易被省略,但很重要——避免下个季度重复分析同样的
假阳性。列出本次判定为"不需处理"的项及原因。
## 输出格式
SEO 健康度报告
生成日期:[YYYY-MM-DD] 对比基准:[上期日期 或 首次]
指标总览
| 指标 | 当前 | 上期 | 变化 | 目标 | 状态 |
|---|---|---|---|---|---|
| 注册表完整性 | 96% | 88% | ↑8 | 100% | ⚠️ |
| 页面覆盖率 | 78% | 65% | ↑13 | ≥85% | ⚠️ |
| 内链闭环率 | 84% | 72% | ↑12 | 100% | ⚠️ |
| GEO 就绪度 | 92 | 70 | ↑22 | ≥85 | ✅ |
整体判断:[一句话总结,如“三项改善,注册表完整性距目标仅差 2 项 error”]
本季度 Top 5 行动项
1. 修复注册表唯一性冲突(2 项 error)
- 动作:
/about/移除 PKWcentrifugal pump manufacturer, 改为about aquaflow industrial,NKW 加入原词/products/pump-factory/301 重定向到/products/centrifugal-pumps/
- 涉及:2 个页面 + 注册表 2 行
- 预估工时:1 小时
- 预期影响:注册表完整性 96% → 100%
2. 补充 5 个 Cluster 的 Pillar 内链
- 动作:在以下页面正文第二段添加指向对应 Pillar 的内链,
锚文本使用 Pillar PKW:
- /applications/centrifugal-pump-mining/
- /applications/centrifugal-pump-hvac/
- (其余 3 个列出)
- 涉及:5 个页面
- 预估工时:1.5 小时
- 预期影响:内链闭环率 84% → 100%
3. 处理 3 个未纳管页面
(同样格式)
4. 建 Top 3 待建页面
(同样格式,附建议的 PKW 和内容要点)
5. FAQ 自包含性修复(8 处)
(同样格式)
Top 5 合计预估工时:[N] 小时
判定为不需处理([N] 项)
1. query industrial pump specifications 的多页面曝光
- 判定:假阳性
- 原因:CP-100 排名稳定 Top 5(4.1),CP-200 曝光占比仅 5%, 属正常的多型号覆盖
- 下期处理:无需重复分析
2. Google-Extended 未在 robots.txt 显式声明
- 判定:可接受
- 原因:
User-agent: *允许,默认放行有效 - 下期处理:可选优化,非必需
附录:剩余问题数量
- 锚文本部分匹配:12 项(低优先级)
- 参数表缺英制单位:18 项(低优先级)
- 未被索引的已建页面:4 项(需再观察 4 周)
指标计算依据
[附上四个指标的原始数据,便于核对]
## 禁止行为
- Top 5 行动项不要超过 5 项
- 不要输出"建议持续优化"这类没有具体动作的行动项
- 不要跳过"判定为不需处理"这一节
- GEO 致命项不通过时,必须在报告开头醒目标注,
且此时其他三个指标标注为"参考值"
编排脚本
// scripts/health-report.mjs
import { execSync } from 'child_process';
import fs from 'fs/promises';
import path from 'path';
const REPORTS_DIR = 'reports';
const HISTORY_FILE = path.join(REPORTS_DIR, 'health-history.json');
function run(script, args = '') {
try {
const out = execSync(`node ${script} ${args}`, {
encoding: 'utf8',
maxBuffer: 20 * 1024 * 1024,
});
return JSON.parse(out);
} catch (e) {
// geo-audit 在致命项失败时 exit(1),但 stdout 仍有内容
if (e.stdout) {
try { return JSON.parse(e.stdout); } catch {}
}
return { error: e.message, script };
}
}
// 依次执行五个专项审计
const registry = run('scripts/registry-lint.mjs');
const coverage = run('scripts/coverage-audit.mjs');
const linkFlow = run('scripts/link-flow-audit.mjs');
const geo = run('scripts/geo-audit.mjs');
// Cannibalization 需要 GSC 数据,可能不存在
let cannibalization = null;
try {
await fs.access('gsc-query-page.csv');
cannibalization = run('scripts/cannibalization-detect.mjs');
} catch {
cannibalization = { skipped: true, reason: 'gsc-query-page.csv not found' };
}
// ── 计算四个指标 ──
const registryIntegrity = registry.summary
? ((1 - registry.summary.errorCount / registry.summary.totalRows) * 100)
: null;
const pageCoverage = coverage.summary
? (coverage.summary.covered / coverage.summary.registryPages * 100)
: null;
const linkFlowIntegrity = linkFlow.summary
? (linkFlow.summary.clustersWithLink / linkFlow.summary.clusterCount * 100)
: null;
// GEO 就绪度:加权评分
function calcGeoScore(geo) {
if (geo.criticalFailure) return 0;
const s = geo.summary;
if (!s) return null;
const faqScore = s.faqCount > 0
? (1 - s.faqHeadingIssues / s.faqCount) * 20 : 20;
const tableScore = s.pagesChecked > 0
? (1 - s.tableCaptionIssues / s.pagesChecked) * 20 : 20;
const schemaScore = s.pagesChecked > 0
? (1 - s.schemaIssues / s.pagesChecked) * 20 : 20;
return Math.round(40 + faqScore + tableScore + schemaScore);
}
const metrics = {
date: new Date().toISOString().split('T')[0],
registryIntegrity: registryIntegrity?.toFixed(1),
pageCoverage: pageCoverage?.toFixed(1),
linkFlowIntegrity: linkFlowIntegrity?.toFixed(1),
geoReadiness: calcGeoScore(geo),
};
// ── 读取历史数据做趋势对比 ──
let history = [];
try {
history = JSON.parse(await fs.readFile(HISTORY_FILE, 'utf8'));
} catch {}
const previous = history[history.length - 1] ?? null;
// ── 追加本期数据到历史 ──
await fs.mkdir(REPORTS_DIR, { recursive: true });
history.push(metrics);
await fs.writeFile(HISTORY_FILE, JSON.stringify(history, null, 2));
// ── 输出聚合结果,交给模型生成报告 ──
console.log(JSON.stringify({
metrics,
previous,
criticalFailure: geo.criticalFailure ?? false,
details: {
registry,
coverage,
linkFlow,
geo,
cannibalization,
},
}, null, 2));
执行节奏建议
| 频率 | 执行内容 | 耗时 |
|---|---|---|
| 每次新建页面 | 只跑注册表审计(第45篇) | 2 分钟 |
| 每月 | 覆盖度审计(第46篇) | 10 分钟 |
| 每季度 | 完整健康度报告(本篇) | 1 小时(含处理 Top 5) |
| 排名异常时 | Cannibalization 诊断(第47篇) | 30 分钟 |
不要每周跑完整报告——SEO 的变化周期是月级的,周级数据噪音大于信号,反而会导致过度调整。
审计体系六篇完成。这六个 Skill 覆盖了从规划到发布到持续运营的全部检查点:
| Skill | 检查维度 | 频率 |
|---|---|---|
| 第45篇 注册表审计 | 规划一致性 | 每次建页 |
| 第46篇 覆盖度审计 | 规划 vs 实际 | 每月 |
| 第47篇 Cannibalization | 实际竞争 | 排名异常时 |
| 第48篇 内链流审计 | 架构闭环 | 每季度 |
| 第49篇 GEO 覆盖审计 | AI 可见性 | 每季度 |
| 第50篇 健康度报告 | 编排与决策 | 每季度 |
下一阶段是辅助 Skills(十一|51–56篇),从“发现问题”转向“生产内容”。
→ AI Skill:关键词聚类与商业/工程/知识意图分类
RELATED / 相关推荐
接着读这些
按同一分类、系列与标签为你挑选。
AI Skill:页面覆盖度审计——找出注册表中无对应页面的词
注册表里躺着一批词,但对应的页面还没建——这是最容易被遗忘的增长机会。这个 Skill 用脚本做注册表与实际路由的差集比对,模型负责按业务价值排序并输出可执行的建页清单。
AI Skill:注册表审计——关键词抢词与归属冲突检测
把注册表的唯一性约束检查固化成一个可复用 Skill:确定性脚本负责扫描注册表和页面内容,模型负责判断语义级抢词和给出合并建议,中间用一份写清判定规则和输出格式的说明书连接。
GEO 审计升级:从「结构合规」到「有没有被引用」
之前那个 GEO 覆盖审计 Skill 只能查结构,查不了覆盖——因为它没有期望值可比。补上意图注册表之后,审计从一层变三层:结构、覆盖与一致性、引用实测。其中复述块与主答块的一致性检查是纯确定性的,脚本能百分之百判定,这是升级带来的最大收益。