design-v2 · validation-rules-v2.md
Markdown 原文逐字发布,未经渲染加工。版本 8508aeb。
# EXO-TRACE 校验规则清单 v2(validation-rules-v2)
> 状态:设计稿,待站点所有者批准 | 依据:审计 §P0-4、§15.1–15.6、§十六 | 日期:2026-08-02
> 覆盖:现有 `scripts/validate.mjs` + `scripts/build.mjs` + `scripts/check-links.mjs` 全部规则的编号化,以及审计 §15 验收标准的新增规则。
> 状态机与角色(R1–R9、S1–S12)定义见同目录 `publication-gate-v2.md`。
---
## 1. 通用约定
### 1.1 severity 定义
| severity | 含义 | 阻断构建 |
|---|---|---|
| error | 违反硬性规范 | 是(除非持有效 waiver,且该规则可豁免) |
| warning | 技术债,必须逐项公开并可追踪 | 否 |
| info | 统计与提示 | 否 |
### 1.2 check_type(审计 §15.4/§15.5 有人工项,必须显式区分)
| 类型 | 执行方式 | 阻断点 |
|---|---|---|
| auto | CI 机器检查 | 构建 |
| semi | 脚本产出候选 + 人工确认 | 构建(以人工确认结果为准) |
| manual | QA 清单,结果以 ReviewEvent 记录 | **发布批次**(不阻断日常构建,但阻断该批案例晋级 S10) |
理由:把「移动端不拥挤」这类不可机检的验收假装成 auto 规则,只会产生永远绿灯的假检查。
### 1.3 报告格式(审计 §P0-4 指定字段,逐条输出)
`data/validation-report.json` 每条记录:
```text
rule_id · severity · object_type(case|claim|source|media|rights|page|site)
object_id · field · message · first_seen · last_seen
waiver(null|waiver_id) · owner · resolution_status(open|acknowledged|waived|fixed|stale)
```
- `first_seen/last_seen` 按 rule_id+object_id+field 键跨构建持久化(存 `data/validation-history.json`);理由:审计 §P0-4 要求可见「修复截止时间」与追踪,无历史即无追踪。
- 报告全文公开于 `/quality.html`,可按 rule_id / severity / object 筛选(现页面已存在,升级为逐字段展示)。
- 现 validate.mjs 用 `classify(msg)` 从消息文本反推规则名——废除,每条 err/warn 调用点直接携带 rule_id。理由:文本匹配分类是审计 §P0-4「不可追踪」问题的技术根源。
### 1.4 豁免机制(waiver)
```text
waiver_id · rule_id · object_id · reason · granted_by(须为 R9)
granted_at · expires(必填,≤180 天) · review_note
```
- 存 `data/waivers.json`,随 validation-report 一并公开;到期未续 → 违例恢复阻断。
- **可豁免**:标记 `waiver=R9` 的规则,由 R9 批准并公示。
- **不可豁免**(`waiver=—`):涉及权利硬门禁、敏感材料、概念图混入证据、AI 冒充审核者、X 分门槛的规则。理由:现行校验器已承诺「门槛规则不允许手工豁免」(validate.mjs 头注释),v2 不后退。
- warning 不需要 waiver,但必须有 owner 与 resolution_status。
### 1.5 rule_id 体系
`前缀-三位数`。前缀:GATE 发布门禁 / SRC 来源 / CLM 主张 / SCR 评分 / TXT 措辞 / MOT 母题 / ONT 本体分类 / REL 关系引用 / MED 媒体 / RGT 权利 / SEN 敏感伦理 / PAGE 页面交互 / A11Y 无障碍性能 / RPT 构建报告工程。001–099 为现有规则编号化,100+ 为 v2 新增。规则一经发布不改号、不复用,废除标 deprecated。理由:稳定 ID 是 first_seen 追踪与 waiver 引用的前提。
---
## 2. 现有规则编号化(v1 实况,来源:validate.mjs / build.mjs / check-links.mjs)
列:rule_id | severity | 检查对象 | 触发条件 | 阻断 | 豁免。check_type 均为 auto。
### 2.1 结构与措辞
| rule_id | sev | 对象 | 触发条件 | 阻断 | 豁免 |
|---|---|---|---|---|---|
| SRC-001 | error | case | 必填字段缺失(id/domain/title/summary_zh/sources/status/scores/score_rationale_zh/review) | 是 | — |
| SRC-002 | error | case | id 非 kebab-case | 是 | — |
| SRC-003 | error | case | id 重复 | 是 | — |
| SRC-004 | error | case | domain / status 枚举非法 | 是 | — |
| SRC-005 | error | case | title.zh 缺失 | 是 | — |
| SRC-006 | warning | case | summary_zh < 40 字 | 否 | n/a |
| TXT-001 | error | case | 正文命中禁用词表(章程 §5.1) | 是 | — |
| SCR-001 | error | case | score_rationale_zh < 20 字或未释 X 上限 | 是 | — |
### 2.2 来源
| rule_id | sev | 对象 | 触发条件 | 阻断 | 豁免 |
|---|---|---|---|---|---|
| SRC-010 | error | source | sources 为空 | 是 | — |
| SRC-011 | error | source | tier / url_confidence 枚举非法;title 缺失 | 是 | — |
| SRC-012 | error | source | 不可追溯:url/doi/source_identity/locator 全空(章程 §3.2) | 是 | — |
| SRC-013 | error | source | A/B/C 级无 url/doi/source_identity | 是 | — |
| SRC-014 | error | source | url 非 http(s) | 是 | — |
| SRC-015 | warning | source | A/B/C 级无 archive_url(章程 §10) | 否 | n/a |
| SRC-016 | error | source | url_confidence=unknown 却填 url(章程 §7.2 反编造) | 是 | — |
| SRC-017 | warning | source | 二次文献缺 cited_source_actually_used(手册 §6.5.3) | 否 | n/a |
| SRC-018 | info | source | 链接存活检查失败(check-links.mjs,unreachable/timeout) | 否 | n/a |
### 2.3 对称性、主张与领域特例
| rule_id | sev | 对象 | 触发条件 | 阻断 | 豁免 |
|---|---|---|---|---|---|
| CLM-001 | error | case | 非「已证伪/已撤回」而 counter_explanations 为空(章程 §4.2) | 是 | — |
| CLM-002 | error | case | 「已证伪」未完整陈述最初主张 | 是 | — |
| CLM-003 | error | case | astronomy/astrobiology/seti 缺 what_it_does_not_show_zh | 是 | — |
| CLM-004 | error | case | evidence_modalities 含非法值 | 是 | — |
| MOT-001 | error/warn | case | motifs 非法(error);神话/古籍未标 motifs(warning) | 视级 | — |
| MOT-002 | warning | case | 神话/古籍 E > 30(手册 §2.1) | 否 | n/a |
| MOT-003 | error | matrix | 文明唯一母题键 > 10(覆盖率 >100%,审计一轮 P0-7) | 是 | — |
| MOT-004 | warning | matrix | 矩阵重复键 | 否 | n/a |
| REL-001 | warning | case | related 指向不存在的案例 | 否 | n/a |
### 2.4 评分门槛(手册 §5,全部不可豁免)
| rule_id | sev | 对象 | 触发条件 | 阻断 | 豁免 |
|---|---|---|---|---|---|
| SCR-010 | error | case | 五分缺失/非数/越界 [0,100] | 是 | — |
| SCR-011 | error | case | X > 75(全局上限,手册 §5.3) | 是 | — |
| SCR-012 | error | case | 可追溯来源 = 0 且 X > 20 | 是 | — |
| SCR-013 | error | case | 全 F 级来源且 X > 20 | 是 | — |
| SCR-014 | error | case | 独立来源组 < 2 且 X > 40(孤证) | 是 | — |
| SCR-015 | error | case | 存在未反驳 high 替代机制且 X > 30 | 是 | — |
| SCR-016 | error | case | high 证据效力限制而 D > 50(防同事双扣,手册 §5.1) | 是 | — |
| SCR-017 | error | case | status=已证伪 且 X > 5;status=常规解释较充分 且 X > 30 | 是 | — |
| SCR-018 | error | case | D ≤ 30 且 X > 35 | 是 | — |
| SCR-019 | error | case | X ≥ 70 准入五条件(组≥2/有反证排查/模态≥2/独立复核/D≥55)任一不满足 | 是 | — |
| SCR-020 | warning | case | X > A + 15 | 否 | n/a |
| SCR-021 | warning | case | S≥85 且 X≥60 且独立组 < 3 | 否 | n/a |
### 2.5 发布门禁与 AI 披露(v1 实况;v2 由 GATE-1xx 取代,见 §3.1)
| rule_id | sev | 对象 | 触发条件 | 阻断 | 豁免 |
|---|---|---|---|---|---|
| GATE-001 | error | case | publication_status 枚举非法 | 是 | — |
| GATE-002 | error | case | published 但 v1.1 门禁不全(具名人/日期/角色/方法版本/≥1 核实来源/≥1 核验主张/focal_claim) | 是 | — |
| GATE-003 | error | case | AI 起草且无人复核,状态超出草稿态 | 是 | — |
| GATE-004 | error | case | ai_involvement 非法;AI 参与未标 model(章程 §7.3) | 是 | — |
| GATE-005 | warning | case | 缺 next_review_due(章程 §10) | 否 | n/a |
| SCR-030 | warning | case | 缺 focal_claim_zh 或缺 score_targets_zh.E(审计一轮 P0-5) | 否 | n/a |
| MED-001 | error | media | license 非法或缺失 | 是 | — |
| MED-002 | error | media | concept-art 出现在证据区块(章程 §8.3 铁律) | 是 | — |
| MED-003 | error | media | 自托管但许可不在公有领域/CC 白名单(章程 §8.1) | 是 | — |
| MED-004 | warning | media | 缺 credit | 否 | n/a |
| PAGE-001 | error | page | 承诺—功能黑名单命中(build.mjs PROMISE_BLACKLIST,审计 §P0-5) | 是 | R9 |
---
## 3. v2 新增规则(按审计 §15.1–15.6 逐节覆盖)
### 3.1 §15.1 可信度与发布门禁(GATE-1xx)
| rule_id | sev | type | 对象 | 触发条件 | 阻断 | 豁免 |
|---|---|---|---|---|---|---|
| GATE-100 | error | auto | case | publication_status 不在 S1–S12 十二态枚举 | 是 | — |
| GATE-101 | error | auto | case | 状态与数据实况不符:所处态的进入条件(gate-v2 §2)任一不满足 | 是 | — |
| GATE-102 | error | auto | case | 状态跳级:状态历史(ReviewEvent 链)存在无记录的跨级变迁 | 是 | — |
| GATE-103 | error | auto | case | ≥S5 但必要子主张清单缺三签(R2 起草/R4 审查/R9 批准)之一 | 是 | — |
| GATE-104 | error | auto | case | ≥S6 但存在 necessity=essential 的子主张未 verified 或未绑定已核来源+locator | 是 | — |
| GATE-105 | error | auto | case | 状态晋级 ReviewEvent 的 actor_type=machine(gate-v2 §6:机器上限 S3)【需批准,同 gate-v2 A1】 | 是 | — |
| GATE-106 | error | auto | case | 人工复核存在但无机器可读 ReviewEvent(审计 §15.1 第 5 条) | 是 | — |
| GATE-107 | error | auto | case | independent_review=true 但无 actor_type=human 的第二审核 ReviewEvent(AI-A/AI-B 不计两人,审计 §15.1 第 6 条) | 是 | — |
| GATE-108 | error | auto | case | 同一 ReviewEvent actor 在同案签署 R2 与 R4(gate-v2 A3)【需批准】 | 是 | R9 |
| GATE-109 | error | auto | case | R3 签字者资质字段(专业领域/是否阅原始材料/身份)任一缺失 | 是 | — |
| GATE-020 | error | auto | page/site | 页面徽章/横幅措辞高于实际状态;「证据链闭环」出现在 <S6 页面;首页把 <S10 计入「正式发布」 | 是 | — |
| GATE-021 | error | auto | page | 显著徽章/标题/摘要中的机构归因(如「AARO 列为未识别」)未绑定 verified 引用(审计 §P0-3 全站化、§15.1 第 3/4 条) | 是 | R9 |
| GATE-022 | error | auto | site | scores 把 S/E/X 合并展示为单一总分或「概率」(审计 §15.1 第 8 条、章程 §5.3) | 是 | — |
GATE-021 实现说明(semi 成分):机器抽取 official_status、summary 首句与徽章文本中的机构名+判断动词组合,要求每条有 claim_ref→verified citation;无法自动判定的进入人工确认队列。理由:Nimitz 问题(§P0-3)的本质是「显著位置比来源表更肯定」,必须让显著文案承担引用义务。
### 3.2 §15.2 分类与数据(ONT/REL-1xx)
新本体规则分两档生效:**P1 数据底座完成前为 warning,完成后升 error**(升级日期随 P1 里程碑定,【需批准】)。理由:立即设 error 会阻断今天的构建,规则将被整体绕过;只设 warning 则永远不会迁移——必须绑定里程碑。
| rule_id | sev | type | 对象 | 触发条件 | 阻断 | 豁免 |
|---|---|---|---|---|---|---|
| ONT-100 | warn→err | auto | case | 仍只有单一 domain,缺 record_type/collections[]/topics[](审计 §6.2 十轴) | 升级后是 | R9 |
| ONT-101 | warn→err | auto | case | evidence_modalities 缺失或与所引媒体/来源类型明显不符 | 升级后是 | R9 |
| ONT-102 | warn→err | auto | case | 十轴中已建轴的取值不在受控词表(词表见 ontology-v2) | 升级后是 | — |
| ONT-103 | warn→err | auto | case | 多地点/多时间未用角色化结构(仍是单 lat/lon、单 claimed_year)而案例明显含多角色时空(审计 §15.2 第 6 条) | 升级后是 | R9 |
| ONT-104 | warn→err | auto | case | 含天文坐标内容但无天空坐标字段(审计 §13.1) | 升级后是 | R9 |
| ONT-105 | warn→err | auto | case | 翻译材料缺原文/转写/译本/译者版本字段(审计 §13.2) | 升级后是 | R5 签发的 R9 waiver |
| REL-100 | error | auto | relation | 关系指向不存在对象(supports/contradicts/derived_from/same_origin_as… 悬空引用) | 是 | — |
| REL-101 | error | auto | source | 同 independent_group 的来源被计入多组,或 derived_from 链成环 | 是 | — |
| REL-102 | warning | semi | source | 不同 independent_group 的两来源文本高度相似(同根拆组嫌疑,v1 已知无法全自动检测项) | 否 | n/a |
| RPT-100 | error | auto | site | 结构化数据(cases/claims/sources/reviews/schema/validation-report)任一未随构建公开可下载(审计 §15.2 第 7 条) | 是 | — |
| RPT-101 | error | auto | site | 任一 v1 线上 URL 在新构建中既无同路径页面也无 301 映射(审计 §15.2 第 8 条) | 是 | — |
### 3.3 §15.3 媒体与版权(MED/RGT-1xx)
| rule_id | sev | type | 对象 | 触发条件 | 阻断 | 豁免 |
|---|---|---|---|---|---|---|
| MED-100 | error | auto | media | 自托管媒体缺任一:source_id/evidence_role(M1–M5)/rights_id/credit/sha256/generation/review_status(审计 §15.3 第 1 条) | 是 | — |
| MED-101 | error | auto | media | evidence_role=M1/M2 但未绑定 claim_id + 页码/时间码/区域 locator(第 4 条) | 是 | — |
| MED-102 | error | auto | media | M2–M5 缺 parent_file_id 或 transformations[](软件/参数/操作者)(第 6 条) | 是 | — |
| MED-103 | error | auto | media | 存储路径与 evidence_role 不符(/evidence /derived /analysis /reconstruction /concept 物理隔离,审计 §八) | 是 | — |
| MED-104 | error | auto | media/page | M4/M5 资产出现在证据组件、评分输入、案例列表默认缩略图或 og:image 无「概念视觉」标识(第 7/8 条、§十六-1/15) | 是 | — |
| MED-105 | error | auto | media | ai_generated 而无模型/版本/提示/水印记录(审计 §9.2 末行) | 是 | — |
| MED-106 | error | auto | media | 增强件(enhanced_derivative)在页面中脱离父原件单独出现(审计 §八构建期禁令) | 是 | — |
| MED-107 | error | semi | storage | 保存桶中 M1/最早副本对象哈希与登记 sha256 不一致,或被覆盖(第 5 条「永不覆盖」) | 是 | — |
| MED-108 | warning | auto | case | 无任何证据媒体的案例未使用标准「无公开原件」空状态组件(审计 §7.4;防图库补洞 §十六-2) | 否 | n/a |
| SCR-110 | warning | semi | case | 媒体新增后 X/A 分同步上调而 score_rationale 未引用新证据内容(媒体数量≠证据力,第 9 条) | 否 | n/a |
| RGT-100 | error | auto | rights | rights_status ∈ {unknown, restricted, do_not_publish} 的资产进入公开构建(第 2 条硬门禁,审计 §9.4) | 是 | — |
| RGT-101 | error | auto | rights | public_domain_verified / open_license_verified 缺 checked_by/checked_at/source_rights_page(防按域名一键判断,第 3 条、§十六-3) | 是 | — |
| RGT-102 | error | auto | rights | 权利记录缺 rightsholder/license_uri/allowed_use/required_credit 任一(审计 §9.5 最低字段) | 是 | — |
| RGT-103 | error | auto | media | embed_authorized 之外的第三方内容被自托管(§十六-4:可播放≠可自托管) | 是 | — |
| RGT-104 | warning | auto | rights | expiry 过期或 checked_at > 12 个月未复查 | 否 | n/a |
### 3.4 §15.4 页面与交互(PAGE-1xx)
| rule_id | sev | type | 对象 | 触发条件 | 阻断 | 豁免 |
|---|---|---|---|---|---|---|
| PAGE-100 | error | auto | page | 首页缺故事/证据/实验室三入口锚点(第 2 条) | 是 | R9 |
| PAGE-101 | error | auto | page | 案例页缺 30 秒摘要区块(最小已核事实/核心未决问题/状态徽章)(第 5 条) | 是 | R9 |
| PAGE-102 | error | auto | page | 页面文案承诺了未实现的筛选/功能(PROMISE 黑名单状态感知升级,第 7 条) | 是 | R9 |
| PAGE-103 | error | auto | page | 地球坐标与天空坐标渲染进同一地图组件(第 8 条,审计 §13.1) | 是 | — |
| PAGE-104 | warn | auto | page | 时间轴组件收到区间/多角色时间数据却只渲染单点(第 9 条) | 否 | n/a |
| PAGE-105 | error | auto | site | 全文搜索或多轴分面接口在 P3 里程碑后缺失(第 3/4 条;里程碑日期【需批准】) | 是 | R9 |
| PAGE-106 | manual | — | page | 移动端主导航横向滚动无提示、首屏被治理文案占满(第 1 条,审计 §7.1)——QA 清单项 | 发布批次 | n/a |
| PAGE-107 | manual | — | page | 评分长文未按维度折叠、占据主阅读流(第 6 条)——QA 清单项 | 发布批次 | n/a |
| PAGE-108 | error | auto | page | 数据表格/图表无移动端替代结构(overflow 容器或数据表降级)(第 10 条) | 是 | R9 |
### 3.5 §15.5 无障碍、性能与全球访问(A11Y-1xx)
| rule_id | sev | type | 对象 | 触发条件 | 阻断 | 豁免 |
|---|---|---|---|---|---|---|
| A11Y-100 | error | auto | media/page | img 无事实性 alt(空 alt 仅装饰图允许)(第 1 条) | 是 | — |
| A11Y-101 | error | auto | media | 自托管视频无 WebVTT 字幕或无文字稿;音频无转写(第 2 条) | 是 | R9(限外语原始档案,须排期) |
| A11Y-102 | error | auto | media/page | 3D/复杂图表无静态图或数据表替代(第 3 条) | 是 | — |
| A11Y-103 | error | auto | page | 存在 autoplay 媒体(第 4 条) | 是 | — |
| A11Y-104 | warning | auto | page | 动画未响应 prefers-reduced-motion(第 5 条) | 否 | n/a |
| A11Y-105 | warning | auto | page | 重媒体未懒加载或无轻量模式开关(第 6 条,审计 §13.6) | 否 | n/a |
| A11Y-106 | error | auto | page | 第三方嵌入非点击后加载,或缺隐私提示+原链接+文字替代(第 7 条) | 是 | — |
| A11Y-107 | error | auto | page | 外部平台内容无完整文字路径回退(第 8 条,中国大陆可达性 §13.6) | 是 | R9 |
| A11Y-108 | manual | — | site | 桌面/移动/键盘/屏幕阅读器/弱网测试报告未随发布批次提交(第 9 条) | 发布批次 | n/a |
### 3.6 §15.6 隐私与伦理(SEN-1xx)
| rule_id | sev | type | 对象 | 触发条件 | 阻断 | 豁免 |
|---|---|---|---|---|---|---|
| SEN-100 | error | semi | case/page | 在世人物文本未用「某人于某时某地公开主张」中性句式(定性词表扫描 + R8 确认)(第 1 条,章程 §6) | 是 | — |
| SEN-101 | error | auto | site | 更正/申诉/撤回入口未在每个案例页可达(第 2 条) | 是 | — |
| SEN-102 | error | auto | case/media | 含人脸/声音/精确 EXIF 地点/医疗/未成年人材料而无 SensitivityReview 记录(R8 签字)(第 3 条) | 是 | — |
| SEN-103 | error | auto | media | 所谓遗体/人体/创伤材料无内容警告与尊严化缩略图标记(第 4 条,审计 §13.4) | 是 | — |
| SEN-104 | error | auto | media/rights | 原住民/神圣材料仅凭版权开放即公开,无社区使用说明与 R8 签字(第 5 条,审计 §13.3) | 是 | — |
| SEN-105 | error | semi | case | 接触体验页出现医学/心理诊断措辞(诊断词表扫描 + R8 确认)(第 6 条) | 是 | — |
| SEN-106 | error | auto | media | EXIF 含精确住址级坐标的图片未脱敏即发布 | 是 | — |
SEN 全系不可豁免。理由:审计 §13.3–13.4 属于对他人的义务,不是本站可自行权衡的技术债。
---
## 4. 与状态机的联动
- error 阻断构建 = 阻断**全站**;但 ONT 升级期与 PAGE/A11Y 的 R9 waiver 允许按对象豁免,避免单案例卡死全站。
- 案例晋级 S10 前置:该案例名下 0 error、0 未豁免 warning-with-owner 逾期项、manual 清单全签。理由:published 是全链最高承诺,不允许带公开技术债。
- 每条 warning 必须有 owner 与目标日期;逾期 90 天自动升 `stale` 并在 /quality.html 置顶。理由:审计 §P0-4——111 条 warning 的问题不是数量,是无人认领、无截止、不可追踪。
## 5. 待批准决策(汇总)
| # | 决策点 | 建议 |
|---|---|---|
| B1 | GATE-105 机器晋级上限 S3(同 gate-v2 A1) | 采纳 |
| B2 | GATE-108 R2/R4 同人禁令(同 gate-v2 A3) | 采纳,或降为 R9 可豁免+页面披露 |
| B3 | ONT-10x「warning→error」升级绑定 P1 里程碑的具体日期 | P1 验收当日升级 |
| B4 | PAGE-105 搜索/分面的 P3 里程碑日期 | 随 P3 排期定 |
| B5 | A11Y-101 外语档案字幕豁免的排期上限(建议 ≤180 天,与 waiver 上限一致) | 采纳 |
| B6 | waiver 有效期上限 180 天、逾期 warning 90 天升 stale | 采纳 |
| B7 | GATE-021 显著归因绑定引用规则允许 R9 豁免(用于「机构名出现在纯历史叙述中」的边界情形) | 采纳,豁免须公示 |