# 预注册 —— U2「DS 打包出口挡住 43 处控件替换」（`lab:U2`）

🔴 **本文件先于任何取数代码提交，⛔ 零读数。** 取数后一字不改；要补只能在取数前补并留痕。

owner 2026-09-04 同意立项。上游登记 = DS `docs/internal/backlog.md` **INFRA-F105 ①**（优先级 High）。

---

## 1. 🔴 起手就要纠正我自己上一轮的说法

我 2026-09-04 给 owner 的建议逐字是「让 `src/index.ts` 不再把整个图标注册表拖进任何一次 import」。
**DS 侧登记明确判这条单独做无效**（INFRA-F105 ① 逐字）：

> **根因是两条独立路径，修一条不够**：① `src/index.ts` 的 `export … from './icons/index'` …
> ② `src/components/Icon/Icon.vue` 静态 `import { resolveIcon } from '../../icons/index'`（`Logo.vue` 同形态），
> 而 `resolveIcon` 出自 `registry.ts`、后者静态 import 全部 generated 模块
> ⇒ **任何用到 `Icon` 的 DS 组件都独立把整个注册表拖进来，与主入口 barrel 无关**。
> ⛔ 所以「不在主入口 eager re-export」**单独做无效**。

⇒ **本轮射程 = 两条路径都要改**，⛔ 不是我原先说的那一条。
⇒ 这条靠 `AGENTS §20` 四行块（「它还该做吗 —— 去读对方源码/登记怎么说」）在**写第一行代码之前**抓到。

## 2. 🔴 本轮要先补的那个洞：**这个 High 优先级项的体积数字，DS 侧从没复现过**

INFRA-F105 自陈边界逐字：

> ⚠️ **诚实边界**：本 entry 所有 consumer 侧体积 / gzip / 模块数 / CE 注册数 / viewBox 计数
> **均来自 MicroApps 仓在 `vite-plugin-singlefile` 下的真打包，本仓不可复现（需 build），一律沿用未重测**。

⇒ 即：**「修好了没有」这个问题目前没有量具可答。** 本轮第一件事是造这把尺，⛔ 不是直接动手改。
⛔ 没有前后可比的读数就改公共导出面 = 本 session 反复在治的那个病（改了装置却拿不出读数）。

## 3. 承诺指标（🔴 取数前写死，双向）

**面**：一个最小 vite 单文件构建，`@ux-team/tvu-design-system` 解析到本机 DS 仓（消费仓现取就是 symlink 这么接的）。

| 代号 | 定义 |
|---|---|
| `BASE` | 入口**不 import** 任何 DS 组件时的产物字节数 |
| `ONE`  | 入口**只 import 一个** DS 组件（`InputBoxFilled`，与 consumer 2026-08-07 A/B 同一个）时的产物字节数 |
| **`COST`** | **`ONE − BASE`** ← **本轮唯一主指标**：一个消费产品为「用上第一个 DS 组件」付的门票钱 |

**P1（主承诺，双向）**：改动后 `COST` 相对改动前**下降 ≥ 50%**。
- 达到 ⇒ `U2_VERDICT = 门票钱显著下降`
- 未达到 ⇒ `U2_VERDICT = 修法不足` —— 🔴 **如实报，⛔ 不许挪判据、⛔ 不许改成「有改善」**
- 上升 ⇒ `U2_VERDICT = 改坏了` ⇒ ⛔ 不合并

⚠️ **⛔ 不承诺** `COST` 降到某个绝对值。理由：INFRA-F105 记「按需导 `icons/svg/**` 单个资产 +5,439 B」是**图标资产**那条路的数，⛔ 与组件路不同口径，拿它当目标是换载体外推。

## 4. 🔴 内建控制（fail closed，任一红 ⇒ ⛔ 不合并）

| # | 控制 | 红了意味着 |
|---|---|---|
| **C1** | **公共 API 逐字守恒**：改动前后，从主入口可取到的具名导出**名字集合**逐字相同（程序化取，⛔ 不靠人看 diff）| 这是**破坏性变更** ⇒ 会打断所有消费方 ⇒ ⛔ 不合并 |
| **C2** | DS 全量 `vitest run` 绿 + 视觉测试不新增失败 | 改动改了行为，⛔ 不只是打包形态 |
| **C3** | **量具阴性对照**：同一份 DS 上，`ONE` 换成「import 两个组件」必须**测出更大的数** | 量具测不出差异 ⇒ 那个「下降」不可信 |
| **C4** | **量具可复现**：同一输入连测两次，字节数**逐位相同** | 构建有噪声 ⇒ ⛔ 不许报小于噪声的差 |
| **C5** | 改动前后**被测 DS 树的 git 状态各记一次**（HEAD + dirty 数 + 改了哪些文件）| 并行 session 在改同一个仓（实测 ≈17.6 commit/天）⇒ 两次测的可能不是同一棵树 |

🔴 **C1 是本轮最重要的控制**，⛔ 不是 C2。体积降下来但打断了消费方 = 净负。

## 5. 🔴 隔离（⛔ 不在主工作树上改）

实测：DS 上另一个 session **此刻正在改 `src/icons/index.ts` / `src/icons/generated/*` / `src/icons/catalog/generated/*`**
（近 6 个 commit 命中，且现有 10 个未提交的 icon/message 视觉基线截图）——
**与本轮路径②要动的文件重叠**。⇒ 按全局规则「并行改同一仓库先开 worktree 隔离」，
本轮**改动一律在独立 worktree 内做**。

⚠️ **但 INFRA-F105 另有一条取证陷阱（逐字）**：`dist/` 与 `dist-wc/` 是 gitignored 产物，
**worktree 里刻意不软链 `dist`** ⇒ 在 worktree 里核 dist 类旁证会得出**假的「不可核」结论**。
⇒ **口径：改动在 worktree、`dist` 类读数在该 worktree 内自己 build 出来的 dist 上取**，
并对每次读数记清是哪棵树、哪个 HEAD（C5）。

## 6. 覆盖边界（⛔ 是边界，不是 TODO）

1. `COST` 只量**一个**消费形态：vite + 单文件内联。⛔ 不代表分包型消费产品。
2. 只量 `InputBoxFilled` 一个组件的门票钱。⛔ 不声称对全部 34 个组件成立。
3. ⛔ 不量 gzip 后体积（consumer 报过，但本轮主指标是原始字节，口径要单一）。
4. ⛔ 本轮不碰 INFRA-F105 的 ③④ 两个子项（豁免语法互斥 / `--r-xxl` 自相矛盾）。
5. ⛔ 不重跑 consumer 仓自己的构建 ⇒ 「15.6 倍」那个数**仍是 consumer 的读数**，本轮 ⛔ 不主张复现了它。

## 7. ⇒ 判定后要驱动什么

- `门票钱显著下降` ∧ C1–C5 全绿 ⇒ 提给 owner 合并；并**回改 INFRA-F105 ①**（`AGENTS §22` 推论一）。
- `修法不足` ⇒ 如实报，登记「已试过什么、为什么不够」，⛔ 不合并、⛔ 不改判据重报。
- 任一控制红 ⇒ ⛔ 不合并。
