9.4 KiB
Lint 协议
Lint 不只是检查问题,更重要的是治理——合并、归档、修复。防止 wiki 变成信息坟场。
流程
1. 扫描全部页面
├─ 读 meta.yaml 获取 wiki 基本信息
├─ 读 index.md 获取页面列表
├─ 遍历 sources/ entities/ concepts/ analyses/ 目录
└─ 对比 index 与实际文件(发现 index 遗漏或多余的条目)
2. 逐项检查(7 项)
├─ 2.1 Validation — 页面格式是否合规
├─ 2.2 Contradiction — 不同页面之间是否有矛盾
├─ 2.3 Duplication — 是否有重复页面
├─ 2.4 Orphan — 是否有孤立页面
├─ 2.5 Broken Link — 是否有断链
├─ 2.6 Staleness — 是否有过时内容
└─ 2.7 Coverage — 知识覆盖是否有明显缺口
3. 执行修复(自动 + 需确认)
├─ 自动修复:index 同步、断链修复、格式补全
└─ 需确认:合并重复、归档过时、矛盾标注
4. 输出健康报告
5. 更新 meta.yaml 统计
6. 追加 log.md
两档执行
Lint 分两档。结构化检查可以自动跑完全量页面,语义检查需要 Agent 逐页理解内容,代价随页面数线性增长。
| 档位 | 包含检查项 | 执行方式 | 代价 |
|---|---|---|---|
| 结构档(必跑) | Validation, Orphan, Broken Link, Staleness | 全量扫描,确定性输出 | O(N) 文件读取 |
| 语义档(按需) | Contradiction, Duplication, Coverage | Agent 抽样或用户指定范围 | O(N²) 语义比较 |
默认行为:lint 只跑结构档。用户说"深度 lint"或"检查矛盾"时跑语义档。
语义档的范围控制:
- wiki < 50 页:全量扫描
- wiki 50-200 页:只扫最近 30 天内 ingest 触及的页面 + 其关联页面
- wiki > 200 页:用户必须指定范围(如"检查 entities/ 下的矛盾")
7 项检查细则
2.1 Validation(格式校验)— 结构档
按 wiki-format.md 的 Validation Rules 检查每个页面:
| 规则 | 自动修复? |
|---|---|
| frontmatter 缺字段 | 是 — 补充默认值(type=entity, confidence=medium) |
| type 值非法 | 否 — 报告,等用户确认 |
| sources 为空(非 source 类型) | 否 — 报告,建议关联 |
| slug 与文件名不一致 | 否 — 报告 |
| 日期格式错误 | 是 — 尝试自动修正 |
2.2 Contradiction(矛盾检测)— 语义档
扫描实体页和概念页,检查:
- 同一事实在不同页面有不同数值/结论
- 同一实体页内有
contested标注——检查是否有新 source 可以解决
发现矛盾:
- alpha-corp.md 说管理规模 1200 亿(来源:2026-policy-doc)
- industry-overview.md 说某机构市场份额对应约 1000 亿(来源:industry-report-2025)
→ 标注两个页面 confidence → contested
2.3 Duplication(重复检测)— 语义档
检查是否有两个页面描述同一个实体/概念:
- 文件名相似(如
alpha-corp.md和alpha-annuity.md) - 标题相似
- 正文内容重叠度高
处理:合并为一个页面,保留更完整的版本,将另一个的独有信息合并进来。需用户确认。
2.4 Orphan(孤页检测)— 结构档
页面没有任何入链(没有别的页面通过 [[slug]] 引用它)。
处理:
- 检查是否有应该引用它的页面 → 是 → 添加 wikilink
- 仍然无关联 → 建议归档或删除
2.5 Broken Link(断链检测)— 结构档
页面中有 [[slug]] 但对应文件不存在。
处理:
- 如果能推断应该是哪个页面(slug 拼写接近)→ 修正 wikilink
- 否则 → 创建 stub 页面(只有 frontmatter + "待补充"),或移除断链
2.6 Staleness(过时检测)— 结构档
| 条件 | 判定 |
|---|---|
页面 updated 距今 > 6 个月,且 confidence ≤ medium |
过时候选 |
| 页面的所有 sources 都 > 12 个月 | 过时候选 |
| 页面 confidence 为 low 且从未被 ingest 强化过 | 过时候选 |
处理:标注"待验证"或建议归档。不自动删除。
2.7 Coverage(覆盖度评估)— 语义档
不是找错误,而是找缺口。分 5 类检测:
Gap-1: Page Missing(页面缺失)
被其他页面通过 [[slug]] 引用但实际文件不存在。与 Broken Link 不同——Broken Link 是链接拼写错误,Page Missing 是知识本身缺失。
- 检测:遍历所有 wikilink,找到指向不存在页面的引用
- 判定:3+ 个页面引用同一个不存在的 slug → 不是拼写错误,是知识缺口
- 输出:
{ gap_type: "page_missing", slug: "xxx", referenced_by: [...] }
Gap-2: Concept Missing(概念缺失)
多个实体页面反复提到同一术语/概念,但没有独立的概念页解释它。
- 检测:在 entities/ 正文中提取高频术语,检查 concepts/ 中是否有对应页面
- 阈值:某术语在 3+ 个不同页面出现但无独立概念页 → 缺口
- 输出:
{ gap_type: "concept_missing", term: "xxx", mentioned_in: [...] }
Gap-3: Data Missing(数据缺失)
实体页面提到某个指标但 data.db 中没有对应数值,或数值缺少关键维度(没有 period、没有来源)。
- 检测:扫描页面正文中的指标名称,交叉检查 data.db
- 输出:
{ gap_type: "data_missing", page: "xxx", field: "xxx" }
Gap-4: Single Source(来源单一)
页面 confidence 依赖唯一来源,且该来源不是一手/权威来源。
- 检测:sources 列表长度 = 1 且 source_type 不是"一手"或"二手·权威"
- 输出:
{ gap_type: "single_source", page: "xxx", current_source: "xxx" }
Gap-5: Outdated(过时待更新)
与 Staleness 不同——Staleness 标注过时候选,Outdated 侧重数据已有更新时点但 wiki 未跟上。
- 检测:data.db 中数据的 period 距今 > 12 个月,且该领域通常有年度更新
- 输出:
{ gap_type: "outdated", page: "xxx", field: "xxx", last_period: "xxx" }
Gap-6: Validator Gap(校验器缺口)— 仅当 wiki 声明了 validator 时
如果 meta.yaml 声明了 seed 且对应种子文件指向了 validator,Coverage 额外运行校验器检查:
- 检测:调用校验器(如 FIBO SPARQL)查询实体类型的必要关系(
someValuesFrom约束),对比 wiki 中已建立的关系 - 示例:FIBO 说 PensionFund 必须有 Trustee 关系,wiki 中该实体页缺了这条关系 → 缺口
- 输出:
{ gap_type: "validator_gap", page: "xxx", missing_relation: "hasTrustee", standard: "FIBO" } - 降级:校验器不可达时静默跳过,在报告中注明"外部校验器不可达,已跳过"
这一类缺口检测的不是"信息缺失",而是"逻辑不完整"——你说这是一个 PensionFund,但按行业标准定义,它至少还需要管理人、托管人、监管方。
覆盖度启发式(补充)
以上 6 类之外,保留原有启发式检查:
- 某个实体被 5 个其他页面引用,但自身内容很薄(< 100 字)→ 建议深化
- 某个类型(如 concepts/)页面很少,但 entities/ 页面很多 → 建议提炼概念
- source 页面多但 analysis 页面少 → 建议做综合分析
健康报告格式
## Wiki 健康报告:{主题名}
生成时间:{日期}
### 概况
- 页面总数:42(sources: 12, entities: 15, concepts: 10, analyses: 5)
- 健康度:良好 / 需要关注 / 需要干预
- confidence 分布:high 30 / medium 8 / low 2 / contested 2
### 本次修复
- [自动] index.md 同步(新增 2 个遗漏条目)
- [自动] 修复 1 个断链(portable-annuity → portable-annuity-scheme)
- [需确认] 合并 alpha-corp.md 和 alpha-annuity.md(疑似重复)
### 待处理问题
- 矛盾:2 处(列出具体页面和矛盾点)
- 过时:1 页建议归档(portfolio-category,6 个月未更新)
### 覆盖度建议
- entities/beta-corp.md 内容较薄(仅 50 字),被 4 个页面引用,建议 ingest 更多材料
- concepts/ 只有 10 页,而 entities/ 有 15 页,建议提炼更多概念页
### 统计
- 最活跃 source:hrss-2026-policy(被 8 个页面引用)
- 最孤立 entity:portfolio-category(0 个入链)
- 最近 ingest:2026-04-06(3 天前)
缺口报告格式(供 deep-dive 使用)
当 Coverage 检查由 deep-dive 触发时,除健康报告外还输出结构化缺口报告:
## Gap Report: {topic}
Generated: {date}
Scope: {全量 | 指定范围}
### Gaps Found: {N}
| # | Category | Target | Detail | Priority | Search Direction |
|---|----------|--------|--------|----------|------------------|
| 1 | page_missing | portable-annuity | 被 4 个页面引用 | high | 搜索"可携带企业年金 政策" |
| 2 | concept_missing | 受托人资格 | 在 5 个实体页中提到 | high | 搜索"企业年金受托人资格 要求" |
| 3 | single_source | alpha-corp | 仅有来源: industry-report-2025 | medium | 搜索"Alpha Corp 养老金 年报" |
### Priority Rules
- high: page_missing(3+ 引用)、concept_missing(5+ 提及)
- medium: single_source、data_missing
- low: outdated(数据年龄 12-24 个月)
范围控制(deep-dive 场景)
deep-dive 触发时,Coverage 接受可选范围参数:
deep-dive {topic}→ 限定在指定 wikideep-dive {topic} entities/→ 限定在子目录deep-dive {topic} --max-gaps N→ 限制最大缺口数(默认 10)- 无范围指定时,按语义档的范围控制规则执行(<50 页全量,50-200 页近 30 天,>200 页要求指定)