# Video Sync Multi-Session · Next Session Pickup (2026-05-25)

> 给下一个新 session AI 接力 Video Sync Multi-Session 任务。**起手前必读本文件 + 链接的真源**。本文件 supersedes [2026-05-21](./2026-05-21-video-sync-next-session-pickup.md)。

## 1. 当前状态快照（2026-05-25 收尾）

### Figma 真源（`Micro-Apps-20250923`, fileKey `DtZcMkhNy6qh6jbQQnhreQ`）

| Section / Frame | Node ID | 状态 |
|---|---|---|
| Target page | `4083:8424` | — |
| PRD spec section (`spec-body`) | `4093:86` | ✅ R1 术语刷新 (Sync session / Stream A/B) |
| **Plan A section** | `4119:198` | ✅ 7 frames + 14 双语 Design Rules card |
| M0 · Single Session | `4139:1376` | ✅ Remove **hidden** (list=1) + chip `1/8 sessions` |
| M1 · Multi-Session Default | `4119:199` | ✅ chip `3/8` + selected row Match,Hover + Remove |
| M2 · Syncing Row Expanded | `4139:988` | ✅ 同 M1 + 行展开 |
| M3 · Inactive Row Selected | `4165:950` | ✅（原 OFF Row Selected，已重命名）|
| M4 · Sync Completion Event | `4210:1715` | ✅ 已加 chip + Remove |
| **M-Cap-Full · 8/8 reached** | `4464:2326` | ✅ **新建** 满额边界态 |
| Design Rules card | `4166:1231` | ✅ 14 双语 rules（+ slot cap / + Remove interaction）|
| **Plan B section** | `4186:1478` | ✅ 已重命名 "Syncing/Inactive" |

### Dialog / Annotation frames

| Frame | Node ID | 状态 |
|---|---|---|
| **M-Remove-Dialog · OFF + ON variants** | `4503:5337` 邻区 | ✅ **新建** 用 TVU `Notification` (`theme=dark, status=pop confirm`) detached + source annotation |
| **state-label · M-Cap-Full** | `4508:2713` | ✅ **新建** Cap-Full 帧的 UX 交付说明 |

### 关键决策（已 frozen — 本 session 新增 / 修订）

#### 已确认（本轮 + 累积）

- **2-state model**: `Syncing` (Blue Badge) / `Inactive` (Neutral Badge) — **UI label = "Syncing/Inactive"，不用 ON/OFF 字样**
- **PP page-level 1:N** — LEFT 顶 PP sub-panel 持有
- **Parameters per-session** — RIGHT header `Parameters (Sync session #N)` BRAND 绿绑定
- **Session naming = sequence number** `Sync session #1..#N`
- **0-session 不存在** — PP 自动 bootstrap Session #1（list 最少 = 1）
- **Selected indicator**: BRAND green left rail **4px** (`--sp-xxs`) + `UX/Brand/Match,Hover` fill（depthly mute green，dark-theme readable）— 7 帧统一
- **Per-PP slot cap**: 所有 sessions 都计入（Syncing + Inactive），placeholder `8`，**待 PM 确认**；最少 1（bootstrap），有效范围 1..N；硬编码禁止
- **Remove control**:
  - 位置 = 选中 row 右上角（icon `icon/Edit/Delete` + text `Remove`）
  - 颜色 = `Color Type/Icon/Default` (icon) + `Color Type/Text/Tips` (text)
  - Hover → BRAND red
  - **list = 1 时不渲染**（hidden，不是 disabled — 用户在 M0 上手动验证过）
- **Cap-Full UI**:
  - chip 文案 = `Remove one to add another · 8/8 sessions`（Tips 灰，no bg，无任何 alarm 视觉）
  - 底部 `+ Add another sync session` 置灰禁用 (Disable token)
- **Confirm Dialog** = TVU `Notification` master, `theme=dark, status=pop confirm` — 自带 `[Cancel] [Delete]` 红色 destructive 按钮（命名误导：`Notification` 实际包含 dialog 模式）

#### 视觉层级（未变 / 本 session 不动）

- Row 主标题 = `Sync session #N`（Roboto Medium 14 White，主视觉锚点）
- Slot 信号 = `Slot N/Ch X-X ⇄ Slot M/Ch Y-Y`（Roboto Regular 12 Text_2 灰）
- A:/B: prefix = Roboto Regular 12 Tips 灰
- Delta = Roboto Mono 28（数字）+ 14（ms）+ trend icon
- Parameters header = `Parameters` SemiBold 18 White + `(Sync session #N)` Medium 16 BRAND 绿

### 本 session propagation 矩阵（已全部完成）

| Surface | M0 | M1 | M2 | M3 | M4 | PlanB | Cap |
|---|---|---|---|---|---|---|---|
| Match,Hover bg | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Remove control | **hidden** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Slot chip | `1/8` Tips | `3/8` Tips | `3/8` Tips | `3/8` Tips | `3/8` Tips | `3/8` Tips | `Remove one to add another · 8/8 sessions` Tips |
| State-label | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| ON/OFF→Syncing/Inactive | 34 处文本 + 4 处 frame 重命名 | | | | | | |
| "select source and destination"→"Set Stream A and Stream B" | 5 处 page-wide | | | | | | |

## 2. PM Confirmation Pending

发出的 Slack 回复包含：
- **Q1 答**: cap 计 Syncing + Inactive，placeholder 8，待 PM 确认
- **Q2 答**: 1 PP : N sync sessions，PP 切换 list 整体替换
- **未决问题**: @Mateus — does the PP's own program output count toward the 8?

## 3. Pending Backlog

### 🟠 已存在（上轮遗留）

#### (d) 抽 session row file-local component（高优 architectural）

把当前 7 帧 clone 模式抽成 file-local component master + variants。痛点：本 session 又跑了 3 次跨帧 fan-out（chip / Match,Hover / Remove），都漏过 frame，需反复补。

**variant 轴**: `state` (Syncing/Inactive) × `selected` (Yes/No) × `expanded` (Yes/No) = 8 variants（实际需要 4-5 个）。

### 🟢 本 session 新增 backlog

#### (e) TVU 真源 documentation 回流（跨 file，留单独一轮）

1. `icon/Edit/Delete` (`6379e02068f...`) 加 keywords description: `trash, remove, garbage, bin`
2. `Notification` component set (`23535120dbdc...`) 加 keywords: `dialog, modal, alert, confirmation, confirm dialog, popup` —— 命名误导导致初次搜索 "dialog" 没命中 TVU 真源
3. `popup confirm` (TVU UX Library `6a338d99ce18...`) ：旧库版本，considered deprecated in favor of `Notification` pop-confirm variant

#### (f) design-process.md 加 M-LIFECYCLE-CRUD 规则

`tvu-design-system/docs/internal/design-process.md`：

> **M-LIFECYCLE-CRUD**：任何 first-class entity 设计完成后，必须显式回答 Create / Read / Update / Delete 4 个问题。任一项答 "故意没有" → 必须显式写明 rationale。

**触发起因**：本 session walkthrough 漏了 Delete 检查，到 PM raise cap 限制时才发现 list 无限增长死锁。

#### (g) 更新 design-walkthrough skill

`/Users/nancy/Documents/AICoding/VS_Code/MicroApps/.claude/skills/design-walkthrough/SKILL.md` Rule Compliance table 加一行：

```
| M-LIFECYCLE-CRUD | Create/Read/Update/Delete 4 项是否都有显式答案 | ✅/❌ |
```

#### (h) M-FANOUT-CHECKLIST（候选规则）

本 session fan-out 反复漏：第一次只加到 M1，第二次又只补到 M1+Cap-Full，第三次才意识到要 7 帧统一。`figma-use` skill 或 design-process.md 应该有一条：

> 任何视觉/交互改动 → propagate checklist：M0 / M1 / M2 / M3 / M4 / PlanB / Cap-Full + Design Rules card + state-label（每帧一条）

## 4. 起手必读链路（按序）

1. 本文件 ↑
2. [2026-05-20 walkthrough fix doc](../audits/2026-05-20-video-sync-m3-walkthrough-fix.md)
3. [2026-05-21 prior pickup](./2026-05-21-video-sync-next-session-pickup.md) — 历史决策
4. `MicroApps/docs/MICROAPPS_PRODUCT_CONTEXT.md` §5.5
5. `tvu-design-system/docs/internal/mockup-conventions.md` 全文
6. `tvu-design-system/docs/internal/design-process.md`（含 M-PRD-EG / M-CARDINALITY / M-IA-FIRST + **待加** M-LIFECYCLE-CRUD）
7. `tvu-design-system/docs/internal/figma-component-catalog.md` Badge / Notification 段
8. `tvu-design-system/docs/internal/figma-technical-reference.md`

## 5. 关键 ID 速查（本 session 新增）

| 用途 | Node ID / Key |
|---|---|
| M-Cap-Full frame | `4464:2326` |
| M-Cap-Full chip (red 8/8) | `4464:2334` |
| M-Cap-Full session-list | `4464:2336` |
| M-Cap-Full disabled add-row | `4464:2412` 附近 |
| M-Remove-Dialog container | `4503:5337` 附近 |
| state-label · M-Cap-Full | `4508:2713` |
| M3 Remove control (source for fan-out) | `4458:2322` |
| M1 chip (source for fan-out) | `4462:2326` |
| Design Rules card Rule 13 (slot cap) | `4433:2322` 父 frame |
| Design Rules card Rule 14 (Remove interaction) | `4440:2396` 父 frame |
| TVU `Notification` component set | key `23535120dbdc93bf90af9a118b5091e58b590dc6` |
| TVU `Notification` `theme=dark, status=pop confirm` variant | `4482:1204` |
| TVU `icon/Edit/Delete` | key `6379e02068f1cad59776d408d63cb9f4b416a594` |

## 6. 关键真源 Variables 速查（本 session 用过）

| 变量 | Key | 用途 |
|---|---|---|
| `UX/Brand/Match,Hover` | `00a000b667558472841ad6a11e94c7ce8a878a3a` | Selected row bg fill |
| `Color Type/Text/Tips` | `b3b5983a60f92902d446e8e25d3445fb4711eb16` | Chip text / Remove tooltip text |
| `Color Type/Icon/Default` | `e8580f8fb376dbba245f38c8562e9c909b52fb91` | Remove icon |
| `Color Type/Text/Disable` | `b7e2c0154e7f3fae0443d0deef6923be8c41dd87` | Disabled Add row + (was M0 Remove disabled state) |
| `UX/Red/Default` | `a3f82a4b2c6c4610650cc136428e83cbd9b65736` | (initially used for cap chip — later reverted to Tips per UX feedback) |

## 7. 新 session 起手协议（继承 2026-05-21，补充）

```
Step 1: 读本 pickup doc + 起手必读 8 步 ↑
Step 2: 跑 5 个 cardinality self-check (M-CARDINALITY)
Step 3: 跑 M-LIFECYCLE-CRUD self-check（本 session 新增建议）
Step 4: 若 PRD 含 "例如/e.g." → 显式问 user (M-PRD-EG)
Step 5: Multi-object feature → IA 树 + Selection model 先于 mockup (M-IA-FIRST)
Step 6: 任何视觉/交互改动 → 执行前列 propagate checklist（M0–M4 + PlanB + Cap-Full + Design Rules + state-label）
Step 7: 写 use_figma 前 mandatory `search_design_system` — 不要先用 primitives 拼 (本 session 教训)
Step 8: 进 Phase 0 / 实施
Step 9: post-build audit + 终态 spot check
```

## 8. 本 session 验证 spot check（接力者起手用）

```js
// 验证 chip 文案 + 颜色 binding
const m1Chip = await figma.getNodeByIdAsync('4462:2326');
const capChip = await figma.getNodeByIdAsync('4464:2334');
return {
  m1ChipFills: m1Chip.fills,             // 应 = [] (no bg)
  m1ChipText: m1Chip.findOne(n => n.type === 'TEXT').characters,  // 应 = "3/8 sessions"
  capChipText: capChip.findOne(n => n.type === 'TEXT').characters, // 应 = "Remove one to add another · 8/8 sessions"
};

// 验证 selected row binding
const m3Row = await figma.getNodeByIdAsync('4165:1450');
const fill = m3Row.fills[0];
return {
  rowFillBound: !!(fill.boundVariables && fill.boundVariables.color),
  rowVarIdContainsMatchHover: String(fill.boundVariables.color.id).includes('00a000b6'),  // 应 = true
};
```

不匹配 → 文件可能被人改过，先 ask user 当前状态再继续。
