# Phase 0 Ledger

记录每次执行 Phase 0 mapping 的指标。**Append-only**——只追加，不修改既有 entry。

## 维护规则

- **仅限消费 TVU 设计系统的产品**——本 ledger 度量的是 TVU catalog 对消费方的覆盖率，所以"产品"必须 import / 消费 `tvu-design-system`。**非消费方**（挂 legacy 本地库的 mockup，如 Config-T / TVU Pack legacy 文件）即使走了 mockup Phase 0，覆盖列全 N/A 对指标无意义、反而污染异常启发式 → **不在此 append**，记到该产品自己的 docs。（实证：2026-06-01 V4-1865 TVU Pack legacy mockup 误加 → 删除，commit `5f4fe820`）
- 由执行 Phase 0 的 AI session **wrap-up 时**追加一行（[`code-conventions.md`](../code-conventions.md) R5 §7 强制）
- Trivial 任务（element < 3，按 R0 / M0 跳过 Phase 0）不 append
- Pre-Phase 0 后才进 Phase 0 的任务，按 Phase 0 一行 append（Pre-Phase 0 自身不单独 append）
- US-4（Figma frame → code mirror）走了 Phase 0 → 同样 append

## 列说明

| 列 | 含义 |
|---|---|
| 日期 | 任务完成日期 (YYYY-MM-DD) |
| 产品 | 消费 TVU 库的产品名 (如 `MicroApps Console`) |
| 类型 | `code` / `mockup` |
| 任务简述 | 1 句话 |
| Element 数 | Phase 0 mapping table 行数 |
| 🟡 命中 | catalog 命中 🟡 skeleton 状态的 element 数 |
| 🟡→✅ 升级 | 本任务实证后回填 [`figma-component-catalog.md`](../figma-component-catalog.md) 升级 ✅ verified 的数量 |
| ⚠️ 真 gap | catalog + Figma MCP 双层都 miss、最终自画的 element 数 |
| 备注 | 1-2 句关键发现 / 异常 |

## 异常启发式（AI 在每次 session 起手扫末 5 行后主动提醒）

| 异常 | 暗示 |
|---|---|
| **表完全空（0 行 entry）** | **首次使用，不报警**——AI 仅提示 "Ledger 完全空，本次会是首条 entry" |
| 末 5 条 `🟡→✅ 升级` 全是 0 | Phase 0 可能没系统性查 catalog，只走形式 |
| 末 5 条 `Element 数` 全 < 3 | 都触发了 trivial 跳过，Phase 0 没真跑过 |
| 最近 entry > 60 天前（且非空表） | ledger 失修，可能 wrap-up 没在 append |
| `⚠️ 真 gap` 占比 > 30% | 自画门槛松了或 Figma library 有真覆盖空洞，需 sync 提速 |

提醒话术示例：

> "扫了一下 ledger 末 5 条，🟡→✅ 升级都是 0——可能上几次 Phase 0 没真去 grep catalog。本次我会把 grep query 都打印出来给你看。"

## Entry log

| 日期 | 产品 | 类型 | 任务简述 | Element 数 | 🟡 命中 | 🟡→✅ 升级 | ⚠️ 真 gap | 备注 |
|---|---|---|---|---|---|---|---|---|
| 2026-05-11 | TVU SaaS Dashboard (Usage Service) | mockup | US-3 增量：新建 Cost per Token Trend dashboard page，build Option 2 (hero margin chip) + Option 3 (subtitle business summary) 留 PM Review；含 sidebar 注释面板 + connector sharedPluginData registry 模式 | ~12 | 1 (Compare Item/YTD file-local 实证) | 0 | 1 (chart vector ad-hoc — chart primitives 不在 library scope) | Triple rule birth session: M21 + R6（增量优先复用 local）+ M22（user design ask Pre-Phase 0 gate）；规则 self-test 失败实证（立完 M21 当天违 sibling 视觉合同）；annotation-connector registry 模式可复用。详 retrospect 2 篇：trifecta-rule-update + saas-dashboard-2-option-pm-review |
| 2026-05-14 | MicroApps Console | mockup | US-3 增量：Plan B Figma 完整交付 — 5 frames (1920) + 8 新 file-local 组件 (PlanB 前缀) + 9 M23 navy bilingual annotations；Plan A 视觉合同 mirror (Card #1f1f1f / Counter Pill / line-deep stroke) | ~22 | 5 (Counter Pill / State Pill / Action Cluster × 3 / APP Icons — Plan A file-local 实证 verified) | 1 (TVU library `Pagination` 经 search_design_system 找到并替换 file-local `MicroApp PlanB Pagination` → 后者已删) | 4 (library 缺：bg-layer2 hex token / brand-bg-18 alpha token / left-chevron icon / empty-tray + pause icon) + 1 (Top bar 默认 Right_content 无通知铃铛) | Q2 (M18) + Q3 (M19) 完整应用；实证嵌套 instance `paint.opacity` 失效新 edge case → solution: child Rectangle + `node.opacity` 替代 paint.opacity（可传嵌套 instance）；建议回流 figma-technical-reference.md 新增 Q-rule。Handoff: `MicroApps Console/docs/2026-05-14-plan-b-figma-handoff.md` |
| 2026-05-14 | MicroApps Console | mockup | US-3 retrofit：Plan B Figma M23 完整化收尾 — 拆 3 个 row 容器、9 annotations 重排到 frame 列下方对应位置（F1 列 5 个：#2/#6/#9/#1/#4；F2 列：#7；F3 列：#5；F5+F6 跨：#8；#3 在 F1/F2 间）；建 18 VECTOR connectors（手画 arrowhead per Q6）；建 2 state-group GROUPs `_flow-state-1/2` for #4 Sidebar Collapse + 1 内部转换箭头 + condition label；建 3 condition label GROUPs `_` for #5 三种 scope；写 reconnect map JSON (9363 bytes) 到 page sharedPluginData ns=`ux_annotation` key=`plan_b_reconnect_map` | 0 (无新 element mapping，纯 retrofit) | 0 | 0 | 0 | 验收：18 connectors + 6 GROUPs + 6 ZH ranges 全部 Noto Sans SC@9px opacity≈0.45 + Roboto Medium@11px@#33A4FD ✓。所有 connector 严格在 Plan B section 内部。前一 session "M23 connectors 缺失" 缺口闭环。Pickup: `MicroApps Console/docs/2026-05-14-plan-b-figma-connectors-pickup.md` |
| 2026-05-14 | MicroApps Console | mockup | **Layout refactor v2** ("annotation 贴效果图" 用户反馈)：上一 retrofit 用横向 1 行 6 frames（13332 wide）造成 connectors 全是穿越整个 section 的长对角线。重构为**纵向 stack**：6 frames 全部纵向排列在左栏 (sec x=40)，9 annotations 全部在右栏 (sec x=2080) 紧贴对应 frame y。Section 从 13332×5417 改为 3280×9806。Connectors 全部短水平 / L 形（vertical-first L 用于跨行：垂直段走右栏 margin、水平段进入 target frame）。删 #3→F1 + #5→F1 长跨行 + orphan cond-#5-F1，14 VECTORs + 3 cond labels + 2 state groups。Reconnect map v2 (9634 bytes) 写入 page sharedPluginData | 0 | 0 | 0 | 0 | 新增工程经验：**M23 layout 约定 — annotation 模块必须放效果图旁边、用短水平 / 折线（vertical-first L 适合跨 frame 行）连接、严禁长对角穿越 section**。建议回流到 mockup-conventions M23 章节 "layout 选择" 子段。验收：14 connectors stroke #33A4FD 2px ✓ + 跨行 L 形垂直段走 sec x=2080 右栏 margin (annotation 左缘) 不穿越 frame 内容 ✓。Pickup: `MicroApps Console/docs/2026-05-14-plan-b-figma-connectors-pickup.md` |
| 2026-05-14 | MicroApps Console | mockup | **Layout refactor v3** ("Plan A 横向流程 / 检查 overlap" 用户反馈)：v2 纵向 stack 错了方向 + 拉到 y=18195 压到 sibling section "MicroApps PlanB — Local Components" (y=15463-17663) — **double-bug session-end check 没做**。重构为 **Plan A 风格 horizontal pair**：3 rows × 2 cols 按 view 配对（Row1 Overview=F1 Admin+F3 User / Row2 AppDetail=F2+F4 / Row3 Empty=F6+F5），annotations 在 frames **上下左右**（参考 Plan A）：#1 header 左上 / #2 #6 #9 ABOVE F1 / #4 + state group LEFT of F1 / #3 #5 BETWEEN F1↔F3 / #7 BETWEEN F2↔F4 / #8 BETWEEN F6↔F5。Section 6080×5340，与 PlanB Local Components gap 1734 px ✓。14 VECTORs + 2 state groups + 3 cond labels (rebuilt) + reconnect map v3 (8090 bytes) | 0 | 0 | 0 | 0 | **2 个 layout 经验同源**：(1) **Plan A 是 source of truth** 用户 Plan B 跟 Plan A 一致是核心需求 — 设计 layout 前必须先 probe Plan A；(2) **session-end 必须 probe 所有 sibling sections 检查 overlap** — section.resize 后 bounds 变化可能压到邻居。**建议回流**：mockup-conventions M23 "layout 选择" 子段 + 起手协议加 "若产品已有 sibling Plan/version section，必先 probe 其 layout 风格当 source of truth" + wrap-up 协议加 "section.resize 后 mandatory probe sibling sections overlap"。Pickup: `MicroApps Console/docs/2026-05-14-plan-b-figma-connectors-pickup.md` |
| 2026-05-14 | MicroApps Console | mockup | **F1 Walkthrough audit via subagent + v3.1 + v4 闭环** (用户提出 "design 后需 dev/QA 视角自检走查 / 推荐 skill")：发现 `tvu-design-mockup` skill **完全没含 pre/post-design gate**。Dispatch subagent (Sonnet) 跑 `design-walkthrough` skill 做 F1 6-section audit (72K tokens, $0.22) — 抓出 5 个 P0/P1 (3 个被 self-review 漏)：empty states ~43% PRD 覆盖 / App Picker mid-state 缺 / A11y 缺 / Action Cluster matrix 缺 / M25 hover silent-reverted。**用户进一步抓 connector flow 问题**——v3 有 3 个 connector tip 错位 (#6 偏 58px / #8 偏 68-89px) + #5 两条横段穿 F3/F4 frame 内容。**v3.1 修复**：3 tip 重对位 + #5 改用 U-3seg routing 绕开 frame；并 verify Q7 M25 hover paint.opacity 跨 context 持久 (0.10 ✓)。**v4 补图**：Row 4 加 6 个 variant-state mini-frames (Empty B/C/D instance 现成 variants + Loading skeleton + Sort-active + App Picker dropdown) 闭环 P0-1 + P0-2。Section 6090×6050，gap 1024 to Local Components ✓ | 0 | 0 | 0 | 0 | **3 条 process gap 实证 + 建议回流**：(1) **subagent F1 audit ROI 极高** ($0.22 抓 5 P0/P1)，建议 `tvu-design-mockup` skill 协议加 step 8.5 mandatory post-design audit via subagent；(2) **design-walkthrough skill 6-section checklist 漏 "Connector tip accuracy" 第 7 section** — 即"每条 declared connector tip 实际是否落 target element bbox 内 (容差 AH)"，本次靠用户抓出；(3) **wrap-up 协议加 sibling section overlap probe**（v2 → v3 因此犯错）。详 audit report: `MicroApps Console/docs/audits/2026-05-14-plan-b-f1-walkthrough.md` |
| 2026-05-14 | MicroApps Console | mockup | **M2 Library-first audit + V1-V5 修复** (用户抓 5 处 M2 违例 + 1 处 stale handoff debt)：(V1) Sidebar count badge × 12 处手画 Frame+TEXT → TVU `Badge` (key `4db5246d...`) instance；**架构教训**：第一版把 Badge 嵌入 19×15 旧 Frame → 视觉撑爆，redo 删 Frame 让 Badge 作 row 子节点直接替代槽位。(V2) App Picker 8 placeholder rect → file-local `APP Icons` (3:14402) Green variants instance。(V3) TEXT "↑" → TVU `icon/Arrow/Sorting` (key `36c09416...`) instance。(V4→V5) 6 处 Unicode `‹/›` TEXT chevron → V4 误用 `icon/Arrow/Left/Right` (大箭头语义) → V5 改 `icon/Arrow/Previous/Next` (小 chevron 正确语义)；并修 breadcrumb auto-layout bug (`parent.appendChild` 把 icon 排到 horizontal layout 末尾 — 改用 `insertChild(0, ...)`)。(staleDebt) BRIDGE-MOCKUP-003 stale claim "chevron 未发布" → search_design_system 实际有 → handoff doc void + M15.1 新规则 (handoff debt 必 re-verify) | 0 | 0 | 0 | 0 | **4 条 process gap 实证 + 已回流**：(1) **M0 scope clarification** (mockup-conventions.md): variant state minis / state group 内嵌 UI / annotation 内嵌 UI 全不算 trivial，必须做 M0 mapping (Row 4 mini-frames 跳 M0 是 V1-V4 的根因)。(2) **M15.1 (design-process.md)**: 继承前 session handoff doc "library debt" claim 必须 re-verify search_design_system — stale claim 在 session 间传递会变接受的事实。(3) **Auto-layout child positioning bug**: HORIZONTAL auto-layout 用 `appendChild` 排末尾，必须 `insertChild(index)` 显式指定位置。这是 figma-technical-reference 候选新 Q-rule。(4) **Icon 语义先 swap menu 看命名再选**: Left/Right (大箭头, back/return 语义) ≠ Previous/Next (小 chevron, navigation 语义) — 工程师 vs 设计师术语对齐 |
| 2026-05-14 | MicroApps Console | mockup | **Session-end 完整回流批次** (用户最终指令："session 中出现的问题，总结出规则，回流到 TVU 设计规范")：基于本 session 完整问题清单 — 与已有规范交叉对照后只回流**新规则不重复**。Copy icon table cell pattern (text hug content + `icon/Edit/Copy` 紧跟 + Icon/Default 色绑定) + empty placeholder ("—" 不可复制，用 Text/Placeholder & Button 色) + center-ellipsis truncation spec | 0 | 0 | 0 | 0 | **5 条新规则全部 committed**：(1) **Q8** (`figma-technical-reference.md`) — HORIZONTAL auto-layout 子节点必用 `insertChild(index, n)` 而非 `appendChild`（appendChild 排末尾被 auto-layout 接管，x/y 无效）。(2) **M27** (`mockup-conventions.md`) — Sibling Plan/Version Layout Consistency：同 page 多 plan/version section 时，新 section 必 mirror sibling layout 风格（横/纵 / pair 方式 / annotation 位置 / connector 形态 / 长宽比 5 维度）。违例 history: Plan B v1-v3 三轮 retrofit。(3) **M28** (`mockup-conventions.md`) — Sibling Section Overlap Probe：section.resize 后 mandatory probe 所有 page 上其他 SECTION 检查无 bounds 重叠，handoff doc 必含 gap 数。违例 history: Plan B v2 压 PlanB Local Components 2200px。(4) **M29** (`mockup-conventions.md`) — Table Cell Content Pattern：Copyable (text hug + `icon/Edit/Copy` 紧贴 + Icon/Default 绑定) vs Empty Placeholder ("—" 不加 icon + Text/Placeholder & Button 色)，自动检测 text.characters.trim() ∈ {"—","-","–"} 走 Form 2。center-ellipsis dev-side。(5) **M23.6** (`mockup-conventions.md`, M23 extension) — Connector Tip Accuracy + Frame Content Avoidance：tip 必落 target bbox 容差 ≤ AH (8px)；中间路径不穿 frame 内 UI 内容（horizontal-first / vertical-first / U-3seg 决策树）；reconnect map 必含 `tipCanvas: {x, y}` 字段供 audit。违例 history: Plan B v3 #6/#8 tip 偏 58-89px + #5 横段穿 F3/F4。(6) **M14.1** (`design-process.md`, M14 extension) — Icon 按 use-case 语义选不按 name 字面匹配：Arrow namespace 内 Left/Right (back/return 大箭头) ≠ Previous/Next (navigation 小 chevron) ≠ Sorting/Dropdown/Double up 等，看 Figma swap menu 命名 + import sample 视觉双 verify。违例 history: V4 用 Left 当 chevron 错 6 处 → V5 改 Previous |
| 2026-05-19 | MicroApps Console | mockup | **Video Sync Multi-Session feature v0** — 新 page (node `4083:8424`) 上交付 PRD spec section（6 卡片双语 EN/ZH）+ 2 frame mockup (M1 default 5-row list / M2 row-1 expanded R2) + M23 state label chips × 2 + Design Rules card。PRD 初版含 OQ + UX 推荐卡片 → 用户反馈 OQ 不属 PRD（PRD = 对外 spec / OQ = 内部 UX 思考）→ 删除 OQ 卡片，6 条推荐**作为设计决策**落到 mockup（Q3 排序改为 urgency-based: Syncing → Failed → Done → Idle / Q4 Failed row 含 Retry primary + Detail ghost / Q6 delta 三段阈值 + trend arrow）。Top bar 用 cloned Plan B instance (M1 hard rule)。Stream A/Stream B/Parameters/Live Metrics 4-column expand panel | ~25 | 0 | 0 | 11 (TVU library swap pending — Badge × 10 / Button/dark M × 7 / Tab/Item × 5 / Drop down × 7 / icons trend+chevron+warning) | **设计决策**：(1) 按 urgency 排序（Failed 提前于 Done）— 直播场景错过赛事损失大，沉默失败必须高位。(2) Live Metrics 独立 column — delta hero + trend + update cadence 集中在 expand panel 右侧，避免在 collapsed row 信息密度爆炸。(3) v0 全 file-local 视觉 — dev 阶段必须做 Library Swap Pass（详 handoff doc Library debt 段）。(4) 跳过 M23 state-transition connector（M1→M2）— 当前为静态 spec，user 流程仅"click chevron"单点不必画 VECTOR。**process gap 候选**（不强回流，待后续重复出现确认）：PRD spec 草稿写多了 OQ 卡片需用户提醒；建议 `tvu-design-mockup` 起手协议加 "PRD spec card 限于 Background/Goals/Scope/Requirements/Baseline 五类，OQ + UX 推荐属内部思考不入 PRD"。Handoff: `MicroApps Console/docs/2026-05-19-video-sync-multi-session-handoff.md` |
| 2026-05-19 | MicroApps Graphics Insertion | mockup | **Graphics Insertion · Dual Preview (PVW + PGM)** — 新 page (`4083:10338`) 上 Before/After sibling pair (1747:2764 clone + 新版 1920×1080)。新版拆分单预览为 PVW(左·绿草占位) + Mid Ops column (3 layer btns + Overlay Cut brand-green + Video Cut ghost) + PGM(右·navy+红色 chyron) + 左右外侧 audio meter dB scale。PVW 底部 🎧Preview + Clear overlay / PGM 底部 Remove overlay + 🎧Program + 16:9 format dropdown。Layer panel + 底部 Default Preset/SRT/Go Live 行从 reference clone 保契约。M23 双语：header chip + 5 state chips (split / mid-ops / pvw-bottom / pgm-bottom / audio-meters) + 5 VECTOR connectors (3-seg L vertical-first, reconnect map 1069 bytes) + 全双语 PRD rules card (Background/Core Reqs/Reference Comparison) | 22 | 3 (input box/filled / select box/filled / Cut Hard cut) | 3 (3 个全部 verified during build — input/select/cut keys 全 confirm) | 3 (PVW/PGM video container 自画 / Audio meter 自画 🟡 入库候选 / Mid-ops layer btn 自画混合 library icon) | **设计决策**：(1) Before frame 用 instance clone (vs duplicate) — 与原 1747:2764 保契约，源 frame 改时跟随。(2) Audio meter 外侧对称布局 (L outer + R outer) — 双预览整体视觉对称，per 用户需求 "左右两侧 dB 刻度"。(3) Overlay Cut brand-green (UX/Brand/Brand via `Button color=green` 等价) — 强调主操作。(4) Layout invariant "left=video / right=Layer panel" 保留 MicroApps 通用契约（用户主动澄清）。**已知 deferred**：M-COLOR §C3 — After frame bg 用 hex `#0a0a0a` 未绑 Layer_1 variable (key 需 search_design_system variable filter 拿)；下次 session import variable + Q2 two-step bind。Handoff: `MicroApps/docs/2026-05-19-graphics-insertion-dual-preview-handoff.md` |
| 2026-05-19 | MicroApps Console | mockup | **Video Sync Multi-Session v0 → v2 rebuild** — 用户连环 3 轮 feedback：(1) OQ 不入 PRD → 删 OQ 卡片；(2) v0 全 file-local 视觉 + 手写 hex 色，未遵 TVU 设计规范 → "M0 也应按规范来，否则 @TVU mockup 存在的意义" → 实例化 TVU library 19 个 + 色值对齐 dark palette；(3) 漏 Micro Apps LEFT/RIGHT 布局规则（LEFT 信号 1168 / RIGHT 参数 680，Graphics Insertion 例外）→ 写硬规则 §5.5 进 `MICROAPPS_PRODUCT_CONTEXT.md` + 存项目 memory + 删 v0 重画。**v2 deliverable**：1 frame (1920×1080) Top bar (TVU lib clone) / sub-header (Tab/Item filter chips × 5 + New Sync Button) / LEFT panel (5 rows w/ Badge × 5 + Button × 7) / RIGHT panel (Parameters/Video Sync cloned from Plan B 915:25490)。**色值全 TVU dark palette hex literal**（cross-file variable binding 推迟，variable key 在 manifest 不可达）| ~20 | 5 (Plan B Top bar / Page_Title / Parameters/Video Sync symbol / Drop down / Stream A-B layout pattern 全 verified) | 0 | 1 (cross-file variable key 不可达 — file-local container 色绑定推迟) | **3 条 process gap 回流**（待用户拍板入哪个真源）：(1) `@TVU mockup` skill 起手协议应**强制加** consumer `PRODUCT_CONTEXT.md` 必读 — 本次起手只读了 tvu-design-system 真源，漏 MicroApps 项目自己的 §5.5 layout 规则。(2) "v0 file-local，dev 阶段 swap" 思路违反 M32 + 硬规则 #4 — 应在 mockup 第一笔就用 library + token，不留 swap debt。(3) PRD spec 卡片范围应严格限 Background/Goals/Scope/Requirements/Baseline 五类，OQ + UX 推荐属内部思考不入 PRD。Handoff: `MicroApps Console/docs/2026-05-19-video-sync-multi-session-handoff.md` |
| 2026-05-20 | MicroApps Graphics Insertion | mockup | **v2 spec revision** (用户反馈：(1) 视频必须 16:9 (2) 不要转场切换 (3) Output 一个 Go Live 足够 (4) 严格左/右布局：左=Input/Video Preview/Output，右=Settings)：PVW/PGM resize 500×540 → 512×288 (ratio exact 1.7778 ✓) + audio meter h=540→288 对齐 / 删除 Mid-Ops 列 Video Cut button + divider / 删除 PGM 底部 format 下拉 + Program 标签移到右侧 / 删除顶部 SRT 输入行 + 底部 Default Preset/Go Live 行 / 左面板重建为 ● Input section (SRT URL + hint) + ● Video Preview · 16:9 fixed + ● Output (Go Live 大按钮 + hint) / 右面板重建为 ● Settings + Default Preset + Layer panel (resize 620×780) / 重建 M23 layer：删 5 旧 chip+5 旧 connector + 重建 header chip + 5 new chips (Input/Video Preview/Mid Ops · Overlay Cut/Output Go Live/Settings) + 5 new VECTOR connectors (3-seg L vertical-first, tipCanvas v2 reconnect map 1136 bytes) + 重写 PRD rules card 4 sections (Background / Layout Contract / Core Reqs / Reference Comparison) | 0 (无新 element mapping，纯 spec 修订) | 0 | 0 | 0 | **设计契约更新**：(1) MicroApps 通用布局契约**升级 / 精确化** — 原"左视频右图层"扩展为"**左侧 = Input/Video Preview/Output 三段，右侧 = Settings**"。(2) 视频比例固定 16:9 是产品契约，format 下拉无需求即应剔除（避免被未实证的"灵活性"挂上 dev cost）。(3) 用户反馈周期：v1 交付 6 hours 后即抓出 4 个产品决策方向 — process gap：起手 disambiguate 阶段没问"视频比例 / 是否需要转场 / Output 元素清单"。**candidate 回流**：`tvu-design-mockup` skill 起手协议 step 0 应加 "broadcast/streaming app 类任务的 disambiguate checklist：视频比例锁定？转场/切换控件清单？输入输出元素清单？" 减少 v1→v2 改动成本。审计：I3 wrap 0 overflow / 16:9 ratio exact 1.7778 ✓ / 0 sibling SECTION overlap. Handoff v2: 同一 `MicroApps/docs/2026-05-19-graphics-insertion-dual-preview-handoff.md`（顶部 v2 revision 段） |
| 2026-05-20 | MicroApps Console | mockup | **Video Sync Multi-Session v2 增量：M2 expand + M0 single-session** — 用户指出 v2 漏了 (1) Slot/Audio Channel 编辑入口、(2) 1-session 选择策略。设计决策：用 R2 row-expand 当编辑入口（点 row 展开 → 内嵌 Producer Program + Stream A·Source/Stream B·Destination Slot/Ch 三个 dropdown），1-session 自动展开（等同 Plan B baseline，无 list overhead）。Build M2 frame（4130:417）= clone M1 → wrap row 1 in vertical container → 加 expand panel cloned select box/filled instances from Plan B (`842:34886` Producer + `861:35252` Stream A/B inner)。Build M0 frame（4133:672）= clone M2 → 删 rows 2-5 → count badge `5 Sessions` → `1 Session`。Session count strategy 0/1/2+/16+ matrix 写入 handoff doc | 6 | 3 (Plan B `select box/filled` × 3 clones, 全 verified) | 0 | 0 | **process 实证**：Slot/Channel 编辑入口设计选择 row-expand 而非 RIGHT panel header / Modal — 理由 3 条已落 handoff（Plan B 视觉对齐 + R2 合并交付 + cross-session 编辑上下文不丢）。Next: empty state frame (0 session) + variable binding pass. Handoff: `MicroApps Console/docs/2026-05-19-video-sync-multi-session-handoff.md` |
| 2026-05-20 | MicroApps Console | mockup | **Video Sync v2 icon-swap 增量** — 用户抓 v2 漏：route arrow `→` / trend `↓ ↑ ✓` / sort hint `↓` 还是 Unicode TEXT 字符，违反 M32 + M14.1（同款坑实证 history：2026-05-14 V4 `‹/›` Unicode chevron → V5 改 `icon/Arrow/Previous`）。Import 4 TVU 图标 + 18 处 swap：`icon/Arrow/Next` × 11（路由 →，BLUE tint）+ `icon/Arrow/Down` × 3（trend ↓ 收敛，BRAND tint）+ `icon/Arrow/Up` × 2（trend ↑ 发散，ORANGE tint）+ `icon/file/synced` × 2（trend ✓ 稳定，BRAND tint，与 Plan B Synced 按钮同 icon 视觉一致）。Sort hint 文本改写为"Sort: Status (status-first) · Start time" 删 Unicode ↓。Icon recolor 用 paint override（解绑 boundVariables + 写 SOLID hex），文档 debt：跨文件 variable binding 等通路打通后再绑 token | 18 | 4 (4 个 icon master imported by key + verified) | 0 | 0 | **process 反复实证**：text-as-icon 是 AI mockup 的常见漏洞 — 即使在同 session 内已经做了 Badge / Button / Tab / Dropdown library swap，仍会漏掉 inline 小 arrow/checkmark/chevron。**建议起手协议**加 mandatory post-build audit step："scan all created frames for TEXT nodes with characters ∈ Unicode-icon-charset {→ ← ↑ ↓ ✓ ✗ ▾ ▸ ⚠ ⓘ ❤ ★ etc.} → 命中即视为 library-icon 候选 swap target"。可写脚本自动化 |
| 2026-05-20 | MicroApps Console | mockup | **Video Sync v2 → v3 IA-confirmed refactor** — 用户连环 feedback 3 轮校正最终对齐 unified Micro Apps layout：(1) Producer Program 是 PP-as-page-level 不能塞每 row 内 → PP 上提到 LEFT 顶部 strip；(2) 自造的 sub-header strip（Multi-Session Monitor + Filter + Sort + New Sync）破坏跨 App 视觉一致 (Plan B + Standard Conversion 统一模式没有 sub-header) → 整条删；(3) Row 行内右侧 action 按钮（Stop/Retry/Detail/Open/Configure）不在统一模式 → 全删，靠 RIGHT 底部 context-aware；(4) PP strip 自造格式（Producer Program: 加粗+dropdown row+description）不对 → clone Plan B `842:34818` Content 节点完整内容只去 Sync 按钮；(5) Row chevron 缺失 → icon/Arrow/Next (collapsed) + icon/Arrow/Dropdown (expanded) library instance prepend；(6) `+ Add another sync session` placeholder 加 LEFT list 末尾 dashed ghost row。**先文本 IA 确认后才动 Figma**（用户硬要求）。M1/M2/M0 全重建，cleanly aligned。三帧 spec：M0 single-session auto-expanded / M1 multi-session default 5 rows collapsed + Row 1 selected / M2 multi-session Row 1 expanded with Stream A·Source + Stream B·Destination dropdowns | 8 | 2 (icon/Arrow/Dropdown imported via key `eba15c0b...` + clone of Plan B `842:34818` Content node) | 0 | 0 | **5 条 process 强实证回流候选**：(1) **"先 IA 文本确认再画"**应作为大 redesign 的 default workflow（避免画完返工 5 轮）；(2) **"统一 layout pattern" probe** 应起手强制 — 接到任何 consumer 产品 mockup 任务先 probe 该产品下 sibling pages 视觉合同（本 session 只看 Plan B AVS 单 session，没看其它 App 如 Standard Conversion → 漏掉跨 App 通用模式）；(3) **sub-header / Filter chip / Sort / New Sync** 这类"我直觉觉得 multi-session 需要"的元素，必须先验证存在于 sibling App 的现有页面再加 — YAGNI 优先；(4) **PP 这类页面级共享对象**位置应跟 baseline 1:1 不要重设计；(5) **Row 行内 action** 跟 RIGHT 底部 action 冲突 — 统一模式选 RIGHT 底部唯一入口，删行内冗余。Handoff: `MicroApps Console/docs/2026-05-19-video-sync-multi-session-handoff.md` |
| 2026-05-20 | MicroApps Console | mockup | **Video Sync v3 → v3.1 修正：2-state ON/OFF + per-session Parameters binding** — 用户自查问"你自查过吗？只有开启/未开启 2 状态" + "右侧 Parameters 应该 per-session"，两个 root miss：(1) PRD R3 用了"例如"列 5 状态，我当成 mandatory 全部实施 = 错；2-state 简化（ON Blue / OFF Neutral）= 正确，Failed/Done/Idle 视觉全删，错误信息退化为 informational meta；(2) 每个 session 有独立 Parameters，RIGHT panel 必须 binding 到选中 row，我之前是静态 Plan B clone。修复：Badge swap (Red→Neutral OFF, Green→Neutral OFF, IDLE→Neutral OFF, Blue 保留 ON)；Row 3 红 meta → neutral "Last attempt 13:30"；Row 4 delta + trend 整块删；Parameters header 改 "Parameters · Premier_League_Main" (session 名 BLUE 与选中 row accent rail 同色，视觉绑定) | 12 | 2 (badge variant Neutral 复用 + text setRange BLUE accent) | 0 | 0 | **2 条 process 强实证**：(1) **PRD 中"例如"/"e.g."的列表必须显式问用户哪些是 in-scope** — 不能默认全部 mandatory（5-state vs 2-state 案例）；(2) **跨 session N-to-1 vs N-to-N 关系应在 IA 阶段确认** — PP shared by N (1:N) / Stream A/B per session (1:1) / Parameters per session (1:1) — 我在 v0-v2-v3 都没明确询问 Parameters 的 cardinality，默认当 page-shared 是错的。建议起手协议加 cardinality mapping table required check。Handoff: `docs/2026-05-19-video-sync-multi-session-handoff.md` |
| 2026-05-20 | MicroApps Graphics Insertion | mockup | **v4 final · scheme E "Embedded Strip"** (用户提供 Standard Conversion 参考图澄清 MicroApps 通用框架：top bar / 顶部 URL 行 / 右侧 Layer 面板 / 底部 toolbar 全部冻结，只有中部视频预览区可改)：删除 Mid Ops 列整段（删 Overlay Cut 中缝按钮位置错位 + 3 layer btn 不应在独立列）+ 删 v3 全部 ● section 标签 + hint 文字 + 删 v3 注释层 → 重建中部预览区：PVW 560×315 + PGM 560×315（均严格 16:9 ratio = exact 1.7778 ✓）+ audio meter 紧贴各自预览右内侧（option B 通用约定）+ PVW 底 strip 内嵌 [L1 L2 L3 layer icons] · 🎧 Preview · Clear overlay + PGM 底 strip 内嵌 [Overlay Cut brand-green primary] · 🎧 Program · Remove overlay + 顶部 URL 行从 Before frame `Content` 节点 verbatim clone + 底部 toolbar 同样 clone（保现有控件契约）+ 右侧 Layer panel 复位 x=1232 y=146 w=648 h=794 + M23 v4 注释层（5 chips：Dual 16:9 / PVW strip / PGM strip / Audio meter / Frozen frame + 5 connectors + 完整双语 rules card v4，1072 bytes reconnect map）| 0 (无新 element mapping，纯 layout 范式重构) | 0 | 0 | 0 | **关键设计洞见**：(1) **MicroApps 通用布局契约**=top bar + 顶部 URL 行 + 右栏 + 底部 toolbar **统一冻结**，只有"中部 video 预览区"是 hackable — 这一通用约定是跨 app 视觉一致性的核心。Standard Conversion 是参照样本。(2) v1 + v2 + v3 三次踩坑同源：起手没向用户索取**通用约定参考图** → 自由发挥时构造出违反通用契约的 layout（中间操作列 / 移动 Preset 到右栏 / 加 ● section 标签 etc）。(3) 当 dual preview 16:9 + 通用框架冻结时，唯一合理的 action control 归宿是各 preview **底部 strip 内嵌** → 这就是 scheme E。(4) **5 个 layout 方案对比 (A Cinema / B Switcher Console / C Hero PGM / D Compact+Meta / E Embedded Strip)** — 用户选 E。**process gap 实证 + 建议回流**：(a) `tvu-design-mockup` skill 起手协议加 "broadcast/MicroApps 类任务先问通用约定参考图 / fixed-frame 是否存在 / 哪些区域 frozen vs hackable" 减少 3 轮 retrofit。(b) 起手时若用户提供 PRD + 参考图，**必须把参考图的视觉契约也作为约束读完**，不能只读文字 PRD。(c) Mid Ops 中间列范式不适合 dual 16:9 + 通用框架 + 右栏 frozen 场景 — 默认应推荐 scheme E 内嵌 strip。Handoff v4: `MicroApps/docs/2026-05-19-graphics-insertion-dual-preview-handoff.md` 顶部 v4 段 |
| 2026-05-20 | MicroApps Console | mockup | **Video Sync v3.1 → v3.2 OFF rows 历史可见** — 用户自查问"看起来这并不是所有的工作任务，只是新增的任务，之前的任务没看到"。Root cause: OFF rows 视觉像 placeholder/empty slots，没传达"之前配置过/跑过/现在停了的 session 仍持久在 list 里"。修正 OFF row meta lines：Row 3 (was FAILED) "Last ran 13:25 → 13:30 · stopped (audio match dropped)"；Row 4 (was DONE) "Last ran 13:00 → 13:21 · 21 min · last delta 12 ms"；Row 5 (was IDLE not configured) "Never started"。语义：sessions 是 PP 下 persistent 的对象，list 包含 running + previously-ran + never-started 三类，OFF rows 不是 placeholder | 6 | 0 | 0 | 0 | **process 实证**：用户对架构问题（state cardinality / object persistence model / N-to-M relations）会反复抓——我画的 5 rows 看似有 5 个 sessions，但用户从语义上读出"只有新加的没有历史的"是因为缺历史时间信息（meta 太简略）。**建议起手协议**对每个 list-bearing UI element 必须问 5 个问题：(1) 列表元素是 transient 还是 persistent？(2) 元素生命周期 = 多少 state？(3) 用户视角的"之前/历史"在哪能看到？(4) cardinality 各对象间是 1:1 / 1:N / N:M？(5) 父对象切换时子对象怎么变？这 5 个问题之前 4-5 轮 feedback 全是它们的体现。Handoff: `docs/2026-05-19-video-sync-multi-session-handoff.md` |
| 2026-05-20 | MicroApps Console | mockup | **Section auto-fit children bbox** — 用户抓 3 个 frame 没被 section 包住（Figma createSection 给定固定 496×496，appendChild 不自动 resize children）。修正：用 children 的 max(x+w) / max(y+h) + padding 重算 section.resizeWithoutConstraints。PRD spec section 496×496 → 1360×1798 / Mockup v2 section 496×496 → 4040×2400 | 0 | 0 | 0 | 0 | **process 强实证**：Figma section 不自动 fit children 是 figma-technical-reference 候选 Q-rule。**建议回流**：(1) figma-technical-reference 加 "Q-N: SectionNode.resize 不自动跟 children — 创建后必显式调 resizeWithoutConstraints(max child x+w + padding, max child y+h + padding)"；(2) tvu-design-mockup skill wrap-up 协议加 mandatory step：所有创建的 SECTION 在 session 结束前必跑 section fit check（probe section bounds vs children bbox，不匹配则 resize）。Handoff: `docs/2026-05-19-video-sync-multi-session-handoff.md` |
| 2026-05-20 | MicroApps Graphics Insertion | mockup | **v5 final · scheme E + 1+3 balance combo** (用户反馈 v4 "空白不是一点点，跟通用结构不一致"，提议数学真相：单 16:9 预览高 650 → 双 16:9 并排各只能高 ≤ 360，要"填满垂直空间"硬约束下数学不可能；提供 3 个修法 [1 放大预览/缩右栏 / 2 加 status info 行 / 3 垂直居中] 用户选 1+3 组合)：PVW + PGM 从 560×315 → **640×360** (k=40, exact 16:9 ratio = 1.7778 ✓) + 右 Layer panel 648w → **460w** (内部清理 orphan Frame 3070 placeholder + clipsContent=true) + 预览垂直居中 main row (y=365)，上方 223px 下方 255px 留白 diff 32px 对称 ✓ + audio meter 紧贴各 video 右侧 (PVW meter x=694 / PGM meter x=1366，h=360 重建 bar+tick) + PVW/PGM strip 重 reflow 560→640 children (layer-btn / label / action button 位置自适应) + M23 connectors 重建 5 个指向 v5 新位置 (reconnect map 932 bytes) | 0 (无新 element mapping，纯平衡 refinement) | 0 | 0 | 0 | **关键认知**：(1) 当 dual 16:9 并排 + 通用框架冻结时，"填满垂直空间"**数学上不可能** — 必须用"放大预览 + 垂直居中 + 接受对称留白"或"加功能化下方内容" 解决，不能硬掰布局。(2) v1-v5 = 5 轮迭代，**起手没问通用约定参考图 + 起手没认清 16:9 双并排的数学上限** = 全部 retrofit 根因。(3) v5 是当前 scheme E 范式下的最优配比。**process gap 回流候选**（不强回流，待用户确认是规则级）：(a) `tvu-design-mockup` skill 起手协议加 "broadcast/streaming app 类任务需要明示 frozen vs hackable 区域并索取通用约定参考图"；(b) "dual-N:M 并排" 类任务起手时**先算几何上限**给用户校验，避免后续 retrofit。Handoff v5: `MicroApps/docs/2026-05-19-graphics-insertion-dual-preview-handoff.md` 顶部 v5 段 + v1→v5 iteration trail |
| 2026-05-20 | MicroApps Console | mockup | **Video Sync v3.2 → v4 final round** — 用户 4 项 feedback：(1) LEFT 内部应上下分栏（PP top sub-panel + Sessions bottom sub-panel 各自有 fill+border 视觉独立）；(2) 选中应用 brand 绿不是 blue（BLUE = 56/146/243 → BRAND = 47/181/78），applies to row accent rail + Parameters header session name；(3) Sync 按钮已沿用 Plan B 参考样式（绿 filled `Button/dark L` filling-green）— 当 ON 选中显示 "Syncing…"，OFF 选中显示 "Sync"；(4) 补 OFF session selected 状态 frame：M3 Row 3 TV2_Feed (OFF) 选中+展开，Parameters header → TV2_Feed (BRAND tinted)，3 个 Parameters values 改 (Window 10→15, MaxTau 300→500, BaseDelay 300→200) demo per-session，RIGHT 底部 button "Syncing..." → "Sync"。然后补 M23：4 个 state label chips (M0/M1/M2/M3) 双语 EN/ZH + Design Rules card 8 条 (Layout / Cardinality / State model / Selection / Editing entry / Bottom button context / Sessions persistence / TVU library compliance)。Section 自动 fit 到 4560×2400 | 10 | 1 (icon/Arrow/Dropdown re-import) | 0 | 0 | **process 实证**：(1) `loadFontAsync` 对 mixed-font TEXT 会抛 "Cannot unwrap symbol" — fix: 仅在 setting `characters` 时需 font load，setRangeFills 不需要；(2) Plan B Parameters header 用 Roboto SemiBold，所有 Roboto styles (Regular/Medium/SemiBold/Bold/Light) 应在脚本起手批量 try-loadFontAsync。建议 figma-technical-reference 新增 Q-rule "TEXT operations font safety: 起手 try-load all common styles in family"。Handoff: `docs/2026-05-19-video-sync-multi-session-handoff.md` |
| 2026-05-20 | MicroApps Graphics Insertion | mockup | **v6 final · structural L/R split refinement** (用户澄清："这个页面的结构应该是左右结构，左边再分成上下结构" — top URL 行 + bottom toolbar 不是 full-width，应该只在左栏内；Layer panel 应该是全高 sidebar 不是 main-row 高度)：URL row 1840w → 1360w (左栏宽，x=40 y=72) + Bottom toolbar 1840w → 1360w (左栏宽，x=40 y=980) + Layer panel y=146→72 / h=794→952 (全高 sidebar 从 top bar 下方到帧底，x=1420 w=460) + 重建 connector #5 (topUrl 指向新位置) | 0 (无新 element mapping，纯结构精修) | 0 | 0 | 0 | **关键认知**：(1) Standard Conversion 通用范式 = 顶 bar 全宽 + 主区**整体左右分栏** + 左栏内**再上下三段**（URL 输入 + 主工作区 + 底部 toolbar）+ 右栏全高 sidebar（settings / Layer）。这是比 v5 更精确的解读。(2) v6 = v5 + 结构修正 = scheme E 最终形态。(3) 副产品：Layer panel 拉高 952 后原本 v4/v5 被截掉的 widget cards (logo / 双滑雪图等 cloned from 1747:2764) 露出来 — Layer panel 视觉上"更充实"，跨 app 视觉密度统一。**v1-v6 6 轮迭代根因总结**：(a) 起手没问通用约定参考图；(b) "左右结构 + 左内上下" 是 Standard Conversion 通用范式的精确描述，v4/v5 都只 partial 实现了（URL 行 + toolbar full-width，Layer panel 只占 main row 高度）。**process gap 回流候选** ：(a) `tvu-design-mockup` skill 起手协议加 "broadcast/streaming app 任务起手必索取通用约定参考图 + 明示 frozen vs hackable 区域 + 让用户描述结构层级（'页面是 X 结构，X 内再 Y 结构'）"；(b) 起手时复述并 echo 结构理解给用户校验。Handoff v6: `MicroApps/docs/2026-05-19-graphics-insertion-dual-preview-handoff.md` 顶部 v6 段 + v1→v6 iteration trail |
| 2026-05-20 | MicroApps Console | mockup | **Video Sync v4 → v5 7-point batch fix** — 用户 7 项 feedback：(1) LEFT/RIGHT height align + body vertical center → 回流 §5.5 "LEFT-RIGHT height alignment" + "Vertical center" 硬规则；(2) ON Badge BLUE → BRAND Green (品牌色)，7 swaps 全 Badge Color 属性切换；(3) OFF Sync button 之前是 status=disable (cloned 自 Plan B Syncing) → 改 setProperties({status: "default"})；(4) 加 Plan B Switch frame：clone M1，5 处 Badge 实例 swap 为 TVU Switch component variants (ON dark/on/yes/no + OFF dark/off/yes/no)；(5) 字体 normalize: 33 个 TEXT 节点 fontSize 10/11/13 → TVU grid 12/14；(6) 间距/层叠：frame gaps 80 → 200，Design Rules card 移到右侧 520w 独立位置，section 自动 fit 4960×4071；(7) M23.6 connectors: 5 个 short vertical down-arrows from state chip 到 frame top (50px each，BLUE #33A4FD 2px stroke + manual arrowhead per M23.6 vectorPaths)，包含 chip 重定位 (y = frame.y - chip.height - 50) + section shift +151 修复负 y 坐标 | 12 | 2 (Switch SET + variant lookup) | 0 | 0 | **process 强实证回流候选** (跟之前 batch 一起做)：(1) **§5.5 update** done now (LEFT/RIGHT height align + vertical center + LEFT 上下分栏 + page state label 4 个 sub-section)；(2) **ON state = BRAND Green** convention 应回流到 tvu-design-system figma-component-catalog.md Badge "Extension scenarios" 段（候选 entry: "Active/ON pill (running session indicator): Color=Green Filled, 取代之前的 Color=Blue Filled"）；(3) **Font grid discipline** 应回流到 mockup-conventions.md 新规则 M-FONT: 所有自建 TEXT fontSize 必从 TVU textStyles 12/14/16/18/20/22/24 集合选，禁 10/11/13/15 等 off-grid；(4) **status=disable 陷阱**：cloning instance from Plan B Syncing state 会继承 disable status，需 setProperties({status:"default"}) — 候选 figma-technical-reference Q-rule。Handoff: `docs/2026-05-19-video-sync-multi-session-handoff.md` |
| 2026-05-20 | MicroApps Graphics Insertion | mockup | **v7 final · asset reuse + PP-style cut delivery** (用户指明复用现有资源不再自画：(a) 音量条用同 file Edit Stinger 节点 `1240:15412` 的 Group 61；(b) Overlay Cut 交付参考 PP-2025-2026 file `tmVCFjx1BCfb7EP5OPD1AP` node `1665:9076` 的 Studio-overlay layer cut 范式)：(1) 删除 v1-v6 自画 audio meter 节点 (4107:456 / 4107:476) + clone Group 61 两次 rescale 0.527 适配 360h 安在 PVW/PGM 右侧 (新 ID 4195:426 / 4195:452，含 TVU `icon/sound/on 1` instance + L+R bars + 完整 dB tick column)。(2) Probe PP-2025-2026 node 1665:9076 解析 layer cut delivery 范式 = state mini-frames (288×1016) + 内嵌 text label ("click to pvw"/"cut to pvw"/"data sync PVW & PGM") + 弯曲 arrow + Message box 标注；本次 adopt 简化版：2 个 state mini-frames (560×380, 各含 240×135 mini dual-preview) + brand-green arrow + ✂ "Click Overlay Cut" pill 标签 + 双语 caption ("State A · Before Overlay Cut" → "State B · After Overlay Cut") | 0 (无新 mapping，纯资源复用 + 状态机补充交付) | 0 | 1 (Group 61 audio meter file-local 实证 → 跨 page 复用 verified — 应升级 catalog 中 audio meter entry 从 🟡 → ✅) | 0 | **关键认知**：(1) **TVU 现存 audio meter 资源在 file-local 而非 published library** — Group 61 (1240:15412) 是 MicroApps Figma file 自有，跨 page clone 可用，但**跨 file 不行**（其它消费产品 file 复用不到，得另寻 published library / 或回流到 TVU 库当 `AudioMeter` 组件）。(2) **PP-2025-2026 layer cut 范式 vs TVU M23 范式 ≠ 互斥** — M23 用 navy text chip 表 "rules/specs/feature list"；PP-style mini-frame state 表 "interaction state machine / before-after transition"。两者**互补共存**：宽 spec 用 M23，关键交互流用 PP style。(3) **资源复用优于自画**是普世原则但**起手没问"file 内是否已有同类组件可复用"是 process gap** — v4 自画 audio meter 6 行 dB ticks + gradient bars + clip rects 花了一整 batch，本可一行 clone 解决。**process gap 回流候选**（评估后归入 Phase 0 lookup 序列）：M0 Phase 0 mapping table catalog 没命中时，第 2 优先级"library 搜"之前应加 "**file-local node 搜**"（findAll componentSet + 大组 group）— 因为同 file 同类资源（如 audio meter）可能没成 component_set 而是 plain GROUP，catalog 不收录但跨 page clone 仍合法。Handoff v7: `MicroApps/docs/2026-05-19-graphics-insertion-dual-preview-handoff.md` 顶部 v7 段 |
| 2026-05-20 | MicroApps Graphics Insertion | mockup | **v8 final · M31 auto-layout compliance refactor** (用户指出 v1-v7 整个用 Frame 绝对定位 = **违反既有 M31 规则**，不是新规则缺失)：refactor 整个 After frame 为 auto-layout 嵌套树：Main Row (HORIZONTAL, 1840×952, gap=20) → Left Column (VERTICAL, 1360w×952h) + Right Layer Panel (FIXED 460w, FILL vertical) / Left Column → URL Row (FILL horizontal) + Video Area (HORIZONTAL, primaryAxisAlignItems=CENTER, counterAxisAlignItems=CENTER, FILL h+w) + Bottom Toolbar (FILL horizontal) / Video Area → PVW+Meter Group (HORIZONTAL auto-layout hug) + PGM+Meter Group (HORIZONTAL auto-layout hug) / PVW & PGM 底部 strip → 转 HORIZONTAL auto-layout primaryAxisAlignItems=SPACE_BETWEEN counterAxisAlignItems=CENTER 自动均布 [layer-icons \| label \| action-button] 三件 | 0 (无新 mapping，纯 layout 范式 refactor) | 0 | 0 | 0 | **审计 v8**：58 frames 总数，47 auto-layout (81%)，11 absolute 全是 M31 合法 exception (PVW/PGM Preview = "stand-alone overlay container" / Layer panel widget cards = cloned library / Top bar internals = frozen library)。16:9 ratio 仍 exact 1.7778 ✓。**关键认知**：(1) **M31 是 TVU 现存规则，v1-v7 整个违规** — 不是规则缺失而是 AI 起手读了规则但执行时没贯彻的纪律 gap。M31 原文："先 auto-layout，找不到合适机制再退到 absolute" 是默认顺序。Path-of-least-resistance 让我反复用 absolute 写代码（更直观、更快），但产物**用户在 Figma 里手动修改时痛苦** (改一处其它得手动重算)。(2) auto-layout 重构后**手动可编辑性**质变 — 移 PVW / 加 mid-ops 子项 / 改 URL 文本长度 都自动 reflow。这才是规则真正想约束的事。**process gap 记录但不回流**（规则已存在，问题是 AI 执行纪律）：建议下次 @TVU mockup session 起手协议**显式 echo "本次 layout 默认 auto-layout，M31 已加载"** 强提示自己。Handoff v8: `MicroApps/docs/2026-05-19-graphics-insertion-dual-preview-handoff.md` 顶部 v8 段 + auto-layout 嵌套树 + audit |
| 2026-05-20 | MicroApps Graphics Insertion | mockup | **v9 visual polish · PVW/PGM PP-style refinement** (用户反馈 v8 PVW/PGM "效果图很糟糕"，引用 PP-2025-2026 node `2002:7240` Studio-overlay 作为视觉参考)：删除大块 corner badge (4107:445 PVW / 4107:450 PGM) + 改用 **3px stroke border** 表达 PVW=brand-green / PGM=red 状态信号 + flat fill 改 **3-stop GRADIENT_LINEAR**（PVW: 深绿 #1a2d12 → 中绿 #355a22 → #4a6b2b / PGM: 深 navy #0a162a → #142442 → #1a2c4a）+ 加 top-left source-name chip (`● PVW · Cam 1 · Stadium` / `● PGM · LIVE · 13:42:18`，黑透明@65% 容器) + 加 top-right timecode chip (`00:32:14:08`，brand-green text) | 0 (无新 mapping，纯视觉范式 polish) | 0 | 0 | 0 | **关键认知**：(1) **"flat fill + corner badge" 是占位风，不是 broadcast switcher 风** — PP 范式用 colored border 包边 + dark gradient bg 模拟视频深度 + 多个小 UI chip (source/timecode) 增加视觉密度，整体感更"真"。(2) **缺真实视频图片仍有大量空间靠"视觉信号 + 密度补偿"** — gradient + border + 小 chip 能 close 部分 gap，但跟 PP 真照片版仍有差距。如需 100% 还原 PP 需 `figma.createImage` base64 上传 stock photo (out of scope unless user asks)。**process gap 候选**（评估后归类）：**mockup 视觉风格交付的"参考图驱动"vs"凭意识造"差距巨大** — v1-v8 我都凭 PRD 文字 + 通用范式 brain 出 placeholder 视觉；v9 是用户主动给 PP 参考图才知道 broadcast switcher 该长什么样。建议 `tvu-design-mockup` 起手协议补"广播/streaming 类任务需索取**视觉范式参考图** (不止结构参考，还要视觉细节参考 — colored border 用法 / gradient 用法 / 内嵌 chip 密度等)"。但这条**已被本 session 之前提议的 "Universal Reference Image Request" 候选 cover 一部分** — 之前 scope = 结构通用约定参考，扩到含视觉范式参考即可。Handoff v9: `MicroApps/docs/2026-05-19-graphics-insertion-dual-preview-handoff.md` 顶部 v9 段 |
| 2026-05-20 | MicroApps Console | mockup | **Session 收尾 v7-end** — Toast v8 + M3 walkthrough + 剩余 3 真源回流推迟到 next session（pickup doc 已写）。本 session 总产出：1 PRD spec section + Plan A (4 frames + M4 partial) + Plan B Switch alt section + 11 双语 Design Rules card；13 条新规则其中 9 已回流 (Q9-Q12 / M36-M38 / M-FONT / M-TXT-ICON-AUDIT / R17-R19)，4 待回流 (M-PRD-EG / M-CARDINALITY / M-IA-FIRST / Badge Extension / §5.5 ref link)。复盘文档 + pickup doc 已写到 MicroApps/docs/。**~25 轮 user feedback × ~50 use_figma calls × ~13 条新规则 = 大 session** | 0 | 0 | 0 | 0 | **2 个 deliverable**: (1) `2026-05-20-video-sync-next-session-pickup.md` — next session AI 接力指南，含起手必读 + backlog + Figma ID 速查 + 起手协议 7-step；(2) `2026-05-20-video-sync-mockup-retrospect-internal-share.md` — Nancy 明天内部分享文档，含 Top 5 process gap + 10 条高效对话建议（PM 视角 + AI 视角）+ Model 选型推荐 + Action items 3 项。**核心 insight**: 架构决策（cardinality / state model）一旦错每后续轮返工成本累积，前 3 轮 5 个 cardinality 问题能 avoid 60% 返工 |
| 2026-05-20 | MicroApps Console | mockup | **Video Sync M3 walkthrough fix + selected-indicator token alignment** — pickup-doc 接力 backlog (b)：M3 frame `4165:950` 4 项 walkthrough 修复 — (1) session-list 加 5 条 1px Deep Divider Rectangle (FILL horizontal `#353535`) 在 rows 间；(2) 顶/底 168 dead space 保留 §5.5 不改（用户认可垂直居中）；(3) Row 1+2 delta 字号 22→28 / ms 12→14（保守不引新视觉 primitive）；(4) Row 1-4 route prepend `A:` + middle insert `B:` (Roboto Medium 12px BRAND 绿，A/B 间已是 icon/file/synced 双向同步图标保留)。**同 session 追加 selected-rail token alignment**：用户抓 "3px 不在 Spacing token 集" → M0/M2/M3/M4 rail strokeLeftWeight 3→4（M1 已是 4 保留），Design Rules card EN+ZH "(3px)"→"(4px)"。M38 + R19 真源同步：加 `--sp-xxs` token cite + 反例条 "off-token magic number 禁止" + Acceptance "rail 宽度必从 Spacing token 取" + 实证 entry。 | 0 (无新 mapping，全是已知 component/token 复用) | 0 | 0 | 0 | **process 强实证 + 回流**：(1) **Off-token magic number 是隐藏 regression** — selected rail 这种 N 处复用的视觉 primitive 用 3px 看似"接近 4"但破坏跨产品 Spacing token grid 一致性，design token 调整时此处不会跟随；M38 + R19 已加 Acceptance "rail 宽度必从 Spacing token 取" + 反例条。**Process gap 候选回流**：mockup 起手协议 + audit checklist 应加 "scan all stroke/border widths 是否落在 TVU Spacing token 集 {4, 8, 12, 16, 24, 32, 40, 56}"，类似 M-FONT 的 fontSize grid audit。考虑作为 M-SPACE umbrella sub-clause 或 M-INTEGRITY 子条款。(2) **同 row pattern 已 clone 6 处 (M0-M4 + PlanB) — 4 项 M3 fix 当前未 propagate 出去**，backlog (d) file-local component 抽出后才能一键同步。Handoff: `docs/2026-05-20-video-sync-m3-walkthrough-fix.md` |
| 2026-05-20 | MicroApps Console | mockup | **Video Sync M3 walkthrough continuation · 12-turn iterative session** — 接上 commit `522610c3` 后续：(1) Slot/Ch 紧凑格式 `Slot N/Ch X-X` (用 `/` 替 chevron + 删 Ch text) 跨 17 routes (M0/M1/M2/M3/M4/PlanB) + 6 expanded dropdowns (`Slot N > Ch X-X (Stereo)` → `Slot N/Ch X-X`)；(2) Dividers + delta 22→28 字号 bump 跨帧同步 (21 dividers + 16 delta TEXT)；(3) **视觉层级 2 次翻转**: v1 把 Session name 降级 Tips 灰 / Slot 升级 White Medium → 用户反馈"违和" → v2 swap back 标题主视觉 Slot 次要；(4) Parameters header 3 次重设计：a/ "Parameters · Sync session #N" 同段 → b/ 文字分层 (Parameters SemiBold 18 / · Sync session 14 Tips) → c/ **括号 + BRAND 绿**最终 `Parameters (Sync session #N)` 视觉绑定 selected row 4px BRAND rail；(5) A:/B: 弱化 BRAND Medium → Tips Regular（与 State Pill 不冲突）；(6) Toast 文案同步 `Premier_League_Main` → `Sync session #1` 与 row 命名对齐；(7) Session name 全部替换为 `Sync session #N` (Tips 14 Regular 弱标识)；(8) M5 Empty State frame 建了又删 — **决策: PP 自动 bootstrap Session #1**，0-session 不存在，加入 Figma Design Rules card 第 12 条 + handoff 决策段。Wrap-up: 12 条规则 Design Rules card update + 3 条 TVU 真源回流 (design-process M-PRD-EG/M-CARDINALITY/M-IA-FIRST + catalog Badge ON=BRAND Green Tag=Line + §5.5 reference-link note)。 | 0 | 0 | 1 (Notification side-pop user 手动加 Toast 视觉) | 0 | **3 条强 process 实证 回流到 design-process.md**：(1) **M-PRD-EG** — PRD "例如" 列表必须显式 ask in-scope (5-state vs 2-state 案例)；(2) **M-CARDINALITY** — 5 个对象关系问题 self-check (PP/Session/Parameters cardinality 没问导致 v0-v2 重大返工)；(3) **M-IA-FIRST** — Multi-object feature 必先产 IA 树 + Selection model 再开画。**视觉层级 2 次翻转的元教训**：信息层级决定不能凭 intent 拍脑袋，必须从 user task model 反推 — task 优先级 top-3 信号决定 visual hierarchy top-3 权重。**Empty state 元教训**：边界状态设计前必问 "这个状态在产品里真的存在吗" — 我假设 0-session 存在并建了 frame，实际 PP 自动 bootstrap = 该状态根本不存在。Handoff: `docs/2026-05-20-video-sync-m3-walkthrough-fix.md` |

| 2026-06-01 | TVU Pack | mockup | **V4-1865 v2 redesign · 架构纠偏 + 3-mode Hotspot 重构** — v1 严重误读硬件架构后用户给出关键 context: (a) Onboard WiFi 只有 1 个 内置模块 (b) Hotspot 模块可切换 mode (c) 多 WLAN 来自 USB 扩展，不是 TM1100 内部 dual-module (d) 现有文件设计规则 "params 隐藏 ≠ disabled dim"，v1 F4 dim 错版违反。v2 重构：(1) 删 v1 F2 scanning + F4 dim 错版 + 旧 M23 卡；(2) 重新认知 Hotspot 模块是 3-mode (Disable / Hotspot / WiFi)，3 mode 共享同一段 UI 通过 dropdown 切换；(3) 用 dropdown 而非 segment tab 做 Mode 选择器 — 因 legacy lib 无现成 segment 组件 + 同段 Router/Bandwidth 已用 dropdown 视觉一致；(4) 2-section 协调：Hotspot 段 Mode 字段是状态唯一真源，WiFi 段被动反映 (Mode≠WiFi → `< 1/1 >` / Mode=WiFi → `< 1/2 > ⇄ < 2/2 >`)；(5) USB 扩展 forward-compat：pagination 模型直接 scale 到 N，未来 USB 热插拔 → `< 1/3 >...`；(6) Mode=WiFi 时 Hotspot 段加 redirect 提示 "→ Configure in WiFi section above"，避免用户找不到设置；(7) M23 v2 卡 9 段 (硬件背景 / 3-mode 架构 / hide-not-dim 规则 / 2-section 协调 / USB 扩展 / 为何 dropdown / 模式切换状态机 / 边界 case / dev checklist)。 | 13 | 0 | 0 | 0 | **关键反思**：(1) **硬件架构假设是 v1 全局错误源头** — v1 我读 Jira description "TM1100 Pack’s Second Internal WiFi Module" 默认推断 = 两个内置 WiFi 模块，没问"目前实际硬件配置"。用户纠正后才知道 Hotspot 模块 ≠ 第二 WiFi 模块。**回流候选**：mockup 起手协议加 "Hardware/system architecture clarification" step — 在 Pre-Phase 0 Step A Intake Gate 时强制 ask "Current architecture vs target architecture" 一句话描述。Jira description 文字可能与实际硬件命名不一致。(2) **"Hide vs dim" 是 product-level 文件约定** — 我按通用 UX 实践 (disabled state = dim/opacity) 而非读 file 既有 convention。**回流候选**：mockup-conventions.md 或 design-process.md 加 "Read file convention on disabled/hidden states before applying generic UX patterns"。(3) **2-section coordination 设计模型** — 单一 source of truth (Mode field) + passive reflection (pagination response) 是干净的 SaaS 设计模式，避免在多处重复 state。值得作 design-process pattern 收录候选。(4) **v1 → v2 删除成本低** — F2 scanning + F4 dim + M23 v1 一次性 use_figma remove，不留痕迹；说明 mockup file 内容易迭代，v1 不必追求 perfect。Handoff v2: `TVU Pack/docs/handoffs/2026-06-01-v4-1865-mockup-v2-handoff.md` |

| 2026-06-01 | TVU Pack | mockup | **V4-1865 v3 · M32 library compliance refactor** — walkthrough 后用户报两处 “自画/字符代 icon” 违 M32 类 Library-First ：(a) F5 redirect note 用 Unicode `→` (b) Mode 选择器用 dropdown 不是 single-select radio。库探查后发现 legacy lib 全部有现成组件 (`WebUI/Form/Radio/Selected` 3:305 / `WebUI/Form/Radio/Unselect` 3:308 / `icon/Drive/Arrow Up` 50:4752 / `Tag=Warning, Status=Enable` 59:7769 / `WebUI/Form/Checkbox/Checked` 3:310)，是我起手跳过 catalog grep 直接写字符。修复：(1) F3/F4/F5 拆 Mode dropdown 行，装垂直 radio group —— outer horizontal AL (`Mode:` label 左 + radio rows stack 右)，每 row = `Radio/Selected或Unselect` instance + mode name + description（3 modes: Disable/Hotspot/WiFi + 描述“Module off / Broadcast SSID (default) / Acts as second WLAN client”）；每 frame 仅其当前 mode 用 Selected variant；(2) F5 redirect note 重建 horizontal AL: `icon/Drive/Arrow Up` library instance (绿色 override，背景矩形 opacity 0 避覆盖 path) + 去掉 `→` 的 text；(3) M23 卡 body bullet 统一改 `•` (原 `⚠` / `□` Unicode 换为 bullet；Tag=Warning 判定 over-design 不加 —— section heading 品牌绿色 + “7. Edge cases” 文本已足够传递优先级) | 16 (+3 radio dot library instances) | 0 | 0 | 0 | **关键反思**：(1) **“字符体装 icon” 是 path-of-least-resistance 反模式** —— 写 `→` 一个字符 vs grep catalog + createInstance 多 3–5 步。应告告未来自己：任何装饰性符号出现在 in-product mockup 中都是 icon 不是文字，grep 库 是默认动作。**回流候选**：mockup-conventions.md 加 “Any in-product directional/status/decorative symbol → grep library before writing as Unicode char” sub-clause 归 M32。(2) **“为什么不用 single-select” 是 M22 design intent 失败** —— 用户原心愿 “快速清晰识别当前 mode” 被我翻译成 “dropdown 1 行可见”，但 dropdown 隐藏了其它 N-1 个选项反而弱了识别。**回流候选**：design-process.md 加 “Mutually-exclusive choices N ≤ 4 default = radio/segment, N ≥ 5 default = dropdown” 可量化 heuristic。(3) **“library primitive 库探查应为 Phase 0 纳入”** —— v2 重做时我 grep 了 segment/tab 但是 “找不到 segment 就退 dropdown” 不全面，应同时 grep `Radio` / `Checkbox` / `Tag` 等 primitive 全集。Handoff v3 补充在原 v2 doc 末加 “§9 Library compliance refactor (post-walkthrough)” 段。 |

| 2026-06-01 | TVU Pack | mockup | **V4-1865 v4 · M23 canonical + 8-step Jira flow 合规重构** — walkthrough 2 后用户抓 5 个严重违例：(a) F5 redirect 用 `icon/Drive/Arrow Up` 但 accordion 箭头 semantically ≠ "section above" 指针 — 应用 `*` 文字前缀 (合 baseline TM3-1408 `*` 提示范式) (b) redirect 文字染品牌绿 — 品牌色应留给 active state，hint 文字用 tips 灰 `#A6ADB8` (c) radio name 列 FIXED 100 没生效 description 列错位 (d) PRD/UX 交付卡位置脱离 mockup + 没用 M23 canonical 规则 (e) **完全跳了 design-process.md 8 步流程的 ② Jira component (M23.8) + 真源回流** — 用户原话 "我记得我写过这个规则"。修复：v4 重构 (1) F5 redirect 删 Arrow Up icon → `*` 前缀 + tips 灰 (2) Radio name 9 个 text node 强制 FIXED 100px → description 列 3 行起点完全对齐 (3) 删旧 M23 卡 (6629:1125) 不合 canonical (4) 加 `Jira requirement` library instance (mainComponent `40:4120` 同文件已有同源 instance clone)，V4-1865 text + setRangeHyperlink `https://tvunetworks.atlassian.net/browse/V4-1865`，M23.8 acceptance `getRangeHyperlink` 返回 `{type:URL, value:<url>}` 非 null 验过 (5) 建 PRD card (1560×596, y=-1100, x=2520) 严格 M23 canonical: navy `#2B2D42` bg / 4px `#33A4FD` LEFT stroke / cyan title color / Layout A-逐行 双语 (3 段: Business goal / Hardware context / Changes overview) / Noto Sans SC ZH @ opacity 0.45 + 字号-2px (6) 建 WiFi section UX 卡 (1280×702, y=0, x=4200) 描述 F0/F1/F2 行为 (Why / Changes / Interaction / Acceptance 4 段) (7) 建 Hotspot section UX 卡 (1280×974, y=1360, x=4200) 5 段 (Why / Changes / Mode transitions / Acceptance / Open questions 含 warning 色) (8) 加 4 个新 captions 标识 Jira / PRD / 2 UX 卡 | 23 (+1 Jira instance +1 PRD card +2 UX cards +4 captions) | 0 | 0 | 0 | **关键反思**：(1) **跳 design-process.md 8 步流程是 process gap** — 我从 v1 起根本没读过 design-process.md §10 完整 8 步，对 "Jira 关联型 mockup" 该走的步骤无意识。原话 "我记得我写过这个规则" 是用户提醒我真源已存在但我没遵守。**回流候选**：mockup 起手协议 Pre-Phase 0 必读 design-process.md § "完整产品需求设计流程 8 步" 块，self-check 8 步覆盖。(2) **M23 canonical "navy + 4px cyan left stroke + Layout A-逐行" 真规则我之前用错** — v2 我做的 M23 卡只对了 navy bg + 双语两点，其它 5 点 (cyan title 不是 brand green / left stroke 4px / Layout A-逐行 而非通段 / Noto Sans SC ZH font / opacity 0.45 + 字号-2px) 全错。**根因**：起手没读 M23 全文，凭印象 "知道 M23 大概是 navy 双语卡" 就写。(3) **"品牌色" 与 "accent 色" 不一样** — 我把 cyan `#33A4FD` (M23 accent + state 色) 和 brand green `#33ab4f` (TVU 品牌色) 混用。M23 canonical 明确 accent = cyan，品牌色另作。(4) **位置/上下文是 UX delivery 的一等公民** — PRD/UX 卡如不紧邻 mockup，工程师阅读时来回滚动，1:1 对应失效。Layout 决策必须把 "deliverable 与 mockup 的空间关系" 当首要约束。Handoff v4 见 doc §10. | 

| 2026-06-01 | TVU Pack | mockup | **V4-1865 v5 · 3 条流程连线 (M23 canonical 箭头 · GROUP 条件标签)** — 用户请求补连线。按 M23 canonical §“箭头画法” + §“条件标签”规则：(1) F3 → F4 水平箭头 “Pick Hotspot · 选 Hotspot” (2) F4 → F5 水平箭头 “Pick WiFi · 选 WiFi” (3) **F5 → F2 跨行垂直上箭头 “Mode = WiFi unlocks Module 2 · Mode=WiFi 解锁 WiFi 段 Module 2”** — 同 x=3440 列跨行 1240→1360 gap。实现点：VECTOR 手动 vectorPaths (`M 0 8 L (len-8) 8 M (len-16) 0 L (len) 8 L (len-16) 16`) + GROUP 标签 (Rect index 0 / Text index 1 避免 Rect 遮 Text) + 标签 bg navy `#2B2D42` / text cyan `#33A4FD` / 双语 EN + Noto Sans SC ZH @opacity 0.45 字号-2px。 | 3 (箭头/标签) | 0 | 0 | 0 | **踩坑实证**：第一版箭头 Y 用了帧中线 (2360)，实际 Mode group `absoluteBoundingBox` probe 拿到 y=1679。**译咲**：跨节点画连线之前必 probe `absoluteBoundingBox` 拿真坐标，不凭帧尺寸 + offset 猜。**回流候选**：figma-technical-reference.md 加 “cross-node 画连线起手必 probe absoluteBoundingBox” sub-clause。 |

| 2026-06-04 | MicroApps | mockup | **MC-44 Graphics Insertion 双预览 — mockup 交付流程** — 用户手动更新 After mockup `4863:9952`(冻结真源)；跑完整交付流程：Section 包裹 (`4909:470`,14 节点,section-append child offset 修正回原绝对位) + F1 走查 (Monitoring/Operator,PRD 5/5,M1/M3/M4/M7 ✅,0 阻断) + 新建 UX Experience Map 卡 (`4913:85`,1200×702,6 段操作者旅程,双语 CJK 灰化) + F2 persona (3 操作侧角色) + 识别 Spec v4 漂移(Overlay→Layer 术语 / 560×315→696×392 尺寸 / PVW strip 描述)。布局约定 GI 例外下限 480→280 作废(用户拍板,已改 PRODUCT_CONTEXT §5.5 + memory)。 | 1 exp-map +1 section | 0 | 0 | 0 | **反思**: (1) 起手 inspect 发现 page 已有 mature Spec v4 注释层 → 任务从"创建"转"对齐+补缺",避免重复造。(2) Figma section.appendChild 把 child 坐标变 section-relative → 视觉位移 section 原点；必须预存 child 绝对位再 append 后修正。回流候选: mockup-conventions §I "section 包裹既有 frame 后必 probe child 绝对位 + 修正" sub-clause。(3) persona/walkthrough 落 doc 不入 Figma 卡 (M23.11)。 |
| 2026-06-05 | MicroApps | mockup | **BM-1047 Token-as-Currency Stage 4–6 + ~9 轮用户走查** — 布局先行重排 6 帧(主路单行+分支行) + 新建 S5(减席告警 Notification) / S7(无权限硬阻断) / Option A(阻断变体 clone) + PM 决策横幅 + token 模型卡 + 8 state-label(M23.7 双语) + 6 正交连线(M23.6 tip 6/6) + 两版本大字 banner(V1$/V2 token) + 跨 page 入口点双向超链接 + S6 固定高内滚动 + 余额 tokens 弱化 + S2/S3 绿橙区分 + PRD 卡升 Spec v1 + Jira ADF 发送(245763) | 9 帧 +多注释 | 0 | 0 | 0 | **反思**: G1 起手没核对 locked spec + M-rule → 主建后用户走查抓 9 处违例(连线 z-order/state-label 50px gap/resize 重置 sizing 裁切/S6 滚动/token 弱化 等多数 spec/规则早有明文)，与 2026-06-01 BM-1047 "8步只命中3/8" **同一复发模式**。回流: catalog 加 Message 3 图标 + Notification SLOT-text 编辑协议(set characters 换 node 失效 ref→先 load 字体/同步拿 ref/set 后不读回/单 mutation)。候选: mockup 起手强制 self-check 清单 + 注释 frame 建后 probe 渲染高 vs 内容(防 clip)+z-order。复盘见 MicroApps/docs/2026-06-05-bm1047-...retrospect。 |

| 2026-06-12 | MicroApps | mockup | **BM-1047 V3 收尾 — caption×16 + 按钮锚定连线×12 + 反馈体系归一 + 全 token 化（3 天 ~30 轮）** — ① 交付层：12 caption + 9 连线 + reconnect map；② stakeholder 反馈 6 点落地（⑧ Service Price 对比面板 V2-harvest / 订阅说明 / 常驻 Top up / 成员拆分 / ④a Seat added 购后引导 / ⑥b 角色变体告警）；③ V2 字段 parity 修复（名单/总价/权益）+ 数据链全通（12,000→$77×1→+1,000→13,000）；④ 反馈卡 6/6 归一 Notification（slide·success/error + alert·warning·closable=false + dialog）；⑤ token 化：文本 119/128 绑 Text Style（含 20/24）、间距 110 处绑定 + 74 处非 scale 吸附、L3 shadow ×7 卡 | 16 卡终态 | 0 | 0 | 0 | **反思**：5 个审查盲区全由用户抓出（字段 parity / 库目录 vs 使用现场 / 反馈控件 inventory / 强调预算 / 跨卡数据链）→ 回流 **M49 umbrella** + catalog §Styles & Variables 段 + Notification 条目刷新。**踩坑**：clone 库 instance 内部件高度缩 8px + row clipsContent 裁字；用户手调后旧 node id 失效需按内容重发现；样式 id slice(46) 截断版本后缀致 import fail。复盘 → MicroApps `docs/2026-06-12-bm1047-v3-finalization-mockup-retrospect-internal-share.md` |

| 2026-06-15 | MicroApps | mockup | **BM-1047 user-dropdown 13 态矩阵 BUILT — 26 卡 (Block1 通用/Block2 MicroApps) + 连线接顺** — 照 recipe 建 section 5728:2302：clone master 5697:2270 token-first 继承 ×26，按 Devansh locked spec override（admin Devansh Rai/premium Sara Park/standard Amir Khan；值/色绿橙红/bar%/Premium 全态橙 star 徽标/按钮主次绿红/Recharge·Contact 省图标/standard 无按钮/no-tokens 删 balance+bar 仅灰 lock）。info-box = 紧凑内联条（owner 拍板 M49.3 正当例外：Notification 最窄 slide 320>248 下拉内容区不兼容；全绑 orange-bg/red-bg/grey-11 库变量 + warning/error/lock 库图标）。Block1 = clone Block2 删 service-price 行。连线：②/⑦ token menu 按钮 Top up→Buy tokens / Manage seats→Commitment + arr 5550:2130 起点 nudge + 5550:2134 已锚 + flow label 5550:2131/2135 verbatim + reconnect_map 更新。新元素 padding/gap/radius 绑 Spacing/Radius 变量；annotation 标签绑 Text Style(24/18/12)。 | 1 section +26 卡 +连线 | I3-1(已修) | 0 | 0 | **反思**：(1) **section 子节点坐标=相对 section origin**，建时误用绝对式大值(sec.y+offset)→子节点落框外触发 I3 overflow，全块截图正常掩盖了 section 级错位。回流候选：mockup-conventions §I "往 SECTION appendChild 后子节点坐标按相对原点设/probe absoluteTransform 在框内"。(2) reconnect_map 旧值(2257 字符)未 merge 直接覆盖 → 丢历史条目。候选：写 sharedPluginData 先读旧值 merge。(3) M49.3 遇 in-dropdown 微 alert 尺度冲突(组件 min-width>容器)→ owner 拍板内联例外，建议 M49.3 补"尺度不兼容时内联+记例外"子句。(4) recipe 自包含 + 起手把全部 kit(色变量/图标 key/Msg-bg/Spacing-Radius via teamLibrary)一次查齐 → 主建零 rediscover，对照 2026-06-05 的 9 轮返工是正向验证。Gate authored 干净，残=instance-internal+圆头像+716 全库债 backlog。 |

| 2026-06-18 | MicroApps | mockup | **BM-1047 V3 账户下拉 menu-style 重构 + 席位页角色 gating（~25 轮 / 8 次用户纠正）** — ① 18 格矩阵(4角色×4态)统一 menu-style 对齐手调标杆 6369:85(母版删→一套干净)；② 告警态=DS Message 组件横幅(warning/error+关闭X)+买家填充 Purchase Tokens+角色菜单行/非买家 Contact Owner(单CTA方案被用户推翻→保留菜单)；③ PM 文案精简(Top up→Purchase Tokens / 合并订阅行 / 横幅动词 top up→purchase)；④ 席位菜单按角色命名(Owner=Manage/Finance=Purchase/Admin=Assign Subscription Seats)；⑤ 席位页角色分流(方案B)+Finance 视图 6477:183 分配禁用灰+Tooltip"Only Owner and Admin can assign seats"+13导航；⑥ 2张 UX 交付卡 M23 双语重排(EN Roboto/ZH Noto Sans SC@0.45/4px stroke)+移左栏内容右移；PRD Version4→3 | 18格+席位视图+2卡 | 人工核验 | non-blocking | 716既有债 | **反思**：6 process gap 中 5 个同源「规则/资产已存在但没前置调用」——告警没用 DS Message(照搬 stale M49.3 例外)/UX卡没按 M23 双语/编造 Contact 文案/卡 placement 横跨模块没做 IA 判断，与 06-01/06-05/06-15「凭印象漏调用已有规则」同一复发模式。回流候选：历史例外引用前复核前提 + M48 self-check 覆盖注释层 + discovery-before-create 扩到文案。复盘 → MicroApps docs/2026-06-18-bm1047-V3-dropdown-menu-style-mockup-retrospect-internal-share.md |

| 2026-06-23 | TVU Pack | mockup | **V4-2312 定稿告警文案打通 — banner×2 + UX卡同步 + 新建 PRD（LCD `0054…` section `8603:281`）** — PM 两句式 `Failed as {CH#} is live with {R_name}. Note that only one 4K stream OR multiple HD streams…` 打通：banner S1=CH2/S2=CH1（PM_X7L）HORIZONTAL-HUG 撑高 54→75；UX Delivery 卡 What changes/Data dependency/Acceptance/Interaction 重写 + 全 13 文本 Inter→Roboto/Noto + M23.14 块制行距；Journey 第4步对齐 + 下移让位；新建 PRD `9070:20526`（右区 Step B 6 段双语需求侧 + M23.8 Jira 真链）。Gate A 已确认，Gate B 待 owner。 | banner×2 + 卡×2 + PRD frame | I1-4 pass | 0 | 0 | **反思**：(1) banner counterAxis=AUTO 自动撑高，HORIZONTAL auto-layout 文本换行驱动，无需手动设高；(2) **refont 用 CJK/拉丁分 run 设 lineHeight 会让 ZH 行内嵌 Latin(HD/4K) 拿到 EN 行距、破坏 bilingual ratio** → lineHeight 须按**块**(EN块/ZH块)设、fontName 才按 script 分（修 8569:3）；(3) **Figma REST 对既有 refont 节点字体缓存滞后**：plugin-API live getStyledTextSegments=Roboto 但 typography-icon REST 读旧 Inter、多次重跑不变，新建 PRD 节点无旧缓存读对 → 机器记录以 plugin-API 为权威源补佐证；(4) B-TYPO/B-SCALE 同 ㉗ 属 §M49.1 file-wide binding，owner-deferred，sibling 卡一致优先于单卡绑定。 |

| 2026-06-23 | TVU Pack | mockup | **V4-2259 Video Orientation 收敛到方案 B（Aspect Ratio 放 Encoding 全局）+ V4-2312 PRD 格式对齐** — UX 决策横竖屏不放首页→放 Encoding（我基于 Larix/OBS/Ant Media/Restream 市场对标建议，用户确认），命名 Aspect Ratio、值 16:9/9:16。LCD `0054…` page `8790:2`（A/B 对比稿）：①Encoding 行 8878:2 改名+值；②Option-B UX 卡 8882:2 + PRD 8805:2 改「已选 B」；③确认弹窗 8803:2 按路→全局；④删 Option A（Section② 8883:185 12 子 + 取舍卡 8882:6，删前 probe 无外部连线）；⑤Section③ 上移填空档+改名+tidy。另 V4-2312 PRD 9070:20526 段头 ZH·EN 单空格→EN·ZH 双空格对齐 UX 卡。 | Encoding 行 + UX 卡 + PRD + 确认弹窗；删 1 Section+1 卡；V4-2312 PRD 6 段头 | overlap 0 | 0 | 0 | **反思**：(1) UX 信息架构决策（参数归属哪个设置页）用市场对标 + 单一职责框架（朝向=输出格式属性，与 codec/码率同族→Encoding；Receiver 页=目的地选择，单一职责）能高置信直接定，不必抛 PM；(2) 收敛 A/B 决策稿删 rejected option 前必 probe 跨区连线（M-LIFECYCLE 删除 gate + I5），本次唯一连线在区内随删、无悬空；(3) 删 rejected option 后整页要 tidy（移内容填空档 + section 改名去 A/B 框架），否则留「东西被删过」的空洞；(4) 同 mockup 文件多页字体基线可能不同——V4-2259 页注释本就 Roboto/Noto（无 V4-2312 的 Inter→REST 滞后坑），改 .characters 不动 font 则 live=REST 一致。 |

| 2026-06-23 | TVU Pack | mockup | **V4-2259 续跑 — V3+V4 双设备 Aspect Ratio 设置页 + 拍摄×输出旋转保全分辨率 2×2 输出画帧矩阵（LCD `0054ib` page `8790:2`）** — ① owner 纠偏「效果图＝输出画帧（非 LCD 屏换内容比例）」，删误建 home-9:16 重做；核心机制＝源拍摄方向≠输出比例时顺时针转 90° 填满保全分辨率（对应 Jira "ensuring full resolution"）；② 新建 V3 Encode 页 `9102:2`（clone 历史区 4594:930 + Aspect Ratio 行 16:9/9:16，与 V4 一致）放 Section ②（改名 ·V3+V4）；③ 新建 Section ③ `9100:228` 输出矩阵：4 帧（横/竖拍 × 16:9/9:16，含 2 转90° 格，子 rect relativeTransform 填满无黑边）+ 标签 + M23 六段双语 UX 卡 `9120:138`；④ home 8833:2/卡 8834:2 移回 Section ①；⑤ 8882:2 加双设备句；PRD 8805:2 修掉 open-question TBD→DECIDED + 加四组合旋转段 + 双设备。 | V3 页 + 输出矩阵(4帧+标签+1卡) + 2 卡/PRD 更新 + 1 home 移位 | PASS（本轮负责规则）| 0 | 0 | **自检**：本轮负责规则全 PASS（integrity / overlap 0 / typography 无Inter无glyph / bilingual 0 / connector）；colors/library-origin/binding-fidelity findings = file-wide owner-deferred 存量（§M49.1，命中存量 8805/8806/8833 节点为证），不逐节点修。**反思**：(1) 「效果图」语义起初误读为 LCD 屏换比例、owner 纠正为输出画帧+旋转保全分辨率——交付物语义有歧义时先建 1 个样张给 owner 确认再批量（已用此法止损，仅返工 1 帧未铺开）；(2) 跨页 clone + SECTION appendChild 子节点坐标走 section 局部（abs=local+origin），右列等高竖帧排布要按「最高帧+caption」算行距防叠压；(3) LCD 文件 conformance 三类 findings 是 owner-deferred file-wide 债，逐节点修破坏 sibling 一致。 |

| 2026-06-23 | TVU Pack | mockup | **V4-2259 纠偏续修（owner 两轮纠正 + 补跑 design-walkthrough F1）** — LCD `0054ib` page `8790:2`。owner 给真实规则后系统纠偏：① **效果图＝输出画帧（非 LCD 屏换比例）**；规则 = 拍摄方向×输出 3 情形：横拍仅 16:9 / 竖拍 16:9（顺时针转 90° 填满·全分辨率·无黑边）/ 竖拍 9:16（正立·两边留黑边 pillarbox）；Home 预览＝Receiver（WYSIWYG）。② 删冗余确认弹窗 `8803:2` + UX 卡 `8806:10`（设置页 OK 即确认）。③ PRD `8805:2` 从旧 3 段**重建为 canonical 6 段 Step B**（需求来源/背景/现状/功能需求/验收/优先级排期，节点 `9130:159-164`）。④ 输出矩阵 `9100:228` 改为 3 情形：竖拍→9:16 帧 `9113:141` reshape 成 16:9 黑底+居中竖图+两边 ~109px 黑边；删孤儿 caption + 旧列头；重排横拍 1 格/竖拍 2 格。⑤ UX 卡 `8882:2` + `9120:138` 同步去「4 组合/笼统去黑边/confirm-on-switch」。⑥ owner 自建 V3 页 `9126:1394` 取代上轮 `9102:2`（已移除）。 | 删 2 帧/卡 + PRD 6 段重建 + 矩阵 reshape+重排 + 2 卡改文案 | PASS（本轮负责规则）| 0 | 0 | **自检**：本轮负责规则全 PASS（integrity / overlap 0 / typography 0 glyph 0 Inter[修了 caption → glyph] / bilingual / connector）；colors/library-origin/binding-fidelity = file-wide owner-deferred 存量（§M49.1），不修。**反思（≤3 句）**：(1) **交付物语义有歧义先建 1 样张给 owner 确认再批量**——本轮 home 9:16 用此法止损，但「去黑边/4 组合/confirm」几处仍因没在收尾前跑 design-walkthrough 而漏，被 owner 抓；(2) **Jira mockup 收尾前必跑 F1**，对照 canonical 6 段 PRD 结构 + 交叉核对文案 vs 真实产品规则（既有规则未触发＝激活层失败，非缺规则）；(3) caption 用 → glyph 会被 M48 glyph 闸抓（改词去 glyph）。 |

| 2026-06-24 | TVU Pack | mockup | **V4-2259 定稿后增量 —— UX 卡补「配置实时生效+自动保存+重启不丢失」行为规格** — LCD `0054ib` page `8790:2`，矩阵卡 `9120:138` Interaction section（节点 `9121:142`）追加双语 bullet。owner 澄清语义（初版误读「需手动保存」→ 改「自动保存、重启不丢失」）。单点落矩阵卡，未下沉 PRD/未复制落点卡。 | 1 节点追加双语 bullet | I3 overflow 0 | 0 | 0 | **自检**（REST token 无→use_figma in-file 机检替代）：I3=0 / Inter=0 / glyph=0 / bilingual OK；file-wide findings = owner-deferred §M49.1 不修。**反思**：行为规格语义有歧义时先与 owner 对齐再定稿（本轮初版方向写反、一轮纠正即修）；运行时行为单点落矩阵卡 Interaction（canonical home），不三处复制免维护漂移。 |
