feat(video): 《拆解 Claude Code》、Pipeline Series、B 型信源取证基建 - #1110
Merged
ThreeFish-AI merged 14 commits intoAug 21, 2026
Conversation
新增《拆开 Claude Code:让 AI 动手的四层机制》——开源课程 Learn Claude Code 的 工具与执行四章(Agent Loop / Tool Use / Permission / Hooks)成片工程:170 句 / 4048 字 / 7 幕 / 39 镜,陶土橙内核 + 石青外挂机制 + 警示红拒绝闸门三色契约 (对底色实测 6.06 / 9.19 / 6.00 : 1),配音 sunny-steady + me-bright.wav。 为承载「独立新系列」与「非论文信源」,同步做三件基建: 1. series.json 多系列化:顶层单 series 对象改为 seriesList[],check_series.py 相应分层——反串线规则跨系列全局生效(两系列口播互不引用),顺序类规则按系列内 判定(episode 的 1..N 连续性只在系列内成立,slug 仍全局唯一); test_check_series.py 增 6 例多系列语义用例。 2. Stage ① 泛化为两类信源:skills/01 更名 01-source-extraction.md,A 型论文正文 原样保留,新增 B 型(文档/代码/课程站点)大节——双轨取证(仓库固定 commit + 站点正文)、证据三级(三级「他人对闭源产品源码的分析」必须带归属句)、数字口径 须可复算、二次信源分歧清单必备。新增 source_ledger.py(fetch/list/verify, repo 类固定提交 raw 指纹漂移即 FAIL,site 类只比归一正文、漂移报 WARN) + 11 例单测;管线测试 46 → 63 项全绿。 3. 两条实测口径沉淀:skills/02 写明 chars_per_min=280 是含停顿的等效口径 (实测纯语速 301 字/分 + 停顿开销抵消,全片时长估算误差约 1%),推论「字数是 硬约束、句数不是」;skills/06 新增可复用视觉母题库,并显式化 A 档冻结清单的 同步义务限于同系列内。 内容侧两处校准:课程标注的章节行数在固定提交上任何口径都复算不出,改为口播只说 趋势、画面给实测值与取数日期;课程「循环里只改了一行」经逐章 diff 实测只在第二章 成立,改用「骨架四章一字未改,变的只有执行那一步怎么写」(总行 141→255 增 81%, 而循环函数恒在 20–28 行)。另实测确认 pnpm 11 的 ERR_PNPM_IGNORED_BUILDS 对本 工程无害,刻意不改 A 档冻结文件去消音。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
ISSUE-164:与 ISSUE-162(取数姿势错,读了未水合 DOM)是**不同失效模式**——本例站点 为 SSG 预渲染、取数姿势正确,但站点标注的四章行数(102/135/180/232)相对其自身代码 已陈旧,在固定提交上任何口径都复算不出(s04 声称 232 而实测非空仅 213)。处置:口播只 说趋势、画面给实测值+口径+取数日期,并新增 source_ledger.py 把「信源陈旧可发现」变成 机器门。防范:凡引用他方标注的规模数字,必须在固定版本上自己复算并写明口径;同一信源 的散文与代码新鲜度要分别评估。 ISSUE-165:ERR_PNPM_IGNORED_BUILDS 只表示 postinstall 被跳过,不等于依赖不可用。 esbuild 的平台二进制走 optionalDependencies、不依赖 postinstall,端到端验证(transform 调用 + remotion bundle 跑到 100%)确认旧写法完全可用,故撤销全部「修复」以保四集 .npmrc 逐字节一致。防范:报错不等于故障,先做端到端验证再动手——为消掉一条无害提示而改动跨集 冻结文件,比那条提示本身更贵。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
以已合成的 67 句真实音频时长重算 beat 帧位后抽帧复检发现(合成音频前用等长外推 时看不出来,因关键帧落点不同): 1-D 停止标记打叉:斜叉直接压在亮色 tool_use 文字上,两者互相干扰致都难辨认。 改为叉线加底色描边(两层线)+ 打叉后标记文字压暗,让「被否定」的语义清晰。 1-E 十个抽屉:最长标签「工具与权限上下文」与固定在右下角的章号重叠。标签加 右侧让位内边距。 顺带验证:39 个 beat 窗口在真实时长下最短 7.8 秒,无动画被截断风险;全片外推 14:10,落在预算窗内。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
P2 全幕音频合成完毕后按真实时长复检发现:2-G 三组 batch 的落位写死为 12/34/52 帧,与口播推进脱钩——配音时长一变就会出现「三组都排完了,旁白才刚说到第一组」。 改为由 beat 内句边界传入(p2-25 讲划第一组、p2-26 讲夹在中间的单独一组),说明 文字同样跟随。复检确认:batch 1 恰在「连着能并行的划成一组」时出现,batch 2/3 落在「中间夹着不能并行的就单独一组」。 同类风险已全仓扫过:P0/P4 各余一处硬编码 delay,均为 beat 开头即出现的常驻角标, 不与后续句子绑定,保留。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
P3 全幕音频合成后按真实时长逐镜复检,抓出三处: 1. 3-F 优先级堆叠方向反了(实质错误):stack 数组按优先级升序声明,却正序渲染并 高亮首项——画面等于宣称「你的全局配置最大」,而旁白说「公司策略压过本地配置」。 改为倒序渲染(最高优先级在顶)+ 亮度阶梯按优先级递增 + 箭头自下向上,并把 「压过」改成跨第 1 行到第 3 行的括号连线,明确是口播点名的那一对;收束时只留 这两级亮着。反枚举原则下用亮度而非色相编码层级。 2. 3-C 审批卡盖住三道闸门:卡片弹出时闸门整体上移让位,「停在第三道闸门前等待」 这层语义才看得见。 3. 3-G「命中即出」三条标签随各级漏斗宽度参差:改为每级占满容器、卡片内部居中, 标签统一挂在最宽一级的右边界,读作同一个侧向出口。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
P4 前四镜按真实音频时长复检发现 4-D 严重错位:四个插槽卡片压在环上并互相重叠, 「工具执行之后」被完全遮住,右侧还有溢出碎片。根因是 SlotRing 的绝对定位偏移 (size*0.24 / 0.68 一类的经验值)与调用方给的容器尺寸不匹配。 改法不是继续调偏移,而是把契约显式化:SlotRing 导出 SLOT_W / SLOT_GAP,四个 插槽固定排在四角,并在 docstring 写明「容器至少 size+2*(SLOT_W+SLOT_GAP) 宽、 size+220 高,环须居中」;调用方按该公式推导容器与环位,不再各自试参数。 顺带把闸门迁移轨迹的终点对准右上插槽左缘(此前偏低、离目标远,读不出「搬进这个 插口」),回流箭头起点也改为按容器尺寸推导。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
P4 全幕音频齐后复检 4-G(全片安全主题的收口镜):旁白「配置里的禁止和询问仍然 要再走一遍」有四秒多,而冲击波在 16 帧内就衰减完毕,此后画面静止——观众在这句 的大部分时间里看不到「顶住」这个动作,语义落空。 改为:弹回后保持小幅慢周期的抵抗抖动,冲击波每 34 帧复发一次,读作「持续施压 → 持续被顶回」,与「仍然要再走一遍」的持续性对应。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
配音 170/170 完成(sunny-steady + me-bright,纯语音 13.20 分钟,实测语速 307 字/分, 墙钟 2.1 h)。时长双口径门通过:估算 14.5 / 实测含时距 14.2 分钟,均在预算窗 13.0–14.6 内;字幕 srt+vtt 各 170 cue;主题对比度 FAIL 0;尾幕渐黑窗口贴合末 beat (末帧灰度 0.0118,无提前收尾的长黑屏)。 同时把本轮最有复用价值的一条做法写进 skills/08:**分幕音画复检**——配音是全流程最 慢的一环(2 小时量级),而动画与旁白的错配只在真实时长下才暴露,故不要干等成片, 每合成完一幕就用该幕真实时长重算 beat 帧位、逐镜抽帧目检(remotion still 首帧含 打包约 100 秒、之后缓存仅 4–5 秒,39 镜可负担)。本集据此修了 9 处缺陷,其中 3 处 在等长外推下全部漏检,规格里列出了三种漏检模式与各自症状。 并固化一条纪律:beat 内动画时点一律由句边界推导,不得写死帧数(配音时长一变即脱钩), 例外只有 beat 开头即出现的常驻角标。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
草渲 QA 首跑刷出 500+ 条「角标侵入字幕安全区」WARN,逐帧目检画面完全干净——是判据 错了,不是视频错了。 根因:Subtitle.tsx 的底是半透明 rgba(6,8,12,0.68) 压在 #0E1116 上,实测灰度仅 ≈0.10–0.14,而文字笔画 0.45+。旧判据「亮列连通段 + 最宽段=字幕框」用文字阈值找框, 于是把每个汉字当成一个独立亮段(14 字字幕 → 14 段、最宽段仅 20px),字幕自己刷出 十几条「侵入」。试过降阈值找框同样不稳:抗锯齿把框切碎,放宽到能连成片时又与页面 底色(0.045)分不开。 改用几何法:字幕框高度是**已知量**(marginBottom 54 + padding 12×2 + 行高 44×1.35 ≈ 125,取 132),故只检查框**上方**那条窄带(y∈[H-160,H-132))内有无宽度 ≥24px 的 亮块——这正是「角标是否压进字幕安全区」的原始问题,且与 skills/06「角标 bottom ≥ 150」 同一口径。无阈值自由度,不受底色透明度影响。 测试:修正 test_intrusion_warns 的合成帧几何(旧 fixture 把侵入物画在框占位区内, 本身就不符合真实形态),新增 test_translucent_subtitle_does_not_self_report 锁死本次 假报。64 项全绿。 复跑:全片 7 幕 FAIL 0,WARN 由 500+ 降到 2 条,且两条均为刻意设计(p0-02/03 的 「画面凝住」、p6-06/07 的信源卡停留)——16×16 均值哈希看不出光标闪烁与字幕换行。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
草渲 QA 首跑 500+ 条「角标侵入」WARN 而画面实际干净。根因是判据模型与渲染实现不 匹配:判据假设字幕框是实心亮矩形,而 Subtitle.tsx 的底是半透明 rgba(6,8,12,0.68) (实测灰度 0.10–0.14 << 文字阈值 0.45),于是每个汉字各成一段、字幕把自己每个字都 举报成侵入物。 记下三条防范:① 视觉判据必须与渲染实现对账,写前先看目标元素的 CSS/几何;② 优先 用几何量(尺寸/边距/行高,来自代码常量、零自由度)而非亮度阈值(经验值,随配色与 抗锯齿漂移);③ 假报成本不低于漏报——500 条 WARN 会让「FAIL 0 · WARN N」失去信噪 比,等于关掉检查,故新判据须先在一帧已知干净的画面上验证零报警。 另记一条误修过程:先试「两级阈值」仍不稳(0.09 时抗锯齿切碎框、放宽又与页面底色 分不开)——「参数怎么调都不对」这个症状本身就说明模型错了,应立即回头质疑模型。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
终渲产物:out/final.mp4 —— 14:14.73 · 1920×1080 @30fps · h264 yuv420p 196 kb/s · aac 189 kb/s · 42.1 MB;配套 captions.srt/vtt 各 170 cue + cover.png(标题卡帧)。 终渲全分辨率抽帧复检 FAIL 0,仅 1 条 WARN(p0-02/03 的「画面凝住」为刻意设计—— 模型吐出命令后光标停闪,16×16 均值哈希看不出光标闪烁);尾幕末 6 句 FAIL 0 WARN 0, 渐黑窗口贴合末 beat(末帧灰度 0.0118),未复现第三集「渐黑提前收尾致长黑屏」。 交付前复验:无死链、系列一致性 FAIL 0、12 条信源指纹全部未变。 顺带把实测耗时口径写进 skills/09:草渲 0.5x 6.0 分钟、终渲 1080p 8.2 分钟(25642 帧)。 即整片渲染是分钟级,远快于同集配音的 2.1 小时——排期上「渲染慢」是错觉,真正的长尾 在 TTS;改一处场景重渲全片只要 8 分钟,可放心多轮迭代。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
…tools-video 合并 #1109(IndexTTS-2.5 专业用法:发音标注、tts_bench、读法修复)。两处冲突均为 「双方同位新增」,处置: - pipeline/README.md 脚本表:双侧行都保留(source_ledger / pron_marks / tts_bench)。 - issue.md:编号撞车——基线的 ISSUE-164(年份空格读错,2026-08-20)日期早于本分支 的同名条目,保留基线 164,本分支三条顺延为 ISSUE-165/166/167;全仓核查无旧编号 残留引用(knowledge-map 的 ISSUE-164 指向正是基线条目,语义正确)。 合并后验证:管线测试 130 项全绿(含 #1109 新增 66 项,注意其 test_prospect_ref 需 --with soundfile);check_series 2 系列 / 4 集 FAIL 0。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
- qa_frames.py:SUBTITLE_BOX_H_PX 注释算术修正(框顶 137.4 / 墨水顶 ≈118, 132 是其间灵敏度选择,非「≈125 留余量」);侵入块宽度改闭区间 b-a+1, 对齐「≥24px」宣称 - P0Hook.tsx:时点锚改用 at(),不再冒充分镜 beat 窗口——check --check-scenes 由常驻 WARN 2 清零(WARN 通道信噪比,ISSUE-167 原则) - motifs.tsx:删两处恒等三元(DispatchTable value 列 / CodeCard 行色) - knowledge-map + CHANGELOG:测试数 63 → 130(合并 #1109 后实际口径) - skills/08:语速单位笔误「300 字/秒÷60」→「300 字/分 ÷ 60 = 5 字/秒」 验证:pytest 130 passed;check --check-scenes FAIL 0 WARN 0;tsc 通过; ruff lint/format 全绿;check_series FAIL 0。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
三处均为文档/注释层缺陷,不改判据行为与已交付成片: 1. source_ledger.py 模块 docstring 的三条用法示例把 `--project` 写在子命令 之后,而该参数定义在顶层 parser——照抄即报 `unrecognized arguments` (实测复现)。改为参数在前,与 README / skills/01 的既有写法统一;三个 子命令(list / verify / fetch)按新形态实跑通过。 2. issue.md ISSUE-167 的字幕框算式漏算第二个 padding(上下各 12 共 24), 得 125 而非 137.4,致其与 qa_frames.py 注释对「检查线 132 在框顶之上 还是之下」的说法相反。补全算式并写明 132 的落位依据(框顶 137.4 之下、 墨水顶 118 之上)。常数本身取对,仅中间数更正。 3. mech 对比度四处口径对齐 9.19 → 9.18:`--check-theme` 实测与精确 WCAG 计算均为 9.1847(两位舍入 9.18),此前 theme.ts / planning.md / CHANGELOG 写 9.19、仅 README 写 9.18。视觉契约 SSOT 的自述数字须与验证 工具输出一致,故统一为 9.18。 验证:管线测试 119 项全绿;check_series FAIL 0;内容门 --check-scenes FAIL 0 WARN 0;source_ledger verify 12 条信源 FAIL 0;--check-theme FAIL 0;tsc --noEmit 通过;ruff 0.14.14 lint/format 全过。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.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.
背景
核心变更
一、新集工程
media/claude-code-explained-video/(成片已交付)sunny-steady+me-bright.wav,实测语速 307 字/分。#D97757内核循环(全片恒定)/ 石青#64C4C0外挂机制 / 警示红#EF6461拒绝闸门 —— 对底色实测 6.06 / 9.18 / 6.00 : 1,全过 4.5:1。二、管线多系列化
media/series.json顶层由单series对象改为seriesList[];check_series.py相应分层——反串线规则(1)跨系列全局生效(两系列口播互不引用),顺序类规则(2/3/4)按系列内判定(episode的1..N连续性只在系列内成立,slug 仍全局唯一)。三、B 型信源取证基建
skills/01-paper-extraction.md→01-source-extraction.md:A 型论文正文原样保留,新增 B 型(文档/代码/课程站点) 大节——双轨取证、证据三级(三级「他人对闭源产品源码的分析」口播必须带归属句,不得当作产品既成事实)、数字口径须可复算、二次信源分歧清单必备。source_ledger.py(fetch/list/verify):repo类校验 URL 含 commit sha 且 raw 指纹漂移即 FAIL;site类只比剥标签归一后的正文、漂移报 WARN(构建产物哈希天天变,比 raw 毫无信噪比)。四、三条实测口径沉淀
skills/02chars_per_min = 280是含停顿的等效口径(实测纯语速 307,停顿开销抵消,全片估算误差 2%);推论「字数是硬约束、句数不是」——本集实测 263 句合并到 229 句,字数只掉 145,时长几乎没动skills/08skills/09Rendered N/N ≠ 完成(编码是第二段)五、内容真实性校准(三处,均改变了成片说法)
agent_loop恒在 20–28 行)。stop_reason,而仓库已改成检查内容块——站点「深入源码」里当作差异讲的那点已被上游自己消除 → 采用仓库版。六、
qa_frames字幕侵入判据几何化(ISSUE-166)草渲 QA 首跑刷出 500+ 条「角标侵入」WARN 而画面实际干净:旧判据假设字幕框是实心亮矩形,而
Subtitle.tsx的底是半透明rgba(6,8,12,0.68)(实测灰度 0.10–0.14 << 文字阈值 0.45),于是每个汉字各成一段、字幕把自己每个字都举报成侵入物。改用几何法(字幕框高度是已知量,只查框上方窄带),无阈值自由度。风险与回滚
check_series.py的 schema 变更是破坏性的——旧单系列series.json不再被接受(已同步改数据 + 6 例多系列用例锁定语义);②skills/01更名可能留死链(已全仓 grep 修正 3 处引用,check_series规则 5 会持续抓);③qa_frames判据改动影响既有三集的 QA 结论(新判据更严格于几何、更宽松于亮度,需在下次三集重渲时复验)。git revert6206150 的series.*+check_series.py+ 其测试)/ 判据改动(git revertd6c9f9a)。成片产物均在.gitignore内,不入库。验证证据
media/pipeline/tests/46 → 64 项全绿(+6 多系列语义、+11 source_ledger、+1 半透明字幕假报回归)。check_series.py2 系列 / 4 集 · 受检 116 文件 · FAIL 0 WARN 0;source_ledger verify12 条信源 FAIL 0 WARN 0(交付前复验,站点正文至今未变);check_script双口径时长门 FAIL 0 WARN 0(估算 14.5 / 实测 14.2,预算窗 13.0–14.6)。tsc --noEmit通过;草渲 25642 帧 7 幕 FAIL 0;终渲全分辨率抽帧 FAIL 0(唯一 WARN 为刻意的「画面凝住」);尾幕末 6 句 FAIL 0 WARN 0,渐黑贴合末 beat(末帧灰度 0.0118),未复现第三集「渐黑提前收尾致长黑屏」。qa_frames --check-themeFAIL 0(三概念色 6.06 / 9.18 / 6.00 : 1);pre-commit run全绿;根pnpm-lock.yaml零变更(嵌套工程隔离有效)。影响范围
media/下的 Remotion 工程--ignore-workspace独立安装,不并入根 workspace,根 lockfile 零变更)。series-consistency-check行为随 schema 变更(已适配);文档更新series.md/knowledge-map.md/CHANGELOG.md/issue.md(+3 条)/pipeline/README/skills 01·02·06·08·09/SKILL.md路由表。Next Best Action
afplay media/claude-code-explained-video/video/public/audio/p1-20.mp3—— 若不满意,改写 2 句 + 重渲约 15 分钟。这是唯一无法机器判定的关卡。.temp/voice-samples/尚存 3 个领航小样(含本人音色,属生物特征信息),听审确认后执行pipeline.py clean-samples。qa_frames判据改动对既有三集的影响,建议在它们下次重渲(换sunny-steady)时一并复验。