Skip to content

feat(canvas): SB-4 shot→video 直达——备注 + 镜头级参数一并带过去 - #223

Merged
KerroKapple merged 1 commit into
mainfrom
feat/sb-4-shot-to-video
Aug 7, 2026
Merged

feat(canvas): SB-4 shot→video 直达——备注 + 镜头级参数一并带过去#223
KerroKapple merged 1 commit into
mainfrom
feat/sb-4-shot-to-video

Conversation

@KerroKapple

Copy link
Copy Markdown
Owner

M4 E1,依赖 SB-3(#221)。shot 面板加第二个生成入口:以本镜备注为 prompt 新建 video config 节点 + narrative 边,并把 SB-3 的预期时长 / 预期运镜一并写进去,省得用户在 video 面板重填一遍。

语义:带过去的是意图,不是承诺

video 面板会按所选 provider 的 supportedDurations / supportedCameras 钳制 —— 不支持的值落地即被丢回未设置。这正是 SB-3 说的「能不能真做到由生成时收口」。本卡只负责传,不做任何能力判断(此刻还没选 provider,也判断不了)。

未设置的参数不写空键:让 video 面板照常按 provider 取默认,而不是被一个显式 null 顶掉。有用例钉这条。

一处重构

把两个生成入口的公共主体抽成 _generateFromNotes(type, extraConfig)。原先只有图片一条,现在两条 —— 复制一遍迟早发散,而这段里有几个不能漏的约束:

  • notifier 与文案在 await 前取好(面板中途销毁也保证「节点+边」成对落地)
  • 节点失败与连线失败分开报(建节点都失败了就没必要报连线)

测试 +5

按钮门控(无备注禁用)、建 video config + narrative 边、镜头参数透传(duration_ms 秒×1000 / camera 枚举名)、未设置时不写空键、生成图片按钮不受影响(仍建 image 且不带时长/运镜 —— 图片没有这两个概念,不该顺手塞进去)。

验证

  • ARB +1 键(en/zh 同 commit,gen-l10n 已跑并提交 generated/
  • flutter analyze lib test0 issues
  • flutter test --exclude-tags golden+1883 / 0 失败 / 66 skip

已 rebase 到含 SB-6(#222)的 main 上重跑,1883 = 1878 + 5,与预期吻合。

说明

未跑两路对抗评审 —— 本会话指令是不主动派 subagent。/code-review 由你触发。

🤖 Generated with Claude Code

M4 E1,依赖 SB-3(#221)。shot 面板加第二个生成入口:以本镜备注为 prompt
新建 video config 节点 + narrative 边,并把 SB-3 的**预期时长 / 预期运镜**
一并写进去,省得用户在 video 面板重填一遍。

带过去的是**意图**:video 面板会按所选 provider 的 supportedDurations /
supportedCameras 钳制,不支持的值落地即被丢回未设置——这正是 SB-3 说的
「能不能真做到由生成时收口」。本卡只负责传,不做任何能力判断。

未设置的参数**不写空键**:让 video 面板照常按 provider 取默认,而不是被一个
显式 null 顶掉。

实现上把两个生成入口的公共主体抽成 _generateFromNotes(type, extraConfig)
——原先只有图片一条,现在两条,复制一遍迟早发散(notifier 与文案在 await 前
取好、节点/连线失败分开报这些约束一处都不能漏)。

ARB +1 键(en/zh 同 commit,gen-l10n 已跑并提交 generated/)。
测试 +5:按钮门控、建 video config + narrative 边、镜头参数透传、未设置时
不写空键、生成图片按钮不受影响(仍建 image 且不带时长/运镜——图片没有这两
个概念)。
analyze 0 issue;全量非 golden +1853 / 0 失败 / 66 skip(本分支自 #221 的
1848 起 +5)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@KerroKapple
KerroKapple merged commit 861bbb8 into main Aug 7, 2026
5 checks passed
@KerroKapple
KerroKapple deleted the feat/sb-4-shot-to-video branch August 7, 2026 14:19
KerroKapple added a commit that referenced this pull request Aug 7, 2026
D-M4-1 拍板 **A 规则拆分**:纯规则零 LLM——没有 API key 也能用、行为可断言
可单测不花钱;LLM 辅助质量不可断言且成本 ≥L,留作 AG-5 chat 模板后的可选
增强(C 档不废弃只延后)。拍板同时记入 MASTERPLAN §9 与速查表。

storyboard/util/script_splitter.dart(纯 Dart,零 Flutter 依赖):
ShotDraft{label, notes} + splitScript(text, strategy),策略 blankLine
(空行分段)/perLine(每行一镜)。

**剥行首编号是本卡最易写漏处。** 用户粘来的文本十有八九带 `1.`/`镜头1`/
`第3镜`/`SHOT 1`/`# `,留着会污染 prompt(「1. 山径破晓」让模型去画一个
数字 1);但不能剥过头——「1920 年代的街道」「3D 渲染质感」里的数字是内容。
分界:有词锚的(镜头N/第N镜/shot/scene)分隔符可有可无;光秃秃的数字**必须**
跟分隔符才算编号。markdown 井号单独一趟剥——它既可独立出现(`# 标题`)也可
叠在编号前(`### Shot 1 dawn`),塞进同一个可选分组会让前者匹配失败(实测
踩到)。只剥**段首那一行**:段内的「2 号机位跟拍」是内容不是第 2 镜;剥完
为空的行丢弃让后续行顶上。

另外两处按真实粘贴场景处理:CRLF 与单独 CR(老 Mac/某些编辑器)都归一 LF,
否则 \r 留在行尾污染 prompt;「空行」按 trim 判定,因为从 Word/网页粘来的
空行常带空格或 tab。label=段首行截 60 字(展示用),notes 恒为全文。

测试 +22:两种策略、六类编号前缀、不误伤内容数字、只剥段首行、退化输入
(空文本/纯空白/单行)、顺序稳定、ShotDraft 值相等。
analyze 0 issue;全量非 golden +1905 / 0 失败 / 66 skip(原 1883)。

文档:MASTERPLAN §9 拍板记录、BOARD M3 分镜行 + 近期落地表、
features/storyboard/README.md 脚本拆分节、docs/CLAUDE.md 结构快照。
**顺带补 SB-4 的 BOARD 行**——#223 漏了,PLAYBOOK 要求文档同 commit。

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant