# DS 健康度 · 维度登记表（grow-only）

> **🤖 AI 读取指引**：接到「评估设计系统 / 分析现状 / 这套东西做得怎么样 / 有没有变好」类任务时，**本文件是维度真源**。
> 起手必读 **§0 契约** + **§1 派生源** + 逐条扫 **§3 登记表**；写脚本时读 §3 的「活源算法」列。
> ⛔ 不要另起一套轴 —— 那正是本文件要治的病。

> **owner 2026-08-13 立**。缘起：owner 提出「每次分析评估结果都不一样、看不出方向、不知道是越修越好还是越修越约束不住」。
> 取证后确认**维度不缺、缺的是持久化**：`full-lifecycle-assessment-2026-07-08.md:125` 元层第三行
> 逐字写着「**流程可观测** | 现状：无 | 缺口：gate 通过率 / 返工率 …**否则无法判断"跨工具都高质量"是否达成** | P1」——
> 标了 P1，一个多月零动作。而 07-08 那份评估的 **40 项横切维度**，在 08-13 的 ABCD 四轴里**一条都没被复测**。

---

## 0. 契约（本文件的硬规则）

| # | 规则 | 为什么 |
|---|---|---|
| G1 | **grow-only：维度只能加，不能悄悄删** | owner 2026-08-13 逐字要求「除非必要，不要删减已有的，这样我可以从结果上看到它是越来越好还是越不好」 |
| G2 | **删除必须在 §7 写明「删除理由 + 日期 + 谁拍的」** | 对齐 `audit-layout-tokens` 的 shrink-only 豁免表范式（反向）：那边是「修完由闸宣布删行」，这边是「删要留证」 |
| G3 | **每次评估必须逐条应答本表**：要么给数，要么写明「本轮未测 + 为什么」 | 治「换套轴 → 上一轮维度集体蒸发」。**沉默 = 违约**，不是「大概没问题」 |
| G4 | **所有数字从活源现算，⛔ 不引用任何既有报告的数** | owner 2026-08-13 逐字：「覆盖率或者分析评估报告都需要实时去测，不要拿已有的报告来读，可能是陈旧的数据」。对齐 AGENTS 硬规则 #10 |
| G5 | **绝对数必须配分母** | 项目一变大绝对数就涨，看着像退步。2026-08-13 实证：初版 4 个消费侧指标里 3 个犯这个错 |
| G6 | **记规则维度，⛔ 不记人维度** | owner 2026-08-13 拍定。摩擦统计只出「哪条规则最常拦人」，绝不出「谁被拦最多」——后者会毁信任并诱导 `--no-verify` |
| G7 | **不新增采集，只分析团队已有产物** | owner 2026-08-13 拍定「不告知其他设计师」。⇒ 形态必须是「从 git log / CI 日志反推」，**不是**在别人机器上悄悄记账（那要么会出现在他们 diff 里、要么要偷偷联网）。这样「不告知」从"隐瞒一件事"变成"根本不存在需要告知的事" |

---

## 1. 维度从哪里派生（⛔ 不由任何人现场发明）

**病根**：靠「这次让 AI 想全一点」不可靠 —— 2026-08-13 实证，AI 首轮提的指标**整个成本/效率象限为零**，是 owner 点出来的；靠 owner 想全同样不可靠（owner 自述「我思考得没那么周全」）。
**正解**：维度从下列已有真源**机械派生**，任何人都可复核「这条维度是从哪来的」。

| 派生源 | 派生出哪一类 |
|---|---|
| [`PROJECT_GOAL.md`](../PROJECT_GOAL.md) §受众表（开发 P0 / 设计·产品·QA P1） | 每个受众「能不能拿到它要的东西」→ **U 类** |
| [`PROJECT_GOAL.md`](../PROJECT_GOAL.md) §操作模型三条核心要求（②系统自行触发 ③一看就知道怎么用） | 可达性 / 路由 → **U 类** |
| [`PROJECT_GOAL.md`](../PROJECT_GOAL.md) §一句话目标 5 能力 + §不要做 4 条 | 能力成熟度 / 反模式复发 → **Q 类** |
| [`full-lifecycle-assessment-2026-07-08.md`](./full-lifecycle-assessment-2026-07-08.md) §4 四支柱 + 元层 + **§横切质量属性 40 项** | 工程质量面 → **X 类** |
| [`_reports/2026-08-13-ds-assessment-axes-abcd.md`](./_reports/2026-08-13-ds-assessment-axes-abcd.md) C 轴（场景×必读）/ D 轴（约束覆盖） | 可达性 → U 类；覆盖率 → **Q 类** |
| 消费产品仓（ux-team Gitea：microapps / email-template / tvu-pack） | 真实使用行为 → **U / S 类** |
| [`_archive/_reports/2026-07-17-ux-design-system-maturity-assessment.md`](../_archive/_reports/2026-07-17-ux-design-system-maturity-assessment.md) §成熟度表 **10 维**（Foundations / Components / Coverage / Patterns / Interaction / Content / Accessibility / Documentation / AI Consumption / Governance，各 0–5 分）· 权重 **UX 设计系统质量 70% · 消费体验 20% · 工程治理 10%** | 产品构建能力 / 设计资产层级 → **Q 类**；受众可得性 → **U 类**；见下方 ⚠️ 未覆盖清单 |

⚠️ **2026-09-04 补收（`lab` 提，实测派生）—— 这是建表时的第二次漏收，与 DIM-X16 同族（见 §7）。**
漏收的证据：该评估 32,683 B、权重设计**恰好就是本表要衡量的那个「产品 UX 设计系统」视角**（UX 质量占 70%），而
① 本 §1 派生源表原先**不含它** ② 全仓活树只剩 **1 处**入站引用（`docs/V1_RELEASE_CHECKLIST.md:26`）
⇒ **G1 的 grow-only 承诺保护不到自己没引用的东西**，而本表的立表缘起正是「换套轴 → 上一轮维度集体蒸发」。
⇒ 这次差点蒸发的是**最 UX 本位的那一轴**（同一个病第二次发作）。

它的一句话结论逐字：「TVU DS 是一个成熟的『组件保真镜像系统』，但还不是『产品构建系统』
…… 6 个真实 TVU 产品任务走查：**0 个能用 DS 直接建成、3 个部分可建、3 个基本靠手搓**」。

##### ✅ 2026-09-07：这 8 条**全部立格了**（owner 拍 Q4 后由 agent 按读数落地）

**agent 自己定的成文规矩只有一条，且它是从读数出的**：

> **只立「此刻就能取到数」的格**；取不到数的**明确判「不立」+ 写重开条件**，
> ⛔ 不留空格烂在那儿 —— 一个没有数据面的 DIM 格是 TODO 伪装成量具。

🔴 **按这条规矩逐条实测后，结论与队列的预判不同**：队列原本按印象把 8 条分成
「3 条能取到数 ⇒ 立格 / 5 条取不到 ⇒ 不立」。**实测下来 8 条全部取得到** ⇒ 全部立格，0 条判不立。
⛔ 「取不到数」这句话必须实测过才能说 —— 那 5 条里至少 3 条只是**没人去取**：

| 队列原判 | 实测 | 结论 |
|---|---|---|
| 执法绑 Claude Code「取不到数」 | 扫头 45 行数 D1 挂载产物即可 ⇒ **闸级 1/40 · 规则级 13** | 立 **DIM-Q13** |
| Use Cases / Design Spec「要先定什么算覆盖」 | `audit-docs-site-readiness.mjs` **已经在算**：`threeViewPending` ⇒ `useCases 0/25 · designSpec 1/25` | 立 **DIM-U16** / **DIM-X17** |
| llms.txt 溯源悬空「取不到数」 | 「`llms.txt` 引用 ∖ `package.json.files[]` 覆盖」在仓内就能算 ⇒ **2/5** | 立 **DIM-X18** |
| motion·z-index·density「缺标度」 | 分族 grep 即可 ⇒ motion 0 · density 0 · **`--z-*` 4 个** | 立 **DIM-X19** + 见下方更正 |

⚠️ **两条如实登记的更正（都会改变这些读数该怎么被引用）**：

1. **`prose:gate≈73:1` 的原算法不可复现** —— 2026-07-17 只留了这个**数**、没留算法。
   2026-09-07 实测 4 个候选口径：字节比 **1.6:1** · 行数比 **0.8:1** · 规则条数∶mockup-rules 模块数
   **76∶13 ≈ 5.8:1** · 规则条数∶引擎数 **76∶1**。**没有一个落在 73:1 上**（最后那个最接近，
   但「他们当时是不是这个意思」是猜测）。⇒ 新立的 **DIM-Q12** 用的是**另一个明确口径**
   （Acceptance 段三态比）⇒ ⛔ **不许把 DIM-Q12 的值与 73:1 相比或说它「延续」了那条读数。**
2. **「无 z-index 标度」这句是错的** —— `src/tokens/variables.css` 里 `--z-dropdown` /
   `--z-tooltip` / `--z-modal` / `--z-select-portal` 四个都在。⛔ 但也别反过来读成「已有标度」：
   前三个值**都是 1000** ⇒ 它是一层命名，不是分级标度。**motion 族与 `--density` 确实是 0**，那两半成立。

**原始登记表（保留，⛔ 别删 —— 它是「哪一条派生自哪个读数」的主键；`现状` 列已更新为真指针）**：

| 该评估里的读数 | 现状 |
|---|---|
| **Governance 行逐字「mockup/设计侧 `prose:gate≈73:1`」** | ✅ **2026-09-07 立 DIM-Q12**（另一个明确口径，⛔ 与 73:1 不可比 —— 原算法不可复现，见上方更正 ①）。🔴 它同时是 DIM-Q1 / DIM-E3 要的那条腿 —— §3 E 类自称 DIM-E3「本表最重要的一条」缺的就是这条腿。**它 2026-07-17 已经被算过一次**，随文档归档一起失联 ⇒ ⛔ 别再说「这个数没测过」 |
| **Governance 行逐字「执法绑 Claude Code」** | ✅ **2026-09-07 立 DIM-Q13**（闸级 1/40 · 规则级 13）。与 07-08 §病因 2「质量绑工具、不绑系统」同源 |
| **Patterns = 1 分**（「仅 1 处先例：form-item design-spec，**1/25**」） | ✅ **2026-09-07 立 DIM-X17** 覆盖率格（1/25）。⚠️ 它与 Documentation 行的 designSpec 1/25 **是同一个数**，⛔ 别当两条独立证据 |
| **Accessibility 行的 3 个 verified WCAG 缺陷**（Select 键盘不可达 2.1.1-A · toast 无 `aria-live` 4.1.3-AA · FormItem label-error 未关联 1.3.1/3.3.1-A）+ 「**a11y 无回归 ratchet**」 | ✅ **2026-09-07 立 DIM-S9** —— a11y 棘轮当日已建（owner 拍 Q2 的 `ratchet`，20 对具名冻结）⇒ 「a11y 无棘轮」这半已不成立。⛔ 那 3 个 verified WCAG 缺陷的当前状态**本轮未复验**，别读成已修 |
| **Components 行「跨组件 API 不自洽：disabled 5 种写法 / `type` 6 义 / size 大小写分裂」** | ✅ **2026-09-07 立 DIM-Q14**（纯登记 —— 三条闸本来就在跑）。这原本是「**有量具、无维度格**」，与本表常见的「有维度、无量具」方向相反 |
| **Documentation 行「产品受众 Use Cases 0/25 · 设计 Design Spec 1/25」** | ✅ **2026-09-07 立 DIM-U16**（statusMatrix 10/25 · useCases 0/25 · designSpec 1/25）。与 DIM-U10「三个 P1 受众零入口」同源 |
| **AI Consumption 行「`llms.txt` 反向溯源指针 + composition `_meta.source_refs` 在已发布 npm/bundle 里悬空（manifest 不在 `files[]`）」** | ✅ **2026-09-07 立 DIM-X18**（2/5 悬空，逐条点名）。形态是「仓内 PASS、发布后断」—— 与 §6 诚实边界那类「闸看不到发布产物」同族 |
| **Foundations 行「无 motion token / 无 z-index 标度 / 无 density 标度」** | ✅ **2026-09-07 立 DIM-X19**（motion 族 0 · `--density` 0 · `--z-*` **4 个** ⇒ 见上方更正 ②）。⚠️ consumer **无法用 token 覆盖一个不存在的 token**，撞上只能改 DS 源码 —— 这一半对 motion / density 成立 |

---

## 2. 四类的定义（逐字取自 owner 2026-08-13 的诉求："越做越好用、越稳定、质量和效率越高"）

| 类 | 回答什么问题 | 主指标 |
|---|---|---|
| **U · 好用** | 人愿不愿意用、要费多大劲才能开工 | 绕过率（北极星） |
| **S · 稳定** | 会不会踩坑、升级痛不痛 | 升级适配成本 |
| **Q · 质量** | 规则真被守住了吗 | M-rule 真守率 |
| **E · 效率** | 体量/成本在涨还是在降 | 规则增速 vs 闸覆盖增速 |
| **X · 横切** | 企业级/多团队 scope 的工程属性 | （07-08 §横切 40 项，逐条登记） |

> **⭐ 北极星 = 绕过率（DIM-U1..U6）**。三条理由：① **不可伪造** —— 覆盖率、闸绿都能靠改判据变好看，绕过率只有真把 DS 做好用了才会降；② **复合** —— 一个数同时答「好用吗」（人愿不愿用）和「够用吗」（够不够所以不用自己搓）；③ **天然区分「账本变准」和「系统变好」** —— 清 backlog 不会让绕过率动一分。

---

## 3. 维度登记表

> **列说明**：`自动` = 能否由脚本从活源算出（✅ 可 / ⚠️ 判据待细化 / ❌ 不可，靠人工盘点）。
> `基线` = 首次实测值，**空白 = 尚未测**（不是 0）。

### U · 好用（可达性 · 摩擦 · 绕过）

| ID | 维度 | 活源算法 | 自动 | 基线 |
|---|---|---|---|---|
| DIM-U1 | **三层合规率**（⚠️ 必须分层，**别合成一个数**） | ① token 层：`var(--)` / (`var(--)`+裸 hex) ② icon 层：DS 取图标 / (DS 取+内联) ③ **组件层 = DS 已用实例 / (DS 已用 + 该用没用)**，见 §3.3 | ✅ | 2026-08-13 首测：token 82–88% · icon 内联 0–4.8% · **组件合规 2.7% / 16.7%**（同日接 R2 豁免后**重算，四个数一个没变** —— 消费仓零处 `aria-expanded`，见 §3.3）。⛔ 数字别从本列引用（G4），跑 `node scripts/ds-health-scan-consumers.mjs` 现算 |
| DIM-U2 | **token 直用率** | `var(--)` 数 / (`var(--)` + 裸 hex + 裸 px)，**排除已登记 divergence**（chart 色板是 code-first 真源） | ✅ | vue-app 88.3% · graphics 82.2%（2026-08-13 粗测，**未排除例外**） |
| DIM-U3 | **内联 SVG 比** | 内联 `<svg` 数 / (内联 + DS 图标 import 数)。规则背书 = MICROAPPS_PRODUCT_CONTEXT §11 R1「图标必须从 `dist/icons/svg/` 取」 | ⚠️ | vue-app 12 处内联（**未逐个判是否违规**） |
| DIM-U4 | **自搓组件率** | 消费仓本地组件名 ∖ DS 注册名，再按 §3.1 三分法归类。**⛔ 只有「绕过」那一类才计入本指标** | ⚠️ 判据最难 | |
| DIM-U5 | **DS 组件被改写密度** | `:deep()` / 类选择器覆盖 DS 组件样式的次数 / DS 组件使用次数 | ✅ | |
| DIM-U6 | **组件弃用事件数** | `git log -S '<TvuXxx'`：曾加入、后删除的 DS 组件数。**「试过然后放弃」比「从没用过」是强得多的负信号** | ⚠️ | |
| DIM-U7 | **首次集成跨度** | install DS 的 commit → 第一个 DS 组件渲染的 commit，隔几天 / 几 commit | ✅ | |
| DIM-U8 | **场景路由覆盖率** | 有专属路由/skill 的场景数 / 已识别场景数。⚠️ 08-13 C5：DS 维护者（本仓最高频）**13/13 skill 全部排除本仓** | ⚠️ | |
| DIM-U9 | **每场景开工必读 KB** | 按场景实算必读链字节。⚠️ 08-13 C3 实测同一 mockup 场景两条互斥读法差 **2.5×**（549.3 vs 220.3 KB） | ✅ | |
| DIM-U10 | **受众入口数** | 4 个受众各有几个可达入口。⚠️ 08-13 C6：设计师 / PM / QA 三个 P1 受众**零入口** | ⚠️ | |
| DIM-U11 | **规则摩擦地图** | 从 `git log` 反推：同一文件连续修正 commit 数 + fix 型 message 模式 → 哪条规则最常拦人。**⛔ G6：只出规则维度** | ⚠️ | |
| DIM-U12 | **库归属错误率**（owner 2026-08-13 补：「拿错设计库的组件，这个我遇到很多次」） | ⭐ **拿错设计库实例 / 有库归属可判的 remote 实例**。判据真源 [`scripts/lib/mockup-library-origin.mjs`](../../scripts/lib/mockup-library-origin.mjs)（与闸 `audit:mockup-library-origin` **共用同一份**）；采集器 [`scripts/ds-health-scan-mockups.mjs`](../../scripts/ds-health-scan-mockups.mjs)。⚠️ **分子必须按来源 file 拆**，见 §3.4 —— 不拆会把「拿错库」和「引用产品自有老稿」合成一个假头条 | ✅ **2026-08-13 已接** | 见 §3.4（⛔ 别从这里引用数字，跑脚本现算） |
| DIM-U13 | **产品内 pattern 复用率**（owner 2026-08-13 补：「用了设计库组件、没用当前产品已有的组件」） | 新迭代中复用**产品已有 pattern** 的次数 / (复用 + 从 DS 原语重搭)。~~⚠️ **前置缺失**：产品级 pattern 索引当前不存在~~ → **✅ 2026-08-14 分母侧候选集已建**（见 §3.5）；**分子仍无判据** | ⚠️ 分母侧已接 · 分子❌ | ▶️ owner 2026-08-14 确认场景成立（逐字「我认为很合理」）⇒ 走 [提案](../superpowers/specs/2026-08-13-product-pattern-index-proposal.md) §5 的 A。**MVP 已落地，只做 LCD 一个文件**（真产物 `_generated/product-pattern-index.json`，实测见 §3.5）。⛔ **本维度仍不可计算** —— 有分母候选 ≠ 有比率，分子「从 DS 原语重搭」没有确定性判据（提案 §附录第 3 条逐字要求「别在 A 里假装已解决」）。⛔ 别拿索引里的 pattern 数当 DIM-U13 读。**⛔ 2026-08-14 owner 拍定：比率不可算是终态 —— 本维度不再有「值」**（分子要判语义等价，唯一手段是被禁的启发式）⇒ 改并排读三个各自确定性的子量，见 §3.7。**⛔ 这是「路封死」不是「还没做」**：别再为它设计分子，重开条件已在 §3.7 写死 |
| DIM-U15 | **复用被结构性阻断**（孤儿 master）—— 2026-08-14 从 DIM-U13 的实测副产物立项 | 孤儿 master 数 **与** 其实例数，**两个数并排**，各配分母（实例数 / file-local 实例）。判据真源 = `findOrphanLocalInstances`（`scripts/lib/product-pattern-index.mjs`），现算入口 `pnpm pattern:lookup`（不带参数）。⛔ **不合成单一「孤儿率」**，见 §3.6 | ✅ | ⛔ 别在此列写数，跑 `pnpm pattern:lookup` 现算（G4）。**当前态已是全量**（2026-08-14 全量采集，每个已登记目标各一条）。⚠️ **趋势是另一回事，而且本轮还没有** —— 时间序列里各目标**都只攒到第一个 `patternIndex` 点**（此前只有一个文件有），⇒ **同口径对照只有那一个文件**，其余印 unknown（⛔ 不是 0）；**下一轮采集才第一次产出真 delta**。读法入口 = `pnpm health:delta`（2026-08-14 接上，见 §3.6 末段） |
| DIM-U14 | **横向一致性走查覆盖率**（owner 2026-08-13 补：「没有横向对比 UX 的一致性，导致返工次数很多」） | 迭代前做过横向对比的交付数 / 交付总数。走 `design-walkthrough` skill 的产物存在性判 | ⚠️ | |
| DIM-U16 | **文档站三视图就绪度**（产品 / 设计受众能不能拿到他要的那一页） | `node figma-sync/audit-docs-site-readiness.mjs`（只读，⛔ 不写产物）⇒ `totals.componentPages` 作分母，`totals.threeViewPending.{statusMatrix,useCases,designSpec}` 作待办数；**三个视图分别读，⛔ 不合成一个数** | ✅ | **2026-09-07：componentPages 25 ⇒ statusMatrix 10/25 · useCases 0/25 · designSpec 1/25**（与 2026-07-17 那份评估逐字一致，且可从活闸复现）|

#### 3.1 「本地组件」三分法（DIM-U4 的判据核心 · 2026-08-13 实测催生）

消费仓里有一个 DS 没有的组件，**有三种完全不同的性质，修法互相矛盾** —— 合成一个「自搓率」会把三件事搅成一团：

| 类 | 判据 | 含义 | 修法 |
|---|---|---|---|
| **① 绕过** | DS 有同语义组件，消费仓仍自己写 | 真·不好用 | 查为什么不用（API？体积？缺状态？） |
| **② 缺口** | DS 根本没有这个组件 | **DS 功能缺口，不是不好用** | 评估要不要进 DS |
| **③ 别名/薄封装** | 名字不同，但内部消费的是 DS 资产 | **正常用法，⛔ 别计为绕过** | 无 |

⚠️ **判据纪律**：名字不匹配 **≠** 不是 DS。必须打开文件看它 import 什么，**不能只比标签名**（2026-08-13 实证：`TvuIcon.vue` 按名字不在 DS 注册表里，实为从 `dist/icons/svg/**` 取 markup 的薄封装 = ③ 类；若只比名字会误判成 ① 绕过，得出完全相反的修法）。

#### 3.2 首次实测发现（2026-08-13 · MicroApps 两个 app）

**发现**：`vue-app` / `graphics-insertion-app` 都钉了 `^1.2.0`，**token 层与 icon 层消费都很强，但 DS 的 34 个 Vue 组件一个都没用**（无 `app.use(DS)`，`.vue` 里零 DS 组件 import）。

**这不是绕过，原因写在消费仓自己的代码注释里**（`TvuIcon.vue` 头注释逐字）：

> *"this app builds to ONE inlined HTML file (vite-plugin-singlefile). Importing the 11 category maps that cover these 16 icons pulls in **472 KB** of SVG strings"*

⇒ **结构性事实：DS 当前的分发形态与 microapp（单文件打包）场景不匹配** —— 这类消费者结构上只能取 token + icon，取不了组件。**修法方向是细粒度可 tree-shake 入口，不是"劝人多用组件"。**

⚠️ 此发现**此前未被任何文档记录**：STATUS §能力×成熟度把能力 1 标 partial，但理由写的是「React 无 published npm 路径」，与本条无关。**这是本机制第一次跑就产出的、原本不在任何 backlog 里的事实** —— 也是「维度登记 + 常驻测量」价值的第一个实证。

#### 3.3 组件层的分母：**可组件化机会**，不是「所有组件标签」（owner 2026-08-13 推翻初版口径）

**初版口径（已废）**：DS 组件标签数 / 全部组件标签数 = **occupancy**。
**owner 逐字反驳**：「有些设计不需要使用组件，那么它的组件使用率是 0，但这并不代表它质量不好；有些是 80%，但是有很多模块都可以用组件的，它反而没用组件。」

**成立** —— occupancy 测的是"用了多少"，与"**该用的用了没有**"无关。⇒ 分母换成**可组件化机会**：

```
组件合规率 = DS 已用实例 / ( DS 已用实例 + 该用 DS 却没用的次数 )
```

「该用没用」的判据**不新发明**，复用 [`audit-canonical-compliance.mjs`](../../scripts/audit-canonical-compliance.mjs) 的 **R1–R4**（native `<button>` → 应用 Button · native `<input>` → 应用 InputBox\* · 裸 `<span|div> @click` + Icon → 应用 Button），扩到消费仓，再加 `<select>` / `<textarea>` / `<table>` 与「DS 有同名却自己写」（shadowed）。

**这个分母同时解掉 owner 举的两个反例**：

| 反例 | 新口径下 |
|---|---|
| 纯展示设计、本来就不需要组件 | 机会数 = 0 ⇒ 比率 **n/a**，⛔ 不判为差 |
| 用了 80% 但还有很多模块该用没用 | 那些没用的**进分母** ⇒ 比率掉下来，真实暴露 |

~~⚠️ **合规率是下界**：裸 `<button>` 里有一部分**合法**（R2 逐字：带 `aria-expanded` 的 disclosure trigger 允许裸用），脚本当前未做该豁免 ⇒ 分母偏大、比率偏低。~~
→ **✅ 2026-08-13 已接**：判据抽成共享真源 [`scripts/lib/native-button-r2.mjs`](../../scripts/lib/native-button-r2.mjs)，闸（`audit-canonical-compliance` R2）与扫描器**共用同一份**，⛔ 别在任一侧再写第二遍豁免。抽取是纯重构、行为逐字保留，已用**故障注入 + 阴性对照**验过（往 `src/canonical/Badge.vue` 同时注入一个裸 button 和一个带 `aria-expanded` 的，重构前后闸输出逐字一致：只报前者、exit 1；还原后 0 findings）。自测 = [`tests/NativeButtonR2.test.ts`](../../tests/NativeButtonR2.test.ts) 8 条（含近似边界的钉子）。

**⚠️ 但这一步没有改动任何数字**（如实登记，别读成「修完变好了」）：两个消费 app **全仓零处 `aria-expanded`**（已 grep 核实），⇒ 豁免数 = 0，合规率仍是 2.7% / 16.7%。阳性对照另取 —— DS 仓 `SelectBoxBase.vue` 实测 `{bare:2, disclosure:1}`，证明判据在真有 disclosure trigger 的文件上确实生效。**这一步买到的是口径一致 + 未来不误计**，不是当期数字变化。

⚠️ **合规率仍是下界（换了个原因）**：`<select>` / `<textarea>` / `<table>` 三条**没有对应的豁免语义**（R2 只覆盖 `<button>`），且 R2 的开标签窗口是近似（属性值里含 `>` 会提前截断）。⛔ 收紧近似必须闸与扫描器一起动。

**首测实证（新口径的信息量差别）**：`vue-app` 旧口径 1.4%（只说明"用得少"），新口径 **2.7% = 1 / (1 + 36)**，且**点名 36 个机会里 30 个是裸 `<button>`** —— 旧口径结构上看不到这件事。

#### 3.4 DIM-U12 的分子必须按**来源 file** 拆（2026-08-13 首测当场推翻初版口径）

初版口径（也是登记表原文）：**「`libraryKey ≠ 唯一 DS 库 key` 的实例数 / 总实例数」**。
判据本身没错（与闸共用一份），但**分子是个混合桶** —— 首测 6 个产品文件，那个合计数是
**24.66% – 95.87%**，读起来像「设计师几乎全在拿错库」。追下去发现它混了三种性质完全不同的东西：

| 来源 | 性质 | 修法 |
|---|---|---|
| **任何非指定库的库** —— 实测两个：`TVU UX Library`（老 TVU 库）+ `Nancy's Design Assets`（个人素材库） | ⭐ **owner 说的那件事** | 换成当前 DS 库的组件 |
| **产品自有老稿**（`Config T ( Local UI ) …20210909` / `PP-Lora` / `MH-Lora` …） | 跨文件复用 / 历史遗留迁移债 | 另一件事，与「拿错库」不同工 |
| **来源不可解析**（`GET /v1/components/<key>` 404） | 取证边界，不是缺陷 | 只能如实登记为未知 |

> **✅ owner 2026-08-14 裁定**：「**真正的设计库只有 `TVU UX Design System`**」⇒ 个人素材库同样算拿错，
> 原先分开的 `tvu-design-library` / `personal-asset-library` 两个 kind **并成 `foreign-library`**
> （旧名仍被脚本认，历史行不因改名读不出来）。

**拆开后（2026-08-13 首测，⛔ 别引用这些数，跑脚本现算）**：⭐ 拿错设计库率
**0.15% – 14.98%**（PP-2025-2026 最低 25/16474 · LCD 最高 1347/8990），
而不是混合桶那个 24.66%–95.87%。**两个口径给出的行动完全不同** ——
前者说「有一个具体的老库要清」，后者说「整套流程失控」。

**一个可直接行动的收敛**：六个产品文件里，`foreign-library` 那一桶的来源
**只有两个 file** —— `TVU UX Library`（`WpZRx2BoCQJ0E3a3ccHDJI`，lastModified 2026-06-09，六个文件全中）
+ `Nancy's Design Assets`（`TCJOUG778XJaPEXYrrDrDF`，只出现在 TVU Pack / MicroApps 三个文件）。
⇒ owner 的痛点不是「到处拿错」，是**两个老库还在被引用**。

**owner 裁定后的重算（2026-08-14，⛔ 是对 08-13 那行的离线重算，不是新测量；`bySource[].sourceFileKey`
已存所以可回溯，下一轮脚本原生产出同口径）**：⭐ 拿错设计库率 **0.15% – 21.40%**
（PP-2025-2026 最低 · LCD 最高），六文件合计 **10379 / 96052 = 10.81%**。
裁定只抬高了三个文件（MicroApps 13.14→20.75 · Config-T 11.37→14.54 · LCD 14.98→21.40），
另三个**一分未动** —— 个人素材库只出现在前三个里。⛔ 别引用这些数，重跑脚本现算。

**机制自审（我自己新建的东西先当嫌疑人）**：
- 数字反常时**先排除自己是污染源** —— 抽 top25 key 逐个 `GET /v1/components/<key>` 问来源，才发现是混合桶；
- 首轮 `CONC=4` 撞 Figma 429，**520 个实例被记成「来源不明」** ⇒ 加退避重试 + 限流单独成桶后重跑，
  同一文件的「拿错库」从 1022 变 1050 —— **那 28 个差值纯属取证条件差异**，不是设计师改了什么。
  若不修，趋势里会出现假波动。
- 取证失败一律记 `status:"error"`，**⛔ 不记 0** —— 把「没测到」记成「0 个问题」会造出一条平滑向好的假趋势。

**⇒ 可交付面（2026-08-14 落地）**：比率答「有多严重」，但设计侧改不动 —— 改得动的是
「哪个产品文件里、哪些组件来自那两个库、去哪找」。⇒ 采集器在**整轮全量成功**时另写一份
[`_generated/foreign-library-cleanup.md`](./_generated/foreign-library-cleanup.md)：跨文件 Top-20（决定先换哪个）
+ 每个「产品文件 × 外来库」的逐组件明细（实例数 · 出现在哪些页 · 前 3 个实例的 Figma 深链）。
⛔ **部分运行不写**（`--only` 或有目标 error 时）—— 部分清单会把「没测到的文件」渲染成「没问题的文件」，
与「取证失败不记 0」是同一条纪律，只是换成了 Markdown 形态。
⚠️ 两条口径细节：① 变体组件的 API `name` 是属性串（`Dark theme=on, title=off…`），清单显示的是它所属
COMPONENT_SET 的真名，原串保留在「变体」列 ⛔ 不丢信息；② 「distinct 组件」的去重口径 = **来源库 × 组件**，
同一组件出现在多个产品文件里只算一个。

**遗留（下一轮自动消化）**：首测那一行里 `Nancy's Design Assets` / `Sandra-TVU One` / `PL_3` /
`Producer Admin` / `Producer 2.0` 当时还没标 kind，记成了 `unclassified`（脚本自印了告警，
这正是设计意图）。标注已补进 `ds-health-mockup-targets.json`，**下一轮生效**；
首测那行**不改**（append-only），它存了 `bySource[].sourceFileKey`，可回溯重分类。

#### 3.5 DIM-U13 的分母侧候选集：产品级 pattern 索引 MVP（2026-08-14 落地，**只做了 LCD 一个文件**）

**判据真源** = [`scripts/lib/product-pattern-index.mjs`](../../scripts/lib/product-pattern-index.mjs)（纯函数，自测 [`tests/ProductPatternIndex.test.ts`](../../tests/ProductPatternIndex.test.ts) 10 条，含变体上卷 / 热度只数 file-local / 对账闭合三类故障注入验过）。
**采集** = `ds-health-scan-mockups.mjs` 在同一次 fetch 里多走一遍同一棵树，**对本轮测到的每个文件都建**。
**覆盖面 = 迄今被采过的文件**，⛔ 没有 opt-in 白名单（2026-08-14 拆，见下）；⬜ 只表示「还没跑过采集」，不表示被排除在外。
⛔ **条数别写死** —— 跑 `pnpm pattern:lookup`（不带参数）看当前覆盖面自印。
**产物** = `_generated/product-pattern-index.json`（**快照不是时间序列**，按 fileKey 合并）。

**⛔ 它不解锁本维度**（如实登记，别读成「DIM-U13 可以算了」）：它答的是「这个产品里**有什么**」，
而 DIM-U13 要的是「新迭代**复用了 / 没复用**」。分子「从 DS 原语重搭」当前**没有确定性判据** ——
一组摆在一起的 Button+Text 与一个被复用的 pattern，在 Figma REST 里长得不一样，但「该不该是同一个」是语义问题。

**LCD 首测的三条实测发现**（⛔ 别引用这些数，跑 `pnpm health:mockups` 现算）：

1. **pattern 数比想象中少两个数量级**：**27 个 distinct pattern**（16 个变体组含 57 个变体 + 11 个独立组件），
   对照 file-local 实例 **1604**。⇒ 提案 §3 那张「file-local 实例」表（LCD 1604）**不能读成「1604 个产品自有组件」**
   —— 平均一个 pattern 被摆 ~59 次。**索引小到人可以一眼扫完**，这对「画之前查一下」是好消息。
2. **可查性意外地好**：默认名（`Group NN` / `Frame NN`）**0 个**。提案 §5 A 担心的「答不了语义」在 LCD 上没发生
   —— 名字都是 `Home` / `LCD Button` / `WiFi_item` 这类真名。⚠️ **这是一个文件的样本**，⛔ 别外推到另外五个。
3. **查出一类原本不在任何 backlog 里的东西：孤儿 master** —— 4 个组件 / 14 个实例说「我来自本文件」，
   但文档树里**已无对应 COMPONENT**（master 被删或移走：`Status=Unmute` ×7 · `Icon/Disable` ×4 …）。
   ⇒ 下次要用只能重搭，**正是 DIM-U13 痛点本身的形态**。它是靠**对账恒等式**露出来的：
   `file-local 实例 = 归到 pattern + 孤儿 + 未解释`，产物里存着这三个数，`未解释` 必须为 0（实测 0）。
   ⛔ 没有这条恒等式，那 14 个会静默消失在 1590 与 1604 之间。

~~**扩到第二个文件的前置** = owner 看过这份真产物并认可口径（提案 §附录第 2 条）。~~
→ **✅ 2026-08-14 同日：整个「扩面」概念被拆掉**（owner 逐字：「**为什么要把消费级产品一个个拉进来？
我要做的是规则，不是实测**」）。`patternIndex: true` opt-in 白名单已删除。
**它的唯一理由**（提案 §附录第 2 条逐字：「判据**没被真实数据校验过之前**铺开，等于把错口径复制六份」）
**在 LCD 那轮跑完时就已不成立** —— 判据被校验了，还当场校出并修掉两个缺陷。
⇒ 限制由它自己宣布失效（同 `audit-layout-tokens` 的 shrink-only 豁免范式：修完由闸自己宣布，不靠人记得删）。
留着它的代价是实打实的：**又一份要人工维护、漏登记就静默少测的清单**。
⇒ 现在：建索引是采集的**顺带产物**（同一次 fetch 的第二次内存遍历），**没有任何人需要做「扩面」这个动作**；
未登记的产品文件用 `--only <任意 fileKey>` 就地采（ad-hoc，⛔ 不进 DIM-U12 时间序列 —— 覆盖面真源仍是 targets 清单）。

**✅ 提案 §7 的 Q2 已拍（owner 2026-08-14）：走候选 (a) —— 挂进 mockup 起手链。**
落地 = [`AGENTS.md` §Mockup 任务额外必读](../../AGENTS.md) **第 11 项**：跑一次 `pnpm pattern:lookup <figma URL>`。
⛔ 它是**查询不是闸**（always exit 0），Enforcement = **L1**；⛔ 也不是新建闸 —— 改的是已有必读链的内容（这正是 (a) 相对 (b)(c) 的取舍点）。

**为什么这一步必须是「跑命令」不是「读文档」**：提案 §7 逐字写着，能否定掉整个索引的唯一理由是
「没有任何机制保证有人在画之前查它」。只写一句必读，等于把这条规则的成败押在每个人每次都记得上 ——
那正是本仓「规则别继续往 L1 prose 加、优先升成机械可执行」要治的病。

⚠️ **但它仍停在 L1，且这是 owner 2026-08-14 拍定的终态、⛔ 不是待补的 TODO**：把「读文档」升成
「跑命令」解决的是**可执行性**（有明确动作、输出可读），**没有**解决**可强制性**（没有机制能发现有人
跳过）。两件事别混为一谈。⇒ 本条与 **DIM-Q4「L1-only 规则数」**的关系是：它**就该**计入那个数，
⛔ 别为了让 Q4 好看去给它造一个假闸。**「为什么停在 L1 + 重开条件」的唯一真源** =
[`scripts/pattern-index-lookup.mjs`](../../scripts/pattern-index-lookup.mjs) 头注释的 📌 段，⛔ 别在本文件维护第二份。

**⛔ 这一步最容易被用错的方式：把「查不到」读成「没有」。** 工具输出**四态**，只有 `covered` 能得出
「本产品已有 X」；其余的正确结论是「我查不到」，而**正确动作是当场采一次再查**（一步，不需登记不需审批）。
**四态语义的唯一真源 = [`scripts/pattern-index-lookup.mjs`](../../scripts/pattern-index-lookup.mjs) 头注释**，⛔ 别在本文件维护第二份。
⚠️ 态数从五收成四（同日）：`registered-not-opted-in` 随 opt-in 白名单一起消失，与 `no-artifact` 合并成
`not-collected` —— **合并的判据是「修法相同」**，⛔ 不是「想少一个分支」；修法不同的两个（要不要顺便
登记成长期测量目标）仍然分开。

⚠️ **第五态是首版实跑当场撞出来的**（如实留痕）：初版只有四态，拿**指定设计库自己**的 key 去查会落进
`not-registered`，然后被引导去「登记成测量目标」—— 而 `ds-health-mockup-targets.json` 的 `$warning`
逐字禁止这件事。⇒ 一个查询工具把人引去违反它自己读的那份配置的规则。已加 `designated-library` 态并
**判在最前**（即使有人已经误登记也照样警告），配 3 条单测钉住。

#### 3.6 DIM-U15 孤儿 master：**两个数并排，⛔ 别合成「孤儿率」**（2026-08-14 立项）

**它是什么**：实例说「我来自本文件」，但文档树里已无对应 COMPONENT（master 被删或移出本文件）
⇒ **下次要用只能重搭**。它是 owner 那句「用了设计库组件、没用当前产品已有的组件」里
**唯一可确定性识别**的成因 —— 不是「设计师忘了查」，是**结构上查不到、复用不可能**。

**为什么现在才立项**：它是 §3.5 的对账恒等式（`file-local = 归到 pattern + 孤儿 + 未解释`）**副产物** ——
不是有人去找它，是那条恒等式不许把差额静默吞掉，于是它自己掉出来了。⛔ 这条恒等式别拆。

**⛔ 判据纪律（与 §3.4「分子必须按来源拆」同形态）：master 数与实例数必须并排读。**
实测的两种形态，**修法完全不同**：

| 形态 | 长相 | 含义 | 修法 |
|---|---|---|---|
| **少 master · 多实例** | 个位数 master 背着几百个实例（实测最极端者 **一个 master ×617**） | 一次删除/移动**批量摧毁**了复用能力 | **一个动作救很多** —— 把那个 master 找回或重建并 relink |
| **多 master · 少实例** | 十几个 master 各带个位数实例（实测某文件 17 个 master / 71 实例） | 一批 master 被整体移走或散落 | **清点归位**，逐个判去留 |

合成一个「孤儿率」会把这两件事搅成一团，只能得出「有点问题」这种不可行动的结论 ——
**那正是 §3.4 首测时踩过的坑**（混合桶 24.66–95.87% vs 拆开后 0.15–14.98%，行动完全相反）。

⛔ **不设阈值、不判形态**（§4 方法论③）：`pattern:lookup` 只把 master 数 · 实例数 · 占 file-local 比 ·
「每 master 摊几个实例」四个数并排摆出来，**形态由读的人看**。判形态需要阈值，而阈值在稳定态噪声底
量出来之前只会逼出数字游戏。

⚠️ **两条如实边界**：
① **字段缺失记 `unknown`，⛔ 不记 0** —— 产物按 fileKey 合并，早于本字段的旧条目没有它；
   把「那轮没测」渲染成「0 个孤儿」= 造平滑向好的假趋势（钉子 = `tests/PatternIndexLookup.test.ts`
   「⛔ 字段缺失记 unknown」+ **阴性对照**「真测到 0 必须记 0」，两条一起才守得住）。
② **分母为 0 时占比给 `null` 不给 0%** —— 「没有分母」不是「没问题」。实测确有一个文件
   file-local 只有 2 个实例而两个都是孤儿（100%），孤立看像灾难，**配上分母就知道信息量约等于零**（G5）。

**趋势读法（2026-08-14 接上 —— ⚠️ 但趋势本身还没有，别把这两件事读成一件）**：

采集器**从一开始**就把 `patternIndex` 写进 `ds-health-history.jsonl` 的每个 result 行，
而读方 `ds-health-delta.mjs` **一个字段都没读** ⇒ 数据进了时间序列，趋势却读不出来。
⛔ **「采集器写了」≠「有人读得到」** —— 它与「取证失败不记 0」是同一条纪律的两端：
那端防**假数据**，这端防**真数据无人读**。（该脚本原有的 ⛔ 注只写给「新 kind」，
而这次是**同一个 kind 长出新字段** —— 同样成立，已就地补进它的头注释。）

读法已补，三条纪律各配钉子（`tests/DsHealthDelta.test.ts`）：
① ⛔ 不合成孤儿率 —— master 数与实例数各自独立给出，形态相反时两边都如实报（结构性钉子：delta 里不许出现任何合成率字段）；
② 上一点**没有该字段 ⇒ unknown、⛔ 不当 0**（故障注入）；
③ ②的另一半 —— **真测到 0 必须记 0**（阴性对照）。缺③，②会退化成「一律记未知」的空过。

⚠️ **⛔ 别把「读法接上了」读成「趋势有了」**：全量采集后各目标**只有第一个点**，
同口径对照只有一个文件（其余逐条印 unknown），**下一轮才第一次出真 delta**。
⚠️ ③ 那条阴性对照**在真实数据上当场生效**：确有目标本轮**真测到 0 个孤儿** ——
它记的是 0 不是 unknown，与「上一点缺字段」的 unknown 在同一屏里必须能分开。

**⛔ 别引用本节任何数** —— 全部跑 `pnpm pattern:lookup` 现算（G4）。

#### 3.7 DIM-U13 的分子：**「比率不可算」是终态**（2026-08-14 AI 提 → **同日 owner 拍定**）

分母侧已解决（§3.5）。分子 =「从 DS 原语重搭（而不是复用产品已有 pattern）的次数」，
问题是**它在 Figma REST 里不是一个可判定的对象**：

- 「复用了产品已有 pattern」→ 一个 INSTANCE，`componentId` 指向 file-local master ⇒ **确定性可判**；
- 「从 DS 原语重搭」→ 一堆 DS 库 INSTANCE 装在 FRAME/GROUP 里。结构上能确定性地判出
  「它不是任何产品 pattern 的实例」，但**判不出「它和某个已有 pattern 是不是同一件事」** ——
  那是**语义等价**问题。可用的手段只有名字/结构相似度 = **启发式**，
  逐字撞 [`FIGMA_AS_SOURCE_OF_TRUTH.md` §验证方法](../FIGMA_AS_SOURCE_OF_TRUTH.md)「不允许启发式」
  （该节实证假阳率 ≥40%）。⇒ **⛔ 这条路封死，不是「还没做」。**

**⇒ ✅ owner 2026-08-14 拍定**（AI 提 + 逐条理由，owner 同意推荐）：与 mockup 链第 11 项停在 L1 同形态 ——
**不硬凑一个会骗人的比率**，改为并排读三个**各自确定性**的子量，且**都不叫 DIM-U13**。
⛔ **这条是终态，不是待办** —— 别再有人来给 DIM-U13 设计分子；要动它只有下方写死的重开条件一条路。

| 子量 | 确定性吗 | 现状 |
|---|---|---|
| **复用被结构性阻断**（DIM-U15 孤儿 master） | ✅ 判据确定 | ✅ 2026-08-14 已落地（§3.6） |
| **复用发生数** = 两个测量点之间 `attributedInstances` 的增量 | ✅（instance→master 是硬链接） | 🟡 **前置已解锁**（2026-08-14：全量采集 + delta 侧读法，§3.6 末段）—— `pnpm health:delta` **已在打它**。`attributed` 由对账恒等式派生（`local − 孤儿 − 未解释`），⛔ 刻意不让采集器另存一份会漂的同源数 —— 这是**代数恒等**不是近似（采集器逐字定义 `unexplained := local − attributed − 孤儿`，代入即得，与 unexplained 是否为 0 无关）。⚠️ **仍只有第一个点** ⇒ 真增量要等下一轮；且 **⛔ 它不是 DIM-U13、⛔ 不许被合成回一个「复用率」** |
| **新建 pattern 数** = 两点之间新出现的 file-local master 数 | ✅ 可算，但 **⛔ 不等于「重搭已有」** | 同上。它混着「真的新东西」（§3.1 三分法的②缺口）—— **⛔ 别当分子用** |

**⛔ 重开条件（写死，别靠人记得）**：出现**确定性**的语义等价信号才重开 —— 例如 Figma 侧出现显式的
「这个 frame 是那个 pattern 的重搭」结构信号，或产品线约定给重搭件打可机械识别的命名/标记。
**相似度算法不算**，无论准确率报多高。

### S · 稳定（漂移 · 回归 · 升级）

| ID | 维度 | 活源算法 | 自动 | 基线 |
|---|---|---|---|---|
| DIM-S1 | **升级适配成本** | 消费仓每次升 DS 版本的那个 commit 里，自己改了多少行 —— **breaking 的真实代价** | ✅ | |
| DIM-S2 | **版本滞后天数** | 消费仓钉的版本发布日 → 今天 | ✅ | 两个 app 均 `^1.2.0` = **滞后 0**（2026-08-13） |
| DIM-S3 | **闸抓到的真缺陷数** | git log / CI 历史里闸拦下的真问题 | ❌ 季度人工 | |
| DIM-S4 | **假绿被发现次数** | 「闸绿但语义已烂」实例数。08-13 D5 一次找到 3 个 | ❌ 季度人工 | |
| DIM-S5 | **stale 订正次数** | backlog 清理中「entry 与活源不符」的条数 —— **这是账本变准，⛔ 不等于系统变好** | ⚠️ | |
| DIM-S6 | **render 验证覆盖** | manifest 条数 + 实跑通过条数 | ✅ | |
| DIM-S7 | **破坏性变更频次** | CHANGELOG 里 major/breaking 条数 / 版本数 | ✅ | |
| DIM-S8 | **返工轮次**（owner 2026-08-13 补：「返工次数很多」） | 每个交付物从首版到验收改了几轮。活源候选：`design-review-queue` 条目生命周期 · mockup 交付区的迭代 commit 数。⛔ Figma 版本历史那条**不可用**（受 [[INFRA-F79]] plan 约束，见 §6） | ⚠️ | |
| DIM-S9 | **a11y 回归棘轮存在性与规模** | 具名冻结的 a11y 失败对数（只许缩）。两条真源：`tests/a11y-non-text-contrast-ratchet.test.ts`（WCAG 1.4.11 非文本对比度）+ 2026-08-31 那份文本对比度具名豁免表 `tests/lib/a11y-contrast-exemptions.mjs`。⚠️ **棘轮日常真正守的是「回退」与「比值/状态退化」**，⛔ 不是「拦住新引入的不达标配色」（`SURFACE_PAIRS` 是固定 10 对 × 2 theme ⇒ 第 21 条只能来自有人往里加对子）| ✅ | **2026-09-07：非文本 20 对具名冻结（10 pair × 2 theme，全部 fail）· 只涉 4 个 element token**（`--line-border` / `--line-light` / `--line-deep` / `--bg-grey-btn-en`）⇒ ⛔ 不是 20 处独立修法 |

### Q · 质量（约束真覆盖）

| ID | 维度 | 活源算法 | 自动 | 基线 |
|---|---|---|---|---|
| DIM-Q1 | **M-rule 真守率** | 有闸真守的 M-rule 数 / M-rule 总数 | ⚠️ 需 rule→gate 映射 | |
| DIM-Q2 | **R-rule 真守率** | 同上（注：DS 仓内 0/20 是 `code-conventions.md:9` **明示设计决定**，非缺陷） | ⚠️ | |
| DIM-Q3 | **业务规则覆盖率** | `domain-tvu.md` 12 条的真覆盖 —— **体系最薄且唯一无法靠 DS 库兜底的一层** | ⚠️ | |
| DIM-Q4 | **L1-only 规则数** | 无任何机械保护的规则条数 | ⚠️ | |
| DIM-Q5 | **闸挂载自声明率** | 头注释显式标 L1–L5 的闸数 / 总闸数 | ✅ | |
| DIM-Q6 | **逃逸面：report-only 闸占比** | report-only 闸数 / 总闸数 | ✅ | |
| DIM-Q7 | **豁免表条目总数** | 各 shrink-only 豁免表条目合计（**表空着是终态，不是待办**） | ✅ | |
| DIM-Q8 | **闸自测覆盖** | 带 vitest 单测的闸数 / 总闸数；其中带故障注入的数 | ✅ | |
| DIM-Q9 | **承诺-vs-实现落差条数** | PROJECT_GOAL 承诺 vs 实现真相（07-08 §5 范式） | ❌ 人工 | |
| DIM-Q10 | **零挂载孤儿闸数** | 在 `package.json`/`.husky`/`.gitea` 全零命中、且头注释无「为什么不挂」的脚本数 | ✅ | |
| DIM-Q11 | **头注释 stale 数** | 头注释声明与代码实际行为不符的闸数（08-13 D4 找到 2 个） | ⚠️ | |
| DIM-Q12 | **Acceptance 段三态比** | `node scripts/audit-acceptance-gate-coverage.mjs --json` ⇒ `totals.gated / (gated + notMachineCheckable + unclassified)`；⚠️ 单位是 **Acceptance 段**，⛔ 不是「规则条数」（那是 DIM-Q1，两者⛔ 不可互换）| ✅ | **2026-09-07：gated 35 · nmc 50 · unclassified 48（Σ 133）⇒ 26.3%** |
| DIM-Q13 | **工具耦合度（执法绑 Claude Code）** | 扫 `scripts/`+`figma-sync/` 的 `audit-`/`smoke-`/`check-` 前缀脚本头 45 行：**唯一**挂载产物在 `.claude/hooks/` 的闸数 / 有自有挂载（D1）声明的闸数。⚠️ **必须并排出规则级那个数**（那 1 条引擎承载多少条规则）—— 闸级数会严重低估此病 | ✅ | **2026-09-07：闸级 1/40（`audit-mockup-conformance.mjs`）· 规则级 13**（`scripts/mockup-rules/index.mjs` 注册模块数）|
| DIM-Q14 | **跨组件 API 自洽性** | 三条已在跑的闸的分母 + 违例：`audit:prop-naming` · `audit:framework-api-floor` · `audit:binding-config-parity` | ✅ | **2026-09-07：prop-naming 37 组件 / 0 违例 · api-floor 189 文件 · 70 vue import · 26 具名符号 · binding-parity 逐组件 PASS** |

### E · 效率（体量 · 成本 · 增速）

| ID | 维度 | 活源算法 | 自动 | 基线 |
|---|---|---|---|---|
| DIM-E1 | **L-core 体量** | `wc -c` 四份 L-core | ✅ | |
| DIM-E2 | **规则文件总行数** | 五份规则文件 `wc -l` | ✅ | |
| DIM-E3 | ⭐ **规则增速 vs 闸覆盖增速** | Δ(DIM-E2) vs Δ(DIM-Q1)，**并排** | ✅ | |
| DIM-E4 | **mockup 链读法差** | scoped 读 KB vs 全读 KB | ✅ | |
| DIM-E5 | **backlog Active 条数** | `grep '^### ' backlog.md`（⚠️ 配 DIM-S5 一起读，否则会把「账变准」误读成「系统变好」） | ✅ | |
| DIM-E6 | **docs 总体量** | `docs/` 字节数 | ✅ | |

> **DIM-E3 是本表最重要的一条**：它是「越修越约束不住」这个担忧的**精确定义**。规则文本在稳定增长（STATUS §一.5 实测：五份 7674 行、**十天涨 347**），而闸覆盖率增速**从未与它并排测过** ⇒ 当前既不能证实也不能证伪。

### X · 横切（07-08 §横切质量属性 40 项 —— 08-13 一条都没复测，此处收编防再次蒸发）

| ID | 维度 | 活源算法 | 自动 | 备注 |
|---|---|---|---|---|
| DIM-X1 | bundle 体积 + `sideEffects` | dist 字节 + package.json 字段 | ✅ | 07-08 记录 2.1MB 主包 / 96K CSS / 无 size gate |
| DIM-X2 | i18n 可本地化率 | 组件内硬编码英文串数 | ✅ | 已有 `audit:no-hardcoded-ui-strings` |
| DIM-X3 | motion token 化率 | 硬编码 transition 数 / 总数 | ✅ | 07-08：12 组件散乱 0.12–0.3s，无 `--duration/--ease` |
| DIM-X4 | 主题扩展点 | 主题数 + 有无 `useTheme` | ✅ | 仅 dark/light 两套 |
| DIM-X5 | 图标闸挂载 | `audit:icon-*` 是否进 prepublish | ✅ | |
| DIM-X6 | 供应链 | 有无漏洞扫描 / dependabot / SBOM | ✅ | 07-08：全无 |
| DIM-X7 | 发布产物完整性 | 有无 publint / attw / pack 内容 gate | ✅ | |
| DIM-X8 | 回滚 runbook | RELEASING.md 有无「发坏了怎么办」 | ✅ | |
| DIM-X9 | 响应式 scope 声明 | `src/` 中 `@media` 数 + 是否书面声明 desktop-first | ✅ | 07-08：0 处 |
| DIM-X10 | 采用度量 / blast-radius | 有无索引 | ✅ | **本表 U 类正在闭合它** |
| DIM-X11 | 组件成熟度分级 | 有无分级字段 | ✅ | |
| DIM-X12 | 治理文档 | CODEOWNERS / SUPPORT / ACCESSIBILITY / issue 模板 存在性 | ✅ | |
| DIM-X13 | 三视图覆盖 | Use Cases / Design Spec / Status Matrix 各覆盖页数（真源 = `audit:docs-site` 自印 `threeViewPending`，⛔ 别手抄分母） | ✅ | |
| DIM-X14 | RTL 支持 | 逻辑属性使用率 | ⚠️ | 07-08：≈0 |
| DIM-X15 | 微文案中央层 | 有无中央 microcopy / voice-tone 规范 | ✅ | |
| DIM-X16 | **跨产品方案级一致 / pattern 索引** | 有无「产品设计层先例 + pattern 索引」。**07-08 元层原文一条，建表时被我漏收，2026-08-13 由 owner 从实际痛点重新提出**（DIM-U13 的前置） | ✅ 存在性 | 07-08：REQUEST-INDEX 是每产品的，无跨产品索引 |
| DIM-X17 | **pattern 覆盖率**（DIM-X16 只是存在性格，这是覆盖率格） | 与 DIM-U16 **同一个量具**：`audit-docs-site-readiness.mjs` 的 `designSpec` 已就绪页数 / `componentPages`。⚠️ 2026-07-17 那份评估的「Patterns 仅 1 处先例 = 1/25」与 Documentation 行的「Design Spec 1/25」**是同一个数**，⛔ 别当两条独立证据用 | ✅ | **2026-09-07：1/25** |
| DIM-X18 | **发布产物里的溯源悬空引用数** | `llms.txt` 引用的文件里，**不被 `package.json` 的 `files[]` 覆盖**的条数 / 引用总数 ⇒ 仓内 PASS 而发布后断。⚠️ 与 §6 那类「闸看不到发布产物」同族 | ✅ | **2026-09-07：2/5 悬空** —— `ux-team/tvu-design-system/icons/manifest.json` · `figma-data/render-verification-manifest.json` |
| DIM-X19 | **基础标度缺口** | `grep -cE '^\s*--(duration\|ease\|motion\|density\|z-)' src/tokens/variables.css` 按族分别数。⛔ **分族读，不合成一个数** | ✅ | **2026-09-07：motion 族（`--duration`/`--ease`/`--motion`）= 0 · `--density` = 0 · `--z-*` = 4**。⚠️ **更正 §1 那条读数**：2026-07-17 评估写「无 z-index 标度」，而 `--z-dropdown` / `--z-tooltip` / `--z-modal` / `--z-select-portal` **确实存在**。⛔ 但也别读成「已有标度」—— 前 3 个值**都是 1000**，只有 portal 是 1100 ⇒ 它是一层**命名**，不是分级标度 |

---

## 4. 方法论（比加指标更重要）

1. **每个绝对数配分母**（G5）—— 否则项目一大数字就涨，看着像退步。
2. **记录值 + 方向，方向优先** —— `88.3%` 本身没意义，`88.3% → 91%` 才有。首次跑只是基线，**第二次才开始产出信息**。
3. **⛔ 前 4–6 次只记录 + 打印 delta，不设阈值、不上闸** —— 稳定态噪声底没量出来之前设阈值，只会逼出数字游戏。对齐既有教训「收紧阈值前先在稳定态量噪声底」。
4. **区分「账本变准」和「系统变好」** —— 见 DIM-S5 / DIM-E5。

---

## 4.5 「评估和做任务是分开的，怎么知道它在变好？」（owner 2026-08-14 逐字提问，本节是回答）

**这个困惑是对的，而且它指的正是当前状态的缺陷。** 拆成三层，各有各的答案：

### (a) 分开是**故意的**，不分开会毁掉指标

评估必须与做任务分开**执行**，否则北极星（绕过率）当场失效：一旦「合规率」在做任务时被闸拦，
人就会去改判据或绕过，而不是真把 DS 做好用（§5 Goodhart 已登记这条）。
⇒ **观测器 always exit 0、不设阈值**，这不是没做完，是设计。

### (b) 真正的缺陷是**触发**分开了 —— 现在只能靠人想起来跑

这才是 owner 困惑的来源：**没有任何机制让它自己发生**。整套东西目前是
「有人在某个 session 里想起来 → 手动跑 → 写一行」。这与 [`PROJECT_GOAL.md`](../PROJECT_GOAL.md)
§操作模型第 ② 条「使用者不必懂流程，**系统自行触发**」直接冲突 ——
07-08 评估元层那行「流程可观测 · 现状：无」标了 P1 一个多月零动作，成因就是这个。

**已做的一半**：一条命令 `pnpm health:snapshot`（= 两个采集器各 `--write` 一次 + `health:delta`）。
~~**没做的一半（⏳ 等 owner 拍触发点）**~~ → **✅ 2026-08-14 已落地 ⭐1**：`scripts/release.mjs` **step 1e**，
就在 1b/1c/1d 三个 blocking gate 之后 —— 位置相同、**语义相反**（那三个 fail 就拦发版，这个**永远不拦**）。

| # | 触发点 | 代价 | 判定 |
|---|---|---|---|
| ⭐ 1 | **每次发版时**（`release.mjs` step 1e，与已有 render-gate 同位置） | 零新增习惯；发版本来就要跑一串东西 | **✅ 已落地** —— 发版是本仓唯一稳定、可观测、已有人守的节奏 |
| 2 | 每周定时（launchd / cron） | 要配一台机器常开 + Figma 凭据在场 | 未采用；跨机器会漂。**⛔ 重开条件见下**（owner 2026-08-14 补） |
| 3 | 维持手动 | 零成本 | ⛔ 等于回到「标了 P1 一个多月零动作」 |

**⛔ 触发点 2 的重开条件（owner 2026-08-14 补 —— 判据不是日期）**：
当年判它「未采用」时**没留重开条件**，而本仓自己的纪律是「被否决策要写重开条件」⇒ 补上。
**成因是 2026-08-14 实测撞出来的新事实**：`health:snapshot` 的**唯一**自动触发点就是 ⭐1
（已交叉核过全部调用点）⇒ **攒点速度完全绑在发版频率上**，而发版间隔实测波动极大
（同一年里有 11 天发 3 次的，也有连续两周一次没有的）。§4 方法论③ 要 4-6 个点才能下趋势结论。
⇒ **判据**：`ds-health-history.jsonl` 里**相邻两个测量点的间隔 > 30 天，累计发生 ≥2 次**
⇒ 重开触发点 2。**「重复」是要求**（一次可能只是恰好在清 backlog），**可机械核**（行里就有 `measuredAt`）。
⛔ **不设到期日** —— 「到点就得加个 cron」会把按证据触发的规则变成日程驱动。
⛔ 也别拿「最近好久没发版了」当理由直接上 cron：那正是这条判据要求先攒证据的原因。

⚠️ **它挂在 release 里但不是闸**（发版跑 ≠ 发版拦）：采集器 always exit 0，非零退出也只印一行继续发版。
理由在 (a)：一旦「合规率不达标就发不了版」，人的最优解是改判据或绕过，北极星当场失效。
⚠️ 三个落地细节，⛔ 别在别处重述（真源 = `release.mjs` step 1e 的注释块）：
① 它写的 TRACKED 文件（history + 两个派生产物 + 来源缓存）**跟着 release commit 一起提交** ——
不然发完版工作树留脏，下一次 preflight 的「Working tree not clean」会被上一次发版自己绊倒；
② owner 在 step 4 答 N 中止时，那一行历史**已经 append 了**，重跑会给同一天写第二行（append-only，不回改）；
③ 无凭据 / 网络失败时采集器记 `status:"error"`（⛔ 不记 0），发版照常。

**delta 怎么读** = `pnpm health:delta`（`scripts/ds-health-delta.mjs`）。它机械检查 (c) 表里的第 ② 行：
两个测量点之间**判据文件动过没有**，动过就红字告警「这不是同口径对比」。⚠️ 粒度只到「天」⇒ **会多报、不会漏报**。
**首次运行当场证明了它的必要**：08-13 → 08-14 三个文件的 ⭐ 率「变差 3–7pt」，实为 owner 08-14 口径裁定
（个人素材库并入 ⭐）造成，判据告警 + 「未分类来源 981→0」两条同时打出 ⇒ 读者不会误读成设计师做错了什么。

### (c) 「怎么知道变好」= **看方向，不看单次值**，且要能区分三种「变好」

| 现象 | 是不是真变好 | 靠什么区分 |
|---|---|---|
| 数字变好，**判据没动** | ✅ 真变好 | 判据在 git 里，改判据必留 diff |
| 数字变好，**因为改了判据/阈值** | ❌ 账面变好 | §5 Goodhart 表逐条登记了每个指标的规避方向 |
| 数字变好，**因为账本变准**（stale 订正） | ⚠️ 不是系统变好 | DIM-S5 / DIM-E5 并排读（§4 方法论④） |

**首次跑只是基线，第二次才开始产出信息**（§4 方法论②）。⛔ **已攒几个点别在这里写死**
（此处 2026-08-14 已 stale 过一次）—— `pnpm health:delta` 每次运行自印「已攒 N 个点」，读它。
**在攒够之前还答不了「在不在变好」，这是诚实的现状，不是机制没用**。
按 §4 方法论③ 前 4–6 次只攒基线；⇒ **攒够之前，「越修越好还是越约束不住」这个问题
在数据上无解**，别提前下结论。

### (d) ⛔ 攒够点之前，别把这些数往**面向使用者的入口**里接（owner 2026-08-14 拍定）

**判据**：在同一口径下**攒够 4-6 个点**（§4 方法论③）之前，⛔ 不把健康度的任何数或派生产物
接进面向使用者的入口 —— 上手页（`playground/docs/pages/OnboardingPage.vue`）、文档站、
交付物、对外报告，**一律不接**。

**理由不是「还没做完」，是机制自己说了它现在没有信息量**（§4 方法论②逐字）。提前接 =
让人从噪声下结论；而且**方向也错** —— 这套东西服务的是**维护者**回答「越修越好还是越约束不住」
（本表缘起），**不是新人**。新人要的是「我该怎么做」，指标答不了那个。

**⛔ 两个已经被否掉的具体形态，写下来防复发**（2026-08-14 AI 提 → owner 当场否）：

① **把 ⭐ 拿错设计库清单接进上手页，当「看 DS 是否稳定可靠」的入口** —— **口径就是错的**：
   它答的是**产品稿的卫生**（我们自己画的稿里有多少实例来自老库），**不是 DS 本身的质量**。
   新人看到高比率会得出**完全相反**的结论（以为设计系统烂）。同 §3.4 混合桶那个坑的形态。
② **拿 DIM-U10「三个 P1 受众零入口」给 ① 背书** —— **误读**：那条说的是各受众**自己关注点**的
   入口（设计 spec / use cases / status matrix，真源 [`PROJECT_GOAL.md`](../PROJECT_GOAL.md)
   §受众表 + §关键产出物 3），**与健康度指标无关**。

⚠️ 同轮一并否掉的还有「把 `pattern:lookup` 写进上手页」：实测多数产品文件的 pattern 数是**个位数**
（⛔ 别引用，跑 `pnpm pattern:lookup` 现算），「画之前查一下」在它们身上一眼看完、收益接近零；
加上它**只收当前文件的 file-local 组件**（散在历史老稿里的 pattern 缺席）⇒ 对新人是边际价值。

**⇒ 解除条件**：攒够 4-6 个点、且 `pnpm health:delta` 能打出**同口径** delta 之后再议；
那时要接也**先回答「接给谁看、他拿这个数做什么决定」**，⛔ 别因为「机制做好了」就往外铺。

## 5. Goodhart 风险登记（指标一旦当目标就会失真的方向）

| 指标 | 被规避时内容流向哪 | 对策 |
|---|---|---|
| **绕过率（U1–U6）** | 最省事的规避 = **把 DS 源码复制进自己仓** —— 扫不出绕过，还顺便绕过了升级 | 同时测「与 DS 源码高相似度的本地文件」 |
| **M-rule 真守率（Q1）** | 把难守的规则**删掉**，分母变小、比率变高 | 与 DIM-E2（规则总行数）并排读；规则删除需留证 |
| **backlog 条数（E5）** | 把 entry 合并成一条 | 与 DIM-S5（stale 订正数）并排读 |
| **L-core 体量（E1）** | 把内容挪到别的文件，链路总量不变 | 用 DIM-U9（每场景必读 KB）兜底，它测的是终态 |
| **闸自测覆盖（Q8）** | 加空测试 | 记「带故障注入的闸数」作为子项 |

---

## 6. 诚实边界（⛔ 别假装能自动测）

- **❌ 不可自动测的 4 条**：DIM-S3 / S4 / Q9，以及一切主观体验。**「省心/不省心」是主观感受，技术上不可自动采集** —— 任何声称能自动测「省心度」的方案，实际都在测别的东西然后贴了个标签。本表的做法是**采集绕过行为代替采集感受**（人嘴上说好用但每次都自己搓组件时，行为已经答了，且答得比问卷准）。
- **判据最弱的 3 条**：DIM-U4（自搓组件）· DIM-U6（弃用事件）· DIM-U11（摩擦地图）。第一版一律 **report-only + 打印判据边界**，不设阈值。
- **Figma 侧设计师行为**（改了几版 / 卡在哪）**不在本表**：需要 Figma version history / comments API，而所需 plan **未实测**。⛔ 受 [[INFRA-F79]] 约束：**别再重签 Figma PAT、别再问 owner 确认 plan**。要做先单独提案。
- **本表基线列里的 2026-08-13 粗测值**（U2 / U3 / S2）是**手工 grep 出来的**，未排除已登记例外、未逐个人工判违规。⇒ 首次跑脚本时**必须由脚本重算**，⛔ 别把这几个数当基线继承（G4）。

---

## 7. 变更日志（G2：删除必须留证）

| 日期 | 动作 | 维度 | 理由 | 谁拍 |
|---|---|---|---|---|
| 2026-08-13 | 立表 | 全部 | 见文件头缘起 | owner |
| 2026-08-13 | **删除** | ~~override 密度（`!important` 计数）~~ | 实测两个消费 app 均为 **0**，零信息量还占位 ⇒ 由 DIM-U5（`:deep()`/类选择器改写密度）取代，后者灵敏得多 | AI 提，owner 同轮认可 |
| 2026-08-13 | **新增 4 条** | DIM-U12 库归属错误率 · DIM-U13 产品内 pattern 复用率 · DIM-U14 横向一致性走查覆盖率 · DIM-S8 返工轮次 | owner 从**实际痛点**提出：「拿错设计库的组件，遇到很多次」「功能迭代时没有横向对比 UX 一致性，返工次数很多」「用了设计库组件、没用当前产品已有的组件」 | owner |
| 2026-08-14 | **口径收口（owner 裁定）** | DIM-U12 的 ⭐ 分子 | owner 逐字：「**真正的设计库只有 TVU UX Design System**」⇒ 个人素材库并入 ⭐；两个 kind 合成 `foreign-library`。重算见 §3.4（三个文件抬高、另三个一分未动） | owner |
| 2026-08-13 | **口径订正（不是删维度）** | DIM-U12 分子按来源 file 拆 | 首测发现原口径的分子是混合桶（拿错库 / 产品自有老稿 / 不可解析 / 个人素材库），合起来 24.66–95.87%，拆开后 ⭐ 只有 0.15–14.98%，**两个口径导出的行动完全相反**。详见 §3.4 | AI 提 + 实测证据，⏳ 个人素材库那一格待 owner 拍 |
| 2026-08-14 | **前置解锁（分母侧）** | DIM-U13 | pattern 索引 MVP 落地（**只做 LCD 一个文件**，判据抽成 `scripts/lib/product-pattern-index.mjs` + 10 条自测）。⛔ **维度仍不可计算** —— 分子「从 DS 原语重搭」无确定性判据。⚠️ 顺带查出**孤儿 master** 这一类原本不在任何 backlog 里的东西（靠对账恒等式露出来的），详见 §3.5 | owner 拍走提案 A，AI 执行 |
| 2026-08-14 | **可交付面 + 触发点** | DIM-U12 · 全表 | ① DIM-U12 多产一份 `foreign-library-cleanup.md`（设计侧工单，全量成功才写）② `pnpm health:snapshot` 挂进 `release.mjs` **step 1e**，闭合 §4.5 (b)「触发分开了」那个缺陷 ③ 新增 `pnpm health:delta`，机械检查「判据在两点之间动过没有」。**⛔ 三者都不是闸**：观测器 always exit 0，前 4-6 次只攒基线 | owner 推荐 ⭐1，AI 执行 |
| 2026-08-14 | **新增 1 条**（grow-only） | DIM-U15 复用被结构性阻断（孤儿 master） | 它在 §3.5 首测时就被对账恒等式撞出来了，但一直挂在「已查出、未立项」——**登记表里没有它 = 下一轮换套轴时它就蒸发**（G1 要治的正是这个）。判据不新发明（复用 `findOrphanLocalInstances`），现算入口 `pnpm pattern:lookup`，⛔ 不设阈值。两种形态必须并排读，见 §3.6 | AI 提（实测派生），⏳ owner 可按 G2 留证删 |
| 2026-08-14 | **提议判终态** | DIM-U13 分子 | 分子要判「语义等价」，唯一可用手段是相似度启发式 ⇒ 逐字撞 `FIGMA_AS_SOURCE_OF_TRUTH` §验证方法。⇒ 建议**不硬凑比率**，改并排读三个确定性子量 + 写死重开条件（§3.7）。**⛔ 这是「路封死」不是「还没做」** | AI 提，⏳ owner 拍 |
| 2026-08-14 | **划边界（owner 拍，⛔ 不是加维度）** | 全表的**对外接口** | owner 逐字：「现有的这个维度的东西，看起来没什么参考价值，写进去的意义不大」⇒ 立 §4.5 (d)：**攒够 4-6 个点之前，⛔ 不把健康度的数往任何面向使用者的入口接**。**机制自己的判据支持这个判断**（方法论②「第二次才开始产出信息」）。同轮记下两个被否的具体形态（清单当「看 DS 稳不稳」的入口 = 口径错 · 拿 DIM-U10 背书 = 误读）+ 一个被否的边际提议（`pattern:lookup` 进上手页）。**⛔ 这条是防复发的，不是待办** | owner |
| 2026-08-14 | **判终态（owner 拍）** | DIM-U13 | AI 提「比率不可算是终态」+ 逐条理由，**owner 同意推荐** ⇒ 本维度**不再有值**，改并排读 §3.7 三个各自确定性的子量。⛔ 「路封死」不是「还没做」：别再为它设计分子，重开条件已在 §3.7 写死（**相似度算法不算，无论准确率报多高**）。⚠️ **⛔ 不删本维度**（G1 grow-only）—— 它留在表里正是为了让「这条路封死了」这件事下一轮换轴时不蒸发 | owner |
| 2026-08-14 | **补重开条件（不是改判定）** | §4.5 (b) 触发点 2 | 当年判「未采用」时没留重开条件，违反本仓「被否决策要写重开条件」的纪律。实测新事实：`health:snapshot` 唯一自动触发点就是发版 ⇒ 攒点速度绑发版频率。判据 = 相邻测量点间隔 > 30 天累计 ≥2 次（可机械核），⛔ 不设到期日 | owner 拍 AI 推荐 |
| 2026-08-14 | **读法补齐（⛔ 不是新维度、不是新判据）** | DIM-U15 的趋势 · §3.7 子量② | 采集器一直在往时间序列写 `patternIndex`，但 `ds-health-delta.mjs` **零读法** ⇒ 数据在里面、趋势读不出来（**「写了」≠「读得到」**）。本轮：① 补读法 + 10 条自测（缺字段故障注入 / 真 0 阴性对照 / ⛔ 不合成孤儿率的结构钉子）② 全量采集让每个已登记目标各补一个 `patternIndex` 点。⛔ **趋势仍未产生** —— 同口径对照只有一个文件，下一轮才第一次出真 delta，别读成「DIM-U15 已有趋势」 | AI 执行（实测派生） |
| 2026-08-13 | **补收 1 条** | DIM-X16 跨产品方案级一致 / pattern 索引 | **建表时的漏收** —— 它在 07-08 元层原文里就有（P2），我合并时漏掉，被 owner 的 DIM-U13 痛点反向撞出来。**grow-only 机制的第一次实际生效**：漏的维度靠「新维度只能加」被追回，而不是等下一轮换套轴时永久蒸发 | AI 认领 |
| 2026-09-04 | **补收 1 个派生源**（⛔ 不是新增维度） | §1 派生源表 + 8 条未覆盖读数登记 | **建表时的第二次漏收，与上一行同族但更严重**：漏的是 `_archive/_reports/2026-07-17-ux-design-system-maturity-assessment.md`（32,683 B），而它的权重设计（**UX 设计系统质量 70%**）恰好就是本表要衡量的那个视角。活树入站引用只剩 **1 处**、本表引用 **0 次** ⇒ **G1 grow-only 保护不到自己没引用的东西**。🔴 其中 `prose:gate≈73:1` 就是 DIM-Q1 要的那个比例，**2026-07-17 已算过一次**（⛔ 别再说「没测过」）；另有一格是「**有量具、无维度格**」（跨组件 API 不自洽 ↔ 三条已在跑的闸），方向与本表常见缺陷相反 | owner 命做（逐字「需要做」）；⛔ 本轮**只登记派生源 + 未覆盖清单，未新增任何 DIM、未改任何判据** —— 那 8 条各自该不该立格是价值取舍，⏳ 待 owner 拍 |
| 2026-09-07 | **新增 8 条**（⛔ 无删除、无改动现有判据） | DIM-Q12 Acceptance 段三态比 · DIM-Q13 工具耦合度 · DIM-Q14 跨组件 API 自洽性 · DIM-S9 a11y 回归棘轮 · DIM-U16 文档站三视图就绪度 · DIM-X17 pattern 覆盖率 · DIM-X18 发布产物溯源悬空数 · DIM-X19 基础标度缺口 | owner 2026-09-07 拍 Q4（`ai-ds-lab/docs/decision-queue.md`）后由 agent 按读数落地。agent 自定的成文规矩：**只立此刻能取到数的格**；取不到数的判「不立」+ 写重开条件。🔴 **逐条实测后结论与队列预判不同**：队列按印象分成「3 条能取数 / 5 条取不到」，实测 **8 条全部取得到** ⇒ 全部立格、0 条判不立 —— 那 5 条里至少 3 条只是**没人去取**（执法绑 Claude Code ⇒ 扫头 45 行数 D1 挂载产物即得 1/40；Use Cases / Design Spec ⇒ `audit-docs-site-readiness.mjs` 早就在算；llms.txt 悬空 ⇒ 仓内可算 2/5）。⚠️ **两条如实登记的更正**：① `prose:gate≈73:1` 的**原算法不可复现**（实测 4 个候选口径全不落在 73:1）⇒ DIM-Q12 用的是另一个明确口径，⛔ 不许说它延续那条读数；② 「无 z-index 标度」**是错的** —— `--z-*` 有 4 个，但前 3 个值都是 1000 ⇒ 是命名不是分级标度（motion 族与 `--density` 确为 0，那两半成立） | owner 拍分档；8 条各自的立/不立由 agent 按读数定（⛔ 未再问 owner —— 那正是 §1.1 自查的含义）|
