TVU 设计系统 · 体检报告 · 2026-09-16
这份报告回答三件事:产品团队到底用没用、哪些地方还是黑的、 这半个月真正变好了什么。全部数字都是当场从代码和文档里数出来的,不是估的。
读数时间 2026-09-16 12:12 · 扫了设计系统仓 + 两个在用它的产品
每个数字的出处都在文末「数据是怎么来的」里
一 · 设计系统存在的理由
扫了两个正在用 TVU 设计系统的产品(vue-app 和 graphics-insertion-app), 分三层看:颜色变量、图标、组件。三层的结果差得惊人。
产品团队把设计系统当调色板用了,没当组件库用。 颜色好抄——复制一个变量名就行;组件要改结构、要读文档、要处理属性,门槛完全不同。
那 46 处手写的地方里,38 个是裸 <button>,另有 5 个裸输入框、2 个裸下拉。
这些都是设计系统里已经有现成组件的。
| 产品 | 颜色变量 | 用了几个组件 | 该用没用 | 组件层 |
|---|---|---|---|---|
| vue-app | 88.0% | 1 个 | 36 处 | 2.7% |
| graphics-insertion-app | 82.2% | 2 个 | 10 处 | 16.7% |
vue-app 是重灾区:36 处该用没用,只用了 1 个组件。 graphics-insertion-app 好一些,但它的盘子也小得多——别把 16.7% 读成「它做得好」。
l,
规定要大写 L);2 处该填文字的填了开关。
覆盖比使用还多,通常意味着组件长得不是他们要的样子—— 要么是变体不够(他们需要的那个状态组件没提供),要么是文档没说清楚有哪些变体。 这两件事都能查,但现在没人在查。
示范代码那 19 处更直接:如果连设计系统自己的演示页都把属性写错, 别人照着抄一定会错。而且这些错是机器能当场查出来的。
二 · 你交付之后
25 个组件页,每页该有三样东西。实测三样都缺,而且缺得最厉害的那一样,正是设计师最常被追问的。 下面每个方块代表一个组件页,深色 = 写了。
一页都没有。开发要在 Button 和 Link 之间选,文档给不出答案——只能凭感觉,或者来问你。
只有 1 页写了。开发做出来对不对,没有可对照的依据,只能等你走查时发现。
这一样最好,但仍有 15 页没写。没写状态的组件,开发多半只实现了默认态。
第一节说「产品没在用组件」,这一节多半就是原因之一。
一个不告诉你「什么时候该用我」的组件库,很难被用起来——
开发看到一堆组件不知道选哪个,最省事的做法就是自己写一个 <button>。
这三样里「用例」最便宜也最值钱:每个组件写三句话(该用在哪、别用在哪、和哪个组件容易混), 25 个组件是一天的活。
三 · 你画图时
颜色和间距那套变量是齐的(所以产品能抄走 87%)。但另外三套基础标度,两套完全不存在。
这三样都是「设计师在 Figma 里定了、但没落进代码」的典型。 动效尤其明显:你在设计稿里标了 200ms ease-out,代码里没有这个变量可用, 开发就只能硬写——下次你改成 150ms,得挨个去找。
层级那 4 个更值得注意:它看起来是「已经有了」,实际上没有分级能力。 这种「看着有、其实没有」的情况,比明确的空缺更容易出事。
四 · 有人改动时
这一块是这半个月改善最多的。核心问题是:写了规则,有没有东西真的在拦。
同期规则总条数从 127 涨到 135(多了 8 条)。 分母涨了还能从 66 降到 32,说明是真的接上了检查,不是靠比例算出来的好看数字。
| 135 条规则的验收标准 | 条数 | 什么意思 |
|---|---|---|
| 有自动检查在盯 | 49 | 改坏了,提交时当场拦住 |
| 登记为「机器查不了」 | 54 | 比如「文案要自然」这类,已明确写下来靠人看 |
| 没人管 | 32 | 既没检查、也没登记——改坏了不会有任何反应 |
机械治理这一侧是目前最健康的:规则有人守、无障碍问题被锁住只减不增、渲染有验证。 今天所有自动检查全绿。
但那个 40% 断链值得单独说:它是「在自己家好用,装到别人家就坏」, 正好和第一节「产品用不起来」对得上——值得查一下是不是同一个原因。
五 · 最重要的一节
设计系统自己列了 64 项该测的东西,其中 45 项写明「脚本能自动算」。 今天真正在算的,从 11 项接到了 30 项——还剩 15 项黑着。
绿色 = 这一区至少有一项在测,⛔ 不代表这一区健康—— 比如「规则有没有人守」16 项里现在测了 4 项,仍有 12 项黑着。深色 = 一项都没测。 今天三个区接满了(打勾那三个)。
「还没在测」不等于「这块很烂」,它等于「不知道」。 把不知道读成坏,和把不知道读成好,一样错。
今天这 19 项接上之后,这句话有了第二个证据: 「发布出去能不能用」和「治理与成熟度」两个区,昨天全是「不知道」,今天全部接满—— 而它们是所有区里最难看的两个。 第一节那个 6.1% 的组件使用率也是这么出来的:接上才看见它这么低。
剩下 15 项黑着的,按同样的经验,里面很可能还有同量级的问题。 ⛔ 但在接上之前,任何人说那 15 项「应该还行」,都是在猜。
六 · 回答「到底优化了什么」
四个能拿数字说话的改善。每一条都做过对照实验—— 把改动撤掉,数字弹回去;放回来,数字降下来。不是看着变好了。
| 改善了什么 | 半个月前 | 现在 | 变化 | |
|---|---|---|---|---|
| 写了规则却没人管的条数 改坏了不会有任何反应的那些规则 |
66 | → | 32 | −34 |
| 检查工具自己坏了没人知道的 检查工具本身也需要被检查,不然它默默失效 |
40 | → | 35 | −5 |
| 正在报警没人处理的检查 系统正在静默变坏的地方 |
3 | → | 0 | 全清 |
| 产品到底用没用设计系统 第一节那些数,昨天之前不存在 |
不知道 | → | 6.1% | 新接上 |
这些检查是只许降不许涨的:数字降下去的同时,标准也跟着调紧并锁住。 以后谁再写一条没人管的规则,提交时会当场被拦。 所以降的不是一个报表数字,是把一块地永久圈进了监管范围。
第四条不一样——它没让任何东西变好,它只是让我们第一次看见了真相, 而那个真相是「很差」。这也是价值:「不知道」变成了「知道,而且很差」, 才有得修。
七 · 诚实的部分
六条边界。写在这里是为了让你知道每个数能撑多重的结论。
<button> 看,高不了太多。
读数时间 2026-09-16 12:12 CST(北京时间)
被测对象 tvu-design-system @ 388d2737 · 版本 1.2.0 ·
工作树有 6 个未提交文件(部分读数与干净状态不可并池)
消费产品 vue-app · graphics-insertion-app
采集命令 node metrics/ds-sweep.mjs --ds <设计系统仓> 退出码 0(全清)
各节数字对应的内部维度编号
第一节 三层使用率 = DIM-U1(token 685/790 · icon 1/38 · component 3/49)·
改写密度 = DIM-U5(6/3)· 用得对不对 = DIM-U17(示范面 19/1223,2 布尔简写 + 17 枚举越界)
⚠️ DIM-U2 与 DIM-U1.token 同源同值(86.7%),⛔ 不是两条独立证据
第二节 组件三视图 = DIM-U16(状态矩阵待办 15/25 · 用例待办 25/25 · 设计规格待办 24/25)·
设计规格就绪 = DIM-X17(1/25 = 4%,与 U16.designSpec 是同一个数的两面)
第三节 基础标度 = DIM-X19(motion 0 · density 0 · z-index 4,前 3 个值均为 1000)
第四节 规则三态 = DIM-Q12(gated 49 · 机器测不了 54 · 没人管 32,分母 135 = 验收段数,⛔ 不是规则条数)·
无障碍冻结 = DIM-S9(非文本 20 + 文本 69)· 发布断链 = DIM-X18(2/5)·
渲染验证 = vue 952 项 88.87% / react 946 项 89.22%
第六节 前三行 = 棘轮基线 unclassified 66→32 · gate-regression BASELINE 40→35 ·
正红棘轮 3→0(起点 09-01 95c1065c,三个时点各建干净工作树跑
metrics/ratchet-watch.mjs)
没接上的那 34 项 维度真源 =
tvu-design-system/docs/internal/ds-health-dimensions.md §3(64 格)。
另有 1 项(DIM-Q14 工具耦合度分母)明确登记不接,理由是那三条闸没有结构化输出、
只能靠正则解析散文,口径一改就静默失效;重开条件也已登记。
第五节的八个分区 分区是本报告所加(登记表本身没有分区), 已程序化校验无重复、无遗漏、无幽灵。原始 64 格的分区计数: 产品用不用得起来 15 · 组件文档 3 · 规则守护 16 · 改动安全 9 · 发布 6 · 设计基础 7 · 体量成本 4 · 治理成熟度 4。
第六节「做过对照实验」指什么 每笔改动都做了两臂到四臂: 把新写的检查移开 ⇒ 数字弹回去;放回来 ⇒ 降下来。这样才能确认是这笔改动挣的, 不是同期别人的提交挣的。09-01 → 09-14 有 186 个提交,绝大部分不是这条线做的。
更细的底账 每个结论背后的逐条读数、造故障实验记录、
推翻过的错误判断,都在 ai-ds-lab/reports/ 下的原始报告里(面向工程,不建议直读)。