1024 TiDB AIGC 黑客松 · 技术概念可视化

口径核验实录
这个作品最硬的地方,不是动画

可视化作品有一个通病:图做得很好看,机制说错了,而且没人看得出来。 因为观众没法验证——他说 96MiB,你怎么知道不是 256MiB?

这一页就是来拆掉这个问题的。它把本次创作的全部核验过程摊开:核了什么、改了什么、 故意删掉了什么、又自己发现了哪些错。每一条都注明官方出处,你可以逐条去核。

一、一条铁律,三级来源

先说清凭什么信
RULE OF THIS WORK
写进画面的每一个数字,都必须在 TiDB 官方文档中找到出处,并标注文档链接与版本。
宁可少说,不说错。
这不是口号。它的可执行版本是下面的来源分级——什么能当依据、什么只能当线索,分得很清。

来源分级:只有第一级能当答案

L1
TiDB 官方文档(stable 线 / release-8.5)
docs.pingcap.com/zh/tidb/stable · docs.pingcap.com/zh/ai · docs.pingcap.com/zh/best-practices
参数默认值、机制原文、SQL 语法、限制条件 —— 全部以此为准。凡"某版本起变更"的条目,作品内一律注明版本分界。
→ 本页第 6 节 72 条明细,出处全部指向 L1
L2
官方配置文件描述(TiKV / PD config-template)
github.com/tikv/tikv/blob/release-8.5/etc/config-template.toml
默认值的直接出处,与 L1 同页呈现。凡可取到原始配置文件默认值的,优先取原始值,而不是文档正文的复述。
→ 用于确认 region-split-size、各调度限流参数等默认值
L3
社区博客 / 二手资料 / 教科书
不作为依据 —— 仅用于「发现问题」,不用于「确定答案」
这一级是本次核验最关键的设计。绝大多数可视化作品的错误,来自把 L3 当成了 L1。 本作品的处理是:允许 L3 触发怀疑,但结论必须回到 L1 验证。
→ 第 3 节的 96MiB 纠错,就是这么被发现的

二、核验总览

数字说话
72
核验明细条数
按 A/B/C/D 四组逐条核验,全部可查
62
已核验 · 可直接使用
官方文档有明确出处,作品按此口径呈现
2
已核验 · 作品必须改
原表述与官方口径不符,已全部修正
7
官方未列明 · 作品不写
宁可少说 —— 这是本作品的防御性证据
3
已核验 · 可增强作品
新获得的官方依据,已升级演示严谨度

两个容易混淆的数字,先讲清

你会在这个作品里看到两个数字,它们不是同一件事:

· 72 条核验明细 —— 本次核验一共核了多少条,见本页第 6 节。
· 69 条可点击取证卡 —— 已经核过、又做进画面可以点开查官方原文的条目数(含后续几轮新增演示台补做的卡片,见站点首页「技术口径」)。

本次核验里没做成卡片的是两处:7 条结论为"官方未列明",作品刻意不写,只作为删除依据存档; 其余是同一参数的重复出现与纯背景性条目。之后每新增一个演示台,新核的条目都会补进取证卡。

三、纠错实录

本轮最重要的产出 —— 两处不是"补充",是"改错"
M1 Region 分裂阈值:96MiB 错了,是 256MiB
作品原表述
Region 默认大小按 96MiB 理解
→
官方口径
coprocessor.region-split-size 默认 256MiB(估算值);v8.4.0 之前为 96MiB
为什么这个错值得单列出来:它是社区做 TiDB 可视化最常见的错误来源—— 拆分阈值从 96MiB 调到 256MiB 是个不显眼的版本变更,大量二手资料至今停留在旧值,而二手资料又被后来的文章反复引用。 这正是第 1 节把 L3 单独分级的理由:L3 会自我复制,不能当答案。
处理:01 / 02 号演示台与站点口径统一改为 256MiB,并保留"v8.4.0 之前为 96MiB"的版本分界说明。 现在这个数字可以点开查官方原文 —— 见 。
M2 04 号选题名:没核验到的词,不用
作品原表述
向量搜索与混合检索
→
官方口径
正式名称为向量搜索(Vector Search)+ 向量搜索索引(HNSW);"混合检索"未核验到官方功能名
为什么这算一处错:"混合检索"是个行业里说得通的词,也很容易写得让人信服——但它不是官方功能名。 用一个听起来专业、实际没有官方对应的词做标题,正是"看起来对"的典型。
处理:04 号正式更名为「向量搜索与 HNSW 索引」;"混合检索"一词在另行核验全文索引能力之前, 不作为标题或功能名出现在任何位置。作品现在只写已核验的口径:支持的索引算法、 支持的距离函数、前置依赖 TiFlash。

四、主动删除清单

7 条 —— 这不是"我们没想到",是"我们核过,官方没说,所以不写"

这是本页最重要的一个立场。大多数作品遇到"官方没公开"时,会含糊带过、或者补一个看起来专业的值。 本作品的做法是把它们逐条列出来。

每一行都可以点开,看到的是同一句话:这里官方没说,所以本作品不写。 看过这 7 条的人,才有理由相信画面里其余的数字。

N1store 负载打分的具体公式
官方《TiDB 数据库的调度》只给出调度目标(副本数量均衡、Leader 均匀、热点均匀、空间占用大致相等), 未公开打分公式。作品只呈现调度目标与调度结果,不呈现任何公式 ——
N2PD 各调度器的逐项默认启用状态
官方未逐个列明"哪个调度器默认开启"。作品不写"XX 调度器默认开启",改为陈述调度策略本身 ——
N3HNSW 的 M / efConstruction / efSearch 可调参数
官方向量索引页未列明这些参数,也未提供调整入口。作品不出现这些参数名 ——
N4Async Commit / 1PC 的默认值
仅核验到"从 v5.0 起引入"。作品只写存在该优化,不写默认值 ——
N5TiFlash 副本的默认数量
官方口径是"部署后默认不会同步任何数据,需按表构建副本"。作品不写"默认 N 副本" ——
N6Leader 故障到新 Leader 就绪的端到端时长
官方给出的是 tick 机制(raft-base-tick-interval / raft-election-timeout-ticks), 未给出端到端时长。作品只写 tick 机制,画面中不出现任何端到端时长 ——
N7Percolator 的 Lock / Write / Data 列族级数据布局
官方事务文档正文未展开该层级(仅见于社区博客)。作品只呈现"值 + 锁标记", 不出现任何列族名 ——
投稿前一道自动守卫:校验脚本会检查全部页面中是否残留这些"未列明项"的痕迹 (如出现 efConstruction、Async Commit 默认 等字样即拦截)。 这不是靠记性守住的,是靠脚本守住的。

五、自查实录

4 个自己发现的问题 —— 连自己的模拟数据都不放过
SELF-01模拟数据自己打脸:矩阵行和 ≠ 节点 Region 数
现象
驾驶舱的 Region 分布热力矩阵,每一行之和(如 221)与该节点标注的 Region 数(203)对不上。
根因
热力矩阵的数据是独立手写的,没有跟 KPI 区的数字做对齐 —— 两处各自"看起来合理",合起来互相矛盾。
处理
重算矩阵,使每行之和严格等于对应 store 的 Region 数。
现在由什么挡住:跨来源数据自洽断言 —— 矩阵行和、明细合计、叙事措辞与排序结果必须一致,任一处对不上即测试失败。 这是模拟数据作品最容易露怯、也最容易被评审看穿的地方。
SELF-02页面会白屏,而 JS 语法检查完全发现不了
现象
驾驶舱一打开就抛异常,四个视角一个都渲染不出来。
根因
视角配置里存的图表名是 'latency' / 'ranking' / 'heat' / 'breakdown',而图表映射表的键写成了视角 id。取值得到 undefined,调用即崩。
处理
修正映射关系。
现在由什么挡住:渲染级验证 —— 用最小 DOM 桩在 Node 里真实执行页面脚本,逐视角跑一遍渲染。 关键在于:这类错误语法完全合法,语法检查、静态审计、肉眼读代码都发现不了,只有真实执行才会暴露。
SELF-03演示叙事做反了:下线永远先下线第一台
现象
02 号的"安全下线"演示,总是先下线 TiKV-1。
根因
下线目标选的是"peer 最多的节点"。但均衡完成后各节点数量相同,这个选择退化成永远取第一个。
处理
改为选择最后加入的节点 —— 叙事变成"扩容之后缩容回去",这才是真实运维会做的事。
现在由什么挡住:状态机回归测试(02 号 25 项断言)—— 覆盖分裂后副本数恒等、同 Region 副本不得落同一 store、 调度步数收敛、下线不丢副本、缩容下限保护。这次是先用测试暴露了叙事错误,再改的代码。
SELF-04对着活动规则自查,发现画面里用了绝对化用语
现象
通读活动规则时读到一条硬要求:宣传文案严禁使用绝对化用语,若因文案违规导致无法通过官方审核或被取消资格,后果由创作者自负。于是回头把自己的画面扫了一遍,发现 4 处(3 处用在指标值上,1 处用在程度强调上)。
一处容易漏掉的
其中一处不是直接写出来的 —— 它由「数值」与「百分号」两个字段拼装而成(v:'100' 与 u:'%' 分开声明),任何字面量搜索都抓不到,只有读懂渲染逻辑才会发现。纯靠人工检查,这一处必然会漏。
处理
4 处全部改为等效表述:把相对百分比换成绝对数值(如 peer 总数 3,744),把"目标为绝对百分比"改成"目标为完全均衡"。信息量反而更大 —— 绝对数比百分比更能说明规模。
现在由什么挡住:全站一致性校验新增广告法合规守卫,且该守卫自身还有 22 项自检用例 (10 项验证"该拦的拦得住"、12 项验证"不该拦的没被拦")—— 既确认它能抓出文案里的禁用词,也确认它不会把 CSS 与 SVG 的布局百分比值误判为违规。 守卫最大的风险不是漏报,而是"看起来每次 0 命中、其实正则写错了"这种假绿; 所以守卫本身也必须被测试。

六、完整核验明细

72 条 —— 出处以 S1–S10 编号,见本节末尾来源清单

分 A / B / C / D 四组,前三组分别对应 01 / 02 / 03 号演示台,D 组为站点口径。状态含义: ✅ 已核验 可直接使用 · ➕ 增强 新获官方依据 · ⛔ 未列明 作品不写。

分组 状态
出处
A 组 · Multi-Raft 与存储引擎(对应 01 号演示台)
#核验项官方口径出处状态
A1Region 分裂阈值coprocessor.region-split-size 默认 256MiB(估算值);v8.4.0 之前为 96MiBS1✅ 已核验
A2允许超出分裂阈值多少raftstore.region-split-check-diff 默认 Region 大小的 1/16S1✅ 已核验
A3Raft tick 间隔raftstore.raft-base-tick-interval 默认 1sS1✅ 已核验
A4Raft 选举超时raft-election-timeout-ticks 默认 10;按 tick 换算约 10sS1✅ 已核验
A5Raft 心跳间隔raft-heartbeat-ticks 默认 2 → 每 2s 一次心跳S1✅ 已核验
A6Leader 租约上限raft-store-max-leader-lease 默认 9sS1✅ 已核验
A7Region 副本数默认配置PD replication.max-replicas 默认 3(1 leader + 2 follower)S2✅ 已核验
A8多副本能否落同一节点原文:"在一般情况下,PD 只会保证多个副本不落在一个节点上,以避免单个节点失效导致多个副本丢失"S3➕ 增强
A9副本调度三种基本操作增加一个副本 / 删除一个副本 / 将 Leader 在不同副本间 transferS3✅ 已核验
A10Leader 故障到新 Leader 就绪的端到端时长官方未给出,只给出 tick 机制S3⛔ 未列明
B 组 · Region 分裂与 PD 调度(对应 02 号演示台)
#核验项官方口径出处状态
B1分裂/合并最小间隔schedule.split-merge-interval 默认 1hS2✅ 已核验
B2Region 调度并发上限region-schedule-limit 默认 2048S2✅ 已核验
B3Leader 调度并发上限leader-schedule-limit 默认 4S2✅ 已核验
B4热点调度并发上限hot-region-schedule-limit 默认 4S2✅ 已核验
B5副本调度并发上限replica-schedule-limit 默认 64S2✅ 已核验
B6合并调度并发上限merge-schedule-limit 默认 8(设为 0 关闭 Merge)S2✅ 已核验
B7单 store 快照并发上限max-snapshot-count 默认 64S2✅ 已核验
B8单 store pending peer 上限max-pending-peer-count 默认 64S2✅ 已核验
B9判定热点所需持续时长hot-region-cache-hits-threshold 默认 3 分钟S2✅ 已核验
B10判定 store 彻底失联时长max-store-down-time 默认 30m;超时后在其他节点补充副本S2✅ 已核验
B11Region 健康巡检频率patrol-region-interval 默认 10msS2✅ 已核验
B12均衡缓冲区tolerant-size-ratio 默认 0(自动调整)S2✅ 已核验
B13单 store 限流模式store-limit-version 默认 v1S2✅ 已核验
B14热点 Region 可调度体积上限max-movable-hot-peer-size 默认 512 MiB(v6.1.0 起引入)S2✅ 已核验
B15是否使用 Joint Consensusenable-joint-consensus 默认 true(v5.0 起引入)S2✅ 已核验
B16Placement Rules 默认状态enable-placement-rules 默认 trueS2✅ 已核验
B17跨表 mergeenable-cross-table-merge 默认 trueS2✅ 已核验
B18Store 状态机Up / Disconnect / Offline / Down / Tombstone 五态;心跳丢失超 20s → Disconnect,超 30m → Down;手动下线 → Offline → 计数归零后 TombstoneS3➕ 增强
B19下线时若无满足条件的目标 store原文:"该 Store 将一直处于 Offline 状态" —— 即本作品的"缩容下限保护"S3➕ 增强
B20store 负载打分公式官方未公开S3⛔ 未列明
B21各调度器逐项默认启用状态官方未逐项列明S3⛔ 未列明
B22PD 心跳携带的信息Store 心跳:磁盘容量/可用、Region 数、读写速度、Snapshot 收发、是否过载、labelsS3✅ 已核验
B23调度建议是否强制执行原文:操作"只是给 Region Leader 的建议,并不保证一定能得到执行"S3✅ 已核验
C 组 · 分布式事务两阶段提交(对应 03 号演示台)
#核验项官方口径出处状态
C1默认事务模式自 v3.0.8 起默认悲观事务模式;仅新建集群,从 3.0.7 及之前升级的不改变S4✅ 已核验
C2两阶段提交的阶段名称第一阶段 prewrite;第二阶段 commitS4✅ 已核验
C32PC 完整流程(官方 7 步)取 start_ts → 读 → 写(存私有内存)→ commit → prewrite 加锁 → 取 commit_ts → 向 Primary Key 所在 TiKV 提交并清锁 → 返回 → 异步清理S4✅ 已核验
C4冲突检测在哪一层、哪个阶段原文:"冲突检测是在 TiKV 中进行,主要发生在 prewrite 阶段"S4✅ 已核验
C5冲突检测并发控制参数scheduler-concurrency 默认 2048000S4✅ 已核验
C6事务模型的优缺点优点:原理简单、跨节点事务、锁管理去中心化;缺点:网络交互增多、需要中心化时间戳服务、大事务易内存暴涨S4✅ 已核验
C7事务自动重试从 v8.0.0 起不再支持乐观事务自动重试;冲突需在应用层捕获重试S4✅ 已核验
C8单事务大小上限默认 100 MB(txn-total-size-limit,最大支持 1 TB);内存放大可达 2–3 倍以上S5✅ 已核验
C9单行大小上限6 MBS5✅ 已核验
C10事务键值对数量限制v4.0 以前不超过 30 万条,v4.0 起取消S5✅ 已核验
C11惰性检查(乐观事务)默认不在 DML 时检查主键/唯一约束,而在 COMMIT 时检查;可用 tidb_constraint_check_in_place 关闭该优化S4✅ 已核验
C12隔离级别悲观事务在 Repeatable Read 下使用当前读S4✅ 已核验
C13Async Commit / 1PC存在该两项优化,从 v5.0 起引入;因果一致性事务仅在启用时生效S5✅ 已核验
C14Async Commit / 1PC 的默认值官方未列明S5⛔ 未列明
C15Percolator 列族级数据布局官方事务文档正文未展开(仅见社区博客)—⛔ 未列明
D 组 · 向量搜索 / HTAP / 在线 DDL(对应 04 号演示台与站点口径)
#核验项官方口径出处状态
D1向量搜索最低版本Self-Managed 需 v8.4.0+(推荐 v8.5.0+);当前公测阶段S8✅ 已核验
D2向量数据类型VECTOR(变长)与 VECTOR(D)(定长);为 TiDB 特有S10✅ 已核验
D3支持的向量索引算法目前仅支持 HNSWS9✅ 已核验
D4支持的距离函数目前仅支持 VEC_COSINE_DISTANCE() 与 VEC_L2_DISTANCE()S9✅ 已核验
D5建索引语法VECTOR INDEX idx ((VEC_COSINE_DISTANCE(embedding)));或 CREATE VECTOR INDEX ... USING HNSWS9✅ 已核验
D6向量索引的依赖组件必须提前部署 TiFlash 节点;否则需 ALTER TABLE ... SET TIFLASH REPLICA 1;S9✅ 已核验
D7召回率ANN 搜索"召回率可保持在 90% 以上";HNSW 特定场景准确率可达 98%S9✅ 已核验
D8向量索引的限制不能作主键/唯一索引;只能建在单个向量列;不支持多个同距离函数索引;只能建在定长向量列;不支持静态加密的 TiFlash 节点S9✅ 已核验
D9预过滤(WHERE)能否用向量索引不能。WHERE 在 KNN 之前执行;应先在子查询做 KNN 再过滤,且"结果可能少于 LIMIT 条数"S9✅ 已核验
D10索引命中的判断方式EXPLAIN 的 operator info 出现 annIndex: 即为命中S9✅ 已核验
D11索引构建进度与耗时查 INFORMATION_SCHEMA.TIFLASH_INDEXES,ROWS_STABLE_NOT_INDEXED 为 0 即完成;500 MiB / 768 维参考耗时可达 20 分钟S9✅ 已核验
D12HNSW 可调参数(M / efConstruction 等)官方未列明S9⛔ 未列明
D13TiFlash 的复制与一致性机制以 Raft Learner 角色异步复制;通过 Raft 校对索引配合 MVCC 获得 Snapshot IsolationS6✅ 已核验
D14TiFlash 的部署与写入限制无法直接接受写入;部署后默认不会同步任何数据,需按表构建副本S6✅ 已核验
D15TiFlash 硬件要求Linux AMD64 需 CPU 支持 AVX2;ARM64 需 ARMv8 架构S6✅ 已核验
D16MPP 执行模式官方提供"使用 MPP 模式"文档,为 TiFlash 并行计算执行模式之一S6✅ 已核验
D17TiFlash 副本默认数量官方未列明(口径为"默认不同步数据")S6⛔ 未列明
D18在线 DDL 机制采用在线异步变更,不阻塞其他会话 DML;官方明确"不支持离线 DDL"S7✅ 已核验
D19ADD INDEX 状态流转absent → delete only → write only → write reorg → public;public 前索引不可用S7✅ 已核验
D20物理 DDL 的范围物理 DDL = Reorg DDL,只包含 ADD INDEX 与有损列类型变更S7✅ 已核验
D21DDL 的执行者DDL Owner 单例(etcd 选举产生,run-ddl 控制是否参选)S7✅ 已核验
D22DDL 并发能力v6.2.0 起可并行执行 DDL;v8.2.0 起支持并行执行不同表的逻辑 DDLS7✅ 已核验
D23物理 DDL 速度调节变量tidb_ddl_reorg_worker_cnt / tidb_ddl_reorg_batch_size;官方推荐 20/2048(无负载)或 4/256(有负载)S7✅ 已核验
D24DDL 观测命令ADMIN SHOW DDL [JOBS]、ADMIN CANCEL/PAUSE/RESUME DDL JOBS、information_schema.DDL_JOBSS7✅ 已核验

七、来源清单

全部为 TiDB 官方文档,10 个
S7
DDL 语句的执行原理及最佳实践

八、这套东西凭什么守得住

AI 生成的内容,怎么保证不出错

这个作品的前端代码、文案初稿、视觉元素由 AI 工具生成。而 AI 生成技术内容最大的风险, 不是写得不好,是写得很好但事实错了 —— 它会把 96MiB 说得和 256MiB 一样可信。

所以本作品的质控是三层,缺一层都不成立:

防线做什么落在哪
第一层 · 铁律未核验的数字一律不写;官方没公开的,一个字都不写本页第 1、4 节
第二层 · 举证69 条做成可点击取证卡,把"我说我核过"变成"你随时可查"全站 等锚点
第三层 · 守卫自动化断言:脚本每次重跑,覆盖状态机、数据自洽、悬空引用、内容禁区见下表

一句话:AI 负责产出速度,人负责判定标准,脚本负责守住底线。 这三层里只有第一层依赖自觉,另外两层是机械的、可重复的、不靠记性的。

自动化守卫清单 —— 每次改动后重跑,全绿才算完成
检查断言数拦住什么
02 号状态机回归25分裂后副本数恒等、同 Region 副本不得落同一 store、调度收敛、下线不丢副本、缩容下限保护
03 号状态机回归562PC 七步次序、冲突发生阶段、回滚与清锁范围、主键选择
驾驶舱渲染级验证34四个视角真实执行渲染、跨来源数据自洽(矩阵行和 = 节点 Region 数)、下钻链接可达
核验实录自洽30本页声明的数字必须等于表格实际行数(防手写数字漂移)、来源编号无悬空、引用的取证卡键必须存在、本页声明的守卫用例数、浏览器渲染断言数、实测笔记证据链断言数、病理证据链断言数 = 四个脚本的实际执行数
实测笔记证据链91实测笔记页上的每个实测值,必须能在 dev/probe/ / dev/cloud-evidence/ 的原始采集输出里逐字找到——读者手里没有那些日志,所以这条最容易被糊过去,必须机器比对;含一处反向断言:该页不得出现任何性能数字(本次未做压测,写了就是编)
病理证据链62病理页上的 46 条关键读数,必须能在 dev/probe/ / dev/cloud-evidence/ 的原始采集输出里逐字找到;并守住这一页特有的等级纪律:实测 / 实验设置 / 推导 / 官方未列明四档必须分开标注,推导段必须带显式边界,官方未给出的端到端时长不得编造;含一处反向断言:病理页不得出现任何性能数字(本次未做压测,写了就是编);含 未覆盖清单(P-C):B1–B4(Offline → Tombstone / 跨 Region 多行事务 / FOR UPDATE 锁范围 / TSO 批分配)已在云集群全部兑现、必须带 done 标记与日期落款(B4 兑现的是机制:批合并与时间戳对账),官方口径锚点必须落在清单区块内
取证卡一致性—锚点必须存在于字典、无悬空引用、字典无闲置条目
全站一致性—JS 语法、重复 ID、缺失 DOM 引用、内部链接可达、内容禁区守卫、数字漂移(断言数 / 文件数 / 形式数 / 演示台数 / 实测条数 / 核验条数必须等于当场算出的真值;且认七类引用 —— 前五类为"写法"盲区的互补:紧邻的"N 项断言"、分开写的"数字 + 单位"、表格行里的裸数字、本页副产物计数、与断言数无关的独立计数;第六类为"文件"盲区:跨文件的"N 条实测"(真值 = 实测笔记页实测卡数,含视频帧分写与配套文档清单);第七类为「引用」盲区:跨文件的「N 项 / N 条 / N 键核验」(真值 = 口径字典的键数,含表格窄规则与视频帧分写)。每漏一类,就漏一片区域)
守卫自检22守卫本身也必须被测:确认广告法合规守卫既抓得住文案中的禁用词与绝对化数值,又不会把 CSS / SVG 的布局百分比值与官方奖项名误判为违规 —— 防「假绿」;并校验反面样例声明机制:允许页面引用被拦下的违规表述本身,但引用处数必须与源码内声明一致,少报与夹带都报错
真实浏览器渲染162用 headless 浏览器真实打开 cockpit / index / 本页 / posters / loop / video / 实测笔记 / 自助核验 / 现场直连 / 口径速查 / 在线核验台 / Raft 选举模拟器 / HTAP 信息图 / 真机 vs 模拟对账页 / 向量搜索演示台(04 号)/ 在线 DDL 演示台(07 号)/ 容灾实况演示台(08 号)/ 故障病理解剖室(10 号) 十八个页面,确认不白屏、关键内容渲染。每多一种形式,就多一个可能白屏的入口,必须过同一道关(自助核验页此前漏检,2026-09-19 补上;口径速查 / 在线核验台于 2026-09-20 补上;Raft 选举模拟器 / HTAP 信息图于 2026-09-20 第三轮补上;否决权页的操作模拟器 / 真机回放两块于 2026-09-20 第四轮补上;真机 vs 模拟对账页于 2026-09-20 第五轮补上;向量搜索演示台(04 号)于 2026-09-20 第六轮补上;在线 DDL 演示台(07 号)于 2026-09-21 第七轮补上;容灾实况演示台(08 号)于 2026-09-21 第八轮补上;向量搜索演示台(04 号)于 2026-09-21 第十轮升级为真算法仪器、断言 6 → 9 条;2026-09-25 补上驾驶舱真机快照与 04 号反例台两块(P-B / P-D),并新增故障病理解剖室(10 号)—— 断言 148 → 160;同日病理页(10 号)补「未覆盖清单」(P-C)—— 断言 160 → 162)

累计 482 项断言(25 + 56 + 34 + 30 + 91 + 62 + 22 + 162;取证卡与全站一致性为扫描式检查,条数随页面数变化,故不计入)。 这些数字不是自评,是脚本每次都会重跑的结果 —— 任何一处失败,页面就不会被交付。
其中「核验实录自洽」这 30 项,专门用来校验本页自己写的数字 —— 因为这一页主张"每个数字都可查",那第一个该被查的就是它自己:它甚至会用脚本算出自己的断言条数, 并反向核对另外四个脚本(守卫自检 / 浏览器渲染 / 实测笔记证据链 / 病理证据链)的真实执行数,对不上就报错。

本页管「数字有没有官方出处」,实测笔记页管「机制在真机上是不是这样」。 两件事的可信等级不同,所以分开两页、两套守卫,而不是混在一张表里互相借光 —— 去看实测笔记 →

视频管线 · 逐帧校验(单列,刻意不并入上表)

信息图视频不是录屏,而是由帧号驱动逐帧渲染出来的(video/frames.html + dev/make-video.py)。 没有 CSS animation、没有随机数、不读系统时间 —— 因此它可以被逐帧检查: 540 帧全部渲染通过,每帧输出非空且不含 NaN / undefined。

为什么单列而不并进上面的总数 —— 因为"帧能渲染出来"和"逻辑断言成立"不是同一类东西。 把两类数字加成一个更大的数,总数会更好看,但读者反而更难核。 所以这里分开写:482 项逻辑断言 + 540 帧渲染校验,各自独立可验证。

数字漂移守卫 · 每次漏报都逼出一类新写法
01一个刚刚被堵上的漏洞(2026-09-19):

画面上的断言数与单位是分写在两段字符串里的 (T(…,'482') 与 T(…,'项自动化断言')),中间隔着坐标、字号、颜色等参数, 于是数字漂移守卫那条"N 项断言"正则根本看不见它 —— 视频里的 215 就这样一路躲过守卫,直到这次全站同步才被人眼发现。

现在守卫补到五种写法都认:① 紧邻的"482 项断言";② 分开写的"数字串 + 单位" (从单位往前取最近的一个纯数字串);③ "脚本名 + 项数"表格行里的裸数字 (自助核验页把浏览器渲染断言数写成裸的 65,同样没被看见); ④ 本页"副产物"的计数 —— N 个自查发现的问题 / N 处自我纠错 / N 条主动删除; ⑤ 与断言数无关的独立计数 —— N 种形式 / N 台演示台。

第 ④ 类最难看,因为它不是"总数没同步",而是本页自己跟自己打脸: 第五节副标题写「3 个自己发现的问题」,而它下面明明摆着 4 张 SELF 卡 —— 脚本一直在数卡片(= 4),却从没去看那句"3";这个"3"还被抄进了首页、否决权页与视频帧。 现在真值改由"当场数 SELF 卡"得出,五类写法一起比对。

第 ⑤ 类是被"形式扩容"撞出来的:形式从四种扩到五种(新增实测笔记)之后, 首页 chip、录屏脚本与另外 3 处正文里的形式数与演示台数都还停在旧值上 —— 共 5 处,全部靠人眼逐个找出来。真值同样当场算:形式数 =「首页角标数 + 1」,演示台数 = 首页演示台卡片数。 它跟断言数毫无关系,所以前四种正则天生管不到它 —— 这就是"多一类数字,就多一片盲区"。

补这条时又被咬了同一个老问题:守卫分不清"使用错误值"与"记录错误值" —— 我在上面这几句里引用旧值来说明问题,它照样报错,一口气报出 5 处"并不存在的漂移"。 处理方式与第五节那句副标题完全一致:陈述漂移时一律不写具体数字 —— 这也是下文通篇只说"旧值"的原因。

这五种写法不是设计出来的,是五次真实漏报逼出来的 —— 每一条都对应一次"改了总数、守卫没响"。教训与前面几条一样: 一条正则漏掉一种写法,守卫就少守一片区域,而且失败方式是静默的,它不报错,只是不响。

02第六次漏报(2026-09-20):这一次盲区不在写法,在「文件」。

第二轮实测把实测笔记又扩了一条之后,页面自己的声明改了, 但视频帧收尾场景与几份配套文档里的条数没跟上 —— 前面五类守的是"页面里怎么写",这一次的问题是护栏立在哪里: 实测条数没有一条规则守过,几份配套文档也从来不在扫描范围内,两个盲区叠在一起。

补法仍是"真值当场算":真值 = 实测笔记页里实测卡的数量; 凡在页面、视频帧(含分写)或指定配套文档里写「N 条实测」的,N 必须等于它。 写出规则的第一次运行,它当场抓出了两处旧值(视频帧与交接文档)。

症状依旧一模一样:改了总数,守卫不响 —— 它不报错,只是不响。

03第七次漏报(2026-09-20):盲区在「引用」—— 没有任何规则守过「字典本身有多大」。

04 号演示台落地时,口径字典扩进一组新口径,于是全站的「N 项口径 / N 条取证卡」 类引用都要跟着换 —— 但「核验条数」这个数字此前没被任何一类守卫覆盖: 它不是断言数,也不是文件数、形式数、演示台数或实测条数,前面六类全都看不见它; 这轮同步靠人工逐文件排查,视频帧里还是分写形式(数字与「项可点开的取证卡」隔着参数)。

补法仍是「真值当场算」:真值 = spec.js 字典的键数; 凡写「N 项 / N 条 / N 键 + 核验 / 口径 / 取证卡 / 字典」的,N 必须等于它 —— 页面、视频帧(含分写与表格窄规则)与配套文档清单一并纳扫。

与第六次共享同一个教训:没有被守卫覆盖的维度,就是下一次漏报的藏身处 —— 而它的症状从来不是报错,是不响。

04这里有一处不如广告法守卫的地方,如实说明:

广告法守卫有 22 项自检用例(10 项验证"该拦的拦得住"、 12 项验证"不该拦的没被拦"),而数字漂移守卫没有对应的自检用例 —— 它每一次的有效性,主要靠"补上规则后立刻抓出旧值"这件事本身证明,不是靠单元测试。

唯一一次主动自测,是补完第 ⑤ 类之后:故意把首页改回旧的形式数,确认守卫报错,再改回 —— 也就仅此一次。 更值得记的是:第 ⑤ 类补完第一次跑,报出来的其实是它自己算错了真值 —— 它把首页 CSS 注释里那句"(第五种形式)"也当成了一个角标,真值算成 6,于是误报了三处并不存在的漂移。 误报比漏报更伤 —— 它会让人开始不信任守卫。

换句话说:对它,我只能说"它每次补上规则后都抓到过旧值",不能说"它被证明足够灵敏"。 这条差别记在这里,免得读者把两者当成同一等级的保障。

05另一条同源教训:守卫读到的是"上次的脚本",不是"现在的脚本"。

本页声明的浏览器渲染断言数,是由脚本输出文件反查的; 而那份输出文件如果停留在旧版脚本(当时 index 页只有 10 条检查), 真值 66 就会被读成 65,并让整张表的合计跟着错。

所以规矩是:改了脚本,必须重跑一遍再核对页面。 数字的权威来源永远是"脚本现在跑出来的结果",不是磁盘上那份可能过期的输出。

TiDB 内核解剖室 · 1024 TiDB 社区 AIGC 黑客松参赛作品
创作方向:技术概念可视化 · 平凯 Loop 的实践(官方允许方向多选)
核验基线:TiDB 官方文档 stable 线(release-8.5)· 首轮核验 2026-09-16 · 本页随作品同步更新
返回站点首页 · 进入驾驶舱