# 2026-05-19 — Consumer Reference Adoption 实测（MicroApps Console vue-app）

> v1.0 触发条件 (3b "reference adoption") 第一次外部实测。
> Session mode: verification（不改 library 组件，但允许修 audit/plugin bug）。
> 对应 plan: [`_plans/new-session-prompt-consumer-product-verification.md`](../_plans/new-session-prompt-consumer-product-verification.md)

---

## 1. 目的

把 `@nancyzeng0210/tvu-design-system@0.6.0` 装到一个真实 sibling consumer repo，验证：
- 装包路径（含 `scripts/` `eslint-plugin/` `dist/`）完整
- CLI audit (R1/R2/R16) 能在真实 legacy 代码上跑
- ESLint plugin 装 flat config 后真 fire
- CONSUMER_AUDIT_SETUP.md 文档够清晰

---

## 2. Setup

| 项 | 值 |
|---|---|
| Consumer | `MicroApps Console/vue-app`（Vue 3.5 + Vite + **npm**，无 TS、无 ESLint） |
| Install source | 本地 `pnpm pack` 出的 tarball — 绕开 v0.6.0 npm 上 `files[]` 漏 `scripts/` 的 bug（master HEAD `49b45f77` 已含修复） |
| Tarball | `/tmp/nancyzeng0210-tvu-design-system-0.6.0.tgz` |
| Install cmd | `npm install /tmp/nancyzeng0210-tvu-design-system-0.6.0.tgz` |
| ESLint setup | 新装 `eslint@9 / eslint-plugin-vue / vue-eslint-parser`，flat config |

---

## 3. 结果摘要

| 验证项 | 结果 |
|---|---|
| 装包路径完整（dist / eslint-plugin / scripts） | ✅ |
| CLI `audit-product-code.mjs --dir src` | ✅ 跑通，scanned 17 files，R1×5 真违例 |
| ESLint plugin `import` 动态加载 | ✅ 4 rules 正确暴露 |
| ESLint plugin `recommended` config 接入 | ✅ 装上 + 真 fire |
| `npx eslint src` | ⚠️ 跑通但**只抓到 emoji + arrow, 0 个真 `<svg>`** |
| postinstall banner（npm install） | ❌ 没显示 |

---

## 4. 关键 finding — **CLI 和 ESLint plugin 的 `no-inline-svg` 语义分叉**

→ 已落 **[META-001](../backlog.md)** High，阻塞 v1.0.0-rc.1。

| 探测项 | CLI R1 | ESLint plugin |
|---|---|---|
| `<svg><path>` markup（5 处真违例） | ✅ 全抓 | ❌ 全 miss |
| emoji `🔴` / unicode arrow `→`（9 处） | ❌ 不抓 | ✅ 全抓 |

文档（[CONSUMER_AUDIT_SETUP.md §What ships](../../CONSUMER_AUDIT_SETUP.md)）明说 "Same rules as audit-product-code"，但实际两套实现完全不同语义。

### 为什么这是反模式（而不是普通 bug）

命中 [`docs/meta-rules.md`](../../meta-rules.md) **真源单一**原则：一条规则（"不要内联 svg / 不要把 emoji/arrow 当 icon"）有两个实现入口（CLI vs plugin），且两个入口对**同一个规则名**给出不同答案。

历史类似教训对照：
- `divergences-decisions.json` vs `prop-aliases.md`：曾经出现"同一 prop 双 source"分叉 → 落 translation/ 单一 SoT 收敛
- `src/canonical/*` vs `src/components/*`：曾经出现"AI 不知道用哪个"分叉 → 落硬规则 #6 强制 canonical SoT

本次 ESLint plugin vs CLI 是这套反模式在 audit 层的复现。

### 修复方向

**方案 A（推荐）**：plugin rule 共享 CLI 探测逻辑（抽公共 detector 到 `eslint-plugin/shared/` 或直接 import `scripts/audit-product-code.mjs` 的探测函数）；emoji/arrow 检测拆到独立 rule `no-emoji-arrow-as-icon`。

**方案 B**：保留现状，文档明示 "互补不替代，CLI + plugin 都要跑" — 5min 改完但用户 UX 仍差。

---

## 5. 附属 finding（不阻塞 RC，但 v0.7.0 顺路）

| # | finding | 文件 | 优先级 |
|---|---|---|---|
| F1 | postinstall banner 在 `npm install` 下不显示（pnpm 测过 OK） | `scripts/consumer-postinstall.mjs` | P1 |
| F2 | CONSUMER_AUDIT_SETUP.md 默认假设 consumer 已有 pnpm + ESLint；最小项目需先装 `eslint@9 / eslint-plugin-vue / vue-eslint-parser` | `docs/CONSUMER_AUDIT_SETUP.md` §Install | P1 |
| F3 | 缺 "本地 tarball 测试" 路径文档（v0.6.0 npm 上 `scripts/` 漏，内部测必须 pnpm pack） | `docs/CONSUMER_AUDIT_SETUP.md` 新增 §Local tarball testing | P2 |
| F4 | `templates/eslint.config.example.js` 是 fragment 不是完整可跑示例 | `templates/eslint.config.example.js` | P2 |

---

## 6. 流程经验（给未来 session）

### ✅ 顺的

- **本地 tarball 路径绕开 npm publish bug 救场**：v0.6.0 npm 上漏 `scripts/`，靠 `pnpm pack` + 本地 file: 装能完整测，没等下一版 patch。下次类似 release-only fix 也可这么救。
- **同时跑 CLI + plugin 才暴露分叉**：如果只跑其中一个永远不会发现两者不一致。**未来 audit rule 加 CI**：CLI 和 plugin 跑同一个 fixture，diff 必须为 0。
- **真消费者用 npm 不 pnpm**：暴露 postinstall banner 在 npm 下不显示。下次写文档别默认 pnpm。

### ❌ 暴露的盲点

- **同名双实现没自动对账**：META-001 根因 — library 内部测从未把 CLI 和 plugin 跑在同一组 fixture 上 diff。应该加 audit gate。
- **CONSUMER_AUDIT_SETUP.md 没在最小项目上 dogfood 过**：文档假设了一堆 prerequisites（pnpm / ESLint 已装 / flat config 已有），真实最小项目 zero 都不满足。下次写消费指南应该在 minimal scaffolded vue/react app 上跑一遍再发。

---

## 7. 实际进展（同 session 内闭环 — 不等下个 session）

> 原计划"下次 build session 修 + 跟 v0.7.0 一起 ship"，但 contrast cleanup 等设计师（timeline 不确定），把 META-001 + files[] fix 卡在背后没意义。决策改为同 session 切 v0.6.1 patch ASAP（无破坏性，单点 risk 低）。

### v0.6.1 published (2026-05-19T06:09:27Z)

| 动作 | 结果 |
|---|---|
| `eslint-plugin/rules/no-inline-svg.js` 加 `defineTemplateBodyVisitor` | commit `88c23060` |
| `tests/EslintPluginNoInlineSvg.test.ts` 12 cases — Vue SFC + JS source + parity fixtures | 全 pass |
| MicroApps Console 重测 (tarball end-to-end) | 9 → 42 errors (33 真 `<svg>` + 8 arrow + 1 emoji)；与 CLI R1 对齐 |
| changeset patch + version bump + STATUS sync | commit `b99fafcc` |
| tag `v0.6.1` push → CI run [26079553331](https://github.com/NancyZeng0210/TVU-Design-System/actions/runs/26079553331) | 一次过 green |
| GitHub Packages 实物 verify | `0.6.1` created 2026-05-19T06:09:27Z |

### 剩余下次 session 做

| 优先级 | 动作 |
|---|---|
| P1 | F1 postinstall banner 在 npm install 下不显示（顺便复测） |
| P1 | F2 CONSUMER_AUDIT_SETUP.md 加 minimal-vue prerequisite section |
| P2 | F3 / F4 文档增强 |
| 验证收尾 | 用户用真 PAT 装 `@nancyzeng0210/tvu-design-system@0.6.1` 重跑（本 session 用本地 tarball 已实证，npm registry 路径需用户 PAT 才能跑全闭环） |
| 走 RC | 上述确认后走 v1.0.0-rc.1 — 仍等设计师 contrast review 完才走 v1.0.0 stable |

---

## 8. 关联

- Plan: [`_plans/new-session-prompt-consumer-product-verification.md`](../_plans/new-session-prompt-consumer-product-verification.md)
- Backlog entry: [META-001](../backlog.md)
- Consumer-side setup doc: [`docs/CONSUMER_AUDIT_SETUP.md`](../../CONSUMER_AUDIT_SETUP.md)
- v1.0 触发条件: [`V1_RELEASE_CHECKLIST.md`](../../V1_RELEASE_CHECKLIST.md) §3b
