# UX 穿透式体验走查（规则 13 · 持续记录）

> 方法：Playwright `_electron` 驱动真实 app（构建产物）→ 每步截图 + 读 DOM → 以真实用户视角判断
> 体感 → 记录问题 → 转优化项（用户可见的优化走规则 8 样张 + 规则 7 评审）。
> harness：`tests/ux/walkthrough.mjs`（截图产物 `tests/ux/shots/`，不入库）。
> 真实外呼/花额度步骤（调 AI 生成、导出）默认不跑，先问用户。

## 本轮目的
1. 建立规则 13 的走查方法 + Playwright `_electron` harness（沉淀为长期自动化套件）。
2. 顺带对 runtime.ts 6 步拆分做**体验级回归验证**（不只是单测/build 绿）。

## 已走的腿（截图见 tests/ux/shots/）

### 01 · 项目库（landing）
- url `#/studio`（无项目时落在项目库）。渲染正常：标题「Nomi 项目库」、"30 秒体验"hero + 3 张示例卡
  （漫剧/产品 demo/短视频）、搜索框、真实项目网格（交易体系搭建/Music/Pictures/多个示例与未命名项目）。
- 体感：干净、光模式、密度合理，**无白屏无报错**。
- 端到端意义：渲染 → IPC `nomi:projects:list` → **重构后的 `projects/repository.listProjects()`** → 真实项目 → 渲染。✅

### 02 · 打开示例项目 → 工作台（studio / 生成画布）
- 点「示例：30 秒产品介绍」→ url `?step=generate#/studio?projectId=…`。
- 渲染正常：顶部导航（项目库 | 创作/生成/预览 | 素材库/模型接入/导出）、画布渲染出真实图片节点 +
  连线（一排促销图节点 + 多条 edge）、底部时间轴（图片轨/媒体轨带片段、播放头、缩放 100%）、右侧 AI 面板「Nova 生成」。
- 体感：**功能正确**，画布/素材/时间轴都真实加载；但密度高、节点类型多（文/图/视频/全景/3D），
  对纯新手偏"工程师向"（与早前 6 角色体检的发现一致）。
- 端到端意义：开项目 → IPC readProject / 列资产 → **重构后的 runtime（projects/assets/runtimePaths）** → 画布 + 资产渲染。✅

## 体验级回归结论
runtime.ts 6 步拆分后，**项目库 → 开项目 → 工作台（画布/素材/时间轴）主链路在真实 app 里渲染正常、数据正确**，
非仅 mock 单测。拆分未破坏用户可见体验。

### 03 · 创作 tab
- 左：富文本编辑器（示例故事，镜头/核心/故事样稿分段，工具条 加粗/斜体/标题/列表/引用/撤销/重做）；
  右：「Nova 创作」AI 面板（灵感建议 chips「一段悬疑开场/续写下一段/改成更童话的语气」+ 输入框 + **拆镜头**入口）。
- 体感：直观——左写右问、拆镜头一键。清爽、光模式、密度合理。✅

### 04-05 · 预览 + 模型接入弹窗
- 预览：合成帧渲染（599 元促销图）+ 播放控制条（3.1s/5.0s、16:9、显示/遮罩、100%、**导出 MP4**、安全框）+ 底部时间轴（图片轨 1 片段 / 媒体轨 0）。
- 模型接入弹窗：列出已配模型——文本（moonshot-v1-128k-vision-preview、GPT-5.5）、图片（Gemini Omni Video、GPT Image 2），「+ 添加模型」。清晰。
- 体感：用户已配好模型，状态一目了然。✅

### 06 · 导出（真实 ffmpeg，已实跑）
- 点「导出 MP4」→ 真实 ffmpeg 运行 → 成功 toast：`已导出到项目 exports 文件夹：exports/nomi-export-…mp4`。
- **ffprobe 探测产物**：`H.264 / 1920×1080(1080p) / 4.1s / mp4`，**无音频流**——正确（该时间轴仅图片轨、无视频源音轨；音频本就随视频自带音轨而来）。
- **没有**出现"暂不包含音频"文案——证实 `ab88a70` 删除残留文案的改动在构建里生效。
- 体感 + 端到端：导出链路（electron/export + runtime 导出编排）经 6 步拆分后**完好**，输出符合 user-guide 描述（MP4/H.264/1080p/letterbox）。✅

### 07 · 生成（尝试 + 发现自动化边界）
- 探针 `tests/ux/probe-generate.mjs`：确认单节点 **「生成」**控件存在（区别于要避开的**「批量生成所有选中节点」**、每节点的「查看生成记录」、AI 面板「Nomi 生成」）。
- **发现（自动化边界）**：盲驱动点击画布节点会触发**画布 pan / pointer 被 canvas 容器拦截**，节点滚出视野（截图 07 画布变空）。要可靠选中单节点生成需先 fitView + 精确 DOM 定位，且
  **「生成」与顶部「生成」tab 文本同名**易混淆——盲点有**误触批量生成、浪费额度**的真实风险。
- 结论：**真实 AI 生成这条 cost 腿不在不可靠状态下盲跑**（rule 13）。可选三条可靠路径：
  ① 创作 tab「拆镜头」（文本 agent，便宜、按钮稳定，走 runtime agent 链路）；
  ② fitView + 精确定位单图片节点的「生成」（我可投入做稳）；③ 用户手点、我观察。
- 注：生成走的 `runTask` 仍在 runtime.ts 未拆动；`responseParsing`（已拆+14 单测）覆盖其解析分支——**refactor 回归风险低**，此腿主要价值是观察生成 UX（loading/结果/错误）。
- 创作 tab（写故事、「拆镜头」入口的可达性与文案）。
- 模型接入（OnboardingWizard）流程门槛走查。
- 预览 / 导出入口（看文案与状态，**不实际导出**）。
- 素材库面板。
- 已知待复核：首页"30 秒体验"在未配模型时是否静默失败（早前体检 P0）；导出文案音频一致性（已修，复看）。

## 发现 → 优化（持续累积；用户可见项走规则 8）
- （暂无新增 P0；沿用 `docs/audit/2026-06-04-full-codebase-review-6role.md` 的 UX 发现，走查逐条复核/补充。）
