# 批A 故事板融合+分镜板/分镜浏览退役 工单（三视图收敛战役[并行批 B]）

## 背景
三视图审计定谳（~/shared/2026-09-28/glm-three-views-audit.md）：故事板(review_read)保留为唯一审读面；分镜板(storyboard_board)退役（board JSON 唯一消费者+媒体全挂+快照双真相）；分镜浏览(scene_shots)合并后退役（卡面~70-80%是故事板子集）。本批 = KAP 仓前后端一体退役 + 三件独有交互平移进故事板。
依赖基线：main @ 9ac92c35（「审读」改名「故事板」commit）。

## ⚠ 并行批纪律
另一司机正在 kais-hermes-skills 仓做批B（KMC 管线 board 组装段退役：plugins/kais_aigc/p11a_preview_clips.py + canvas_sync.py + pipeline/phases/__init__.py）。**本批禁碰**：/data/workspace/kais-hermes-skills 仓任何文件（跨仓天然互斥，工作目录只许在本 worktree）。另：主干 checkout 的 `config/h3-lora-registry.json`、`docker-compose.real.yml`、`test/e2e/mock-backend/server.mjs` 有其他会话在途改动——本批若需动 server.mjs，最小触碰并在交付文档声明（合并冲突预期内）。

## 工作目录
Worktree：`/data/workspace/kais-aigc-platform-wt/storyboard-consolidation`（基于 9ac92c35，已建好）。禁动主 checkout。

## 任务五件
### 件1 FlowCanvas 页签与分支退役
- `packages/infinite-canvas/src/components/FlowCanvas.tsx`：删除「分镜板」(storyboard_board)与「分镜浏览」(scene_shots) 两个 ViewModeButton（~1172-1177）+ 对应 view 分支渲染块 + 两个 import
- `packages/infinite-canvas/src/store/canvasStore.ts`：ViewMode union 删除 `'storyboard_board' | 'scene_shots'` 成员（tsc 编译强制清所有残留引用；注释同步更新）
- 检查 canvas DAG 注册面（grep DAG_NODES/storyboard_board，packages/infinite-canvas 内）有则一并处理并在交付文档说明；保留「故事板」页签与 `review_read` 分支不动

### 件2 故事板融合三件平移（审读面保持纯读零写）
- **2a 跳画布聚焦**：分镜卡单击 → `setFocusAssetNodeId(<shot 对应 asset node id>)` + `setViewMode('canvas')`（参照 SceneShotBrowser.tsx:77-80 的行为契约）。若 reviewReadModel 的 Shot 类型缺 node id，扩展 extractReviewModel 纯派生补齐（零 IO）
- **2b 场景折叠**：contiguous 场景分组头（ReviewReadView.tsx:559-590）加折叠 toggle，local state 默认展开=缺省零行为
- **2c 引用资产缩略 hover**：参照 SceneShotBrowser 的 referencedAssets 数据装配（StoryboardTimeline.tsx:735-763），从 graph+rawDataByNodeId 纯派生角色/场景缩略，hover 展示。禁新增任何网络请求
- 纪律：每图必判、零判定件、审核面零破坏；Kai 审读页原则「同一任务视图必融合」——合并后故事板一页承载 导航+审读

### 件3 分镜板前后端一体删除
- 删 `packages/infinite-canvas/src/components/storyboard/StoryboardBoard.tsx`、`packages/infinite-canvas/src/components/SceneShotBrowser.tsx`
- `packages/infinite-canvas/src/services/canvasApi.ts`：删 `fetchStoryboardBoard` 及 storyboard board 专属类型（注意主干该文件有他会在途 1 行改动，本 worktree 干净，正常删）
- 删后端路由 `src/routes/v1/storyboard/`（index.ts）+ `src/router.ts` 挂载行；全仓 grep 确认无其他消费者后再删

### 件4 e2e 引用清理
- `ls packages/infinite-canvas/test/e2e` 实读，grep storyboard/scene_shots/storyboard_board 引用；mock-backend/server.mjs 的 storyboard 桩与相关测试用例按需更新/删除，保持 e2e 套件可编译可跑（不要求全量跑通浏览器 e2e，要求无引用悬空）

### 件5 测试与验证
- 新增/扩展 reviewReadModel 单测 ≥2 条（shot→node id 派生正向 + 缺节点降级）
- 既有测试零回归：`ls packages/infinite-canvas/src/lib/*.test.* 实读真名`，点名复跑 reviewReadModel 相关套件
- `npm run build` 全绿（tsc 类型检查覆盖删除面）
- 验证：`grep -rn "fetchStoryboardBoard\|StoryboardBoard\|SceneShotBrowser" packages/infinite-canvas/src src/ | grep -v test` = 0 命中

## 禁碰面（越界=拒收）
- `review_read` ViewMode key、review-frames API 面（src/routes/canvas/v2/review-frames.ts）、ReviewReadView 的只读零写契约
- `config/h3-lora-registry.json`、`docker-compose.real.yml`（他会在途）
- 生产部署（:10588 不部署不重启，主会话验收后处置）
- kais-hermes-skills 仓（批B 面对面互斥）

## 验收命令（交付文档附实测输出）
```
cd packages/infinite-canvas && npm run build
npx vitest run src/lib/reviewReadModel.test.ts（真名 ls 实读后点名）
```

## 交付
- commits 到分支 `wt/storyboard-consolidation`（不自行 merge）
- `DELIVERY-storyboard-consolidation.md`（worktree 根）：改动清单/件1-5落实表/偏离声明（有则全列）/**批B 交接材料**（KMC 侧删除不受本批影响即「前端已无 /api/v1/storyboard 消费者」的 grep 证据）

## 授权
- 工单缺陷可自纠偏，全程偏离声明披露；禁碰面是硬边界，拿不准停笔写交付文档
