# Next Session Pickup — INFRA-F41 Task 5 续 (清剩 48 盲区，纯机械套已证范式)

> 生成: 2026-06-08 session 收尾。本 session gap 56→48，机制/范式全部跑通 shipped。
> 起手第一句: `按 docs/internal/_plans/next-session-pickup-2026-06-08-infra-f41-task5-continue.md 继续 INFRA-F41 Task 5`

---

## 0. 起手必读
6-step onboarding（FIGMA_AS_SOURCE_OF_TRUTH → STATUS → PROJECT_GOAL → tracker → 本 pickup → AGENTS §1-10 → backlog INFRA-F41 entry）。`git log --oneline -10` + `git status`（多 session 并发，dirty 文件先假设别 session 在动 [[user_parallel-sessions]]；当前已知别 session 在动 `.claude/settings.json` / `skills/shared-vocab-rules/vocabulary.md` / `docs/internal/design-process.md` / `render-drift-summary.md` / `tokenized-diff-report.json` —— 不碰不提交）。

## 0.5. ⏩ 最新进展（2026-06-08 再续 part3，gap 48→31，8 commits + 双 infra 治本）
**part3 新增**：`816e4bf3` **audit-fidelity 治本 gap 40→31** —— `audit:render-coverage-gaps` 新增 BEM-modifier credit：修饰符 selector 的 base ∈ rootTargetSelector **且**设 bg/border → 算 covered（其 base 元素 per-variant 已验 rootFillHex/rootBorderHex）。FP guard `BG_BORDER_PROPS` 排除 color-only 修饰符（`.cb--disabled`/`.radio--disabled` 留 floor，root 不验 text color）。清 9 false-gap（TabItem 5 + TabList 1 + Notification 2 + tvu-input--filled 1，全部交叉核对 report rootFillHex PASS 确认真覆盖）。**TabItem/Notification/TabList filled 的 bg 本就被 verifier 验证，只是 audit 漏 credit；不是新增覆盖、是修正测量。**

### part2（gap 48→40，7 commits + child-theme-resolution 治本）
**已 ship 组件**（scoped Path B 一组件一 commit，全程 gate A=0/node mismatch=0/tokenized-diff 0/vitest 219/vue-tsc 0）：
- `fc71c68c` **PopupBox 3→2** `.popup-box__close`→1869:68902(#9e9e9e=--icon-default)。
- `6f00de4f` **StepItem 3→1** + **治本 child-node theme-resolution**：`normalize-component-tokens` 递归 `enrichChildren` + `audit-tokenized-diff` 对称 `stripTokenizedChildren`。**无-theme-axis 组件的 theme-aware 子色现正确 theme-resolve，后续组件直接受益**。注解 `.step-line`→4943:7246 + `.step-marker--number`→4943:7269。
- `80e159a5` **Progress 2→1** `.progress__fill`→4915:7196(brand)；track 候选 drift。
- `af0e7d59` **Switch 1→0** `.switch-thumb`→337:18011(#ffffff)。
- `d7c4a4ce` **Table 2→1** `.tbl-cell`(`<th>`)→header text 4265:16134(--text-tips，双 theme PASS)。
- `e613743e` **Badge 1→0** 补 `rootTargetSelector: '.canonical-badge'`（badge bg/border 走 rootFillHex/rootBorderHex，80 check 全 PASS）。
- `e92c91fe` **FormItem 1→0** `.form-item__message`→error message 1923:49076(--red)。

**剩 30 盲区——分类（part4 经 owner「Figma 唯一真源」纠正，别再当 floor/延后糊弄；以 Figma 为真去查去改）**：
1. **真 floor（无 Figma 源，唯一合法 floor）**：`.step-desc`（组件无 description 节点）、`.pg-ellipsis`（Figma 只画 Page/1-5 无省略号）、`.tbl`（Figma "Table"=单元格、无表格级框）、`.popup-overlay`（运行时遮罩、非弹窗组件）、`.popup-box__body`（透明 slot 容器）、`.tooltip-anchor`（harness 占位）。这些 Figma 没画 → 无真源可比。
2. ✅ **audit-fidelity 治本已完成**（`816e4bf3`）：BEM-modifier credit，TabItem 5 / TabList 1 / Notification 2 / tvu-input--filled 1 清除。
3. **🔑 EXTRACT-icon-token-fidelity 机制 ✅ shipped（`575eb386`）+ icon 族推进中**：根因=icon fill 绑 published-library(remote) 变量、Pro plan 离线拿不到名 → 翻译层 `figma-sync/remote-variable-aliases.json`（live Figma seed remote-ID→cssVar）+ normalize 在 hex-fallback 前查。**已闭合**：Breadcrumb separator（remote Icon/Default，`575eb386`）、InputNumber +/-（local Icon/Default，`3965e729`）。**关键认知**：icon 族多是**状态依赖**——default 态基本绑 Icon/Default（可注解验证），focus/active 才变色。**剩余推进法**：逐组件 extract→看 icon 节点 default-态绑定→若 Icon/Default(local v=2611:57617，或 remote→入 alias map) 则注解 default-态 node、verifier 双 theme PASS；若真·固定 raw-grey（无状态变化，如 PromptMessage close grey-6）则 binding-hygiene、不注解挂 BRIDGE-DESIGN-REVIEW。**待做**：InputBox `.input-feature-icon`/`.input-clear-icon`×6（default 态 search=--icon-default、clear=--icon-default，code --text-tips/--icon-default 同值可匹配；**需先确认 harness 渲染 default 态 feature/clear icon**——它们条件渲染，可能要改 mapCodeProps 像 breadcrumb showSeparator 那样强制渲染）、SelectBox `.select-clear`×3（查 default 态绑定）、PromptMessage close（grey-6 固定→大概率 hygiene）。详见 backlog。
4. ✅ **候选 drift——owner 定调 Figma 为真，已直接改 code 2 个**：Progress track（`2f3c3a1a` --line-deep→--bg-layer3，supersede CANONICAL-004）+ Breadcrumb separator（`69e371b2` --text-2→--icon-default）。**模式**：live Figma `get_variable_defs` 确认真绑定→改 code 对齐（不盲信 extract、不需 owner 二次确认，Figma 即真源）。
5. **floor 但可治（非永久，要么补 extract 要么补 verifier 能力）**：`.cb-icon`/`.radio-dot`/`.pill__dot`×2/`.rating__star`（多色 glyph 内部 mark——下钻 extract 取内部 vector 节点色）、`.tooltip-arrow`（旋转 2 边 border——改 verifier 读单边 border-color 或只比 fill）、`.cb--disabled`/`.radio--disabled`（disabled 文字色——对 Figma disabled 变体的 label 验，或补 textTargetSelector）。
6. **需补 manifest 设施**：`.dropdown-select`（下拉面板，Figma 容器组件 `drop_down_list_select__1446_116439` **存在**，补一条 rootTargetSelector=`.dropdown-select` 的 config 即可，类似 Badge）；`.tvu-input-count`（字数计数，查 Figma input 有无 count 节点）；Tab `.tab--filled`（用 raw `--color-grey-12`、应按 Figma Tab List 容器取语义色——同 raw-vs-semantic）。

## 1. 本 session（2026-06-08 首版）已 ship（commits）
- `f94054b7` dropdown arrow → `--text-body`（4/4 变体 live Figma 实证真全局 drift，按 Figma 改 code）
- `8aaf9df2` **FormItem composition 重构（CANONICAL-033）**：base 变 Label+Content-slot+message 外壳，canonical 默认 slot 复用真 InputBoxFilled/SelectBoxFilled/Radio/CheckBox/Switch（不再手搓假占位）。gap 6→1。
- `c70dccb4` **verifier node-check 选属性改「代码侧 bg-transparency」**（治本，弃了 a9673cd7 的 fillRole-by-Figma-type 启发式——radio 圆是 VECTOR 但渲染成 background，type 测不准）+ Radio circle 注解。
- `ac669bd1` Notification close× 注解 + **修 audit:render-coverage-gaps 嵌套 `<template v-if>` 抽取 bug**。
- CheckBox box 注解（含在 a9673cd7/c70dccb4）。
- **全程 gate A_TRUE_DRIFT=0 / full-tree node mismatch=0 / vitest 219 / vue-tsc 0**。

## 2. ⚠️ 动手纪律（不可破）
- **稳健性/正确性第一，复杂度·成本·diff 大小不进排序**（用户硬规则 [[feedback_lead-with-robust-not-cheapest]]）——方案选型 + 方案内部子机制都适用；不要先抛最省事解、被追问才给稳健解。
- **FP=0 是命根**。coverage-gap（DOM 找不到 node）= informational 永不 fail；只有注解过的 node mismatch 才闸。
- **FIGMA_AS_SOURCE_OF_TRUTH**：DOM→node-id 映射用 live Figma（`get_design_context` 看结构 / `get_variable_defs` 确认色）。fileKey = `YbsPRUVmNdsbN40NNwh1Gn`。
- **注解承载该色的 LEAF 元素**（不是 wrapper）——verifier 按该元素 computed `backgroundColor` 是否非透明自动选 bg vs color。
- Owner 直 commit master；commit 默认含 push（origin=Gitea）。注解=DOM-attr-only → `VISUAL_COMMIT_APPROVED=1` + commit body 注明零视觉 delta（composition 重构是真视觉改动，照样 VISUAL_COMMIT_APPROVED=1 但说明）。
- 一组件一 commit，中间停下复审。

## 3. 三类处理范式（已证，照搬）
| gap 类型 | 判定 | 做法 |
|---|---|---|
| **单色 icon 叶子**（close-×/arrow/separator/clear）| 元素 bg 透明、色走 currentColor | 注解该元素 → glyph instance node-id；verifier 比 color。范式: Notification `.notif__close`→`1392:1817`、select arrow |
| **box-like glyph 容器 / frame-bg**（checkbox box/radio circle/overlay/track/cell）| 元素有非透明 bg | 注解该元素 → glyph instance（lifted 容器色）或 frame node；verifier 自动比 backgroundColor。范式: CheckBox `.cb-box`→`4600:14666`、Radio `.radio-circle`→`1548:36921` |
| **手搓假占位**（该复用现成组件却自画）| code 自画但 Figma 是真 instance | **composition 重构**复用真 canonical 子组件（非注解）。范式: FormItem CANONICAL-033 |

**documented floor（不强清，写注释说明）**：① 多色 glyph 内部 mark（`.cb-icon` checkmark / `.radio-dot` / `.pill__dot`）——在 multi-color glyph instance 内部，stop-at-instance 只 lift 一个容器色，单独验不了。② 根 state-modifier（`.cb--disabled`/`.radio--disabled`/`.notif--dark`/`.notif--light`）低信号。③ 装饰 CSS。

## 4. 每组件循环（Path B scoped，无并行 icon session 时也可 full sync）
1. `grep -rln '<selector>' src/` 找承载文件；`ls figma-data/normalized/components-tokenized | grep <comp>` 拿 set node-id。
2. `node figma-sync/extract.mjs --component-node-id=<setNodeId>` → `node figma-sync/normalize-component-tokens.mjs --component-file=<file>.json`（scoped，零全库 churn）。
3. live Figma `get_design_context` 代表变体 → 找 leaf 的 node-id；`get_variable_defs` 确认 expected 色。确认 leaf 在 tokenized 被捕获（`grep <nodeId>`）。
4. `.vue` 给承载色的 leaf 元素加 `data-figma-node-id="<id>"`（+ 注释说明代表变体 + floor）。
5. `pnpm test:render-verification`（~1.5min）→ 查该 entry nodeChecks status=pass（非 mismatch）。**若 mismatch → live Figma 双确认：真 drift 走改 code / BRIDGE-DESIGN-REVIEW，不盲改凑 pass**。
6. `pnpm audit:render-drift-gate`（A 与 mismatch 守 0）+ `pnpm audit:render-coverage-gaps`（该组件 gap↓）+ `pnpm test`（vitest）+ `npx vue-tsc --noEmit`。
7. commit（`VISUAL_COMMIT_APPROVED=1`）+ push + 复审 → 下一组件。

## 5. 剩 48 盲区按范式预分类（gap-count 顺序，`docs/internal/render-coverage-gaps.md` 是 SoT）
- **frame-bg / 容器**：PopupBox `.popup-overlay`/`.popup-box__body`、Progress `.progress__track`/`.progress__fill`、Table `.tbl`/`.tbl-cell`、InputBoxBase `.tvu-input--filled`、Tab `.tab--filled`、TabList `.tab-list--filled`、TabItem 5 个 active/normal 变体、Badge `.canonical-badge`、Switch `.switch-thumb`。
- **单色 icon 叶子**：PopupBox `.popup-box__close`、PromptMessage `.prompt-message__close`、BreadcrumbItem `.breadcrumb-item__separator`、Tooltip `.tooltip-arrow`、InputBoxBase/Filled/Line `.input-feature-icon`/`.input-clear-icon`、SelectBox `.select-clear`、InputNumber `.inputnum-btn`、Pagination `.pg-ellipsis`。
- **floor 候选**（先判，多半不强清）：CheckBox `.cb-icon`/`.cb--disabled`、Radio `.radio-dot`/`.radio--disabled`、Notification `.notif--dark`/`.notif--light`、Pill `.pill__dot`、Rating `.rating__star`、StepItem `.step-*`（逐个判）。
- **逐个判 leaf vs floor vs 重构**：StepItem、Tooltip `.tooltip-anchor`、DropDownListSelect `.dropdown-select`、SelectBoxBase `.dropdown-select`。
- **Stop floor**：装饰/状态变体 selector 可留 documented allowlist 不强清到 0。

## 6. 不要做
- ❌ 注解 wrapper（要注承载色的 leaf）；❌ 照 mismatch 盲改 code；❌ 注解多色 glyph 内部 mark（验不了，floor）；❌ 抢并行 session 文件；❌ 默认先抛最省事解。
