# 协作复盘 — V4-2392 Tx-IP Platform Integration（Config-T PRD 轮）

> 面向 UX 团队 / PM 内部分享。记录的是 **AI 与 owner 的协作过程**，不是实现细节（实现见 [handoff](./handoffs/2026-08-18-v4-2392-tx-ip-config-t-handoff.md) 与 [design-record](./specs/2026-08-18-v4-2392-design-record.md)）。
> 日期：2026-08-18　Session：单 session（含角色切换 UX → 翻译 → mockup）　Model：Claude Opus 5 (1M context)

---

## 1. TL;DR

- **总轮次**：12 轮 owner 交互；`use_figma` 16 次（3 次只读 probe / 13 次写）；`get_screenshot` 15 次
- **最终交付**：Figma PRD 卡 `6:2`（680×2039 · 6 段双语 · 12 条功能需求 · 6 条验收 · 8 处 hyperlink）+ design-record + handoff + 本复盘
- **核心 process gap：5 个**（4 个我的执行缺陷 + 1 个规则本身的缺口）；**验证有效的做法：6 条**
- **关键 insight**：**「证据物的分辨率」也是 scope 的一部分。** 本轮两次 scope 误判都不是判断力问题，是我拿全景缩略图当红框证据用 —— 全景足以数出「有几张图」，但不足以判定「框住了哪几行」。owner 两句话（「我当前页只圈了这两项」「USB 那项在 IP Source 页面已经红框圈中了」）各纠正了一次。

---

## 2. Session 概览

| 维度 | 内容 |
|---|---|
| **起点** | owner 用「Hi 翻译」唤起翻译角色，要一段给开发的中文需求说明的英文版 |
| **中途转向** | 译文发 Slack 后，owner 要求把同一份需求「作为 PRD 更新到 Figma 并链接 Slack thread」⇒ 触发 `tvu-design-mockup` 完整起手协议 |
| **最终落地** | Config-T 单端 PRD（LCD 端 owner 转交并行 session；Test Signal pre-condition 态同样转交） |
| **process artifacts** | M48 起手清单（写在对话里）· Gate A PRD 草稿 · Gate B 交付报告 · SYNC 三轮扫查 ×4 · conformance 总闸 ×5 |
| **未产出（有意）** | mockup / UX Delivery 卡 / User Journey Map — owner 本轮只要 PRD，已在 handoff §5 登记为下一轮必补 |

---

## 3. 主要迭代时间线

| # | 触发 | 改动量 |
|---|---|---|
| 1 | owner 给中文需求 → 要英文版 | 中文优化版 + Slack / Jira 两场景译文 + 5 条用词说明 |
| 2 | 「USB 那个需要 PM 和 Matt 确认，加上去」 | 第 5 点拆为独立项（原与 HDMI/SDI 挤一条） |
| 3 | 「更改第一句描述」 | 开场句改邀请补充语气 |
| 4 | 「把这个描述更新到 Figma 作为 PRD + 链接 Slack」 | 起手协议全跑：环境检查 → git pull → 读真源 → Slack 双线解码 → Jira V4-2392 → 逐图勘察 → M48 清单 → Gate A 草稿 |
| 5 | owner 中途：「结论发在另一条 Slack，那条才是需求确认线」 | 需求来源改以确认线为主源，拿到 **Matt 权威答复 6 条** |
| 6 | Gate A 两问（webcam 归属 / 4 项补充） | owner 选「按 Matt 确认移除 UVC」+ 4 项全列 |
| 7 | owner 同意两处取舍 → 写入 | 6 段 PRD 建成（11 条 req）；渲染图自检发现行距机制失效 → **重建全部 6 段正文** |
| 8 | 总闸 exit 1 | spacing 4 值 off-scale → 批量吸附；补 `sync:mockup` 缓存 → library-binding 转 PASS |
| 9 | 「Test Signal 交并行 session」+「按只支持 IP Source 做」 | req 10 改正向表述 + 补 1 条验收 |
| 10 | **「哪里看到不支持 Return Video？」** | 给三处证据链；发现 Matt 只否定 HDMI 输出 → 提出 scope 歧义 → owner 选「只删两组」+ **「我当前页只圈了这两项」** |
| 11 | 放大 `1:6` 核框 | req 9 重写 + Source Switcher 拆出 → **重编号 12 条** + §3/§5 同步 |
| 12 | 「收尾」+ **「USB 那项在 IP Source 页面已经红框圈中了」** | 补看剩余 4 张图 → 找到 `3:16` → **修 5 处**（req 5 / req 11 / §3 两条 / §5 一条）+ 同步 Section 新名 |

---

## 4. Top 4 process gap（按返工成本排序）

### ① 拿全景缩略图当红框证据 —— 返工最贵

**实证**：Section 全景（9244×4536 缩到 1800px）上，Return Video 页的红框看起来包住整页，我据此写下 req 9「移除 Return Video tab（四组 RVF）」。owner 指出「当前页只圈了这两项」后放大 `1:6`，才看清框在 V-box 的 Start 按钮下方就收住了，Pack LCD / Phone-Tablet 两组在框外。同一病灶第二次发作：我两次向 owner 声明「Figma 上没有 UVC/webcam 红框标注」，实际它就在 `3:16`（我当时只放大了 10 张里的 4 张）。

**返工成本**：req 9 重写 + 拆出 req 10 + 12 条全量重编号 + §3 两条基线改写 + §5 一条验收改写 + 4 次补充截图 + 2 次额外自检 + 1 次总闸复跑 ≈ 2 轮。

**回流落点**：DS [`mockup-conventions.md` §M-DISCIPLINE.SCOPE](../../tvu-design-system/docs/internal/mockup-conventions.md) —— 现有条文说「scope 由对象全集推导」，但没说**证据物本身要以什么分辨率被检视**。建议补：*凡以截图 / 缩略图 / 全景图作为 scope 依据时，每一个将被写进交付物的判定，都必须在该证据物的原始分辨率上单独核过；全景图只能用于枚举「有哪些对象」，不能用于判定「对象内部的边界」。*

### ② M23.14 (A) 的行距机制在长句 wrap 时自我失效 —— 规则缺口，非执行错

**实证**：规则给的首选机制是「EN 行 lineHeight = S×1.8 让每个 EN 自带与上一对之间的间隔」。EN 单行时成立；但 PRD 正文多为长句，**EN 自身 wrap 后续行同样吃 1.8 行距**，于是「句内行距」== 「对间行距」，Gestalt 分组当场失效 —— 正是该规则开篇要治的那个病。

**返工成本**：重建全部 6 段正文（14 → 40 个 TEXT 节点），3 次 `use_figma`。

**回流落点**：DS `mockup-conventions.md` §M23.14 (A) —— 建议把 per-bullet 从「等效替代」升为**正文型长文本的首选**，并写明判据：*该 artifact 的 EN 行是否会 wrap？会 → per-bullet；不会（chip / 单行 label）→ lineHeight 机制。* 机器闸已经在提示这件事（它对 per-bullet 节点报 `NOT machine-scanned for LINE SPACING`），但规则正文没给选择判据。

### ③ 比例建议值没再吸附 spacing scale

**实证**：按 M23.14 (A) 的比例算出对间 ≈ S×0.6 ≈ 8、段间 ≈ S×1.2–1.5 ≈ 16–20，我落成 6 / 10 / 20 / 28 —— **四个值没一个在 scale 上**，B-SCALE 全报。scale 真值 `{4,8,12,16,24,32,40,56}` 是去 `audit-mockup-binding-fidelity.mjs:42` grep 出来的，**不在 M23.14 正文里**。

**返工成本**：1 次批量改 13 个容器 + 1 次总闸复跑。

**回流落点**：DS §M23.14 (A) 正文补一句 + 直接列出 scale 集合（或给出 grep 路径），避免每个执行者都要自己去翻脚本。

### ④ U+2019 在 Noto Sans SC 按全角渲染 —— 机检盲区

**实证**：`Pack’s LCD` 的 ZH 行渲染成 `Pack ' s LCD`，撇号两侧各撑出一个空隙。字体白名单闸、glyph 闸、bilingual 闸**全部 PASS**，只有渲染图能看出来。

**回流落点**：DS §M-TXT-ICON-AUDIT 的「Roboto 缺 glyph 清单」旁增设一条**「Noto Sans SC 全角化字符清单」**，首条录入 `’` `‘`（U+2019 / U+2018）。⚠️ 注意 2026-08-06 轮三十一的教训（*擅自把「看起来像特殊字符」的字加进清单 = 自造判据*）—— 本条有渲染图实证，可入清单；入之前建议再实测 `“ ” — …` 等邻近字符，一次补全而不是逐个追加。

### ⑤ 用「本地资源为空」推断「未订阅远程库」—— 用错 API 面当判据（owner 抓出）

**实证**：我用 `figma.variables.getLocalVariableCollectionsAsync()` 返回 `[]` + `getLocalTextStylesAsync()` 返回 `[]`，推出「这个文件未订阅 TVU DS 库」，并据此给 owner 写了一条 action item「启用订阅以解掉 B-COVERAGE 61 条」。owner 质疑：*「当前链接没有做效果图，不应该涉及 DS 设计库的 Token 引用啊……之前的需求也没有订阅设计库组件，也可以直接关联 DS 组件库，现在是不是有什么问题」*。

重核后两件事都错了：

1. **判据错**：`getLocal*` 只返回文件**自己拥有**的本地资源，订阅来的远程库资源不在其中。拿 Config-T 正式文件做对照 —— 它的 `localVariableCollections` **同样是 `[]`**，但 `teamLibrary.getAvailableLibraryVariableCollectionsAsync()` 返回 `TVU Design System / TVU UX Design System` + 两个 Nancy's Design Assets。**产品文件永远是订阅方、从不本地拥有库**，所以「local 为空」对订阅状态零信息量。真判据是 `teamLibrary.*`（TX-IP 实测 `[]` = 确未订阅）。
2. **因果错**：即便订阅了，PRD 卡的颜色也绑不上 —— DS 98 个变量里**零注释色 token**（`annotationColorCandidates: []`，颜色变量全是 `UX/*` / `Color Type/*` 产品层语义），而 M23 卡族的 navy `#2B2D42` / cyan `#33A4FD` 是规则自带值，M-COLOR §C4 还禁止注释 accent 与品牌色混用。⇒ fill/stroke 44 条属结构性不可绑（§M49.1），只有 spacing 17 条订阅后可绑。

**结论「未订阅」碰巧是对的，但当时我手里没有能支撑它的证据** —— 这比结论错更值得记：它意味着当时若文件其实已订阅，我也会给出同样的错断言。

**返工成本**：3 份已 commit+push 的文档 + ledger 各一处订正（1 轮）。

**回流落点**：DS [`figma-technical-reference.md`](../../tvu-design-system/docs/internal/figma-technical-reference.md) —— 建议立一条 Q 级 quirk：*判定「文件是否订阅某库」只能用 `teamLibrary.getAvailableLibraryVariableCollectionsAsync()`；`getLocalVariableCollectionsAsync()` / `getLocalTextStylesAsync()` / `getLocalPaintStylesAsync()` 对订阅状态零信息量（产品文件的 local 恒空）。* 与 ledger 轮三十一那条「引用工具产物前先 `head` 一下它到底有什么」同源 —— **都是没核 API / 产物的语义就用它的返回值下结论**。

---

## 5. 本轮验证有效的做法（同等重要，不只记教训）

> 这一段按 CLAUDE.md「收尾复盘拆分记录：教训 vs 验证过的好方法」写。只囤教训会让判断力朝过度谨慎单向漂移。

| # | 做法 | 本轮实证 |
|---|---|---|
| 1 | **坐标异常先 probe 父子关系，再判是不是违例** | 最终自检报 `overlap: true` / `gap: -861`、卡的绝对 x 从 -1905 变 -1662。若按 sibling 重叠直接「修回原位」，就会**覆盖 owner 的手动布局** —— probe 后发现是 owner 亲手把卡拖进了 Section 并改名 `Changes on Config-T 20260818`。⇒ **凡「我没改过的属性却变了」，先查是谁改的，不要先修。** |
| 2 | **渲染图亲验是机检的补集，不是重复劳动** | 4 次亲验抓到 2 个所有闸都 PASS 的真缺陷（行距分组失效、弯引号全角）。两者盲区不重叠：机检查得了比例与白名单，查不了「读起来是否成组」。 |
| 3 | **Slack 多线解码 + 分辨哪条是需求真源** | 两条同日 thread：确认线（Matt 权威答复 6 条 + 8.4 拍板）与开发内部线（Dave 5 条清单 + platform 10086 落地）。Jira 单号 V4-2392 只在内部线里被贴出，Matt 的答复只在确认线里 —— 只读一条会各缺一半。 |
| 4 | **owner 质疑来源时，逐条给证据链而不是让步或坚持** | 「哪里看到不支持 Return Video？」→ 给出 Dave 清单第 2 条（缩写 `RVF`，所以搜「Return Video」搜不到，这正是 owner 找不到的原因）+ Matt 原话 + 红框 node id。核证据的同时**发现了 Matt 只否定 HDMI 输出**这个真歧义，转化成一次有效的 scope 收窄。 |
| 5 | **主动核交付物之间的一致性** | 我主动报告「PRD req 有一条在 Figma 上没有红框依据」—— 结论错了（它有，在我没放大的图里），但机制对：正因为报了，owner 才澄清位置，PRD 才写准。**结论可以错，一致性核查不该省。** |
| 6 | **规则里没写死的取值，去源码 grep 真值，不猜** | spacing scale 从 `audit-mockup-binding-fidelity.mjs` grep 出 `{4,8,12,16,24,32,40,56}`，一次改对；若按印象填 12/20 会二次返工。 |

---

## 6. 待回流规则清单

**2026-08-20 owner 拍板「现在回流」⇒ 四条全部落地，DS commit [`331aedf7`](https://github.com/NancyZeng0210/TVU-Design-System/commit/331aedf7)**（双远端核实；撞号闸 PASS · 路由覆盖闸 PASS · 脚本语法 OK · pre-commit 全绿）。落点均按 §M-DISCIPLINE.SOURCE 三问判定 —— 四条都是**做法 / 判据**（换个 consumer 仍成立）⇒ 进 DS；**优先并入既有 umbrella，只有 API quirk 取了新号**。

| 规则 | 实际落点 | 简述 | 状态 |
|---|---|---|---|
| 证据物分辨率纪律 | DS `mockup-conventions.md` §M-DISCIPLINE.SCOPE **硬约束 8**（新增）+ Acceptance 补一条 | 全景只能枚举「有哪些对象」，判定「对象内部的边界」必须回原始分辨率；且「我没看到 X」在遍历完全部证据物前不构成「X 不存在」 | ✅ **已回流**（gap ①） |
| per-bullet 升为长文本首选 | DS §M23.14 (A) 机制表**改默认** | 判据 = 该 artifact 的 EN 行会不会 wrap；会 → per-bullet 且**禁用** `EN lineHeight = S×1.8` 那一档；不会 → 原 lineHeight 机制。附「机器闸结构上抓不到这一档」的说明 | ✅ **已回流**（gap ②） |
| 比例值须吸附 spacing scale | DS §M23.14 (A) 数值锚定段 | 明确两步：先按比例算、再吸附 scale；**scale 唯一真源 = `audit-mockup-binding-fidelity.mjs` 的集合**（故意不复制其值进散文，避免两处漂移） | ✅ **已回流**（gap ③） |
| Noto Sans SC 全角化字符 | DS §M-TXT-ICON-AUDIT 新增「反向问题」小节 | 只录实测的 `’`(U+2019)；`‘ “ ”` 标 ⏳ 未实测、明确写「未实测前不得写进本表」（承接轮三十一「不自造判据」教训） | ✅ **已回流**（gap ④） |
| 库订阅状态的判据 | DS `figma-technical-reference.md` **Q29**（新号，`pnpm rule:next Q` 取）+ **jump 表触发行**（同 commit 补，漏了它 scoped-load 永远加载不到） | 只能用 `teamLibrary.getAvailableLibraryVariableCollectionsAsync()`；含 Config-T vs 临时文件的对照实测表 + 「订阅 ≠ 该属性可绑」的连带结论 | ✅ **已回流**（gap ⑤） |
| 注释层 fill/stroke 结构上不可绑 | **落点改了** → `scripts/audit-mockup-binding-fidelity.mjs` 头注释（不是原计划的 §M49.1，理由见下） | 按 STATUS.md 现行口径「各闸的覆盖面与豁免语义在各自脚本头注释且每次运行自印」；顺带补上该头注释**原本完全漏掉的 B-COVERAGE 分项说明** | ✅ **已回流**（gap ⑤ 衍生） |

### 连带发现 — `§M49.1` 是个悬空引用

回流时要找 §M49.1 落点，grep 全 `docs/` 才发现：**规则真源里没有这个段落**。它只存在于 `_metrics/phase0-ledger.md`（多轮）、`retrospection/`，以及 `audit-mockup-binding-fidelity.mjs` 头注释里（B-SEM/B-TYPO/B-EFFECT/B-SCALE 四处都写 §M49.1）；`design-process.md` 只有 **M49** 本体（Design Quality Contract Gate），没有 `.1` 子节。

⇒ 多轮 ledger + 闸脚本一直在引用一个不存在的编号，我上一轮也跟着用了。**本次回流没有沿用它**（第 6 条改落闸脚本头注释）。**留给 owner 定**：是立一条真的 §M49.1（把「已知豁免类别 / owner-deferred 存量债」正式成文），还是把现存引用统一改指向别处（如 §C5 / §M52.1 / 各闸头注释）。⛔ 我没擅自改那些历史引用 —— 它们分布在 ledger 历史行里，属记录不是规则。

> **✅ 2026-08-21 已收口（DS commit [`084c3cc4`](https://github.com/NancyZeng0210/TVU-Design-System/commit/084c3cc4)，双远端 `ls-remote` 核实）**
>
> owner 拍板「收口」后重查，**「立成文」被证伪、走「统一改指向」**：`mockup-conventions.md:3125`
> 写着 `### M52 — Library Fidelity Umbrella（…原 M49，2026-06-25 B-P4 因与 design-process.md
> §M49 撞号…）`，`:3129` 就是 `#### M52.1 库样式 / 变量 Fidelity` —— **正是这段内容，两个月前
> 已改号，内容未变**；`:3169` §Legacy ID Map 还留着映射行。立一条新 §M49.1 会重新制造
> 2026-06-25 已修掉的撞号 + 造出同一事实两份副本。⇒ 两个闸脚本的活引用改指 §M52.1；
> ledger / tracker / _archive 里的**照旧不动**（记录不是规则）。
>
> **同时补掉了让它潜伏两个月的盲区**：`audit-stale-anchors` 本该抓到却抓不到，有两个**各自都
> 不充分**的原因 —— ① `SCAN_FILES` 不扫 `scripts/*.mjs`；② 父族 fallback 把 `M49.1` 回退到族根
> `M49`，而 `M49` 在 design-process.md 里作为**另一条无关规则**存在 ⇒ 放行。新增第 6 类判据
> `retired-id`（真源 = §Legacy ID Map，扫描面 = `scripts/`，无豁免表，退役表空则 fail-closed），
> 五条故障注入含一条双向变异（判据收成仅精确匹配 ⇒ 必须变绿，否则族根那支是空断言）。
>
> ⚠️ 另有两个「看起来该做」的修法被**实测否决、没做**：全局收紧父族 fallback（会让 5 个合法
> id 约 40 处变红）；「每个 Q 都要有 jump 行」的路由闸（`figma-technical-reference.md` 29 个 Q
> 标题 vs jump 表 3 个，而该文件是整份路由 ⇒ 26 条非缺陷，~90% 假阳性）。
>
> **追加 `d976f4fa`（同日第二轮）**：第一版把扫描面只定成 `scripts/*.mjs`、跑绿收工，随后**用闸
> 自己的函数**遍历 `tests/` 复核，发现漏了一处真缺陷 —— `tests/mockup-binding-fidelity.test.ts:12`
> 的 `describe` 名里带着 `§M49.1`。**「扫描面比缺陷面窄」正是这条闸要治的病，它自己先犯了一次。**
> 已扩面到 `tests/*.ts`（实测只多 2 条命中、两条都是真缺陷、零假阳性），并改成**每个面单独
> fail-closed**。⇒ 教训：新闸上线后要拿闸自己的判据函数去扫「我没纳入扫描面的地方」，
> 而不是只看闸报绿。
| 红框标注语义（框+划线 / 仅框 / 框+红字） | **项目 repo** `TVU Pack/docs/specs/2026-08-18-v4-2392-design-record.md` §3 | 属本项目截图约定、非跨产品通用 ⇒ 按 §M-DISCIPLINE.SOURCE 三问留在项目侧 | **已落地** |
| TX-IP 平台判定字段 | **项目 repo** 同上 §1 | `platform_id=10086` / `platform=TX-IP` / `cap_card=NoCard` 属取值 ⇒ 不进 DS | **已落地** |

> 落点判定按 §M-DISCIPLINE.SOURCE 三问过了一遍：前 4 条是**做法 / 判据**（换个产品仍成立）⇒ DS；后 2 条是**取值 / 本项目约定**⇒ 项目 repo。

---

## 7. Model 选型（基于本 session 实证）

- **本轮用 Opus 5 (1M context) 是对的**：任务要在同一上下文里交叉核对 10 张截图 + 2 条 Slack thread（48 条消息）+ 1 个 Jira 单 + 约 8 份规则真源片段，并在 16 次 Figma 写操作间保持一致口径。中途还发生角色切换（UX → 翻译 → mockup）与 owner 三次中途改需求。
- **但要认清：本轮两次错都不是模型能力问题，是流程问题**（没放大看图）。换更强的模型不会修好它，**放大逐图**才会。这类「证据分辨率」缺陷应靠协议堵，不靠模型。
- **可下放给更轻模型的部分**：纯文案翻译轮（#1–#3）、`sync:mockup` + 总闸跑批。**不建议下放**：红框判读、scope 收窄、SYNC 三轮扫查。

---

## 8. 给团队的 action items

**owner（Nancy）**
0. ~~四条 DS 回流拍板~~ → **✅ 2026-08-20 已拍板并落地**（DS `331aedf7`，见 §6）。
   ~~**新增一项待定**：`§M49.1` 悬空引用怎么收（立成文 / 统一改指向）~~ →
   **✅ 2026-08-21 收口，走「统一改指向」**（DS `084c3cc4`）：该号 2026-06-25 已因撞号改成
   §M52.1、内容未变，立新节反而会重造撞号；同轮补掉让它潜伏两个月的两个盲区（新增
   `audit-stale-anchors` 第 6 类判据 `retired-id`）。详见 §6 末。**本轮 V4-2392 回流全部闭环。**
1. ~~在 Figma 里给该文件启用库订阅以解掉 B-COVERAGE 61 条~~ → **2026-08-18 owner 质疑后重核，此条的因果是错的，已改写**（详见 gap ⑤ 与 handoff §4 第 1 条）：
   - 注释层的 **fill / stroke 44 条订阅了也绑不上** —— DS 98 个变量零注释色 token，M23 navy/cyan 是规则自带值。**不是待办。**
   - **spacing 17 条**订阅后可绑（`Basic Size/#4 #8 #16 #32`）。
   - **订阅库的真正必要性在下一轮画 AFTER 效果图**（M32 library-first 要 import DS 组件 instance）—— 若下一轮要在这个文件里画效果图，则需 owner 先启用订阅；只做 PRD 不需要。
2. 考虑给 `3:16`（IP Source 页）的 1/2/3/4 通道切换器**补一个红框** —— req 2 的口径是「wherever it appears」已覆盖，但 dev 按图逐项对照会漏这一处。
3. ~~四条 DS 回流（§6 表）拍板：是规则级问题还是一次性失误。~~ → **✅ 已拍板「现在回流」，四条全部落地（DS `331aedf7`）**，其中 API quirk 取新号 Q29、其余并入既有 umbrella。

**PM / 需求方**
4. **Receiver 端兼容仍 open** —— Dave 2026-08-18 14:57 提的「LR 8.3 之前上报为 TM1000v4」无人回复，Ari 建议先测。不在本单 scope，但会影响 8.4 上线体验。

**下一轮（画 AFTER mockup 时）**
5. 补齐 §6-JIRA 四件套里本轮未产出的三件：UX Delivery 卡（M23.0 canonical 6 段）+ User Journey Map（5-stage）+ Jira requirement 组件 instance，并按 M23.12 与 AFTER 一起收进具名 feature Section。

---

## 附录 — `use_figma` 改动统计

| 类别 | 次数 | 说明 |
|---|---|---|
| 只读 probe | 3 | 环境/字体/变量集合 · parent 归属核查 · 最终自检 |
| 建骨架 + 填段 | 4 | frame + title + meta，6 段正文分 3 批 |
| **返工重建** | 3 | per-bullet 机制重建全部 6 段正文 |
| 修正 | 4 | spacing 吸附 scale · req10+验收 · 5 处红框对齐修正 · Section 名同步 + 弯引号 |
| 自检 | 4 | 每次编辑 confirmed 后按 M-DISCIPLINE.SYNC 跑 |
| **合计** | **16** | 其中 13 次写操作；节点净增 43 TEXT + 13 容器 |

| 验证类 | 次数 |
|---|---|
| `get_screenshot`（红框勘察 10 张 + 交付物亲验 5 次） | 15 |
| `audit:mockup-conformance` 总闸 | 5 |
| `sync:mockup` 缓存刷新 | 4 |
