feat(storyboard): SB-1 规则脚本拆分器(D-M4-1 拍 A 档后首件) - #224
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
D-M4-1 拍板 A:规则拆分。 纯规则零 LLM —— 没有 API key 也能用、行为可断言可单测不花钱;LLM 辅助质量不可断言且成本 ≥L,留作 AG-5 chat 模板后的可选增强(C 档不废弃,只延后)。拍板同时记入 MASTERPLAN §9 与速查表。
做了什么
lib/features/storyboard/util/script_splitter.dart(纯 Dart,零 Flutter 依赖):策略:
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.)丢弃,让后续行顶上来。另外两处按真实粘贴场景处理
\r留在行尾污染 promptlabel是段首行截 60 字(展示用),notes恒为全文 —— 截断不该丢内容。测试 +22
两种策略、六类编号前缀、不误伤内容数字、只剥段首行、退化输入(空文本 / 纯空白 / 单行 / 首尾空行)、顺序稳定、
ShotDraft值相等。验证
flutter analyze lib test→ 0 issuesflutter test --exclude-tags golden→ +1905 / 0 失败 / 66 skip(feat(canvas): SB-4 shot→video 直达——备注 + 镜头级参数一并带过去 #223 后是 1883)文档
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