---
id: v4-1646-lcd-wifi-other
title: WiFi Other (Hidden SSID) on LCD (V4-1646)
doc_type: handoff
status: in-dev
target_release: "8.4"
last_updated: 2026-09-10
sources:
  - { type: jira, ref: "V4-1646", url: "https://tvunetworks.atlassian.net/browse/V4-1646" }
  - { type: jira, ref: "V4-1535（LCD 虚拟键盘先例）", url: "https://tvunetworks.atlassian.net/browse/V4-1535" }
  - { type: jira, ref: "V4-1865（第二内置 WiFi 模块 · Config-T）", url: "https://tvunetworks.atlassian.net/browse/V4-1865" }
  - { type: jira, ref: "V4-2318（同上 · LCD）", url: "https://tvunetworks.atlassian.net/browse/V4-2318" }
  - { type: slack, ref: "tvu-support-global-requests 2026-07-10（客户诉求 + 8.4 承诺）", url: "https://tvunetworks.slack.com/archives/C014Y5SA4VA/p1783673699149789" }
figma:
  file: 0054ib0nLmt27bC3QlGDl7
  nodes:
    - { id: "10340:2", label: "V4-1646 工作 page", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/?node-id=10340-2" }
    - { id: "10343:4", label: "feature 交付 Section", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/?node-id=10343-4" }
---

<!-- mockup-handoff -->
# Handoff — V4-1646 WiFi `Other`（隐藏 SSID）on LCD

- **日期**：2026-09-10
- **Jira**：[V4-1646](https://tvunetworks.atlassian.net/browse/V4-1646)（Bug, Medium, **Backlog**, reporter winni, **assignee 当前是 Nancy Zeng ⇒ 交付后须转 Edward Wu**, labels=`[GUI]`, **fixVersions 空**, **issuelinks 空**, 5 条评论）
- **需求链**（该单无 issuelinks，以下为本轮判定的背景参照，非 Jira 关联）：[V4-1535](https://tvunetworks.atlassian.net/browse/V4-1535)（LCD 虚拟键盘, Done, Asher Guo）· [V4-1865](https://tvunetworks.atlassian.net/browse/V4-1865)（第二内置 WiFi 模块 Config-T, Done, Bonnie Zhou）· [V4-2318](https://tvunetworks.atlassian.net/browse/V4-2318)（同上 LCD, Resolved, Edward Wu）
- **权威 scope 在 Slack 不在 Jira**：[#tvu-support-global-requests 2026-07-10](https://tvunetworks.slack.com/archives/C014Y5SA4VA/p1783673699149789)（89 回复；客户诉求 + 三条硬约束 + 8.4 承诺）
- **Figma**：`0054ib0nLmt27bC3QlGDl7` · page `10340:2` · feature 交付 Section `10343:4` · BEFORE 对照 Section `10343:3`（Section 外）· 文案常驻页新卡 `10394:40`
- **设计真源**：[`docs/specs/2026-09-10-v4-1646-lcd-wifi-other-design-record.md`](../specs/2026-09-10-v4-1646-lcd-wifi-other-design-record.md)
- **Task Entry Mode**：US-2 / **W3**（七件套全产）

---

## 0. 本轮交付

> **第二轮（2026-09-10）**：落地 owner 追加拍定的 **D17 / D18 / D19**，详见 [plan §1b-1](../plans/2026-09-09-v4-1646-lcd-wifi-other-plan.md)。⛔ D2/D3 的「`Security` 只读标签」方案已作废，本文件内相关表述均已订正。

| 交付件 | node | 状态 |
|---|---|---|
| PRD 卡（六段双语 + 5 处超链接）| `10365:838` | ✅ 680×**1088**（Acceptance 2/3 按 D17 改写）|
| **10** 个产品状态帧 | 见 design-record §5 | ✅ 各 480×320（+ C2 `10398:853` / C3 `10398:908`）|
| BEFORE 对照（clone 原样，内容未动）| `10343:361` | ✅ 置于 feature Section **外** |
| UX 交付卡（6 张 navy chip）| `10370:838` | ✅ 680×**1606**（数据契约 2 条 + 交互 1 条 + 界面级验收 4 条改写，新增 1 条导航标题验收 `10405:874`）|
| User Journey Map（真网格）| `10374:838` | ✅ 1574×**657**，**3 个 persona**（补 P2 `10411:875` / P3 `10411:888`）|
| ~~Change Log 注释~~ | — | 🔴 **整个模块已删（D20，owner 2026-09-10 拍定）** —— 三个节点全删；理由见 [plan §1b-3](../plans/2026-09-09-v4-1646-lcd-wifi-other-plan.md)：W3 档已有 PRD 卡 + UX 卡 + Journey 卡 + BEFORE/AFTER 分属两 Section + 11 条连线，delta 定位已充分，⑦ 的边际价值不抵它恒产 overlap findings 的解释成本 |
| Jira requirement 组件 | `10378:2960` | ✅ `Priority=High` + 超链接 |
| 流程连线 **×11** | `connector/*` | ✅ 自审四项全绿（§3）—— ⚠️ 机检 `connector` 闸**自报降级**，不构成验证 |
| 文案入库（md + Figma 孪生）| `lcd-message-strings.md` §4 · `10394:40` | ✅ 两边同源；§4.2 落位改 24px + 登记 22px 残留 |
| feature Section | `10343:4` | ✅ **4940×1686**（UX 卡右移到 `x=4220` 腾出行 1 第 5/6 列）|
| Jira 回复 + 转 assignee | — | ⏳ **等 owner 定稿**（§7 P10）|
| 走查 F1 / F2 | [F1](../audits/2026-09-10-v4-1646-f1-walkthrough.md) · [F2](../audits/2026-09-10-v4-1646-f2-persona-simulation.md) | ✅ 已跑；走查自修 1 条（三帧 `OK` 切真禁用变体），产出 3 条待 owner 拍（P7 / P18 / P19）|
| 空表单 `OK` 禁用态 | `10350:314` · `10398:906` · `10398:961` | ✅ 走查修复：`Status=Disabled` 真变体（⛔ 非 opacity），与 PRD 验收 A3 对齐 |
| D18 提示落位终值 | `10360:831` · `10353:4826` · `10361:735` | ✅ **`y=54` 定稿**（= 导航条 46 + 8）。三帧实测 `54..99`、导航重叠 **0**、完整落在内容区内。落位**通则**已写入 [`lcd-message-strings.md` §2.5](../specs/lcd-message-strings.md)，含 8 处先例实测表 |

## 1. M48 起手 Rule-Coverage Self-Check（交付前回头打勾）

### (A) locked spec（项目侧取值真源）

| spec | 落地 | 状态 |
|---|---|---|
| `lcd-canonical-spec.md` §1 双背景色 `#252525`/`#313131` | clone 宿主帧继承 | ✅ |
| §1 底栏 `OK` 82×36 + `Home` 84×36 | 表单帧底栏 | ✅ |
| §1 底栏一律 file-local `LCD Button` | 实测 `remote=false` | ✅ |
| §1 禁用态用 `Status=Disabled` **真变体**、不用 opacity | connecting 帧 `OK` 实测 `Type=Primary, Status=Disabled` 且 `opacity=1` | ✅ |
| §4 `Jira requirement` 须文件内 clone（跨文件 import 会 fail）| clone `5315:19564` | ✅ |
| §5 LCD 产品层字体 = Verdana / 注释层 Roboto + Noto Sans SC | 注释层 ✅；产品层见 §5 已知偏差 | ⚠️ |
| §6 新文案串必须两边同步 | `lcd-message-strings.md` §4 + `10394:40` | ✅ |
| `PRODUCT_INTRODUCTION.md` §3.4 LCD 提交动词 = `OK` | `Scan` → `OK` 已改 | ✅ |
| §3.4.1 提交后必给 Message + 失败不编原因 | 三条文案（§4.2）| ✅ |

### (B) active M-rule

| rule | 落地 | 状态 |
|---|---|---|
| M0 Phase 0 mapping | 产品层零自画，全部复用既有组件；表已发 owner 校验并获确认 | ✅ |
| M17 | 宿主范式来源 + 实测取值表见 design-record §3 | ✅ |
| **M17.1**（第二轮触发并落地）| `Security` 改二选一 ⇒ 照 canonical `5314:9520` 建：面板 240 宽 · 高度按行数算得 **71**（⛔ 未照抄 canonical 的 176）· 右缘齐被编辑行 456 · 被编辑行加框（阶梯 VECTOR）· 当前值行绿字 + 矢量三角 marker · 面板与被编辑行**连体** · 面板展开时被编辑行自身值隐藏 · 底栏 `▼▲` 保留 · ⛔ 无 Unicode 字符充当标记 | ✅ |
| M17.1 展开方向 | canonical 只有一行可见字段 ⇒ 「向上」不是范式。本单中间行**向下**展开，判据 = 边缘不切文字（逐行量过文字带）| ✅ 见 design-record §4 D17 |
| M21.4 视觉结构契约 | 两级先例搜索；新立两条契约见 design-record §5 | ✅ |
| M23.0 UX 卡 canonical 6 段 | 段名/顺序/语义照表，未自创段 | ✅ |
| M23.0 判据单一归属 | PRD=功能级 5 条 / UX 卡=界面级 8 条，各留一行指路句 | ✅ |
| M23.6 (A)(C)(D) | 审计表见 §3，三项全绿 | ✅ |
| M23.8 / M23.8.1 | Jira 组件带 `setRangeHyperlink`；PRD 需求来源段 5 处链接实测生效 | ✅ |
| M23.12 一 feature 一 Section + BEFORE 在外 + 文档卡统一 PRD 宽 | Section 重组过一次（原四段 → feature + BEFORE）；PRD/UX 卡均 680 | ✅ |
| M23.14 (A) 三档递增间距 | ZH 贴 EN（lineHeight）< 对间 8 < 段间 16，已吸附 scale | ✅ |
| M23.14 (B) 段名层级 + 卡带创建日期 | 段名 cyan Medium 15 / 正文 13；三张卡 meta 行均带 `2026-09-10` | ✅ |
| M23.19 结构化表达 | Journey 用**真网格**（Stage 列 × Lens 行），非纵向文字块 | ✅ |
| M32 / M32.4 | LCD 走 file-local 是 M32 优先级第 2 条正常落点；禁用态用真变体 | ✅ |
| M45 / M45.1 | page 名三段式；建在 `To be confirmed` 分隔符正下方（index 4）| ✅ |
| M42 clone gate | clone 前 probe 源帧 85 个节点的 paint / 变量绑定 | ✅ |
| M47.2 文本改动 | 整段覆盖 → 赋 characters → 逐段重设 + `getStyledTextSegments` 复核 | ✅ |
| M53 提示文案触发族 | 三条均 `user-initiated`（用户按 `OK` 提交后的结果）| ✅ |
| M-TXT-ICON-AUDIT | EN 段避开 `▼▲ →`（Roboto 无字形），符号只留中文段；checkbox 用 `[ ]` 纯 ASCII | ✅ |
| M-INTEGRITY I2 / I7 | 几何总检见 §4；Section 越界 0 / 产品帧重叠 0 / 文档卡重叠 0 | ✅ |
| Q15 SECTION 子节点坐标 | 全程用 section-relative，落点 probe `absoluteBoundingBox` 复核 | ✅ |
| Q22 SLOT / instance 结构改动 | Message 的 `Content` 是 SLOT，一律从 instance 往下 `findOne`，⛔ 未用复合 id `getNodeByIdAsync` | ✅ |
| M54 多断点 | 设备固定屏，单档（480×320）即满足 | ✅ |

### (C) 未覆盖项 rationale

| 项 | 为什么本轮不做 |
|---|---|
| ~~M17.1 选项列表 canonical~~ | 🔴 **已转为必须并落地（第二轮）** —— 见上方 (B) 表。原「本轮未触发」的记载失效 |
| 情绪层（Journey 卡可选层）| 三条硬约束（须标数据来源 / 须从连线闸排除 / 卡宽一改必须重算依附几何）风险高于收益；本轮不画 |
| M23.17 非破坏性更新标注 | 本单是全新交付、无既有交付逻辑要改 ⇒ 不触发 |
| M55 多方案比选 | 需求单一、无正交路线 ⇒ 不触发 |

## 2. 宿主范式实测取值（§M17 Acceptance）

见 [design-record §3](../specs/2026-09-10-v4-1646-lcd-wifi-other-design-record.md)。**贴实测数字、非目测**：列表行 36 · canonical 设置页行 42 · 表单字段行 46 · 键盘 instance 480×176 · 列表容器 432×163（⇒ 每页 4 行）· 占位符白色 + opacity 0.2。

## 3. Connector accuracy audit（§M23.6 Acceptance，每条 arrow 两端各一行）

⚠️ **机检 `connector` 闸不构成本节的验证**：它自报降级 —— `orthogonal×7 / anchoring×7 / dot-shape×3 / color×4` 本轮**没跑**（成因：REST 不暴露 `vectorPaths`；旧 schema 缺锚字段），且只解析到 **7** 条（实际 11 条）。⇒ 下表是 `use_figma` 程序化自审的机器输出（能读 `vectorPaths`），**section 相对坐标，一套坐标系**。

| arrow | 段数 | `vectorPaths` 条数 | 正交 | 起点 | 起点所在帧 | dot 锚定 | tip 坐标 | tip 落在 | 标签距线 |
|---|---|---|---|---|---|---|---|---|---|
| B-to-C | 1 | 1 | PASS | 1236,271 | List with Other | PASS | 1352,271 | Other form — empty | 22 |
| C-to-D | 1 | 1 | PASS | 1796,123 | Other form — empty | PASS | 1912,123 | network name input | 22 |
| D-to-E | 1 | 1 | PASS | 2356,123 | network name input | PASS | 2472,123 | password input | 22 |
| success-to-steady | 1 | 1 | PASS | 1788,490 | Connected + success | PASS | 1912,490 | List with hidden SSID connected | 47 |
| failed-to-retry | 1 | 1 | PASS | 2779,742 | Connection failed | PASS | 2779,350 | password input | 50 |
| password-to-connecting | 4 | 1 | PASS | 2932,338 | password input | PASS | 1020,770 | Connecting | 31 |
| connecting-to-success | 1 | 1 | PASS | 1155,491 | Connecting | PASS | 1352,491 | Connected + success | 57 |
| connecting-to-failure | 3 | 1 | PASS | 1021,513 | Connecting | PASS | 2700,770 | Connection failed | 31 |
| **C-to-C2** | 4 | 1 | PASS | 1790,169 | Other form — empty | PASS | 3260,352 | Security options open | 18 |
| **C2-to-C3** | 1 | 1 | PASS | 3476,246 | Security options open | PASS | 3592,246 | Security = None | 22 |
| **C3-to-connecting** | 4 | 1 | PASS | 4052,340 | Security = None | PASS | 1020,772 | Connecting | 22 |

**合计（11 条）：正交违例 0 · dot 锚定失败 0 · tip 锚定失败 0 · 标签间距失败 0（max 57，阈值 ≤60）· 每条 `vectorPaths.length === 1`（箭头确为独立节点，未被合并进 `[0]`）。**

**新增三条的走线**（都绕开了帧与既有标签，⛔ 不压任何 label）：
- `C-to-C2`：C 的 Security 行 → 右出到行间空档 x1860 → 下到行间总线 y=410 → 右到 x3260 → 上进 C2 底缘。y=410 这条总线只与 `failed-to-retry`（x2779 竖线）**交叉**，与其标签（380..407）留 3px。
- `C2-to-C3`：面板 `None` 行高度 y=246，横跨 80px 空档；**标签宽度 = 空档宽度 80**（上一轮修过的那个坑：标签宽 156 > 空档 80 会两端压进帧）。
- `C3-to-connecting`：C3 的 `OK` → 右出到 x4120 → 下到 y=930 → 左到 x1020 → 上进 Connecting 底缘。y=930 距 Journey 卡顶（980）50px、距 `connecting-to-failure` 的 bbox 底（900）30px。

⚠️ **施工陷阱（后续做连线必看）**：
1. **箭头必须是独立节点**。放进同一 VECTOR 的第二条 `vectorPaths` 会被 Figma **合并进 `[0]`**，于是箭头斜边进入正交检查面（首版实测 `mainSegs=5`、假违例 3 条/条），且 bbox 被箭头撑高导致端点读数偏 5–10px。
2. **多段 / 含负方向的线，节点 `x/y` 必须设为 path bbox 原点（各轴最小值），⛔ 不是起点** —— Figma 会把 `vectorPaths` 坐标 normalize 成非负。首版按起点设，导致 `failed-to-retry` 整条下移 384px、`password-to-connecting` 右移 1912px（线与箭头分离）。

## 4. 自检（机器输出，原文照贴）

### 4.1 几何自检（`use_figma` 实测，收尾固定跑）

第二轮终跑（**全部从 `sec.children` 取数 = 一套坐标系**，见 §5.8 为什么这点是硬要求）：

```
sectionToSectionOverlap: 0
productFrameOverlap: 0            （10 帧两两比对）
docCardOverlap（PRD × UX × Journey）: 0
labelVsBlock（11 个连线标签 × 全部 FRAME/INSTANCE 块）: 0
blockPairs（块 × 块）: 0          ← Change Log 删除后清零（此前 2 条为圈选框）
frameOutOfSectionBounds: 0
Section 收紧: 3820×1595 → 4940×1704（内容实际范围 maxR=4900 / maxB=1664）
childCount: 57 · productFrames: 10 · docCards: 3 · connectors: 11
pageTopLevel: SECTION BEFORE / SECTION feature / INSTANCE Jira requirement  ← 无游离产品帧
残留扫描: Mark area / Description_text / Change Log → []
```

曲引号全 Section 扫描：`curlyQuotes: []`（把 UX 卡 Acceptance 里的 `Couldn’t` 统一成 mockup 与文案真源实际使用的 ASCII `Couldn't`；两边现已逐字一致，程序化比对 `matches: true`）。

### 4.2 `pnpm audit:mockup-conformance --file 0054ib0nLmt27bC3QlGDl7 --node 10343:4`

第二轮终跑（16/16 条规则，**先跑 `pnpm sync:mockup` 刷掉过期离线缓存**，见 §4.6）：

**终跑（2026-09-10，Change Log 删除后 + 落位改 54 后；先跑 `pnpm sync:mockup` 刷缓存）**：

```
═══ mockup-conformance summary ═══
  ✅ PASS  integrity              scope=node  checkedUnits=1
  ❌ FINDINGS  colors                 scope=node  checkedUnits=2008
  ✅ PASS  typography-icon        scope=node  checkedUnits=355
  ❌ FINDINGS  library-origin         scope=node  checkedUnits=161
  ❌ FINDINGS  binding-fidelity       scope=node  checkedUnits=2008
  ✅ PASS  bilingual-spacing      scope=node  checkedUnits=107
  ✅ PASS  overlap                scope=node  checkedUnits=24
  ✅ PASS  connector              scope=file  checkedUnits=7
  ❌ FINDINGS  library-binding        scope=file  checkedUnits=103456
  ✅ PASS  geometry-consistency   scope=node  checkedUnits=16
  ✅ PASS  variant-axis           scope=node  checkedUnits=0
  ❌ FINDINGS  default-white-bg       scope=node  checkedUnits=13
  ✅ PASS  hash-n-semantic        scope=node  checkedUnits=0
  ✅ PASS  jira-hyperlink         scope=node  checkedUnits=0
  ✅ PASS  feedback-not-selfdrawn scope=node  checkedUnits=0
  ✅ PASS  source-link-integrity  scope=node  checkedUnits=0

  totals: rulesWithFindings 5 · rulesErrored 0
  colors 336 · library-origin 115 · binding-fidelity 2665 · library-binding 1794 · default-white-bg 284
```

🔴 **`overlap` 由 FINDINGS 转 PASS**（24 单元 0 findings）—— 此前那 2 条「设计意图」findings 是两个 `Mark area` 圈选框，随 Change Log 一并删除后**结构上消失**。⇒ **11/16 PASS**（上一轮 10/16）。
**附带收获**：那 2 条 findings 每轮都要写一段「这是设计意图、不是 placed without probing」来解释；删掉模块后这段解释成本也一起消失。**恒产 findings 的交付件，其解释成本要算进它的性价比里** —— 这是 D20 的一条判据。

⚠️ **`checkedUnits=0` 的四条（variant-axis / hash-n-semantic / jira-hyperlink / source-link-integrity）不算通过**（§M-GATE-FALSIFIABILITY）。`feedback-not-selfdrawn` 同样 —— 闸自报「扫描面里没有任何名为 `Notification`/`Message` 的节点 ⇒ 本轮无可判对象」，**但本 Section 明明有 3 个 `Message` instance**（`10360:831` / `10353:4826` / `10361:735`）⇒ 该闸对 instance 名的识别在 REST 口径下没生效，**记为未验，⛔ 别读成「反馈组件已合规」**。反馈组件的实际核验走 §4.6 的变量绑定比对。

### 4.3 `--node 10167:2`（文案常驻页新卡）

```
── bilingual-spacing ──  ↳ checkedUnits=14 · findings=0 · exit=0 · unverified=14
── overlap ──            ↳ checkedUnits=0  · findings=0 · exit=0
── typography-icon ──    ↳ checkedUnits=49 · findings=0 · exit=0
✅ mockup-conformance: 3 条规则全过
```

⚠️ **`overlap` 的 `checkedUnits=0` 不算通过** —— 按 §M-GATE-FALSIFIABILITY「判过 0 个单元的『没发现问题』= 没验」。该 Section 只有一个直接子节点（`Doc column`）⇒ 本轮**无可判对象**，不得读成「无重叠」。

### 4.4 本轮机检抓出并修掉的两类（均为本轮引入，非存量债）

| 类 | 机检读数 | 根因 | 修法 |
|---|---|---|---|
| `bilingual-spacing` ×2 | `zh-opacity` measured **0.315**，要求 0.45 | 指路句用了 EN opacity 0.7，ZH 又按 0.45 比例去乘 ⇒ 0.7×0.45 | ZH fill opacity 直接设 **0.45**（绝对值，⛔ 不是相对 EN 再乘）|
| `overlap` ×6 | 连线标签 ⨯ 产品帧，overlap 44×27 / 32×27 | 标签宽 156 > 帧间 gap 80，两端各压进帧 | 标签宽收到 **80**（= gap 宽）并居中于 gap ⇒ x 范围完整落在空隙内，实测 `labelVsFrameOverlap: 0` |

### 4.5 全量跑的既有存量债（**非本轮引入，⛔ 勿逐节点修**）

```
第一轮:  colors 324 · library-origin 113 · binding-fidelity 2337 · default-white-bg 284
第二轮:  colors 336 · library-origin 118 · binding-fidelity 2593 · default-white-bg 284 · library-binding 1794
```

按 memory `lcd-file-conformance-deferred`：`0054ib` 的 `colors` / `library-origin` / `binding-fidelity` findings 是 **file-wide owner-deferred（§M49.1）**，只验本轮负责规则。`default-white-bg` 同属该档（§M23.18.2 的存量面）。

**增量归属（贴实测，不含推测）**：
- `library-origin` **+5 精确对上**：`10398:904/905`（C2 的 `down`/`up`）· `10398:959/960`（C3 的 `down`/`up`）· `10406:874`（新 `Mark area`）—— 全是 clone 宿主帧时**连带进来的远端库 instance**，非手工引入。
- `colors` **+12 全部落在 `10398:*` 前缀**（= C2/C3 子树内的库组件图标内部）。
- `binding-fidelity` +256：**未能逐条归属** —— CLI 的 findings 打印有内部截断（2593 条只打印 429 行，`--report-lines 4000` 不解除），可见样本里落在本轮新节点（`10398/10400/10401/10405/10406`）的有 31 行。**类别未变**（B-TYPO 裸 `fontSize`），⛔ 但我不声称「+256 全是继承」；如实登记为未完成归属。
- `library-binding` 第一轮记 ERROR（缓存过期）⇒ 第二轮才首次跑出 1794，**这是它的初始读数、不是新增**。

### 4.6 第二轮机检之外抓出的两个真错（**五闸全绿也看不见**）

| # | 错 | 机检为什么看不见 | 怎么发现的 | 修法 + 复验读数 |
|---|---|---|---|---|
| **E1** | 失败提示（`10361:735`）的文字绑到 **`UX/Blue/Default` `#3892f3`**（info 蓝），而库里 `status=error` 主组件绑的是 **`UX/Red/Default` `#ea4233`** | `colors` 闸判的是「有没有绑变量」。这里**绑了**，只是绑错了那一个 ⇒ 对闸而言完全合规 | **渲染图**：背景粉 + 图标红 + 文字蓝，三者不同源，一眼不对 | 逐 instance 与其 `getMainComponentAsync()` 上同名文本节点比对 `boundVariables.color`。复验：info `#3892f3` match=true · success `#2fb54e` match=true · error 修后 `#ea4233` match=true |
| **E2** | `node.clone()` 把 C2/C3 建到 **PAGE** 上而不是 Section 里 ⇒ page 坐标 3020 被当成 section 坐标，两帧**实际压在 D/E 帧上** | `overlap` 闸只比**同一 SECTION / CANVAS 的直接子节点**；C2/C3 属 CANVAS、D/E 属 SECTION ⇒ 跨 parent，结构上不进比对面 | 自审脚本报 `productFrames: 8`（应为 10）+ `anchorFail: 3` —— 连线的 tip 找不到目标帧 | `sec.appendChild()` 显式收进 Section 再设坐标。复验：`parentType: SECTION` · `x=3020 → absX=4380` · `productFrames: 10` · `frameOverlap: []` · `anchorFail: 0` |

🔴 **E2 的二级教训（比 E2 本身更值钱）**：我第一次的碰撞检查**混用了两套坐标系**（新帧读 page 坐标、旧帧读 section 坐标），于是把真重叠判成「零碰撞」。**给出假绿比不查更危险** —— 不查至少不会让人放心。⇒ 现在几何自检一律**只从 `sec.children` 取数**，一套坐标系（见 §4.1）。

### 4.7 SYNC 三轮（§M-DISCIPLINE.SYNC）

改完后对**整个 feature Section** 跑旧措辞扫描，15 条已被推翻的前提**全部零命中**：

```
read-only value `WPA2` / no drill-down / 只读值 WPA2 / 不带下钻三角
`WPA2` only / 仅 WPA2 / 只有 WPA2
password is mandatory / 密码为必填 / no password-free mode / 无无密码模式
8px from the frame top / 距帧顶 8px
Security fixed to WPA2 / 固定 WPA2
→ staleWordingRemaining: []
```

这一扫抓出了**Journey 卡 Pairing 列三格**的失效内容（`Actions`「types SSID and password」· `Pain Points`「Password is mandatory but that is not stated up front」· `Opportunities`「HIT — Security fixed to WPA2, read-only; no false choice offered」）—— 后者与 D17 **直接冲突**。三格已改（`10375:846` / `10376:859` / `10376:873`），`Thoughts` 那格也一并改成 `"Which encryption does this venue use?"`。⚠️ **若只改 PRD/UX 卡就收尾，这三格会留成自相矛盾的交付物。**

### 4.8 第三轮起手复验（2026-09-11，新 session 换手复核，`use_figma` 机器输出）

换 session 后**不采信上一轮的文字结论**，对 D17–D22 的落地物逐条重测（全部从 `sec.children` 取数 = 一套坐标系）：

```
Section 10343:4         4940×1704 · childCount 57 · sectionToSectionOverlap []
page 顶层 3 节点        SECTION BEFORE(10343:3, 1 帧) / SECTION feature(10343:4) / INSTANCE Jira(10378:2960)
产品帧                  10（行1 六列 x=780/1340/1900/2460/3020/3580 · 行2 四列 x=780/1340/1900/2460）
交付卡                  3（PRD 10365:838 680×867 · UX 10370:838 680×1393 · Journey 10374:838 1574×657）
连线部件                44 = 11 条 × 4 件
D20 残留扫描            Mark area / Description_text / Change Log → []
                        10390:272 / 10406:874 / 10391:237 → 三个 id 全 not-found
D21 三帧提示落位        10360:831 relY 54 · 10353:4826 relY 54 · 10361:735 relY 54
                        三者 layoutPositioning=ABSOLUTE（D15 仍成立）· 宽 269 / 415 / 479
P17 OK 禁用变体         C 10350:314 · C2 10398:906 · C3 10398:961 · F 10360:694 = Type=Primary,Status=Disabled
                        H 10361:733 = Status=Normal（刻意：失败后可重试）· 全部 Home = Type=Home,Status=Normal
E1 三条语义色           info #3892f3 · success #2fb54e · error #ea4233  ← 绑错蓝色不复现
D17 Security 三态       C: WPA2 + 三角×1 + Password 可见 / C2: 面板含 WPA2+None / C3: None + Password visible=false
旧措辞扫描（17 条正则，含新加的 `24px` 与 `won't survive a reboot`）→ staleCount 0
```

⚠️ **两条量法订正，后续别照抄错的那种**：

1. **naive bbox 两两比对在这个 Section 上会报 101 条假重叠** —— 每一条都至少有一端是 connector。折线 connector 的 bbox 覆盖它跨越的全部帧（如 `connector/C3-to-connecting` bbox 3100×590），按 bbox 判必假阳性；按 §M-DISCIPLINE.MEASURE **须逐线段量**。剔掉 connector 后**帧 × 帧 / 卡 × 卡重叠 = 0**，与 §4.1 一致。
2. **「instance 的绑定与 `getMainComponentAsync()` 同名节点逐条比对」这条在 Message 上按节点名走不通** —— Message 的文本节点**名字跟随内容**（如 `Connected to Guest_Hidden — reconnect after reboot.`），主组件里没有同名节点 ⇒ 按名 join 恒 `mainVar: null`，会把三条全报成 mismatch（假阳性）。E1 那类问题的可用判据是**渲染 hex + 每条 status 各自独立的 variable id**，或按**子节点索引**对齐后再比。

### 4.9 第三轮 D23 返工后终跑（2026-09-11）

**几何自检**（统一从 `sec.children` 取数）：

```
Section 10343:4        4940×1704 → 3740×1677（maxR 3700 / maxB 1637）
childCount             57 → 43   = 8 产品帧 + 3 张卡 + 32 连线部件（9 条 × 4 件）
blockPairs（帧×帧 / 卡×卡）      0
labelVsBlock（9 个标签 × 全部块） 0
frameOutOfSectionBounds          0
sectionToSectionOverlap          0
page 顶层                        SECTION BEFORE / SECTION feature / INSTANCE Jira  ← 无游离节点
新连线 D-to-connecting           parent.type=SECTION ×4 件 · 标签距线 8px
E 帧内容区                       可用 78 = 提示行 32 + 字段行 46 ⇒ overflow 0
五个含表单帧的可见行数            C 1 · D 1 · E 2 · F 1 · H 1   ← E3 修复后一致
常驻页 Section 10167:2           760×1806 → 760×2591（存量溢出 745px 一并收紧）
```

**`pnpm audit:mockup-conformance --file 0054ib0nLmt27bC3QlGDl7 --node 10343:4`**（先跑 `pnpm sync:mockup` 刷缓存）：

```
═══ mockup-conformance summary ═══
  ✅ PASS  integrity              scope=node  checkedUnits=1
  ❌ FINDINGS  colors                 scope=node  checkedUnits=1823
  ✅ PASS  typography-icon        scope=node  checkedUnits=317
  ❌ FINDINGS  library-origin         scope=node  checkedUnits=151
  ❌ FINDINGS  binding-fidelity       scope=node  checkedUnits=1823
  ✅ PASS  bilingual-spacing      scope=node  checkedUnits=100
  ✅ PASS  overlap                scope=node  checkedUnits=20
  ✅ PASS  connector              scope=file  checkedUnits=7
  ❌ FINDINGS  library-binding        scope=file  checkedUnits=103331
  ✅ PASS  geometry-consistency   scope=node  checkedUnits=12
  ✅ PASS  variant-axis           scope=node  checkedUnits=0
  ❌ FINDINGS  default-white-bg       scope=node  checkedUnits=11
  ✅ PASS  hash-n-semantic        scope=node  checkedUnits=0
  ✅ PASS  jira-hyperlink         scope=node  checkedUnits=0
  ✅ PASS  feedback-not-selfdrawn scope=node  checkedUnits=0
  ✅ PASS  source-link-integrity  scope=node  checkedUnits=8
    "findingsAcrossRules": 4899,
    "rulesErrored": 0,
```

**11/16 PASS · `rulesErrored: 0`**。5 条 FINDINGS 全部是 §M49.1 file-wide owner-deferred 存量债，且**计数随删帧同步下降**（colors 336→324 · library-origin 118→111 · binding-fidelity 2593→2388 · library-binding 1794→1792 · default-white-bg 284 不变）⇒ 无新增。

**`--node 10167:2`（文案常驻页）**：`source-link-integrity` 由 **FINDINGS(1) → PASS**（修了 §M23.8.1 的纯文本 ticket，见下 E5）。

⚠️ **两个「缓存过期」的坑，本轮都踩到了**：

1. **同一条命令连跑两次结果可能不同** —— 第一次 `library-binding` 出 1792 条，第二次记 ERROR。成因：Figma 的 `lastModified` 在我编辑落盘后**又跳了一次**，缓存二次过期。⇒ **以「刷缓存后紧接着那一跑」为准**，别把两次读数混着引用。
2. 承 P11：闸的报错信息里已写了成因与修法，别记成待查项。

### 4.10 本轮旧措辞扫描（§M-DISCIPLINE.SYNC 轮①③，**两个 surface 都扫**）

```
20 条正则（two options / WPA2 ?\/ ?None / 二选一 / Security = None / 选加密类型 /
 picks the security / option list / 选项列表 / 8px from the frame top / 距帧顶 8px /
 won't survive a reboot / Security offers / read-only value / 只读值 / down-triangle /
 下向三角 / \b24px\b / security choice / Picks None / mandatory）
→ feature Section 10343:4：命中 1 条，核为**反向命中**（我新写的「用户**不选**加密类型」撞上 /选加密类型/）⇒ 真实残留 0
→ 常驻页 Section 10167:2：本轮修掉 1 条真残留（见 E4）
新事实逐条（轮②）：Enter a WPA2-PSK password ×2（E 帧 10463:865 + UX 卡 10372:841）·
 no password 标签 ×1 · has password 标签 ×1 · 「表单没有 Security 字段」×1 ⇒ 全部在位
```

⚠️ **曲引号一项不能照抄上一轮的「`curlyQuotes: []`」** —— 上一轮那个扫描只查了特定串（`Couldn’t`）。本轮全量扫出 6 个含弯引号节点：5 个是 Journey 卡的**中文引号**（`“…”`，正确排版，不动），1 个是 EN 里的弯撇号 `pack’s`（与同卡 ASCII 的 `Couldn't` 不一致，已统一为 `pack's`）。⇒ **该项的正确表述是「EN 段已统一 ASCII，ZH 段保留中文引号」，不是「零弯引号」。**

## 5. 已知偏差（须让 dev / QA 知道，**不是缺陷**）

1. **字体族不一致，⛔ 禁表述为「字体已统一」**。同一 LCD 帧内并存 **Verdana**（未改动的导航标题、`Home`）· **Inter**（模块行）· **Helvetica**（未改动的列表行）· **Roboto**（本轮改动过文案的**全部**节点）。根因：`listAvailableFontsAsync` 实测 **不返回 Verdana / Helvetica / Helvetica Neue / PingFang SC**（`verdanaAvailableInEnv: []`），改文案只能整段转 Roboto。若必须保住原字体，须 owner 在 Figma 客户端手动改。
2. **`Other` 落在末页**（D4 的已知代价）。效果图刻意画成「6 个扫描结果 + 1 个已连接 = 7 个网络、两页各 4 行」的满载场景，让代价可见。
3. **提示条盖住内容区第一行**（落位定稿 `y=54`）。这是 hug 宽 + 顶部落位的固有结果、非施工失误：三条提示宽 269 / 415 / 479，后两条接近满屏宽 ⇒ 落在哪一档都会盖住一整行。定稿档把被盖对象从**导航标题**换成**内容第一行**（列表页 = 模块行 / 表单页 = `Network name` 行）—— 判据：标题是「我在哪」的唯一凭据、丢了要退出重进，内容第一行还在原地。落位通则见 [`lcd-message-strings.md` §2.5](../specs/lcd-message-strings.md)。
   - ✅ **原记「顺带发现的存量不合规 2 处」已撤销（owner 2026-09-11：当初误判）**：V4-2333 的 `9988:423`（L6）与 `9988:690`（L7）用 `y=8`、标题 `Settings/Test Signal` 被完全覆盖 —— 这是**正确的**，因为它们导航条正下方是三行参数值、而提示说的就是那些参数 ⇒ 参数行即论据、优先于标题。落位通则同日收窄，判定顺序见 [`lcd-message-strings.md` §2.5.1](../specs/lcd-message-strings.md)。
8. **选项面板的连体绿框用「闭合路径 + 3px INSIDE 描边」，canonical 用「描边被 outline 成填充」的环形路径** —— 视觉等价，登记为**有意的实现偏差**。理由两条：① 改面板尺寸时只需改路径里 6 个数，环形路径要重生成内外两圈；② 避开 DS §M17.1 明写的那个坑（probe 时只读 `fills` 会把 `fills[0].visible=false` 的环形 VECTOR 误判成「Figma 默认灰残留」而删掉，那会让整帧绿框消失）。⚠️ **后续改面板几何时仍须同步改这个 VECTOR**（§I7 第 ③ 项照旧适用）。
9. **canonical 面板与被编辑行自身的 stroke 实测都是 `visible:false`** —— 绿框**全部**由那个阶梯 VECTOR 承担。clone 面板时这些不可见 stroke 会一起带过来，⛔ 别把它们当成「漏设描边」去补，补了会出现双层绿框。
4. **占位符对比度低**：白色 `#ffffff` + **opacity 0.2**，沿用键盘页 `5324:2618` 既有取值，本轮未自行调整。
5. **`≥44px` 点击区矛盾仍存在于别处**：本单表单字段行取 46 已避开，但 canonical 设置页（42）与 WiFi 列表（36）依然不满足 `lcd-pickup.md:147`。⛔ 本轮未改 canonical。
6. **提交键双轨**：键盘内 `Join`（组件自带）vs 底栏 `OK`（项目硬规则）。判为不同层不冲突 —— 键盘唤起时替代底栏，提交靠 `Join`；键盘收起时底栏 `OK` 生效。
7. **`WiFi_item` 是 legacy 组件**（V4-1865 handoff §3.4 逐字「故意不深改」）。本轮只在其上加一行并切 variant，未深改组件本体。
10. **（D23 新增）`Security` / `Password` 两行在 C / F / H 三帧里是 `visible=false` 而不是被删** —— 照 Config-T `4900:61500` 的可逆做法。**dev 实现时按「这两行不存在」做**，⛔ 别照图层树以为要渲染一个隐藏字段。节点：C `10351:2967`/`10351:2974` · F `10360:676`/`10360:683` · H `10361:715`/`10361:722`。
11. **（D23 新增）密码步骤提示行的容器高 32 是本轮唯一新值** —— 不是新的「行高档位」，是「说明行容器高度」，由 `内容区可用 78 − 字段行 46 = 32` 推出，实测 overflow 0。字号 16 与色 `#7ed321` 均取自先例 `5325:19282`（V4-1535 WiFi 密码页）。已登记进 `lcd-message-strings.md` §4.5 与产品视觉契约。
12. **（D23 新增）无密码路径在效果图上只由连线表达，没有独立帧** —— `connector/D-to-connecting`（标签 `no password / 无密码`）从网络名录入直接指向 Connecting。⇒ **dev 看图时别把「密码步骤」当必经步骤**；它是条件步骤，由后端探测结果决定。

## 6. 交 owner 在本地 Figma 处理的债

| 项 | 为什么 AI 做不了 |
|---|---|
| 若要把本轮改动过的文案恢复成 Verdana / Helvetica | 这些字体在 `use_figma` 环境不可加载（见 §5.1）|
| `Change Log` 注释的 `Title` 行若要改文案 | 该行是 Helvetica Neue Bold 20，同上不可写（本轮**未改**它，保持组件原样）|
| Jira 组件的标题/issue key 字体 | 原为 Helvetica Neue 96 / PingFang SC 64，本轮已转 Roboto 同号；若要保原字体须手动 |

## 7. Open scope items

> ✅ **D17 / D18 / D19 已于 2026-09-10 第二轮全部在 Figma 落地**（逐条实测读数见 [plan §1b-1](../plans/2026-09-09-v4-1646-lcd-wifi-other-plan.md)）。
> - **D17** ✅ `Security` 二选一（`WPA2`/`None`）+ 选 `None` 隐藏 `Password` + 新增 C2/C3 两帧 + §M17.1 canonical 面板落地
> - **D18** 🔴 **已被 D21 推翻并作废**（24px 是唯一把导航标题横切成半截的档、无先例）⇒ 落位终值 **`y=54`**，走通则驱动，见 P7 与 [`lcd-message-strings.md` §2.5](../specs/lcd-message-strings.md)。⛔ 别再引用 24px
> - **D19** ✅ 五帧导航标题改路径式 `WiFi/Other`

| # | 项 | 归属 |
|---|---|---|
| ~~P1~~ | ✅ 已解 → **D17**（支持无密码）| 已答 |
| P2 | 成功提示说两件事 vs §2.4「一条提示只说一件事」的张力（本轮解法 = em dash 单句）| owner 追认 |
| P3 | 目标版本是否 8.4；Jira `fixVersions` 当前为空，建议补 | owner |
| P4 | 「四面一致」是否本单验收口径；该单无 issuelinks，要否拆单 / 建关联 | owner |
| P5 | `wifi_module_mode` = Disable / Hotspot 时 `Other` 隐藏 / 置灰 / 照常可点 | owner + 后端 |
| P6 | 是否顺手关闭 V4-1865 那条 `F2/F3 内部 SSID list 是否深改` TBD | owner |
| ~~P7~~ | ✅ **已解（owner 2026-09-10 第三次拍定 = D21）**：不逐单定数字，改**通则驱动** —— 提示上缘 = 承载「我在哪」的顶部区域下沿 + 8px ⇒ 设置页族 `y=54`、首页族 `y=8`。本单三帧落 54，导航重叠 0。⚠️ **2026-09-11 收窄**：设置页那一档加了前提「**导航条正下方不是这条提示所指代的状态控件行**」；是的话改盖标题、保控件（`y=8`）。本单三帧不触发该前提，`54` 仍成立。真源 = [`lcd-message-strings.md` §2.5.1](../specs/lcd-message-strings.md)。⛔ `24px` 已作废（唯一把标题横切成半截的档、无先例）| 已解 |
| ~~P24~~ | ✅ **已解（owner 2026-09-11 拍定：从待修名单划掉）—— 这两帧本来就对，是误判。** 落位通则同日收窄，判定改为两问（① 导航条有标题吗 ② 导航条正下方是不是这条提示所指代的状态控件行），真源 = [`lcd-message-strings.md` §2.5.1](../specs/lcd-message-strings.md)。逐条核过：`9988:423`（宿主 `9965:610`）/ `9988:690`（宿主 `9988:647`）导航条正下方 46..172 是三行参数值，而两条提示说的就是「参数已应用 / 应用失败」⇒ 参数行即论据 ⇒ 该盖标题、保参数行 ⇒ `y=8` 正确。实测提示 8..53 完整覆盖标题（12..35）、首行参数文字从 58 起未被触碰。| ✅ 已关闭 |
| **P25** | **交付验证形态变更（D22）**：owner 拍定「直接给 Figma 链接，不做证据页」⇒ ⚠️ 与 CLAUDE.md「要 owner 做视觉判断就起本地服务给可点链接」冲突，属**本项目此类任务的显式豁免**。代价：并排对比 + 「AI 自己先看过」两层保障没了。⛔ 后续别再自动搭页 | 已定 |
| ~~P13~~ | ✅ **已解（owner 2026-09-10 = D22）**：**不再搭评审页**，改为直接给 Figma 链接。⇒ 「固化成脚本」这条问题作废（不做的事不需要脚本）。本轮实测该流程的真实成本：Chrome 跑 5 次、两次分别 180s / 240s 超时，是本轮最大单项时间开销 | 已解 |
| P8 | 本仓无 `docs/product-context.md` ⇒ upstream-gate `data_feasibility` 恒 SKIP，是否补建 | 主线 |
| ~~P9~~ | ✅ **已跑（2026-09-10）**：[F1 报告](../audits/2026-09-10-v4-1646-f1-walkthrough.md)（2 high / 3 medium / 4 low）+ [F2 报告](../audits/2026-09-10-v4-1646-f2-persona-simulation.md)（3 personas）。走查中自修 1 条（见 P17），产出 3 条待 owner 拍（P7 / P18 / P19）| 已跑 |
| ~~P17~~ | ✅ **走查自修**：C/C2/C3 的 `OK` 原为 `Status=Normal`（空表单可点），与 PRD 验收 A3「为空不可提交」**自相矛盾** ⇒ 已切 `Status=Disabled` **真变体**（opacity 1、尺寸 82×36 不变、`Home` 保持 Normal），渲染亲验灰底暗字无绿描边。机检抓不到：`variant-axis` 判的是变体轴用法合法性，不判「这个态该用哪个变体」| 已修 |
| ~~P18~~ | ✅ **已消解（2026-09-11 = D23）** —— owner 先答「提到 44/46」，随后 Security 定调把**选项面板本身删了** ⇒ 44px 这条**不再有判定对象**（owner 就此明确「跟着 Security 定调走」）。⚠️ 该矛盾**在别处依然存在**（canonical 设置页 42 / WiFi 列表 36），见 §5.5 | 已解 |
| ~~P19~~ | ✅ **已解（2026-09-11 = D23），但解法不是改失败文案** —— owner 逐字「直接在输入密码的时候提醒是 WPA2」⇒ 把加密类型做成**前置告知**（密码步骤内容区首行 `Enter a WPA2-PSK password for "{SSID}"`），失败文案**一字不改**。判据：失败串实测 479px 已逼近 480 屏宽，加 `security type` 一类待查项必折行，违反 `lcd-message-strings.md` §4.1 第 4 条 | 已解 |
| **P26** | 🟡 **D23 的已知代价：失败态屏上没有密码字段可改** —— 密码活在独立步骤里，所以「改密码重试」的路径是 `OK → 重新连接 → 再次弹密码框`，而不是就地改。连线 `failed-to-retry` 已按此指回 E 帧。⚠️ 失败文案仍写 `check name and password`，但**这一屏上只看得到 name** ⇒ 若 QA 判为不一致，需 owner 再定（改文案 or 加回字段） | owner |
| **P20** | 🟡 **D9 运行态缺 4 类**（F1 §5.7）：① 无扫描结果的空列表 ② SSID 超长（后端上限 32 字符 vs 480 宽行，未验）③ `wifi_module_mode`=Disable/Hotspot 时 `Other` 形态（= P5）④ M12 外部事件（模块拔出 / 中途掉网）。判是否本单 scope | owner |
| **P21** | 🟢 **B1 产品层字号 6 档、相邻比 1.06–1.07**（12/14/15/16/17/20，全部继承宿主与 canonical，本轮零新增字号）。⛔ 不自行改 canonical；建议 owner 独立立项一次 LCD 字号收敛 | owner |
| **P22** | 🟢 **占位符实为「白字 + 节点级 opacity 0.2」**（fill opacity 是 1）—— 文档此前只写「opacity 0.2」，实测澄清落在**节点级**。dev 实现时是「20% 不透明度的白字」不是某个灰色。存量、沿用 `5324:2618` | dev 知情 |
| **P23** | 🟢 **§M37.1 在「无用户参考物」的单里只剩一半判据**（宿主 probe 须落 REFERENCE Section）。本轮判 N/A 并写明。建议 DS 侧补该场景的显式出口 | DS 侧 |
| P10 | Jira 回复（`UX Design updated.` + 短锚文本 Figma 链接 + @Trevor Yao + cc Edward Wu）+ **assignee 转 Edward Wu** —— ⛔ 等 owner 定稿后发 | 交付收尾 |
| ~~P11~~ | ✅ **已解（2026-09-10）**：`rulesErrored: 1` 不是「未定位」—— 闸自己就打印了成因与修法：**离线缓存 `figma-data/mockup/0054ib….json` 过期**（`extractedAt` 比文件 `lastModified` 旧 1 天）⇒ `library-binding` 记 ERROR。跑 `pnpm sync:mockup 0054ib0nLmt27bC3QlGDl7` 后重跑 ⇒ `rulesErrored: 0`，该闸首次真跑出 1794 条。**教训：闸的报错信息里已经写了答案，别急着记成待查项** | 已解 |
| ~~P12~~ | ✅ **已解（2026-09-10）**：Journey 卡补到 **3 个 persona**（P1 现场操作员 主 / P2 远程支持 `10411:875` / P3 现场工程师 `10411:888`），meta 行同步；F2-late 的 ≥2 前置满足 | 已解 |
| **P14** | `binding-fidelity` 的 +256 增量**未逐条归属**（CLI findings 打印有内部截断，`--report-lines` 不解除）。类别未变（B-TYPO 裸 fontSize，§M49.1 deferred），但如实登记为未完成归属 | 主线登记项 |
| **P15** | `feedback-not-selfdrawn` 闸自报「扫描面里没有 `Notification`/`Message` 节点」，但本 Section 明明有 3 个 `Message` instance ⇒ 该闸在 REST 口径下识别不到 instance 名。**记为未验**，是否属闸的缺陷待 DS 侧看 | DS 侧 |
| ~~P16~~ | ✅ **全部八条已升为 DS 规则，回流线关闭**。R1–R7 = owner 2026-09-11 拍定「七条全升」（DS `07f1f673`），落点见 plan §9 每行；R2/R4 **必须连 plan §9b 的量法补注一起带上**，否则规则本身会产假阳性。**R8 + G1** = owner 同日第二次拍板（DS `e6abd3ca`）：R8 → §M47.2 sub-clause〈稀疏属性逐段重设盖不住〉；G1 → §M21.4 ③〈「四面一致」类需求查对端同功能的演进史〉。⛔ G1 暂不镜像到 code 侧 R6.1（实证全在 mockup 侧），理由写在 DS mirror 声明处 | ✅ 已关闭 |
| ~~P16-原文~~ | §9 列了 **7 条** DS 回流候选（R1 clone 落点不可假设 · R2 几何自检须统一坐标系 · R3 `overlap` 闸 parent-scope 盲区 · R4 变量绑错 vs 未绑 · R5 canonical 单实例不构成排布先例 · **R6 「Change Log 每档都要」在 W3 档不成立** · **R7 落位类取值要按宿主顶部结构分族**），已过 §M-DISCIPLINE.SOURCE 三问，**等 owner 拍板是否升为 DS 规则**。见 [plan §9](../plans/2026-09-09-v4-1646-lcd-wifi-other-plan.md)（2026-09-11 订正：原文写 5 条，R6/R7 是第三轮 D20/D21 的回流产物）| owner |
