---
"@ux-team/tvu-design-system": patch
---

`connector` 闸（§M23.6 / §C4）两处改动，同一个病灶的两半：**C4 圆点形态检查此前结构上不可能执行，而且不说**。

**G2 · `dot-shape` 降级自陈（诚实那一半，先落）** —— `classifyConnectorViolations()` 原来只有两支：`if (ell)` 跑检查、`else if (palette.length === 0)` 记一条 `color` skip。**连线是散落兄弟节点时两支都不进** —— `ell` 为 `undefined` 而 `palette.length === 1`（selfNode）⇒ 圆点 fill/border 检查**不执行、也不留 skipped 痕迹**，闸照印「✅ 可验证项全部合规」。新增第三支，记 `check: 'dot-shape'`。⛔ **刻意不升成 violation**：散落 schema 是既有事实，false-flag 违反本文件头「绝不 false-flag 报违例」的降级纪律。

**G1 · `parts{}` 水合（能力那一半）** —— `buildConnectorInput()` 的节点解析从两级改三级：`GROUP` → **`parts{}`** → 裸节点 `selfNode`。reconnect_map v3 每条 arrow 早就带 `parts: {vector, dot, arrowhead, label}`，**闸从来不读这个字段**，只认 `id` 指向的是不是 GROUP。

⚠️ **为什么不是让设计侧把节点包成 GROUP** —— 那个方案实测过、**净负、已否决**（RPSV3-134 design-record §17）：包 GROUP 会让连线首次进入 `overlap` 闸的 `BLOCK_TYPES` 比较集，而 L 形折线的包围盒横跨两个产品帧 ⇒ **5 条假阳性**（含「GROUP 与它自己的条件标签相交」）；且 `figma.group()` 把成员塌缩到单一 z 位置（实测索引 14/15/26 → 33），渲染顺序确实变了。本水合拿到同样的检查，**Figma 侧一个节点都不用动**。

⚠️ **`parts.label` 刻意一并纳入**：§C4 Acceptance 第 2 条逐字把「条件标签」列进禁 brand green 的对象集，此前它不在闸的对象集里 —— 顺带补齐。⛔ **但这只覆盖标签的颜色**；§M23.6 (D) 的标签**附着几何**仍无机器兜底、仍须人跑，条文已就地订正（原文写「reconnect map schema 没有 label 字段」是**错的** —— 字段一直在，是闸没读）。

**验证（不是目测）**：

- 单测 `tests/mockup-connector.test.ts` 13 passed，其中 5 条新增，**先写先红**：`dot-shape` skip 断言 + `parts{}` 水合 + 「水合后红圆点真被抓」 + 两条回归护栏（有 ELLIPSE 时不记 skip · `parts` 解析不到时回退 selfNode · GROUP 仍优先）。
- **真文件阴性对照**（`pUE6UakxCpU6Dw9vUCtBBe`，5 条 connector）：改前 `--json` 的 `color: []` 且无任何 color/dot-shape skip —— 与「跑了并通过」**输出完全相同、无法区分**。把 5 个起点圆点填色临时改红后重跑 ⇒ **5/5 全部命中 `dot fill not white`、exit=1**，逐 paint 复原后回到 `color: []` 且 `unverified=5`（全是 `orthogonal`，`dot-shape` 为 0）⇒ 5 条**都真跑了**。改前同一对照只有被临时包成 GROUP 的那 1 条会红。
- 全量 3039 passed / 14 skipped，`rule-inventory` / `rule-number-collision` / `rule-load-map` / `stale-anchors` / `gate-mount-declaration` 全 exit 0（头注释新增 6 行后挂载声明仍在 45 行窗口内、`covers-acceptance` 仍在 60 行窗口内，已实核）。
