# F25 Cleanup — Audit 规则收窄 + 设计规则补全 (2026-05-09)

> Plan owner = Claude Code (Opus 4.7, 1M context)。
> Trigger：用户 review F22+F25 overnight run 后对 audit 设计提出 4 个反问，让 plan owner 重新审视规则缺陷。
> Lineage：F22 (`3376d4a0`) → F25-A (`236062c2`) → F25-B (`4d518e44`) → F25-C (`bf86c1f4`) → overnight summary (`556b1e34`) → F23 prompt (`d261cb73`) → 本次 cleanup
>
> 本报告记录 4 个 audit 规则缺陷的修正决策 + 配套设计规则文档化。

---

## 用户反问与 plan owner 修正

### Q1: docs/pages noMatch 应该 fix 还是 audit 不该报？

**用户**：Element Plus / v3 的 docs demo 都用 design tokens 渲染才能看到真实视觉。

**Plan owner 重审**：原 audit 设计错误。docs page 里的 `padding: 10px` / `padding: 6px` 等 156 个 noMatch findings：
- 不在 design system spacing scale 上（4/8/12/16/24/32/40/56）
- 也不在 figma 真源里（figma 是组件层真源，不规定 docs page 装饰值）
- 是 docs page 自身样式，**不该有**对应 token

**正解**（用户校正）：
- 组件层 (`src/components/` / `src/canonical/`) 应该完全用 token
- docs page 自动通过组件 consumer 继承 token discipline
- audit 不该扫 docs page

**修正动作**：
- `audit-no-hardcoded-design-tokens.mjs` 删除 `playground/docs/pages` 范围
- TARGETS 收窄到 `[src/components, src/canonical]`
- F25-C 已做的 docs/pages tokenize（27 文件 / 245 替换）不回滚（无害且实证 token 真实视觉）

### Q2: 35 hex / 83 残留 mono finding 是什么色？要不要 token 化？

**用户**：第三方 logo 的颜色不应该改，也不应该加到 color token 中；它们应该跟对应的图标组件挂钩，且只引用到对应的图标组件上。

**Plan owner 重审**：原推荐"加 semantic-mono-color allowlist"是把 figma 真源问题伪装成 code 层豁免，违反硬规则 #5。

**实证分析**：F25-B 后 83 个残留 mono-color finding 的 hex 分布：
- 5 个匹配 token 表 (`#2fb54e=brand` / `#ea4233=red` / `#3892f3=blue` / `#f68512=orange` / `#353535=grey-10`)：figma SVG export pipeline 把 Color Variable 解析成 hex literal，丢失绑定语义
- 30 个不匹配 (`#0866ff` Facebook 蓝 / `#9146ff` Twitch 紫 / `#b54a4a` brand red / etc.)：第三方 app/brand 固定色，**不属于 TVU design system**，封装在 catalog SVG 内部，外部组件只通过 `<Icon name="..." />` 引用，颜色不会泄漏

**正解**（用户拍板）：
- 30 个非 token hex：不动，不报 audit，不入 backlog（设计意图 + 自然封装）
- 5 个 token-matching hex：当前不动（盲转 currentColor 风险破坏设计意图）
- audit 规则收窄到只 ERROR `#dbdbdb`（这是真正的"theme-able default 漏配 Variable"语义）

### Q3: 为什么 mono = error / multi = warn 这个二分？

**用户**：应该 figma 来什么色就显示什么色，单色多色都有可能；为什么单色报 error？

**Plan owner 重审**：原 audit 二分基于未经验证的 assumption "mono-color icon 都该是 theme-able"，但实际 Facebook icon 单色 `#0866ff` = 设计意图固定蓝，不该转 currentColor。我的二分**根本就是设计错了**。

**实际语义**（用户给出关键洞察）：
- figma 端"Color Type/Icon/Default" Variable 是设计师 default icon color 真源
- figma SVG export pipeline 把 Variable 解析成 literal `#dbdbdb`（grey-4 palette 值，但 designer 用它表达"应该是 Icon/Default"）
- 真正的 audit 价值：捕捉 `#dbdbdb` literal 漏转 currentColor

**修正动作**：
- `audit-icon-fill-currentcolor.mjs` 收窄：只 ERROR path fill 等于 `#dbdbdb`，删除 mono/multi 二分类
- 删 `figma-sync/audit-allowlist/icon-multicolor.json`（空白名单，规则收窄后不再需要）
- 同步扩展 F25-B 的 `transformSvgCurrentColor`：从"仅转 mono-color icon 中 #dbdbdb"扩展到"per-path 转任何 #dbdbdb 路径"，捕获 `*-off` / `*-stop` 类多色 icon 内的 #dbdbdb 主图层（7 个 icon / 4 个 catalog 文件追加修复）

### Q4: docs-page-bg-contrast audit 价值 < 维护成本

**用户**：同意删除。

**修正动作**：
- 删 `figma-sync/audit-docs-page-bg-contrast.mjs`
- 删 `package.json` 中 `audit:docs-page-bg-contrast` script 行
- F20 visual snapshot 落地后由像素 diff 自动捕获撞色（0 false positive）

---

## Audit 规则收窄前后对比

| Audit | 收窄前规则 | 收窄后规则 | 当前 finding |
|---|---|---|---:|
| icon-fill-currentcolor | mono-color path fill = error / multi-color = warn | path fill === `#dbdbdb` only = error | **0** (after extended transform) |
| component-no-inline-svg | unchanged — `<svg>` in components = error | unchanged | 0 |
| no-hardcoded-design-tokens | scan src/components + src/canonical + playground/docs/pages | scan src/components + src/canonical only | 42 (color 3 / spacing 27 / radius 12) |
| docs-page-bg-contrast | static heuristic same hex collision | **DELETED** — F20 visual snapshot 兜底 | n/a |

## 设计规则文档化（让 AI 工具未来生成 figma 效果图遵循）

用户洞察：figma `#dbdbdb` 是 SVG export pipeline 限制（Variable 引用解析成 literal），设计意图本意是 `Color Type/Icon/Default`。这条规则需要写到设计真源 `.md`：

| 真源文件 | 新增内容 |
|---|---|
| `src/design-system/translation/divergences.md` | 新段 "Figma SVG export pipeline limitation" — 解释 Variable resolved-to-hex 行为 + code 端 `transformSvgCurrentColor` 治本 |
| `src/design-system/translation/icon-aliases.ts` | 新增 `ICON_DEFAULT_COLOR_BINDING` 常量映射 figma `Color Type/Icon/Default` ↔ code `--icon-default` |
| `docs/internal/mockup-conventions.md` | 新增 M10 规则 — AI 生成 figma 效果图时单色非品牌图标 path fill 必须绑 `Color Type/Icon/Default` Variable，不写 `#dbdbdb` literal |
| `docs/working-principles.md` | 决策 Log 加 "2026-05-09 Icon default color 决策" — 解释为何 `.icon` 不强加 color (避免破坏现有 cascade-based override pattern) + figma 真源 = 设计师 fallback responsibility |

---

## 改动文件清单

**Audit 规则收窄 (7 文件)**：
- modified `figma-sync/audit-no-hardcoded-design-tokens.mjs` (TARGETS 收窄 + 注释更新)
- rewritten `figma-sync/audit-icon-fill-currentcolor.mjs` (规则收窄到只 #dbdbdb)
- modified `figma-sync/export-icons.mjs` (transformSvgCurrentColor per-path 扩展)
- modified 4 catalog files (audio.ts / meeting.ts / network.ts / video.ts) — 7 paths 转 currentColor (已被 audit 收窄前覆盖之外的 multi-color icon 残留)
- deleted `figma-sync/audit-docs-page-bg-contrast.mjs`
- deleted `figma-sync/audit-allowlist/icon-multicolor.json`
- modified `package.json` (-1 audit script 行)

**Baseline / 报告 (2 文件)**：
- modified `docs/internal/_reports/f25-phase-a-baseline-2026-05-09.md` (前置说明指向本 cleanup 报告)
- new `docs/internal/_reports/f25-cleanup-2026-05-09.md` (本文件)

**设计规则真源文档化 (4 文件)**：
- modified `src/design-system/translation/divergences.md`
- modified `src/design-system/translation/icon-aliases.ts`
- modified `docs/internal/mockup-conventions.md`
- modified `docs/working-principles.md`

**合计**：~15 文件，1 commit。

---

## 验收 self-check

- [x] audit:icon-fill-currentcolor 收窄后跑 → **0 finding**（F25-B + 本次 extended transform 完成）
- [x] audit:no-hardcoded-design-tokens 收窄后跑 → 42 finding（仅 src/ 范围）
- [x] audit:component-no-inline-svg 不变 → 0 finding
- [x] audit:docs-page-bg-contrast 删除 → 不再 npm script
- [x] vue-tsc 0 errors
- [x] audit:figma-conformance overallPass=true
- [x] audit:docs-site 仅历史 in-review warn

## 未解决项 / 后续

- src/ 残留 42 个 hardcoded design-token finding（Q1 反问的"35 个 src/ 残留"实际是 42 个，因 audit 范围调整）：plan owner 后续单独 review，逐条标 tokenize / keep-domain
- Icon.vue `.icon { color: var(--icon-default); }` fallback **不在本 cleanup 范围**——会破坏 InputNumber `:disabled` / PromptMessage status icon 等 inheritance-based pattern。需要先重构所有消费者用 specificity-based selector 才能加，独立 backlog 任务
- F23 FormItemPage 重写已 done（用户在新 session 跑了 executor）
