Verify it yourself · 五条路径

不用相信我们
你自己验一遍就行

别人说"我的技术解读是准确的",你只能选择信或不信。 所以我们把每一处判断拆成你可以自己跑一遍的动作 —— 按你愿意花的时间,从 30 秒到 15 分钟。

这份文档不解释作品,它只做一件事:把验证的权力交给你。 最后还写清了这套方法核验不了什么 —— 补掉一个短板,不等于没有短板。

5 条路径 · 全程不需要相信我们 L0 点一下 · 0 依赖 L1 跑一条 · Node.js L2 自己去查 · 只用浏览器 L3 自己重出 · 像素级复现 L4 对着日志看真机 · 需要集群

五条路径

按投入时间选,任何一条都能独立完成
L0 · 30 秒
点一下
需要:浏览器
随便点一个数字,看它的官方原文、适用版本与文档链接。
验的是:出处是否真实存在
L1 · 3 分钟
跑一条
需要:Node.js
12 个脚本跑一遍,482 项断言 + 540 帧渲染,全绿或报错。
验的是:数字有没有互相打脸
L2 · 10 分钟
自己去查
需要:浏览器
不看我们的页面,直接在官方文档里查 6 条关键口径,自己比对。
验的是:结论本身对不对
L3 · 15 分钟
自己重出
需要:Node.js + Python
改一个字、重跑一次,亲手重出信息图与视频,比对像素与帧。
验的是:图上的字是否真的可控
L4 · 20 分钟
对着日志看真机
需要:能装 TiDB 的机器(可选)
作品讲的机制,我们在三台真机上跑过一遍,原始日志全部留在仓库里。有集群就照着重跑,没有就按日志逐条驳。
验的是:机制在真机上是否真的这样

L0 · 点一下

30 秒 · 不需要装任何东西

打开 核验实录 → ,随便点一个数字,会弹出取证卡:

官方原文(不是我们的转述)· 适用版本(哪条规则从哪个版本起生效)· 官方文档链接(可直接点开对照)。

如果任何一个数字点不开、或点开后找不到对应原文 —— 那就是我们的问题,请直接说。

L1 · 跑一条

3 分钟 · 需要 Node.js
# 在本作品根目录下,逐条执行
node dev/check-all.js
node dev/guard-selfcheck.js
node dev/frames-selfcheck.js
node dev/verify-check.js
node dev/spec-check.js
node dev/test-logic.js
node dev/test-logic-03.js
node dev/test-cockpit.js
node dev/field-notes-check.js
node dev/pathology-check.js
node dev/live-check.js
python dev/browser-check.py   # 需要 Python;用真实 Chrome 复跑

全部退出码为 0 才算通过。每一项在替你质疑什么:

脚本项数它在替你质疑什么
check-all.js28 个文件JS 语法 / 重复 ID / DOM 引用悬空 / 内部链接 / 内容守卫 / 数字漂移 / 广告法合规 / 引用完整性
guard-selfcheck.js22守卫本身会不会失灵?既要不漏报,也不能把页面里 CSS 布局的百分比数值误判成宣传语
frames-selfcheck.js540 帧视频每一帧都渲染得出来吗?有没有 NaN / undefined?
verify-check.js30页面声明的数字 = 脚本实际算出的数字(连"我声明了多少项断言"也被脚本核对,且要跟另外四个脚本的真实执行数对上)
field-notes-check.js91实测笔记页上的每个实测值,能不能在原始采集日志里逐字找到(含反向断言:那一页不得出现任何性能数字)
pathology-check.js62病理页上的 46 条关键读数,能不能在原始采集日志里逐字找到(含等级纪律:实测 / 实验设置 / 推导 / 官方未列明四档不许混写;以及反向断言:那一页不得出现任何性能数字)
spec-check.js69 键取证卡的锚点有没有指向不存在的编号
test-logic.js / -03.js25 / 56状态机每一步是否真的按官方流程走
test-cockpit.js34驾驶舱四个视角渲染,且分项之和 = 汇总值
browser-check.py162用真实 Chrome 打开十八个页面,确认不白屏、关键内容渲染
live-check.js18 项现场直连页的反向断言:这一页是「仪器」不是「证据」—— 它不得写死任何实测值,连一个日期都不行;另守「服务器释放后仍可操作」:离线快照须与原始输出逐字对账

为什么把 guard-selfcheck 单列出来:守卫的主要风险不是漏报,而是"每次都 0 命中、其实正则写错了"这种假绿。 所以守卫必须被自己测试 —— 22 项用例里,10 项在证明"该拦的拦得住",12 项在证明"不该拦的没被拦"。

各脚本的条数以 核验实录 的守卫清单为唯一来源,该表由 verify-check.js 与各脚本的实际输出机器比对,不允许手写漂移 —— 包括"守卫自检多少项""浏览器渲染多少项""实测笔记证据链多少项""病理证据链多少项"这四个数字,也是反查脚本输出得来的。

这里有一个反复被咬的地方,值得单独说:同一个数字会被写三遍(正文 / 视频帧 / 表格), 而三遍的写法各不相同,于是"数字漂移守卫"被逼着补了五次才把这五种写法覆盖全 ——

写法藏在哪结果
紧邻的「482 项断言」正文已覆盖
分开写的「数字 + 单位」
T(…,'482') 与 T(…,'项自动化断言') 之间隔着坐标/字号/颜色
视频帧
frames.html
215 一路躲过守卫,直到全站同步才被人眼发现
脚本名 + 项数表格行里的裸数字
<td class="num">66</td>,既没有"项"也没有"断言"
本页
selfcheck.html
65 同样没被看见
副产物计数:N 个自查发现的问题/N 处自我纠错/N 条主动删除核验实录页自己
verify.html 第五节的副标题
副标题的数字写「3 个」,而它下面明明摆着 4 张 SELF 卡 —— 脚本一直在数卡片,从没看过那句数字;而这个「3」还被抄进了首页、否决权页与视频帧。它不是"总数没同步",是同一页里两句话互相打脸
独立计数:N 种形式/N 台演示台首页 chip、录屏脚本
index.html
形式从四种扩到五种后,首页 chip 仍写着旧的形式数,另有 4 处写着旧的演示台数 —— 共 5 处,全部靠人眼找出。它跟断言数毫无关系,前四种正则天生管不到;而且守卫分不清"引用旧值"与"使用旧值",所以本页与核验实录在陈述这件事时,一律不写具体数字

五种写法合起来才守得住。每一次的症状都一样:改了总数,守卫不响 —— 它不报错,只是不响。 其中第 ④ 类最难看:它不是"总数没同步",而是同一页里两句话互相打脸。

第六次漏报(2026-09-20):盲区不在写法,在「文件」。 第二轮实测把实测条数又扩了一条之后,视频帧收尾场景与几份配套文档里的「N 条实测」没跟上 —— 旧规则里没有任何一条守过「实测条数」,几份配套文档也从来不在扫描范围内,两个盲区叠在一起。 补法仍是"真值当场算":真值 = 实测笔记页里实测卡的数量; 凡在页面、视频帧或指定配套文档里写「N 条实测」的,N 必须等于它。 补上规则后的第一次运行,当场抓出两处旧值(视频帧与交接文档),修复后才重新全绿。

第七次漏报(2026-09-20):盲区在「引用」 —— 没有任何规则守过「字典本身有多大」。 04 号演示台落地时,口径字典扩进一组新口径,全站的「N 项口径 / N 条取证卡」类引用都要跟着换 —— 但「核验条数」这个数字此前没被任何一类守卫覆盖:它不是断言数、文件数、形式数、演示台数或实测条数,前面六类全都看不见它。 补法仍然是"真值当场算":真值 = spec.js 字典的键数; 凡写「N 项 / N 条 / N 键 + 核验 / 口径 / 取证卡 / 字典」的,N 必须等于它。 写出规则后的第一次运行,当场在配套文档抓到 9 处旧值(交接文档 6 处 / 开发全记录 3 处),修复后才重新全绿。

与第六次共享同一个教训:没有被守卫覆盖的维度,就是下一次漏报的藏身处 —— 而它的症状从来不是报错,是不响。 命名上再补一条:同一个数字可能在页面里以「项 / 条 / 键」三种称呼出现, 命中的动作名(核验 / 口径 / 取证卡 / 字典)也可能有四种 —— 称呼列不全,就等于没守。

另外如实说明一处差别:广告法守卫有 22 项自检用例,数字漂移守卫没有 —— 它每一次的有效性靠"补上规则后立刻抓出旧值"证明,而不是靠单元测试; 唯一一次主动自测是补完第 ⑤ 类之后(故意写错、确认报错、再改回),也就仅此一次。 这两者不是同一等级的保障,写在这里,免得读者误以为它们一样可靠。

L2 · 自己去查

10 分钟 · 只用浏览器

不用看我们的任何页面。打开官方文档,按下面搜,自己比对 —— 每条给出「去哪搜 → 搜什么词 → 你会看到什么 → 如果你看到别的值,说明什么」。

01Region 分裂阈值
去哪
TiKV 配置文件描述(docs.pingcap.com/zh/tidb/stable/tikv-configuration-file)
搜什么
region-split-size
你会看到
默认 256MiB(估算值);v8.4.0 之前默认值为 96MiB
若你看到 96MiB 且没提到版本分界 → 你翻到的是过时资料。网上绝大多数 TiDB 可视化仍写 96MiB,这是本领域最常见的错误来源。
02选举超时到底多久
去哪
同上(TiKV 配置文件描述)
搜什么
raft-election-timeout-ticks、raft-base-tick-interval
你会看到
前者默认 10,后者默认 1s → 无主状态约 10s 后发起选举
关键:官方没有给"故障到新 Leader 就绪的端到端时长"。所以我们的画面里一个秒数都没写 —— 你去搜"Leader 故障恢复需要几秒",搜不到就是对的。
03Store 失联多久算挂
去哪
TiDB 数据库的调度(docs.pingcap.com/zh/tidb/stable/tidb-scheduling)
搜什么
Disconnect、max-store-down-time
你会看到
心跳丢失超过 20 秒 → Disconnect;超过 max-store-down-time(默认 30 分钟)→ Down,并开始在存活 store 上补足副本
顺带
同页能查到 Offline → Tombstone 的完整状态机,以及"若不存在满足搬迁条件的目标 Store,该 Store 将一直处于 Offline 状态"—— 这正是"缩容下限保护"演示的官方依据
04加索引中间经历哪些状态
去哪
DDL 语句的执行原理及最佳实践(docs.pingcap.com/zh/best-practices/ddl-introduction)
搜什么
absent、write reorg
你会看到
absent -> delete only -> write only -> write reorg -> public;且"新建的索引在 public 状态前都不可用"
顺带
同页明确写着 "TiDB 不支持离线 DDL" —— 这句话是"在线 DDL"这个说法的官方背书
05向量搜索的硬门槛
去哪
向量搜索概述 / 向量搜索索引(docs.pingcap.com/zh/ai/…)
搜什么
HNSW、VEC_COSINE_DISTANCE
你会看到
需 v8.4.0+(推荐 v8.5.0+)、当前为公测阶段;索引目前仅支持 HNSW;距离函数仅支持余弦与 L2;必须提前部署 TiFlash
若你看到有人写 M / efConstruction 可调 → 官方文档里没有这些参数。我们因此一个字都不写。
06顺带验一件事:验证我们的「没写」
为什么
这是最值得做的一条。一个技术可视化作品如果出现了下面任何一项的具体数值,而它的出处不是官方文档,那这个数字就是编的。
#我们没写的东西去哪搜
1store 负载打分的具体公式TiDB 数据库的调度
2PD 各调度器的逐项默认启用状态PD 配置文件描述
3HNSW 的 M / efConstruction / efSearch向量搜索索引
4tidb_enable_async_commit / tidb_enable_1pc 的默认值TiDB 事务概览
5TiFlash 副本的默认数量TiFlash 简介
6Leader 故障到新 Leader 就绪的端到端时长TiKV 配置文件描述
7Percolator 的 Lock / Write / Data 列族级布局TiDB 乐观事务模型
判断标准:在上面 7 处搜得到出处,那才是我们错了。搜不到 —— 就说明"不写"是对的。
我们不写,不是因为不知道怎么写,是因为写不出来源的东西不该被画进图里。

L3 · 自己重出

15 分钟 · 需要 Node.js + Python

文字是矢量排版的,不是生成模型画的 —— 意味着你改一个字、重跑一次,产物就变。 这一步让你确认:图上每个字符都可控。

重出信息图

python dev/shoot-posters.py            # 全部 4 张,1x + 2x
python dev/shoot-posters.py poster-01  # 只出某一张

自己验:脚本会回读 PNG 的 IHDR 宽高并与期望值比对(1x = 1080×1440,2x = 2160×2880)。 你可以随手改 posters/poster-01.html 里一个数字,重跑,打开图 —— 改的就是显示的那个,不会多也不会少。

重出视频

python dev/make-video.py --only 0 60   # 只渲染前 60 帧,快速看版面
python dev/make-video.py               # 渲染 540 帧 → 合成 36 秒 mp4
python dev/make-video.py --compose     # 只重新合成

自己验:video/frames.html 里帧画面完全由帧号决定 (无 CSS 动画、无随机、无时间源)。所以你可以只重跑某一帧、或把任意一帧单独截出来,画面永远一致 —— 这就是"非录屏"的意思:

录屏逐帧渲染(本作品)
画面从哪来屏幕上的实时过程帧号 → 静态函数
能不能重跑出同一帧不能能,逐像素
卡顿会不会丢帧会不会(机器慢只是跑得久)
错一个字怎么改重录整条改源码,重出受影响的帧

L4 · 对着日志看真机

20 分钟 · 有集群就重跑,没有就按日志驳

L0–L3 验的都是"页面内部自洽"与"出处是否真实"。但它们有一个共同的盲区: 文档可以错,推导可以与实现不符。 所以 2026-09-19 我们在三台真机上装了一套 v8.5.7 集群,把作品讲的机制逐条跑了一遍 —— 当天做了两轮采集,下表以第二轮为准(与实测笔记页一致)。

原始采集输出全部留在 dev/probe/,未经改写。 这一条路径有两种走法,任选其一:

① 你手上有集群(或愿意起一个)—— 照下面列出的步骤自己在真机上重跑一遍, 和我们采到的行为对比。只要你复现不出来,那就是我们错了。(云端那批为一次性快照、不可复跑,只可对着证据读 —— 见实测笔记 10–14。)
② 你没有集群 —— 直接打开 dev/probe/ 里的日志读原文, 再回头核对 实测笔记 有没有把原文改写漂亮。 改写过的实测值,就是编的。

#实测项原始日志
1三副本真的分布在三台机器上(region 1277 的 PEERS = 1278, 1279, 1280;每 store 副本数 = Region 总数 = 142)probe/r2-round2.txt
2Region 分裂真的发生(总数 74 → 142),且分裂后仍是 3 副本probe/r2-round2.txt
3停掉一台 TiKV(.114),Leader 自动迁走(42 → 0;另两台 70 / 72)probe/r2-round2.txt
4降级期间写入仍然成功(2/3 多数派)probe/r2-round2.txt
5「恢复后回到均衡」是一个过程(51 / 50 / 41,与停机前一个都没对齐)probe/r2-round2.txt
6拓扑里写的容量参数真的落到了进程(120GiB / 4GiB / 256MiB,进程自报)probe/r2-round2.txt
7nodelalloc 是从内核回读确认的,不是照抄配置probe/verify-mounts.txt
8写写冲突:乐观报错 9007 / 悲观等锁 3.006s / 重试不丢更新probe/r2-txn.txt

实测笔记页上还有一节 「三处工具撒谎」 —— 同一个动作,官方检查工具给出的结论与实机状态三次不一致, 而三次里对的都是实机。那三条比上面这些重跑步骤更值得看,因为它们说明的是观察工具本身也会骗人。

去看实测笔记(含三处工具纠偏)→

这套方法核验不了什么

一个只说优点的核验方案没有价值

诚实的边界

以下是这个作品真正的短板,不是免责声明。
  1. 真机实测的是 3 节点实验室集群与 5 节点云集群,都不是生产规模。 2026-09-19 我们在三台实体机上装了一套 v8.5.7 集群,2026-09-25 又在五台云服务器上扩到 5 TiKV 补跑, 把作品讲的机制逐条跑过一遍,原始日志分别留在 dev/probe/ 与 dev/cloud-evidence/ (见 实测笔记)。 但它们不能代表生产环境在数据量、并发量、跨机房拓扑下的表现, 而且没有出具任何性能结论 —— 本次没有做压测,写了就是误导。
  2. 「没跑过」的作品断言已经清零 —— 但要看清最后一条兑现的是什么。 事务这一块,第二轮补上了单行写写冲突(实测 08),09-25 云集群又补上了跨 Region 的两行事务 与 SELECT … FOR UPDATE 的锁范围(实测 12 / 13);下线这一块,09-20 补上了缩容下限保护(实测 09), 09-25 扩到 5 TiKV 后把 Offline → Tombstone 完整状态机也走通了(实测 11,两条路); 最后一条 TSO 分配开销,09-25 也在同一批云集群上用「本底扣除法」三段实验补齐(实测 14)。 病理页「未覆盖清单(P-C)」四条(B1–B4)已全部带 done 兑现标记与日期落款,由 pathology-check.js 核对这组声明本身。 但必须说清楚:TSO 一条兑现的是机制(批合并真的发生、两次时间戳都走 PD),不是性能 —— 这一页与本作品仍然不出任何性能结论,最后一条的边界同样没有含糊过去。
  3. "官方文档写了"不等于"生产环境一定如此"。 文档也可能滞后或有误。口径基线是文档 stable 线(release-8.5), 若你用的是旧版本,数值可能不同 —— 请在取证卡里核对版本。
  4. 断言全绿只证明"内部自洽",不证明"设计正确"。 482 项断言保证的是"页面声明的数字 = 脚本算出的数字""实测值能在原始日志里找到"这类一致性。 它拦得住手误与漂移,拦不住方向性的判断错误。
  5. 视觉与叙事无法被断言。 好不好看、讲得清不清楚,只能你自己看。

这套东西的可信度,不来自我们说自己多准确,
而来自你可以不同意我们 —— 并且能立刻指出是哪里不对。

带走它

纯文本版,可直接下载或复制

如果你要把这套核验方法用在别处(或离线查看),纯文本版内容一致:自助核验包.md

下载 自助核验包.md 查看完整核验实录 →
TiDB 内核解剖室 · 1024 TiDB 社区 AIGC 黑客松参赛作品
纯前端实现,无追踪、无外部依赖,离线可用。