# 2026-06-01 Source Type Mockup Batch — AI 协作复盘

## TL;DR

**总任务数**：4 个 Figma 画图任务，1 个 session  
**最终交付**：SRT Listener 完整弹窗 × 1 + 22 个 source type 完整弹窗 + Device 表格对齐修复 + NDI Discovery Server 状态弹窗  
**核心 process gap**：3 个技术 bug（TEXT node 异常、page 切换错误、width FILL 未生效）+ 1 次重复 frame 事故（导致 44 个 frame 需手动清理）  
**关键 insight**：克隆操作的隐性假设（当前页、layoutSizing 继承）在批量执行时会放大为不可逆事故

---

## Session 概览

| 项 | 值 |
|---|---|
| 任务起点 | 用 437:97012（SRT Caller 弹窗）为模板，在 581:36846 画 SRT Listener |
| 最终落地 | 23 个完整弹窗（1 SRT Listener + 22 other source types） + 2 个修复 + 1 个 NDI 状态补画 |
| 参考文件 | 581:37030（Frame 3311，source type 参数库）、437:97012（SRT Caller 完整弹窗模板）、428:55697（NDI Discovery Server 参数） |
| 页面 | Source & Destination (lovable)（428:53644） |

---

## 时间线 / 主要迭代

| # | 任务 | 问题触发 | 改动量 | 额外轮次 |
|---|---|---|---|---|
| 1 | SRT Listener 弹窗（581:36846） | Latency 宽度未对齐，INSTANCE FILL 未生效 | 1 修复 | +1 |
| 2 | 22 source type 批量弹窗 | TEXT node TypeError → page 切换错误 → 44 个重复 frame | 调试 4 轮 | +4 |
| 3 | Device 表格右对齐修复（597:8837） | rows FIXED 660px 在 922px 容器内 | 1 修复 | 0 |
| 4 | NDI Discovery Server 状态（613:2808） | — | 一次成功 | 0 |

---

## Top 3 Process Gap

### 1. page 切换隐性假设（返工成本：最高）

**实证**：批量创建脚本第一次运行时 `figma.currentPage` 是 "symbol"（非模板所在页），22 个 frame 写入错误页面。修正后重跑，正确页面出现 44 个重复 frame，需额外 2 轮脚本清理。

**根因**：`figma.currentPage` 随 Figma 桌面端活跃页面变化，不等于 `template.parent`。

**回流规则**：任何 `use_figma` 写操作前，先验证：
```javascript
if (figma.currentPage.id !== template.parent.id) {
  await figma.setCurrentPageAsync(template.parent);
}
```

### 2. TEXT node `.children` 访问抛异常（返工成本：中）

**实证**：节点探查脚本第一版在遍历 formContainer 子节点时，遇到 TEXT node 直接访问 `.children` 报 TypeError，导致脚本中断。需要重写带类型守卫的版本。

**根因**：Figma Plugin API 中 TEXT node 的 `children` getter 直接抛错而非返回 undefined/null。

**回流规则**：所有递归遍历子节点前必须做类型守卫：
```javascript
function hasChildren(n) {
  return ['FRAME','GROUP','COMPONENT','INSTANCE','SECTION','COMPONENT_SET'].includes(n.type);
}
```

### 3. INSTANCE 克隆后 layoutSizingHorizontal FILL 未生效（返工成本：低）

**实证**：SRT Listener 弹窗中 Latency（`Elem/bar&input/normal` INSTANCE）克隆后设 `layoutSizingHorizontal = "FILL"` 无效，实际值仍为 FIXED 672px，需额外一轮 `get_screenshot` 发现并修复。

**根因**：部分组件实例有内部约束阻止外部覆盖 sizing 属性，需要在克隆后显式验证再决定用 resize() 兜底。

**回流规则**：克隆 INSTANCE 后验证：
```javascript
try { clone.layoutSizingHorizontal = "FILL"; } catch(e) {}
// 验证是否生效
if (clone.layoutSizingHorizontal !== "FILL") {
  clone.resize(container.width, clone.height);
}
```

---

## 高效对话建议（按 ROI 排序）

### 给 AI（自我提醒）

1. **批量操作前先单例验证**：在循环 22 个 source type 前，先跑 1 个，截图确认正确，再批量
2. **克隆操作三件套**：① 确认目标页 ② 克隆 ③ 验证关键属性（width/layoutSizing）
3. **不要信任"运行成功"**：脚本返回无报错 ≠ 结果正确；批量创建后立即查 frame count

### 给 UX/PM（提需求方）

1. **多状态一次说清**：本次 NDI 有 Manual 和 Discovery Server 两种状态，如果最初就说"两种状态都画"，可省去补画一轮
2. **参数来源直接提供**：提供了 428:55697 作为 Discovery Server 参数参考，极大减少了 AI 猜结构的成本；类似任务建议都直接给参考节点链接

---

## 已回流 / 待回流规则

| 规则 | 回流落点 | 状态 |
|---|---|---|
| use_figma 前 setCurrentPageAsync | `figma-technical-reference.md §Q18` | ✅ 已回流 |
| TEXT node hasChildren 类型守卫 | `figma-technical-reference.md §Q19` | ✅ 已回流 |
| INSTANCE clone 后验证 layoutSizingHorizontal + 表格行宽 FILL 递归处理 | `figma-technical-reference.md §Q20` | ✅ 已回流 |

---

## 附录：今日 use_figma 改动统计

| 操作 | 目标 frame | 结果 |
|---|---|---|
| 克隆 SRT Caller → SRT Listener | 581:36846 | ✅ |
| 修复 Latency width | 581:36846 | ✅ |
| 批量克隆 × 22 source types（第 1 次，错误页） | symbol page | ❌ 已清理 |
| 批量克隆 × 22 source types（第 2 次，正确页） | 428:53644 | ✅（44 → 22 去重） |
| 修复 Device 表格行宽 | 597:8837 | ✅ |
| 克隆 NDI + 替换 Discovery Server 状态 | 613:2808 | ✅ |
