Skip to content

feat(storyboard): SB-1 规则脚本拆分器(D-M4-1 拍 A 档后首件) - #224

Merged
KerroKapple merged 1 commit into
mainfrom
feat/sb-1-script-splitter
Aug 7, 2026
Merged

feat(storyboard): SB-1 规则脚本拆分器(D-M4-1 拍 A 档后首件)#224
KerroKapple merged 1 commit into
mainfrom
feat/sb-1-script-splitter

Conversation

@KerroKapple

Copy link
Copy Markdown
Owner

D-M4-1 拍板 A:规则拆分。 纯规则零 LLM —— 没有 API key 也能用、行为可断言可单测不花钱;LLM 辅助质量不可断言且成本 ≥L,留作 AG-5 chat 模板后的可选增强(C 档不废弃,只延后)。拍板同时记入 MASTERPLAN §9 与速查表。

做了什么

lib/features/storyboard/util/script_splitter.dart(纯 Dart,零 Flutter 依赖):

List<ShotDraft> splitScript(String text, {ScriptSplitStrategy strategy})

策略:blankLine(空行分段,适合有段落结构的剧本)/ perLine(每行一镜)。

剥行首编号 —— 本卡最易写漏处

用户粘来的文本十有八九带 1. / 镜头1 / 第3镜 / SHOT 1 / # 。留着会污染 prompt —— "1. 山径破晓" 会让模型去画一个数字 1。但也不能剥过头:"1920 年代的街道"、"3D 渲染质感"里的数字是内容。

分界:

形态 规则
有词锚(镜头N / 第N镜 / SHOT N / Scene N 分隔符可有可无
光秃秃的数字 必须跟分隔符(. ) -)才算编号

markdown 井号单独一趟剥。它既可独立出现(# 山径破晓)也可叠在编号前(### Shot 1 dawn)—— 我第一版把井号塞进同一个正则的可选分组,结果 # 山径破晓 匹配不上(可选的井号匹到了,但后面必需的编号组为空)。拆成两趟既正确又好读。

只剥段首那一行:段内的 "2 号机位跟拍" 是内容,不是第 2 镜。剥完为空的行(整行就是个 1.)丢弃,让后续行顶上来。

另外两处按真实粘贴场景处理

  • CRLF 与单独的 CR 都归一成 LF(老 Mac / 某些编辑器)—— 否则 \r 留在行尾污染 prompt
  • 「空行」按 trim 判定 —— 从 Word / 网页粘来的"空行"常带空格或 tab

label 是段首行截 60 字(展示用),notes 恒为全文 —— 截断不该丢内容。

测试 +22

两种策略、六类编号前缀、不误伤内容数字、只剥段首行、退化输入(空文本 / 纯空白 / 单行 / 首尾空行)、顺序稳定、ShotDraft 值相等。

验证

文档

MASTERPLAN §9 拍板记录、BOARD M3 分镜行 + 近期落地表、features/storyboard/README.md 脚本拆分节、docs/CLAUDE.md 结构快照。

顺带补了 SB-4 的 BOARD 行 —— #223 漏了,PLAYBOOK 要求文档同 commit,是我的疏漏。

下一张

SB-2(脚本导入对话框 + 批量建链,M 级)依赖本卡,做完「粘贴脚本 → 分镜链」这条入口就通了 —— 那是 E1 的最后一块。

说明

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

🤖 Generated with Claude Code

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>
@KerroKapple
KerroKapple merged commit bc65ef4 into main Aug 7, 2026
5 checks passed
@KerroKapple
KerroKapple deleted the feat/sb-1-script-splitter branch August 7, 2026 15:40
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