# DS 系统性评估 · 后四轴（A/B/C/D）finding 清单
> **扫描面**：2026-08-13 跑完的**后四轴**评估（A 轴 tracked 文件卫生 · B 轴 登记对活源 + 跨 7 份真源规则冲突 · C 轴 场景×起手必读矩阵 · D 轴 程序化约束覆盖度）的全部 finding —— ⛔ 不含 2026-08-12 的前三轴

> **性质**：记录型产物，不是待办手册。本文件登记 2026-08-13 跑完的四轴评估结论。
> **前半**（稳健性 / 可用性 / 易用性三轴）在 2026-08-12，其产出 = `docs/superpowers/plans/2026-08-12-*.md` 六份计划
> + 5 条已亲验缺陷（本轮已立成 [[INFRA-F114]]–[[INFRA-F117]]）。
>
> **每条 finding 都由 subagent 产出、由主线重跑关键命令亲验**。带 ✅ 的是主线亲自复核过命令输出的；
> 带 ⓘ 的是 subagent 单方证据、主线未重跑（引用前请自己再验一次）。
>
> ⛔ **本文件不是 backlog**。这里的条目**尚未立 entry**，等 owner 按末尾的推荐拍板。
> 立 entry 时走 `pnpm new-backlog INFRA`，别照抄本文件的编号（本文件用 A1/B2 这种轴内序号，不是 backlog ID）。

---

## 一、口径订正（先纠正几个流传中的数字）

| 流传的说法 | 实测 | 出处 |
|---|---|---|
| 「STATUS §一 有 5 条」 | **8 条**（`0 / 0b / 1 / 2 / 3 / 4 / 5 / 6`） | ✅ B 轴逐条验时发现，我给 agent 的 prompt 写错了 |
| 「15 条 pre-commit 闸 CI 零兜底」 | **16 条** | ✅ 已写进 [[INFRA-F116]]，含算错一次的坑 |
| 「57 个 audit 闸」 | `scripts/audit-*.mjs` 确为 **57**，但 `grep -c '"audit:' package.json` = **74**，另有 **14 个住在 `figma-sync/`** | ✅ 真实闸面 71+，D 轴只覆盖了 57 |
| 「67 条 M-rule / 21 条 R-rule」 | M-rule 去重 ID **53** 条（rule section 66）· R-rule **20** 条（R11/R20/R21/R22 不存在） | ⓘ D 轴数出，分母换算不影响结论方向 |
| 「.git 189MB」 | **192 MB**，且成因不是历史大文件 | ✅ 见 A3 |

---

## 二、A 轴 · tracked 文件卫生

**A1 · 零违规（正向结论）** ✅
`git ls-files -i -c --exclude-standard` = **0**。`playground-dist/` 与 `react-pilot/dist/` 虽匹配 `.gitignore:2` 的 `dist/`，但各有显式 `!` 反否定 + 就地注释（INFRA-F53 / META-02），不是漏网。杂物文件（`.DS_Store` / `*.log` / `*.bak` / `*.orig` / IDE 目录 / `__pycache__`）全仓 **零 tracked**。

**A2 · `.env.example` 混了生产真值** ⓘ · 建议 P2
`.env.example:5` `FIGMA_FILE_KEY=YbsPRUVmNdsbN40NNwh1Gn` 是真实 key，而上一行 `FIGMA_PERSONAL_ACCESS_TOKEN=your_..._here` 是占位符 —— 同文件两种风格，读者无法判断该不该改。**不在 `files[]` 里**，泄漏面仅限仓库读者。

**A3 · `git gc` 是零代价动作；filter-repo 不该做** ✅ · 建议 P2（gc）
`.git` = 192 MB，其中 **97.36 MiB 是从未打包的松散对象**（`git count-objects -vH` 亲验），6 个 pack 最新 idx 停在 2026-07-31。跑一次普通 `git gc`（非 `--aggressive`）零风险、不改历史。
**filter-repo 明确不推荐**：那些「原始 30 MB」的已删文件用 `verify-pack` 实测真实打包成本只有 **633 KB**（delta 压缩），收益 0.4% 换全员 clone 失效。真正吃 pack 的是内容哈希命名的构建产物（`playground-dist/` + `react-pilot/dist/` = **31.8 MiB / 37%**），而它们**当前仍在 HEAD 且是部署兜底**，filter-repo 动不了。⛔ 别看到 192 MB 就推荐重写历史。
**可选缓解**：让 vite 输出固定文件名（`entryFileNames: 'assets/index.js'`），同路径连续版本能 delta，增长立刻塌下来。

**A4 · 已立 [[INFRA-F117]]** ✅

---

## 三、B 轴 · 上半场：「登记的还成立吗」逐条对活源验

> ⚠️ **本节 2026-08-13 补录**：B 轴 agent 交了两大块（上半场逐条验 stale + 下半场规则冲突），
> 首版报告**只落了下半场**，这一块整个漏了。补录时对每条重新跑了一遍活源，不是照抄 agent 报告。

**先纠一处我自己的口径**：STATUS §一 实际有 **8 条**（`0 / 0b / 1 / 2 / 3 / 4 / 5 / 6`），不是我派工时写的 5 条。

| 条目 | 判定 | 活源现值 / 说明 |
|---|---|---|
| §一.1 DG-1 layout 原语 | **仍成立** | `audit:layout-tokens` 自印「豁免 2 条（命中 2）」+「S5 report-only 19 处」，与登记逐字一致 |
| §一.2 [[INFRA-F87]] 残余② | **仍成立（五项全中）** | `smoke:peer-floor` 自印 34 组件 / 1 / 37 CE 注册 + 「真正受 peer 下界约束的只有 2 个」+ S7 动态 import 0；`defineOptions` 2 处、`toRef(locale)` 单参 1 处、`vue: ^3.5.0` |
| §一.5 [[INFRA-F58]] 三层化 | **已 stale → 已修** | 声称五份规则文件「7327 行」，2026-08-13 实测 **7674**（+347）。⚠️ 这个 stale **加强**而非削弱该条结论（「可省 2-4% 追不上自己的增长」—— 现在只剩 2%）。已就地改成带日期的实测值 + 「要用先自己 `wc -l`」 |
| §一.6 6 份计划 | **仍成立** | 6 份文件都在（另有一份 `2026-08-12-onboarding-page-rewrite.md` 属并行线，未列进那一行） |
| §一.0 / 0b / 3 / 4 | **无法机械验证** | 依次是：内容层观感 · 纯视觉裁定 · 断言对象是**部署主机**的 `.env`（需 SSH，本机那份不含 `GIT_AUTH`，与该条 scope 一致）· owner 口头「先等等」 |

**backlog §Active 抽验 7 条**（挑选标准 = 含可机械核实的坐标、登记较久）：

| 条目 | 判定 | 说明 |
|---|---|---|
| [[INFRA-F105]] ④ | **仍成立** | `eslint-plugin/spacing-token-map.js` 写 `100: '--r-xxl'`，而 `variables.css` 定义 `--r-xxl: 20px` 且注释自陈「was 100px — false alias… drift 修复 2026-06-12」⇒ eslint-plugin 那侧**漏改了两个月**，消费者照提示把 100px 换成 `var(--r-xxl)` 会静默变 20px |
| [[INFRA-F107]] | **仍成立（逐值对得上）** | 5 个 `--prompt-*` token 全部只在 `:root` 块、`[data-theme='light']` 内 0 命中；实测 `#f1fbf3` 与 entry 声明的 actual 值逐字相同 |
| [[INFRA-F102]] | **仍成立（4 = 4）** | 恰 4 个进包脚本 import `figma-sync/`，`files[]` 含 `scripts` 不含 `figma-sync` |
| [[INFRA-F101]] ① | **仍成立（11 = 11 · 13 = 13）** | `grep -rl 'X-Figma-Token'` 精确 11 个文件；`audit-mockup-*.mjs` 计数 13 |
| [[INFRA-F100]] | **定位 stale → 已修，结论不变** | `package.json:193` 已漂到 `:197`，且**不再只命中一处**（另有 audit 脚本注释 + 5 个 tests）。但那份 report 的唯一非注释引用仍是写方 spec，**无任何 `.mjs` 读它** ⇒「一个闸都没有」成立。已改成不写死行号 |
| [[INFRA-F106]] | **措辞 stale → 已修，结论不变** | 「`.slider__input` **缺**显式宽度」会误导：活源**有** `width: 100%`，只是它在 `.slider`（`inline-grid`，`width: 240px`）的 `minmax(0,1fr)` 列里 ⇒ 实际宽恒 < 240。照原措辞 grep `width` 会误判「已修」。已改标题与问题段 |
| [[INFRA-F105]] ① | **行号 stale → 已修** | `src/index.ts:107-108` 漂到 `:108-109`；已改成用 `grep -n` 现取 |

**⭐ 顺手撞到的一条、也是本节最值得记的**：backlog 的 [[INFRA-F58]] entry 里有一段 2026-08-03 的**行号订正**，逐字写着「原写 AGENTS §640-738 → 真实范围是 613-714（下一个 H2 在 715），而该文件总共只有 720 行，738 不存在」。2026-08-13 实测：AGENTS **739 行**（738 现在存在了），最后两个 H2 在 **632 / 734**。⇒ **同一个位置十天内漂了两轮**，而那条 entry 自己写着「照 entry 的行号找会找错地方 —— 一律对活源重新定位」。**第三次订正没有再填新数字**，改成写定位方法（`grep -n '^## Team Comms Conventions'`）—— 再填一次只会再漂一次。

---

## 三之二、B 轴 · 下半场：规则冲突（跨 7 份真源）

**B1 · disabled 怎么表达 —— 三处互斥 + 数值三分叉** ✅ · 建议 **P0**
- `FIGMA_AS_SOURCE_OF_TRUTH.md:71`（L-core #0）逐字把「CSS opacity vs token desaturation」列为**禁止**登记 divergence 的项，理由「实现策略差 = code 偷懒；按 Figma 改」
- `code-conventions.md:745`（R9）逐字要求 `disabled → opacity ≈0.5 + cursor: not-allowed`
- `mockup-conventions.md:1789`（M32.4）逐字「dev 请实现真正的禁用态、**不要照搬降透明度**」
- **数值还叠第三重**：shipped 代码是 `0.4`（`Select.vue:75` / `Slider` / `Switch` / `Rating` / `InputNumber` 全是 0.4），`Form.vue:65` 是 `0.6`，R9 说 `0.5`
- **关键**：`--control-disabled-{bg,border,text,selected-bg}` + `--text-disabled` + `--icon-disabled` **确实已存在**（`variables.css:63,72,372-376`）⇒ R9 那条不是「没 token 只好 opacity」，是有 token 没用
- **建议真源** = `FIGMA_AS_SOURCE_OF_TRUTH.md`；R9:745 那一格应改为「绑语义 token，无对应 token 时才 opacity 且值取 DS 现值」

**B2 · `CLAUDE.md` 规定的起手集合 ⊊ L-core** ✅ · 建议 P1
`CLAUDE.md:5` 逐字只说「起手第一份必读 STATUS，然后读 AGENTS」——**完全没提** `FIGMA_AS_SOURCE_OF_TRUTH.md`（L-core #0）、`PROJECT_GOAL.md`、当前 pickup。而 `STATUS.md:121` 把「基于 partial L-core 给推荐」逐字定义为**协议违反**。CLAUDE.md 是 Claude Code **自动注入**的那份 ⇒ 严格照它执行的 AI 读 2 份就开始回答。
**闸看不见**：`audit-rule-inventory` 的 `CHAIN_SCAN_DOCS` 含 CLAUDE.md，但 S6 判据要求「≥3 份 .md 的列表」形态，CLAUDE.md:5 是散文里点 2 份，双重不命中 ⇒ 当前 PASS。
**次级**：`STATUS.md:30` 说自己是「第一份必读」，同文件 :129 的表把 FIGMA_AS_SOT 列为 **#0 ⭐**。同一文件里「谁第一」两个答案。

**B3 · changeset 快车道的「典型」越过了自己的谓词** ✅ · 建议 P1（**昨天刚立的规则，现在改最便宜**）
`AGENTS.md:251` 快车道适用面「严格 AND」= `playground/** + react-pilot/** + docs/** + tests/**`，**谓词不含 `scripts/`**；但同一句的「典型」写了「**闸的判据**」——而闸判据住在 `scripts/audit-*.mjs`。
同时 `AGENTS.md:228` 逐字把 `scripts/` `templates/` 列为**必写 changeset**的 consumer-facing 资产，且 A 轴实测 `files[]` 含 `scripts` → **107 个文件真的随 npm 包发**。
⇒ 「改了闸判据」这一个动作，按谓词读进不了快车道、按「典型」读免 changeset、按 :228 读必须写。**三方打架，且是同节内部自相矛盾**。
**建议真源** = 严格 AND 谓词（更保守且与 `files[]` 事实一致）；把「典型」里的「闸的判据」删掉或改成「`tests/**` 下的闸」。

**B4 · 字体：三处声称「DS 的 EN 字体 = Roboto」，活源不是** ✅ · 建议 P2
`variables.css:322` 注释逐字「figma 真源 7 Text Styles (**Roboto family**)」，紧接 4 行后 `--font-family-en` 里 Roboto **排第 4 位**（前有 `-apple-system` / `BlinkMacSystemFont` / `Segoe UI`）⇒ macOS 渲染 SF Pro、Windows 渲染 Segoe UI，**永远轮不到 Roboto**。`mockup-conventions.md:622` 与 `:632` 据此转述「与 DS 真源一致」。
`divergences-decisions.json` 里 font **0 命中** ⇒ 这不是已登记的合法 divergence，而 `FIGMA_AS_SOURCE_OF_TRUTH.md:38` 要求合法差异必须显式登记。
**需要 owner 拍**：code 侧要不要真上 Roboto webfont。拍板前那三处「与 DS 真源一致」的表述都应改掉。

**B5 · 颜色绑定：同一条 C3 规则内部自打脸** ⓘ · 建议 P2
`mockup-conventions.md:361` 把 `UX/Grey/grey-{2..9}` 列为 text foreground 的**合法命名空间**并举例 `grey-7 tip text`；往下 13 行 `:374` 把**同一个** `grey-7` 用在**同一个** tips text 上标为 **❌ 反例**。`:404-410` 的 C5 要求语义色优先、末列「❌ 别直接绑原语」。
`:361` 教出来的做法会被 `audit-mockup-binding-fidelity` **当场判红**。该文件 `:3142` 自己记录过这个病根（C3 留口子 → C5 收紧），但 `:361` 至今未同步。

**B6 · 双语：role-ux 无条件双语 vs M33 产品 UI 单语** ⓘ · 建议 P2
`skills/role-ux/SKILL.md:13` 逐字「涉及文案或说明文字，提供中英双语版本」（无条件祈使句）；`mockup-conventions.md:1857/1864` 逐字规定注释层双语、**产品 UI 层单语**。
而 `skills/tvu-design-mockup/SKILL.md:57` 与 `design-process.md:569` **都强制 load role-ux** ⇒ mockup 任务必然同时加载两条。写 dialog 按钮 label 时：role-ux → `Confirm 确认`，M33 → `Confirm`。
**复发型病灶**：`mockup-conventions.md:3165` 逐字记录过「M33：dialog title/body/按钮全双语 → 拍板『产品 UI 不需要双语』」。
**修法**：`role-ux/SKILL.md:13` 加一句「产品 UI 层按 M33 走单语」。

**B7 · 正向清单（查了没问题，同等重要）** ⓘ
token vs raw hex 的口径**跨 5 处完全一致**且互相交叉引用（`AGENTS.md:143` 硬规则 4 · `code-conventions` R2 · `mockup-conventions` C1/C6 · `domain-tvu.md:157` · `consumer-product-conventions` SKILL）；两个例外（`--chart-color-*` 代码 SoT、第三方 logo hex）都是**双向显式登记**的。字号档位数值跨 skill/token 逐值对得上。changeset bump 级别定义一致。onboarding 链路的 **AGENTS↔STATUS 那一半无 drift**（三处都指回 STATUS，无并行清单）。

---

## 四、C 轴 · 场景 × 起手必读矩阵

**C1 · SessionStart hook 用 `ls -t`，与 STATUS 固定指针机械相反** ✅ · 建议 **P1（改一行，每 session 都在生效）**
`.claude/hooks/onboarding-checklist.sh:13` = `ls -t .../next-session-pickup-*.md | head -1`（**mtime 排序**）；`STATUS.md:132` 逐字「**固定指针 · 不靠 mtime · 并行 session 再写新 pickup 也不漂移**」，指向 `next-session-pickup-2026-07-08-full-lifecycle-optimization.md`。
`_plans/` 下有 **5 份** pickup。**本 session 自证**：hook 给的是 08-11 那份（5425 B），SoT 指定的是 07-08 那份（7081 B）+ 存档 SoT（18181 B）。
**⚠️ 比缺陷本身更值得记的**：这个冲突**已被发现过**，处置方式是在受害文件里就地写免责声明 —— 08-11 那份自己 `:53-54` 写着「hook 用 `ls -t`…本文件会被当成『当前 sprint 操作手册』读…不必按本文件开工」。⇒ 当前是**每写一份新 pickup 就得写一次免责声明**的重复税，且谁忘写，下个 session 就照着一份已 ship 的手册开工。
**修法**：hook 改读 STATUS 的固定指针，或把指针提成 `_plans/CURRENT` 符号链接由两边共读。

**C2 · `code-conventions.md`（89 KB）在整条强制 onboarding 链路上零引用** ✅ · 建议 P1
`grep -c 'code-conventions'`：AGENTS.md → **0** · STATUS.md → **0** · CLAUDE.md → **0**；`R7` 与 `Task Entry` 同样三份全 0；hook 注入文本也 0。
而它是 **R7 四场景判断 + US-1..7 Task Entry Modes 的唯一活源**，`:118` 逐字「AI 接到任务后**先 classify**」、`:42` 逐字「漏 R0 Phase 0 是**历史最高频回归源**」。
⇒ 「起手必判 R7」这条规则本身，AI 在标准 onboarding 后**读不到**。唯一活的机械路径是 `detect-figma-task.sh:48` 要求 prompt 含 `figma.com/(design|file)/` URL —— **没有 Figma URL 的 code 任务（US-1/2/3/5/6、R7 场景 2/4）全部落空**。
**修法**：STATUS L-ref 表 + AGENTS 触发表各加一行「任何写 UI 代码的任务 → `code-conventions.md` 起手必读段」。

**C3 · AGENTS 对同一 mockup 场景给两条互斥读法（2.5 倍字节差）** ✅ · 建议 P1
`AGENTS.md:21` 逐字「按文件顶 §🤖 AI 读取指引 **scoped 读**（…禁全量吞）」；`AGENTS.md:124` 逐字「下列 7-10 整链升 mandatory **全读**」——而 7-10 的第 9 项就是同一份 `mockup-conventions.md`。
实测：全读链 = **549.3 KB**，scoped 读 = **220.3 KB**。**两条都在同一份文件里、都标 mandatory**。
**修法**：`:124` 改成「7-10 整链升 mandatory，各文件按其顶部 §🤖 AI 读取指引 scoped 读」。

**C4 · `CONTRIBUTING.md` 反向教发版** ⓘ · 建议 P2
它是三处 onboarding（`DESIGNING_WITH_TVU.md:47` / `CONSUMER_ONBOARDING.md:62` / `ONBOARDING_NEW_MACHINE.md:46`）为 DS 维护者指的**唯一**目的地，2861 B。
`:60-64` 教「手改 CHANGELOG + 手改 package.json 版本号 + `git tag`」，而 `RELEASING.md:110-118` 与 `AGENTS.md:247` 是 `pnpm changeset:version` 自动汇总。`grep -c changeset CONTRIBUTING.md` = **0**。
`grep -c 'canonical\|changeset\|Figma\|STATUS\|AGENTS\|VISUAL_COMMIT'` = **0** ⇒ 走文档指的路，10 条必知硬规则只覆盖到 1 条。

**C5 · DS 维护者场景在 skill 层与 Task-type 层双重零覆盖** ⓘ · 建议 P2
13 个 skill 逐个读 frontmatter：**13/13 全部排除本仓**（`tvu-design-code` 逐字「在 sibling consumer 产品里写代码」；`mockup-conventions.md:6` 逐字「**不**作用于设计系统库本身的迭代」）。
Task-type 矩阵（`AGENTS.md:338` 六类）虽能归类，但触发条件 `:342`「每个 prompt 必须在 §Mode 段明示」被 `:365` 逐字废除 —— 「**本仓 solo DS 工作（Claude 直做）默认不走此环**」。
⇒ **本仓最高频的场景是唯一一个既无 skill 又无有效分类入口的**。事后兜底很厚（`.husky/pre-commit` 36 KB / 30+ 道 gate），代价是学习方式 = 撞墙。
「绝对不能违反但没人主动告诉他」的 5 条：硬规则 #6（canonical vs components，DS 仓内 **L1 零机制**）· changeset 纪律（被 CONTRIBUTING 反向教）· `VISUAL_COMMIT_APPROVED`（只能撞闸）· `pnpm rule:next`（无路径）· 硬规则 #8（撞闸）。

**C6 · 设计师 / PM / QA 三个 P1 受众零入口** ⓘ · 建议 P2
`PROJECT_GOAL.md` §受众明文承诺设计师要「与 Figma 对应关系、变体网格」、QA 要「状态矩阵、边界条件」，但 `WAKE-WORDS.md`（3324 B）A 区 14 行 + B 区 7 行**没有任何一行**对应这两类查询。而他们要的东西（`figma-component-catalog.md` 54 KB · `component-affordances.md` 53 KB · `divergences.md` 28 KB）全在私有仓，`DESIGNING_WITH_TVU.md` 自己承认「没有 Gitea 权限的同事只有路线 0 和 B 是活的」。

**C7 · 体量口径已漂（低危，自带缓释）** ✅
`STATUS.md:123` 写「2026-08-04 实测 65.2 KB（…本文件 37.0…）」，今日实测 STATUS 自身 **39.12 KB**、L-core 合计 **67.07 KB**。该行自带「引用前先自己重跑」缓释条款，故低危。
**机械成因**：`## 当前版本：v1.2.0` 单段 **7015 B**（占 STATUS 17.5%）且逐日追加。把发布核验实录 prepend 进 `STATUS-CHANGELOG.md`（已存在且在用）可立刻让 L-core 降约 6 KB。

**C8 · 正向清单** ⓘ
mockup 侧判据是全仓最强的（**L3** 三层叠加：hook URL 正则 + 动词正则 + skill wakeword + AGENTS 四条触发判定）。R7 的 disambiguation 协议内容质量高（歧义时逐字「**默认偏向不 TVU 化**」是正确的保守兜底）——问题**纯在可达性**（C2），不在内容。`detect-figma-task.sh` 的双信号相消 + 头注记录 2026-06-15 错路由实证，是「路由错了回流修路由」而非「加第 N 条内容规则」的**正例**。

---

## 五、D 轴 · 程序化约束覆盖度

**D1 · 57 闸的守形态 / 守语义二分** ⓘ
**守语义 30（52.6%）· 守形态 27（47.4%）**。但**分布高度不均**：30 个守语义里 13 个是 Figma/mockup 侧、6 个是 token/产物重建；而**整个 docs / 规则治理面的 9 个闸（doc-shape / doc-de-mirror / doc-sync / rule-inventory / rule-load-map / rule-number-collision / stale-anchors / status-consistency / deliverable-open-questions）100% 守形态** —— 没有一个能判断「这条规则被遵守了吗」，只能判断「规则的**文字**还在原位、编号没撞、锚点没断」。

**D2 · 「头注释 = 挂载真源」这条纪律本身只有 11/57 落实** ⓘ · 建议 P2
只有 11 个闸在头 45 行显式标注 L1–L5，另 7 个只提 `pre-commit`/`prepublishOnly` 无层级名 ⇒ **39/57 头注释对挂载层完全沉默**。而 `audit-rule-number-collision.mjs:6` 逐字写着「挂载点（本段是挂载真源，别去 grep 调用点推断）」——**这条自我要求没有任何闸守它**，且对那 39 个闸，被禁止的 grep 是唯一可用手段。

**D3 · `audit-mockup-connector.mjs` 是零挂载孤儿** ✅ · 建议 P2
`package.json` / `.husky/` / `.gitea/` **全部零命中**，也不在 `audit-mockup-conformance` 头注释列举的 5 个 sub-audit 里，且头注释**没有「为什么不挂」**（只讲 schema 兼容）⇒ 按仓库自己的纪律（「零挂载常是设计不是缺陷」），**这个是漏，不是设计**。
**讽刺**：`audit-mockup-conformance.mjs:6-7` 的存在理由逐字就是「`audit-mockup-library-origin` had NO npm script at all (orphan)」——同一个病在同一目录复发。

**D4 · 两个闸的头注释与代码不符（挂载真源自身 stale）** ✅ · 建议 P2
`audit-demo-framework-parity.mjs:6` 与 `audit-demo-slot-boolean-coverage.mjs:4` 都写 `REPORT_ONLY=true → 恒 0`，实跑均为 `mode=BLOCKING`。既然头注释是挂载真源，真源写错了。

**D5 · 三个「闸绿但语义已烂」实例**

**① `audit:rule-inventory` 全绿，而规则最多的那份文件不在分母里** ⓘ · 建议 P1
闸 PASS 且自印 `design-process 25 H2 / domain-tvu 12 H2`。但 `INVENTORIES`（`:62-64`）**只收这两份**。而 `mockup-conventions.md` 有 **69 个 M-rule 标题 / 28 个顶层 M-rule**、`code-conventions.md` 有 20 条 R-rule，**两份都没有 inventory 块、都不在分母里**。
**关键**：闸 `:11` 的立闸动机逐字提到「mockup-conventions 两处又各不相同（其中一处发明了活源不存在的 id "M2"）」——**它是原始病灶的现场之一，闸建成后却没收它**。闸输出第一行「别据此宣称 SoT 已守住」是诚实的，但那行字不是闸。

**② `audit:demo-slot-boolean` 闸名 coverage、判据「至少一个」** ✅ · 建议 P1
<!-- ⚠️ 2026-08-24 订正：本行那个字面量是**脚本文件名**（`scripts/audit-demo-slot-boolean-coverage.mjs`），不是 npm key —— 真 key = `pnpm audit:demo-slot-boolean`。同一族混淆当日在活树里量到 7 处，成因与不上闸的理由见 backlog `INFRA-F137`。 -->
闸 `mode=BLOCKING` **PASS**，而 PopupBox 4 个 boolean 里只有 `closable` 是 live toggle：`showFooter` 是**写死的静态属性**（`react-pilot/src/demos/PopupBox.tsx:168`，无 `={}`），`closeOnBackdrop` / `closeOnEscape` **全文零出现**；TopBar 的 `showMenu` / `showSearchBox` 同样无 live 绑定。
机械成因 `:116` `if (refsState) boolLiveOk = true` —— **一命中即 true 的或运算**。
**头注释 `:13-19` 完整预告过这件事**（「删掉其中某个 toggle，这条闸照样绿 —— 那是在悄悄降级」「未验证，别直接改」）⇒ D 轴那条命令把预告变成了实测：**30 个 in-scope 组件里已有 2 个处在预告的降级状态**。

**③ `audit:token-contract` 印 "in sync with Figma"，而变量层已死 4 个月且中游被手改** ✅ · 建议 **P1**
闸逐字印 `✓ token-contract PASS: variables.css in sync with **Figma** primitive tier (54 primitives…)`。
但 `figma-data/raw/variables.json` 最后变更 **2026-04-22**、`normalized/variables.json` **2026-06-09** —— **下游比上游新 7 周**。同仓 `audit:variables-freshness` 直接指认：「归一化层被单独改动过（历史上是『Figma 改了值但抓不回来，于是手改下游』）…这类手改让 token 值看起来是同步来的，实际不是」+「变量层没有任何成功抓取记录」。
⇒ PASS 的真实语义是「variables.css 与**一份被手改过的本地 JSON** 一致」，而它打印的是无条件的 `in sync with Figma`。
**病灶不是没人知道，是两条闸的诚实度不对等**：`variables-freshness` 印了 `能证：… / 不能证：…` 的边界，`token-contract` 没有 —— 而下游读结论的人（和 AI）读到的是后者。**修法成本极低：改那句 print。**

**D6 · M-rule / R-rule 覆盖率** ⓘ
M-rule 有闸真守 **17/53 = 32%**（严格按「整条被守」= 11/53 = 21%）。⚠️ `domain-tvu.md` 的 12 条 TVU 业务规则**真覆盖 1/12 = 8%**，是整个体系最薄的一块，且是**唯一无法靠 DS 库兜底**的一层（违反 = 交付出的产品语义直接错）。
R-rule 有阻塞性闸守 **6/20 = 30%**，**DS 仓内 0/20** —— 但这是 `code-conventions.md:9` 逐字的**明示设计决定**（「R-rules 本体是 L1 AI 行为规则；机制强制在 consumer 侧…DS 仓内无 commit-time gate（**by design**）」），**不是缺陷**。
**顺带发现一次真实的规则 ID 命名空间碰撞**：`audit-canonical-compliance.mjs:7-11` 的 `R1/R2/R3/R4` 是**该脚本自己的编号空间**（R1=内联 affordance class、R3=裸 `<input>`），与 code-conventions 的 R1/R3 语义完全无关；`audit-claude-design-reference-numbers.mjs:59` 同理。**三套互不相干的 `R<n>` 体系共存，而 `audit-rule-number-collision` 只守 doc 侧编号，不守脚本内部编号。**

**D7 · L1 重灾区（按 后果严重度 × 违反容易度 排序）** ⓘ
前 5 条：**R0 / Phase 0**（`code-conventions.md:42` 自称「历史最高频回归源」，零机械保护）· **M48 起手 Rule-Coverage Self-Check**（自称「起手强制 Gate」，主体无闸）· **domain-tvu M4/M5/M12/M13**（TVU 业务语义，真覆盖 1/12）· **M43 / R23 受限单元格文本溢出**（CSS 层静态可判，与已上闸的 R19 同形态）· **M37 / R18 probe before design**（`audit-mockup-overlap.mjs:5` 记录的实证根因逐字就是它，闸只抓到症状没抓病因）。
**共同结构**：top10 里 **6 条的规则文本自己就指定了一份「可落盘产物」**（trace / clean list / probe 结果 / CRUD 四答）—— **判据早就设计好了，缺的只是一个存在性闸**，而仓库里已有三个现成范式可抄（`deliverable-open-questions` 的 handoff 预筛 · `mockup-handoff-evidence` 的 report 防伪 · `plan-lifecycle` 的引用计数）。

**D8 · 正向清单（这套闸真正做得好的地方）** ⓘ
1. **`audit-token-exports` / `audit-composition-exports`** —— 闸**复用被检者自己的代码**做内存重建 + 深比对，逻辑上不可能与 generator 分叉（头注释逐字「so this gate can never drift from the generator it is checking」）
2. **`audit-figma-variables-freshness`** —— 判据**刻意不取自产物**，且这个决定是被实测纠正出来的（头注释逐字「判据不能取自产物本身，这一点先想错过一轮、被实测纠正」）；**全仓唯一把自己的认识论边界打印进 stdout 的闸**（分列 `能证：` / `不能证：`）
3. **`audit-mockup-handoff-evidence`** —— 直接针对「AI 会伪造证据」设计：旧版正则扫正文可被手打伪造，改为必须引用脚本落盘的结构化 JSON + 校验 exitCode + 24h 时效窗，「编造成本 ≈ 真跑一次」
4. **`audit-layout-tokens`** —— 四层 fail-closed + **shrink-only 豁免**完整范式（「表空着是终态，不是待办；修完由闸自己宣布」）。全仓 **7 个闸**实现了 shrink-only
5. **`audit-framework-api-floor`** —— 抓的是 **CI 结构上抓不到**的那类缺口（本地与 CI 都装 3.5.x，缺口只对钉下界的 consumer 暴露），且带 **S4 表过期即红**，把「闸依赖的外部知识会老化」做进了判据
6. **`audit-render-drift-gate`** —— 唯一的真·像素级语义闸，F97 补丁**主动堵上「测不到 = 通过」这个假绿方向**（此前导航失败不产生 classification，服务器中途死掉 794/936 条 ERR_CONNECTION_REFUSED 仍可能绿）
7. **`audit-export-coverage`** —— **拒绝白名单**，改用 import graph 可达性，判据 = 「consumer 能不能真的 import 到」这个终态事实
8. **21/57 闸带 vitest 单测**，其中至少 4 个带故障注入；`audit-no-hardcoded-ui-strings.mjs:50` 记录了故障注入**真的抓到过假绿**。`audit-rule-inventory.mjs:27` 把范式写下来了，**连「哪个闸测不了、为什么」都写了**

---

## 六、建议的处置优先级（等 owner 拍板）

> 本轮已立 [[INFRA-F114]]–[[INFRA-F117]]（原授权的 5 条已亲验缺陷）。下面是**四轴新产出、尚未立 entry** 的建议。

**第一梯队 —— 改一行/一句就闭合，且每天都在生效**
| 项 | 为什么排第一 | 代价 |
|---|---|---|
| C1 hook `ls -t` | 每个 session 的 L-core#3 都读错文件；当前靠「每写新 pickup 就写免责声明」的重复税兜着 | 改 1 行 |
| D5③ `token-contract` 的 print | 它对 AI 和人输出一句无条件「in sync with Figma」，而那不成立；同仓已有正确范式（freshness 的 `能证/不能证`）可抄 | 改 1 句 print |
| B3 changeset 快车道「典型」 | 昨天刚立的规则，现在改成本最低；否则真进 npm 包的改动会持续免 changeset | 删 4 个字 |

**第二梯队 —— 规则真源级冲突，需 owner 裁定方向**
B1 disabled（P0，需拍「三条路线选一 + 一个数」，且与 design-review-queue #3 的 designer 裁定是同一件事）· C2 code-conventions 零引用 · C3 AGENTS scoped/全读 · B2 CLAUDE.md 起手集合

**第三梯队 —— 判据扩面，工程量中等**
D5① rule-inventory 分母漏最大文件 · D5② slot-boolean 判据「至少一个」→ 逐 prop · D7 的 6 条「产物已设计好、只缺存在性闸」

**第四梯队 —— 卫生 / 低危**
A3 `git gc` · A2 `.env.example` · B4 字体 · B5 颜色绑定 · B6 双语 · C4 CONTRIBUTING · C5 DS 维护者 skill · C6 三受众入口 · C7 STATUS 分片 · D2 头注释挂载声明 · D3 connector 孤儿 · D4 两处头注释 stale · D6 脚本内部 R 编号空间

---

## 七、四轴各自的「我没能验证的」（诚实边界）

- **A 轴**：高危模式 grep 未覆盖 `dist/` 的 849 个发布文件 → **主线已补，零命中**（本报告 A4 的正向边界即来自这次补测）；`git gc` 收益是推算未实跑；未读 `publish-to-gitea.sh` 全文确认它走标准 `npm publish`
- **B 轴**：STATUS §一.3 的主机 `GIT_AUTH` 需 SSH 到部署机，无凭据；INFRA-F105 的 consumer 侧数字需 MicroApps 仓两次 build；`AGENTS.md:251`「闸的判据」的 owner 原意无法查证（B3 的建议真源是判断不是裁定）；未逐行通读 design-process 全文与 M-rule 全量
- **C 轴**：站上 `onboarding.html` 实际内容未读 ⇒ 外围-2/-3 两场景的必读 KB **可能被低估**；未实际触发一次 SessionStart 看注入字符串（但主线本 session 的注入即活证据，已确认 hook 行为）；`upstream-gate` skill 是否覆盖 DS 维护者场景判不准
- **D 轴**：`figma-sync/` 下 **14 个 audit 脚本头注释未读**（真实闸面 71+，本轮只覆盖 57）；**13 个 Figma 侧闸一个都没跑**（需 `--file` + Figma 凭据），其形态/语义分类**完全基于头注释自陈**；39/57 闸的实际挂载层未确定（纪律禁止 grep 调用点，而头注释沉默）；`audit:consumer-code` 未跑（需 consumer 目录）
