# 设计规范整理 — 完整计划 & 进度时间线

> **🤖 AI 读取指引（L-ref，按需加载 — STATUS §起手必读链路）**：每 session 最小集 = **§排期原则**（短，必读）；命中任何"v0.X 包含哪些 / 先做哪个 / 该不该上 Tier N"排期决策 → **全读本文件**。本文件 ~64KB 排期史，不在 L-core 全读集内。
>
> **Living document** — 每次 session wrap-up 前必须同步，补入本 session 完成的项（完成日期 + 耗时）。
> 参考入口登记在 `STATUS.md` Wrap-up 协议 + 文件关系表。
>
> **本文件是项目排期 SoT** — 任何 "v0.X 包含哪些 / 先做哪个 / 该不该上 Tier N" 决策都查这里。STATUS.md 是状态镜像，本文件是计划真源。

> **SoT 实证 (2026-05-15)** — Button family figma 真源数字 "21 sets / 8400 variants"（出现在历史 retrospect 2026-05-06 / 2026-05-07 / 历史 prompt phase-a1-generator-auto-discovery）是早期估算。v0.5.0 Sprint A baseline 通过 `jq '[.components[] | select(.figmaName | test("Button"; "i"))]' figma-data/normalized/components.manifest.json` 实证修正为：
>
> - **8 主 sets × ~400 variants**（`Button/dark|light × L|M|S|XS`）= 3,200 主 variants
> - Button/url link 特殊 set：1 set × 4 variants
> - 孤立 `IconLoadingButton*` 单节点：20 个（figma 文件未归集到主 set，建议设计师 cleanup — 已登记 [`backlog.md`](../backlog.md) BRIDGE-MOCKUP-006 候选）
> - **figma entries 总数 29 / 总 variants 3,224**
>
> 历史 retrospect / 历史 prompt 内"21 sets / 8400 variants"原文保留作为历史快照，不重写正文；本段是 ground truth 锚点。本文件 + STATUS.md + backlog.md + prop-aliases.json + 当前 sprint pickup 均已同步为实证数字。

---

## 什么是"设计规范整理"

本项目设计规范整理涵盖**三条并行轨道**：

| 轨道 | 内容 | 项目目标关系 |
|---|---|---|
| **A — Canonical 对齐**（CANONICAL / BRIDGE / EXTRACT 系列）| 组件代码 vs Figma 真源 mismatch 修复 + API 形态统一 + Figma 真源 pipeline | 能力 1（dev npm）+ 能力 2（Figma URL → code）+ 能力 5（溯源）|
| **B — 设计流程文档**（M 系列 + Agent / Skill）| mockup-conventions / design-process / domain-tvu / figma-technical-reference | AI / 设计师协作规则可机械执行 |
| **C — 自动化基础设施**（Tier 1/2/3）| translation schema 化 + mockup audit + ESLint plugin + a11y | **能力 4（multimodal → 合规 mockup）**+ 加固能力 5（溯源 schema 验证）+ 强化能力 1（consumer 自检）|

---

## 排期原则（**决策方法论 — 不可违背**）

> **背景**：plan owner 历史上倾向"按复杂度 / 耗时 / 成本最低"排，导致主线工作被小任务推后。本原则机械约束 plan owner，每次提排期前必须读一遍。
> **触发查看条件**：任何 "v0.X 包含哪些 / 先做哪个 / 该不该上 Tier N" 决策。

### 排期权重（按优先级降序）

1. **项目目标对齐** — 直接落地 [`PROJECT_GOAL.md`](../../PROJECT_GOAL.md) 5 个能力之一的工作 → **最高优先级**
2. **依赖解锁** — 后续多项工作的前置 → 高优先级（哪怕单项工作量大）
3. **自动化 / 标准化** — 把 L1 文本规则升 L3+ 工具的工作 → 高优先级（[`meta-rules.md`](../../meta-rules.md) trigger K 已强制 "客观可测规则 → L3+"）
4. **快速可交付的独立项** — 0 阻塞 + 短 cycle → 顺路填空，**不挤主线**

### 不应作为排期依据的反模式

| ❌ 反模式 | ✅ 正解 |
|---|---|
| "这项小，先做" | 看是否在主线依赖路径上 |
| "这项 20-30h，太大推后" | 看是否阻塞其它项；若是 → 优先 |
| "成本最低先做" | 项目目标对齐 > 单项成本 |
| "先做简单的看进度" | 进度感来自里程碑达成，不是任务计数 |
| "这项不阻塞，留着以后" | 若对齐项目目标核心能力 → 主线，不"留着" |

### 自检清单（每次提排期前过一遍）

- [ ] 这项跟 [`PROJECT_GOAL.md`](../../PROJECT_GOAL.md) 哪个能力对齐？（必须能答上来 1 个）
- [ ] 这项 unblock 多少其它项？
- [ ] 有没有按 "小 / 快 / 简单" 理由把主线工作推后？
- [ ] 自动化前置基础设施是否在主线前 1-2 个 sprint？
- [ ] 排期表里 patch / minor / major 命名是否符合 0.x semver（破坏性走 0.x.0，1.0 = 稳定承诺）？

> **5 条全 ✓ 才能提出排期；命中任一 ❌ → 停下重排**。

---

## Release 排期（v0.2 → v1.0）

> **核心原则**：0.x 阶段 **minor (0.x.0) 可含破坏性**；patch (0.x.y) 只 non-breaking；1.0 = 稳定承诺、API 锁定。
> **能力对齐**：每个 release 必须在"对齐能力"栏标明落地 [`PROJECT_GOAL.md`](../../PROJECT_GOAL.md) 哪个能力。

### ~~v0.2.0~~ ✅ shipped 2026-05-13

| 项 | 内容 |
|---|---|
| **对齐能力** | 能力 1（dev npm 可消费 Chart）+ 能力 2（Figma → code 完整 mapping）|
| **内容** | CANONICAL-011 Chart（6 variants + Chart.js + 12 色 palette）+ BRIDGE-MOCKUP-004 audit:published-vs-code 升 9th strict gate + Playwright 58 baseline + husky v1 + INFRA-F30 idempotent writes |
| **实际耗时** | ~2h（含 CI fail fix + re-tag + INFRA-F30 顺手扩） |
| **Evidence** | [CI run 25788351709](https://github.com/NancyZeng0210/TVU-Design-System/actions/runs/25788351709) green 1m23s; Packages 页 verified "0.2.0 Latest" |

### v0.3.0（**自动化前置 + API 增强**）

| 项 | 内容 |
|---|---|
| **对齐能力** | **能力 5（溯源）schema 化** + 能力 1/2（API 增强 + AI 从 Figma URL 完整 prop 暴露）|
| **破坏性** | 是（BRIDGE-005 改 API；Phase 6.4 non-breaking 顺路）|
| **排期理由** | Tier 1-A 已完成并 unblock 后续翻译层增改 |
| **内容** | **Phase 6.4**：加 showCount / multiple / editable props（non-breaking）<br> **BRIDGE-005**：Figma boolean / instance-swap 三层 schema 升级（generator + canonical + prop-aliases）<br><br>✅ **Tier 1-A 已于 2026-05-14 完成**：translation JSON + Schema + `audit:translation-completeness` L5 strict gate（10 维 audit 含维度 6 active vs resolved cross-check 防 SoT drift 复发）<br>✅ **Phase 6.3 实际 2026-04-28 已 resolved**（commit 897d709c；divergences-decisions.json `notification-success-deletion` + `notification-type-deletion` 标 resolved。STATUS / tracker 2026-05-11 stale active 列入是 SoT drift，2026-05-14 修正） |
| **估时** | ~1-2 天（剩 Phase 6.4 + BRIDGE-005） |

### ~~v0.4.0~~ ✅ shipped 2026-05-14（API 形态统一）

| 项 | 内容 |
|---|---|
| **对齐能力** | 能力 1（dev API 一致）+ 能力 2（AI 从 Figma URL 不撞双 API）|
| **内容** | **Phase 6.6a**：FormItem.label `#label` 命名 slot dual-form (commit 529bb366)<br> **Phase 6.6b**：Tooltip.content `#content` 命名 slot dual-form + FormItemPage Icon demo fix (commit 0db2bfd0)<br> **Phase 6.7**：Badge SoT drift reconciliation B path — canonical 自 checkpoint 9e3ca1ae 已 ship 实质内容，本版本 ack (commit 5546ae0b)<br> **Tier 2-D**：`scripts/new-backlog.mjs` 自动 ID generator (commit 50ff23d0) |
| **实际破坏性** | **否** — 4 项全 non-breaking（dual-form 加新命名 slot 不删旧 prop；Phase 6.7 0 code change；2-D 是 dev 工具）。Pickup 原 "破坏性=是" 描述基于 spec 视角；执行后实证 non-breaking |
| **实际耗时** | ~4h（4 sprints 每 sprint ~1h；远低于估 ~12-18h，沿用 v0.3.0 实跑 4-8x under-estimate 经验）|
| **Evidence** | [CI run 25856655323](https://github.com/NancyZeng0210/TVU-Design-System/actions/runs/25856655323) green 1m24s; Packages API verified — `0.4.0` created 2026-05-14T11:07:11Z; [Packages page](https://github.com/users/NancyZeng0210/packages/npm/package/tvu-design-system) |

### ~~v0.5.0~~ ✅ shipped 2026-05-18（最大组件 + tooling + pipeline Styles + mockup sync）

| 项 | 内容 |
|---|---|
| **对齐能力** | 能力 1/2（Button 是 DS 第一大组件）+ Tier 2 tooling（AI workflow 加速）+ 能力 5（pipeline Styles 抽取）|
| **实际 shipped** | **Phase 6.8** ✅ (commit 136ddc4b)：Button canonicalTheme axis；8 axis 完整覆盖 figma 8 sets。旧 API @deprecated since 0.5.0 → removed v0.6.0。**Tier 2-E** ✅ (commit 27c90388)：figma-url-to-canonical CLI。**Tier 2-F** ✅ (commit 27c90388)：lint-skills CLI，6 skills 0 broken links。**CANONICAL-007** ✅ (commit 63a9cdaf)：Pagination native button → DS Button。**EXTRACT-006** ✅ (this session)：`extractStyles()` + `getFileStyles()`；live 14 text / 4 effect / 0 fill / 0 grid；normalized-key prev merge 保留 canonicalToken/usage/_alignment_decisions/scaleTokens。**INFRA-F32** ✅ (this session)：`sync-mockup-data.mjs` + parametrized api.mjs；`.gitignore figma-data/mockup/`；live verified w/ MicroApps fileKey (~65 MB)；解锁 Tier 1-B。|
| **Tier 1-B 状态** | **unblocked → v0.6.0**：F32 已完成；audit 实现仍 ~6-10h，留 v0.6.0 |
| **破坏性** | **否** — Phase 6.8 加新 axis + 旧 API @deprecated（v0.6.0 才真删）；其余纯加法 |
| **实际耗时** | ~5.5h（Phase 6.8 ~3h + Tier 2-E/F ~1h + CANONICAL-007 ~30min + EXTRACT-006 ~30min + INFRA-F32 ~30min；vs 历史估 ~1-2 周）|
| **Evidence** | [CI run 26024995380](https://github.com/NancyZeng0210/TVU-Design-System/actions/runs/26024995380) green; Packages API verified — `0.5.0` created 2026-05-18T09:28:01Z; 2 CI hotfix commits (4f18a065 Mask blur8 双空格 alias / 4b7de2ed lint-skills globSync) |

### ~~v0.6.1~~ ✅ shipped 2026-05-19（consumer reference adoption 实测 + META-001 fix + files[] fix）

> CI 一次过（[run 26079553331](https://github.com/NancyZeng0210/TVU-Design-System/actions/runs/26079553331)）；Packages 实物 verified 0.6.1 created 2026-05-19T06:09:27Z。详见 [retrospect](./2026-05-19-consumer-verification-microapps.md)。consumer reference adoption (v1.0 trigger 3b) 第一次外部实测；MicroApps Console vue-app；同 session 发现 + 修 + ship META-001。

| 项 | 状态 | commit |
|---|---|---|
| **META-001** ESLint plugin no-inline-svg Vue SFC `<template>` 探测 | ✅ 2026-05-19 | 88c23060 |
| **files[] expansion** npm tarball 含 scripts/templates/docs | ✅ 2026-05-19 | b99fafcc (master HEAD 已修，v0.6.1 ship) |
| **consumer reference adoption 3b** MicroApps vue-app 实测 (local tarball + real npm registry 双路径) | ✅ 2026-05-19 | retrospect 2026-05-19 |

**对齐能力**：v1.0 trigger 3b reference adoption 解锁；CLI ↔ ESLint plugin 语义对齐（真源单一原则在 audit 层落实）

---

### ~~v0.6.0~~ ✅ shipped 2026-05-18（tooling + audit infra + Button breaking + ESLint plugin）

> CI 一次过（[run 26028124326](https://github.com/NancyZeng0210/TVU-Design-System/actions/runs/26028124326)）；Packages 实物 verified 0.6.0 created 2026-05-18T10:35:01Z。详见 [retrospect](./2026-05-18-v060-release.md)。F34 Node 20/22 matrix 起作用 — v0.5.0 需 2 hotfix 才过, v0.6.0 含 11 项 incl. BREAKING + 新 subpath export 仍一次过。

| 项 | 状态 | commit |
|---|---|---|
| **INFRA-F32** figma-data/mockup/ sync 机制 | ✅ 2026-05-18 | 2b54a73b |
| **Tier 2-G** STATUS.md 一致性 lint | ✅ 2026-05-18 | 935f4aab |
| **Tier 1-B** M-INTEGRITY (M27/M28/M34 = I1/I2/I3) | ✅ parallel session | 093064fa |
| **Tier 1-B** M-COLOR (M10/M25/M26 = C1/C2/C3) | ✅ parallel session | 093064fa |
| **Tier 1-B** M0/M1/M30 library-binding | ✅ 2026-05-18 | 935f4aab |
| **F34** scripts stdlib stability + Node 20/22 CI matrix | ✅ 2026-05-18 | 6314e58a |
| **F33** code-side figma name normalize | ✅ 2026-05-18 | fa500040 |
| **hook allow-list 升级** (figma-styles.json) | ✅ 2026-05-18 | 6314e58a |
| **R1/R2/R16 audit-product-code.mjs** (CLI, not ESLint plugin yet) | ✅ parallel session + 935f4aab tracking | 093064fa + 935f4aab |
| **Tier 1-C** proper `@nancyzeng0210/eslint-plugin-tvu-design-system` npm 包 | 🔲 deferred — 独立 sibling package, ~2-3 sessions | — |
| Button legacy props removal (v0.5.0 @deprecated → 真删) | 🔲 待 v0.6.0 release timing | — |

**对齐能力**：能力 4（mockup audit 多个 L3+ gate 落地）+ 能力 1（R-rule consumer code 检查 CLI 版本就位）+ Tier 2 全自动化巩固

**Release timing 决策点**：当前 master 已累积 v0.5.0 之后的 9 项工作。两条路：
- 路线 A：现在 ship v0.6.0 minor（Tier 1-C 留 v0.7.0）— Button @deprecated 真删 + 当前已累积
- 路线 B：先做 Tier 1-C（~2-3 sessions）再 ship v0.6.0 大块头 — 推迟 ~1-2 周但 release content 更厚

**估时**：路线 A ~30min release wrap；路线 B ~2-3 sessions + release

### v1.0.0（**稳定承诺**）

| 项 | 内容 |
|---|---|
| **对齐能力** | **5 个能力全交付** |
| **触发条件** | (a) PROJECT_GOAL 5 能力全部 ship；(b) 至少 3 个月无 breaking change；(c) ESLint plugin + mockup audit + translation schema 三大自动化全 L5；(d) a11y axe-core CI 跑通；(e) API 锁定 + 写迁移指南 |
| **内容** | **Tier 3-H** axe-core a11y audit；Phase 8 视觉脚本 + Code Connect（如 Figma plan 升级到 Org）；API 锁定 + 写迁移指南 + 公开 changelog |
| **估时** | wrap-up 阶段（~2-3 周） |

---

## 轨道 A — CANONICAL 系列

### 已完成

| ID | 内容摘要 | 完成日期 | 耗时估算 | 版本 |
|---|---|---|---|---|
| CANONICAL-001 | Tooltip `placement=top-*` arrow CSS 偏移修复 | 2026-05-09 | ~30min | v0.1.0 |
| CANONICAL-003 | BaseNotification iconMap 不一致 + Icon.vue inline `currentColor` override | 2026-05-09 | ~1h | v0.1.0 |
| CANONICAL-009 | audit:design-system 升 strict（scoped CSS vars false-positive + carrier 白名单 + Tab.vue token 替换）| 2026-05-11 | ~2h | v0.1.1 |
| CANONICAL-004 | Progress dark track token：`--progress-track-bg-dark` → `var(--line-deep)` (#353535) | 2026-05-13 | ~30min | patch（未单独 release）|
| CANONICAL-006 | Pagination figma alignment refactor — 7 mismatch（nav row gap / Simple nav width / Classic btn bg+border+font-weight / Small btn size 24→32px）+ .pg-main→.pg-content+.pg-nav-row hierarchy 重构 | 2026-05-13 | ~2h（prompt 写作 + Codex executor + 验收）| patch（未单独 release）|
| CANONICAL-010 | PopupBox 实现 — modal dialog + 命令式 API（PopupBox.alert/.confirm/.open）+ Teleport + docs page | 2026-05-12 | ~10-15h | v0.1.3 |
| CANONICAL-002 | PromptMessage auto-dismiss — `autoDismissMs?: number` prop + `watchEffect` timer + `onBeforeUnmount` cleanup；prop-aliases.md 登记；docs Events 表修正 | 2026-05-13 | ~30min | patch（未单独 release）|
| CANONICAL-008 | Table + InputNumber 字体 — 确认 `--font-family-en` token 含 Helvetica Neue fallback，macOS 渲染正常，非 drift，无需代码改动 | 2026-05-13 | ~5min（验证即关）| N/A（已关闭）|
| INFRA-F19 | Docs site theme toggle 完整化 — 发现已在前次 session 实现（DocsShell provide + FigmaMembersGrid inject + 18 pages :site-theme 删除 + audit gate 反转），补删 backlog 条目 | 2026-05-13 | ~10min（验证即关）| N/A |
| INFRA-F20 | Playwright 视觉基线 — playwright.config.ts + tests/visual/docs-pages.spec.ts（29 page × dark/light = 58 baseline）| 2026-05-13 | ~1.5h（prompt + Codex 执行 + 验收）| commit 5a9d4ab7 |
| vitest fixture sync | 10 fixture drift（CANONICAL-002/006/008 漏跑 test 教训）+ retrospect + F21 vitest gate spec | 2026-05-13 | ~1h | commit 5b39e886 + retrospect 2026-05-13-vitest-fixture-drift |
| INFRA-F26 | extract-figma timestamp idempotence — extract.mjs + normalize-component-tokens.mjs stripPaths + --force | 2026-05-13 | ~1.5h（prompt + Codex + 验收）| commits fa03b1ee/af61d18a/98a85bd3 |
| INFRA-F29 | normalize.mjs normalizedAt churn — inline patch 复用 F26 helper（MD5 verified idempotent）| 2026-05-13 | ~15min | commit c2c17969 |
| INFRA-F21 v1 + polish | husky pre-commit hook（vue-tsc/vitest/figma-data block）+ polish 加 sync-output 白名单（mapping.json + audit reports 允许）| 2026-05-13 | ~1.5h（prompt + Codex + polish）| commits 4f993a17/0d9332b6/716212ba/2b1283b5 |
| CANONICAL-011 | Chart 实现（6 variants · Chart.js + 12 色 palette） — D1 dep 选型 + D2 API 设计 + D3 implementation + F20 baseline cascade refresh | 2026-05-13 | ~6h（D1/D2 设计 + Codex impl + 验收 + cascade fix）| v0.2.0；commits bb32f374/96016f23/061a3e54/4f715141；retrospect 2026-05-13-canonical-011-prompt-gap |
| BRIDGE-MOCKUP-004 | tracker 收尾 — figma-to-code-mapping.json status update + publish.yml continue-on-error 移除 + RELEASING.md gate 表更新 → audit:published-vs-code 升 9th strict | 2026-05-13 | ~30min | commit 444406a2 |
| v0.2.0 release ship | changeset → CI green → Packages 页 verified `0.2.0 Latest`；含 Chart + 9 strict + Playwright + husky v1 + INFRA-F30；第二次重打 tag 修了 audit:docs-site ChartPage manifest gap (CANONICAL-011 prompt gap retrospect) | 2026-05-13 | ~1h（含 fix CI fail + re-tag）| v0.2.0；CI run 25788351709 |
| INFRA-F30 | timestamp-aware idempotent writes — icon-artifacts.mjs writePublishedManifest + audit-page-t2-sample.mjs renderReport + audit-figma-published-vs-code.mjs writeJSON/writeFileSync；strip `generatedAt` / `生成时间` / `Generated at` / `checkedAt`；消除 ~20 文件每次 commit dirty noise（同 F26/F29 pattern） | 2026-05-13 | ~1.5h（含 verify + audit-figma-published 顺手）| commit 2cf026e9 |
| 排期 SoT 重构 | tracker 加"排期原则"+ "Release 排期 v0.2 → v1.0" + 轨道 C 自动化路线；STATUS 同步重命名 v0.3/v0.4/v0.5/v0.6 (替换"v1.0 major")；PROJECT_GOAL 阶段路线同步；meta-rules 加 trigger M (排期决策反模式) | 2026-05-13 | ~2h | commit c6a70d1a |
| INFRA-F31 | 5-step onboarding gate enforcement — STATUS §起手必读链路 加 mandatory gate + tracker 显式 step 3a + 违反信号；AGENTS 顶部新增 ⛔ Onboarding Gate 段；.claude/hooks/onboarding-checklist.sh SessionStart hook 注入 5-step checklist via additionalContext；防 AI shortcut 起手必读（session 10 实证：跳 PROJECT_GOAL+AGENTS → 缺 4 项硬约束 → 用户返工） | 2026-05-13 | ~1h（设计 + 编辑 + hook + 验证） | commit 812365a8；retrospect 2026-05-13-onboarding-gate-enforcement |
| Tier 1-A Sprint 1 | axis-implementation-map.md → JSON + Schema (16 instances) + 归档原 md → _archive | 2026-05-14 | ~1h vs 估 1d | commit 40e8c777 |
| Tier 1-A Sprint 2 | prop-aliases.md split → prop-aliases.json (102 entries 13 scope) + 瘦身 md narrative (225→125 行) | 2026-05-14 | ~1h vs 估 2-3d | commit 76e99070 |
| Tier 1-A Sprint 3 | divergences.md split → divergences-decisions.json (26 decisions 8 category) + 保留 narrative | 2026-05-14 | ~1h vs 估 2-3d | commit 859c2ba5 |
| Tier 1-A Sprint 4 | audit:translation-completeness 5 维 audit + 10th strict gate + allowlist + RELEASING/STATUS/tracker/retrospect sync (Plan owner 修 3 处: shell PATH bug / 5 rg→grep verifyHint / log polish) | 2026-05-14 | ~2h vs 估 2-3d | commit 8534f01d |
| SoT drift cleanup + audit dim 6 | Phase 6.3 stale active 修正 + BreadcrumbItem showIcon↔showSeparator alias drift fix + INFRA-F30 4th source idempotent + audit dim 6 (STATUS/tracker active vs divergences-decisions resolved cross-check) 实证抓 8 个 stale finding | 2026-05-14 | ~1.5h | commit 788f1be2 |
| BRIDGE-005 | generator 加 booleanProperties 字段 (parseBooleanPropsFromTsx + lookupBooleanPropertyAlias) + DocsFigmaMembers schema 升级 + 9 components 重生成 + Plan owner fix: axis-named props 排除 (Radio.status axis 误推 boolean) | 2026-05-14 | ~1.5h vs 估 6-10h | commit 201895c4 |
| Phase 6.4 | Input.showCount + maxlength + Select.multiple + Select.editable runtime additions (non-breaking; sugar shortcut for figma axis values via OR merge) + 3 prop-aliases entries + 3 vitest tests | 2026-05-14 | ~1h vs 估 4-6h | commit 8ce29ac8 |
| v0.3.0 release ship | changeset → version bump → tag push → CI green 1m13s → Packages API verified `0.3.0` created 2026-05-14T08:25:59Z; 完整 release wrap-up: STATUS/tracker/retrospect sync | 2026-05-14 | ~30min | commit 516d14ab; CI run 25849955436; v0.3.0 tag |
| audit translation-completeness h2 boundary fix | audit-translation-completeness.mjs `auditActiveVsResolved` section.end 加 `^## ` h2 截断（避免 `### v1.0.0` section 吞掉后续 `## 轨道 A` timeline 表 → 2 个 Phase 6.3 false-positive active-stale 清除）| 2026-05-14 | ~30min | commit cca1a043 |
| Phase 6.6a FormItem.label dual-form | base + canonical FormItem.vue 加 `#label` 命名 slot（slot 优先 over prop；default slot 保持 content/control 区） + 3 vitest case + FormItemPage Custom Label Slot demo + divergences/decision/prop-aliases 同步 | 2026-05-14 | ~1h vs 估 3-4h | commit 529bb366 |
| Phase 6.6b Tooltip.content dual-form | base + canonical Tooltip.vue 加 `#content` 命名 slot（slot 优先 over prop；default slot 保持 trigger） + 3 vitest case + TooltipPage Custom Content Slot demo + FormItemPage 顺路 fix demo 用公开 Icon export 路径满足 FigmaFirstContract test + divergences/decision/prop-aliases 同步 | 2026-05-14 | ~1h vs 估 3-4h | commit 0db2bfd0 |
| Phase 6.7 SoT drift reconciliation (B path) | 发现 pickup §3.2 描述 canonical.type=颜色枚举与现状脱节——canonical Badge 自 checkpoint 9e3ca1ae 起即为 color/tag/type=Circle\|Rectangle API；plan owner 直改 divergences.md/decision JSON 措辞 ack Phase 6.7 实质已 implemented，不改代码（避免破坏 consumer + 翻译层最小化）| 2026-05-14 | ~30min | commit 5546ae0b |
| Tier 2-D backlog ID generator | `scripts/new-backlog.mjs` 单文件 ESM CLI（~89 行 zero-dep）：扫 3 SoT 文件（backlog.md + STATUS.md + tracker.md）找 `<PREFIX>-(\d+)` word-boundary regex 隔离 sub-prefix（BRIDGE vs BRIDGE-MOCKUP），输出 max+1 + entry stub。+`pnpm new-backlog` npm script。Plan owner direct-implement path B（用户 ack）| 2026-05-14 | ~20min vs 估 2h | commit 50ff23d0 |
| v0.5.0 Sprint A.1 baseline + 路线拍板 | Phase 6.8 实证 baseline：jq components.manifest.json → 8 主 sets × ~400 variants + 1 url + 20 isolated = 29 entries / 3,224 variants（修正历史估 "21 sets / 8400 variants"）；ButtonBridge 现 7 axis 已覆盖 figma 6 axis + size，**唯一缺口 = canonicalTheme axis**；path A 拍板（加新 axis + @deprecated old API，v0.6.0 才真删）；SoT 实证段写入 tracker 顶部；next-session-pickup-2026-05-15-v0-5-0.md 新建 | 2026-05-15 | ~1.5h | prep for v0.5.0 |
| v0.5.0 Sprint A.2 SoT drift cleanup | 实证数字同步 5 个文件（tracker §SoT 实证 / STATUS.md §v0.5.0 / backlog CANONICAL-007 + 历史 BRIDGE-Tier3 merged / prop-aliases entry composition-button-blocked-004 notes / divergences-decisions button-canonical-api-migration）；jq 验证 JSON 合法；commit d48cfc81 | 2026-05-15 | ~1h | commit d48cfc81 |
| Phase 6.8 Button canonical 迁移（canonicalTheme axis）| ButtonBridge.vue inject + resolvedTheme computed + `:canonical-theme` 透传；Button.vue `canonicalTheme` prop + `CanonicalContract.theme` + `data-figma-theme` attr + legacy props `@deprecated since 0.5.0`；3 vitest cases；decisions JSON `button-canonical-api-migration` → resolved；runtime-additions.md + ButtonPage.vue 更新；commit 136ddc4b | 2026-05-18 | ~3h (prompt writing ~1h + executor ~30min + review ~30min; vs 历史估 ~20-30h) | commit 136ddc4b |
| Sprint B baseline + Tier 1-B blocker 识别 | figma-data/ 目录 baseline：无 mockup/ 子目录；Tier 1-B `audit:mockup-conformance.mjs` 全部 M-rule 检查需 figma API 拉 mockup 文件数据 → BLOCKED；INFRA-F32 补入 backlog（figma-data/mockup/ sync 机制前置设计）；Sprint 路线 pivot → Tier 2-E/F 直接实现 | 2026-05-18 | ~30min | INFRA-F32 backlogged |
| Tier 2-E figma-url-to-canonical.mjs | `scripts/figma-url-to-canonical.mjs` 单文件 ESM CLI：parse Figma URL → nodeId → lookup components.manifest.json（component-level + variant-level）→ cross-ref figma-to-code-mapping.json → 输出 figmaName / codeNames / variantAxes / matched variant props。`pnpm figma-url-to-canonical` npm script | 2026-05-18 | ~30min vs 估 ~4-6h | plan owner direct (path B) |
| Tier 2-F lint-skills.mjs | `scripts/lint-skills.mjs` 单文件 ESM CLI：globSync `.claude/skills/*/SKILL.md` → 提取 markdown 链接 → 双路径 resolve（skill-relative + repo-root-relative）→ 校验文件存在；exit 1 if any missing。`pnpm lint-skills` npm script。6 skills 全 pass（0 broken links）| 2026-05-18 | ~30min vs 估 ~3-5h | plan owner direct (path B) |
| CANONICAL-007 Pagination buttons → DS Button | native `<button class="pg-btn">` 替换为 `<Button canonicalStyle/Color/Size/Radius>`；active=filling+green，inactive=filling+gray1，Small=rimless；arrow buttons=rimless+Icon slot；`.pg-nav-row :deep(.btn)` compact size override（延续 Pagination 既有 :deep 模式）；backlog entry 删除 | 2026-05-18 | ~30min vs 估 ~2h | commit 63a9cdaf |
| EXTRACT-006 extract pipeline Styles | `figma-sync/api.mjs` 加 `getFileStyles()`；`figma-sync/extract.mjs` 加 `extractStyles()`（批量 getNodes ≤100 ids；TEXT/EFFECT/FILL/GRID 四类；normalized-key 前向 merge 保留 prev canonicalToken/usage/description；`_alignment_decisions` + `scaleTokens` 原样保留）；live run 14 text (7 PingFang SC new) / 4 effect / 0 fill / 0 grid；idempotent verified | 2026-05-18 | ~30min vs 估 3-4h（pickup 内置完整 spec）| v0.5.0 release prep |
| INFRA-F32 figma-data/mockup/ sync 机制 | `figma-sync/sync-mockup-data.mjs` + `pnpm sync:mockup <fileKey>` 新 CLI；`api.mjs` 5 helpers (`getFile/getNodes/getFileStyles/getVariables/getImages`) 加 optional `fileKey` 参数（默认 env library key，向后兼容）；`figma-data/mockup/` 入 `.gitignore`（产品 mockup 文件大 + drift 频繁，不入设计系统库 repo）；live verified w/ MicroApps fileKey `DtZcMkhNy6qh6jbQQnhreQ` (~65 MB raw dump + idempotent re-run via `_meta.extractedAt` strip)；解锁 Tier 1-B audit:mockup-conformance（实现仍 v0.6.0） | 2026-05-18 | ~30min vs 估 ~2-3h | v0.5.0 release prep |
| BRIDGE-MOCKUP-008 Phase D figma-vs-sot drift audit | `figma-sync/audit-figma-vs-sot.mjs` (316 行) — 按 `figma_component_key` 对比 Figma icon manifest 与 `affordance-categories.json`，5 类 drift (A figma-only / B sot-orphan / C name-drift / D node-id-drift / E svg-content-drift)；A/B/C strict blocking，D/E warning；wire 进 `sync:figma-library` Step 14 + `--skip-sot-audit` flag + `pnpm audit:figma-vs-sot` script；首次实跑 643 vs 643 A=B=D=0 / C=3（Arrow/left→left_2, Arrow/right→right_2, Time/Calender→Calendar），plan owner in-place patch SoT figma_name + 配套 doc-lag closure (divergences.md §time/calendar / SoT path+notes / AGENTS.md 11→14 step) | 2026-05-28 | ~2h Codex + ~30min plan owner C-patch & doc-lag | commit 71aff271 (+ doc-lag follow-up) |

| Fidelity Audit (full 34) | 全量 Figma-vs-Code 保真度审计 — 34 canonical 逐组件多 agent 对照 Figma 真源 (54 agents) + 对抗复核砍 5 假阳 → **41 confirmed drift** (High 13 / Med 10 / Low 18)；产出排序 inventory + drift 分类 + **v0.7→v1.0 4-tier compliance pass 排期** + 8 新 backlog (CANONICAL-021~028)；composite-layer 类确认全库 clean（仅 CANONICAL-018 一处）| 2026-05-29 | ~17min workflow + ~40min plan owner verify/materialize | report [`_reports/figma-vs-code-fidelity-audit-2026-05-29.md`](../_reports/figma-vs-code-fidelity-audit-2026-05-29.md) + backlog master block |
| INFRA-F38 sync 图标管线 silent-failure | `sync:figma-library` 图标管线默认随 `--with-extract` 跑（Step 13 拆 13a `generate:candidates` 离线 blocking + 13b `sync:icons` 网络 non-blocking，新增 `--skip-icons`）—— 修「设计师改图标静默漏 / diff=0」根因（管线缺 `generate:candidates` + sync:icons opt-out）；`generate-component-candidates` 改 idempotent write；`audit:figma-vs-sot` null-key 静默 filter → Type F/G warning + name-join 兜底（随 SoT-shard `f1e63e3b` 落地）。plan owner direct (Infrastructure path B) | 2026-06-01 | ~1.5h (含实证 gap + verify + commit-split) | commit `36f4ebe6` (+ fix-3 in `f1e63e3b`) |
| CANONICAL-012 DropDownListSelect Multi check → canonical CheckBox | Multi row 的手撸 `<span class="dropdown-item__check">`+inline `--brand-match` checkbox 替换为复用 `<CheckBox readonly>`（base+canonical CheckBox 新增 readonly/display-only mode：去 role/tabindex/aria-checked/keydown + pointer-events:none，宿主 row 负责 click + listbox/option ARIA）。**baseline 推翻 pickup「零视觉变更」前提**：inline 与 canonical CheckBox size(14↔16)/radius(2↔1.2)/checked-bg(`--brand-match`↔`--brand`) 三处不同，且 light-theme inline 近白底 `#f1fbf3`+白勾 = 勾不可见真 bug。Figma 1561:8439 截图实证 = solid-brand 底+白勾 → canonical 才对，inline 是 drift → swap 同时修视觉 bug。canonical-compliance R1 1→0；+5 vitest（Checkbox readonly ×2 / DropDownListSelect Multi ×3）全 196 pass；prop-aliases runtime-addition-008 登记。plan owner direct（Refactor，workflow 测试门反漂移） | 2026-06-01 | ~1h（baseline + Figma verify + impl + test + doc） | commit `9f5c15ce` |
| Wave 1a verifier A-count 确认（v0.7 主线收口）+ verifier `color(srgb)` fix | 起手确认 CANONICAL-017 verifier 覆盖已落地（30/34 covered；4 internal-base 走 canonical wrapper）→ fresh verifier run 实测 Wave 1a 各 CANONICAL 的 A 真清数（pickup §3 🥇）。**A 295→248 (-47)** at 900-entry 全覆盖分母（≠ 旧 92 系列分母，见 ledger 分母重置说明）。确认：Notification -14 全清 / Table -12 / FormItem -18 / CANONICAL-018 dark+light leaf fix 真对（7→3）。**附带 verifier-fidelity fix**：`tests/visual-verify/manifest-verifier.spec.ts` `colorToHex()` 扩 `color(srgb r g b[ / a])` 解析（Chromium `color-mix(in srgb,…)` 计算形态）——之前任何 color-mix() 输出都被漏读成假阳；修后 Drop down 5 假阳清。plan owner direct（Infrastructure / verifier，path B，同 EXTRACT-008） | 2026-06-02 | ~1.5h（baseline + 2× verifier run + colorToHex fix + 实证 + doc） | commit `74aee519` |
| CANONICAL-028 Pill Status — verifier 覆盖 + 几何 1:1 fix | trigger-O：user 指出 Figma `Pill Status` 实已发布同步（backlog「blocked」stale）。加 verifier 覆盖（harness `componentLoaders` + generator target，single dark，Status/Active 轴→props，root `.pill`/text `.pill__label`，manifest 900→908）→ surface +47 几何 drift → 修 base `Pill.vue`（box-sizing border-box + min-height 28 + padding 4-12-4-10 + gap 8 对齐 Figma）→ **8/8 变体全 pass**（hue 早对齐此处机器确认 + 几何 1:1）。PillStatus uncovered→covered，全局 A 248→247。剩 PillCounter 无 Figma SoT。divergences `pill-component-family-2026-05-19` 同步去 stale（去 "Live"/`--msg-bg-*`，status→with-exceptions）。plan owner direct（Infrastructure/Refactor，测试门反漂移）| 2026-06-02 | ~1h（调查 + target + 2× verifier run + 几何 fix + doc）| commit (本 session) |
| INFRA-F39 step 1-3 verifier 拓扑准确性 + PillPage | **FormItem 94→0**（textFillHex 46 隐藏 required `*` visible:false 幻影：extract firstTextNode skip-invisible + manifest-gen invisible-text 视为无 + verifier textFillHex null-skip；原计划 normalize 置 null 会破 `audit:tokenized-diff` raw↔tokenized 恒等 → 改 verifier 层 · rootGap 48：gap 在内层 `.form-item__main` → 新 `gapTargetSelector`）+ **Table 66→12**（retarget `<table>`→per-variant cell + gap 量 `.tbl-cell__content` + 新 `suppressRootSize` 跳 cell-frame；清 54 幻影 + 暴露 12 真 left-pad drift；owner 确认按 Figma 还原 → 改 .tbl-cell 左 padding 0，Table 12→0，CANONICAL-029 resolved）。`pnpm drift:summary` **247→87 (-160)**。新 reusable verifier capability：`gapTargetSelector` / `suppressRootSize` / per-variant 函数 selector。**+ PillPage**（欠 deliverable）：`PillPage.vue`（PillStatus 8 变体 Status×Active grid + Status-with-count + PillCounter 4 kind code-first + API 表，inject 主题感知不 side-by-side）+ 注册 DocsShell/navigation/CanonicalPageId + site-review-manifest 声明 + Playwright 视觉 baseline（dark+light）+ 双主题视觉自查。plan owner direct（Infrastructure/verifier，path B） | 2026-06-03 | ~3h（baseline + 3-part FormItem fix + Table Figma 还原 + Table retarget + 2× verifier run + PillPage + 视觉自查 + doc）| commit (本 session) |

> CANONICAL-005 编号未分配（gap）。

> **2026-05-29 保真度 compliance pass 排期**（fidelity audit 驱动；真源在 backlog.md §Active 顶部 master block + report §4）：**Tier 1 v0.7** = Chart chrome (021) / opacity:0.4 杜撰 (022) / light-theme token (023) / FormItem error (019) / Progress 回归 (026)；**Tier 2 v0.8** = EXTRACT-007 + 覆盖率补全 (017)；**Tier 3 v0.9** = a11y 标准化 (013+016+027) / composition 复用 (012) / geometry 2× sweep (024)；**Tier 4 v1.0** = 文字色清尾 (025) / Pill (028)。

### v0.7.0 canonical alignment cleanup ledger（render-verification A 余量走势）

> 起算 baseline `c7aaa8a5` (2026-05-22) A=398。该 ledger 把 A 余量"哪个 commit 清了多少 / 还剩多少"显式化，避免 STATUS narrative 滚动后失去走势可见度。

| Sprint | 完成日期 | commit | A 清 | A 余 | 备注 |
|---|---|---|---:|---:|---|
| **baseline** | 2026-05-22 | `c7aaa8a5` | — | **398** | 起点 |
| **P15.2 + P15.2-extend** | 2026-05-27 | `b7448843` | -157 | **241** | 5 semantic token Figma 跨 theme 不对称还原 + InputBoxFilled disabled/placeholder/filled border transparent + verifier 真读 `::placeholder` pseudo |
| **P16a + P16a-fix** | 2026-05-27 | `eb0df4bb` | -125 | **116** | padding cluster：multi-select padding-block --sp-xxs (84) + text-count XL padding-bottom --sp-l (40) − filled.multiple.l[dark='on'] narrow exclusion (12) |
| P16b Design defer | 2026-05-27 | `9b6ea135` | 0 | 116 | P16b 4 option 全部净 -A=0；72 A field 留作 verifier topology gap，立 [`EXTRACT-007`](../backlog.md) (~80-140 行独立 sprint) |
| P17 discovery + ad-hoc sync | 2026-05-27 | `2118a9bb` / `31911264` | -3 | **113** | DropDownListSelect node-id 调研 + dropdown Operation merge + 12 orphan dedup + Badge layer3→layer4 drift 关闭 |
| **P17a + P17b** | 2026-05-28 | (内嵌于 db73a77a) | — | — | dropdown sub-cluster 前 2 轮（merged into P17c partial commit）|
| **P17c partial** | 2026-05-28 | `db73a77a` | -24 | **89** | DropDownListSelect 5 sub-cluster apply (-26 field FAIL) → 项目 A 113 → 89；3 sub-issue 留 residual（R1/R3a 真 drift，R2/R3b classification 已转 B）|
| P17c followup-residual | 2026-05-28 | — (no apply) | 0 | **89** | R1 mouse-leak 假设证伪 — 实证 expected/actual 显示 Multi+checked+active 多画 bg + Operation List checked 没画 bg + Radio+checked+disabled 用 full brand；待 P17d Design 决策 code-vs-divergence |
| **P17d Design + Apply** | 2026-05-28 | `5c81cec6` | -2 真清 / +5 假阳 unmask | **92** | α-1 Multi 排除 brand bg (-2 + -4 hover side-effect = -6) · β-1 Operation List checked 加 scoped bg（verifier 假阴，runtime UX 对齐）· γ-1 Radio+checked+disabled 切 `--brand-disable`（方向真对，但 verifier `fills[0]`-only 假阳 unmask 5 个）。**EXTRACT-008 立项** treats 5 假阳 + 防未来 overlay cell 同类假阳；落地后预期 92 → ≤84 |
| **EXTRACT-008** ✅ | 2026-05-29 | (本 commit) | 0 真清 / 0 数字动 (语义升级) | **92** | mechanical fix: `scripts/lib/composite-paints.mjs` bottom-up alpha composite + 9 vitest cases ✅. **关键 unmask**：composite math 正确后 raw fills 实证 P17d γ-1 假阳前提就错 — 2-layer `brand+#fff@70%` = `#bfe2c7` ≠ baked `--brand-disable` = `#8fcc9d`（math 验证差异显著）。Drop down 6 cell 实际两套设计（1 Parent baked + 5 Leaf composite）；γ-1 commit `5c81cec6` Leaf 5 cell 方向部分错 → **CANONICAL-018 立项** (P17d γ-2 follow-up：3 路径 code-side split / designer ask / cross-asymmetry registry)。原 92 = -2 真清 + 5 假阳 unmask (现升级为真 drift) — EXTRACT-008 是 systemic helper，未来 hover/pressed/disabled overlay cell 全受益。 |
| **CANONICAL-018** 🟢 | 2026-05-29 | `1db4910c` | -2 (预期) | **90** (旧分母预期) | **修正 EXTRACT-008 行的 "5 Leaf" 描述**：逐组件实证 discriminator 是 **theme 非 Parent/Leaf**，且真受影响的 A 只有 **2 个 leaf cell**：1561:8418 (light → `#bfe2c7`) + 1452:53096 (dark → `#8fd79f`，pickup 整段漏)。其余非 A（Multi affordance immune / Is Parent=Yes → B）。fix = theme-aware 双 color-mix（`DropDownListSelect.vue:123-134`）；**已 commit；2026-06-02 干净 verifier 确认见下 ⚠️ 分母重置行** |

> ⚠️ **分母重置（2026-06-02）— 旧 92/90 系列作废，下面是新 baseline**：上面 398→…→92 系列跑在 **CANONICAL-017 verifier 覆盖率 backfill 之前** 的小 manifest（~633 entry）。CANONICAL-017 Batch 1-5 + 6.1 把覆盖扩到 **900 entry**（FormItem/Table/Notification/Select 全家族等首次纳入 verifier），surface 出大量此前根本没被 check 的真 A drift。**因此 92 与下面的数字不在同一分母，不能续接比较。** 下面以 900-entry 全覆盖为新 baseline 重新记 A 走势。

### v0.7.0 canonical alignment ledger — 900-entry 全覆盖分母（CANONICAL-017 backfill 后）

> 起算 baseline = pre-Wave-1a 全覆盖报告（2026-05-29 13:59，commit 区间在 Batch 6.1 `0789f058` 之后、Wave 1a `203edc61` 之前）A=295。每行用 fresh verifier run 实测（非估值；[[feedback_baseline-before-plan]]）。

| Sprint | 完成日期 | commit | A 清 | A 余 | 备注 |
|---|---|---|---:|---:|---|
| **全覆盖 baseline** | 2026-05-29 | (报告 13:59) | — | **295** | CANONICAL-017 Batch 1-5+6.1 扩到 900 entry 后、Wave 1a 之前。per-comp：Form Item 112 / Table 78 / input line 40 / input filled 37 / Notification 14 / Drop down 7 / select line 5 / select filled 2 |
| **Pill Status 覆盖 + 几何 fix（CANONICAL-028）** | 2026-06-02 | (本 commit) | net -1 | **247** | trigger-O：Figma `Pill Status` 实已发布同步（user 指出）。加 verifier 覆盖（harness loader + generator target，manifest 900→908，8 entries single dark）→ surface +47 几何 drift（base Pill `pad 2/8 gap6 无高` vs Figma `h28 pad4-12-4-10 gap8`）→ 修 `Pill.vue`（box-sizing border-box + min-height 28 + padding + gap）→ **8/8 变体全 pass（颜色 hue 早对齐此处机器确认 + 几何 1:1）**。PillStatus uncovered→covered。net 248→247（+8 全 pass，几何 drift 清，±1 noise）。PillCounter 仍 code-only 无 Figma SoT |
| **Wave 1a + 018 + verifier color() fix** | 2026-06-02 | `74aee519` | **-47** | **248** | fresh verifier 实测确认。**Notification -14**（CANONICAL-024 border 1.2px + box-sizing，14→0 全清）· **Table -12**（CANONICAL-024 rootWidth/box-sizing，rootWidth 12 清；rootPadding 8/8/8 + gap 残留）· **FormItem -18**（CANONICAL-019 error label red，textFillHex 64→46；rootGap 48 是 verifier-config 非 code drift）· **Drop down 7→3**（CANONICAL-018 dark+light leaf 文字色 fix 真对，但渲 `color-mix()` → `color(srgb …)` 被旧 `colorToHex()` 漏读成 5 假阳；**修 verifier `colorToHex()` 解析 `color(srgb)` 后** 5 假阳清、暴露 1 真 Parent/Leaf 残留 #8fcc9d vs #bfe2c7 + 2 Multi 行 rootFillHex null α/β 残留）· **CANONICAL-022/026 A-neutral**（opacity:0.4 删除 + Progress theme-fork 删除视觉对但非 A-field）· input filled +1 是 focus-border verifier race 噪声（[[feedback_verifier-css-transition-race]]，非本轮 code/fix 引入）|
| **INFRA-F39 step 1-3 verifier 准确性** | 2026-06-03 | (本 commit) | **-160** | **87** | `pnpm drift:summary` 度量（A 分类与 report 平行，本 session baseline 247）。**FormItem 94→0 全幻影清**：textFillHex 46（隐藏 required 星号 `*` visible:false → extractor firstTextNode 跳 invisible + manifest-gen 视 invisible-text 为无 + verifier textFillHex null-skip；**原计划 normalize 置 null 会破 `audit:tokenized-diff` raw↔tokenized 恒等 → 改 verifier 层**）+ rootGap 48（gap 在内层 `.form-item__main` → 新 `gapTargetSelector`）。**Table 66→12**：retarget `<table>`→cell（per-variant `.tbl-head/.tbl-body .tbl-cell--{align}` + gap 量 `.tbl-cell__content` + 新 `suppressRootSize` 跳 cell-frame w/h）清 54 幻影，**暴露 12 真 left-pad drift**（cell L0 vs code 8px，此前在 `<table>` 层被掩盖；owner 确认按 Figma 还原 → 改 .tbl-cell 左 padding 0，Table 12→0，CANONICAL-029 resolved）。新 reusable verifier capability：`gapTargetSelector` / `suppressRootSize` / per-variant 函数 selector |
| **form_item CANONICAL-019 reversal + manifest casing** | 2026-06-03 | `778022c0` | net 0 (41→0 正确清) | **84** | INFRA-F39 firstTextNode 修复经 re-extract 应用到 form_item raw（取可见 "Form Label" 而非隐藏星号）surface 41 form_item A（旧星号提取掩盖在 84 里）。拆：**18 真 drift（reverse CANONICAL-019）**——live Figma（screenshot + get_variable_defs 1923:49069）实证 error 态 label 保持灰 grey-6 #9e9e9e，红色在独立 error message + 红边框（code 已有），CANONICAL-019 多余把 label 染红 → 删 `.form-item--error .form-item__label{color:--red}`；**23 verifier phantom**——manifest 传小写 `theme:'dark'`，组件判 `==='Dark'` 假 → dark 错用 light 类 → label 渲 --text-2 #cccccc，修 manifest-gen 传 verbatim 'Dark'/'Light'（code token 本就对）。form_item raw 重提取传导 tokenized/index/manifest（count 仍 685，INFRA-F36 dedup 保留）+ 刷 form-item 视觉 baseline（label 灰）。drift 仍 84 但 form_item 真正干净（非星号掩盖）。CANONICAL-019（2026-05-29 fidelity audit 拍/Wave 1a ship）被 live Figma 实证推翻 = mis-fix |
| **INFRA-F36 set-variant dedup（组件数清理）** | 2026-06-03 | `7b930683`+`8cec0721` | 0（结构清理非 A）| **84** | extract collectComponents 把 set 变体当 standalone 重复收集 → 4729 文件 = 39 set + 4044 dup + 646 真独立；修 collectComponents（COMPONENT_SET 停止递归 + REST map 防护）+ orphan-purge 定向 dedup + 离线 surgical 清理 → 4729→685。不影响 drift（verifier 读 set variant）|
| **INFRA-F39 select/dropdown discovery** | 2026-06-03 | `9ec6bf82` | **-3** | **84** | fresh verifier Playwright 实测。**select/dropdown 真 code drift = 0**（10 A 全是 verifier/Figma-hygiene artifact）。**Drop down 3 A→B**：全 `Is Parent=Yes`（组件无 isParent runtime prop）；`classify()` 正则 `no runtime prop` 漏匹配真实 warning `no DropDownListSelect runtime prop` → 修 `render-drift-summary.mjs` + `manifest-verifier.spec.ts` 两处 `no runtime prop`→`runtime prop`（全报告扫描确认零误伤），report.json classification + summary 同步。**select 7 textFillHex（#595959 vs code #7b7b7b）= Figma-hygiene 假阳留存**：**Select box 是 COMPONENT_SET**（filled/line 各 144 variants；live Figma `get_variable_defs` 双重确认），placeholder 文字色在 **set 内 variant cell 间手工绑定不一致**（live Figma 实证 dark+click M=grey-8 #595959 / L=grey-7 #7b7b7b，绑 raw Grey 非语义 token），code 渲一致 #7b7b7b 对齐多数派（38 变体 expected #7b7b7b 全 PASS）→ code 不改，挂 BRIDGE-DESIGN-REVIEW（set 内 placeholder 绑语义 token）。**⚠️ 用户挑战纠错（trigger-O）**：起初误判「610 散装组件没 combine 成 set」—— 错；实查 extract.mjs 当前不 flatten，但 raw 残留 4044 stale 散装文件（全 39 set flatten 遗留，orphan-purge 熔断器 >50% abort 清不掉）→ INFRA-F36 真实范围 4044（非 12）；verifier 读 set variant 未污染。|
| **CANONICAL-015 Notification action button → canonical Button** | 2026-06-04 | (本 commit) | 0（canonical-compliance 非 A）| **84** | live Figma `1408:17154` 实证 action 按钮 = `Button/M` 组件实例 → cancel `ghost/gray 1/M`、confirm `filling/green/M`、delete `filling/red/M`（`:canonical-theme`）换 canonical `<Button>`；close × 是裸 `icon/Edit/Close`（非 Button 实例）→ 保持 native + inline R2 白名单。`audit:canonical-compliance` R2 **10→6**（Notification 4 全清）；+5 vitest（198 pass）；drift A **不变 84**（Notification 几何/颜色早对齐 CANONICAL-024，本次只换按钮实现层）；vue-tsc 0。修正 CANONICAL-015 前提（close × ≠ Button）；Confirm/Delete fill raw-hex override #33ab4f/#ec5050 挂 BRIDGE-DESIGN-REVIEW。plan owner 写 spec → Codex executor apply → plan owner 独立复跑全验证 |
| **EXTRACT-007 (Apply v2) + CANONICAL-031 + textFillHex re-sync** | 2026-06-04 | (本 commit) | **-79** | **5** | **input overlay 77→0** + textFillHex 7→残留。extract 递归 child 几何（穿布局/SLOT、**停在 INSTANCE** 存引用+盒子、不下钻 vector，几何 only；owner 拍板 stop-at-instance = "import 引用不自建"）+ verifier `textInset.left/right`（递归 TEXT relativeX，统一 flat/slot）+ feature=yes rootPadding skip + **InputBoxBase 几何修对齐 Figma**（CANONICAL-031：icon16/left·right12/pad36·36，owner ack 视觉）。**+ owner republish Figma + re-extract Input/Select**（select/input textFillHex 多数 Figma=code 自然清）。**剩 5 A 全非 code drift**：4 个光标"\|"假阳（EXTRACT-009：extract 读光标段非占位文字色，owner "两个色值"理论实证）+ 1 个 `1858:47024` enable=off+filled text-count edge（Figma #141414 vs code #ccc，enable 语义 follow-up）。tokenized-diff 685/0；vue-tsc 0；vitest 198；render-verification pass。**双向失真完结**：77 既虚高（rootPadding 比错元素）又掩盖真 4-6px drift（textInset）。Apply v1 C.3 gate STOP 暴露 + owner trigger-O 连环纠错（skip slot→递归 / 提取数据→live Figma / size→state→cursor）|
| **CANONICAL-032 Input disabled 文本色 token 修 + owner Figma disable republish** | 2026-06-04 | (本 commit) | **net -1（17→4）** | **4** | owner 发现 Input/Select disable 文本色多处错 → Figma 修正 disable 文本色 republish → re-extract 4 set（input/select × line/filled）surface 12 disable textFillHex drift（Figma dark#595959/light#ccc = `--text-disabled` vs code `--text-tips` dark#9e9e9e/light#595959）。修 `Input.vue:.tvu-input:disabled color --text-tips→--text-disabled` + 删 3 冗余 override → 12 清零。**剩 4 全 EXTRACT-009 光标"\|"假阳**（select editable ×3 + input click ×1，extract 读光标段色非占位文字）。trigger-O：owner 先误判 1858 为 Normal、再自纠为 Disable 并发现整片 disable 色错 = 实测驱动。vue-tsc 0 / vitest 198 / tokenized-diff 685/0。opacity:0.4 follow-up（CANONICAL-022 同型）。**【2026-06-05 INFRA-F40 回填】** 本次 republish 还 resolved 了 divergence `input-select-disabled-text-figma-single-variant-outliers-2026-05-25`——owner 在 Figma 把 2 个 single-variant outlier 统一到 dominant token，正如该 entry `resolutionRef` 预言；当时未登记，由 INFRA-F40 CI gate 首次在 master 跑 prepublishOnly 时 verifyHint 探出（asserted 的 narrow override 已被本 commit 删）→ 标 resolved + 改 positive verifyHint（断言统一后的 `--text-disabled` 绑定）|
| **EXTRACT-009 cursor-aware 文字提取 ✅** | 2026-06-04 | (本 commit) | **-4** | **0** | `extract.mjs effectiveTextFills()`：`characters` 前导 `|`（UX 光标模拟）时读 `characterStyleOverrides[1]`→`styleOverrideTable[id].fills`（占位段色）非 node fills（光标段色）。scoped re-extract 3 set，diff 隔离实证只改 4 cursor cell（select filled1+line2 #595959→#7b7b7b / input filled1 #444444→#9e9e9e），**零误伤 681 组件**。**total A 4→0** —— Input/Select 对 Figma 全 1:1。tokenized-diff 685/0 / vue-tsc 0 / vitest 198。owner "两个色值"理论闭环。 |
| **SelectBox chip × light 色修复 + verifier 盲区审计（INFRA-F41）** | 2026-06-05 | (本 commit) | **0（非 A-field）** | **0** | user docs 站发现 light 多选 chip clear × 偏深。live Figma `1436:36574` 实证 = raw grey-6 #9e9e9e（两主题），code `.select-chip__close --text-tips`(light #595959) → `--color-grey-6`。同型 sweep（live Figma 逐个）：input/select 运行时 clear Figma 没画（无 SoT）、popup close 偏深但导出 SVG 值模糊 → 挂 BRIDGE-DESIGN-REVIEW（不盲改）。**user 质疑挑选式校验** → 追因 verifier 每 entry 只校 root+text，子元素全漏；立 **INFRA-F41** + 落地 `audit:render-coverage-gaps`（首跑 91 styled / 62 未覆盖 68%）。chip × 非 verifier A-field 故 A 仍 0。render-verification 908/PASS · vue-tsc 0。又一 [[feedback_verifier-css-transition-race]] 类 verifier-fidelity 教训：绿 ≠ 对，覆盖率有盲区。 |
| **组件 Code 化收尾：3 audit 全绿 + Alert 删除（CANONICAL-030/015/013）** | 2026-06-05 | (本 commit) | **0（A-neutral）** | **0** | 用户问"Figma 组件 Code 化还差多少"→ 实测 `audit:figma-library-vs-canonical` **40 published → 34 canonical → 0 figma-without-canonical**（存在性 100%）。收 3 件：**① figma-library-vs-canonical 转绿**（InputBoxBase/SelectBoxBase 内部 base + PillCounter code-first → audit `KNOWN_CANONICAL_NO_MAPPING` 白名单 + divergences.md 登记）**② CANONICAL-030 Alert orphan 删除**（owner acked；删 `src/components/Alert/` + playground/atomicAssets/export-coverage allowlist，零残留）**③ canonical-compliance R2 6→0 全绿**（CANONICAL-015 PopupBox/PromptMessage close× live Figma 实证裸 `icon/Edit/Close` + CANONICAL-013 SelectBox chip/clear·InputBox clear icon-only native button 加 inline R2 白名单）。vue-tsc 0 / vitest 198 / hard-rule 0 / export-coverage PASS。owner directed + ack。 |
| **docs QA 组件保真批（PopupBox/Button/Select）+ docs overlay IA** | 2026-06-10 | `c91e1bc3` | **0（A-neutral，verifier 不校 font/text-align/footer-impl）** | **0** | docs 站 dogfood 暴露 3 个真组件 bug:① **base PopupBox footer** 传已废弃 `variant`/`size` 死 prop(v0.6.0 已删)→ Cancel/Save 都掉默认 green/filling → 改 canonical Button API(ghost gray ≠ fill green)② **Button `font-family:inherit`** → PopupBox `<Teleport to=body>` 出 app 字体上下文渲浏览器默认字体 → 改 `var(--font-family-base)`(组件自持字体,Button 页无变化、popup 修好)③ **SelectBox value 居中** → trigger 是 native `<button>` UA `text-align:center` 继承进 `.select-value` → 加 `text-align:left`(Figma 左对齐;verifier 不校 text-align 故 sync 没抓到 = INFRA-F41 verifier 覆盖盲区同类)。+ canonical-compliance 白名单识别 root-fix(向上扫整个紧邻注释块,注解插入不再破 allow → master RED 转绿)。+ docs:Chart 全局 2 列无滚动、PopupBox 真表单弹窗 demo、nav Feedback→Overlays&Messaging 按模式分组、ds-enforcement-scenarios-spec.md。owner directed + 视觉截图审。**剩 C(Select 下拉 Teleport)+ G1-G4 enforcement → 下个 session**。 |
| **INFRA-F42 图标管线 diff 化（消除全删再重建）** | 2026-06-09 | (本 commit) | **0（infra 非 A）** | **0** | `export-icons.mjs` 删开头 `rmSync(OUTPUT_DIR)`，改 **内容 hash 比对（只写变了的）+ file-version 快门（version 未变跳过 644 次网络下载）+ orphan 定向清理（基线=SoT，全 fetch 成功后才删，含误删全库熔断）+ index.json 幂等（带 figmaFileVersion）**。brainstorm 实证 (b) per-node version 在 Professional plan 不存在 / (c) 几何 hash 有静默漏改风险 → owner 拍板 (a)+快门。`api.mjs` 加 `getFileMeta(?depth=1)`、`icon-artifacts.mjs` 导出 `writeJsonIdempotent`。中断安全：SIGINT mid-fetch 后 svg 仍 644（旧码会清空）。gate：vitest 219 / vue-tsc 0 / audit:figma-vs-sot 644 全零 / e2e Run1 written0-unchanged644 + Run2 快门 4:54→1.4s。plan owner direct（Infrastructure path B，brainstorm 拍板后写）|
| **Notification §4 code 同步收尾（status→form+type+closable，breaking major）** | 2026-06-10 | `a9423de4` | **0（A=0 维持）** | **0** | 前序 session 完成 §4.1-4.5 主体；本次收尾：①drift 假阳根因实证 = **全 32 条** expected 误取 Title 节点（pickup 称 7 条 alert 不准）→ generator `textNodeNamePattern` 按名取 "↳ Description"；②extract 实证修 2 真 drift：pop confirm desc `--text-body`（Figma 绑主文字色）+ gap `--sp-l` 24；③GRID set 把 32 cell 变 FILL 丢 Module-Width 绑定 → `fillSizingIsGridArtifact` 宽度 expected 置 null（自愈：cell 重绑 FIXED 后恢复校验），designer 待办挂 BRIDGE-DESIGN-REVIEW；④owner 需求 demo 真实定位：Notification/PromptMessage 页 Teleport（dialog/alert/pop confirm=居中模态+遮罩、slide=右上、prompt=顶部）；⑤affordances/navigation/52 视觉 baseline 同步。全 6 gate 绿（drift-gate A=0 / 926） |
| **system-design-review 修复批 1-4（23/23 finding 全清）** | 2026-06-10 | `15957998`+`3086c9ca`+`c23537a1`+`9e557ebc` | **0（infra/docs 非 A）** | **0** | 元层审计（29-agent fan-out + 对抗 verify）9P1/9P2/5INFO 同日全处理：批1 enforcement 真相对齐（D/F/G pre-commit gate / ci.yml master-push CI / 共享豁免单 / C4 backlog 计数核对 / Enforcement 层级列 / Chart 红 master hotfix）；批2 契约补强（三视图 views 双向校验+债务显式 / a11y 非阻塞 report / changeset tag-time guard）；批3 onboarding 两层重构（L-core 全读 40KB + L-ref 触发深读，链路单一 SoT）；批4 顺路（lint:ds dogfood 16 闸 / mockup 收尾接 conformance 总闸 / sync 中断纪律 / `pnpm release` 一键脚本）。方法论：每 gate 挂前 exit 0 自检 + 正负双向测试；master 红（Chart hex）被全链实跑暴露 = P1-02 无 push CI 的活证据 |
| **v0.9.0 release ship ✅ + backlog 全量 reconciliation** | 2026-06-11 | `8a1a7de7` + tag `v0.9.0`；reconciliation `1b7adc45` | **0（release 非 A）** | **0** | 3 minor：⭐**ship-token-css**（`src/index.ts` 从不 import `variables.css` → `dist/style.css` 零 token 定义，**潜伏 v0.2–v0.8 六版本 consumer unstyled，根因=reference adoption 只测 ESLint 不真渲染**）/ TopBar Digital Numbers 时钟字体（self-host 原版）/ showMenu default true→false 对齐 Figma `4771:7173`。**发版前 consumer 真渲染双路径 9/9 PASS** 闭盲区（tarball+alias + 真实 fresh-install 文档路径，Playwright 双主题断言 token/主题/@font-face/组件渲染，截图 `_reports/consumer-verify-0.9.0-*`）。本地 16 闸+render-gate 926 entries A=0 → CI publish 27330427930 success → Packages API `0.9.0` created 07:21:09Z。**并行 backlog 全量 reconciliation**：35 条 ###→1 条真待办（794→~40 行，每条 code/audit/A=0/live-Figma 实证）+ design-review-queue.md 拆分（6 迁入全 live 复核→3 删 3 留）+ 2 流程 memory（外部声明搬动前必 live 重验 / reconcile 主动判定）。复盘 [`2026-06-11-backlog-reconciliation-v0.9.0-consumer-verify.md`](./2026-06-11-backlog-reconciliation-v0.9.0-consumer-verify.md)。生态注：vue@3.5.36 npm latest 官方损坏（workspace:* 未替换），consumer fresh install 钉 3.5.35 |
| **v0.8.0 release ship ✅** | 2026-06-11 | `5f772658` + tag `v0.8.0` | **0（release 非 A）** | **0** | 8 changeset 聚合（**BREAKING Notification status→form+type+closable 按 0.x 约定走 minor**，发版前抓到原 major 会误跳 1.0.0 → 改 minor + body 注明；G1-G4 enforcement / PopupBox·Button·Select 保真 / Select Teleport / claude-design-bundle）。v0.7.0 教训预防全生效：tag 前同步 STATUS 版本号 + 本地预跑 16 闸/render-gate → **首推 tag CI 一次过** → Packages API 实物验证 `0.8.0` created 2026-06-11T01:54:01Z。顺手：CI actions 升 checkout@v5/setup-node@v5/pnpm@v4（GitHub 2026-06-16 强制 Node 24 注解） |
| **CANONICAL-022 Input opacity 收口 + 同型 sweep ✅（全闭环）** | 2026-06-05 | (本 commit) | **0（A-neutral）** | **0** | 删 `Input.vue:.tvu-input:disabled opacity:0.4`。live Figma 实证 disabled = solid token opacity 1（line `1818:8198` grey-8 #595959 / filled `1431:54613` bg #353535+text #595959；底层 token `--input-disabled-border`/`--text-disabled`/`--input-filled-bg` 已全对齐 → opacity 是多余淡化）。verifier 读 `color` 不读 opacity 故 A 不动（仍 0）；纯视觉保真。CANONICAL-022 全闭环（Select 端 Wave 1a `203edc61` 早删）。**同型 opacity sweep（live Figma 逐个）= FIGMA_AS_SOURCE_OF_TRUTH 纪律范例**：① **Switch** `.switch--live.switch--disabled{opacity:.4}` 节点 `337:18248` className 含 `opacity-40` → **Figma 真用 40%，code 匹配，保留**（反证「opacity 永远是 code 偷懒」；盲删会回归）② **InputNumber/Slider/Rating** Figma 无 disabled 变体 → 无 SoT 证伪 → 保留 + 挂 BRIDGE-DESIGN-REVIEW ③ legacy `components/Select/Select.vue` 非 canonical/未导出 → out of scope。**唯 Input 是真 bug**。render-verification 908/PASS · drift-gate A_TRUE_DRIFT=0 · vue-tsc 0 · vitest 198。owner directed + ack。 |

**新分母累计**：295 →（report classify）248；**drift:summary classify 247 → 87（INFRA-F39 step 1-3 -160）→ 84（select/dropdown discovery -3）**。INFRA-F39 把 FormItem 全幻影（94）清零 + Table 拆出 54 幻影/12 真 drift + select/dropdown 10 全定性为非 code drift，是 EXTRACT-008 composite / `colorToHex()` color(srgb) 之后第三个 verifier-fidelity 修（"verifier 量错元素 / 读不懂正确渲染 = 假阳；但也会反过来掩盖真 drift"，FIGMA_AS_SOURCE_OF_TRUTH deterministic 验证落地）。

**余量分轨**：**total A = 0** —— Input box (line+filled) + Select box (line+filled) 对 Figma **全 1:1 对齐**。

> ✅ **input overlay 77 全清**（EXTRACT-007 递归几何 + textInset + InputBoxBase 几何修）。✅ **disable 文本色全清**（CANONICAL-032：owner Figma republish + code `--text-tips`→`--text-disabled`，含 `1858:47024` enable=off text-count）。✅ **cursor"\|"假阳全清**（EXTRACT-009：剥离光标段读占位色）。✅ select/input 多数 textFillHex 随 owner republish 自然清。**drift:summary 现是可信 oracle 且读 0**。
> **trigger-O 连环纠错实录（owner 三次挑战驱动）**：① skip slot → 递归 stop-at-instance（slot 内容深一层可解析）；② 信提取数据 → 必 live Figma（extract 读光标/隐藏节点错值）；③ size-based hygiene → state-based → cursor 模拟（"两个色值"根因）。每次都把结论改对 —— FIGMA_AS_SOURCE_OF_TRUTH "不靠提取后数据反推" 的最强实证。

**Wrap-up 协议补丁**：今后每个 alignment cleanup sprint commit 后，在本表追加一行（commit / Δ / 余 / 备注），用 **fresh verifier run** 实测不估值。

### 待完成（按版本归类）

| ID | 内容摘要 | 版本 | 估时 | 备注 |
|---|---|---|---|---|
| ~~Phase 6.8~~ ✅ | Button canonical 完成迁移（canonicalTheme axis；commit 136ddc4b 2026-05-18）| v0.5.0 | ~3h 实跑 vs 历史估 ~20-30h | 8 主 sets / 3,200 variants |
| ~~EXTRACT-006~~ ✅ | Figma extract pipeline 抽 Text / Effect / Fill / Grid Styles | v0.5.0 | ~30min 实跑 vs 估 6-10h | infra |
| ~~CANONICAL-007~~ ✅ | Pagination buttons → DS Button | v0.5.0 | ~30min 实跑 vs 估 ~2h | commit 63a9cdaf |

---

## 轨道 B — 设计流程文档

### 已完成

| 里程碑 | 内容摘要 | 完成日期 | 耗时估算 |
|---|---|---|---|
| M1–M16 初版 mockup-conventions | 基础 mockup 规则（Phase 0-3 / token / component / 布局 / 验收）| 2026-04-28 ~ 2026-05-09 | ~3-4 sessions |
| M21 增量复用规则 | 已建立产品的增量优先复用 local（US-3 scope），补 mockup-conventions + code-conventions 决策空白 | 2026-05-11 | ~1h |
| M22 User Design Intent Acknowledgment | 新增 Pre-Phase 0 前置 Gate（M22），US-1/2/3 全触发，防止"跳过 design ask" | 2026-05-11 | ~1h |
| M14 / M21 扩展（trifecta）| M14 范围扩到任何参考输入 + "高频被误抄字段"表；M21 加 sibling visual contract 6 维度 mandatory probe | 2026-05-11 | ~2h |
| Design Process Architecture 重构（Steps 1-5）| mockup-conventions.md 拆 3 层（design-process.md / domain-tvu.md / figma-technical-reference.md）；M11-13 合并；新建 design-discovery skill / design-walkthrough / persona-simulation agent | 2026-05-12 | ~4-5h |
| Design QA Loop + Agent 优化 | F1/F2 dogfood on SaaS Dashboard；design-qa-loop agent（两阶段 QA loop + auto-fix + Dev Handoff Gate）；domain-tvu.md 加默认 persona 表（CFO/PM/SRE）| 2026-05-12 | ~3h |
| M17-M20 迁出为 figma-technical-reference | 4 条 Figma API quirk（canvas position / frame traversal / rounded numbers / strokeEndCap 限制）从 mockup-conventions 迁出独立 | 2026-05-12 | ~1h（含架构决策）|
| Design Process Rules 整理收尾（缺口 A/B/C）| mockup-conventions.md 676→191 行（thin out 完成）；AGENTS.md §Mockup 链路拆 §7-10；STATUS.md 必读链路更新 | 2026-05-13 | ~2h |
| M23 UX 交付注释格式（双语标注）| 多状态流程图 5 层结构 / 主题无关配色 / 双语布局决策树（Layout A-右/A-下/B）/ ZH 弱化 opacity 0.45 / 验证策略（probe 优先）| 2026-05-12 ~ 05-13 | ~4h |
| figma-technical-reference Q5/Q6 | Q5：GROUP vs FRAME canvas 名称标签差异；Q6：VECTOR 不支持 strokeEndCap | 2026-05-13 | ~30min |
| 执行优先 review 执行器 comprehensive + scoped-load 激活 | 否决 rule-registry（执行优先 reframe）→ ① design-walkthrough 三轴（一致性 D6/D9/D13 §5.7 + 视觉质量 B1/B2/B5/B6/B7 §5.8 + 协议 step8 invariant）+ visual-quality-dimensions 尺子；② scoped-load 激活（修 4 处「Read 全文」矛盾 + `audit:rule-load-map` 覆盖 gate + 补 20 条未路由 rule + pre-commit）；③ D16 `audit-mockup-binding-fidelity` gate（轨道 C，补 M49.1 脚本 enforcement）+ M-COLOR §C5 语义优先；④ meta-rules 反模式 #6 enumerate-from-catalog + #7 declared≠consumed | 2026-06-12 | ~1 session（commit `e7deacd5`/`5c84e051`）|

### 待完成

| 里程碑 | 内容摘要 | 估时 | 优先级 |
|---|---|---|---|
| BRIDGE-MOCKUP-001/002/003/005 | TVU 库补 4 个 dark-mode Msg-bg token / Arrow sorting variants / Pill promotion / 12 chart-color tokens — **设计师 owner** | TBD | Medium |
| M-next（TBD）| 下一个从实战中暴露的规则缺口 | — | 按需 |

---

## 轨道 C — 自动化路线

> **触发查看条件**：任何 "为什么 / 该不该 / 何时 ship Tier X" 讨论。
> **源自** 2026-05-13 session 9 "TVU 设计规范 自动化 vs 文本规则 评估"。
>
> **核心论点**：当前 ratio 是 "code 端 9 个 L5 gate / mockup 端 0 个 L3+ gate"——直接违反 [`meta-rules.md`](../../meta-rules.md) trigger K 的 "客观可测规则必须 L3+" 自我要求。三 Tier 路线补齐此缺口。

### 已完成

| ID | 内容摘要 | 完成日期 | 耗时估算 | 版本 |
|---|---|---|---|---|
| Tier 1-A Sprint 1 | `axis-implementation-map.md` 拆为 `axis-implementation-map.json` + JSON Schema，保留 narrative MD | 2026-05-14 | ~1 sprint | v0.3.0 prep |
| Tier 1-A Sprint 2 | `prop-aliases.md` 拆为 `prop-aliases.json` + JSON Schema，保留 narrative MD | 2026-05-14 | ~1 sprint | v0.3.0 prep |
| Tier 1-A Sprint 3 | `divergences.md` 拆为 `divergences-decisions.json` + JSON Schema，保留 narrative MD | 2026-05-14 | ~1 sprint | v0.3.0 prep |
| Tier 1-A Sprint 4 | 新增 `audit:translation-completeness` L5 strict gate + allowlist + release pipeline 10th gate | 2026-05-14 | ~1 sprint | v0.3.0 prep |
| SoT 分片 (affordance) | `affordance-categories.json`（14.8k 行）拆为目录 `affordance-categories/`（28 分片 by Figma 文件夹 + `_index.json`）+ 共享 loader `figma-sync/lib/affordance-sot.mjs`（load 重组 / write 幂等 re-shard）；3 消费方（audit-figma-vs-sot / extract-icon-worklist / phase-c-merge）迁移；audit 全绿 644/644 + round-trip byte-identical | 2026-06-01 | ~1 session | commit `f1e63e3b` |

### Tier 1 — 项目目标对齐的核心自动化

| ID | 内容 | 版本 | 估时 | 落地能力 | unblock |
|---|---|---|---|---|---|
| ~~Tier 1-A~~ ✅ | `translation/*` JSON + JSON Schema + `audit:translation-completeness` L5 gate | v0.3.0 prep | completed 2026-05-14 | 能力 5 溯源 | T4b AI manifest / Phase 6.6/6.7/6.8 / BRIDGE-005 / Tier 1-B / Tier 1-C |
| **Tier 1-B** | `audit:mockup-conformance.mjs`（library key 验证 / 颜色 token bound / 字体 token / M1-M5 命名）| v0.5.0 | ~6-10h | **能力 4（最大缺口）** | mockup-side 第一个 L3+ gate；design-walkthrough skill 客观项分离 |
| **Tier 1-C** | `@nancyzeng0210/eslint-plugin-tvu-design-system` consumer-side lint 包 | v0.6.0 | ~2-3 周 | 能力 1 加固 | 兄弟产品 `extends: ['plugin:tvu-design-system/recommended']` 一行接入 |

### Tier 2 — 降低 AI drift / 半机械化（**顺路做**，不占主线）

| ID | 内容 | 版本（顺路）| 估时 |
|---|---|---|---|
| ~~Tier 2-D~~ ✅ | `scripts/new-backlog.mjs` 自动 ID generator（grep + 1）| v0.4.0 (commit 50ff23d0) | ~20min vs 估 2h |
| ~~Tier 2-E~~ ✅ | `scripts/figma-url-to-canonical.mjs` lookup CLI（替代 AI 读 catalog）| v0.5.0 (2026-05-18) | ~30min vs 估 ~4-6h |
| ~~Tier 2-F~~ ✅ | `scripts/lint-skills.mjs` 验各 skill md 起手依赖文档存在 | v0.5.0 (2026-05-18) | ~30min vs 估 ~3-5h |
| **Tier 2-G** | STATUS.md 一致性 lint（版本号 / active 项数自动核）| v0.6.0 顺路 | ~2-3h |

### Tier 3 — 行业标配但 ROI 边际

| ID | 内容 | 版本 | 估时 |
|---|---|---|---|
| **Tier 3-H** | axe-core a11y audit（docs site pages 跑）| v1.0.0 | ~1 周 |
| **Tier 3-I** | Style Dictionary 迁移（defer 到多平台时）| post-1.0 | — |

### 不应自动化的（**继续保持文本规则**）

- 设计直觉判断（Tooltip vs Popover）— `persona-simulation` skill 合适
- Business persona 模拟（CFO/PM/SRE 视角）— LLM 强项
- Retrospect 触发分级判断（已 codified in STATUS.md）
- 新命名争议拍板 — `divergences.md` SoT + 用户决策
- Meta-rules trigger A/E/H/L（用户疲劳信号 / 不投射时间感 / ambiguity → ask）— AI 自我约束本质

---

## 收尾前同步协议

每次 session wrap-up 前，在本文件补入：

```
| <ID> | <内容摘要（一句话）> | <YYYY-MM-DD> | <~Xh 或 ~Xmin> | <版本（如适用）> |
```

然后 git commit 到 session wrap-up commit 里。

---

## 大图：剩余工作量估算（截至 2026-05-14）

| 版本 | 主要内容 | 估时 | 落地能力 |
|---|---|---|---|
| ~~v0.2.0~~ | Chart + audit:published-vs-code 升 strict + Playwright baseline + husky v1 + **INFRA-F30 idempotent writes** | ✅ shipped 2026-05-13 (~2h) | 能力 1/2 |
| ~~v0.3.0~~ | Tier 1-A 4 sprints + SoT drift cleanup + audit dim 6 + BRIDGE-005 + Phase 6.4 (+ Phase 6.3 resolved) | ✅ shipped 2026-05-14 (~8h 实跑 vs 估 1-2 周) | **能力 5 schema 化 + 能力 2 prop 完整暴露** |
| ~~v0.4.0~~ | Phase 6.6a/6.6b dual-form + Phase 6.7 SoT reconciliation (B path, 0 code change) + Tier 2-D (+ all non-breaking) | ✅ shipped 2026-05-14 (~4h 实跑 vs 估 12-18h) | 能力 1/2 API 统一 + AI from Figma URL 不撞同名异义 |
| ~~v0.5.0~~ ✅ | Phase 6.8 + Tier 2-E/F + CANONICAL-007 + EXTRACT-006 + INFRA-F32（Tier 1-B unblocked → v0.6.0）| shipped 2026-05-18 (~6h 实跑 incl 2 CI hotfix) | 能力 1/2 Button 完整 8-axis + 能力 5 Styles pipeline + 能力 4 unblock |
| **v0.6.0** | **Tier 1-C** ESLint plugin + Tier 1-B (post INFRA-F32)（+ Tier 2-G 顺路）| ~3-4 周 | 能力 1 consumer + 能力 4 mockup audit |
| **v1.0.0** | Tier 3-H axe-core + Phase 8（如 Figma plan 升级）+ API 锁定 | ~2-3 周 | **5 能力全交付** |
| 设计师 owner | BRIDGE-MOCKUP-001/002/003/005 + BRIDGE-DESIGN-REVIEW | 设计师推 | 加固能力 4 mockup-side |
| Deferred | T1c / T4 / Phase 8（需 Figma Org plan）| 等阻塞解 | 能力 3（code → figma）|

**总线性时长（连续做）：~3-4 个月；v0.3 剩余已由 Tier 1-A 完成后收窄到 ~2-3 天。**

**项目目标 5 能力 ship 节点**：
- v0.3.0：能力 5 溯源 schema 化落地
- v0.5.0：能力 4 第一个 L3+ gate 落地（4/5 能力可用）
- v1.0.0：5 能力全交付（能力 3 取决于 Figma plan 升级）

**结论**（截至 2026-05-13 session 9 收尾）：v0.2.0 全部 design system 改动已就位（CANONICAL-011 done + BRIDGE-MOCKUP-004 tracker close + 9 strict audit gates），ready to publish。后续 v0.3 → v1.0 路线按本文件 "Release 排期" 段执行；**任何路线偏离前必须先过本文件 "排期原则" 自检清单**。
