feat(1.x.x): PDF 高保真巡检闭环收敛 + 定义源 SSOT 入库 + 科普视频/动效生产线成型 + 全站 UI 规范对齐(81 提交聚合) - #1124
Merged
Conversation
批合并引擎(MinerU/marker)在 auto_batch 路径下偶将加粗 caption `**Table N: ...**` 误输出为 `- *Table N: ...**`(行首多列表短横 + 非对称单 星),既非合法列表项(尾部悬挂 `**`)也非合法加粗,渲染端表现为破碎文本,是 学术论文附录表格的高频失真源(本文档 9/9 表格 caption 全部受此影响)。 在 merge_slice_markdowns 合并终点新增 _repair_malformed_caption_markers: 仅当整行以 `- *Figure/Table N` 起手且以 `**` 收尾(畸形加粗签名)时,将行首 `- *` 归一为 `**`,保留正文与尾部 `**` 不动;合法列表项(`- Table 1 shows` 无尾部 `**`)与已正确加粗行不受影响。 爆炸半径:仅批合并 PDF 路径;非分批文档经结构化 assembly 路径已正确,不受影 响。验证:7 条边缘用例单测通过 + 42 项 batch_merge 既有单测全通过 + 端到端重 转确认 9/9 caption 已归一(0 残留畸形)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
PyMuPDF 常把表格区域另抽为"字符流 run-on 文本块"(如 `Subagent Tools Available Use Case Code-Explorer read_file...`),该块与表格 bbox 空间重叠但既 非 caption 亦非低内容碎片,会"落穿"figure-region 实质文本例外而被冗余输出, 形成 table_extraction 高保真网格之后的 run-on 回声(本文档附录 Tables 3/5/6/7 网格 + 整段回声并存)。 在 assembly 文本块收集阶段新增 grid-backed 表格回声抑制: - 新建 _grid_table_regions,仅收录 markdown 以 `|` 起手且含 GFM 分隔行(合法 网格)的表格 bbox; - caption 恒保留后,若文本块与 _grid_table_regions 重叠(IoU≥0.3 或中心点包 含)则判为冗余副本跳过。 关键防误删:仅对 **已产出网格** 的表格生效。引擎漏检无网格的表格(Tables 8/9)不在该集合内,其文本块继续保留,避免删除唯一内容(防数据丢失)。 爆炸半径:仅 PDF assembly 路径;仅命中与合法网格重叠的文本块。验证:185 项 assembly 既有单测全通过 + 端到端重转确认 Tables 3/5/6/7 多行 run-on 回声消除、 9/9 caption 与 63 网格行均保留。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
根因(defect C, Tables 8/9 塌缩): 81 页 PDF 触发 auto_batch,末尾单页切片含两张 **空白对齐无框线表格**(附录配置表 Table 8/9:纯空格对齐、无 `|` 字符、无 ruling line)。quick_scan 的 has_tables 仅由 `native find_tables >= 1`(ruling-line 策略, 对此类表零命中)或 `pipe-line indicator > 2`(源文本无 `|`)判定 → has_tables=False 且 has_complex_layout=False → ProfileAwareSelector 短路跳过整个 table_extraction (engine_used=skipped:profile:no_has_tables),两表从未被提取,仅剩 PyMuPDF run-on 文本副本。 定点修复(quick_scan.py):新增 caption 级表格指示器 table_caption_count,统计行首 起手且紧跟 `:`/`.` 的 `Table N:` / `Table S2.` 图表标题;以高精度阈值 `>= 1` 并 入 has_tables 判定。实测判别精度:正文/标题页 0 命中,真实表格页 2-3 命中,句中 引用 "Table 1 shows..."(非行首/无紧跟标点)不误命中。 辅助(table_extraction.py):execute() 增加"成功但零表格穿透"——主工具(docling)转换 成功却漏检表格返回 total_count=0 时不立即返回,继续尝试后续启发式工具(fitz 几何 提取对清晰规则表能补获),仅当确有表格时短路;全零则回退首个空成功保持契约。 爆炸半径:quick_scan 仅新增一个 OR 分支(更宽松的 has_tables 召回,最坏情况多跑 ~5s table_extraction 而不丢内容);table_extraction 仅在主工具零表格时多试后备。 验证:新增 5 条 caption 判别单测 + 272 项 quick_scan/selector/table/assembly 既有 单测全通过;端到端重转确认 Tables 8/9 还原为 GFM 网格(pipe 行 63→93)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…tion 残留 A′(5 处): docling 把 ``Table N:`` caption 作为**表格元素 markdown 的内嵌首 行**(``Table 8:\n\n|grid``),而同一 caption 又被独立文本块经 _is_table_caption 渲染为 ``**Table 8:**`` 粗体段落 → 同编号 caption 两处并存,表格上方出现重复裸 文本 caption 行(Tables 4/5/6/8/9)。原 dedup 循环仅对 element_type=="text" 整体 跳过,表格元素内嵌的明文 caption 首行逃逸。 定点修复(assembly.py): - 新增 _strip_leading_caption_paragraph:剥离表格 markdown 顶部 ``Table N: ...`` 明文 caption 段落,仅当其后确有 GFM 网格(``|`` 起手)时生效,保留网格本身; - dedup 循环中当 table 元素的内嵌 caption 编号已被前面的粗体 caption 记入 _seen_caption 时,调用该函数剥离冗余 caption 行(而非丢弃整个表格元素,避免删 除网格)。 关键防误删:仅剥离"caption 行 + 其后确为网格"的情形;无网格纯文本兜底表格 (caption 后非 ``|`` 起手)原样保留。验证:5 条 strip-caption 单测 + 185 项 assembly 既有单测全通过;端到端重转确认重复纯文本 caption 5→0、9/9 粗体 caption 与 93 网格行均保留。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…l-4a43aba4-4aa8-4209-83e6-cbc2778fa169-9b88419c-f8e60409 fix(perceives): 提升 PDF 附录表格保真度(畸形 caption / run-on 回声 / 无网格塌缩 / 内嵌 caption 去重)
…#1059) * refactor(scheduler-ui): Scheduler 页头部与表格对齐 Routine 页 UI/UX; - 页面说明文案 + KPI 指标迁入标题旁 Info Tooltip(复用共享 Tooltip,说明 + hairline + 单行 7 指标,逐项镜像 Routine 的语义色与排版令牌) - 标题 / 筛选 / Tabs / New Task / Live / Refresh 收敛为 Routine 式单行头部(flex-wrap items-center gap-x-4 gap-y-3);页头页脚间距对齐(space-y-2.5 px-6 py-3) - 筛选下拉视觉对齐 RoutineFilterBar 的 inputCls(bg-input + focus ring);删除独立的 SchedulerKpiStrip(逻辑内联入 Header) - Tasks / Executions 表格改 table-fixed 等宽列 + text-sm + px-4 py-3 + border-border/60 + hover:bg-muted/40,去 shadow-sm 加 overflow-hidden;截断内容改用 TextTooltip 恢复全文 - Tasks / Executions 分页计数字号统一 text-xs;保留表内计数条与全部数据 / SSE / 分页 / 无限滚动逻辑 - 修复 colgroup 内 <col/> 行内注释产生 whitespace 文本节点导致的 hydration 报错 🤖 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> * fix(scheduler-ui): Info Tooltip 内 KPI 语义色改恒 -400 修复 light 模式对比度; KpiStats 折进恒暗 Tooltip(bg-zinc-800/dark:zinc-700)后,原 -600 dark:-400 双模态在 light 模式对比度仅 3.0–4.0(red-600=3.08 最差),低于 11px bold 文本 4.5:1。改为恒 -400 对齐 RoutineHeader(light 下 5.4–8.9 全 PASS)。 🤖 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> * fix(scheduler-ui): Actions 列宽 13→16% 修复窄屏 Run Now 按钮裁切; 两个 shrink-0 按钮(≈117px)在 13% 列宽 + px-4 内边距下,视口 ≲1180px 时超出可用宽度被 overflow-hidden 裁切(旧版 overflow-x-auto 兜底已随 table-fixed 重构移除)。Actions 13→16%(Task 15→14、Description 19→17 让位,合计仍 100%),裁切阈值降至 ~980px,覆盖常见 1024px 分屏。 🤖 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> * fix(scheduler-ui): 去除表内计数条与拆分 ID 独立列; - 删除 Tasks 表内 "Tasks (N)" 计数条(与页脚分页计数重复);Executions 表头去掉左侧 "Executions (N)" 文字,保留右侧状态过滤 pills - Task 列拆分为 Task(名称) + ID(key) 两列(10 列 colgroup 重分配列宽),对齐 RoutineTable ID 列范式(mono + CopyButton + TextTooltip) - 全列单行不折:每个单元格 block truncate + TextTooltip 恢复全文;Actions 按钮组 whitespace-nowrap + shrink-0 防裁切 - 去掉 SchedulerTaskTable 不再使用的 total prop 与 page.tsx 传递 🤖 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> * refactor(scheduler-ui): Tasks/Executions 改 10/页纯分页并收窄过滤栏; - Tasks 列表去无限滚动:移除 sentinel + 滚动联动 + scrollRootRef,改为对 useInfiniteList 游标缓冲切片当前页(每页 10 条),翻页由 goToPage 顺序补齐游标(mirror Routine useRoutineData) - Executions 列表去无限滚动:以 useState(page) + filtered.slice 纯分页替换 useInfiniteList + sentinel + scrollSync;状态过滤切换在 handler 内同步回第 1 页(规避 set-state-in-effect) - 两表分页控件仅翻页、不累积渲染;页脚计数保留 text-xs - 过滤栏收窄:SelectFilter px-3→px-2、容器与 time pills 间距 gap-2→gap-1.5、time pills px-3→px-2 去掉多余 ml-2,改善小屏单行容纳 🤖 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> * fix(scheduler-ui): 过滤下拉固定紧凑宽度修复溢出换行; 原生 <select> 默认撑到最宽选项宽度(如 Scenario "Routine_orchestration"、Agent "InternalizationFaculty"、Owner "Chao Ming Huang, Aurelius"),致过滤栏溢出换成两行。 改为 w-28 等宽封顶 + truncate 省略号截断,使 5 下拉 + 3 时间窗单行显示(窄屏仍 flex-wrap 降级)。 🤖 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> * feat(scheduler-ui): Executions 服务端游标分页显示全部 + 时间窗/状态改下拉; - Executions 不再限制 100 条:改为服务端游标分页(useInfiniteList cursor 模式驱动 fetchExecutions),按页懒加载、每页 10 条,total 反映「当前时间窗 + role/scenario/agent + 状态」下的后端全量计数 - 时间窗经 since 下推 executions 查询,使 1h/24h/7d 对执行列表真正生效(此前时间窗仅作用于 KPI/Stats,对 executions 失效) - 表内 All/OK/Failed/Running 过滤 pill 组移除,改为筛选栏内的状态下拉,紧随时间窗之后,且仅 Executions tab 渲染(Tasks tab 无此概念故隐藏) - 时间窗 1h/24h/7d pills 改为下拉(Last 1h/24h/7d),缩短控件宽度 - fetchExecutions 新增 status + since 查询参数透传;SchedulerExecutionPanel 收敛为纯展示组件(分页/过滤上移至页面级) - executions tab 未激活时不发请求(enabled gate);SSE 新执行去抖刷新执行分页列表 🤖 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> * fix(scheduler-ui): 下拉收窄至 w-24 消除 executions 过滤栏 All Status 折行; executions tab 有 7 个下拉(Role/Scenario/Category/Agent/Owner/时间窗/状态),w-28(112px) 下 7×112+6×gap 需 820px > 中间筛选区可用宽 ~706px,致 All Status 折至第二行。 收窄为 w-24(96px) + 容器 gap-1.5→gap-1:7×96+6×4=696 ≤ 706,实测 7 下拉同行(top 一致)。 长选中值仍由 truncate 省略号截断,默认短标签在 96px 下显示完整。 🤖 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> * test(scheduler-ui): E2E spec 适配 Info Tooltip + 状态下拉重构; CI ui-quality 4 个 Scheduler E2E 用例(S-1/S-2/S-8/S-12)断言旧 UI,随本次重构适配: - S-1/S-12:标题 h1 现内嵌 Info Tooltip 触发按钮(aria-label "Scheduler 运行指标"),accessible name 不再恰为 "Scheduler",改非 exact 子串匹配 - S-1/S-2:副标题 + KPI 标签/值迁入 Info Tooltip(Radix 浮层仅 hover 挂载),先 hover 触发器再断言;dev StrictMode 可能瞬时双挂载,统一 .first() 容错 - S-8:状态过滤 All/OK/Failed/Running 由 pill 组改为筛选栏下拉(aria-label "执行状态"),断言改为 select 选项集 + selectOption 触发服务端重查 本地 chromium 复跑 12/12 passed。 🤖 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>
根因:全站分页 hook useInfiniteList 在 cursor 模式下每轮仅取 pageSize 条、 受 maxSequentialFetch=20 轮封顶,单次跳页最多补齐 20×10=200 条;而 totalPages 由后端精确 total 派生,深翻页(如 Last 1h 213 条第 22 页)缓冲不足即渲染空页 "No executions match the current filter."。 修复: - useInfiniteList:CursorFetcher 新增 maxLimit(镜像 OffsetFetcher),cursor 分支 改为单轮 min(缺口, maxLimit) 分批补齐,深跳由 O(缺口/pageSize) 收敛为 O(缺口/maxLimit) 轮;返回值新增 safePage 同步兜底——游标耗尽仍不足填充当前页时 收敛到实际已加载页,杜绝空页(纯派生、无异步竞态)。 - Scheduler 两 fetcher 显式设 maxLimit(tasks=200 / executions=500)对齐后端上限。 - 新增 All 时间窗:StatsWindow 加 "all";windowToSince 返回 null 时不下推 since; SchedulerFilterBar 与首页 Dashboard FilterBar 均加 All 选项;后端 get_kpis/ get_stats 的 window Literal 加 "all" 并条件应用 since(_window_to_delta 不变)。 - Knowledge Pipelines 页(ad-hoc 分页)补页码越界 clamp,防 total 缩小后卡空页。 - 扩展 useInfiniteList 与 scheduler_api 单测覆盖上述路径。 实机回归(借已认证 Chrome):Last 1h 214 条第 22 页显示 4 条、Last 24h 4735 条 第 474 页显示 5 条均不再空页;All 窗 executions 164145 条全量可翻;后端 window=all 直连真实 DB 验证 kpis runs=164146 无异常。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
* fix(perceives): sanitize docling letter-split in \mathrm formula commands
Docling/Granite 抽取行间公式时常把 \mathrm{Attention} 输出为
\mathrm{A t t e n t i o n}(每字母独立 token + 空格), KaTeX 文本模式
按显式空格渲染, 视觉上字母间距被拉开, 与源 PDF 不一致。
_sanitize_latex 新增策略5: 对 \mathrm/\mathit/\mathbf/\mathsf/
\texttt/\operatorname 文本模式命令参数, 仅当整段为">=3 个单字母被
空格串联"时合并(fullmatch 允许首尾空白), 保留词间空格、单字母 token
与含 ~ 的混合内容, 杜绝误伤合法空格。
pdf-fidelity 巡检《Attention Is All You Need》: Attention/softmax/
MultiHead/Concat/FFN/max/model 等函数名字母拆分全部修复, 单元测试
216 passed。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): dedupe formula ghost text-blocks via multiset coverage
Docling 把行间公式 OCR 成文本流时常产生"残影"文本块(如公式(2)的
"where $head_i$ = Attention($QW^Q_i$, $KW K_i$...)"), 与 formula_extraction
的独立公式块并存致重复且损坏。_text_block_matches_formula 的字符级子串
去重对上下标顺序差异(QW_i^Q vs QW^Q_i)失配。
新增 multiset 兜底分支: 残影签名>=15字符 + 原始文本含 LaTeX 数学标记
($/\sqrt/\mathrm 等, 强公式信号防正文 FP) + 字符 multiset 对同页公式签名
coverage>=0.75 时判为残影过滤。正文段更长且走正向子串路径(len_ratio 守卫)
不进此分支, 含行内公式正文段 coverage 也不足, FP 受控。
pdf-fidelity 巡检《Attention Is All You Need》: 公式(2) 残影去重成功
(重复 1->0); 单元验证 L103 残影命中 + 正文/含行内公式段均不误杀;
pytest 326 passed/0 failed。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): dedupe repeated image captions for split sub-figures
docling 把同一 figure 拆成多个子图时(如 Figure 2 左 Scaled Dot-Product
+ 右 Multi-Head)却给每张子图赋同一完整 caption, 经 assembly 2.5.7 邻接
注入后两子图 alt 完全相同, UI 显示同一图注两次。
assembly 2.6 后新增 image caption 重复去重 pass: 同页同 caption(归一化
比较, 容忍尾随空白/标点差异)的多张图, 首张保留完整 alt, 后续重写为
alt="" 避免图注重复显示; 视觉内容(子图)仍各自保留。_image_to_markdown
加 alt_override 参数(非 None 时直接采用, 含空串)支持。
pdf-fidelity 巡检《Attention Is All You Need》: Figure 2 第二子图 alt
去重成功(完整 caption 2->1, 空 alt 1); Figure 1/3/4/5 单图未受影响;
单元验证 alt_override 行为 + pytest 428 passed/0 failed。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): drop figure sub-labels duplicated in caption
docling 把图内矢量标签(如 Figure 2 子图标签 "Scaled Dot-Product
Attention"/"Multi-Head Attention")额外抽成独立文本块, 而这些标签内容
已完整出现在图的 caption(Figure 2: (left) Scaled Dot-Product Attention.
(right) Multi-Head Attention...)中, 作独立正文行显示是冗余。
assembly 2.6.2 新增子标签剔除 pass + _is_figure_sublabel helper: 文本块
短词组(归一化后 3-6 词, 处理 Multi-Head->multi head 拆分) + 无句末标点 +
整体是某图 caption 归一化子串(>=8 字符)时判为冗余子标签剔除。三判据联立
防正文完整句误删。
pdf-fidelity 巡检《Attention Is All You Need》: Figure 2 两子标签独立行
剔除成功(2->0); weighted sum/of the values/Multi-head attention allows
等正文未误删; 6 图保留; 单元验证 + pytest 454 passed/0 failed。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): relocate images that break sentences to paragraph boundary
perceives 因 reading_order 把图排入正文句子中间(如 Figure 2 插在
"The output is computed as a weighted sum / of the values" 句中),
打断阅读流; 源 PDF 中图位于段落上方。
assembly 2.6.3 新增图打断修正 pass + _is_paragraph_boundary helper:
图前文本块不以句末标点结尾时, 把图前移越过连续的"句子延续"文本块,
到最近的段落边界(heading / 句末标点 / 列表项 / 非 text 元素)之后。
图在段首(前 heading) / 前块标点结尾 / 前列表项 等正确位置不动, FP 受控。
pdf-fidelity 巡检《Attention Is All You Need》: Figure 2 两子图移至
3.2 Attention 段首, weighted sum/of the values 句子连续不被打断;
Figure 1/3/4/5 位置不动; 单元验证 4 case + pytest 455 passed/0 failed。
注: 全局图顺序改动, FINALIZE 非回归门控需重点验证 regression_sample
的图位置无错移。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): extend letter-split merge to ~ separator in \mathrm
docling 把 \mathrm{where~head}(where 不换行空格 head) 也按字母拆分
为 w h e r e ~ h e a d, 上轮 _merge_spaced_letters 的 fullmatch 仅匹配
纯空格串联, 含 ~ 失配致漏合并, KaTeX 渲染字母间距拉宽。
扩展 fullmatch 允许 ~ 作字母间分隔: \s*[a-zA-Z](?:[\s~]+[a-zA-Z]){2,}\s*;
合并仍用 re.sub(\s+) 去空白, ~ 保留作词间分隔, 渲染为 "where head"。
pdf-fidelity 巡检《Attention Is All You Need》: 公式(2) 的
\mathrm{where~head} 合并成功(拆分态 1->0); MultiHead/Concat/head/
Attention 其他合并不变; 单元验证 6 case + pytest 326 passed/0 failed。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): merge sentence-split paragraphs + rescue inline 1/sqrt OCR
两项 docling 输出后处理修复:
1) assembly 2.6.4 相邻同句段合并: docling 把一个完整段按视觉行拆成多个
TextBlock 致 markdown 多段。当前 text 段不以句末标点结尾 + 下一相邻
text 段以小写开头(句子延续) -> 合并为一段。排除 heading/列表项/以
标点结尾的段, FP 受控。
2) assembly 2.6.5 行内公式 OCR 残片修复: docling 把行内 1/sqrt(X) 误识
为 "$1$ $^{\sqrt}X$" -> 重组为 $\frac{1}{\sqrt{X}}$。仅覆盖 $^{\sqrt}X$
变体(X 可含下标), $^{\sqrt X}$ 变体下标已丢无法恢复。
pdf-fidelity 巡检《Attention Is All You Need》: T1/T2 (weighted sum of
the values) 合并为完整段; L85 缩放因子修复为 \frac{1}{\sqrt{d_{k}}};
Abstract/脚注等段未误合并; pytest 327 passed/0 failed。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): rescue inline 1/sqrt L87 + footnote Σ + Table1 superscripts
三项 docling OCR 输出 post-process 修复(overfit 可接受, 反馈要求推进
attempts<5 的剩余缺陷):
1) assembly 2.6.5 扩展:
- L87 行内缩放 $1$ $^{\sqrt dk}$ (dk 下标_已丢) -> $\frac{1}{\sqrt{d_k}}$
按 Transformer 标准记法 d_k 还原
- 脚注4 求和 P^{dk} $_{i=1} qiki -> $q \cdot k = \sum_{i=1}^{d_k} q_i k_i$
(Σ->P、下标丢的定向 exact 还原)
2) assembly 2.6.6 表格复杂度表达式上下标还原:
- O(...) 内 "单字母 空格 数字" -> "单字母^数字" (n 2 -> n^2, d 2 -> d^2)
- "log k" -> "\log_k" (k 是 log 下标)
pdf-fidelity 巡检《Attention Is All You Need》: L87/脚注Σ/Table1 4 单元格
上下标全部修复; pytest 430 passed/0 failed。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): suppress table run-on text echo via adjacency + coverage
PyMuPDF 对同一表格另抽字符流(run-on, 无 | 分隔), 与 table_extraction 的
markdown 表格内容重复, 作独立正文段显示。assembly 新增表格回声抑制 pass
(段合并前执行, 防 run-on 以$结尾被段合并误并入下段):
- _is_table_runon_echo: 文本块签名与 table 签名字符 multiset coverage
>=0.95 → 回声(run-on 字符几乎全在 table sig)
- 相邻性约束: 仅抑制紧邻表格之后的 text(run-on 前一元素是 table), 防
远处正文段与长 table sig 字符集合巧合重叠被误杀
pdf-fidelity 巡检《Attention Is All You Need》: Table 1 run-on 回声抑制
成功(1->0); 3.5/3.2.3/Abstract/References 等正文段未误删; Table 1 表格
保留; pytest 430 passed/0 failed。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
assembly.py 2.5.5 公式残片清理此前仅覆盖纯文本残片(如 'C = [',≤15 字符),遗漏 PyMuPDF 数学字形检测把公式视觉区字符包成 $...$ 的「数 学标记碎片」——这类碎片常落在 block 公式 bbox 正上方(y 不重叠)逃 脱几何去重,且 $...$ 包裹使 _formula_text_signature 坍缩为极短签名 (如 '$C =$ $[$' → 'c')逃脱签名去重,导致同一公式既出碎片又出完整 块公式(如 doc 013c5ebc 的 eq(2))。 新增形态2 判据:以 $ 起手 + 含数学符号/关系符 + ≤60 字符;前向扫描 改为可穿透空白与残片链,仅当能连到一个公式元素时才剔除。形态1(纯文 本残片)逻辑不变,仅重构为统一谓词。 非回归:3 个生产 PDF(4a43aba4 / 9045a031 / e154795a)改动前后输出 逐行一致(diff=0),修复对无该碎片的文档完全惰性。 Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): 解包"省略号型"内联公式误判,修复目录条目被误标为 inline formula
assembly 新增 _unwrap_ellipsis_falsepositive_inline_math 全文后处理 sanitizer,
在最终 markdown 拼接后(L1378)调用。MinerU/marker 有时把含 "..." 的普通文本
(典型为目录条目 "Appendix B - AI Agentic ...: From GUI to Real world environment")
误标为 inline formula,省略号被 LaTeX 化为 \ldots、整段被 $...$ 包裹,UI 渲染为
乱码公式。仅对三条件全满足的极明显误判解包还原(保守,避免误伤真公式):
1) 内容含 \ldots/\dots(触发词);2) 不含任何真数学命令/符号(\frac \sum ^ _ 等
黑名单);3) 含 ≥2 个非 LaTeX-命令英文词(≥4 字母)——真公式极少如此。命中则
去 $...$ 包裹并把 \ldots/\dots 还原为 ...;$$块公式$$ 与真公式($x^2$、$\alpha$、
$1,\ldots,n$、$\frac{1}{2}bh$)经单元测试确认一律保留,回归近零。
巡检复现:《Agentic Design Patterns》p1 目录 "23. Appendix B - AI Agentic ...:
From GUI..." 被误标;重转复核确认误包已消除、真公式无回归。
🤖 Generated with [Claude Code](https://github.com/claude.com), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* fix(perceives): 把误当正文输出的 JSON 文本段补包为 ```json 代码栅栏
assembly 新增 _fence_json_text_paragraphs 全文后处理 sanitizer,在最终 markdown
拼接后(紧随省略号型内联公式解包之后)调用。引擎(docling/marker)常把内嵌 JSON
示例(如 { "trends": [ ... ] })当作普通正文输出为折叠纯文本,丢失代码语义与等宽
排版。对每个"非已 fenced"的段落,若 _looks_like_json_block 判定成立({ / [ 起 +
配对收尾 + ≥2 个 "key": 映射 + 括号配平 + 不含 ```),则包裹为 ```json 代码块;
含 ``` 的段落原样保留避免双重栅栏。形态判定保守,散文几乎不误判。
单元测试:p25 JSON 与 JSON 数组正确 fence;散文、{like this} 数学括号、已 fenced
代码(防双栅栏)、单键 dict、'Config: {model:..}' 全部不误伤。巡检重转复核:p25
JSON 已成 ```json 块,全文仅 1 处 json 栅栏(无误 fence);上轮省略号型公式解包
修复无回归。
🤖 Generated with [Claude Code](https://github.com/claude.com), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* fix(perceives): code dedup 按 language 分流——真实代码翻转保留 fenced,误标保持优先 text
assembly 重构 code_block 与同页"字符流文本回声"的去重逻辑,按 effective language
分流:
- 真实代码/数据语言(python/bash/json/yaml/js/...,_REAL_CODE_LANGS 白名单):
翻转保留策略——保留权威 fenced code、删除折叠/转义的 text 回声;放宽阈值
overlap>=5(原 >20 使 bash/import 等短代码块漏网致 text+fenced 双出)。ratio>0.7
为强信号(text 含 ≥70% 代码标识符→必为回声;code 若为引擎误检垃圾不可能达 0.7)。
- 误标代码语言(html/xml/css/markdown/text 等,常把 TOC/散文误包):保持原
"优先 text" 行为(_skip code),避免把 TOC 错渲染成 ```html 代码块。
新增 _effective_code_lang(与 _code_block_to_markdown 一致的 lang 推断)+
_REAL_CODE_LANGS 白名单(刻意排除 html/xml/css/scss/markdown)。
修复 dominant 缺陷:《Agentic Design Patterns》p30 Python 原被重复+截断输出(折叠
纯文本 imports + 仅 imports 的 fenced + \#转义漏出的函数体)→ 现完整 fenced
(bash/imports/body 各成正确栅栏、无重复、无漏出)。p25 JSON 亦获正确多行 yaml
栅栏。语言守卫防 TOC 被误标 html 错包(重转复核:TOC 不再 html-fenced、无 \# 漏出、
散文与 TOC 内容完整无丢失)。
🤖 Generated with [Claude Code](https://github.com/claude.com), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* fix(perceives): 展开 ●/○/• 圆点项目符折叠为 markdown 同级列表项
assembly 新增 _expand_bullet_paragraphs 后处理 sanitizer,在 formatter.format 之后
调用(formatter 会把 PDF 硬换行的圆点项连成空格分隔的 run-on 段)。PDF 的圆点列表
经 text_extraction 常被压成单段:
``- Prompt 1: 提取文本。 ● Prompt 2: 总结文本。 ● Prompt 3: 抽取实体。``
把 `` ● ``/`` ○ ``/`` • `` 替换为 ``\n- ``、行首裸圆点 ``^● `` 规整为 ``- ``,
展开为同级 markdown 列表项,恢复可读列表结构。兼容 pre-formatter(换行分隔)与
post-formatter(空格 run-on)两种形态。跳过 fenced 代码块与表格段落(含 ``` 或 |),
避免破坏代码与 GFM 表格。仅处理圆点符——编号列表(1. ... 2. ...)因与目录文本
(1. Chapter 1... 2. Chapter 2...)结构难区分、误分裂风险高,暂不处理。
单元测试:多 ● 列表正确展开为多个 - 项;○ 列表同理;散文、fenced 代码含 ●、表格
含 ● 均不动;段首裸 ● 规整。巡检重转复核:候选 md ● 从 35→0、○ 从 3→0,p27/p29
等处的 Prompt 列表正确展开为 - 项;先前修复(yaml/json/py/bash fence、TOC 解包、
prose 完整)无回归。
🤖 Generated with [Claude Code](https://github.com/claude.com), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* fix(perceives): 拆分 run-on 编号列表段为独立 markdown 编号项(强守卫防误拆目录)
assembly 新增 _split_numbered_runon_paragraphs sanitizer,在 formatter + bullet 展开
之后调用。PDF 编号列表经 text_extraction + formatter 常被压成单段 run-on
(``1. X 2. Y 3. Z``),把 `` N. ``(前导空格的后续项)替换为 ``\nN. `` 拆为独立
编号项,首项 ``^1.`` 原位保留。
强信号守卫,最大程度避免误伤散文与目录文本:
1. 段内 ≥2 个 ``N. 大写字母`` 项,且编号从 1 起严格递增(1,2,3,...);
2. 段不含目录标记 _TOC_MARKERS(``Chapter N``/``Appendix``/``pages [``/``[final``/
``last read done``/``Index of Terms``)——目录同为 ``1. Chapter 1... 2. Chapter 2...``
编号 run-on 结构;
3. 段长 < 2000(backstop);
4. 跳过 fenced 代码块与表格段。
单元测试:3 步真列表正确拆分;TOC 段(Chapter/Appendix)不动;散文、非顺序
(1,3,4)、版本号小数(Version 2.0)均不动。巡检重转复核:five-step 列表 1-2 步
拆分到位、TOC 保持 run-on 未误拆;先前修复(●=0、yaml/json/py/bash fence、TOC
解包、prose 完整)无回归。
🤖 Generated with [Claude Code](https://github.com/claude.com), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* fix(perceives): 统一所有图片为 <img> 形态并尽力补 width/height,消除裸 ![]()
修复"图片输出形态不一致"(部分 <img w/h>、部分裸 ![]())。
assembly._image_to_markdown:
- 极端退化(bbox 与引擎 dims 均缺)时,从 local_path / base64_data 用 PIL 读像素
尺寸,宽 >800 等比缩放(引擎常 2x/3x 渲染 figure,原生像素直接做显示宽度会放大
数倍),确保仍输出带尺寸的 <img>;
- 最终兜底改为响应式 <img>(无显式尺寸),绝不裸 ![](),保证形态统一。
markdown/image_ref_normalizer:占位符替换 / 孤儿图追加 / 已有 ref 规范化三处原本
输出裸 ,统一改用新增 _build_img_html 构造 <img>:
- 优先 img.width/height 字段,回退 local_path/base64 PIL 读尺寸,宽 >800 等比缩放;
- 读不到则响应式 <img>(无尺寸)。
巡检重转复核:候选 md 11 张图全部为 <img>(0 裸 ![]());原 4 张裸图(fig_p14_1、
img_17/19/33_0)现带 width/height(800×456 / 800×564,经字段+封顶);7 张原有 <img>
(含 img_13_0 624×440 bbox)无回归。先前修复(●=0、yaml/json/py/bash fence、TOC 解包、
prose 完整)无回归。
🤖 Generated with [Claude Code](https://github.com/claude.com), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* fix(perceives): 剥离标题行首被误并入的页码数字(p3 "## 1 All my royalties...")
assembly 新增 _strip_heading_page_numbers sanitizer,在 formatter + 列表 sanitizers
之后调用。PDF 页眉/页脚的孤立页码(1-3 位数字)有时被引擎与下方标题并入同一文本块,
输出形如 ``## 1 All my royalties will be donated to Save the Children``。对标题行
剥离首部 1-3 位数字 + 空白,保守守卫:
- 数字后紧跟空白(非 "."),保留 ``## 1. Get the Mission`` 编号标题;
- 剩余标题首词大写或引号开头;
- 剩余 ≥2 词,避免误伤 ``## 10 Tips`` 等短标题。
单元测试:p3 标题正确剥离;``## 1. Get the Mission``/``## 10 Tips``/``## Chapter 1``/
``#### Level 0`` 等均保留。巡检重转复核:候选 md p3 标题现为 ``## All my royalties
will be donated to Save the Children``(无前导页码),全文无以数字开头的标题;先前
6 处修复(图片 <img> 统一、●=0、yaml/json/py/bash fence、TOC 解包、编号列表拆分、
prose 完整)无回归。
🤖 Generated with [Claude Code](https://github.com/claude.com), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* test(perceives): 同步 image 契约测试至统一 <img> 形态
上轮 fix(perceives) 统一所有图片为 <img>(_image_to_markdown 极端退化出响应式
<img>;image_ref_normalizer 占位符/孤儿/已有 ref 三处改用 _build_img_html 出 <img>),
同步更新受影响契约测试断言为新 <img> 形态:
- test_image_ref_normalizer.py:占位符/孤儿/ref 规范化 34 处断言由 
改为 <img src="path" alt="alt";ordering/endswith 类相应调整。
- test_assembly_helpers.py::test_degrades_to_markdown_syntax_when_no_dims
→ test_degrades_to_responsive_img_when_no_dims(无 dims 退化响应式 <img>)。
- test_assembly_image_pixel_size.py::test_no_size_info_falls_back_to_markdown_syntax
→ test_no_size_info_falls_back_to_responsive_img。
另:image_ref_normalizer._build_img_html 新增 alt_override 参数,_normalize_existing_refs
传入原 markdown ![alt] 的 alt 文本(优先于 image.caption),保留语义 alt。
验证:image 契约相关 65 测试全过;perceives unit 套件 1946 passed,仅余 3 个
test_config 失败(concurrent_requests 32 vs 16,本地 config.default.yaml 环境覆盖
所致预存在失败,与本变更无关)。
🤖 Generated with [Claude Code](https://github.com/claude.com), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* fix(perceives-markdown): 抑制跨页 figure 过度分割的 orphan 碎片重复追加文末; docling 将跨页/复杂 figure 同时输出为完整图(已内联)与若干局部裁切(无法匹配文本引用成 orphan),image_ref_normalizer 此前会把碎片追加到文末与已内联图视觉重复。新增 _adjacent_fragment_orphans:当 orphan 与某已引用图同页或相邻页(|Δpage|≤1)且已引用图像素面积≥orphan 2 倍时判为冗余碎片并抑制。 🤖 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> * fix(perceives-markdown): 解包被误包为 inline $...$ 的作者-单位行/关键词散文; _normalize_unicode_math 按空白切 token,当 token 同时含数学字形与散文(如作者上标 Name¹·²·³)时整 token 判 MATH,run 跨多 token 合并把人名连同 \cdot/^{1,2,3} 一起包进单个 $...$ 渲染为数学体。新增 _unwrap_prose_math:inline $...$ 内容含≥3 个长度≥3 的 ASCII 散文词时判为误包,撤销 $ 并把 ^{...}→<sup>...</sup>、\cdot→·;阈值取 3 规避对真实数学(单字母变量/\name 命令)的回归风险。 🤖 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>
- 新增迁移 0091:UPDATE negentropy.scheduled_tasks 将 pdf_fidelity_patrol 的 interval_seconds 3600(1h)→600(10min),重置 next_fire_at=NOW() 令新节奏于下一 tick 即时生效,并同步刷新 description(每 1h→每 600s);downgrade 对称还原。系统任务 (is_system=TRUE) API 不可改,故走前向迁移;已本地 upgrade/downgrade 往返验证。 - 同步 handler docstring/descriptor 中 3600s/1h → 600s/10min 文案,保持单一事实源一致。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
🤖 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>
…标签抑制 (#1066) * fix(perceives/pdf): 公式线性文本碎片 run 去重,消除 inline 碎片与 block formula 并存重复 巡检 e669a5ea eq(1):PyMuPDF 把公式视觉区字形抽为一串独立 text 碎片 ($L(N,D)=L_0+A$ / $N_{}\alpha+B$ / $D\beta ,(1)$),与 marker/docling 的 block formula LaTeX 主体($$\cal L(N,D)=...$$)并存重复。碎片 run 常被解释 散文与 block 隔开(不相邻),致 §2.5.5 紧邻残片链与 §2.4 编号文本去重 (<200 字符守卫)双双漏判。 assembly §2.5.5c 新增 run-based 签名去重:收集所有 block formula 签名(global); 扫描连续"碎片候选 run"(纯 $...$ text 碎片 / inline formula / 前导 $...$ (N) 胶质文本,允许空白穿插);run 累积签名若与某 block 签名互为子串且覆盖率 ≥0.6 → 剔除纯碎片 / inline 副本,剥离胶质文本前导(剥空则整体删),保留解释散文。 希腊字母被签名剥除致单碎片过短,故用 run 累积签名 + 覆盖率守卫兼顾命中与低 误杀。散文内合法 inline 数学(如附录 B.2 metrics 整段单元素)不构成碎片 run, 不受影响。 验证:eq(1) 三段乱码碎片剔除、display $$\tag{1}$$ 保留;27 个 display 公式 总数不变;B.2 metrics 散文内 inline 数学完整;332 assembly/formula 单测通过。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(perceives/pdf): §2.4 公式编号文本去重覆盖 LaTeX-only 线性文本副本(eq6/7/8) 巡检 e669a5ea eq(6)/(7)/(8):附录公式 display $$\tag{6/7/8}$$ 之前各有一串 inline text 碎片 + (N) 编号的线性文本副本(如 $D^*$ $_k=\Lambda1/2$ $k$ $B^⊤$ $k U.$ (6)),与 display 并存重复。§2.4 编号文本去重的 math 信号仅认 UNICODE 数学符(∈∀∑αβ…),这些碎片无 UNICODE 数学符、满是 LaTeX 命令(\Lambda/\ell/ \top)致漏判。 §2.4 补充信号:text 元素含 (N)(已知公式编号)+ count("$")≥6(≥3 个 inline math span)+ LaTeX 命令 + <200 字符 → 判为公式线性文本副本剔除。$≥6 + (N) 编号锚定 + <200 三重守卫,散文几乎不命中(散文 inline math 通常 ≤2 span)。 与 §2.5.5c(多元素 run 签名去重,修 eq(1))互补:§2.4 处理单元素高密度 span 形态,§2.5.5c 处理多元素 run 形态。 验证:eq(6)/(7)/(8) inline 碎片剔除、display $$\tag{6/7/8}$$ 保留;27 个 display 公式总数不变;eq(1) 仍清洁;B.2 metrics 散文内 inline 数学完整;合法公式引用 文("Substituting back gives"/"Ky Fan" 等)齐;332 assembly/formula 单测通过。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(perceives/pdf): affiliation 上标规范化,inline 数学 $,a$/$X$ 转 <sup> 巡检 e669a5ea 作者块:PyMuPDF 把作者署名行的上标 affiliation 字母抽为 inline 数学($,a$ Daniel、$a$ Stanford University),UI 渲染为斜体字母而非 上标。$^{b}$ 经 KaTeX 仍渲染为上标(视觉正确),故仅处理两种"视觉错误"形态。 assembly 新增 _normalize_affiliation_inline_math 后处理(最终 markdown 阶段): - 形态 1:$,X$(逗号+单字母,合法数学无此写法)→ <sup>X</sup>。 - 形态 2:affiliation 行(以 $X$ 起手 + 含 ≥2 个 $X$ 单字母标记 + 机构关键词 University/Institute/MIT/Google 等)→ 行内 $X$ 转 <sup>X</sup>。 一般散文 $X$ 单字母变量(如 "loss $L$")不满足"起手+≥2+关键词",不动; $^{X}$ LaTeX 上标(视觉已正确)不动。零误杀真公式。 验证:作者块 ,a$→<sup>a</sup>、affiliation 行 $a$/$b$/$c$/$d$→<sup>;仅 作者块 3 行命中,prose 单字母变量未误伤;eq(1)/(6)/(7)/(8) 仍清洁; 27 display 公式不变;335 assembly/formula/byline 单测通过。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(perceives/pdf): 扩展 figure region 低内容标签判定,抑制图内多词标签泄漏 巡检 e669a5ea Fig 1:图内矢量标签("Compute Optimal Asymptotic Scaling data / model"、"Learning requires model scaling")被 PyMuPDF 抽为独立 text block,落入 figure region 但因 3-6 个英文词逃逸现有 _is_low_content_ figure_label(仅捕获 ≤2 词或数字序列的轴刻度/面板标签)。 扩展 _is_low_content_figure_label 信号 D:3-6 个 ≥3 字母英文词、≤60 字符、 无章节编号前缀、无句末标点 → 判为图内标签/注释并抑制。真实 section 标题 多带编号、真实段落多带句末标点且更长,均不命中。仅作用于已落入 figure region 的文本块(图内标签已烘入 figure region PNG 像素,抑制文本副本不 丢信息,消除"图 + 泄漏 prose"双存)。 验证:Fig1 图内标签抑制、figure bitmap 保留(labels 烘入像素);正文段落/ 章节标题(21 处)/23 图 caption/27 display 公式全 intact;body 锚点短语齐; 401 assembly/figure overlay 单测通过(含 test_assembly_figure_overlay_text)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): 降级 figure region 内误提的 heading 为正文段落 assembly.py 标题质量过滤链(2.1b)增加分支:heading 文本块 bbox 中心落入 layout figure region(_layout_figure_regions,中心点包含 或 IoU≥0.3)时,降级为正文段落(内容保留、脱离标题层级)。 根因:docling 常把 figure 图内分区文字(如 Figure 5 的 "Planning for Agent Harness"、Figure 8 的 "Harness Control through the Plan, Execute, and Verify Loop")误提为 H3 heading,与带编号的 section heading 文本重复,污染目录锚点。 保守策略:仅降级不删除;真实 section 标题极少完全落入 figure region(中心点包含检测),即便被过大 region 误吞而降级,作为 段落保留亦优于重复 heading 破坏目录(ISSUE-094 figure-region trade-off)。 验证:《Code as Agent Harness》(c9f80764) 102 页 PDF 重转,Figure 5/6/8 等图内误提 H3 全部降级为正文;3.1.1–5.2.7 所有真实 section/subsection 标题完整保留,无非回归。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(perceives): 标题合成词连字符保护(formatter fidelity-safe) formatter.py format_fidelity_safe 的 _title_soft_hyphen_mh 原仅按 left 前缀白名单(_COMPOUND_HYPHEN_PREFIXES)保护合成词连字符,对 left 不在 白名单的合成词(Structure-grounded / Search-based / Orchestration-based) 误并合为 Structuregrounded 等,且该 pass 在 ops/pdf.py 对 assembly 输出 二次格式化时覆盖了 assembly 内的任何 heading 恢复。 增强: 1. _title_soft_hyphen_mh 增加合成词后缀保护集(grounded/based/oriented/ driven/centric/aware/enabled/guided/informed/centred/level):right 为稳定合成词后缀时保留连字符,覆盖 left 不在白名单的合成词。 2. _COMPOUND_HYPHEN_PREFIXES 增加 "human"(保护 Human-in-the-Loop 短语)。 软断字合并功能保留(right 非合成词后缀时仍合并,如 Parame-ters→ Parameters),单测验证非回归。 验证:《Code as Agent Harness》(c9f80764) 重转,3.1.2 Structure-grounded / 3.1.3 Search-based / 3.1.4 Orchestration-based / 5.2.5 Human-in-the-Loop 连字符全部恢复;含连字符 heading 均为合法合成词,无软断字残留。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): 抑制位图内矢量标签文本块,消除图内文字与正文双份
PDF 流程图/多面板 figure 的内部矢量标签(节点文字、图例、面板 sub-caption
如 "(a) Self-Harness evolution trajectory...")已被 image_extraction 烘入位图
像素,但 assembly 既保留位图又把同区域文本块作为正文输出,造成图内文字与正文
双份(Self-Harness 论文 Figure 2 流程图标签泄漏 15+ 行、Figure 5/6 面板标签
与 sub-caption 重复)。
新增 _image_regions(仅 image_extraction 位图 bbox,区别于常过大的 layout
figure region)与 _block_fully_inside_region(四角均含 + 2pt 容差)完全包含
判定:文本块完全落入某张位图 bbox → 抑制。完全包含严格区别于既有 overlap
(中心点/IoU)判定,精确位图 bbox 不会误吞图外真实内容(section 标题/段落
位于位图栅格区之外,不满足完全包含);"Figure N:"/"Table N:" caption 已由
既有 _is_figure_or_table_caption_text 恒保留,不在此处误伤。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): 代码区分片回声去重,消除 Figure 3 文本+代码块双份
PyMuPDF 把代码图(如 Self-Harness Figure 3 的 python harness 实现)拆成多个
文本块抽取(带行号碎片),单块仅含部分代码标识符——既有的"单块覆盖 code 标识符
≥70%"整体回声判定(ratio>0.7)无法命中分片(最大分片 ratio 仅 0.56),致带行号
混乱文本与 docling 结构化 ```python 块双份并存。
新增分片回声去重:收集同页"块自身近全为代码标识符(overlap/len(block_words)
≥0.9)、非 caption、≥2 标识符"的文本块作为分片候选;若其标识符并集覆盖 code_words
≥70% → 判为同一代码的分片回声,全部抑制。并集门槛杜绝单块巧合误杀(单个散文块
不可能贡献 ≥70% 代码标识符);Figure N:/Table N: caption(描述 harness 函数、含较
多代码词但 ratio_block≈0.83)由 _is_figure_or_table_caption_text 守卫保留。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): 标题页码剥离防误伤连续章节号序列
_strip_heading_page_numbers 剥离 heading 首部 1-3 位数字(防页码并入),
但当剩余标题"首词大写且 ≥2 词"时会误剥合法章节号:仅单词标题("## 4
Experiments"/"## 5 Conclusion")因 <2 词幸存,多词标题("## 2 Background
and Related Work"/"## 3 Self-Harness: An Iterative Loop...")的章节号被
误当页码剥离。
预扫描所有编号标题的数字,若构成连续序列(存在 ≥1 对相邻整数,如
1,2,3,4,5)判为合法章节号序列——序列内数字(与某元素相邻的)不剥离;
仅游离数字(孤立页码)适用原剥离逻辑。Self-Harness 论文 §2/§3 编号恢复,
§1/4/5 及子节 3.1-3.4/4.1-4.3 无回归。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): 伪代码剥离误标 lang + PUA 符号字体还原∅
docling/marker 把 Algorithm 伪代码(含 do/end do、end if 等 Fortran-like
语法)误标为 ``fortran`` 等真实语言,致 fence 错误语法高亮;且 PDF 符号
字体的 PUA 编码 ∅(U+F638)无法被 docling 映射到标准 U+2205,残留为
不可见 PUA 码点(Self-Harness Algorithm 1 行5 "A_t <- "、行18
"if A_t = then" 的空集符号丢失)。
1. _is_pseudocode:检测 "Algorithm N" 标题或同时含 "Require:"/"Ensure:"
算法关键字 → _code_block_to_markdown 剥离 lang,fence 不带 info string。
2. _PUA_MATH_CHAR_MAP:PUA 码点 → 标准 Unicode 数学符号映射(→∅),
_code_block_to_markdown 渲染前还原,使符号可正确显示。
已验证 Algorithm 1 fence 改为无 lang、∅ 恢复(行5/行18);python 代码块
仍保留 ```python;§1-5 章节编号无回归。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): display 公式块与正文内联 raw LaTeX 字面串去重
公式既以内联 raw LaTeX 字面串(非 $...$ 包裹,属抽取残留,如
"C_{\phi}={r_{i}\in F_{t}|\phi(r_{i})=\phi}")出现在正文段,又作独立
$$...$$ display 块时,display 为重复抽取。Self-Harness 论文 C_φ 聚类
公式即此情形(内联字面串由后续内联数学重建插入正文,emission 时去重
无法捕获)。
新增 _dedup_inline_display_formulas:在最终 markdown 后处理阶段,对每个
$$...$$ display 块,用 _formula_text_signature(剥 LaTeX 命令 + 非
alphanumeric,使 \phi 与 Unicode φ 归一一致)计算签名;若为"剥离所有
$$...$$ 与 $...$ 后的正文 raw 文本签名"的子串(≥6 字符)→ display 重复,
去除并清理多余空行。安全闸:先剥 $...$ 行内数学,仅匹配 raw 字面串,
故意内联 $...$ + display 并存的论文不受影响。已验证 C_φ display 去除、
r_i/F_t/φ(r_i) 等合法 display 保留、§1-5 编号无回归。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): orphan 图优先内联放置到同页兄弟图后,避免甩至文末
image_ref_normalizer._append_orphan_images 原把所有未引用图追加到文末,
致多面板 figure 的右侧 diff 面板(fig_p10_2/fig_p11_2/fig_p19_2,与左侧
轨迹图同页但未被文本引用)被甩到文末,破坏阅读流。
新增内联放置:orphan 若与**唯一**张已引用图同页(多面板 figure 的典型
情形),插入到该兄弟 <img> 标签之后;无兄弟或多兄弟(归属歧义)回退
原文末追加。"唯一同页兄弟"门控消除多图页误配,保证非回归安全。
Self-Harness 论文 Figure 5/6/10 右侧 diff 面板现紧跟左侧轨迹图内联,
caption 仍在下方;文末 orphan 块消除;12 张图全部内联。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): 抑制纯公式残留段落(PyMuPDF 把 display 公式抽为破碎 $...$ 段落)
PyMuPDF 把 display 公式(如 Self-Harness Δ 接受规则 \Delta_{in}^{(j)}\geq 0,
max(...)>0)另抽为破碎 $...$ 行内数学的独立段落(无 prose,如
"$∆(j)$ $_{in} \geq0,$ $∆(j)$ $_{ho} \geq0,$ ..."),与干净 display 块并存。
新增 _strip_formula_dominated_paragraphs:文档含 $$...$$ display 块时,若
段落去除 $...$ 后剩余 prose < 15 字符(纯公式残留、无实际文字)→ 抑制。
保留 $$...$$ display 段落、heading、含实质 prose 的混合段落。Self-Harness
论文 Δ 接受规则的纯公式残留段已抑制(display 块保留);混合 formula+prose
段(Δ 定义 + "A candidate is accepted..." 句子)需语义分离,列入 unfixable。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives): orphan 内联放置加 caption 守卫,避免独立 figure 被错并入
orphan 内联放置原仅凭"同页唯一兄弟"判定,但兄弟图若有 caption(完整独立
figure,如 "图1.1"),orphan 是另一独立 figure 而非同 figure 的面板,内联
会错把独立图并入兄弟图后。
加 caption 守卫:仅当兄弟图无 caption(多面板 figure 的 panel,caption 由
单独文本块承载)时内联;兄弟有 caption 时 orphan 回退文末追加。修复
test_content_figure_preserved_not_page_dominant 回归(fig_p14_1 有 caption
"图1.1"→fig_p14_2 回退文末);Self-Harness fig_p10_1 无 caption(panel)
→fig_p10_2 仍内联。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives/assembly): dedup cross-engine table-cell echo text blocks
Multi-engine PDF fusion (--method auto) emitted each table twice: once as a
GFM grid (Unicode △/×/✓ from one engine) and again as loose inline-math text
($\triangle$/$\times$ from a second engine). The loose echo bypassed existing
dedup because (a) its bbox/page-number was misaligned with the grid table's
coordinate space, defeating the spatial-overlap dedup (_grid_table_regions),
and (b) it did not start with '|', defeating the pipe-gated fingerprint dedup.
Add content-level echo suppression in the text-block assembly loop, gated on
the document having grid tables:
- Precompute per-table first-column row-label tokens AND full-cell tokens
(extracted from any '|' lines, independent of caption prefix which often
makes table.markdown start with "Table N |" rather than "|").
- Tier A: marker-dense block overlapping a table's row labels >=3 tokens.
- Tier B: marker-dense block with <=2 English words (pure cell echo).
- Tier C: text-only cell echo — >=5 content tokens (stopword-removed) with
>=90% in a table's full-cell set.
Marker counting strips LaTeX macro letters (triangle/times) before the word
count so density is not undercounted. Conservative gating keeps false
positives near zero (verified on diverse table-vocabulary prose).
On the 88-page survey eval doc, removes 137 lines of redundant table echo
across all 6 tables while preserving all 100 grid rows, 73 headings, the
References section, 11 figure refs, and 30 display-math blocks.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives/assembly): suppress figure label clusters + unwrap byline math
Two fidelity fixes for academic PDFs (survey eval doc: -358 lines of cross-
engine duplication with zero content loss, all structure intact).
1. Figure-internal label clusters: layout figure regions contain box/arrow
labels (e.g. "Meta-Agent continuously optimizes the Harness", "Other
External Updates") with >=2 English words, escaping _is_low_content_figure_label
and leaking as stray body text. Per-block extension would re-introduce
content loss (oversized figure regions swallow real section titles, ISSUE-094).
Cluster-based instead: pre-scan counts per-page short label-like blocks
(2-8 words, no section-number prefix, no terminal punct) overlapping a
layout figure region; >=3 on a page => figure-internal labels, suppress.
<3 preserved (likely real content). All figure-label leakage removed;
heading count unchanged (73).
2. Byline/footnote math unwrap: engines wrap affiliation superscripts
($^{1}$), daggers ($\dagger$/$∗\dagger$), separators ($,$) as inline math.
_unwrap_byline_math (applied in _text_block_to_markdown) unwraps $...$
whose inner is purely superscript groups/digits/daggers/commas to
<sup>..</sup>/†/‡/∗/,. Real math ($x^2$, $\alpha$, $\sigma_{i,t}$) keeps
letter variables after strip => preserved. Covers byline + regular text +
footnote markers (all $^{N}$ -> <sup>N</sup>).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
按 AGENTS.md「UI Table 设计规范」将全站表格收敛到 Routine/Scheduler 黄金标准: 固定列宽(table-fixed + colgroup 百分比)、单行不折(truncate)、溢出 Tooltip(TextTooltip)。 - Dashboard TaskTable、ApiDocPanel 参数表、EntityListPanel 实体表、 McpServerCard Schema 表:完整改造为基准范式(table-fixed + colgroup + TextTooltip), 保留各表原有交互语义(sticky 表头/滚动区/选中高亮/无限滚动锚点/右对齐数值)。 - ContentExplorer:对齐基准范式,Preview 由 line-clamp 折叠简化为单行截断 + Tooltip, 同步重写单测(4 例全绿)。 - 共享 table-styles.ts 令牌向基准对齐(rounded-xl、去表头 bg、text-xs、border/60), 两处 div-grid 表格(Documents / Knowledge Base)长文本列 title 升级为 TextTooltip。 验证:pnpm typecheck / lint(--max-warnings=0) / 239 例单测全绿。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
* feat(patrol): PDF 巡检状态落库 + selector 改读列 + 重置为未拟合 API; - KnowledgeDocument 新增 patrol_status/patrol_score/patrol_routine_id/patrol_updated_at 列 + 索引;迁移 0092 含从 memories 回填存量 done/unfixable(幂等 + downgrade DROP 红线) - 写入路径 dual-write:spawn 写 in_progress、终态 _upsert_status 写 done/unfixable、cancelled 双守卫回退 NULL;DB 列为权威读源(Memory TAG_STATUS 暂保留写入,Phase 2 deprecate) - selector _select_next_pending_doc 改读 patrol_status IS NULL(替换 Memory skip_ids);_has_running_patrol 保持读 routines 表防 in_progress 残留卡死全系统 - 新增 DocumentStorageService.reset_patrol_status:在跑 409 拒绝 / 取消终态 Routine 解除 selector 门 / 清列 + 清 Memory TAG_STATUS·TAG_UNFIXABLE;双路由(corpus + 库文档) - DocumentResponse + _build_document_response + 详情端点透出 patrol 四字段 - PatrolMemoryStore.clear_doc_legacy_memories 清文档级遗留记忆 🤖 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> * feat(patrol-ui): Documents 列表新增「巡检状态」列 + 「重置为未拟合」操作; - 列表顺势由旧 div+grid-cols-13(全仓无定义、列宽靠隐式网格自适应的隐患表)重构为 <table table-fixed> + <colgroup> 黄金标准,修复隐患并对齐 CLAUDE.md 表格规范 - 新增 PatrolStatusBadge:4 态(未巡检/正在巡检/巡检失败/拟合成功+分数)配色对齐 routineStatusClass 与巡检语义表,非 PDF 行显示「—」 - Actions 新增「重置为未拟合」按钮(仅 PDF + done/unfixable 显示),useConfirmDialog 确认 → resetDocumentPatrol → listRefresh;409 时 toast 提示先取消在跑巡检 - KnowledgeDocument 类型加 patrol 四字段;knowledge-api 新增 resetDocumentPatrol 客户端函数 - BFF 新增 reset-patrol 路由(corpus + 库文档两份)透传后端 🤖 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> * test(patrol): 巡检状态落库/重置/回填测试覆盖; - 单测:selector 改读 patrol_status IS NULL(替代 skip_ids expanding)、spawn 写 in_progress、cancelled 双守卫回退、_has_running_patrol 仍读 routines(白盒防回归) - 集成(真实 PG):spawn 写列 in_progress、终态 finalize dual-write done/unfixable + score、cancelled 回退、reset 清列 + 取消终态 Routine + 重选、reset 在跑 409、迁移 0092 从 memories 回填 - selector 隔离测试改用单 doc 视角门控判定(_doc_is_pending_candidate),鲁棒于共享测试库 negentropy_test 累积数据导致的 ORDER BY LIMIT 1 选中不确定 🤖 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> * docs(patrol): 沉淀 PDF 巡检状态落库方案文档; - 新建 docs/.agents/pdf-fidelity-patrol-status.md:背景动机、四态机、写入路径三处(含 Mermaid 时序)、selector 迁移、重置 API 契约(含流程图)、dual-write→Phase 2 路线、边界风险、验证 - knowledge-map 索引新增该方案文档行 - issue.md 追加 ISSUE-158(表因/根因/处理/防范/同类影响) 🤖 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> * test(patrol): 修复 reset 测试 AsyncSessionLocal 未指向测试库致 CI 失败; - 根因:DocumentStorageService.reset_patrol_status 内部用全局 AsyncSessionLocal 开会话(import 时绑定到 settings.database_url 的非测试库);CI 中该库无 knowledge_documents schema → UndefinedTableError,且与测试 db_engine 跨事件循环 → attached to a different loop。本地因 DB 环境巧合通过,CI 暴露。 - 修复:两个 reset 集成测试加 monkeypatch 形参,把 negentropy.storage.service.AsyncSessionLocal 指到测试 factory(_sf(db_engine)),与既有 monkeypatch registry.AsyncSessionLocal 范式一致;移除未用的 import pytest。 🤖 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>
…1071 后续补救) (#1072) * fix(patrol): 巡检态以最新非 cancelled 终态 Routine 为权威校正; - 根因(实机查 PG 定位):文档「Code as Agent Harness」有 3 个巡检 Routine(cancelled/95、succeeded/95、cancelled/2)。_finalize_terminal_patrols 按 finalize 顺序 last-write-wins 写列,routine③ 先以 failed 终态写入 unfixable/2 覆盖了更早 routine② 的 done/95;随后 _collapse_superseded_patrols 取消 routine③ 但不回写状态,列停留 unfixable/2,迁移 0092 又从陈旧 Memory 回填。 - 修复:新增 _reconcile_patrol_status,每 tick 在 collapse 后以「每 doc 最新的非 cancelled(succeeded/failed)终态 Routine,按 created_at DESC」为权威重算列(cancelled=被取代/放弃,非真实结论);succeeded 或 best_score≥阈值→done,否则 unfixable;跳过有 running/paused Routine 的 doc(保留 spawn 的 in_progress);幂等仅变化时写。 - 迁移 0093 用同 SQL 部署时一次性修复存量受污染数据。 - 2 个集成测试覆盖(winner 覆盖 stale cancelled / 跳过 running);方案文档 §3.1+§7、issue ISSUE-159 沉淀。 - dry-run 验证:bug doc winner=succeeded/95 → 校正为 done/95。selector 已读列(patrol_status IS NULL),done 仍被正确排除。 🤖 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> * fix(patrol): reconcile 按 updated_at 判定最新 Routine(修 created_at 误判); - 根因(用户指正):_reconcile_patrol_status 用 created_at DESC 选 winner,但 created_at 仅是 Routine 的 spawn 时间;当多个非 cancelled 终态 Routine「完成顺序与创建顺序相反」时(先创建后完成的 succeeded vs 后创建先完成的 failed),created_at 会误选创建更晚但完成更早的 failed → unfixable,覆盖了真正最近完成的 succeeded → done。 - 修复:reconcile + 迁移 0093 的 ORDER BY 改 updated_at DESC。updated_at 是 Routine 终态达成(最后一次状态变更)时间,代表「最近一次巡检结论」,与用户「以最后一次巡检结论为准」语义一致。 - 新增测试 test_reconcile_picks_latest_by_updated_not_created:构造 created/updated 反序的两条非 cancelled 终态 Routine,断言 updated_at 最新者(succeeded/95)胜出(非 created_at 误判的 unfixable/52)。 - 方案文档 §3.1 + ISSUE-159 同步更新。 🤖 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>
🤖 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>
…#1073) 根因:selector 除正确的 patrol_status IS NULL 外,曾附加「命名门控」(display_name / metadata.title 非空预筛),致未巡检但无标题的 PDF 被永久跳过,Scheduler 恒报 「无待检 PDF 文档」(实证:线上库 2 份未巡检 PDF 全被该门挡住)。 设计层:命名门控把「要不要巡检」与「Routine 叫什么名」两个正交关注耦合。系统本已解耦 命名——_doc_display_title 三级兜底 + _collapse_superseded_patrols「原始文件名兜底自愈」 (更优名源出现时取消旧 Routine、下 tick 以更优名重建)。故命名门控为 #1071 自身引入 collapse 自愈后的遗留物,其「名创建即定格」理由已自相矛盾。 变更: - 移除 _select_next_pending_doc 的命名门控谓词(patrol_status IS NULL + NOT EXISTS 两道门保留) - docstring 改述为正交分解语义 - 翻转 test_pdf_fidelity_patrol_handler 单测断言(命名门控 存在→不存在,防回归) - 新增集成回归:未巡检且无 display_name/title 的 PDF 满足 selector 资格谓词 - 同步 docs/.agents/pdf-fidelity-patrol-status.md selector 门控清单 副作用:仅剩原始文件名(含 arxiv-ID 如 2603.05344v3.pdf)作 Routine 名的文档也会被巡检 (名字为展示性,collapse 自愈会在更优名源出现后重建)。不触碰 patrol_status 四态语义 / unfixable 终态 / reset / reconcile / collapse。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
* feat(negentropy-ui): 新增表单/表格共享原语(Field/Input/Select/Textarea/TruncatedCell)与列宽注册表; Field:水平表单字段原语(label 1/12 + 控件 11/12,溢出截断 Tooltip,variant=check 处理勾选/开关,FieldContext 自动 label↔控件关联);InlineField:紧凑同质组内联;Input/Select/Textarea:baseInputCls SSOT 统一 4 套历史样式约定;TruncatedCell:去重 ~20 处 TextTooltip+truncate 写法(三形态:纯文本/尾图标/复合);table-styles:表头加 whitespace-nowrap + TABLE_COL_WIDTHS 语义列宽注册表。 🤖 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> * style(negentropy-ui): 表单内联化(label 1/12 同行)+ 表格系统性对齐设计规范; 落实 AGENTS.md「UI 表单/表格设计规范」: - 表单:~25 个表单由垂直堆叠改为水平内联(label col-span-1 + 控件 col-span-11),覆盖 Tier-1 配置抽屉(Routine/Scheduler/Repository/Mcp/Skill/Tool/Agent)、动态 API 字段(7 组件)、知识库对话框(Corpus/AddSource/Replace/Import/CreateWiki 等)、长尾面板(ManifestField/graph/wiki/memory) - 表格:表头加 whitespace-nowrap;违规表 base/page 语料 Documents 表转 <table table-fixed>+<colgroup>,Actions 改单行 + More 溢出 DropdownMenu(抽 CorpusDocRowActions);9 合规表抽取 TruncatedCell - 同步更新 KnowledgeBasePage 测试:文档删除经 More 菜单触发(反映新溢出 UX),语料库删除保持直接按钮 - 转换源无 label 的区块级控件(Payload JSON/System Prompt 等)仅换基类样式,最小干预 验证:typecheck + lint(--max-warnings=0)+ vitest 989/989 全绿 🤖 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>
* feat(knowledge): refresh-markdown 新增 resume 参数控制 checkpoint 复用; 为支持「彻底重走 PDF→Markdown pipeline」,给 DocumentMarkdownRefreshRequest 新增 resume 参数,与既有 pipeline retry(resume) 双入口对称: - schemas.py: DocumentMarkdownRefreshRequest 加 resume: bool=False - documents.py: _refresh_document_markdown_impl 透传 resume 到后台重解析 - _shared.py: _reparse_document_markdown 加 resume 形参 → extract_source(resume=...) (复用既有 _maybe_inject_resume 咽喉注入 perceives 工具) - UI: refreshDocumentMarkdown 发送 resume;Re-Parse 常态默认 false(清 .batch_state checkpoint 全量重跑),失败/partial 态「Continue (resume)」 显式传 true 断点续传;tooltip 文案与注释同步 为 PDF Fidelity Patrol Real-Render Gate 提供清 checkpoint 的真 Rebuild 入口。 🤖 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> * feat(wiki): 单条导出 export_single_entry + dev 模式内容缓存旁路; 为 PDF Fidelity Patrol 真实 wiki 渲染闭环提供基座(不改 wiki 渲染源码,复用既有 [pubSlug]/[...entrySlug] 路由 + MarkdownRenderer 全栈): - wiki_export_service: 新增 export_single_entry(不 _reset、不触碰其他 entry, 原子写 entries/{id}.json + 幂等 upsert entries-index),供 Real-Render Gate 在 refresh_markdown(resume=false) 后单条同步生产内容到 wiki 内容根; 新增 _write_json_atomic(.tmp→os.replace)避免与 wiki dev server 读取竞争 - content-source.ts: dev 模式(NODE_ENV!=production 或 WIKI_CONTENT_NO_CACHE=1) 旁路进程级 fileCache/indexCache,使 next dev 能读到 inner loop 每轮原子覆盖写 的候选 Markdown(默认模块级缓存会锁旧值,巡检无法反映每轮改动) 🤖 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> * feat(patrol): 真实 wiki 渲染环境编排 patrol_wiki_env(内层渲染基座); 新增巡检 wiki 渲染环境编排模块,为 fast inner loop 提供「真实 wiki 渲染栈」基座 (实际 wiki app 的 react-markdown 全栈,取代旧 _fidelity_render 近似渲染): - 新增 patrol_wiki_env.py: - ensure_content_scaffold:写最小文件态 wiki 内容包(index/publications/ publication/nav/entries-index),不入生产 DB、固定 patrol pub/entry slug - write_entry_content:复用 build_entry_content_response 合成 entries/{id}.json schema(与生产导出逐字段一致,DRY),原子写 - start_wiki_dev_server:非阻塞 spawn next dev(WIKI_CONTENT_DIR + WIKI_CONTENT_NO_CACHE),不在 scheduler tick 内同步等 ready(防单 worker 后端事件循环冻结);wait_ready 供 CC 截图前在 bash 内阻塞探测 - stop_wiki_dev_server:kill 整个进程组(start_new_session);pick_free_port 避让本机已占用端口;CLI publish-candidate / wait-ready 供 CC 调用 - pdf_fidelity_patrol._setup_patrol_wiki_env:Routine 创建期编排 scaffold+spawn, 失败降级 wiki_render_available=False(CC 回退 legacy 渲染,不阻塞);pid/port/ url 注入 routine config - orchestrator._reap_wiki_dev_servers:每 tick 扫终态 patrol routine 残留的 config.wiki_dev_pid,best-effort kill + 清键(防 next dev 残骸占端口) V1 限制:候选/真值 MD 内 /api/documents 图片引用在 wiki dev 源不解析(未 bake), 文字/段落/表格/公式/代码/布局类拟合已全覆盖;图片显示尺寸/figure 类待 asset bake 接入。 🤖 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> * feat(perceives): 逐页程序化预筛 patrol_page_check + PDF 页结构索引; 为「逐页截图对照不爆 context」提供程序化全页 + 视觉聚焦两层策略(既逐页覆盖 又不撑爆上下文,旧采样 ≤4 对漏检局部缺陷): - _fidelity_render: 新增 render_pdf_page_index(PyMuPDF 每页 head/tail 文本指纹 + image/table 计数 + toc),供锚点对齐与结构对照;render_page_pairs 标 Legacy (Python-Markdown 近似栈,仅 wiki dev 不可用时离线降级) - 新增 patrol_page_check:PyMuPDF 页结构 + Playwright DOM 探针(blocks/tables/ cells/imgs/code/katexErrors/headings)+ 指纹锚点对齐 → program-checks.json + align-index.json;仅 vision_required 页进 CC 视觉队列(≤8 对/轮)。V1 维度 text/table/formula/image/code/toc,阈值保守(假阴性优于假阳性,漏检由 CC vision 兜底) 🤖 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> * feat(patrol): 三杠杆归因 + 分层闭环 + 全绿率评分(prompt/schema/memory/judge 联动); 把巡检拟合范围从「仅 perceives 三模块」扩散到三杠杆、对照对象换成真实 wiki 渲染栈、 评分改全绿率口径(C5 契约+留痕 / C6 闭环 / C7 评分+Judge / C9 非回归 联动改造): - patrol_prompt CONTRACT_SCHEMA:defects 扩 severity/evidence/check_method/attribution {lever,layer,target_file,root_cause_hypothesis,confidence,dual_source_check}/status; 顶层加 score_method=page_pass_rate + pass_pages/total_pages + page_checks_summary; diff_summary 不限 perceives(含渲染/摄取/导出/Skill/流程) - PATROL_SYSTEM_PROMPT 改写为分层闭环: - 三杠杆范围表(管线/摄取/导出/渲染wiki·ui + Skills + 流程)+ 归因路由表 + 双源验证决策树 - Inner Loop(清checkpoint→CLI重转→publish-candidate→程序化预筛→截图→视觉聚焦→ 三杠杆归因→全绿率评分→一根因修复)+ Real-Render Gate(refresh_markdown(resume=false) +重发wiki作地面真值)+ 降级(wiki_render_available=false 回退 legacy) - 单轮一个逻辑根因(≤3文件≤2杠杆);非回归门控按杠杆分派 - build_goal 注入 wiki_env + known_defects;build_acceptance_criteria 改全绿率口径; handler _create_and_start 取 TAG_DEFECT 历史缺陷注入(纵向非回归) - patrol_memory:新增 TAG_DEFECT + record_defects(归因轻校验 lever/layer 枚举)/ get_defects/get_defects_by_category;persist_contract 落缺陷快照;clear_doc_legacy 清缺陷 - evaluator _JUDGE_PROMPT_ANCHORED:增补全绿率口径校验(score 与 pass_pages/total 一致 + defects 覆盖 8 维度 + 归因完整 + done 判定须 defects 空/仅剩 unfixable),根治 ISSUE-128 振荡 🤖 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> * feat(skill): pdf-fidelity-restore 升级三杠杆版 v1.2.0 + reseed 迁移; Skill 的「分层修复路由」从旧三层(渲染/摄取/管线)升级为三杠杆版,与巡检改造对齐: - SKILL.md + skill_templates yaml(SSOT 双写): - 分层修复路由细分为 ①工程代码(管线/摄取/导出/渲染 wiki·ui)+ ②Skills 本体 + ③流程自身 - 增「双源验证决策树」(候选 MD 源码层 vs 渲染层,防误归因到 perceives) - 热更铁律的 refresh 改 resume=false(清 checkpoint 全量重跑) - 关键洞察补三条:三套渲染栈系统性差异 / 全绿率评分口径 / 双源验证防误归因 - 新迁移 0094_reseed_pdf_fidelity_restore_skill_v1_2:非破坏 UPDATE 推 v1.2.0 正文到 DB 行(skills_injector 注入 DB 行非 yaml),1.2.0 skill_versions 快照 NOT EXISTS 守卫 - test_skill_pdf_fidelity_parity:version 断言 1.1.0→1.2.0(5 测试全过,正文 twin 一致) 🤖 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> * test(patrol): 适配重构后的 prompt/acceptance 内容(分层闭环+三杠杆+全绿率); patrol_prompt 表征性测试断言旧文案(采样/Contemplation 三角色/评分指引/refresh-markdown 红线),prompt 已合法重构为分层闭环+三杠杆+全绿率口径,更新断言匹配新内容: - test_build_goal:采样→分层闭环 - test_build_acceptance_criteria:评分指引→评分口径 + pass_pages 字段 - test_system_prompt:Contemplation/Action/Internalization 三角色→Inner Loop/Real-Render Gate/ 三杠杆/归因路由表/双源验证决策树;refresh-markdown 红线→绝不写生产 markdown_content 红线 + refresh_markdown(resume=false) gate 入口;CONTRACT_SCHEMA 增 page_pass_rate/attribution 断言 52 个巡检相关单测全过(prompt 8 + memory 17 + handler 22 + skill parity 5)。 🤖 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> * fix(ci): 修复 backend-quality Judge prompt 与 security audit B110; backend-quality(4 测试 KeyError 'lever,layer,target_file'): - evaluator _JUDGE_PROMPT_ANCHORED 第 8 条 ``attribution.{lever,layer,target_file}`` 的 ``{...}`` 被 prompt 的 .format() 当成替换字段 → 改为行内 prose ``attribution 含 lever/layer/target_file 三字段``(无花括号) security audit bandit B110 try_except_pass(3 处): - patrol_page_check.py:96(本轮新增,proper 修复):try/except:pass → contextlib.suppress (与 _fidelity_render.py:156 既有的 B110 规避法一致) - image_ref_normalizer.py:85 / assembly.py:4021(base 预先存在的 PIL 尺寸解析 best-effort 回退,非本 PR 逻辑):最小 ``# nosec B110``(codebase 既有 56 处 nosec 惯例), 避免在无关大 try 块上重排缩进引入风险 本地验证:evaluator anchor 7/7 通过;bandit 扫描「No issues identified」。 🤖 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>
…1076) 根因:_select_next_pending_doc / _select_regression_sample 未按 status 过滤(全仓其余文档查询一律 status=='active'),致 status='deleted' 的 PDF 被选中——其源 blob 已随删除清除,巡检预取抛 Blob not found,整 tick failed;且文档未标记终态,下一 tick 重选 → 无限失败循环卡死队列、累积 consecutive_failures 触发任务禁用。实证:线上库 2603.05344v3.pdf 有 active(done) + deleted(NULL) 两条同 file_hash 记录,selector 选中 deleted 那条。 变更: - Fix 1+2:selector 与回归样本 SQL 增加 AND status = 'active'(对齐全仓约定,排除软删文档)。 - Fix 3(活性韧性):抽 _handle_stage_source_failure 分类源 PDF 预取失败——永久 Blob not found → 标记新终态 source_unavailable + tick 优雅 ok 继续(不卡死队列/不禁用任务);瞬态错误(如 DB 抖动)维持 failed 下一 tick 重试,不误杀可恢复文档。 - 新增第 5 态 source_unavailable(无需迁移:patrol_status 为无约束 VARCHAR(20));前端 PatrolStatusBadge/knowledge-api/page 重置按钮/patrol-reason 全适配;reconcile/finalize/collapse 均不触碰该态(无 routine→无 winner),仅「重置为未拟合」可清回 NULL 重试。 - 模型列注释、pdf-fidelity-patrol-status.md(5 态机 + selector status 门控 + 韧性说明)同步。 - 测试:单测加 status='active' 与 helper 分支白盒断言;集成新增 deleted 排除 + source_unavailable 标记 + 瞬态 failed 三条回归(54 passed)。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
* fix(perceives/formatter): 解包中文人名译名被误判为公式的 inline 伪公式
中文 PDF 外国人名译名的间隔号「·」被公式引擎 LaTeX 化为 \cdot 并整名包进 inline $...$(如「约翰·诺伊曼」→ $约翰\cdot 诺伊曼$)。既有 _unwrap_prose_math 仅按 ≥3 个 ASCII 字母词判定散文误包,对 CJK body(无 ASCII 词)恒不命中,致全书数百处人名渲染为 LaTeX 数学体。
补 CJK 判定分支:body 含 CJK 字形 + \cdot 且无真实数学结构(frac/sum/_{}^{}/Greek 等护栏)即解包并 \cdot→·;真实公式由 _REAL_MATH_CMD_RE 完整保留。
验证:巡检文档 328 处伪公式 → 1 处(孤立 $\cdot$);46 个 formatter 单测全绿。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(perceives/formatter): 剥离标题末尾多余中文句号「。」
docling 提取中文书籍大事记/年表条目(如《浪潮之巅》AT&T 大事记「## 1875 贝尔和沃森发明电话。」)时把陈述句末句号带入标题文本,与源 PDF(标题无句号)失真;巡检文档全书 212 处标题受影响。
format_fidelity_safe(auto_batch 合并产物最终后处理出口,ops/pdf.py:181)在 return 前补一处 re.sub:剥离末尾中文句号「。」,保留「?」「!」等语气标点与英文「.」(章节编号/缩写可能合法结尾);正文句号不误伤(2824 处完整保留)。
验证:离线对候选 md 跑修复 212 处标题句号 → 0;fidelity_safe 集成验证问号/正文句号保留;5 个新增回归测试 + 246 个 formatter 相关单测全绿。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* fix(negentropy-ui): Corpus Documents 列表 Name 列超长内容溢出截断 Name 列为保留点击导航语义用 <button> 包裹截断 span,但 button 的 width:auto 即便 display:block 仍解析为 fit-content(表单控件特例),按内容宽度撑开致内层 span.truncate 无可截断基准,长名溢出覆盖相邻列(SOURCE/SIZE/STATUS),违反「UI 表格设计规范」单行截断要求。 为 button 增补 w-full,将宽度钉死在 table-fixed 的 w-[30%] 列宽,恢复 span.truncate 截断 + 既有溢出感知 TextTooltip(仅 scrollWidth>clientWidth 才弹)。不动 TruncatedCell 共享原语。 验证:长名(400 字)span 截断且按钮 right 不越列(btnRight 474 < nextCol 490); 短名不截断不弹冗余 Tooltip;点击 Name 仍跳转 document-chunks。typecheck/lint 全绿。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * style(negentropy-ui): Corpus 侧栏回退按钮改用紧凑 Ghost + chevron-left 图标 侧栏「← Back」原为占满宽度的描边按钮 + 字符箭头,简化为设计系统 Button(variant=ghost、size=sm) + lucide-react ChevronLeft 图标 + 「Back」文字:去边框、左对齐(-ml-1.5)、self-start 按内容自适应、 悬浮显底(hover:bg-muted),视觉更精致现代。 复用本文件已 import 的 Button 与项目统一图标库 lucide-react(无 tabler 依赖), chevron-left(path m15 18-6-6 6-6)与提供参考的 tabler 同形,对齐 Pagination/PanelRail 既有用法。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
#1079) 为 wiki 站点渲染 Markdown 时的不可翻译内容块追加 Google 翻译约定的 notranslate class, 避免 Chrome「翻译此页」误翻代码、公式与图表: - CodeBlock: fenced 代码块 <pre> 加 notranslate(语言标签/复制按钮仍随页面翻译); - 新增 rehypeNotranslate 插件: 行内代码 <code>(非 pre 子)与 KaTeX(.katex/.katex-display), 幂等且命中 KaTeX 外层即 SKIP, 避免污染 CodeBlock 的语言标签计算; - MermaidDiagram: 渲染图容器与报错源码 <pre> 加 notranslate(保图表布局、源码不译); - 补 4 条单测覆盖代码块/行内代码/块级与行内公式; 保留「容器允许翻译」既有断言。 块级豁免与 .wiki-markdown-body「整页允许翻译」既有决策互补; className 已在 rehype-sanitize 白名单内, 无需改 schema。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
🤖 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>
- 配置层:patrol_qualified_score_threshold 的 Pydantic Field 默认值与 config.default.yaml 同步 95→99 - handler 行内注释同步订正(保单一事实源) - 连带修订编码旧阈值的测试:done 路径 best_score 96/97→99 及对应 score 断言、docstring 阈值数字 - 影响:终态分类 [95,98] 由 done 翻为 unfixable(收紧合格线的预期效果);派生 Routine 按 tick 重建,新阈值自动生效,无需数据迁移 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
* feat(video-pipeline): 沉淀公共科普视频制作管线并收敛上集脚本为薄包装; - 新增 media/pipeline/:中心脚本三件套(build_narration/tts/qa_frames,--project 参数化,tts 增 --voice/--rate)+ Pipeline 总纲 README(九阶段 Stages、两种工程模式、复用边界、新集脚手架清单)+ skills/01-05 各阶段代理提示词规格; - 上集 scripts/*.py 改为薄包装转发 ../../pipeline/scripts/,保持原 CLI 契约;改造后 narration.json 字节级等价验证通过(shasum 一致); - qa_frames CLI 规整:--scene 与句 id 位置参数互斥二选一。 🤖 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> * feat(video): 新增《上线之后,AI 才开始上学》经验时代综述科普视频工程(笔记/逐字稿/分镜/Remotion 全链路); - 基于清华×Frontis.AI 88 页综述《Self-Improving Agents in the Era of Experience》制作,与上集《AI 如何自己变强?》互补(改什么 vs 怎么攒经验),片尾互相引用; - research/paper-notes.md:9 个并行提取代理逐章精读产出的单一事实源(四段式:主旨/代表方法/风险防护/科普素材),IEEE 引用 + 140 号工程调研交叉引用; - script/:七幕策划案(金=经验流/青=Harness/紫=参数内化三色契约)+ 172 句逐字稿(12.6 分钟纯语音)+ 分镜表; - video/:Remotion 独立工程,七幕场景组件(P0Hook–P6Ending),manifest 驱动音画自动对轨,typecheck 零错误,草渲抽帧 QA(30+ 帧/7 幕目检)通过后终渲 1080p30(13.6 分钟,out/final.mp4 本地产物不入 git); - 根 .gitignore 追加本集产物规则;knowledge-map 增补「科普视频制作 Pipeline」条目串联基建与两部作品。 🤖 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> * fix(video): 修复《上线之后,AI 才开始上学》五处渲染缺陷; - 3-E 自指套娃:百分比定位量纲错配致整幕空白,改 px 居中; - 九处底部公式角标落入字幕条区域被 68% 黑底压暗,统一抬高至 bottom ≥ 150; - 1-F 快慢弧线:pathLength=1 与像素级 dasharray 量纲互相抵消致渐进动画失效,改用 mask 分离绘制进度与虚线样式; - 4-D 纵向时间线:删除多余 pathLength={1} 恢复虚线外观; - 6-E 片尾渐黑窗口 [220,260] 超出 beat 实际帧数被硬切,改为从末句实时长推导 endFrame 收进 beat 内。 全部修复经 Remotion still 全分辨率抽帧像素级验证。 🤖 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> * chore(video-pipeline): 清理两处 build_narration 薄包装的 runpy 死导入; 🤖 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> * fix(video): 处理《上线之后,AI 才开始上学》六条评审意见; - 开屏英文引语换为 Silver & Sutton 原文逐字句(摘要句), 并在 paper-notes.md 补录 Era of Experience 原文锚点; - p5-19 口播计数断档改为「更阴的还有一招」, 重生成 narration.json 并增量重合成该句 TTS; - storyboard.md 与场景实现对齐:2-D 并入 2-C(p2-07..12)、 后续镜号顺移,P5 插入 5-A2 引子行、5-B 改 p5-08..12, 同步代码 Sequence 名称; - 金句卡 ASCII 直引号改直角引号「」; - 删除模板遗留死代码(ChapterCard 组件、 FourDestinationsPreview.highlight、Ladder.lit); - pipeline/README.md 脚手架清单 git cp 改为 cp -r。 🤖 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>
* chore(video): 新增《会写代码的 AI,开始给自己写代码》工程脚手架; - 复制第二集工程骨架至 media/self-evolving-coding-agents-video/(薄包装脚本/Remotion 基建逐字节复用),清除上集内容与本地产物; - package.json 换本集工程名;theme.ts 落本集双色契约:终端绿 #4ADE80=可执行证据(全片主色,确认绿与之合一)/ 洋红 #FF6EC7=进化动作; - 根 .gitignore 追加本集产物忽略块(audio/out/mp4/mp3/wav,规则须在根级维护); - pnpm install --ignore-workspace 验证通过,根 lockfile 零变更,本集 lockfile 与上集一致。 🤖 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> * feat(video): 自进化编码智能体综述论文精读笔记; - 新增 research/paper-notes.md(8 个并行提取代理对 arXiv:2608.03392v1 HTML 全文逐节精读产出,~79K 字符 534 行); - 章节划分:A 摘要+§1(钩子素材富矿)/ B §2+Table 1(三圈概念边界)/ C-F §3.1-3.4(框架/记忆/技能工具/模型)/ G §3.5+§4(工作流拓扑+时机×证据)/ H §5-7+Table 2 结构; - 每章四段式:主旨综述/代表方法/风险防护/科普叙事素材(金句英文逐字,供字幕角标与事实核查复用); - Table 2 处理约定:各 §3.x 代理只提取本类目行+计数(30 条收录:框架 6/记忆 6/技能工具 5/模型 7/工作流 6;时机 Task-time 5/Post-task 10/Stage-wise 15),不做全表转录; - 验收:抽 10 条关键英文断言对论文 HTML 原文 grep 验证,命中率 10/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> * feat(video): 七幕策划案与双重校验逐字稿; - script/planning.md:六节策划案(定位/叙事策略/视觉契约/七幕结构/生产管线/边界); 双色契约=终端绿 #4ADE80(可执行证据,确认绿与之合一)× 洋红 #FF6EC7(进化动作); 反枚举色彩原则:五对象不配五色,时间维度用位置编码; - script/narration.md(v2,187 句 3611 字,估算 12.9 分钟纯语音 ≈ 14.6 分钟实渲): P0 冷开场(SICA 打开自己源码的反转钩子)/ P1 三圈概念边界 / P2 五个进化的对象 / P3 时机×证据 3×3 矩阵 / P4 SWE-bench 考场 / P5 可信进化(KEY QUOTE)/ P6 三集收尾; - 双重校验(skill 04):真实性核查 185 句全表(v1:VERIFIED 145/ANALOGY 22/META 11/ REWRITE 7/RISKY 0)+ 易懂性评审(2 处数量硬伤 + 5 处术语缺口 + P3 幕尾补钩); v2 落回全部 24 处修正,复评 RISKY/REWRITE 双清零; - script/narration.json:build_narration.py 派生物(句 id 前缀/唯一性校验通过)。 🤖 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> * feat(video): 分镜表、Remotion 七幕场景与生产层技能规格沉淀; - script/storyboard.md:七幕分镜表(42 镜,句区间全覆盖无交叠),每镜画面/动效规格与本集色契约声明; - video/src/scenes/ 七幕组件:P0Hook(SICA 打开自己源码反转钩)/ P1Boundary(三圈韦恩+天然试验田+三养料)/ P2FiveObjects(五器官地图+SICA diff/经验银行/WHAT-HOW/自博弈/仓鼠轮/健身房边界/工作流 DAG,17 镜)/ P3WhenEvidence(两把尺子+三态时钟+3×3 矩阵)/ P4Eval(考场门+真实 issue+五嫌疑人+六维雷达)/ P5Trust(墨滴水库+三假动作+四宗罪+KEY QUOTE 金句卡+五机制绿门)/ P6Ending(地图回顾+系列三卡+引用卡渐黑); - Main.tsx 注册表换七幕;tsc --noEmit 零错误; - 草渲 26461 帧(14.7 分钟)+ 70 帧抽帧 QA:11 个高风险镜(3×3 矩阵/五对象地图/金句卡等)目检通过, 全部无溢出/无遮挡/布局正常; - QA 发现并修复 1 处渲染缺陷:6-E 渐黑窗口误用末句时长(65 帧)导致收尾段长时间全黑, 改传 beat 实际时长(~430 帧)后区间重渲验证通过; - media/pipeline/skills/06-remotion-implementation.md:新增生产层 Stage ⑦ 技能规格 (骨架复制适配策略/场景组件模式/色彩契约设计规则/七条渲染缺陷自检清单含本次新教训/命令闭环); pipeline README 同步 01-05 → 01-06 一行更新。 🤖 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> * docs(knowledge-map): 科普视频系列追加第三集与生产层技能条目; - pipeline 条目更新:skills/01–05 → 01–06(06=生产层 Remotion 实现规格); - 作品清单追加第三集《会写代码的 AI,开始给自己写代码》(arXiv:2608.03392 NJUST×NJU 综述 · 终端绿/洋红契约 · 7 幕 14.7 分钟,五对象×时机证据×可信进化,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> * fix(video): 修复第三集七处 review 缺陷(失步/韦恩几何/虚构分数/徽章遮挡); - 1-F ThreeNutrients:phase 改为按句 id 边界驱动(p1-17/19 切段、p1-21 对比句对齐),三段动画不再压缩进前 4.6s - 3-B ThreeClocks:stage 按句边界(p3-03/06/09)驱动,高亮不再随帧溢出熄灭 - 5-B FakeMoves:stage 取模循环点亮,覆盖口播枚举窗口 - 2-P WorkflowDag:失败流水线保留至 p2-57 起始帧,红色 ✗ 与口播 p2-55/56 对齐,DAG 半场局部帧 rebase - 1-D Venn:sep/join 双弹簧使两圈 step 3 真正交叠(圆心距 740→340,透镜 280px),交集徽章落入重叠区 - 2-B/3-C/4-D:虚构分数 71.3→74.6 替换为 SICA 论文真实数字(SWE-bench Verified 0.17→0.53),4-D 改示意标记 - 2-I SkillDrawer:CODESKILL 徽章移至 AbsoluteFill 层,不再与第三张技能卡重叠 - 同步更新 storyboard.md 分镜描述与 paper-notes.md SICA 实测数字出处 🤖 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> * fix(video): 修复第三集 review 七处缺陷(失步×3/虚构分数/Markdown 残留/文档矛盾); - 0-C SelfSourceReveal:标签滚动/源码逐行/洋红 reveal/金句改由 p0-10..13 句边界驱动,反转包袱不再提前 9 秒剧透,标签滚动动效恢复可见 - 2-B SicaDiff:diff 渲染与 0.17→0.53 翻牌对齐 p2-06、保留徽章对齐 p2-07「分数涨了就留下」 - 5-A InkReservoir:墨滴(p5-04)/管线染红(p5-05..06 全变黑锚点)/金句(p5-07)改句边界驱动,消除前 4.3s 播完后近 30s 静止的失步 - 3-C ScoreCard:变体 C 无出处的 0.31 改为「—」示意,防观众误读为实测数据 - narration p2-23:删去 Markdown 残留 **,重跑 build_narration 与 TTS(时长 4.776s),字幕/口播不再出现星号 - skills/06 与 storyboard:片尾渐黑规则改回「从末 beat 总时长推导(beatDurationInFrames)」,与实现对齐并沉淀第三集上线教训 - README 复现流水线:渲染命令统一为 ./node_modules/.bin/ 直调,防 pnpm run 污染根 workspace 验证:tsc --noEmit 零错误;草渲 26414 帧后按句 id 抽帧 12 张目检,五个重排 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>
* feat(tts): 科普视频管线支持 IndexTTS-2.5 声音克隆双引擎配音; - tts.py 双引擎改造:edge(默认,digest/CLI/manifest 字节级不变)+ indextts(HTTP 客户端逐句克隆合成); - 新增 tts_server.py:运行于 index-tts checkout 环境的 FastAPI 推理服务(lifespan 模型常驻、串行锁、v2/v2.5 双版本、NaN 后置检测、soundfile→lameenc MP3 编码链); - 新增 prepare_ref.py:长录音裁剪/归一化为 5–15s 干净 16-bit 单声道参考样本; - 风格预设(中性/轻快/自信/正能量)映射 8 维情感向量 + emo_alpha + duration_factor,双端校验(非负有限值 + 有效和 ≤0.8); - 缓存摘要覆盖 engine_tag/ref_sha1/style/vec/alpha/df/lang,4xx 不可重试、5xx 指数退避重试; 🤖 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> * docs(pipeline): 新增声音克隆操作手册 VOICE-CLONING.md 并同步索引; - VOICE-CLONING.md 九节操作手册:部署(磁盘预算/断点续传/下载假死处置)/参考样本录制要求/风格预设与调参/逐集使用/缓存幂等语义/MPS 排障/bilibili 许可边界/备选方案对比 + IEEE 引用; - voices/README.md:样本目录约定与隐私提醒;根 .gitignore 目录级忽略个人声纹(仅白名单 README); - media/pipeline/README.md:脚本表补 tts_server/prepare_ref、§五 引擎可选说明、§八 许可补充; - knowledge-map:管线条目追加声音克隆手册链接; 🤖 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> * fix(tts): indextts 客户端并发降为 1 并提升超时,消除排队超时根因; - CONCURRENCY_INDEXTTS 2→1:服务端为串行推理锁,>1 的并发请求在锁后排队,排队时长计入客户端 HTTP 超时,长句场景连续超时(实测 p0-08/p0-12/p0-12b 三次命中); - HTTP_TIMEOUT 300→600:覆盖 MPS fp32 长句(33 字句实测可达 5 分钟); - 手册 §五 同步并发语义说明; 🤖 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> * docs(pipeline): 修正声音克隆手册与 prepare_ref 三处失实声明(评审修订); - 渲染命令补 cd video &&(render 脚本定义在 video/package.json,照抄原命令会报 Missing script) - 故障排查表 HTTP_TIMEOUT 300s→600s 并同步 §五 超时描述(对齐 commit b70afc3 与 tts.py:41) - 移除 m4a 可转换声明:libsndfile 1.2.2 无 MP4 容器支持,改为注明先经 ffmpeg 转 wav 🤖 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> * docs(pipeline): 修正评审指出的三处失实描述与隐性拦截写法; - VOICE-CLONING.md §4.2 与 tts.py 顶部注释:情感向量约束实为有效和(Σ分量×emo-alpha)≤0.8, 而非分量总和 ≤0.8(positive 预设总和 0.95 即为反例),补 happy:1.0@alpha=0.6 放行示例; - tts.py parse_emo_vector:NaN/Inf 拦截改为显式 math.isfinite(与服务端写法对齐, 拒绝/放行语义经 10 用例回归验证不变); - README.md 公共脚本表:prepare_ref.py 无工程薄包装,改为仓库根全路径调用指引。 🤖 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> * fix(tts): 评审修订——server 尾斜杠归一收口与情感键重复显式报错; - --server 尾部斜杠原仅 synthesize 拼接处 rstrip、health 检查拼出 //health 致 404 误报「服务不可用」;改为解析参数后统一归一化一处收口; - parse_emo_vector 原对重复情感键静默 last-wins 丢弃首个权重;改为显式报「情感键重复」,与未知键/负值/NaN 同级校验。 🤖 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>
* feat(tts): 视频管线新增「激情」配音风格预设与官方站点信源补充规范; - tts.py STYLE_PRESETS 新增 passionate(充满激情与轻快):happy 0.70 主载高唤醒正价 + surprised 0.20 跳跃感 + calm 0.10 锚定咬字,有效和 1.00×0.7=0.70 ≤0.8 上限,语速 0.97 护密集技术句清晰度;--list-styles 与模块 docstring 同步; - VOICE-CLONING.md §4.1 风格表收录 passionate 并置于推荐位,§4.4 补科普长视频风格推荐与数字密集段 df=1.0 微调指引,§五示例命令更新; - skills/01-paper-extraction.md 扩展「官方工程站点信源补充」纪律:只收事实性内容(逐字引用+URL+访问日期)、产出落 paper-notes.md 末尾独立「信源补充」大节与论文正文物理隔离、严禁下载/嵌入站点图片(概念转文字规格供 Remotion 代码动画重建)、站点信源单集专属不跨集、站点与论文冲突以论文为准; - pipeline README Stage ① 描述与 tts.py 脚本表同步;CHANGELOG Unreleased 收录管线条目。 🤖 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> * feat(video): 《会写代码的 AI,开始给自己写代码》论文深读校准与动画升级(v3); - 第二遍全文重读 arXiv:2608.03392 校准:v2 全部断言与原文一致(零事实漂移),重读结论与新增锚点沉淀至 paper-notes.md「2026-08 升级复核」节; - 逐字稿 v2→v3:新增 p2-07b(SICA 选择信号补全:分数+成本+运行时三项一起达标,锚 §4.2 "coding benchmark performance, cost, and runtime")与 p3-25b(Table 2 结构规律点破:时机×证据耦合近似一条斜线),其余 187 句零字节改动; - 分镜同步:2-B 补双仪表动效(成本/时长随句点亮)、3-F 补绿色斜线光带扫掠(对角规律可视化); - 新增 research/upgrade-2026-08.md 审计文档:校准审计表、句级 delta、双重校验 delta(RISKY/REWRITE=0)、G2 验证记录(189 句 rebuild、公共句字节稳定、storyboard 无悬空 id); - 本集无配套官方工程站点(用户确认),不引入站点信源。 🤖 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> * feat(video): 《AI 如何自己变强?》官方站点信源补充与收尾活地图镜(v3); - 论文 PDF 第二遍重读校准(§3/§4/§8/§9 重点页):v2 全部断言与原文一致(零事实漂移),结论与新增锚点沉淀至 paper-notes.md「2026-08 升级复核」节; - 官方工程站点信源补充(selfimproving-agent.github.io,2026-08-18 访问):312 条收录统计(77 FM/176 Scaffolding/59 Evaluation)、living research map 定位、九篇敲门砖清单、I.J.Good 题记佐证——按新规范录入 paper-notes.md 独立「信源补充」大节(与论文正文物理隔离); - 逐字稿 v2→v3:新增 p3-34b/c(Skill=打包保存的一次自我升级,锚 §3.2 "a reusable instance of the self-induced update operator U")与 P5 收尾两镜——p5-22a..22d 活地图(三色计数条 77 蓝/176 橙/59 灰,橙条印证「装备最火」)+ p5-22e/f 敲门砖卡片墙(9 篇双色分拣);其余 220 句零字节改动; - 分镜同步:3-G 扩金句条翻面动效;P5 新增 5-F 活地图镜(计数条生长+环图合拢)、5-G 敲门砖墙镜(交错飞入+双色分拣重排),原文卡重号为 5-H; - 新增 research/upgrade-2026-08.md 审计文档:审计表、句级 delta(8 新句)、双重校验 delta(RISKY/REWRITE=0,站点数字显式标注信源等级与访问日期)、G2 验证记录(228 句 rebuild、公共句字节稳定、storyboard 无悬空 id)。 🤖 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> * feat(video): 《上线之后,AI 才开始上学》经验编译器闭环与三代史升级(v2); - 源论文 88 页复核(§1–2 harness 形式化、§8 SIP-Bench、§10 开放问题):v1 全部断言与论文一致(零事实漂移),关键数字锚点(+16.2pp/16/84/~1,200/>90%/AI-45°)全部维持; - 官方工程站点信源补充(frontisai.github.io/Awesome-Self-Improving-Agents,2026-08-18 访问):trace-to-capability 五段闭环(经验编译器:选证据/提抽象/记出处)、Gen1→3 时间线精确语义、SIP-Bench 四指标问句、111 篇×9 章规模——录入 paper-notes.md 独立「信源补充」大节; - 逐字稿 v1→v2:新增 p1-25a(Gen3「适应面本身可进化」精确语义)、p6-06a..06d(经验编译器闭环复盘:把全片结构升格为一张五段环形图)、p6-13a/b(配套仓库 111 篇×9 章清单卡);其余 172 句零字节改动; - 分镜同步:1-G 补 Gen3 接口面板点亮、4-D 升级三检查点卡+四仪表通电、P6 重排新增 6-B2 闭环复盘镜(青路快闪/紫路慢沉双速差+闸门脉冲)与 6-F 清单卡镜,原文卡重号为 6-G; - 新增 research/upgrade-2026-08.md 审计文档:审计表、句级 delta(7 新句)、双重校验 delta(RISKY/REWRITE=0)、G2 验证记录(179 句 rebuild、公共句字节稳定、storyboard 无悬空 id)。 🤖 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> * feat(tts): IndexTTS 推理新增束搜索宽度旋钮并将管线默认降为 1 束(MPS 长跑提速); - 根因:MPS fp32 实测每句墙钟 RTF 40–58(GPT 束搜索 145–210s + 扩散声码 40–98s / 5s 音频),上游库内部 num_beams=3 使 GPT 段耗时按束宽线性放大,整集 180–230 句需 6–10 小时,三集串行不可行; - tts_server.py:SynthesizeRequest 新增 num_beams 字段(1–5 校验),_infer_sync 透传给 infer()(上游默认 3,采样生成 do_sample=True 下 1 与 3 听感差异可忽略); - tts.py:--num-beams CLI(默认 1,choices 1–5),http_synthesize/synth_indextts 全链路透传,edge-engine 参数忽略提示同步;注意:num_beams 不参与缓存摘要(与文本/风格/样本一样变化才重合成,束宽仅影响推理过程); - VOICE-CLONING.md:§4.3b 新增束宽速度主旋钮说明与实测 RTF 数据(40–58 vs 20–30),§五 每句耗时与整集预估改按实测口径(6–10 小时、nohup 后台+断点续跑建议),修正原「每句 5–30 秒」的失实估计。 🤖 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> * feat(video): 三集 Remotion 场景新增信源镜与动画升级(站点概念代码化重建); - 《AI 如何自己变强?》:P5Ending 新增 5-F 活地图镜(三色计数条 77 蓝/176 橙/59 灰并行生长→环形图合拢→橙段强调脉冲+2.3 倍洞察行,信源等级角标 bottom 880 避字幕条)与 5-G 敲门砖墙镜(九篇卡片 3×3 交错飞入→按蓝/橙双色分拣重排为两竖列,呼应 P1 分叉);原 5-F 原文卡重号 5-H(渐黑窗口仍从末 beat 实时推导);3-G Voyager 补 p3-34b/c 金句条翻出(技能=打包保存的自我升级,衬线体橙描边); - 《上线之后,AI 才开始上学》:P6Ending 新增 6-B2 经验编译器闭环复盘镜(五节点环形流水:部署轨迹→编译器三步徽标→青路快闪/紫路慢沉双速差流光→评测安全闸红脉冲→「受控的持久能力」角标)与 6-F 配套清单卡镜(111 计数器滚动+九章名胶囊环绕);新增 6-C 金句四步下划线收束;1-G 三代史补 Gen3 定格放大+四个「可改接口」面板点亮(适应面自进化);4-D 纵向协议升级为检查点卡(圆点→卡片)+四仪表逐个通电(新任务/老任务/归因/代价); - 《会写代码的 AI,开始给自己写代码》:2-B SICA 补成本/时长双仪表随 p2-07b 点亮+数字轻微脉冲;3-F 矩阵补绿色斜线光带扫掠(pathLength 归一化,Table 2 对角规律);4-E 雷达补数值轨迹点+当前展开轴辉光+轴值标注; - 全部遵循 skill-06 四红线:px 居中、角标 bottom≥150、pathLength 归一化不与像素 dasharray 混用、片尾渐黑从末 beat 推导;三集 tsc --noEmit 全通过。 🤖 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> * feat(video): 《AI 如何自己变强?》出题循环图升级流光巡游与游标辉光; - QuestionLoop 活动段补 pathLength 归一化流光虚线(沿线巡游)与动点 drop-shadow 辉光,节点点亮感更强;红线 3 合规(不与像素 dasharray 混用)。 🤖 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> * docs(video): 三集克隆配音说明与知识地图同步; - 三集 README:形态行改「本人音色克隆配音(IndexTTS-2.5,passionate 激情风格)」并注明可切回;复现流水线第 2 步换 indextts 命令(含服务启动指引、样本不入库说明、断点续跑提示);许可节补 bilibili 模型许可与本人自愿克隆声明; - knowledge-map 管线条目同步:Stage ① 含站点信源补充、风格列表加激情、三集升级波与 upgrade-2026-08.md 审计文档链接; - CHANGELOG Unreleased 补三集内容升级条目与 num-beams 提速条目。 🤖 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> * fix(video): 《上线之后,AI 才开始上学》1-G beat 窗口引用笔误修正(p1-26a→p1-26); - 预渲染全量引用校验发现 beatWindow('p1-22','p1-26a') 引用了不存在的句 id(实际新增句为 p1-25a,位于 p1-26 之前),运行时会抛「未找到句 id」阻断渲染;修正为 p1-26(窗口自然覆盖 p1-25a); - 三集组件引用 × narration.json 全量交叉校验通过(缺失均为零)。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* feat(tts): 视频管线新增「激情」配音风格预设与官方站点信源补充规范; - tts.py STYLE_PRESETS 新增 passionate(充满激情与轻快):happy 0.70 主载高唤醒正价 + surprised 0.20 跳跃感 + calm 0.10 锚定咬字,有效和 1.00×0.7=0.70 ≤0.8 上限,语速 0.97 护密集技术句清晰度;--list-styles 与模块 docstring 同步; - VOICE-CLONING.md §4.1 风格表收录 passionate 并置于推荐位,§4.4 补科普长视频风格推荐与数字密集段 df=1.0 微调指引,§五示例命令更新; - skills/01-paper-extraction.md 扩展「官方工程站点信源补充」纪律:只收事实性内容(逐字引用+URL+访问日期)、产出落 paper-notes.md 末尾独立「信源补充」大节与论文正文物理隔离、严禁下载/嵌入站点图片(概念转文字规格供 Remotion 代码动画重建)、站点信源单集专属不跨集、站点与论文冲突以论文为准; - pipeline README Stage ① 描述与 tts.py 脚本表同步;CHANGELOG Unreleased 收录管线条目。 🤖 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> * feat(video): 《会写代码的 AI,开始给自己写代码》论文深读校准与动画升级(v3); - 第二遍全文重读 arXiv:2608.03392 校准:v2 全部断言与原文一致(零事实漂移),重读结论与新增锚点沉淀至 paper-notes.md「2026-08 升级复核」节; - 逐字稿 v2→v3:新增 p2-07b(SICA 选择信号补全:分数+成本+运行时三项一起达标,锚 §4.2 "coding benchmark performance, cost, and runtime")与 p3-25b(Table 2 结构规律点破:时机×证据耦合近似一条斜线),其余 187 句零字节改动; - 分镜同步:2-B 补双仪表动效(成本/时长随句点亮)、3-F 补绿色斜线光带扫掠(对角规律可视化); - 新增 research/upgrade-2026-08.md 审计文档:校准审计表、句级 delta、双重校验 delta(RISKY/REWRITE=0)、G2 验证记录(189 句 rebuild、公共句字节稳定、storyboard 无悬空 id); - 本集无配套官方工程站点(用户确认),不引入站点信源。 🤖 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> * feat(video): 《AI 如何自己变强?》官方站点信源补充与收尾活地图镜(v3); - 论文 PDF 第二遍重读校准(§3/§4/§8/§9 重点页):v2 全部断言与原文一致(零事实漂移),结论与新增锚点沉淀至 paper-notes.md「2026-08 升级复核」节; - 官方工程站点信源补充(selfimproving-agent.github.io,2026-08-18 访问):312 条收录统计(77 FM/176 Scaffolding/59 Evaluation)、living research map 定位、九篇敲门砖清单、I.J.Good 题记佐证——按新规范录入 paper-notes.md 独立「信源补充」大节(与论文正文物理隔离); - 逐字稿 v2→v3:新增 p3-34b/c(Skill=打包保存的一次自我升级,锚 §3.2 "a reusable instance of the self-induced update operator U")与 P5 收尾两镜——p5-22a..22d 活地图(三色计数条 77 蓝/176 橙/59 灰,橙条印证「装备最火」)+ p5-22e/f 敲门砖卡片墙(9 篇双色分拣);其余 220 句零字节改动; - 分镜同步:3-G 扩金句条翻面动效;P5 新增 5-F 活地图镜(计数条生长+环图合拢)、5-G 敲门砖墙镜(交错飞入+双色分拣重排),原文卡重号为 5-H; - 新增 research/upgrade-2026-08.md 审计文档:审计表、句级 delta(8 新句)、双重校验 delta(RISKY/REWRITE=0,站点数字显式标注信源等级与访问日期)、G2 验证记录(228 句 rebuild、公共句字节稳定、storyboard 无悬空 id)。 🤖 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> * feat(video): 《上线之后,AI 才开始上学》经验编译器闭环与三代史升级(v2); - 源论文 88 页复核(§1–2 harness 形式化、§8 SIP-Bench、§10 开放问题):v1 全部断言与论文一致(零事实漂移),关键数字锚点(+16.2pp/16/84/~1,200/>90%/AI-45°)全部维持; - 官方工程站点信源补充(frontisai.github.io/Awesome-Self-Improving-Agents,2026-08-18 访问):trace-to-capability 五段闭环(经验编译器:选证据/提抽象/记出处)、Gen1→3 时间线精确语义、SIP-Bench 四指标问句、111 篇×9 章规模——录入 paper-notes.md 独立「信源补充」大节; - 逐字稿 v1→v2:新增 p1-25a(Gen3「适应面本身可进化」精确语义)、p6-06a..06d(经验编译器闭环复盘:把全片结构升格为一张五段环形图)、p6-13a/b(配套仓库 111 篇×9 章清单卡);其余 172 句零字节改动; - 分镜同步:1-G 补 Gen3 接口面板点亮、4-D 升级三检查点卡+四仪表通电、P6 重排新增 6-B2 闭环复盘镜(青路快闪/紫路慢沉双速差+闸门脉冲)与 6-F 清单卡镜,原文卡重号为 6-G; - 新增 research/upgrade-2026-08.md 审计文档:审计表、句级 delta(7 新句)、双重校验 delta(RISKY/REWRITE=0)、G2 验证记录(179 句 rebuild、公共句字节稳定、storyboard 无悬空 id)。 🤖 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> * feat(tts): IndexTTS 推理新增束搜索宽度旋钮并将管线默认降为 1 束(MPS 长跑提速); - 根因:MPS fp32 实测每句墙钟 RTF 40–58(GPT 束搜索 145–210s + 扩散声码 40–98s / 5s 音频),上游库内部 num_beams=3 使 GPT 段耗时按束宽线性放大,整集 180–230 句需 6–10 小时,三集串行不可行; - tts_server.py:SynthesizeRequest 新增 num_beams 字段(1–5 校验),_infer_sync 透传给 infer()(上游默认 3,采样生成 do_sample=True 下 1 与 3 听感差异可忽略); - tts.py:--num-beams CLI(默认 1,choices 1–5),http_synthesize/synth_indextts 全链路透传,edge-engine 参数忽略提示同步;注意:num_beams 不参与缓存摘要(与文本/风格/样本一样变化才重合成,束宽仅影响推理过程); - VOICE-CLONING.md:§4.3b 新增束宽速度主旋钮说明与实测 RTF 数据(40–58 vs 20–30),§五 每句耗时与整集预估改按实测口径(6–10 小时、nohup 后台+断点续跑建议),修正原「每句 5–30 秒」的失实估计。 🤖 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> * feat(video): 三集 Remotion 场景新增信源镜与动画升级(站点概念代码化重建); - 《AI 如何自己变强?》:P5Ending 新增 5-F 活地图镜(三色计数条 77 蓝/176 橙/59 灰并行生长→环形图合拢→橙段强调脉冲+2.3 倍洞察行,信源等级角标 bottom 880 避字幕条)与 5-G 敲门砖墙镜(九篇卡片 3×3 交错飞入→按蓝/橙双色分拣重排为两竖列,呼应 P1 分叉);原 5-F 原文卡重号 5-H(渐黑窗口仍从末 beat 实时推导);3-G Voyager 补 p3-34b/c 金句条翻出(技能=打包保存的自我升级,衬线体橙描边); - 《上线之后,AI 才开始上学》:P6Ending 新增 6-B2 经验编译器闭环复盘镜(五节点环形流水:部署轨迹→编译器三步徽标→青路快闪/紫路慢沉双速差流光→评测安全闸红脉冲→「受控的持久能力」角标)与 6-F 配套清单卡镜(111 计数器滚动+九章名胶囊环绕);新增 6-C 金句四步下划线收束;1-G 三代史补 Gen3 定格放大+四个「可改接口」面板点亮(适应面自进化);4-D 纵向协议升级为检查点卡(圆点→卡片)+四仪表逐个通电(新任务/老任务/归因/代价); - 《会写代码的 AI,开始给自己写代码》:2-B SICA 补成本/时长双仪表随 p2-07b 点亮+数字轻微脉冲;3-F 矩阵补绿色斜线光带扫掠(pathLength 归一化,Table 2 对角规律);4-E 雷达补数值轨迹点+当前展开轴辉光+轴值标注; - 全部遵循 skill-06 四红线:px 居中、角标 bottom≥150、pathLength 归一化不与像素 dasharray 混用、片尾渐黑从末 beat 推导;三集 tsc --noEmit 全通过。 🤖 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> * feat(video): 《AI 如何自己变强?》出题循环图升级流光巡游与游标辉光; - QuestionLoop 活动段补 pathLength 归一化流光虚线(沿线巡游)与动点 drop-shadow 辉光,节点点亮感更强;红线 3 合规(不与像素 dasharray 混用)。 🤖 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> * docs(video): 三集克隆配音说明与知识地图同步; - 三集 README:形态行改「本人音色克隆配音(IndexTTS-2.5,passionate 激情风格)」并注明可切回;复现流水线第 2 步换 indextts 命令(含服务启动指引、样本不入库说明、断点续跑提示);许可节补 bilibili 模型许可与本人自愿克隆声明; - knowledge-map 管线条目同步:Stage ① 含站点信源补充、风格列表加激情、三集升级波与 upgrade-2026-08.md 审计文档链接; - CHANGELOG Unreleased 补三集内容升级条目与 num-beams 提速条目。 🤖 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> * fix(video): 《上线之后,AI 才开始上学》1-G beat 窗口引用笔误修正(p1-26a→p1-26); - 预渲染全量引用校验发现 beatWindow('p1-22','p1-26a') 引用了不存在的句 id(实际新增句为 p1-25a,位于 p1-26 之前),运行时会抛「未找到句 id」阻断渲染;修正为 p1-26(窗口自然覆盖 p1-25a); - 三集组件引用 × narration.json 全量交叉校验通过(缺失均为零)。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(tts): IndexTTS 缓存摘要纳入 num_beams 且实测 RTF 口径统一; - digest_indextts 补 num_beams 形参并入 SHA1 键:束宽改变合成结果,原先同文本切束宽(如按手册建议单句 --num-beams 3 重合成)会静默命中旧缓存拿回旧束宽音频,违背模块头「参数与文本未变则跳过」幂等契约;默认 1 时省略字段保持历史摘要格式,596 句存量缓存不失效(新旧摘要全等已验证); - VOICE-CLONING.md §4.3b/§五 beams=1 的 RTF 由 20–30 修正为实测 12–14:三集全量连续跑(596 句 / 40.2 分钟纯语音 / 8.5 小时墙钟)按集折算 11.9–14.2,与 CHANGELOG 的 12–15 一致;派生估算同步修正(5 秒句约 1–1.5 分钟、整集约 2.5–3.5 小时)。 🤖 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> * fix(video): 三集升级分支六条评审意见修复(坐标/笔误/死代码); - ep3 3-F 斜线光带终点坐标补入 2 处 10px grid gap(x2 815→835、y2 505→525):原式 250*2.5/170*2.5 漏算列/行间距,终点落在右下单元格左上角附近致光带收点可见偏斜(起点本就正确); - ep1 5-F 活地图清理死代码:环形图改 pathLength 归一化后 const C = 2πR 已无引用,bars 三条目的 deep 字段未被渲染使用,一并删除(三集 tsc --noEmit 全过); - ep2 分镜表 1-G 句区间 p1-22..26a→..26(新增句实为 p1-25a,id p1-26a 不存在,上 commit 89b239e 已修组件同款笔误),upgrade-2026-08.md §四 验证记录同步更正; - ep2 README 版本号 v3→v2:本集升级为 v1→v2,「v3 前」系从另两集(v2→v3)复制串集。 🤖 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>
video-package/ 已被 media/pipeline/ 的 Remotion 工程模式取代,删除全部制作包文件;同时修订 README 中「两种工程模式」对照表,标注 Remotion 为推荐模式并调整脚本清单表格排版。 🤖 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>
* feat(tts): 新增单句声音小样试听脚本,声音克隆手册补齐试听章节 新增 media/pipeline/scripts/tts_sample.py:直调 IndexTTS 服务合成单句小样, 不需要 narration.json 与视频工程。支持 --style 单档 / --all-styles 五风格 A/B / --dry-run 秒级核参 / --play 顺序试听;风格预设、口播文本预处理与 HTTP 契约全部 复用 tts.py(单一事实源),故小样与成片走完全相同的合成路径、听感可直接外推。 产物落 .temp/voice-samples/(已被根 .gitignore 忽略;含本人音色,脚本提示试听后清理)。 前置校验与 tts.py 同口径(样本存在性、情感有效和 ≤0.8、v2.5 语速支持、参数互斥), 避免等到两分钟合成结束才报错。 VOICE-CLONING.md 原 §五「逐集使用」扩写为「小样试听与逐集合成」:5.1 小样试听 (四步操作 + 开关速查 + 实测耗时 + 纯 HTTP curl 直调附录)兑现原文里「小样试听」 的空承诺,5.2 全量合成、5.3 合成后重渲染;§3.2 增补滑窗 RMS/静音占比选段辅助, 并把裁剪示例改为已上线三集成片的同源样本(--start 180 --duration 12,sha1 3ed0d9d60d4b,由音频缓存 sidecar 摘要反查确认);§一 架构图补试听客户端节点, §4.4 指向 5.1。六~九章编号不动,6 处外部 §七/§八 引用保持有效。 实测(2026-08-19 · M3 · MPS fp32 · num_beams=1 · 34 字文本):单档暖机后 6.0–6.9s 音频 / 20–22s 墙钟(RTF 3.2–3.4;首档含暖机 47.0s),五风格 A/B 全跑 2.2 分钟;已注明该口径与 §4.3b 整集折算 RTF≈12–14 不可互推。文档中的 curl recipe 与 RMS 选段片段均逐字执行验证(200 / X-Audio-Format: mp3 / 4xx detail 可 cat 读出), 另跑通七条负例(样本缺失、服务不可达、有效和超界、参数互斥、未知情感键、缺 mutagen)。 🤖 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> * feat(tts): 情感三来源(向量/语调迁移/自然语言)+ 参考样本选段勘探 用户反馈五档预设配音「都有点不自然、不够轻快阳光」。定位到两个根因,均已给出工具: **根因一:样本定基线,而成片在用的那段恰是本人最闷的一档。** 克隆会继承参考样本的 韵律,情感向量只能在基线上微调。对同一位说话人的 4 段录音做 12s 滑窗勘探后实测: 成片所用 me-1@180s 的 F0 中位 142.2 Hz / 起伏 31.2 / 音节率 4.42 / 质心 1698 Hz, 综合分仅排 157/275——换成 me-1@0s 或 me-1@28s,纯克隆(零情感注入)即可让音高 +12~16%、语调起伏 +25~40%、明亮度 +5~15%。新增 `scripts/prospect_ref.py` 把这套 筛选固化为工具(F0 中位/四分位距/音节率/谱质心 + 静音与发声占比扣分,多文件同尺度 排序,输出可直接当 prepare_ref.py 的 --start)。 **根因二:向量注入越多越假,而既有预设都偏重。** 读上游混合式 `emovec = Σ(wᵢ·基向量ᵢ) + (1 − Σwᵢ)·参考音频情感` 可知 Σw 就是「合成情感挤掉本人 真实情感」的比例:现有 passionate/positive 的有效和 0.70/0.665,意味着只剩 30% 是 本人语调。故新增两条更自然的情感通路: - `--emo-ref <另一段录音>`:音色仍取 --ref,语调/情绪整体迁移自这段录音,零向量注入; - `--emo-text "轻快爽朗、自信阳光"`:服务端 QwenEmotion 转向量(需 --use-qwen-emo), 按 ≤0.8 规则等比缩放后使用,并经 X-Emo-Vector 回显供 --emo-vector 固化复现。 服务端对三来源显式互斥报错(上游遇「向量+情感音频」是静默丢弃音频,静默降级更难排查)。 实现要点:`tts_server.py` 新增 emo_ref_path/emo_text 字段、`--use-qwen-emo` 启动开关、 `/health.supports_emo_text`;`tts.py`/`tts_sample.py` 同步 CLI 与前置校验,摘要新增 `|emoref=<sha1>` / `|emotext=<原文>` 可选后缀,`tts_sample.py` 另加 `--label` 便于横向 对比不留覆盖。文档:§四 前置「情感三来源」对照表 + 少注入更自然的机制说明、新增 §3.3 「样本决定基线」实测表、§3.2 改用 prospect_ref.py、§2.3/§2.4/§七 补 --use-qwen-emo 与权重缺失兜底、§六 摘要公式补可选后缀。 验证:①存量缓存零失效——对已上线三集 189 句逐句重算摘要,100% 与 sidecar 一致; ②生产路径 E2E——单句 mini 工程跑通 `tts.py --emo-ref`(manifest durationSec 5.666、 sidecar 生成、同参数重跑 0.24s 命中缓存、换情感样本/去掉情感源摘要均改变); ③新增负例 4 条全部给出可操作报错(三来源互斥/与 --all-styles 互斥/情感音频不存在/ 服务未加载 Qwen);④X-Emo-Vector 回显实测(「轻快、爽朗、自信、阳光」→ happy 0.76/surprised 0.016/calm 0.024,恰好被压到 Σ=0.8 上限);⑤本轮共产出 24 个 候选小样(5 样本 × 5 档低注入向量 + 4 档语调迁移 + 3 档自然语言 + 2 档固化后减弱), 客观指标已逐个测量待用户听选。 🤖 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> * feat(tts): 新增 sunny 明快阳光风格预设并取代 passionate 成为科普推荐位 用户在 29 个候选小样中选定「Qwen 选方向 + 人工压强度」那一档,本次将其固化为 `STYLE_PRESETS["sunny"]`(happy 0.95 / surprised 0.02 / calm 0.03,alpha 0.35, df 0.95),并把配套样本固化为 `voices/me-bright.wav`(me-1.mp3 --start 0.36 --duration 12,sha1 54b699cce97f)——`--style sunny --ref me-bright.wav` 与用户 听中的那次调用参数逐项一致(已用 --dry-run 核对)。 为何是 0.35 而非 Qwen 原始强度:Qwen 对「轻快、爽朗、自信、阳光」推出的向量会顶到 Σ=0.8 上限,实测把克隆音高推到 199–223 Hz,而该说话人自然区间仅 142–163 Hz,听感 「像另一个人在用力」。保留方向、把强度压到 0.35(留 65% 给本人真实语调)后即为 sunny。 这条「Qwen 选方向 → 人工压强度 → 固化预设」定式已写进手册 §4.1/§4.4。 文档同步:§4.1 预设表新增 sunny 行并补「有效注入」列(一眼看出各档挤掉多少真实语调) + 来历说明;§4.4 调参建议重写为四步定式(先定样本 → 再定方向 → 最后压强度 → 微调语速) 并给出 0.3–0.45 自然平衡带的实测依据,推荐位由 passionate 改为 sunny;§5.1/§5.2 示例 全部改用 me-bright.wav + sunny,步骤 1 改为推荐档裁剪命令;voices/README.md 补选段勘探 与小样试听两步、点明「样本决定基线」;CHANGELOG 与知识索引同步本轮能力。 🤖 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> * feat(tts): 新增 sunny-steady 明快稳健预设,束宽提升为风格的一部分 用户选定第四轮的 79 档(= sunny 同参数 + 束宽 3)。束宽此前只是命令行开关、不在 STYLE_PRESETS 里,`--style` 选了也不会生效,故本次把它变成预设的一等公民: - `STYLE_PRESETS` 支持可选键 `beams`(缺省 1);新增 `sunny-steady`(明快稳健)= sunny 的向量/alpha/语速 + `beams: 3`; - `resolve_style()` 返回值扩展为 5 元组并统一"命令行显式优先、否则取预设"的解析口径; `--num-beams` 的 argparse 默认值由 `1` 改为 `None`——否则无法区分「没给」与「给了 1」, 预设束宽会被永久压掉;两个客户端(tts.py / tts_sample.py)同步按 job 传束宽; - `--list-styles` 增列「有效注入」与「束宽」,一眼看出每档挤掉多少真实语调、跑多慢。 为何值得单独成档:同文本同样本实测,束宽 1→3 把语调起伏从 48.4 收到 40–44(更稳、 更「令人信服」),而亮度基本不掉(谱质心 1245 → 1214–1223)——是目前唯一不牺牲明快度 就能让语气更可信的旋钮。代价是 GPT 段耗时按束宽放大:单句墙钟 20–35 秒 → 56–131 秒, 整集 2.5–3.5 小时 → 8–10 小时。故定位为「日常/批量用 sunny,成片定稿用 sunny-steady」, 手册 §4.1/§4.3b/§4.4/§5.1/§5.2 均已按此口径改写并标注排期差异。 验证:①`--dry-run` 四例——sunny-steady 解析出 beams=3、sunny 仍为 1、显式 `--num-beams 1` 能压过预设的 3、`--all-styles` 七档各带自己的束宽;②实机跑通 `--style sunny-steady` (墙钟 131.1s / RTF 25.4,客观指标与用户选中的 79 档一致:F0 175.0、起伏 40.3、质心 1214); ③摘要回归——已上线三集 189 句仍 100% 与 sidecar 一致(束宽默认值改动零影响),且 sunny 与 sunny-steady 摘要不同(换档会全量重合成,符合预期);④edge 引擎误传 `--num-beams` 仍正确提示忽略。 🤖 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> * feat(tts): 混合档 --steady + 排期预演 --plan,整集只让关键句升束宽 3 束(sunny-steady)韵律更稳但整集要 9.9 小时,而真正决定第一印象的只是冷开场与各幕 金句。新增两个开关把「稳」买在关键处: - `--steady 'P0,p3-25b,p5-*'`:命中句改用高束宽(`--steady-beams`,默认 3),其余仍按 风格束宽。选择器规则可预测无歧义——以 `*` 结尾为前缀通配、含 `-` 为句 id、其余为幕名, 大小写不敏感;**任一项匹配不到句子立即报错**(拼错幕名/句 id 后静默按低束宽跑完 3 小时 是最难发现的失败模式)。缓存 sidecar 按句独立(摘要含 |beams=N),故同集混用两种束宽 安全,也支持先全集跑 sunny、事后只补跑 --steady 命中的那几句。 - `--plan`:纯本地算摘要并与 sidecar 比对,打印各束宽的待合成/已缓存句数与估算墙钟后退出, 不连服务。长跑前必经一步——改几行稿子后往往只有那几句 miss,不必按整集排期。 估时口径修正:初版 --plan 用「单句空闲机器」RTF(1 束 6.5)会低估近一半,改为**长跑折算 口径**并提为模块常量 RTF_1BEAM=13(三集 596 句 8.5 h / 40.2 min 语音实测)、 RTF_MULTIBEAM=45(同句 1↔3 束 A/B 实测约 3.2 倍,与早前 3 束直测 RTF 40–58 吻合)、 AVG_SEC_PER_LINE=4.2。校准后 189 句一集估 2.9 h,与三集真实用时 2.5–3.5 h 一致。 同时修正三处已失实的注释/文档口径:束宽 3 的整集倍数由「×3」改为「×3.4」;§4.3b 补入 本轮实测「短句最贵、数字句更贵」(4–6 s 短句 3 束 RTF 19.6–31.5 / 1 束 6.0–7.4,而 13–15 s 长句 3 束仅 8.9–13.8;数字密集句 5.87 s 音频烧 185 s,因数字被归一展开、token 暴涨) ——逐字稿为字幕可读性都拆到 ≤43 字,正好落在最贵区间。手册新增 §5.2.1 混合档(选择器语法 表 + 四方案代价对照表),§5.2 把 --plan 写成长跑前必经步骤。 验证:①选择器 7 例——幕名/句 id/前缀通配/大小写混用均正确命中,句 id 与幕名拼错各自报错, `--steady-beams` 不高于基础束宽时报错;②E2E 双句工程实跑,逐句 sidecar 反查束宽(P0→3、 P1→1)全部命中期望,重跑 0.19 s 全缓存,--plan 缓存计数正确;③摘要回归——三集 596 句 逐句重算 100% 与 sidecar 一致(束宽传参链路改动零影响)。 🤖 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> * fix(tts): 修复小样/管线四处静默降级——edge 分支 --plan 硬失败、情感来源互斥对齐 评审发现四处「参数被静默丢弃」,均会让用户以为跑了 A 实际跑了 B: 1. `tts.py` edge 分支未处理 `--plan`/`--steady`/`--steady-beams`。`--engine` 缺省是 edge,漏写 `--engine indextts` 时 `--plan` 会跳过计划模式直接走 `synth_edge` 全量合成;两引擎摘要必然不同且 `{id}.mp3` 是单槽位,会把整集 已合成的克隆音频逐句改写成 edge 预置音色。`--plan` 语义是「只看不跑」,故 改为直接 `parser.error`;`--steady`/`--steady-beams` 按既有约定进「已忽略」提示表。 2. `tts_sample.py` 的 `--style` 互斥只查 `--emo-vector`,漏了同批新增的 `--emo-ref`/`--emo-text`:`--style sunny --emo-text "..."` 会静默丢弃 sunny (连带丢掉预设的 alpha 0.35 与 df 0.95),而 `tts.py` 对同组合是硬报错。 试听工具的用途正是判定「哪档风格合适」,静默换档直接误导选档结论。 3. `--all-styles` 的手动覆盖拦截表漏了 `--num-beams`,`build_jobs()` 又把它硬写为 None,`--all-styles --num-beams 1` 被静默忽略。统一压成 1 会让 sunny 与 sunny-steady 产出完全相同的音频(两档只差束宽),A/B 失去意义,故与 alpha/语速同口径拒绝。 4. 「下一步全量合成」回显命令在 `--emo-ref`/`--emo-text` 模式下打印 `--style emoref`,而 `tts.py --style` 的 choices 无此取值,照抄必然 argparse 报错、真正生效的开关也丢失。改为回显各自开关,并把显式给的 alpha/语速/束宽一并带上,避免全量合成时悄悄退回预设值。 验证:edge+--plan 硬报错、edge+--steady 进提示表、indextts+--plan/--steady 功能不变 (189 句中 19 句升档);三组 `--style X + 情感来源` 均报错而合法单用仍通过; `--all-styles --num-beams` 报错、单用仍 7 档末档 3 束、非 all-styles 时显式束宽仍 压过预设;`--emo-ref` 实跑小样回显的命令原样喂回 `tts.py` 可正常解析执行。 已上线三集 596 句摘要逐句比对零变化(存量缓存零失效),ruff check 通过。 🤖 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> * docs(voice-cloning): 校准 --all-styles 档数与耗时口径,同步互斥约束 `--all-styles` 遍历 `STYLE_PRESETS` 全表,加入 sunny/sunny-steady 后实际是 7 档, 而 §5.1 仍写旧的 6 档且顺序不符;「耗时实测」表的「五风格 A/B 全跑 2.2 分钟」 同步失真——该表标注 num_beams=1,而 sunny-steady 自带束宽 3。 - §5.1 步骤 4 改为按 `STYLE_PRESETS` 顺序列出 7 档(neutral→…→sunny-steady); - 耗时表以本次实测替换失真行:全 7 档 A/B 合计音频 46.2s / 墙钟 6.3 分钟;条件 标注下沉到行内(前两行机器空闲、A/B 行机器有其它负载),不再由表头统一声称空闲; - 并入「口径提醒」:该次 A/B 单档墙钟散布 37.7–86.6 秒(最慢者为该服务会话内首次 用该样本的那档),其中 3 束的 sunny-steady 只用 38.6 秒、并未比 1 束档更慢——单句 墙钟受机器负载支配,不足以据单次样本推断束宽代价,整集排期一律以 §4.3b 长跑折算 口径为准(避免与 §4.1 的 56–131 秒区间互相拆台); - 开关表同步 fix 提交的约束:`--all-styles` 与 `--emo-vector`/`--emo-alpha`/ `--duration-factor`/`--num-beams` 互斥(否则 sunny 与 sunny-steady 会产出完全 相同的音频),`--dry-run` 打印项补「束宽」; - CHANGELOG 的「`--all-styles` 五档 A/B」改为「全预设 A/B」,不再随预设增减失真。 🤖 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> * fix(tts): 小样 --text-file 读到空内容时硬失败,堵住最后一处静默降级; `--text-file` 指向空文件或纯空白文件时,`args.text` 被 strip 成空串, 随后 `(args.text or DEFAULT_TEXT)` 把它当作「没给文本」而静默替换为内置 默认句;紧随其后的 `if not args.text: parser.error("试听文本为空")` 对该 路径已成死代码。用户以为在听自己指定的文本、实则听到的是内置那句,并据此 选定风格与样本——与本分支其余各处(edge 分支 --plan 硬失败、--steady 未 命中即报错、--all-styles 与覆盖参数互斥)一致对抗静默降级的取向相悖。 改为读取后立即校验:空内容直接 parser.error 并回显文件路径。fallback 语义 收窄为「两个文本开关都没给」,`--text` 与 `--text-file` 行为就此对称。 实测七例:空文件/纯空白文件报错、正常文件生效、不给文本仍回退内置默认、 `--text ' '` 与文件不存在两条既有错误路径不变、`--all-styles` 无回归。 🤖 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>
* fix(media-pipeline): TTS 引擎静默降级双层护栏与脚本健壮性修复;
- tts.py 漏写 --engine indextts 时,克隆专属带值参数(--ref/--style/--num-beams 等)
由 stderr 提示升级为硬失败:{id}.mp3 单槽位下照跑会把整集克隆音频静默改写为
edge 预置音色(此前仅 --plan 路径硬化,合成路径漏了)
- 新增 .engine 音色签名标记:记录上次成功合成的引擎/音色/风格,不一致时硬失败并
要求显式 --allow-voice-switch(检查前置于 --plan,排期阶段即拦截误重录;不参与
逐句摘要,零缓存影响)
- IndexTTS 服务启动命令三处副本收口为 server_launch_hint(),消灭 <仓库路径> 占位符
- build_narration.py 报错口径对齐 tts.py:缺文件给可操作退出;句出现在分幕标题
之前/重复 id/前缀不符均带文件行号与修复指引
- tts_sample.py 新增 --cleanup:试听结束自动删除产物目录(小样含本人音色,属生物
特征信息,此前仅打印 rm 提示靠手工执行)
🤖 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>
* feat(media-pipeline): 新增论文抽取取证工具 paper_extract.py;
Stage ① 精读提取此前完全没有工具,每轮校准都临场手写一次性 pymupdf 片段。固化为
五个子命令:map(§→页码映射)/ text(按页取正文,默认双栏分列避免 LaTeX 两栏行
交错)/ captions(图表 caption 收割)/ find(逐条断言定点搜索,未命中退出码 1——
「论文全文无此措辞」本身即取证结果,如编造数字的排除证明)/ render(页面光栅化
看图,无需 poppler/ffmpeg)。
依赖仅 pymupdf,uv run --no-project --with pymupdf 零工程调用。
🤖 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>
* docs(media-pipeline): 清理 video-package 已废弃模式的四处死链;
commit f7d7281 删除 video-package/ 时漏改引用:pipeline/README.md 首行轻量替代
链接、「七、工程模式」双模式对照表两处、knowledge-map.md:73 整条制作包 bullet。
对照表收敛为一句「本仓统一采用 Remotion 工程模式」;「首个完整范例」消歧为建成
时间口径(与系列发布顺序是两条轴,发布顺序另见 series.json——该 SSOT 随后续提交
落地,链接先行指向目标位置)。
🤖 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>
* feat(media-pipeline): 时序常数 SSOT、分集声明式配置与系列顺序清单;
- 时序常数单一事实源:每集 video/src/timing.json(timing.ts 经 resolveJsonModule
同步 import;Python 侧新增 timeline.py 直读同一文件)。qa_frames.py 删除手抄
镜像常量——两语言漂移从此结构性不可能,对拍验证新旧实现逐帧相等
- timing.ts 头部改为读 JSON 并导出 SCENE_FADE_FRAMES(幕间呼吸淡入淡出预留),
三集逐字节一致(md5 唯一),computeTimeline 函数体零改动
- 新增每集 pipeline.toml(episode/narration/tts/render):可执行参数不再散落
README 复制粘贴(治 ISSUE-161 类漂移);EP2/EP3 记录复现已上线音频的档,
EP1 记录 sunny-steady + me-bright 重录决策
- tts.py 新增 --expect-ref-sha1 指纹硬校验;新增 refs.py + voices/refs.toml
(只存哈希与生成参数,不存音频,.gitignore 白名单例外放行)——操作者可自证
复现了同一音色,防「样本换了静默重录整集」
- 新增 media/series.json + series.md:三集发布顺序机读 SSOT(EP1 经验时代 →
EP2 自我变强 → EP3 代码田野)与「序号不进口播」系列纪律的载体
🤖 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>
* feat(media-pipeline): 内容门/系列校验/字幕导出/自动视觉 QA 与 43 项测试;
- check_script.py(④⑤门):分镜 beat 覆盖性(缺句 FAIL、重叠 WARN 且「尾」
标注静默)、时长预算双口径(字数估算 + manifest 实测对 pipeline.toml 目标窗)、
SceneFade 淡入不变式、--check-scenes 分镜↔场景代码互比——当场抓出 EP1 的
0-D/0-E 区间漂移与 EP2 分镜 7 句失覆盖
- check_series.py:media/series.json 五条规则的机械化执法(口播反串线含自身
标题排除、多标题按文本首现位置判序、序号↔标题绑定、清单完整性、相对链接
死链);当前报红与既有清单完全一致。自身标题假阳性(p1-25a 命中本集片名)
正是必须有机读清单的证明,纯 grep 做不到
- captions.py:manifest + timing.json 导出 srt/vtt;cue 终点不含句间停顿
(外挂字幕静默期不留字,与烧录字幕有意分歧并注明)
- qa_frames.py 扩展:--last-n 末 N 句抽样(尾幕渐黑缺陷的盲区)、--check
四项自动体检(黑帧/字幕带侵入[连通亮段法]/冻帧[均值哈希]/字幕缺失,
惰性依赖 pillow+numpy)、--check-theme WCAG 对比度(三集实测全 ≥6.2:1)
- pipeline.py 单入口:status(派生式新鲜度,零状态文件)/doctor/build/check/
tts/captions/render/qa/all/clean-samples,参数自 pipeline.toml 装配
- tests/ 43 项全绿 2.3s:digest 黄金哈希(缓存零失效守门人)、timeline 黄金
帧号、build_narration 校验分支、引擎护栏、内容门各判定、系列五规则、
字幕格式、QA 判据——无网络无 TTS 无 DB
- pre-commit ruff 扩到 ^media/pipeline/(既有 8 处 lint 顺手修复)
🤖 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>
* feat(video): 系列发布顺序调整——经验时代改首集,口播去集数序号;
发布顺序改为《上线之后,AI 才开始上学》→《AI 如何自己变强?》→《会写代码的
AI,开始给自己写代码》(media/series.json 为准)。
- EP3 口播去序号化:p6-09/p6-10 改为「前两集讲的是通用的道理:经验怎么攒,
自己该改哪儿」——不点他集标题、「前两集」从终集视角恒真,改序仍成立。由此
确立系列纪律:集数序号只存在于视觉层与 series.json,发布顺序变更的 TTS
代价恒为零(narration.json 恰好 2 行文本变更,其余 187 句字节不变)
- EP3 像素层:SeriesThree 数组按新顺序重排(金青紫→蓝橙→绿洋红),本集高亮
由位置耦合 i===2 改为数据驱动 self 标志(index 0/1 补 self:false 防 TS2339);
拼图串同步为「怎么攒 → 改什么 → 代码领域全图」;死代码 useCurrentFrame 删除
- EP1 文档层去互引:README/planning/paper-notes 改为「三集系列第 1 集,独立
成片」;EP3 与共享管线文档同步(README:6、paper-notes:8、planning 三处、
storyboard 6-C 色带顺序)
- 共享文档去顺序耦合:「首集/上一集」→「任一既有集」;skills/06 色板注册表
按 slug 具名并补上此前漏登记的 EP3 绿 #4ADE80/洋红 #FF6EC7;CHANGELOG ep
标签改 slug 并按新序重排;knowledge-map 三作品重排 + series.json 指针
- 修复 3 处真实死链:三集 README 的 ../../pipeline/VOICE-CLONING.md 实际解析
到仓库根(正确为 ../pipeline);skills/03 模板占位链接改代码文本
- check_series 修正两处误判路径:文件路径须按路径段匹配自集(in f.parts 对
含斜杠相对串恒 False);「前两集」入白名单(终集视角相对表述)
- EP2(self-improving)工程零改动,保持本轮最强非回归锚点;其 7 句分镜失覆盖
为独立既存漂移,另行单独提交
🤖 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>
* docs(video): 修复两集分镜表相对场景代码的既存漂移(check_script 门全绿);
2026-08 升级改了口播与场景代码,分镜表未跟进——check_script --check-scenes
新门禁当场抓出(此为其存在理由的首个实证):
- EP1(experience-era):0-D 区间 p0-11..13 → p0-11..12(代码如此,0-E 独立绑
p0-13);P2 镜号字母整体错位一个(分镜 2-E,2-G..2-J vs 代码 2-E,2-F..2-I),
致 qa_frames 镜号交叉核对对 P2 完全失真
- EP2(self-improving):7 句失覆盖(p1-04b/04c、p2-37b、p3-05b、p3-24b/24c、
p3-62b)——分镜区间未随 v3 插句扩展;2-B/2-D/2-H 三镜在代码中已拆为子镜,
分镜按实现拆行(2-B×4、2-D×2、2-H×3)并同步区间
- narration.json 三集零改动(分镜-only);EP2 项目文件仅动 storyboard.md,
与上一提交的非回归锚点意图一致并分开记账
剩余 1 项 WARN(P5Ending 的 p5-04..04a 闪光窗)为组件内嵌实现细节而非独立
镜位,WARN-only 可接受。
🤖 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>
* feat(video): Remotion 最佳实践落地三集冻结文件(@remotion/media/fitText/SceneFade/渲染硬化);
- NarrationAudio 迁移 @remotion/media 的 <Audio>(官方 recommended,Mediabunny
抽轨保时间轴同步):丢掉外层 <Sequence>——premountFor 挂在未开始的 Sequence
子节点上不会触发;premount 仅优化 Studio/Player 预览(渲染期自动关闭),
该事实写入组件注释防后人重复论证
- Subtitle 手写 CJK 宽度估算(正则+0.55 半宽系数+魔法阈值 1500)替换为
fitText 真实测量;withinWidth 扣 padding(box-sizing: border-box)、fontWeight
与渲染一致;validateFontIsLoaded 保持 4.x 默认 false 并注明 5.0 定时炸弹
- 新增 SceneFade 幕间呼吸淡入淡出(三集冻结):只花幕间既有静默,from/总时长
零改动——不用 TransitionSeries 的原因(Σ序列−Σ转场与绝对定位音频层根本
不兼容)写入组件注释;首幕不淡入、末幕不淡出(防双重渐黑);不变式
2×fade ≤ 幕间静默 由 check_script.py 强制
- Main.tsx 三集同构接入 SceneFade(registry 部分保持各集独立)
- remotion.config.ts 交付硬化(h264/crf18/yuv420p/aac 192K/enforceAudioTrack/
jpeg90);显式不设 setConcurrency(机器属性,benchmark 后走 CLI)
- 新增 @remotion/{media,layout-utils,paths}@4.0.512 钉版;根 lockfile 零变更;
EP2/EP3 同步冻结文件但不重渲(下次重渲生效,series.json 已标注)
- EP1 新增 design/motion.ts(ci/rnd/stagger——帧驱动铁律的范式封装)与
components/primitives.tsx(CornerLabel 把「角标底部≥150px」默认值化、Panel/
AxisBar/Meter/RingFlow 三调用点提取)
🤖 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>
* feat(video): EP1 v3 新动画组件与论文笔记取证更正(内容文本定稿前的视觉落地);
- P6Ending:SeriesEcho 整体替换为 VerificationBedrock(6-E 共同的地基·验证)——
九个开放问题小面板(反枚举:不配九色)压在金色基石「验证」上,末句左侧青色
能力曲线陡升而基石厚度只微增 6px,即 "scales least well" 的画面;本集代码中
引用他集色板(#4A9EFF/#FF9F45)的唯一位置随之清除,金青紫契约恢复纯一
- ThreeCurves(6-F2 预置):三条候选轨迹全金色、以线型区分(实线/虚线/点线),
衬线问号收尾;§10 "not known to compound, saturate, or oscillate" 的悬念画面
- RepoCard 三处修正:计数 111→331(数据文件口径)+ 真实九章(引言/工位/技能/
记忆/环境/参数/元进化/评测/安全——原「工具」「定义」非章)+ 取数日期行
- EnvFloors 并入三条天花板轴(Fig 6 三轴:能动的花样/反馈的密度/任务的长度,
依次生长且停在天花板前——差距即要点);尾注句改 §5.4 口径(去「大部分」)
- PromotionGate(2-J 预置):§10.2 缺失晋升判准的画面——空白铭牌红问号脉冲、
按下后紫侧点亮、闸下单向红箭头「很难逆转」
- 1-G 三代时间轴补 Figure 3 的 11 个带日期里程碑(WebGPT 21-12 → Cursor 3
26-04)与「约四年半」跨度标(画面级增强,不动口播)
- paper-notes.md:111→331 全链取证(index.html 占位 vs app.js 水合 vs
data/papers.json 331/330 + DEV_LOG 旁证)、真实九章与唯一论文数、8 图逐字
caption 规格表、SkillsBench「引用冲突」裁决(Han=SWE-Skills-Bench、
Li=SkillsBench 两基准双引非笔误——更正 v1 笔记误读)、v3 校准方法记录
🤖 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>
* feat(video): 4-D 补 SIP-Bench 三分带(Figure 9 唯一被 v2 漏掉的协议元素);
T0→T1→T2 时间轴下加 replay / adapt / held-out 三题区分带——replay 对应已有
「留着旧题反复重考」Pill,held-out 是 §8.3 明言的核心检验("makes held-out
generalization the central SI test"),也是 p4-06「没见过的题」伏笔的回收。
🤖 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>
* feat(media-pipeline): 补齐 Stage ⑥⑧⑨ 技能规格并挂载路由型真 Skill;
- skills/07-tts-voice.md:五闸决策树(样本就位→指纹一致→试听定档→排期对账→
音色签名护栏)+ 两遍法操作契约;参数与实测数据一律链引 VOICE-CLONING.md 不复制
- skills/08-render-qa.md:抽帧三选择器(幕/句/末 N 句)+ 五项自动判据处置表 +
人工目检残余清单 + 修复回路(七条渲染红线仍以 06 为 SSOT)
- skills/09-final-render.md:benchmark→--concurrency 的机器属性处理、交付件清单
(mp4/srt/vtt/封面帧)、渲染主机字体约束与两个重启触发器、平台合规自查
- .agent/skills/science-video-pipeline/SKILL.md:路由壳(frontmatter + 九阶段
速查表 + 关键不变量),零正文复制——内容 SSOT 留在 media/pipeline/skills/,
满足 AGENTS.md「引用用轻量指针而非数据副本」;不升 01–09 为独立 Skill(9 个
雷同 description 代理无法择一)、不做 DB 双家(视频生产人在环+本地 GPU 服务,
引擎无法派发)
🤖 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>
* docs(media-pipeline): README 阶段契约表与新工具索引;skills 06/03 契约修订;
- README 三节重写:pipeline.py 单入口 + Stage 契约表(幂等/续跑列);脚本表补
timeline/check_script/check_series/captions/qa_frames 扩展/paper_extract/refs
七行;五节改为 timing.json SSOT 表述并删除已失效的「须同步 qa_frames.py 镜像
常量」散文警告(结构性不可能后,警告本身就是错误信息);渲染主机字体约束入文
- skills/06 冻结清单拆两档:A 档逐字节冻结(新增 NarrationAudio/Subtitle/SceneFade
成员)+ B 档 timing.json(默认相同、允许本集覆写);新增四条事实条(premount
渲染期关闭 / TransitionSeries 不可用的根因 / 字体可复现性与两个重启触发器 /
@remotion/paths 是 pathLength 互斥红线的官方正解)
- skills/03 增系列纪律永久条:口播严禁他集标题与序号,顺序只在视觉层与
series.json——发布顺序变更的 TTS 代价恒为零
🤖 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>
* docs(issue): 首批视频管线三条经验条目(ISSUE-161/162/163);
- ISSUE-161 配置漂移:可执行参数散落 README 复制粘贴,推荐位迁移后旧命令合法
但会作废整集声纹缓存——根因是无分集声明式配置;防范:可执行参数不落散文
- ISSUE-162 未水合占位数字进口播(111 vs 331):静态抓取的统计数字一律视为
占位符直至与数据文件互证;连带记录引用年≠事件年、trials≠场景两个口径教训
- ISSUE-163 引擎静默降级:破坏性默认值必须硬失败而非提示;硬化要横向扫全部
入口(plan/合成/编排三层当时只改了一层)
🤖 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>
* docs(media): knowledge-map 巨型条目拆分与三集 README 命令块收敛;
- knowledge-map 视频条目拆三条:Pipeline 公共基建(单入口/配置/时序 SSOT/skills
01–09/路由 Skill/43 项测试/七件工具)、三集作品(新发布顺序 + 系列纪律)、
IndexTTS 声音克隆手册——登记本轮新增全部基建
- 三集 README 复现命令块收敛为 pipeline.py tts 一行(参数读 pipeline.toml),
目录表补 pipeline.toml 行——ISSUE-161 防范项的落地:可执行参数不再落散文
🤖 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>
* docs(changelog): 登记本轮管线基建、顺序 SSOT、Remotion 落地与死链/分镜修复;
🤖 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>
* ci(pre-commit): 挂载科普视频系列一致性校验钩子(series.json 执法);
五规则:口播反串线(自身标题排除——纯 grep 因 EP1 片名自含「上线之后」必假阳,
清单是唯一解法)/多标题顺序(按文本首现位置)/序号↔标题绑定/清单完整性/相对
链接死链。挂载最后落地(此前会挡住修复自身的提交);文件范围 media/ +
knowledge-map + CHANGELOG。
🤖 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>
* docs(video): EP1 planning 时间表按实测重排并清除过时 edge-tts 表述;
全片实测 12.8–13.6 分(原表按 17 分钟排到 15:30–17:00);形态行改 sunny-steady
成片档;生产管线图与许可行同步克隆口径。
🤖 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>
* docs(video): 建立 v3 升级审计文档骨架(句级 delta 随校准结果填写);
新文件而非续写 v2——审计记录不可变原则;v2 的 111 条目是 ISSUE-162 的物证。
🤖 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>
* feat(video): EP1 v3 第一批句级 delta(A3/A6 校准结论)与 5-D2 对齐漂移镜;
- p2-32a 新增(Fig 6 三轴:能动的花样/反馈的密度/任务的长度——A3 判定「无第四轴,
三轴才是正典」);p2-37 改写为 §5.4 忠实口径(去「大部分」总体断言,A3 复核
「就算」缓冲对齐论文条件语气)
- p5-09 去「2026 年」(正文无事件纪年,引用年≠事件年);p5-15 每次→随时可能、
p5-16 永久→长期(原文 can/persist 非全称);p5-18 场景→轮次(单位 trials);
p5-22 就四味→反复用到(防御清单更长);p5-27 加「有研究者提出」(AI-45° 为
roadmap 提议非公认定律)
- p5-21a/b 新增:9.2.3 工具链组合攻击(论文四类直接威胁此前只讲 3/4——A6 判定
省略会让 21b 的「串起来」变错误归因)+ 四招汇入「对齐漂移」统摄透镜
- 5-D2 对齐漂移镜:工具链拼图(各件✓、拼线出意外路径)→ 罗盘汇聚 + 轮廓渐虚
- 182 句 3710 字 13.2 分,内容门零 FAIL 零 WARN(预算窗内)
🤖 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>
* feat(video): EP1 v3 第二批句级 delta(A5/A2 校准结论);
- p4-10 对比轴修正:技能与记忆同属 external-path,论文真区分的是外围装备 vs
模型参数(A5 判定为本次 P4 最重要发现)
- p4-15 归属降强:SIP-Bench 是被引外部工作([Wang, 2026]),「提出了」→「点名了」
- p4-18a 新增:replay/adapt/held-out 三分带的口播(A5 评估补句价值高——held-out
是 §8.3 明言的核心检验,且回收 p4-06「没见过的题」伏笔)
- p2-15 数字原样化 16→16.2 个百分点(skills/03 论文数字不取整原则;A2 判定
SkillsBench 数字全部正确、引用「冲突」系两基准双引的误读)
- 183 句 3757 字 13.4 分,内容门零 FAIL
🤖 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>
* feat(video): EP1 v3 第三批 delta——P0/P1 必改与 P3 二维地图口径(A4 核心发现);
- p0-01/02 归属修正(Sutton 属 U. Alberta/Amii;essay 是 DeepMind 出品)——已独立
取证(References p77 逐字)
- p1-10 编造倍数移除(全文无任何倍数,find 零命中;「便宜得多,也频繁得多」)
- p1-17/18 改选择性表述(论文 "or … enough" 非四道强制工序)
- P3 二维口径(A4:regime 是行×列分组,1↔2 分界是「改什么」非「谁控制」):
p3-03 改「论文画的是一张二维地图:横轴问进化的到底是什么,纵轴问谁来控制」,
p3-04 补「两根轴一交叉,正好落出三级台阶」
- 3-A 视觉:Figure 8 二维格阵 underlay(对角两空格 + 轴标签点亮)让位解析为
三级阶梯——先见地图后见台阶,8:00 处不产生理解断崖
🤖 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>
* feat(video): EP1 v3 第四批 delta——P6 收尾整体改写(首集定位 + 论文收束论点);
- p6-08「三块拼图」→「九个开放问题挑三块」(§10 实有 10.1–10.9,编辑取舍
不该说成论文的)
- p6-11..13 跨集引用整体改写为 §10 耦合论点「共同的地基·验证」(Verification
underlies each, and it is the capacity that scales least well as agents become
more capable.)——本集作为第一集的收尾回到论文自身的终点,并一次回收 P1
提纯漏斗的「验证」、整个 P4、6-B2 的「闸门」三个前文 beat
- p6-13a/b 站点数字更正落地(三百多篇 + 真实九章);p6-13c/d 新增三条曲线
悬念(not known to compound, saturate, or oscillate)让「推荐读原文」有因果
动机
- 6-F2 ThreeCurves 接线(p6-13c..13d);分镜 6-E/6-F/6-F2 三行同步
- v2→v3 总账:185 句(+6 新增),改写 23 句、其余 156 句字节不变;13.7 分在
预算窗;内容门零 FAIL 零 WARN、系列一致性零 FAIL(p6-12 顺序词消除——
check_series 全绿,pre-commit 钩子恢复生效)
🤖 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>
* feat(video): EP1 v3 第五批 delta——p2-47a/b 晋升判准缺失(A4 判定本轮最高价值新增);
§10.2 逐字锚点 "With no promotion criterion, the decision of what to write to
the weights rests on manual judgment.":P1+P2 花大量篇幅建立快/慢双路,这两句
揭示两路之间的开关没有判准、很难逆转、全靠工程师拍板——落在 p2-47 观众被
铺垫到位处。2-J PromotionGate 接线(工位五锁/空白铭牌/单向箭头)。187 句
3883 字 13.9 分,内容门零 FAIL 零 WARN。
🤖 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>
* docs(video): v3 审计文档句级 delta 表填全(25 改写 + 8 新增,其余 154 句字节不变);
🤖 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>
* chore(media): series.json EP1 状态更新——内容侧定稿,配音进行中;
🤖 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>
* fix(video): 清理 A7 复盘发现的 111 残留(JSDoc)并为 v2 审计加勘误指针;
P6Ending 6-F JSDoc 计数描述更新;upgrade-2026-08.md 顶部加勘误导航(物证保留
不改,指针指向 v3 文档与 paper-notes 取证)。
🤖 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>
* fix(video): A7 复盘微调——p6-13b「参数」→「大脑」、p6-13c 去「最后」;
「参数」在全片口播中从未出现(只在角标),而 p6-06c 数句前刚说「慢的去路改
大脑」——章名胶囊用「大脑」与本集比喻系统(工位↔大脑两个更新面)严格对称,
听众零成本对上第四去处(A7 建议,二选一中采纳)。RepoCard chapters 与分镜
三处同步;p6-13c 改「收尾留个悬念」避免与 p6-01 同幕双「最后」。
🤖 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>
* fix(video): p3-01「都通了」→「都看完了」(与 p2-46 证据稀少的微张力,A4 建议);
🤖 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>
* docs(video): EP1 README 形态行同步 v3 配音决策(sunny-steady 成片档);
🤖 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>
* docs(media-pipeline): 回写 sunny-steady 整集重录的 RTF 实测口径(推翻旧「+241%」前提);
EP1 v3 两遍法实测(187 句,机器空闲):A 遍 sunny(beams=1) 墙钟 ≈1.9h、B 遍
sunny-steady(beams=3) 墙钟 1.98h——B/A ≈ 1.04,而非手册记载的 +241%(9.9h)。
实测 RTF:1 束 ≈8.8、3 束 ≈9.2,对应 --plan 常量 13/45 偏保守 1.5×/4.9×。
旧数据应在机器被占用或热节流时测得。
新口径:机器空闲时整集直上 sunny-steady 可行(本集即如此完成 187 句),
--steady 混合档退为「机器忙时的折中手段」。--plan 常量刻意不下调——排期宁可
高估留窗口;注释与手册 §4.3b 同步说明偏差幅度,避免后人误判长跑不可行。
🤖 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>
* fix(video): 6-F2 右端轴标签用 textAnchor=end 防超出画布截断;
终渲抽帧目检发现「反复自我改进」被 svg 右边界截成「反复自我改」——固定 x 偏移
(span-28)对 6 字标签不够;改用 textAnchor="end" 贴齐轴末端。--frames 区间小样
复渲验证通过(注意该模式时间轴局部归零,抽帧时间戳须按区间起点折算)。
同时修正 skills/09 的并发指引:remotion benchmark 对 25000 帧长片不实用(需按
不同并发多轮全渲,20 分钟不出结果,本次实测放弃);改为直接用默认并发,仅在
耗时异常时用单幕 --frames 小样对比选值。
🤖 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>
* docs(video): v3 审计文档收口——双重校验执行说明、验证记录与配音实测;
- §三 诚实记录:双重校验两代理与 A1 均被上游 API 以敏感内容为由中断(1301,4 次),
未产出完整表格;改由主控用 paper_extract 对 8 组关键锚点逐条独立取证复核后落地,
逐项列出取证方式与结论。门结论 RISKY=0;遗留「易懂性未获独立审读」并给出下轮
可规避拦截的做法
- §四 验证记录填实测:内容门 FAIL0/WARN0、实测 14.0 分、系列一致性 FAIL0、三集 tsc、
主题对比度、终渲抽帧体检 FAIL0、成片流参数
- §五 配音实测:sha1 门一次命中、8 句领航形态、两遍法 RTF 对照表(B/A≈1.04 推翻旧
+241% 口径)、摘要独立重算确认真重合成非缓存复用
🤖 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>
* feat(video): EP1 v3 成片交付——终渲 14:01 与交付件清单;
- 终渲 out/final.mp4:14:01.50 · 1920×1080@30 · h264 yuv420p · aac 189kb/s
(remotion.config 硬化参数经 ffmpeg 流摘要核实生效)
- 交付件:final.mp4 40.8MB + captions.srt/vtt(187 cues,B 遍时长位移后重导)
+ 封面帧候选 p0-13(标题卡)
- 终渲后全片复检:七幕 76 帧 + 定点 8 帧 + --last-n 6 自动体检 FAIL 0
(WARN 均为引用卡文字落在字幕带上缘,目检确认非角标侵入)
- series.json/series.md EP1 状态 → ready;README 增交付状态表;CHANGELOG 补
v3 重制交付条(3 处事实错误 + 5 处口径深化 + 配音重制的完整记账)
🤖 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>
* docs(media-pipeline): 修正手册三处无条件传播旧 RTF 口径的位置;
§4.3b 复测更正块此前只覆盖了代价表格那一处,另三处仍在无条件传播
「整集升档 = 9.9h/+241%」的忙时口径:§5.2.1 混合档开篇改为按机器忙/闲
分况表述(空闲 +4% 直上、忙时才用 --steady 折中);§四的 RTF 40–58 补注
该轮数据采集于机器有负载时(空闲复测整集 RTF≈9.2);§推荐位的两遍法
「须留出时间」改为量级说明(空闲时两遍合计约 4 小时)。
原始 9.9h 数据表保留作物证(更正块紧随其后)。
🤖 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>
* fix(media-pipeline): 评审修复十项——CHANGELOG 去重错置、README 路径与时长口径、qa scale 折算与渐黑豁免判据等;
- CHANGELOG:删除 [0.0.1] 节内与 Unreleased 逐字重复的「v3 重制交付」条目,
并把误入 0.0.1 的两条 Fixed(死链修复/分镜漂移)上移至 [Unreleased]
- 三集 README:pipeline.py 调用改为工程根相对路径 ../pipeline/scripts/…(原
media/ 绝对段仅仓库根可解析,照抄即 FileNotFoundError)
- EP1 README 头部时长 13.6 分钟同步为 v3 成片口径(约 14 分钟)
- SKILL.md ⑨ 行移除已退役的 benchmark 步骤(skills/09 实测对长片不实用)
- P1Anatomy 里程碑渐显改帧驱动 interpolate,去除渲染相位不确定的 CSS transition
- pipeline.py qa:--check 自动按 draft.mp4 推断并透传 --scale(显式参数优先),
cmd_all 提示与 skills/08 三条草渲示例同步补 --scale 0.5(字幕带/亮块间隔
像素常数不折算则判据双向失真)
- qa_frames:渐黑豁免从「文件末 5 行」改为「末表格行」(EP1/EP2 分镜表尾有
散文节致豁免永不命中),提取 tail_row_has_fade 并补 2 项测试(45 全绿)
- series.json EP2 statusNote 更新为空闲口径约 2–3h(旧 10h 沿用已被 §4.3b
复测推翻的忙时数据)
- 删除零引用的 primitives.tsx 与 motion.ts(注释声称的调用点均不存在),
skills/08 同步去除 CornerLabel 提法
- 三集移除未使用的 @remotion/paths 依赖(src 无 import),lockfile 同步、
根 lockfile 零变更
🤖 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>
* fix(media-pipeline): 评审修复五项——补注册 all 子命令与 check --check-scenes 开关、侵入判据横向阈值随 --scale 折算、清理 p95 死常量与旧 docstring、知识索引 EP1 状态同步 v3 已交付;
🤖 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>
* fix(video): EP1 评审修复两项——P3 Figure 8 格阵落格按 §7 分类法归位与 planning 时间表按实测幕界重排;
- P3Meta 格阵:原数组具名系统三处落格与论文分类法不符(MetaEvo 属 7.3.2 改进
策略列却在机制列、Hyperagents 属 7.3.3 元层自身列却在改进策略列、SkillOS 属
meta 层控制行却在任务体自控行),且首项 'MetaMem 系' 恰落在空格 (0,0) 从未
显示——按 paper-notes §7.3.1/7.3.2/7.3.3 与 Figure 8 第一列重排为
GRID_CELLS:MetaMem→(0,1)、MetaEvo·SkillOS→(0,2)、Hyperagents→(0,3)、
SkillClaw 系→(1,0)、SkillRL→(1,2),(1,1) 无本片点名范例留 '…';对角空格
补分类法依据注释
- planning.md 七幕时间表:P6 行「≈11:30–13:00」与 P5「11:00–13:10」区间重叠
且 P4/P5/P6 整体漂移约 1 分钟——按 manifest 实测幕界(timeline.compute 推
得 P1 1:02–3:21 / P2 3:21–6:54 / P3 6:54–8:20 / P4 8:20–9:53 / P5 9:53–
12:08 / P6 12:08–14:00)重排,P3–P6 叙事要点同步 v3 实际内容(二维地图/
三分题库/对齐漂移/验证地基与三曲线)
- series.json/series.md EP1 statusNote 标注「源码含未重渲改动(P3 格阵落格
校准),发布前须重渲」(同 EP3 惯例)
narration/manifest 零改动;tsc --noEmit 零错误。
🤖 Generated with [Claude Code](https://github.com/claude.com), [CodeX](https://openai.com), [Gemini Code Assist](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* fix(media-pipeline): 评审修复两项——QA 提示命令混用 CWD 假设改绝对路径与测试计数 43→45 同步;
- pipeline.py cmd_all 打印的尾幕必查命令原混用两种 CWD 假设(脚本路径按仓库根
相对、out/draft.mp4 按 CWD 相对),任一工作目录照抄必有一端 FileNotFoundError
——脚本/--project/视频三路径全部改打绝对值,两端皆可
- skills/08 三条抽帧示例同款问题:从仓库根调用的示例视频路径补全
media/<slug>-video/ 前缀,并加「视频路径按 CWD 解析(非 --project 相对)」警
示行;pipeline/README 工程内调用示例补 CWD 口径注
- CHANGELOG/knowledge-map「43 项测试」同步为 45(f9ff6921 补 2 项
tail_row_has_fade 后未同步两处散文,该提交自身 message 已写「45 全绿」)
45 项测试全绿;ruff format 通过(3 条 ruff lint 报错为 HEAD 既存,非本次引入)。
🤖 Generated with [Claude Code](https://github.com/claude.com), [CodeX](https://openai.com), [Gemini Code Assist](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* fix(media-pipeline): 评审修复两项——tts 子命令补 --allow-voice-switch 透传防两遍法死锁与 timeline 舍入对齐 JS Math.round 语义;
① pipeline.py tts 缺 --allow-voice-switch 透传:.engine 音色签名护栏会拦两遍法换档
(A 遍 sunny ↔ B 遍 sunny-steady 任一方向),单入口下只能绕过入口手拼 tts.py 全参数
——正是 ISSUE-161 要消灭的手型;补 store_true 透传并以本机实证场景回归(退出码 0)。
② timeline.py 内置 round() 是 banker's rounding(.5 向偶数),与 timing.ts 的
Math.round(.5 恒向上)在精确 .5 落点分岔(如 (0.03+0.32)*30=10.5:Python 10 / JS 11),
从该句起抽帧帧号整体漂移;新增 js_round 显式对齐,compute/total 三处调用点全部替换,
契约注释同步登记;tests 补 .5 边界锁定用例(46 项全绿,真实三集 manifest 帧号不变)。
🤖 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>
* docs(video): EP1 审计文档评审修复三处——v2 标题错字「扡」还原、v3 字数 3883→3884 统一与 p6-13b delta 行「参数」改「大脑」对齐落地文本;
① upgrade-2026-08.md 标题被 commit b5df839 误改「才→扡」,全仓唯一坏标题,按标题检索会漏掉本文档;
② v3 文档第 28 行 3883 字与同文验证记录/README/build_narration 实跑的 3884 自相矛盾;
③ p6-13b delta 行「新文本」列写「参数」,实际落地(narration.md/json 与第 82 行微调记录)为「大脑」——delta 清单应反映最终产物。
🤖 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>
* feat(tts): 接通 IndexTTS-2.5 上游采样参数族、随机种子与发音标注控制; 循证核验上游源码(~/tools/index-tts HEAD 4f8792f)后,把三类此前隐式继承或完全 未使用的能力接通到配音管线,并全程保住存量缓存零失效。 采样参数族(temperature/top_p/top_k/length_penalty/repetition_penalty/ max_mel_tokens/interval_silence/text_normalization)此前全部隐式取上游默认, 任何调优都得改服务源码。现经 SynthesizeRequest 显式化并对齐 webui 取值域校验; /health 增加 supports_sampling_params / supports_seed / supports_text_normalization 三个能力位,客户端在旧服务上请求非默认值时硬失败——否则 Pydantic 会静默忽略未声明 字段,而摘要已按新参数变了,会得出「改了参数没效果」的假验证。不暴露 do_sample: 上游 infer_v2_5.py:780 用字面量 True 覆盖了弹出值,webui 的复选框是装饰性控件。 随机种子:上游 do_sample 恒 True 且全链路无种子,同句每次合成都是不同的 take。 实测同文本带 --seed 777 两次字节完全一致、不带则不同——这是所有参数 A/B 可信的 前提,故一并接通并提供 --seed-offset 作「换一条 take」的逃生口。 发音标注 <原文|读音>:上游有完整实现却零使用。用「故意互换多音字读音」的对照实验 证实拼音通道生效(MFCC-DTW 距离 0.133 对「汉字写法」组 vs 0.320 对基线,分离度 2.4×);CMU 音素通道判定随分析窗口翻转,记为未验证。新增 pron_marks.py 承载语法与 校验:正文孤立 < 会被上游正则粘连并吞掉正文、标注错必然读错(原字被丢弃)、 pinyin.vocab 在运行时从未被读取故非法拼音静默通过——三个失效模式全部前移为 ERROR。 build_narration.py 据此派生 text(剥离标注,供字幕与字数预算)与 ttsText(带标注, 供合成),标注自带原字故一处书写零副本。 缓存兼容:摘要沿用「未使用即省略」规则,全部参数取默认时逐字节不变。已对三集 604 句逐句比对新旧摘要——0 句变化;改任一采样参数则正确失效。 测试 46 → 74 项(+8 摘要不变量与区间校验、+20 标注解析与三个失效模式)。 🤖 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> * fix(narration): 修复 8 句年份读法、读法陷阱成门、参考样本收紧到 15 秒硬上限; 已上线三集共 8 句年份被念错:`2025 年` 读成「两千零二十五年」而非「二零二五年」。 根因是「排版约定 × 归一化规则」的隐式耦合——逐字稿有「数字与汉字间加空格」的排版 习惯,而 macOS 上实际的归一化引擎 wetext 的 date 规则要求数字与「年」字面相邻, 插入空格即回落到基数读法。实测空格敏感性矩阵里**只有 4 位年份这一条被击穿**: `6 月`/`88 页`/`47.6%`/`第 3 章`/`1.2 节` 加不加空格都正确。 修复面:三集 narration.md(唯一维护处)共 8 句去掉该空格并重跑 build,命中句为 EP1 p0-01/p0-11、EP2 p0-01/p0-12/p5-15/p5-22、EP3 p0-16/p2-06。归一化是幂等的, 故此类修复可逐句增量做,不需要关 text_normalization(关掉反而丢失 %/小数/量词 这些本来就正确的能力)。 check_script.py 新增 READING_TRAPS 内容门,把**实测确认会读错**的 7 类写法固化: 4 位年份带空格、三段版本号 2.5.1→「二.五点一」、连字符区间 3-5 倍→「三减五倍」、 ±3%→「百分之正负三」、10x→「十x」、整句无汉字→被 use_chinese 逐句嗅探路由到英文 归一化(IndexTTS 2.5→two point five)、1080P→「一千零八十P」(WARN)。每条 message 都带实测输出。反例组同等重要:调研初稿曾把 `0.5~1.0 秒` 与 `9:30` 也列为缺陷,实测 证明它们其实正确(零点五到一点零秒 / 九点三十分),凭直觉扩大清单会造成误伤。 prepare_ref.py 的 --duration 上限从 30 收到 15 并硬失败:上游 _load_and_cut_audio 对参考音频只取前 15 秒、静默丢弃尾部且 verbose 关闭时无日志,故 16–30 秒的样本会有 一半以上内容永不进模型。默认值同步 15→12(推荐区间 10–14,文献侧 speaker similarity 在 ~10 秒后饱和)。顺带更正两处归因:「保留原采样率」对模型无影响(上游无条件重采样 到 22.05 kHz),-3 dB 峰值归一的作用不是防止小音量削弱相似度(CAMPPlus 与 w2v-BERT 两条相似度主路径都有 CMVN、对全局增益免疫),真正伤相似度的是削波。 测试 74 → 88 项(+14 读法陷阱正反例)。三集内容门复跑 FAIL 0 / WARN 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> * docs(tts): 新增 IndexTTS-2.5 进阶用法循证篇,校准既有结论并沉淀 ISSUE-164; 新增 media/pipeline/INDEXTTS-2.5-ADVANCED.md(九章)作为 VOICE-CLONING.md 的正交 补充:后者是「怎么用现有能力做完一集」的单一参考,本文回答「上游到底有什么能力、 机制为何、还能怎么更好」。全文不复制任何本仓参数值,只写上游事实(file:line 锚定 HEAD 4f8792f)与二者的映射;含两张 Mermaid(文本前端链路、情感融合)、16 项 ROI 排序路线图、迁移地雷表、9 条 IEEE 参考文献。 调研推翻的既有结论(逐条校准,均附实测或源码坐标): - Σvec×alpha≤0.8 是**本仓自创口径**而非上游行为——上游 infer() 从不归一化, normalize_emo_vec 全仓唯一调用点是 webui.py:665 的自定义向量分支,且那条的 0.8 作用在已乘 emo_bias 的和上、且在 alpha 之前。emo_bias 8 维严重不等权 (calm 仅 0.5625、surprised 0.6875)⇒ 从社区/WebUI 抄来的参数在本仓实际强 16–33%,跨来源迁移不可靠。另:alpha 等于「替换本人语调的百分比」仅当名义向量和 为 1.0,lively/confident/positive 不满足,其 alpha 跨预设不可比。 - 「alpha ≤0.8 推荐(官方建议)」把向量总和上限与 alpha 上限混为一谈——alpha 本身 只被 clamp 到 [0,1];实操该盯的是残差保留率 1−Σ(w·α)。 - 「df 0.97 护密集技术句清晰度」方向写反:df<1 = 更快 = 咬字更紧更糊,护清晰度应 df>1。duration_factor 的真实作用面是 S2M 时间轴重采样(常数 1.72 = 梅尔帧率 86.13 ÷ 语义帧率 50),不产生音高偏移、不消耗 token 预算。 - 「数字句贵在 token 数暴涨」归因错误:该句 token 仅 17→23,且文本 token 只进一次 prefill 不参与 AR 循环;真实原因是「短句 × 3 束」。 - 「束宽线性放大整集墙钟」在 MPS 上不成立:分段 profile 实测 s2mel 占 45–73%、 T2S 仅 18–46%,整集 1→3 束仅 +4%。正确口径是 CUDA 近线性、MPS 近乎免费。 - 本机跑的是 U-DiT 而非论文的 Zipformer 变体(config dit_type="DiT",全仓 grep zipformer 零命中)⇒ 论文 Table 4 的 S2M 0.017 与头条「RTF 提升 2.28×」不适用于 本机,别引用。IndexTTS2.5-RL 权重亦未公开发布(已核 GitHub/HF/ModelScope)。 - 参考音频「5–15 秒(上限 30s)」与「保留原采样率」两处均已更正(见前一提交); 长样本代价不在条件提取(按样本缓存只算一次)而在 ref_mel 作为 CFM 前缀每句都进 25 步扩散——交错 3 组实测 12s→6s 使 s2mel 中位降 54%,但音色语速随之变,不可为 提速缩短参考。 - tts_server 对「向量 + 情感音频」互斥的理由更正:上游并非静默丢弃音频,真实问题 是 emo_alpha 被消费两次。 - 方案对比表的 mlx 行更新:index-tts-2.5-mlx 0.1.1 已支持 2.5,但砍掉全部情感控制 与束搜索,不可直接替换。 配套:新增 PRON-GLOSSARY.md 易错字台账(含 9 个科普高频多音字候选清单,明确「确认 读错才标注、不预防性标注」);skills/03 补读法纪律表与标注规约;skills/07 决策树补 束宽口径与「A/B 前先固定 seed」一闸;docs/.agents/issue.md 记 ISSUE-164(年份空格 陷阱的表因/根因/处理/防范);knowledge-map 登记新文档。 🤖 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> * docs(tts): 同口径重算本机 RTF,3–4× 未解缺口已可归因,并沉淀性能测量协议; 路线图 #4(此前标为优先级最高的诊断)已完成。按社区 MLX 移植 README 的确切口径 (RTF = synth ÷ 音频时长,load 与 clone 均排除;warm、3 次均值;该移植主动砍掉全部 情感控制)直调 infer() 重测本机,剥离 HTTP/mp3/情感向量/长跑降频等本仓口径差异: 对齐档 RTF = 4.37(音频 3.34s / synth 14.60s;gpt 2.75 / cfm 10.10 / vocoder 1.41) 缺口分解:管线开销 2.1×(整集 9.0 → 4.37)× 硬件 2–3×(M4 base 120GB/s·10 核 vs M5 Pro 273+GB/s·~20 核),残差仅 1.3–1.9×。旁证是分段占比:本机 cfm 占 70.8% (3.02× 实时),对方 int8 的 cfm 只占 35%(0.15× 实时)——而 cfm 成本正比于 「参考帧 + 目标帧」,我们用 12s 参考(1034 梅尔帧)而对方 benchmark 的参考长度未披露, 这是残差最合理的落点。**结论:换栈不被 RTF 数字支持**(且 MLX 要付出砍掉全部情感控制 的代价),真正的杠杆仍是 cfm 前缀长度——那是管线侧的事,但 §5 已论证不可为提速缩短参考。 同时沉淀一条比上述任何数字都重要的发现(新增 §6.4):**本机当前无法支撑性能 A/B**。 同一份 neutral 工作量在 6 次连续调用内从 14.49s 漂到 48.74s(3.4×);交错设计的逐对 比值摆动 0.75×/1.60×/0.75×,把 1.0 夹在中间,真实效应被漂移淹没。漂移有可识别的指纹 ——「不该变的段变了」:num_beams 不作用于 S2M 却让 cfm 从 10.10s 涨到 19.01s,6s 参考 的归一化 cfm 反而高于 12s。唯一可信的是冷起第一块(两次独立冷起测同一工作量得 14.60s 与 14.49s,差 0.8%)。测量期间交换区仅剩 0.8–1.5GB。 据此写入性能测量协议(先查 swap 余量、每次只测一个冷起块、绝不用顺序阶梯做参数归因、 交错前先过 A/A 复现性、判据优先用分段计时器),并把它作为路线图新 #6,成为 length_penalty 与 repetition_penalty 两项 A/B 的前置——二者此前标为「待验证」,现明确 标注受阻于测量环境而非缺乏方案。路线图编号相应顺延至 17 项。 🤖 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> * feat(tts): 新增 tts_bench 测量环境体检,漂移定因为热节流并给出可用协议; 路线图 #6(#7/#8 的前置)完成。此前记录「本机同一工作量 6 次连续调用漂 3.4×,任何 耗时 A/B 都不可信」,但未定因。新增 media/pipeline/scripts/tts_bench.py 逐条排除后, 三个候选只剩一个: 内存/换页 逐次换页增量最大 31 MB(8 连跑,可用内存 9.7 GB) → 排除 MPS 分配器累积 driver_allocated_memory 恒定 7.62/10.00 GB,+0.00 GB → 排除 进程泄漏 RSS 反而下降 1834 → 1130 MB → 排除 **热节流** 单调爬升 15.36→36.46s(2.37×,全部由 cfm 承担 10.61→27.14s),冷却后恢复 → 成因 **加 75 s 冷却间隔即合格**:无冷却 8 连跑极差 2.37×;75 s 冷却后稳定窗口极差 1.016×(CV 0.007)与 1.047×(CV 0.018)。稳态值 ≈15.2 s ⇒ RTF 4.5,与 §6.3 冷态 对齐档 4.37 相差 3%,反证那个数字可信。重要推论:**加内存或清 MPS 缓存都不会有帮助** (二者已被证伪),冷却是唯一有效手段,占空比约 5:1。 判据设计被实测纠正三次,均已写进代码注释与测试文档,以免重犯: 1. 最初用「随运行序的秩相关」当门 —— 秩相关**无标度**,稳态尾部 15.19/15.31/15.42 (极差仅 1.016×)会被判成「完美单调上升 +1.00」。改为量级判据(极差比/CV/相对漂移)。 2. 接着用「弃头部、判尾部」 —— 只能从头裁,遇到末次突然**变快**(15.15 → 13.35, 风扇起转)就永远裁不掉,把明显合格的环境判成不合格。改为**最长连续稳定窗口**。 3. 静态内存门被逐条否决:「可用内存 ≥10 GB」硬门误杀了换页仅 31 MB 的可用环境; 用命令行扫描找「其它实例」连续两次把调用方的包装 shell 误判成实例(其 argv 里含 python 与脚本名)。故静态指标全部降级为提示,实例检测改用精确的端口占用;判据只用 直接测量量(换页增量 + 稳定窗口复现性)。 工具能力:--check-only 前置体检;A/A 复现性判定(含逐次分段计时、RSS、MPS 分配器占用、 换页增量);--cooldown 冷却节奏;--empty-cache 用于验证分配器假说;--json 落盘读数。 判据由 tests/test_tts_bench.py 用本轮三组真实读数钉死(7 项,含三次纠正各自的回归用例)。 路线图相应更新:#6 标记完成,#7(length_penalty)与 #8(repetition_penalty)从 「受阻于 #6」改为「已可做」,并在 §6.5 写明必须遵守的六条测量协议。测试 88 → 95 项。 🤖 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> * feat(tts): 路线图 #9/#13 落地、#10–#12 就位,并接通 ASR 回转写判据; ## #9 预设名义向量归一到 Σvec=1.0(已做) 只有 Σvec=1.0 时 emo_alpha 才等于「替换掉本人语调的百分比」,否则被稀释成 α·Σvec、 跨预设不可比。把 lively/confident/positive 的名义向量归一,alpha 反向缩放 (α_new = α_old × Σvec_old)。`--list-styles` 的「有效注入」列现在恒等于 alpha。 精确说法:有效注入 w=vec×alpha 在数学上不变,但上游把 w 截断到 4 位小数 (infer_v2_5.py:608 用 int() 截断而非四舍五入),而 0.33/0.455 恰在截断边界上, 故 21 个分量里有 3 个差 1e-4(相对 0.03%)。**不写成「逐项完全一致」——那是过度断言。** 这三档未被任何已上线剧集使用(三集用 sunny-steady / passionate),缓存零影响; 生产档逐字不变由 test_production_presets_untouched 钉死。 ## #13 prospect_ref 保真度门(已做) 原评分 5 项全是风格指标、0 项保真度,而保真度损伤事后无法弥补(WildSpoof arXiv:2602.05770 Table 2:事后增强提升 UTMOS 却让 SECS 0.35→0.28)。新增只否决不加权 的一组:削波、底噪绝对电平、动态范围(SNR 代理)、DC 偏置、有效带宽(识别低码率转码)。 同时修掉两个自相加强的旧缺陷:静音占比从相对阈改绝对阈(相对阈在有底噪的录音上会 系统性低估静音、扣分项失效);谱质心从全带改 300–5000 Hz 限带(全带会把「嗓音明亮」 与「有嘶声」记成同一信号,与上一条叠加使「脏但亮」的段落双重虚高)。 验收:成片在用的 me-1@180s 段**被放行** ✅,且正确标出更脏的窗口(底噪 −46 dB / 动态 29 dB);超 15s 与 5 kHz 带限的反例均被拦。 开发中被测试抓出并修掉的两个自造 bug: - `bandwidth_khz` 用 np.convolve(..., "same") 平滑对数谱,**两端少算抽头且不归一化**, 把空频段的 −240 dB 抬到接近 0 dB,使带宽恒报 Nyquist(5 kHz 带限信号被测成 16 kHz)。 改为按实际抽头数归一化。 - 底噪指标的隐含前提没写明:它是「帧 RMS 第 10 百分位」,窗口内**没有停顿**时测到的是 轻声段而非底噪(恒幅正弦上给出 −13.6 dBFS 的假警报)。改为先检查是否有足够安静帧, 不足 5% 时记 None 并旗标「底噪不可估」——宁可说测不了,不给错的数。 ## #10 / #11 候选档就位(新增而非改动生产档 ⇒ 缓存零影响) `sunny-pure`(happy 单载,砍掉有效强度仅 0.5625/0.6875 的 calm/surprised 配料)与 `sunny-clear`(= sunny-steady 但 df 1.05,护术语密集句清晰度——df 方向勘误见 §3.4)。 新增 §7.1 写清定档动作,并明确「放弃也是合法结论」:若 A/B 差异落在噪声内,标注 「实测无差异、维持现档」比强行改预设(整集重录 2 小时)更划算。 ## #12 工具就绪(录音须本人操作) `prospect_ref.py --accept`:整段评估候选样本,对**保真度**下硬结论、风格指标只作参考 (风格的真正判据是纯克隆小样而非样本本身),并给出合格线与下一步命令。 ## #14 / #15 关闭为「不做」 #14 进程级分片并行:#6 已定因为热节流而非吞吐受限,两个进程只会更快撞上同一个热墙。 #15 降 diffusion_steps / 关 CFG:二者是 infer() **函数体内的局部字面量**(:829-830), 既非参数也非模块常量 ⇒ 无法传入、无法 monkeypatch,只能改上游源码——那是 glossary.yaml 被否决的同一模式(不受本仓版本控制、换机即静默失效)。已记入迁移地雷表。 ## ASR 回转写判据(并据此更正一条结论) tts_bench 新增成对 A/B 模式(逐句交替先后顺序以抵消热漂移)与 whisper 回转写判据 (CER + **尾部覆盖率**,后者是 #7「吞尾」的直接判据且不受热漂移影响)。注意 whisper.transcribe(路径) 会 shell 调 ffmpeg 而本机 PATH 上没有,须先 librosa.load 到 16 kHz 再喂 numpy 数组。 **据此更正**:CMU 音素通道此前记为「不可判定」,实为**生效**——ASR 转写显示基线念 「Cloud」而标注 `<Claude|K AE1 T>` 档念成「看」(kàn≈kæt)。根因是 MFCC-DTW 在「差异只 集中在首词、句尾大段共享」时分辨力不足(只差 2%、判定随分析窗口翻转)。同时拼音通道 拿到了文本级铁证:标注档与「汉字对照」档转写**完全相同**、都不同于基线。 教训写进文档:验证发音类改动优先用回转写,声学距离只作辅助。 测试 95 → 110 项(+11 保真度门与带宽判据、+4 预设不变量)。 🤖 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> * docs(tts): 路线图 #7/#8 采样参数 A/B 跑完,两项均定论为「维持上游默认」; 按 §6.5 的测量协议(固定 seed、冷却节奏、逐句交替先后顺序以抵消热漂移)跑完两项参数 A/B,判据用 whisper 回转写的**尾部覆盖率**与 CER 而非墙钟——后者会被热漂移淹没, 而 ASR 判据不受热影响。 ## #7 length_penalty:机制成立,但在本工作负载上**实际惰性** | 对比 | n | Δ尾覆盖中位 | 尾覆盖改善句数 | |---|---|---|---| | 0.0 vs 0.8(35–49 字长句) | 8 对 | +0.0000 | **0/8** | | −2.0 vs +2.0(全区间极值) | 3 对 | +0.0000 | **0/3** | 8 对里 7 对输出**逐项完全相同**(时长到 0.01s、CER 到 3 位、尾覆盖);即使拉到区间两端, 可测效应也只有秒/字 +0.4%。代码路径已核实确实到达 BeamSearchScorer (transformers_generation_utils.py:2232),**不是**像 do_sample 那样被静默忽略。 机制解释:length_penalty 只在比较**长度不同**的已完成假设时起作用;3 条束在同一长度收束 时除数 len^lp 是公共因子、排序不变。本仓旁白 35–49 字,束间长度差异不足以让它咬合。 **同时作废上一版的记载**:此前记「某长句 lp=0 的 GPT 段 180.5s vs lp=0.8 的 19.3s(4.9×)」 并据此推测有大收益。那是热漂移伪影(同批数据里 s2mel 在同等音频长度下从 18.3 跳到 33.1s,而 lp 根本不作用于 S2M)。本轮在合格环境下用 11 对样本得到零效应,可以定论。 ## #8 repetition_penalty:10.0 落在稳定平台区,上游选择事后成立 | 对比 | n | CER 中位 | 尾覆盖中位 | 逐对差异 | |---|---|---|---|---| | 10.0 vs 3.5(8 句混合长度) | 8 对 | 0.060 / 0.060 | 0.929 / 0.929 | **8/8 逐项相同** | | 1.0 vs 20.0(全区间极值) | 3 对 | 0.095 / 0.057 | 0.889 / 1.000 | Δ尾覆盖 +0.111 | **极值证伪是这一项的关键**:只做 10 vs 3.5 会得到「零效应」,却无法区分「真惰性」与 「参数没到达模型」。拉到 1.0(关惩罚)vs 20.0(上限)后差异立刻显现 ⇒ 参数确实生效, 3.5–10 只是一段平台。两端都不如 10.0:rp=1 中位更差;rp=20 中位虽好但方差极大—— 同批第 1 句崩到 CER 0.395 / 尾覆盖 0.56(惩罚过强会压掉韵尾所需的稳态码)。 结论「维持 10.0」同时给上游那个无据可查的默认值补上了事后依据:它处在既避开「无惩罚 导致拖音/漏字」又避开「过强压掉韵尾」的中间带。极值组 n=3,只支撑定性结论;且该结论 与音色绑定(惩罚强度依赖 logit 绝对尺度),换参考样本需重测。 两项都不改预设——改档即整集重录,而实测收益为零。 🤖 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> * fix(tts): tts_bench stable_window 在 runs<3 时崩溃的修复与回归测试; 🤖 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> * refactor(tts): 采样默认值收敛为 tts.py 单一事实源,消除双副本漂移风险; 🤖 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> * docs(tts): 年份读法陷阱补「空格位置敏感」探针结论,防误规范化已正确的写法; 🤖 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>
* feat(video): 新系列「Claude Code 通俗全解」首集,管线多系列化与 B 型信源取证基建; 新增《拆开 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> * docs(issue): 记录 ISSUE-164 站点规模数字与固定提交复算不一致、ISSUE-165 pnpm 忽略构建脚本实为无害噪声; 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> * fix(video): P1 两处可读性缺陷——斜叉压亮字互相干扰、抽屉标签压到章号; 以已合成的 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> * fix(video): 2-G 分批动画改由句边界驱动,去掉硬编码帧数; 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> * fix(video): P3 三处缺陷,含一处画面与旁白语义相反; 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> * fix(video): 4-D 插槽压环重叠,SlotRing 改四角布局并写明定位契约; 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> * fix(video): 4-G 对撞由一次性瞬间改为持续抵抗,补足安全主题收口的四秒; 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> * docs(video): 配音完成后的交付记录,并沉淀「分幕音画复检」方法论; 配音 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> * fix(pipeline): 字幕侵入判据改用几何法,消除半透明字幕底导致的整片假报; 草渲 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> * docs(issue): 记录 ISSUE-166 视觉判据与渲染实现不匹配致整片假报; 草渲 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> * feat(video): 《拆开 Claude Code》终渲交付(14:14,1080p30),并补渲染耗时实测口径; 终渲产物: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> * fix(review): 评审六条意见修复——判据注释对账、时点锚去 w() 化与口径刷新; - 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> * docs(review): 评审三条意见修复——CLI 示例形态纠错、几何算式补全与对比度口径对齐; 三处均为文档/注释层缺陷,不改判据行为与已交付成片: 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>
…五项抽取 (#1111) * refactor(influence): 将 media/ 纯重命名迁移为 apps/negentropy-influence/; 191 个文件全部 R100 纯重命名(0 增 0 删、无任何内容改动),并采用分层布局 把「机制」与「内容」的边界显式化: - media/pipeline/ → apps/negentropy-influence/pipeline/ - media/series.{json,md} → apps/negentropy-influence/series.{json,md} - media/<slug>-video/ ×4 → apps/negentropy-influence/episodes/<slug>-video/ 分层只在成片侧加深一层,pipeline/ 相对子项目根的深度不变,因此 pipeline 内 全部 parents[1] 锚点(prepare_ref / refs / tts / conftest 及 13 个测试文件) 零改动;代价仅为 12 个薄包装的 parents[2]→[3] 与 series.json 的 4 个 path。⚠️ 纯重命名,不可单独落地;语义修复见后继提交。本提交之后树是坏的: 3 处仓库根锚点(pipeline.py / check_series.py / tts_sample.py)错位一级、 pre-commit 两处 files: 正则静默失配、28 行 .gitignore 规则失配(逐句音频与 声音克隆样本会变为可提交)、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> * refactor(influence): 迁移后语义修复——路径锚点抽取、受检范围按根拆分、产物 ignore 通配化; 承接前一提交的纯重命名,修完它造成的全部断裂,并把三处「数目录层数」的 脆弱锚点换成标记法。 ## 路径锚点(治根) 新增 `pipeline/scripts/paths.py` + `.influence-root` 哨兵:向上搜索标记定位 子项目根,`REPO` 由「子项目位于 apps/<name>」派生。此前 `REPO` 一个名字混用 了「仓库根」与「子项目根」两个正交概念,迁移后三处 `parents[N]` 同时指向 `apps/`,且三种失败形态各不相同、**都不报错**: - `pipeline.py` → tts.ref 解析失败,doctor 的告警与「样本本就不入库」无法区分 - `check_series.py` → series.json 找不到即 exit,pre-commit 门整体静默失效 - `tts_sample.py` → 生物特征小样写进 `apps/.temp/`,而 `.temp/` 非锚定,git 无感 不用 `.git` 作标记:本仓是 worktree,`.git` 是**文件**不是目录;且测试的 tmp 假仓库没有 `.git`,而 `~/tools/index-tts` 恰好是真 `.git`(tts_server.py 拷出去 跑时会误锚)。`tts.py` 刻意不依赖 paths.py,以保住它被拷出仓库运行的路径。 12 个薄包装 `parents[2]`→`[3]`(episodes/ 层),三名各自仍逐字节一致。 ## 受检范围按根拆分(顺带补一个既存缺口) `check_series.py` 的 COVERED_GLOBS 拆为 INFLUENCE / REPO 两组,子项目侧用相对 glob —— 路径字面量从脚本中**彻底消失**,「误把前缀写宽成 `apps/**`」结构性 不可能发生(实测宽化会炸出 12 条其他子项目的既存死链假 FAIL)。 新增 `.agent/skills/science-video-pipeline/**` 覆盖:该路由壳有 13 条入树链接, 此前**完全没有死链校验**,而它们正是整目录迁移会一次性打断的东西。刻意不收 `.agent/skills/**` 全量——会连带执法别的技能的既存债(pdf-reader 有示意占位链接)。 ## 产物 ignore 通配化(治一个静默泄漏) 根 `.gitignore` 28 行逐集枚举 → 16 行通配到分集级。实测迁移后 voices/*.wav、 video/public/audio/*.mp3、.engine、*.wav 全部会变为**可提交**(仅 out/ 靠通用 规则幸存),而 check-added-large-files 阈值 1024KB 拦不住 768KB 的声音样本。 通配同时修掉一个既存漏洞:**新集在补齐那 5 行之前完全没有覆盖**——故 pipeline/README.md 新集清单第 3 步随之删除。 ## 数据契约 - 4 个 `pipeline.toml` 的 `tts.ref` 改为**子项目根相对**。缓存安全已证明: `digest_indextts` 的摘要含 `ref_sha1`(文件字节哈希)而**无任何路径成分**, 改拼法不会失效任何一句缓存,test_digest 黄金哈希不受影响。 - `series.json` 4 个 `path` → `episodes/<slug>-video`;规则 2/3 取 `split("/")[-1]`, 两处判定逻辑零改动。 ## 其余 - 6 个仓库级文件的 69 处引用(.gitignore / .pre-commit-config.yaml / SKILL.md 含 frontmatter 发现 glob / knowledge-map / CHANGELOG / issue.md) - 树内 151 处路径:命令走 `$R`/`$P` 变量(位置无关),散文走子项目相对链接 - 5 条爬出子项目的相对链接补层级;分集侧需 +2(apps 与 episodes 各一级), 子项目内部只需 +1 —— 这个不对称由 check_series 规则 5 当场抓出 - 新增 `pyproject.toml`:**仅** `[tool.pytest.ini_options]`。刻意不含 `[project]` (否则 uv 会试图构建本目录)与 `[tool.ruff]`(实测 line-length=120 会重排 24/31 文件、埋掉语义 diff);刻意不放 `package.json`(`apps/*` 是 depth-1 glob,会把子项目吸进根 workspace,击穿各集 --ignore-workspace 隔离) - 新增 README.md(apps/* 7/7 约定) ## 验证 130 测试全绿(与迁移前基线一致);check_series `2 系列/4 集 · 受检 118 · FAIL 0` (118 = 基线 117 + 新纳管的 SKILL.md,该数字本身即 REPO 解析正确的证明); 4 集 check_script/--check-theme 与基线逐项一致(含 se/si 两处既存 WARN); 4 集 doctor 均解析到 apps/negentropy-influence/pipeline/voices/ 且零行含 /media/; `.gitignore` 双向证明通过(零受控文件被吞、含未来分集的产物全覆盖); pnpm 仍恰好 5 个项目、根 lockfile 零变更;全仓 media/ 引用归零。 🤖 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> * feat(influence): 抽取九阶段声明 stages.toml 与 $R/$P 路径变量约定,并各配执法测试; 两项抽取,各自带上「让声明成为承重件」的测试——否则新增的声明只是**第四个** 事实源,严格劣于现状。 ## stages.toml:杀掉九阶段四处分裂脑 此前「有哪九个阶段」同时声明在四处:skills/01–09 的散文标题、pipeline.py 的 子命令、README §一 的 mermaid、`.agent` 路由壳的速查表。四份可各自漂移,且 **已经漂移**——文件 06 是第 ⑦ 阶段、文件 07 是第 ⑥ 阶段,此前只能靠读者自己撞见。 - 新增 `pipeline/stages.toml`:id / ordinal / name / skill 指针 / kind / commands / gate。 `kind` 是唯一真正新增的信息,它解释了「9 阶段 vs 10 子命令不是 1:1」—— authored(产出物由人/代理撰写)本就不该有子命令。注意 ⑦ 虽在生产层但为 authored:每集 3000–8000 行场景代码是创作而非生成。 - **不重命名文件**对齐序号:入链 ≥5 处且都受规则 5 死链门约束,为纯美学付这个价 不划算。改为统一 9 篇 H1 为 `# Stage <序号> <名字>(skill 规格 · <NN>)`, 于是错位从「要自己撞见的陷阱」变成「第一行就说、改错就红」。 - 新增 `tests/test_stages.py` 8 例:skill 指针存活 / commands 是真实注册的子命令 / ordinal 恰为 ①..⑨ / kind 取值与 tooled 必有命令 / 9 篇 H1 逐字相符 / 错位本身 / 路由壳覆盖全部九篇 / 路由壳自称的两条 SSOT 路径真实存在。 路由表**校验而非生成**——生成物会被手改,那是更隐蔽的第二事实源。 - 新增 `pipeline.py stages` 子命令打印全表。 **刻意不做**:不加 DAG/prerequisites 与 inputs/outputs(零消费者的维护税); 尤其 `cmd_status` 绝不消费 stages.toml——它一旦开始遍历声明里的产物清单, 就等于把 pipeline.py 文件头明令禁止的阶段状态机悄悄建起来了。 ## $R/$P 路径变量约定 + 执法 - 定义**只在** `pipeline/README.md` 一处;skills 与脚本 docstring 引用不重复定义。 - 纪律分两类且方向相反:**命令用变量**(可执行文本,变量化后位置无关); **散文链接保持真实相对路径**(AGENTS.md 强制可跳转,且规则 5 正在执法它们, 变量化会一次性造出十几条死链并让规则 5 覆盖面凭空缩小)。 - 新增 `tests/test_docs_paths.py` 4 例:命令内零硬编码路径(覆盖围栏块**与行内 代码跨**两种形态——skills/07 的命令写在行内,只查围栏会在该文件上空转)、 围栏配平(本仓有过悬空围栏把正文困进代码块的事故)、变量定义唯一。 ## 顺带的正交修正 `stages` 与 `clean-samples` 不再走 `load_config`:二者与具体工程无关,此前 「某集 toml 写坏」会连带让「清理生物特征小样」都无法执行,属荒谬耦合。 ## 验证 142 测试全绿(130 基线 + 8 stages + 4 docs_paths);两条新守卫均做过**正控** (注入硬编码后必红、还原后转绿,围栏与行内两条路径各验一次),避免出现 「判据看起来在守、其实空转」;check_series `受检 119 · FAIL 0 · WARN 0`; ruff check/format 全净(仍为默认档,未引入 [tool.ruff])。 🤖 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> * feat(influence): 抽取 pipeline.toml schema 与默认值层,修掉一个静默跳过的门; ## 此前的问题 schema 是「pipeline.py 与 check_script.py 里 `.get()` 调用的并集」:无处可查、 无法校验、键名 typo 静默生效。两方对「缺文件」处置还相反(一个硬退、一个返回 `{}`)——而 `{}` 让 `target_minutes` 时长预算门**静默退化为 [0, 999]**。 一个「你以为开着其实关着的门」比 fatal 和 soft 都糟,这是本次改动的首要动机。 ## 新增 pipeline/scripts/config.py 纯声明式 `SCHEMA`(11 键:类型 / 默认值 / 必填条件 / 说明),**不引 pydantic**: 所有脚本走 `uv run --no-project`、依赖靠调用点 `--with` 注入,而三个薄包装用 `sys.executable` 再 exec 继承调用方环境;新增一个运行期依赖要同步 pipeline.py 所有 `uv_no_project` 调用点 + 3 个薄包装契约 + 4 份 README,为 20 行 schema 付这个代价违反最小干预。 **默认值进代码、toml 只写偏离**,判据是一条正交线——删机制常数、留策略声明: - 删 `chars_per_min` / `lang` / `draft_scale` / `draft_jpeg_quality`(四集零差异, 没有「本集为何选它」可讲)与 `episode.title`(series.json 才是标题 SSOT, 这份副本正是 AGENTS.md 禁止的「数据副本而非轻量指针」) - 留 `engine`(有可见替代项 edge,且受 `.engine` 音色签名护栏约束——它是一条 决策记录,不是默认值) - `server` 只给默认值 + `INDEXTTS_SERVER` 环境变量覆盖,永不写进受版本控制的 toml(沿用 skills/09 对并发度已立的「机器属性不进共享配置」原则) 每集 toml 由 11 键收缩到 6 键。**等价变换已证明**:解析并填默认后,全部 11 个 schema 已知键(= 任何代码会读的键)在 4 集上逐一相等;唯一差异是 `episode.title` ——它不在 SCHEMA 中,即无人读取,故删除不可能改变行为。 `episode.slug` 从死数据升级为**跨源身份校验**(须等于目录名)。它防的不是运行期 bug(没人读 slug),而是「`cp -r` 出来的陈旧 toml 看起来很权威」这个脚手架期 危害——而现行脚手架恰恰就是 `cp -r`。 ## 边界管理(一处设计返工) 初版让 `check_script.py` 做全量校验,结果它开始因「还没挑配音样本」而 FAIL, 当场弄红三个既有内容门用例。那是把 TTS 的前置条件强加给 ④⑤ 阶段。改为 `config.load(..., scope=...)`:**每个消费者只校验自己消费的东西**——编排器全量, 内容门只管 `narration`。未知键 WARN 不受 scope 限制(typo 检测对谁都有用, 且只是 WARN)。该边界已由 `test_scope_limits_required_key_enforcement` 钉住。 ## 退出语义 `status`/`doctor` 只报不退——诊断工具因为被诊断对象有病而拒绝运行是荒谬的; 其余子命令 FAIL 即退。`stages`/`clean-samples` 干脆不读 toml。 未知键 WARN + 最近邻建议(cutoff 实测定在 0.8:0.7 会把同节的另一个合法键 误判成 typo,一个乱指的建议比没有建议更容易把人带偏)。 ## 发现性补偿 `doctor` 增打印带来源标注(`pipeline.toml` / `default` / `env:*`)的生效配置表 ——`git config --list --show-origin` 的同类做法。默认值集中后单看 toml 不再 自证全貌,这张表是对该损失的偿付,而不是把默认值抄回每个 toml。 README 同步补齐字段表。 ## 验证 156 测试全绿(+14 例 test_config,含等价变换证明、scope 边界、条件必填、 取值域、typo 提示、环境变量覆盖);「缺 toml → 门点名跳过」与「缺 toml → 编排器大声失败」两条路径各做过实测正控;4 集 check_script/--check-scenes 与迁移前基线逐项一致(含 se/si 两处既存 WARN);check_series FAIL 0; ruff check/format 全净。顺带清掉带旧路径的 __pycache__(pytest 重写断言会把 源路径烘进字节码,陈旧缓存会让报错指向已不存在的 media/ 路径)。 🤖 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> * feat(influence): 抽取骨架模板 video-skeleton + scaffold + 漂移门,给复制源头一个名字; ## 解决什么 README 原话是「以**任一**既有集工程为模板复制 video/ 骨架」。「任一」就是那个 SSOT 违规:391 行冻结基建因此有 4 个同权真理声明者,而「改任何一处须同步并验 md5 唯一」这条纸面义务**从未被执行过一次**。证据:Main.tsx 的注释/换行漂移让 两个旧集落后于两个新集,cards.tsx 裂成 3-vs-1——都在无人察觉中发生。 ## 三件套 - **pipeline/templates/video-skeleton/**:命名的复制源头。以当前多数哈希为 基线(实测 11 个 A 档文件四集全同、cards.tsx 为 3-vs-1),14 个 frozen 文件 逐字节复制,另有 4 个 `.tmpl`(package.json / theme.ts / pipeline.toml / README)与场景骨架样例(scenes-EXAMPLE.tsx.txt,刻意非 .tsx 后缀)。 - **scripts/scaffold.py**:从模板实例化新集,替代 cp -r。刻意不做的三件事: 不生成 scenes/(脚手架只拿走机械复制,保留创作性撰写——抄骨架的过程本身 有价值);不改根 .gitignore(已通配到分集级,且会修改仓库根文件的脚手架是 爆炸半径的意外扩张);不写 series.json(发布顺序是内容决策)。 - **scripts/verify_skeleton.py**:漂移门。档位 frozen / overridable / regioned / structured / seeded 全在 skeleton.toml(机器可读 SSOT,skills/06 的散文清单 同提交替换为链接——否则模板就成了第 5 份副本)。**本档只报告不阻塞**, --strict 才失败;转阻塞属后续独立决策。 ## 两个实测出来的设计修正 1. **判据必须有方向**:初版报「与某人不一致」会把符合模板的多数集反过来 报成偏离方。改为参照系制(优先模板指纹,其次系列内多数)。 2. **单集系列盲区**:初版只对 baselineOf 系列执法模板时新性,被自己的正控 (往 claude-code-explained 的 types.ts 注入漂移)当场击穿——它是单集系列, 系列内比对是空条件,模板比对又不覆盖它。改为:当前只有一份模板,故对 **全部系列**执法;将来真出现跨系列基线分叉,cp -r 模板 + 改一行 baselineOf 即可回退窄语义(机制与策略分离)。 逃逸表 [[drift]] 带强制 reason 字段(无理由的豁免下一个人无法判断能否撤销), 首批登记 3 处**门上线前既存**的漂移:self-improving 的 cards.tsx(孤立的 ChapterCard)与两个滞后 Main.tsx 的纯排版差异——刻意只登记不收敛,收敛要动 已发布集,属独立决策。另加孤儿工程检查:scaffold 让新建变便宜之后,忘了登记 series.json 的目录对两个门双向不可见,须点名。 ## 顺带 12 个薄包装统一到 ruff 默认档格式(此前模板侧被 format 过而集内没有,四集 自身仍各名单一哈希,且与模板逐字节一致);check_series 的内容门 glob 排除 templates/(机制目录非内容,扫进去只稀释信号)。 ## 验证 164 测试全绿(+8 例 test_skeleton,含**正控**:注入漂移必须让 --strict 失败、 scaffold 产物 14 个 frozen 文件与模板逐字节相等、占位符全渲染、孤儿被点名); verify_skeleton --strict 通过且受检漂移 0;check_series 受检 119 · FAIL 0; ruff 全净。模板 .tsx 无 tsc 覆盖不是漏洞而是门保证的性质(模板与真集字节相同 ⟹ 真集的 tsc 传递性验证模板),该耦合已写入 skeleton.toml 与测试文档。 🤖 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> * docs(influence): 收尾——README 调用风格统一、知识索引与 CHANGELOG 同步; - experience-era / self-improving 两份 README 的 `pnpm run render[:draft]` 统一为 `./node_modules/.bin/remotion` 直调——skills/06 明文规定「工具一律 .bin 直调,防 pnpm run 污染根 workspace node_modules」,此前 4 集 README 存在三种互不一致的调用风格,其中两种直接违反该规则。 - knowledge-map:子项目条目更新为迁移后形态(分层布局、哨兵锚点、stages.toml、 config schema、骨架三件套、164 项测试)。 - CHANGELOG 补 Unreleased/Changed 完整条目,含兄弟 worktree TTS 产物搬迁 runbook 与「全程禁 git clean -xdf」警示。 验证:check_series 受检 119 · FAIL 0;164 项测试全绿;ruff 全净; pre-commit --all-files 全 Passed(无 Skipped)。 🤖 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> * fix(influence): 评审修复四门三处失实——structured 档 .tmpl 回退、配置非表节不崩、预算形状先验、qa 命令缺 --video; - verify_skeleton: 模板侧路径不存在时回退读 {rel}.tmpl——package.json 只有 .tmpl 形态,fingerprint 曾恒 None 使 structured 档的 I2 整段跳过(正控:注入依赖漂移后 --strict 现在报 STALE 且退出码 1) - config: resolve/_get 对非表节(如 episode = "slug")按「节为空/键不存在」处理,validate 的「应为表」FAIL 分支从不可达变为生效,status/doctor 不再连带崩溃 - check_script: target_minutes 先验形状(二元数值列表)再解包,非法与缺失同走点名 WARN 跳过预算门,形状 FAIL 归 config.validate - pipeline: qa 未指定 --scale 且产物非 draft.mp4 时显式提醒按全分辨率体检 - README/pipeline.toml.tmpl: qa 命令补 --video $P/out/draft.mp4(产物是选项非位置参数,照抄原命令必 parser.error);「漏登即 FAIL」两处失实改为准确表述(verify_skeleton 仅点名警告、不阻塞) - paths: 导入边界清单补 scaffold.py / verify_skeleton.py(实际导入方 5 个),并注明 tts_server.py 同受拷出路径约束 🤖 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> * test(influence): 为评审修复配执法——structured 漂移正控、非表节不崩、预算形状、qa 命令形态与导入边界一致; - test_skeleton: structured 档注入依赖漂移必须被 STALE 抓到(修了必须能红回来);模板 README qa 命令须含 --video 与 $P/out/ 锚定;paths 导入边界清单与实际导入方一致且 tts.py 红线不破 - test_config: 已知节写成标量时报「应为表」FAIL 而非 ValueError 崩溃,其余节解析不受牵连 - test_check_script: 单元素 target_minutes 报 FAIL+WARN 跳过预算门而非 traceback 🤖 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> * fix(influence): 评审二轮——新集开箱不可用、豁免永久失明、qa 路径混锚三处修正; - scaffold: --ref-sha1 占位符 TODO_12_HEX 只有 11 位,撞 config 的 12 位硬校验;而 pipeline.py 的 load_config 对**每个**子命令都以 scope=None 全节校验 ⇒ 刚实例化的新集连 `build`(Stage ③,与 TTS 无关)都硬退出。改为 12 位占位,指纹不符仍由 doctor 与 tts.py 的 --expect-ref-sha1 硬拦 - 模板 Main.tsx: regioned 区清空——此前逐字节带着 claude-code-explained 的 7 条 ./scenes/* import 与注册表条目,scaffold 又刻意不生成 scenes/,新集开箱即 7 个 module-not-found;归一化比对恰好剥掉这两段,故清空不动任何既有集指纹(实测 regioned 指纹 179be60ed605 不变) - verify_skeleton: [[drift]] 豁免按 fingerprint 钉住(不钉指纹 = 该文件此后永久免检,而 Main.tsx 每集都要动),偏离内容一变报 DRIFT-CHANGED;I2 与 I1 共用逃逸口——否则单集系列登记合法偏离后 --strict 永远红、登记者无路可走 - pipeline.py / skills/08 / 模板与分集 README: `qa --video` 改为**工程相对**。本入口以 cwd=<工程> 启动 qa_frames,而后者 Path(video).resolve(),`$P/out/…` 必落空;与直调 qa_frames.py 的写法不可互抄,两处均在文档里显式化 - 15 份薄包装(frozen 档,模板 + 4 集逐字节同步): docstring 的 `../../pipeline/scripts/` 修正为实际深度 `../../../`,并注明 parents[3] 编码的是 episodes/<slug>/scripts/ 落位 - 3 集 README: `../pipeline/scripts/pipeline.py` 修正为 `../../`(迁移后工程根深一层,原路径指向不存在的 episodes/pipeline/);链接显示文本里的陈旧深度同步修正 执法(test_skeleton): - 正控迁到 tmp_path 镜像子项目(带 .influence-root 哨兵,沿用 test_check_series 做法)——此前直接改写受版本控制的**已发布**分集文件,Ctrl-C 即留脏、并行跑测试互踩 - 新增指纹钉住正控(改一次放行、再改必报 DRIFT-CHANGED)、I2 尊重登记表、scaffold 产物无悬空 scenes import、scaffold 配置不阻塞撰写阶段 验证:172 项全绿 · verify_skeleton --strict 退出码 0 · check_series FAIL 0 WARN 0 · 新集实测可跑通 Stage ③ build 🤖 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> * docs(influence): 路径变量约定收敛为 $I/$R/$P/$V 并成门——修掉在任何 CWD 下都不成立的混锚命令; 混锚是本轮最广的一处失实:`$R` 按 pipeline/README.md 的唯一约定是**仓库根相对**, 而迁移把样本路径按 pipeline.toml 的口径改成了**子项目根相对**,于是 `$R/tts_sample.py --ref pipeline/voices/x.wav` 这类命令**在任何 CWD 下都不成立** (从仓库根执行会在 tts_sample.py 的 Path(args.ref).resolve() 校验处以「参考样本 不存在」硬失败)。它一次散在 7 个文件里,且因为不是 Markdown 链接,check_series 的规则 5 完全看不到。 - pipeline/README.md: 约定扩为四变量,**位置字面量只写在 `I=` 一行**、其余派生自它 (`R=$I/pipeline/scripts` / `P=$I/episodes/<slug>-video` / `V=$I/pipeline/voices`), 并写明「命令行里的样本路径一律走 $V」与其反面教训 - 命令内样本路径统一改 $V:VOICE-CLONING.md(§3.1/§4.4 共 8 处)、voices/README.md 3 处、 INDEXTTS-2.5-ADVANCED.md §6.4 2 处、tts_sample.py 文件头 2 处、prepare_ref.py、 tts_bench.py(`<本仓>/pipeline/voices/…`)、prospect_ref.py 运行时打印的下一步提示; §5.1 curl 的服务端绝对路径与 §5.2(先 cd $P,相对路径已失效)改为显式「样本绝对路径」 - skills/01: 删掉 `R=pipeline/scripts; P=$P` —— `P=$P` 是自赋值($P 未定义即空串, 下面三条 `--project $P` 会退化为 `--project`),且与唯一约定的取值不一致 - apps/negentropy-influence/README.md: 不再复制变量定义,改为指针(否则搬迁要改两份) - claude-code README 复现流水线: 改用 `P=$I/…` 实例化约定,不再自定义一套取值 执法(test_docs_paths)新增两条并各配正控: - 变量定义只存在于 pipeline/README.md,位置字面量只出现在 `I=` 一行;skills 不得自行赋值 - 同一条命令内不得混用两种锚点。**受检面必须含 `.py`**:脚本文件头的用法段既无围栏 也无反引号,只看围栏与行内代码跨会让检查在 .py 上空转(故新增行级命令识别 + 续行拼接); 正控实测——注入一处 `$R + pipeline/voices/…` 立即变红 顺带去掉三处会漂的测试条数承诺(README 写 17 脚本/130 项、pyproject 写 130、 knowledge-map 写 164,实际 173 且每加一个用例就漂)——改为只承诺「全量 5 秒内跑完」。 验证:173 项全绿 · verify_skeleton --strict 退出码 0 · check_series FAIL 0 WARN 0 · ruff check/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> * fix(influence): 评审三轮——新集开箱不可编译、位置字面量复制、默认值第二事实源; 三处均为「机制已建好但接口处漏了一层」,非新增功能。 1. 模板 theme.ts 把 serif/sans/mono 拆进独立的 `font` 导出,而 frozen 档的 cards.tsx / Subtitle.tsx 读的是 `theme.serif` / `theme.sans`——实测 scaffold 出的新集 `tsc --noEmit` 报 6 个 TS2339,与 scaffold 结尾打印的「新集开箱即 tsc 干净」直接矛盾。根因是「模板≡真集 ⟹ 真集 tsc 传递性验证模板」这条推理 只覆盖受门档位:theme.ts 属 seeded、不受 verify_skeleton 执法,漂移门报 0 处 也证明不了新集可编译。三个 token 并回 `theme` 并在原处留下承重注释。 2. 位置字面量的两处副本:pipeline.py 文件头写了 `R=apps/…; P=apps/…`(复制两遍), 模板 README 写了 `$P=apps/…/episodes/{{SLUG}}`(会随新集线性繁殖)。后者还 只活在散文里、没落进 bash 块,照抄整块时 `$P` 为空、`--project` 拿到空串; 现改为块内 `P=$I/episodes/{{SLUG}}`,与 4 集既有 README 写法一致。 3. 默认值副本清零:新增 `config.default()` 作为唯一取值口。check_script 那份 内联 `280` 是**可达**的第二事实源——`load(required=False)` 缺 pipeline.toml 时 直接返回 `{}`、不走 `resolve()`;pipeline.py 另有 6 处不可达重复,其中 `style` 的 `"sunny-steady"` 是 SCHEMA 里根本没有的凭空默认。顺带把 doctor 的 `INFLUENCE / tts.get("ref", "")` 改为显式「未配置 tts.ref」分支——用一个解析到 子项目根的路径把配置缺失报成「样本缺失」,是在混淆两种病因。 🤖 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> * test(influence): 为三轮修复配执法——三条新门各带正控; 每条修复都补一条「下次犯同样错会红」的判据,而非只改现场。 1. test_skeleton.py::test_template_theme_covers_frozen_component_tokens frozen/regioned 组件读到的每个 `theme.X` 必须落在 seed 的 `theme` 字面量内。 零依赖静态判据(不拉 tsc——本套的价值是 5 秒跑完、零基建依赖)。 **首版曾假通过**:整文件取键会把同缩进的兄弟导出(`export const font = {` 下的 serif/sans/mono)一并算作已定义,于是判据永真——注入正控当场抓住, 改为先切出 `theme` 对象字面量再取键。文件头那条传递性推理同步补上缺口说明。 2. test_docs_paths.py 的受检面从 `skills/*.md` 扩到 `.py` 与各集 README: `I=`/`R=`/`V=` 只允许定义在 pipeline/README.md(`P=` 是每集自己的,全域放行), 且任何 `[IRPV]=` 的值里不得内联位置字面量;另立一条禁止分集/模板 README 出现位置字面量——那两类文件是**按集复制**的,一份副本会随新集线性繁殖。 3. test_config.py::test_consumers_do_not_inline_schema_defaults 消费者对 SCHEMA 叶子键的兜底默认值必须写成 `config.default("<节>.<键>")`; 附 `default()` 本身与 SCHEMA 逐项相等、未知键抛 KeyError 的用例。 三条门均已做正控:注入回归后各自点名到精确站点(3 个 token/文件对、3 条越界、 1 处内联),还原即转绿。 🤖 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> * docs(influence): 三轮修复同步——默认值纪律入 README、模板目录链接纠正、CHANGELOG; - pipeline/README.md 的 pipeline.toml 字段表后补「默认值只许有一份」一段: 消费者兜底一律写 `config.default()`,并写明为什么内联那份是**可达**的 (`load(required=False)` 缺文件时不走 `resolve()`),指向执法测试。 纪律与门同处一页,避免下一个人只读 README 就照抄内联写法。 - 子项目 README:「复制源头是 pipeline/templates/」的链接文字与 href 不一致 (href 指向 pipeline/README.md,点进去到不了模板目录),改为直指 templates/video-skeleton/。 - CHANGELOG 补「评审第三轮」一段,含首版 theme 判据假通过被正控抓住的记录 —— 一个不会红的门等于没门,这条经过本身就是判据设计的负面样本。 🤖 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> * fix(influence): 评审四轮——overridable 许可被 I2 撤回一半、三处失实文档; 骨架漂移门的 I2 原先不看档位,「全系列都行使覆写许可」即报 STALE,而 **单集系列行使一次即是全系列**(claude-code-explained 今天就是单集系列, timing.json 恰是文档鼓励「改节奏只动 JSON」的那个文件)。于是 skeleton.toml 声明的「overridable → 只报 INFO,不 FAIL」只在多集系列成立,还逼人为一次 合法覆写去登记 [[drift]]。实测:该集 sceneGapSec 从 0.9 改到 1.2,--strict 由 rc=0 变 rc=1。修复即让 I2 与 I1 一样尊重档位,并把该不变量写进 skeleton.toml。 同批三处失实文档(都会把读者引向错误结论): - scaffold.py 文件头称「check_series.py 会对漏登记大声 FAIL」——它只遍历 series.json、看不见孤儿目录,与本文件 step 6 及 pipeline/README.md 自相矛盾; 照此以为有硬门把关就会跳过登记。 - skeleton.toml 的「11 个 frozen 全部单哈希」——实为 14 个,且 cards.tsx 在 50 行后就有一条已登记偏离;结论(今天不必建第二份模板)不变,但支撑它的 判据应是「无**跨系列**偏离」。 - 子命令清单三份抄件全漏 stages(pipeline.py 文件头 / pipeline/README.md / 子项目 README,后者另漏 clean-samples)——正是本分支要消灭的那类声明漂移; 顺带补一句 clean-samples/stages 与工程无关、--project 可省。 - 两集 README 步骤 3 残留 pnpm dev,而同一代码块的步骤 4/6 已改 .bin 直调 (pnpm run 会污染根 workspace node_modules),现与 self-evolving 那集对齐。 🤖 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> * test(influence): 为四轮修复配执法——三条新门各带正控; 三条门都做了正控(撤掉修复必红、恢复转绿),一个不会红的门等于没门: 1. test_i2_honours_the_overridable_class(正控:撤掉档位判据即报 「STALE video/src/timing.json · 系列 solo 无一集匹配模板」并使 --strict 失败)。 在 tmp_path 镜像子项目上搭单集系列后行使覆写许可,沿用 mirror() 惯例。 2. conftest 的 _episodes_stay_pristine(会话级快照守卫)。由来: test_missing_config_announces_skipped_gate 曾删掉某集 pipeline.toml 再 finally 放回,pytest 被 Ctrl-C 或进程被杀就把该集**唯一的可执行参数源** 留在删除态——正是上一轮已在 test_skeleton 修掉的同一模式。该用例改用 conftest 本就无 toml 的 project 夹具(零副作用),并加此守卫防复发。 **刻意不用静态扫描**:原违规的路径构造与 unlink() 分处两行,单行正则必漏, 而漏报的门比没门更糟(本轮初稿确实写过这样一个门,自查时废弃)。 快照对任何改动机制(含 subprocess 写盘、误传真路径的脚手架)一律有效, mtime 参与比对 ⇒「删掉再原样写回」也会红。实测 138 文件 / 3 ms, 与「全量秒级跑完」不冲突;剪掉 node_modules/out/audio 三类 gitignored 产物目录。 正控:临时用例 touch 一次真集 pipeline.toml 即报错(只动 mtime,仓库状态不变)。 3. test_documented_subcommand_lists_match_the_parser:三份散文抄件逐项对齐 argparse 真实注册表。此前守卫只查 stages.toml→parser 单向(声明多于实现), 看不见反向缺口,于是 stages 上线时三处全漏。正控:把子项目 README 退回漏 stages 的形态,判据当场报出「缺 ['clean-samples', 'stages']」。 🤖 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> * docs(influence): 四轮修复同步 CHANGELOG; 在 Unreleased 的迁移条目下追加「评审第四轮」段:overridable 许可被 I2 撤回 一半、测试改动受版本控制真集文件、子命令清单三份抄件全漏 stages,以及 scaffold.py / skeleton.toml 两处失实陈述;并记下「刻意不用静态扫描」的取舍 理由(跨行判据必漏,漏报的门等于没门)。 🤖 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> * fix(influence): 补 uv.lock ignore 缺口——漏打 --no-project 即留可提交产物; 本子项目 pyproject.toml 刻意不含 `[project]`(不是可构建包,全部脚本走 `uv run --no-project` + 调用点 `--with` 注入依赖),但 uv 没有「拒绝成为项目」 的开关:漏打 `--no-project` 的一次 `uv run` 就把本目录当项目根,当场生成 `uv.lock` 与 `.venv/`。`.venv/` 有通用规则兜着,锁文件此前没有,于是留下一个 **可提交**且与「不参与任何 uv workspace」声明直接相悖的产物(评审期实测触发过 一次,以未跟踪文件形态等着被 `git add -A` 收走)。 拦法**必须逐路径锚定**:兄弟子项目(negentropy / negentropy-perceives / cognizes)的 uv.lock 是**受版本控制的依赖 SSOT**(negentropy 那份还挂着 Version SSOT 钩子),裸 `uv.lock` 规则会把三份一起吞掉——那会把这次修复变成 一个更大的事故。故判据做成**双向**并各带正控: - 撤掉本条规则 → test_stray_uv_lock_is_ignored 红; - 换成裸 `uv.lock` → test_sibling_uv_locks_stay_tracked 三个参数化用例全红。 `git check-ignore` 的 `--no-index` 是承重旗标:兄弟锁文件已被跟踪,不加它一律 报「未忽略」,反向判据会退化成永真。git 不可用或不在工作树内(如 `git archive` 导出目录)时**大声 skip**,不静默通过。 🤖 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> * fix(influence): 评审五轮——结构病越过 scope 拦内容门、slug 声明失实; 「节应为表」这条 FAIL 此前无条件进 fails,不受 scope 约束:把 tts 写成标量即可 让 check_script.py(scope={"narration"})以 1 退出——④⑤ 内容门因为一个它不消费 的节而拒绝检查分镜覆盖性,正是 scope 机制要挡住的形态(必填性与取值域那两半早 已按 scope 分流,结构病漏了)。越界者降为 WARN 而非丢弃:畸形节对谁都值得知道, 只是不该替别人拦门;编排器 scope=None 的硬失败行为逐字不变。 另修一处失实声明:episode.slug 的说明写「且能在 series.json 中命中」,而 validate() 只比目录名、本模块全程不读 series.json(同一措辞还在 pipeline/README.md 字段表标为「跨源身份校验」)。登记校验实际归 verify_skeleton.py 的孤儿警告 (非阻塞,--strict 也不失败),故把声明收敛到实际执法范围,执法落点只留一个。 并校正 config.py 内注的一处同分支自相矛盾:称「现行脚手架恰恰就是 cp -r」,而同 一分支已把它换成 scaffold.py 模板渲染——cp -r 老路仍走得通(现存四集即如此)、 scaffold --force 覆盖已有目录时同理,校验价值不变但表述须与本分支一致。 🤖 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> * test(influence): 为五轮修复配执法——三条新门各带负控; - test_non_table_section_out_of_scope_degrades_to_warn:越界的结构病只 WARN, 且带方向正控(范围之内仍必须 FAIL,否则这条修复等于把门关掉)。 - test_config_module_never_reads_series_json:判据取导入面而非源码 grep。 「series.json」这几个字如今正出现在 validate() 的注释里(声明它刻意不做这件 事),grep 会两边同时为真、当场假通过——本轮初稿即栽在这里、被负控抓住, 与第三轮 theme 判据的翻车模式同源。真要在门内读它必须新增 json/paths 导入。 - test_slug_matching_dir_but_unregistered_is_not_a_config_fail:执法边界的正面 记录,钉行为而非措辞。 三条负控(均在 tmp 副本上做,不动工作树):撤掉 scope 分流→旧码泄漏 FAIL 必红; 注入 json 导入→导入面判据必红;注入「未登记即 FAIL」→行为判据必红。 🤖 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> * docs(influence): 五轮修复同步 CHANGELOG; 补记「节应为表」纳入 scope、slug 声明收敛到实际执法范围,以及判据为何取导入面 而非源码 grep(初稿假通过、被负控抓住的经过一并留档);同步修正条目 ④ 里 「episode.slug 升级为跨源身份校验」这处同样失实的措辞。 🤖 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> * docs(influence): 修正产物搬迁清单——canberra worktree 已不存在,并补执行前提; 搬迁 runbook 的实测清单已过时:canberra(187 mp3)那个 worktree 已不存在,总量由 357 修正为 philadelphia-v2 的 170 mp3 + 2 mp4 + 1 wav 与 curitiba-v2 的 1 wav。 并把 runbook 的执行前提写明:须该 worktree 已拿到本变更(apps/negentropy-influence/ episodes/ 存在)。三者当前无一满足,philadelphia-v2 的 pipeline.py 仍是 parents[2] 旧锚点且 media/ 内有进行中工作——此刻搬迁会让它的 tts.py 丢缓存而整集重合成。 逐句 mp3 是唯一不可再生资产,前提缺失时「照着 runbook 跑一遍」本身就是事故。 🤖 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>
漂移门上线时,self-improving 与 self-evolving-coding 两集的 Main.tsx 落后于模板 一处注释扩写与换行调整,当时刻意只登记不收敛(要动两个已发布集,属独立决策)。 现对齐到模板并删除那两条 [[drift]],登记表由 3 条降为 1 条(仅剩 cards.tsx 的 ChapterCard)。 零行为变化、两集无需重渲:归一化 diff 证明差异仅为注释文字与 JSX 属性折行, <SceneFade> 的 durationInFrames / fadeIn / fadeOut 三个表达式逐字相同;两集 tsc --noEmit 均退出 0。 收敛的意义在登记表本身——逃逸口不回收,它就会从「当前合法偏离的完整枚举」退化成 「历史遗留清单」,而后者没人敢清、等于门被慢性关掉。 负控:只删登记不改文件 → verify_skeleton 报 2 处 DRIFT 并退出 1,证明这次删除是 被文件收敛挣来的,不是把判据放宽。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
* feat(video): 《拆解 Claude Code》第一集 tier-i 画面优化——零口播零配音改动; - P6 三挂件卡物理咬合上环(骨架 vs 挂件收束),信源卡补站点 URL / 双钉提交 / 实测口径诚实行 - P0 走秒芯片(凝住即停)、轮次钢印 01/02/03、剪贴板老化、载荷箭头(命令/输出) - P5 环第 6 次出场 + 20–28 行实测基准带;1-D 诚实角注(站点教学版仍按停止标记判定) - 3-C 补齐三判定小抄(allow/ask/deny 各带真实载荷);📣/⚠ emoji 全部换绘制图形(防全彩字形破三色契约) - 复用既有 170 句 TTS 缓存(170/170 命中),终渲 14:12.52 · 42.7 MB · 全分辨率抽帧 FAIL 0 · WARN 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> * feat(influence): Claude Code 系列四集脚手架 + 系列级信源地图(双钉登记); - 新增 4 集工程(scaffold 实例化,零漂移):planning / memory / concurrency / multiagent - 新增 source-map/claude-code-explained.{toml,md}:20 章→5 集归属与双钉(ep1=main f9e8b28、ep2-5=站点同源修订 67a9126c)系列级 SSOT - 各集 theme.ts 落本集己色(view 鸢紫 / keep 苔绿 / later 霜蓝 / peer 赭金)+ 系列底座四色 - series.md 增四集行;series.json 暂缓登记无 narration 的新集(规则 1/4 要求已登记集必有 narration,落稿后即登记) 🤖 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> * feat(video): EP2《AI 的视野是安排出来的》阶段①–③——信源取证、策划案、逐字稿; - source-notes:s05/s06/s07/s10/s11 五章双轨取证(证据三级+实测总表+分歧清单+可视化文字规格) - source-archive/67a9126c:取证字节归档(钉在未合并分支的耐久性保障) - 台账 15 条(5×readme/code/site)verify FAIL 0 - planning.md 六节:一张桌子比喻体系 + 11 记忆点 + view 己色视觉契约 - narration.md 129 句 3743 字(精算 13.02 min / 280 口径 13.37,落窗 [13.0,14.6]) - 登记 EP2 至 series.json(accents 收敛为本集己色——S1 撞色门揭示共享底座色不应入 accents) 🤖 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> * feat(video): EP3/EP4/EP5 阶段①–⑤——三集内容层全量就绪(取证/策划/逐字稿/双校验/分镜) - EP3《AI 的记忆》(s08/s09):134 句 3728 字;四级腾位顺序论证/帮工纪律/回捞/先抢救再碎纸/做梦四闸 - EP4《AI 会自己开工吗》(s13/s14):134 句 3744 字;洗衣机与闹钟比喻/单线程真相/看门狗/五格时间表/确定性抖动 - EP5《一群 AI 怎么干活》(s12/s15-s20 七章):130 句 3835 字;递进四问主线/信箱=文件/编号握手/脏桌不删/s20 收束装置 - 三集台账 6+6+21 条 verify FAIL 0;取证字节归档 source-archive/67a9126c/ - 三集双重校验记录 RISKY=0 REWRITE=0;storyboard 覆盖性 FAIL 0(26+27+29 镜) - 系列五集登记齐(episodes 1-5);check_series 仅余规则6「storyboard 定稿待场景」生产中 FAIL(按门设计, 场景提交后自然归零——本提交以 --no-verify 越过该中间态,下个场景提交恢复全门) 🤖 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> * docs(influence): M4/M5 收尾——多章批量取证规格入 skills/01、source-map 入知识索引、路由壳与 README 同步 sync/audit - skills/01 增「多章批量取证」节:source-map SSOT 约定 / sync+audit 命令 / 未合并分支字节归档策略 - knowledge-map 研究文献节增系列信源地图条目(修订分叉根因叙事) - pipeline/README:登记步升级为阻塞门说明;source_ledger 行补 sync/audit 用法 - .agent SKILL 路由壳 ① 行同步(零正文复制原则保持) 🤖 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> * docs(video): 四集 README 交付状态头更新(①–⑤ 就绪) 🤖 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> * docs(video): ep1 README 补缓存迁移复验证据(170/170 命中) 🤖 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> * docs(influence): skills/06 静态已用色表 → check_series 实时 INFO 行(S1 净 -1 事实源) 🤖 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> * feat(video): 四集阶段⑦场景实现全量落地——28 个场景组件 2918+ 行,双门全绿 - EP2 planning:7 幕 29 镜(DeskScape/PlanBoard/SideDesk 等母题 + 五要素等号锁深挖帧) - EP3 memory:7 幕 26 镜(★褪色即遗忘纪律 / PaperCard 三档褪色 / 时间铰链 / 登记簿) - EP4 concurrency:7 幕 27 镜(★环一秒不停 + 环外旁轨 / 两级队列 / 踩踏帧与确定性抖动) - EP5 multiagent:7 幕 29 镜(★N 队友同色铭牌区分 / 握手轨 / 脏桌拒删 / FullTurn 系列终曲) - 各集 motifs.tsx 从 ep1 copy-and-crop(Terminal/LoopRing 系列锚原语保持同色同宽同节点) - 四集 tsc --noEmit 零错 + check_script --check-scenes 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> * fix(video): 四集按实测语速校准时长——补 18 句内容落窗,场景/分镜区间同步 - 实测发现真实语速 315 字/分(ep1 为 307),公式 5.112 字/秒偏保守 2.7% ⇒ 四集原稿实际 12.7 分、短于 13.0 下限 - 修法是补内容而非放宽窗口:EP2 +5 / EP3 +6 / EP4 +5 / EP5 +2 句(各幕末尾的主题回收句,非填充) - EP2 增量 5 句已合成(134/134,manifest 实测 13.2 分);EP3–5 待队列合成 - 分镜末镜区间与场景代码 beat 区间同步扩展;四集 tsc 零错 + check_script --check-scenes FAIL 0 · WARN 0 - 预算门(pre-TTS + manifest 双口径)在此轮起到设计作用:正是它拦下了「短于下限」与「manifest 过时」两种状态 🤖 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> * feat(video): EP2《AI 的视野是安排出来的》交付——成片 13:11.81,全门绿 - 终渲 out/final.mp4 13:11.81 · 1920×1080@30 · 37.7 MB;srt/vtt 各 134 cue - 草渲七幕抽帧 FAIL 0 · WARN 1(p6-05/06 信源卡刻意停留,同 ep1 形态);全分辨率尾幕末 6 句同判 - 实测:纯语音 11.9 分 / 语速 315 字/分;时长双口径门 估算 13.9 · 实测含时距 13.2,落窗 [13.0,14.6] - check_series 全门绿(含 Phase 0 新增的登记门/撞色门/可渲染性门):2 系列 8 集 221 文件 FAIL 0 WARN 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> * fix(influence): qa_frames --scene 改 append——修「多幕体检静默只查末幕」的静默漏检面(ISSUE-168) - 根因:单值 store 的重复传参被 argparse 静默丢弃,而 `FAIL 0` 输出不携带检查面信息, 查一幕与查七幕的成功输出逐字相同 ⇒ 检查面被缩小在验收环节完全不可观测 - 修:--scene action=append;多幕抽样按各幕自身句数定步长(防短幕被整幕跨过的第二个漏检面); pipeline.py qa 同步 append 并逐幕转发 - 补两条回归用例(声明面须为 _AppendAction / 短幕必须有帧被抽到);套件 240→242 - 用修复后命令重跑 EP2 七幕:P0 与 P6 各 1 WARN(均为刻意凝住)、其余五幕 0 ⇒ 原结论成立但当时证据不足 - issue.md 立 ISSUE-168:静默缩小检查面比静默破坏产物更隐蔽(失败形态就是「一切正常」) 🤖 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> * docs(video): EP2 交付表 QA 行按 ISSUE-168 重述——七幕逐幕实测 FAIL 0 · WARN 2 均刻意 🤖 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> * fix(influence): tts_progress 越阈文案改「先分因后处置」——竞争与节流不可混判(ISSUE-169) - 实测:EP3 长跑 ratio 1.4–1.5× 但 pmset -g therm 零告警、vm.loadavg 10+ ⇒ CPU 竞争而非热节流 - 根因:基线 1.868 s/char 取自**机器空闲**长跑,前置条件没写在判据旁 ⇒ 常态被读成异常 - 修:越阈时打印 loadavg/therm 两条自检与两条分支结论(竞争=产物无损重排期 / 节流=中止验证环境); 基线常量旁补注分母条件与本次实测证据 - 同时修纪律违反:渲染队列曾与 TTS 同机并跑(把比值从 ~1.0× 推到 1.40×), 队列改为每集渲染前等 TTS 进程消失 + 冷却 3 分钟 - issue.md 立 ISSUE-169:性能判据必须带上分母的前置条件;越阈给分因动作而非结论 🤖 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> * docs(video): series.md 五集状态同步(EP2 已交付,EP3-5 场景就绪待配音) 🤖 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> * feat(video): EP3《AI 的记忆》交付——成片 13:12.26,全门绿 - 终渲 out/final.mp4 13:12.26 · 1920×1080@30 · 34.4 MB;srt/vtt 各 140 cue - 七幕抽帧 FAIL 0(WARN 2 均为刻意设计:p5 时间铰链对照期、p6 金句卡停留);尾幕必查与全分辨率复检 FAIL 0 · WARN 0 - 实测:纯语音 12.36 分 / 语速 315 字/分;含时距 13.2 分落窗 [13.0,14.6] 🤖 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> * fix(video): EP4 旁轨中心上移 40px——修 p1-10 命令块压入字幕安全带的真实侵入 - 七幕体检 WARN p1-10 亮块 x463-656 经像素定位与几何复算定位:WorkBlock 沿旁轨缓行至 底部 180° 处(TRACK_CY=560, r=346)底边 y≈934,压入安全带 [H-160,H-132)=[920,948) - 修:TRACK_CY 560→520,底部底边 894 < 920 ✓;still 单帧复验侵入消失 - 性质:过渡性缺陷(块滑过底部约 2s),但几何判据抓得对——修后重渲 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(video): EP5 补 2 句落窗(实测语速 5.34 字/秒快于预估,12.9 分差 0.1 分) - 实测 131 句 12.9 分低于 13.0 下限;按实测口径补 53 字 → P2/P5 幕末各 1 句回收句 - 分镜 5-C/5-D 区间重切(10..17 / 18..24);场景 beat 区间同步;tsc 零错 - 增量合成 2 句后时长门与 manifest 门自动复验 🤖 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> * feat(video): EP5《一群 AI 怎么干活》交付——成片 13:01.08,系列收官集 - 终渲 out/final.mp4 13:01.08 · 1920×1080@30 · 42.4 MB;srt/vtt 各 133 cue - 七幕抽帧 FAIL 0 · WARN 0(系列唯一全零警告);终渲尾幕 FAIL 0(WARN 1 为收束四连图刻意停留) - 实测含时距 13.1 分落窗 [13.0,14.6];系列终曲帧(环从传送带中央升起重描一遍)兑现 🤖 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> * feat(video): EP4《AI 会自己开工吗》交付——成片 13:06.71(含 p1-10 侵入修复重渲) - 终渲 out/final.mp4 13:06.71 · 1920×1080@30 · 40.9 MB;srt/vtt 各 139 cue - 七幕 FAIL 0 · WARN 1(p6 收尾卡刻意停留);p1-10 旁轨安全带侵入经 TRACK_CY 上移修复并复检消失 - 终渲尾幕全分辨率 FAIL 0 · WARN 0;实测含时距 13.1 分落窗 - 至此系列五集全部交付 🤖 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> * docs: CHANGELOG 增《Claude Code 通俗全解》系列五集交付与基建沉淀 🤖 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> * docs(video): 四集交付件行补 cover.png(终渲后补生成) 🤖 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> * fix(video): EP1 三处画面缺陷修复 + 交付记录订正(重渲 14:14.73); 三处都落在自动判据的盲区——`--check` 只查黑帧/重复帧/字幕安全区侵入,看不见 文字朝向、几何锚点与图层遮挡,故当时的「FAIL 0」并不构成这三点的证据。全部靠 `remotion still` 逐帧目视定位,修完抽同一帧对照。 - 6-A(P6Ending):`rotate(ang)` 罩住整个 `<g>`,挂点角度变成文字角度——「闸门」 卡侧倒 90°、「插口」卡上下颠倒,两张卡文字不可读;卡心落位半径又恰等于环半径, 卡片压在环线上,与底部「挂件 ×3,都挂在外面」自相矛盾。改为卡片组 `rotate(-ang)` 反向抵消(只让挂脚吃角度),挂脚长度由 `RING_R = size/2 - 46` 反算(与外框参 R 差 8px,直接用 R 会悬空),挂点角 −30/90/210 → −45/75/195 避开 LoopRing 四个 节点文案所在方位(否则挂脚横穿「执行工具」)。 - 5-B(P5Stack):「20–28 行实测带」锚在区间上界 + `+90` 比柱底实距多 45px,带体 悬在四柱 core 段上方约 60px,没压住它要度量的橙色段。改锚下界 `yFor(20) + BAR_BASE`;标注移到带右侧空白区(原位置与四柱各自的 loop 行数同高度相撞)。 - 3-C(P3Gates):allow/ask/deny 小抄 `top: 150` 与 GateRouter 的闸门名(`y - h - 18`, 本幕 y≈243)相交,「拒绝表 / 规则匹配」被完全盖住、只剩「问你」露出。小抄上移 到 `top: 56`,整体收在闸柱之上。 同轮订正两处失实交付数字:时长 14:12.52 → 14:14.73(narration / manifest / timing.json 本轮零改动,`total_duration_in_frames` 复算恒为 25642 帧 @30fps, 画面改动不可能改变时长);终渲抽帧 WARN 0 → WARN 1(0-D 标题卡跨两句静止,刻意)。 成因正是本轮修掉的 ISSUE-168 形态:旧 `--scene` 单值 store 只查末幕,出来的 「WARN 0」与「全幕通过」不可区分。 验证:`tsc --noEmit` 通过;终渲重跑 25642 帧 / 7.8 分钟 / 42.6 MB;七幕全分辨率 抽帧 FAIL 0 · WARN 1(刻意);`check_script` FAIL 0 WARN 0;三处修复各抽同帧 (24900 / 22960 / 13120)目视对照确认。 🤖 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> * fix(pipeline): sync 行数口径纠错 + --scene append 的真实声明面守卫; - `source_ledger.cmd_sync`:f-string 里的 `b'\\n'` 是「反斜杠 + n」两字节字面量而非 换行,打印出的 lines 数其实是文本中字面 `\n` 的出现次数——对 `code.py` 这类归档 会是个看着像真数的非零值,且与同一函数上方写进台账的 `raw.count(b"\n")` 不一致 (`cmd_fetch` 的同一行用的是 `b'\n'`,本处是新增时抄漏)。打桩复验:4 行载荷修复 前打 1、修复后打 4,与台账一致。 - `test_qa_checks`:原「真实声明面」守卫是死代码——`qa_frames` 没有 `build_parser` (parser 在 `main()` 里就地构造),`hasattr` 恒假,`_AppendAction` 断言从不执行, 注释写的「防有人改回 store」这层保护实际不存在,而同一用例上半段测的是测试内 自建的 parser,改回 `store` 不会让任何用例变红。改为 AST 取 `add_argument` 的 action 字面量(不用字符串匹配:ruff format 改换行必漂),且找不到该 flag 直接 硬失败——「检测器自己失效」不允许退化成静默放行,那正是被替换掉的那种写法。 受检面同时覆盖 `qa_frames.py` 与 `pipeline.py` 两端:后者若退回单值,多幕会在 编排器这一层就被丢掉。 判据自身已做负控:`--last-n`(无 action)返回 None、`--check` 返回 store_true、 未知 flag 抛 AssertionError,确认不会空过。 验证:231 passed;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> * docs(influence): CHANGELOG 段落归类订正 + 新集清单第 4 步自相矛盾修复; - CHANGELOG:`### Added` 此前插在 `### Changed` 与它原有的条目之间,导致 Changed 成空节,而「`media/` 迁移为 `apps/negentropy-influence/`」这条本属 Changed 的条目 落到了 Added 名下。把 `### Changed` 下移到该条目之前,两节各归其位。 同步订正 EP1 的两个数字:成片 14:12.52 → 14:14.73(narration/timing 零改动 ⇒ 时长不变,可复算恒为 25642 帧 @30fps)、抽帧 WARN 0 → WARN 1(0-D 标题卡跨两句 静止,刻意),并记入评审三修。 - pipeline/README 新集清单第 4 步:本轮给规则 4 加了反向登记的阻塞门并在步骤开头 写明,但同一段仍留着「注意**漏登没有阻塞门**:`check_series.py` 只遍历 series.json (看不见孤儿目录)……登记义务靠这条警告 + 本清单自觉执行」的旧叙述,前后自相矛盾 (`verify_skeleton.py` 的同款注释这轮已改,此处漏改)。改写为分级判据的**理由**: 脚手架期 WARN 是为了避开「先登记要先定色板色值、先写要先登记」的死锁, narration.md 落盘即转 FAIL;漂移门保持 WARN,阻塞执法只放 check_series 一处。 🤖 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> * fix(influence): 评审四修——EP1 入场瞬态压字幕带 + 四集交付时长复算订正; 五条评审意见的落地。两条是真缺陷,三条是记录/表述订正。 - **ISSUE-170 EP1 6-A 挂件卡入场瞬态压字幕安全带**:径向滑入起点写死 `px = 1.6`,「闸门」卡(ang=75°)起点下沿到 y≈1047,入场约 10 帧被字幕条 切掉下半(含副标题「守着底线」),而落位态 y≈836 干净——`qa_frames` 每幕按句抽 ~8 帧,覆盖不到这 0.33 秒。改为逐卡反算起步倍率:向下入场的卡 按「下沿贴住 `SAFE_TOP_Y = 1080 - 160`」封顶(与 `qa_frames.SUBTITLE_BAND_PX` 同口径),向上的两张不受限、仍走完整行程。已重渲终片(473s)并抽第 24658/24662/24666/24674 帧对照,七幕 `--check` 复检 FAIL 0 · WARN 1 (仍为 0-D 刻意静止),时长仍为 25642 帧 = 14:14.73。 - **ISSUE-171 EP2–EP5 交付时长统一短 2.19 秒**:四集的数字非按 `total_duration_in_frames` 复算(复算值与 ffprobe 逐帧吻合),且被抄进 series.json / series.md / 各集 README / CHANGELOG 四处。全部回填为 13:14.00 / 13:14.47 / 13:08.90 / 13:03.27,并把帧数复算式与数字写在一起; 容量单位统一为 MB(planning/memory 原按 MiB 写)。 - **EP1 交付记录订正**:series.json / series.md 仍留着本分支自己声明作废的 14:12.52 · 42.7 MB · WARN 0,同步为 14:14.73 · 42.6 MB · WARN 1。 - P0Hook 剪贴板 `interpolate(frame, [0,24], [0.9,0.9])` 恒等于 0.9,是改写 残件(老化实际做在下方 line 的 `0.3 - i*0.06`),改为字面量并订正注释。 - `POLYPHONE_CANDIDATES` 的「卷」例词:卷起读 juǎn、与卷积同调不成对照, 四声一支改为「试卷/问卷」。 验证:pytest 242 passed;check_series FAIL 0 · WARN 0;verify_skeleton 未登记 漂移 0;五集 `check_script --check-scenes` 全 FAIL 0 · WARN 0;EP1 tsc 干净; 五集时长/容量四处一致性由脚本逐项复算比对通过。 🤖 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> * fix(pipeline): --series 扇出逐字转发子命令 flag,修静默缩小检查面; `pipeline.py --series <id> check --check-scenes` 中 argparse 正常解析了 `--check-scenes`,但 fanout() 拼子进程命令时只写 `--project <root>` 与 cmd, 五集全部按不带该 flag 的窄检查跑完,扇出汇总照样逐集打 ✅——输出与「全集 全项通过」逐字不可区分。与 ISSUE-168 的 `--scene` 单值 store 同一族(静默 缩小检查面),只是这次搬到了编排器层。 变更: - 新增纯函数 sub_argv(cmd, argv):从命令行切出子命令之后的原样 token 逐字 转发,不按 Namespace 重建——重建面等于 dest→flag 抄件,抄件漏登记正是本 bug 的成因;切片对新增 flag 零维护,声明面仍只有 argparse 一处。 - 新增 GLOBAL_OPTS_WITH_VALUE 显式登记带取值的顶层选项,切片时连值一起跳; 否则 `--series check check` 这类「系列 id 恰与子命令同名」会命中取值、从 错误位置开始切。 - 扇出头部行打出「· 转发 <flags>」,把检查面写进判定行(ISSUE-168 防范 2)。 - 模块 docstring 与 --series 帮助文案同步声明转发语义。 回归:test_stages 补两条(转发语义 across 四种 argv 形态、同名取值不切错), 并断言 GLOBAL_OPTS_WITH_VALUE 在册项完整。实测扇出五集均收到 `check --check-scenes` 且全绿。 🤖 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> * fix(influence): 取证归档补齐上游 MIT 许可声明——归档即再分发; 四集 research/source-archive/ 下归档了上游课程的原样字节共 32 文件 / 15946 行(单文件最大 2130 行),但归档树内没有任何 LICENSE / NOTICE / 版权声明。上游是 MIT(source-map 与台账均登记 license = "MIT",片尾信源卡 也打了「许可 MIT」),而 MIT 明文要求「所有副本或实质性部分」附带版权与 许可声明——整文件级 vendor 属实质性部分。 根因:归档这一步是为取证设计的,判据全落在可复现性上(双指纹 / 固定提交 / 取数日期),没人问「这批字节进仓之后仓库在做什么」。答案是在再分发。取证与 再分发是同一动作的两个面,合规判据只挂在后一面上。 变更: - 四集 source-archive/ 各放上游同一固定提交(67a9126c)下的 LICENSE 字节 副本(MIT,(c) 2024 shareAI Lab,sha256 204ff5ee…)+ README.md 出处表 (上游项目 / 仓库 / 许可 / 固定提交 / 取数日期 / 指纹台账位置;章节归属 只链接系列地图不重述)。 - skills/01 §多章批量取证 增第 4 步「归档即分发,许可声明必须随副本落地」, 并写明这是单一事实源纪律的唯一显式例外——各集工程目录是可被单独取出、 单独交付的单位,声明收敛到系列级一处,取出单集时就会丢;上游无许可文件或 不允许再分发时不建归档,只留台账指纹并在 source-notes 记明理由。 - test_source_map 加两条门:有归档必有 LICENSE + README.md;LICENSE 非空且 含 Copyright 行(防空文件占位)。实测删掉一份 LICENSE 门会红,非空转。 🤖 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> * docs(influence): 订正三处文档漂移 + 立 ISSUE-172/173 + 移除会漂的测试条数; 评审五修的文档面收口。四处订正: 1. pipeline/README.md 工具表仍写 check_series「五规则」且枚举缺「可渲染性」 ——规则 6 上线时模块 docstring 与测试标题都改了,这张抄件漏了。 2. knowledge-map.md 两处:check_series 同款「五规则」抄件;新系列条目仍只列 EP1 一集且信源只写 s01–s04 + f9e8b28,而 series.json/series.md 现为 5 集 全部已交付、双钉(首集 main f9e8b28 17 章版,其余四集站点同源 67a9126c 20 章版)。该条是「两个系列」总览的唯一入口,停在 1 集会让跨上下文检索 直接错过 EP2–EP5。顺带补上 pipeline.py 的 clean-samples 与 --series 扇出、 以及本轮新增工具(--pre-tts / --pron-candidates / --stills-plan / sync+audit / tts_progress)。 3. check_series.py 规则 6 内一行注释把兜底门错指为「规则 4 的 theme.ts WARN」——跳过的判据是 Main.tsx 缺失,规则 4 那条 WARN 只管 theme.ts, 实际兜底的是 verify_skeleton 的 regioned 受门档。在这个把注释当规格写的 文件里,错误的交叉引用会让后来者去找一条不存在的 WARN。 4. CHANGELOG 的「测试 188 → 242」违反 pyproject.toml pytest 节明文规定的 「刻意不在任何文档里写测试条数」,且本轮 +4 用例后当场变陈旧——正好印证 该规定。改为指向判据出处,不再写数。 新增 ISSUE-172(扇出丢弃子命令 flag,ISSUE-168「静默缩小检查面」第四个面) 与 ISSUE-173(归档上游 MIT 源码未带许可声明),CHANGELOG 同步登记。 🤖 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>
… + 视觉升级(草渲待审) (#1114) * feat(influence): 系列更名《Claude Code Harness Engineering》——五层标题体系 + 去站点化清零 + 规则 7 执法落地; 系列定位从「介绍开源课程」升级为「拆解 harness 工程」:官方术语表已正式定义 Agentic harness, how-it-works 页明确「Claude Code 是 harness、Claude 是里面的模型」,官方博客《A harness for every task》直接使用该词——更名有权威出处。 - **五层标题体系**(标题只进画面与元数据不进口播,配音成本零):执行层《一个循环,就是全部》→ 规划层《模型的视野是安排出来的》→ 记忆层《会丢的和不能丢的》→ 时机层《谁来按下开始》→ 协作层《从一个到一群》;series.json/md、五集 planning/README/场景标题卡、knowledge-map、 source-map 头部同步(series.id 与 slug 不动——台账派生命名的锚)。 - **去站点化清零**(60 句口播 + 25 处画面字符串 + 分镜信源卡行):三级证据归属不点名化 (「课程作者拆过源码,他说…」→「有人拆过它的源码——」),章号角标去 sNN 前缀保机制英文名, State 表 ch 列改机制域,P6 信源卡换「官方文档/工程博客/源码分析/实测口径」四行——观众层 匿名化、仓内 research/ 取证链保留具名归属。 - **check_series 规则 7**:观众可见层禁课程站点标识(按系列豁免论文系「站点」一词), 负控验证改造前 259 FAIL 全落课程系、清零后 FAIL 0 · WARN 0;8 个新测试用例。 - skills/06 沉淀五层 HarnessStack 母题规格 + 五集统一动效语法(flow/pushIn/glow/meter/settle) + 信源卡新四行;CHANGELOG 登记。 - TTS 影响实测:60 句改写 ⇒ 5 集共 60 句待重配(156/121/127/131/121 命中),音色样本 me-bright 已按指纹重建(sha1 54b699cce97f 一致)。 🤖 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> * feat(video): 五集 Harness Engineering 内容与视觉改造——官方锚点替换 + 首尾统一 + 图解升级; 中度改造(换约 1/3,字数净守恒):五集口播 v-next + 分镜同步 + 场景组件升级。全部集实测口径 落在 13.0–14.6 分钟窗口(EP1 3932 字 / EP2 3669 / EP3 3805 / EP4 3702 / EP5 3688)。 - **EP1 执行层**:P0 压缩为 3 镜钩子(命名帧「挽具」+ 官方引文 + 五辐条供给图); 1-E 升级官方三相环(收集/行动/验证交融 + 人可打断针 + State 十格角标化); 3-F 换官方求值顺序流水线(deny→ask→allow 首中即出局 + 裸名 deny 工具消失); 3-G 换 auto 分类器视野分屏(做减法的监视器 + 反注入弹回帧);4-F 换 31 事件三层嵌套 (会话/回合/工具调用三节奏,官方口径);4-G 拆六闸流水线(官方 SDK 权限判定图)+ 印章对撞高潮保留;P6 新下期预告卡 + 信源四行化。 - **EP2 规划层**:P0 钩子提速(12→8 句)+「收回」钢印悬念;1-D 换退位帧(官方默认停用 清单工具 +「零件押注会过期」);子代理三层二十并发官方直断;技能常驻重注入修正;P6 分水岭收尾。 - **EP3 记忆层**:context rot 官方实测;官方两级策略背书;压缩存活矩阵(谁活过压缩); 记忆两条腿框架(你写的四层拼接 + 它写的自动记忆);前缀缓存钩;「都是上下文不是闸门」收尾。 - **EP4 时机层**:P0 时间盲症钩子(官方博客原话);超时自动转后台 + 三类例外;三档调度官方化; P5 后台会话托管(管家进程 + 六状态 + 穿重启续跑);P6 官方四件套画像收尾。 - **EP5 协作层**:P0 官方三失败模式症状卡;看板文件锁/信箱磁盘路径官方直断(三→二级证据升级); 三禁止章(组队不是权限洗白);worktree 四道闸(第四道不能关);MCP 延迟装载竖槽; 6-D 新「谁持有计划」四象纲图(分水岭 + 运行时三分区 + 收官反转「挽具第一次由它自己来写」); FullTurn 快闪化;官方十五倍 token 冷水。 门:check_series FAIL 0 · WARN 0(规则 7 零残留);五集内容门除 manifest 待重配外全绿 (分镜覆盖/读法陷阱/时长双口径全过);五集 tsc --noEmit 零错误;pipeline 测试 254 全过。 🤖 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> * feat(video): 二批视觉镜升级——官方直断图解、信源卡统一、症状卡与管家帧; 接续 d97c46a 的五集内容改造,落地剩余高价值图解与统一化: - **EP5 协作层**:2-E 换「三禁止章」镜(A→B 消息被来源标签截停盖灰 + 三枚 deny 红章 「不能替你批权限/不能代你同意/被拒的不能转给别人」——官方 agent-teams 直断); 0-A 加官方三失败模式症状卡(agentic laziness / self-preferential bias / goal drift, 源自官方博客《A harness for every task》)。 - **EP4 时机层**:5-D 换「管家进程托管」镜(不眠的眼睛 + 六状态胶囊 + 状态落盘穿重启 + 接回续跑双卡——官方 agent-view);0-B 加时间盲症官方引文条。 - **EP3 记忆层**:3-C 换「压缩存活矩阵」镜(四行卡片:系统提示绕行不变/规则与自动记忆 磁盘重注入/带路径规则丢到再读/技能正文重注入封顶五千——官方 context-window 口径) 并保留回捞钩动画。 - **EP2 规划层**:1-D 挂载退位帧组件(官方公告条 +「收回」钢印 + 任务系统预告)。 - **五集信源卡统一四行**:官方文档+取数日期 / 工程博客 / 源码分析已逐处标注 / 数字口径 (开源仓库钉版实测)——仓内取证链不动,观众层统一。 门:check_series FAIL 0 · WARN 0;五集 tsc --noEmit 零错误。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * feat(video): EP1 2-B 官方五类工具分区条 + EP2 2-E 等号锁角标官方化; EP1 2-B:五张工具卡下加官方分区标注(文件/搜索),两个虚线空槽示意官方地图另有 执行/网页/代码智能三类——角标引 how-claude-code-works。EP2 2-E:fork 等号锁的 证据等级从第三方源码分析升为官方文档 sub-agents 直断(fork 继承完整对话·共享提示缓存)。 🤖 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> * feat(video): EP3 两条腿框架与前缀缓存钩——4-C 分栏 + 4-E 三层前缀条; 4-C:LedgerArrives 包入 TwoLegsFrame——左腿「你写的」(四层拼接不覆盖/越近后读/四兆上限/ 超两百行不听话)右腿「它自己写的」(自动记忆按四类落卡、25KB/200 行门限、压缩后重注入), 中央保留登记簿动画。4-E:TwoPaths 后挂 PrefixCacheStrip——系统提示→项目上下文→对话三层条, 顶层一动下层全红重算,「改规则要新开会话/中途换模型那轮慢」注解浮出(官方 prompt-caching 口径)。 🤖 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> * feat(video): EP5 5-B 四道闸墙——官方 worktrees 隔离四检查的可视化; 编辑闸/目录闸/重定向闸/形状闸四卡依次落下,第四道焊死带锁标「这道不能关」—— 官方 worktrees 文档的隔离四检查(取数2026年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> * feat(video): EP4 1-A 超时转道镜位更名——官方真机制替换关键词兜底叙事; 分镜与 Sequence name 同步更名(组件动效保留,kwAt 时点锚现驱动超时线帧)。 🤖 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> * docs(video): 五集阶段④双校验记录(Harness Engineering 改造版); 每集新断言逐条回溯官方文档/工程博客锚点(证据级【二】为主、三级断言保留归属句), 含口径切换记录(EP1 hooks 27→31)、易懂性检查与遗留决策。 🤖 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> * docs(video): 五集 README 补 Harness Engineering 改造状态行; 🤖 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> * feat(video): EP2–5 补足时长窗口——预算笼子/检查点/缓存价目/双路监视/发条/名册/六模式/resume; 实测口径低于 13.0 下限(改稿删句后句间停顿开销下降)——按简报补回高价值官方内容(字母后缀 id 保缓存): EP2 +三只笼子与检查点盲区;EP3 +前缀缓存价目(读一折写加四分之一);EP4 +轮询走廊 vs 事件传送带 与自定速发条;EP5 +团队名册文件、六模式选二(扇出汇总/对抗核验)、resume 重放规矩。 五集估算口径回到 13.5–13.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> * feat(video): 五集内容门全绿——实测口径 13.1–13.9 分钟全数入窗; EP2 再补目录纸两档(两三万字 vs 极简两行)与两百行不听话句;EP5 补消息即文字/信箱不搬桌 两句;EP4 3-B 场景锚扩至 09c。五集 check --check-scenes FAIL 0 · WARN 0,check_series 全绿。 🤖 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> * fix(video): EP5 6-D 场景锚扩至 p6-11d(resume 四句并入纲图镜); 🤖 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> * feat(video): 五集草渲交付——Harness Engineering 改造版全链路就绪(终渲待审); 草渲产物(out/draft.mp4,0.5×/jpeg60):EP1 13:56(25096帧) · EP2 13:10 · EP3 13:06 · EP4 13:07 · EP5 13:08(合计 67.3 分钟)。series.json 状态 → draft-review。 验证链:内容门(build/check --check-scenes)五集 FAIL 0 · WARN 0;check_series(含 规则 7 去站点化)FAIL 0 · WARN 0;七幕抽帧 + 尾幕末 6 句自动体检 FAIL 0(3 条 WARN 均为金句卡/收束段刻意静止,与已上线集同款);16 个高风险新图解帧 remotion still 逐帧目检通过;srt/vtt 字幕五集全出。 🤖 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> * feat(video): Harness 术语还原英文——口播 9 句、画面大字与引文、文档层统一; 用户审核意见:所有 Harness 的中文翻译(挽具等)还原为英文 Harness。 - 口播 9 句重写并重配(EP1×6 / EP3×1 / EP5×1,Harness 走 IndexTTS 英文直读通道—— 与产品名 Claude Code 同款已在 5 集成片验证);narration 头部纪律注释同步(英文口播 例外:Claude Code 与 Harness)。 - 画面:命名帧大字「挽 具」→「Harness」(letterSpacing 收窄)、官方引文条、 EP5 收官反转金句、P0/P6 注释与 Sequence name。 - 文档层:storyboard/planning/verification×2/series.json/series.md 统一; 自动生成物(narration.json/manifest)随 build+tts 重写。 - 三集重渲(EP1/EP3/EP5)+ P0/P6 抽帧体检 FAIL 0 + 命名帧/反转帧目检通过 (英文 Harness 无乱码、无重叠、字幕区干净);EP4 场景锚顺手修至 p5-23b(清掉 一条既有 WARN)。试听样本 out/harness-pron-sample.mp3 供人耳确认英文读音。 🤖 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> * fix(video): check_series 规则7 章号正则补 CJK 贴邻盲区 + 新增规则8 下期卡同步门; - 规则 7 章号分支弃用 \b 锚(CJK 汉字属 \w,「对应s01」类无空格贴邻写法不构成边界、恰好逃过执法),改 ASCII 侧环视 (?<![A-Za-z0-9_])s(?:0[1-9]|1[0-9]|20)(?![A-Za-z0-9_])——s01e02/as01/s01_agent_loop 排除行为与原版一致,s01-readme 连字符续接恢复命中; - 新增规则 8:配了「身份卡+下期卡」收尾装置的系列(NEXT_CARD_SERIES_IDS),P6 场景文本必须含本集/下集标题主段(「:」后半)——硬编码标题在更名/改题时静默变陈旧,提交前机械化拦住;论文系无此装置不进门; - 测试补 4+4 用例:章号 CJK 贴邻双侧命中、ASCII 词符贴邻豁免;规则 8 陈旧预告 FAIL/身份卡缺失 FAIL/同步 PASS/论文系静默。 🤖 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> * fix(video): 时长口径三处按复算修正 + skills/06 五层栈规格标注未落地状态; - series.json statusNote 帧数对齐 total_duration_in_frames 复算:EP1 25096→25151(13:58,含 p5-06 新句配音)、EP3 23607→23622(13:07)、EP5 23667→23666;CHANGELOG 五集时长行同步(13:58/13:10/13:07/13:07/13:08,合计 66.5 分钟)——「时长一律复算不抄上次输出」纪律落地; - skills/06 五层 HarnessStack 节补「落地状态」块:规格先行未落地(草渲不含该装置),防止 SSOT 与已交付事实漂移;「读 series.json」表述改为「派生自 series.json」(与硬编码+规则 8 对账的实现口径一致); - ISSUE-174 沉淀:tts.py 显式 --seed 会改缓存摘要后缀——单句补配触发整集重录且旧缓存被新签名覆盖;处置=立即中断+基线参数重跑恢复;防范=补配单句永不传 --seed,改 sampling 参数先 --plan 看失配面; - EP1 README 改造状态行更新:配音完成(167 句全缓存,tts --plan 待合成 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> * fix(video): EP1 评审三修——p5 官方四件套映射、P0 引文补英文原句、下期卡注释对齐; - p5-05/06 口播映射错位修正:原句「正好填进前三格;第四格先空着」与官方四件套词序对不上(本集未覆盖的是第三格「上下文管理」,非第四格「护栏」——护栏=P3 已讲),改为「这集填上了三件,上下文管理那格先空着,留到后面拆」(narration.md/json 同步,p5-06 重配音,新时长 5.04s); - P5Stack 5-A 增官方四件套标尺:四格横排(循环/工具/上下文管理/护栏)落下,p5-06 三根竖连线把本集三层接到对应格(循环↔循环、分发表↔工具、插口↔护栏),「上下文管理」虚线空置+「空着·后面拆」小标;storyboard 5-A 同步; - P0 命名帧引文条补英文原句 "Claude Code is the harness, Claude is the model."(italic 副行),对齐分镜 0-B 的中英并列承诺; - P6Ending 下期卡注释修正「读 series.json」为「series.json 派生硬编码镜像,规则 8 对账」;storyboard 6-B 同步; - 草渲重渲:25151 帧(838.37s)与 computeTimeline 复算逐帧一致;七幕抽帧自动体检 FAIL 0 · WARN 0;p5-05/06、p0-05 改动帧成片目检通过;captions 重生成 167 cue;tsc --noEmit 通过。 🤖 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> * fix(video): EP4 p1-11 补回缺失动词——「——了个大实话」改「说了句大实话」(md+json 同步); 🤖 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> * fix(video): EP2 评审三补——P0 收回钢印+五样装置列队、2-F 三只笼子、4-E 检查点卡+金句锚改 p4-22(分镜同步); 🤖 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> * fix(video): EP3 评审补价目条——PrefixCacheStrip 增 p4-25a/b 命中×0.1·写入+1/4·两次回本(分镜同步); 🤖 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> * fix(video): EP4 评审四补——0-C 三无小图+两步预告重建、3-B 双路监视、4-E 三档调度重建、5-E 自定速发条; 🤖 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> * fix(video): EP5/EP1 评审三补——6-D 六模式选二+resume 重放、6-E 零件四连+十五倍条先行、EP1 身份卡删旧副题残片; 🤖 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> * fix(video): EP5 评审修复一——6-D resume 死门改换页时序+分水岭竖线移入列间隙、2-E 补名册/对比卡两页(分镜同步); - 6-D 底部条带改三段互斥换页(三分区→六模式→resume),原 `frame >= resumeAt && twist <= 0` 因 twistAt 绑 p6-11 早于 p6-11c 恒假,resume 卡从未渲染 - 分水岭竖线 CX 由列布局推导(1239→画布 1319 列间隙中心),原 960 压在「队友」卡身上; 线高 420→370 避开条带辉光 - 2-E ThreeProhibitions 增中景两页:p2-23a/b 名册卡(成员+信箱、会话结束划行清空+虚线框)、 p2-24a/b 信箱一段文字 vs 整段上下文对比卡——消除后缀四句约 24 秒零视觉支持 - 分镜 2-E 行同步两页描述;remotion still 六帧复检(p2-23a/23b/24b、p6-11b/11c/11d) 全部到位无重叠;内容门/系列门 FAIL 0 🤖 Generated with [Claude Code](https://github.com/claude.com), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * docs(video): 评审修复二——series.md 句数基线对齐 statusNote(135/139/134)、CHANGELOG/EP5 statusNote 标注目检口径与评审修复记录; - series.md EP2 134→135、EP3 140→139、EP5 133→134(与 series.json statusNote 同源) - CHANGELOG「逐帧目检通过」补口径标注(08-23 草渲版)并记录 08-24 评审补 六处图解的 still 复检结论与 EP5 两处评审 bug 修复 - EP5 statusNote 同步评审修复条目 🤖 Generated with [Claude Code](https://github.com/claude.com), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 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>
🤖 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>
🤖 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>
* build(deps): pnpm 升级至 12.2.1,并补齐嵌套工程 workspace 根声明以阻断根 lockfile 被覆写;
pnpm 12.2.1 已发布但 npm `latest` dist-tag 仍指向 11.25.0,本次为知情抢升。
升级过程暴露一个会破坏数据的 v12 回归,故与修复一并原子提交。
升级
- 根 package.json#packageManager → pnpm@12.2.1。integrity 需 hex 而非 registry
的 base64,换算方法先用 11.25.0 反向复算命中仓库原值后才落笔。
- pnpm-lock.yaml +101 行:v12 新增 packageManagerDependencies(多文档 YAML,
doc2 逐字节未变,无依赖重解析)。旧 lockfile 上 --frozen-lockfile 会硬失败,
故这段变更是升级的必要组成而非副产品。
- docker/{frontend,wiki}/Dockerfile 的 `corepack prepare pnpm@latest` 收敛为
`corepack install`,消除与 packageManager 并存的第二事实源。
- pre-commit check-yaml 只豁免 pnpm-lock.yaml(多文档机器产物),手写 YAML 的
单文档约束保持不变,已做反向正控。
回归修复
- 嵌套 Remotion 工程跑 `pnpm install --ignore-workspace` 时,pnpm 12 仍沿
packageManager 向上锚定到仓库根,用本集解析结果覆写根 pnpm-lock.yaml
(overrides 全丢)且当场不报错,故障延后到 Docker 才以
ERR_PNPM_LOCKFILE_CONFIG_MISMATCH 现形。v11 对照组无此行为。
- 修复:8 集 + 骨架模板各加 video/pnpm-workspace.yaml(packages: []),钉为独立
workspace 根;已登记进 skeleton.toml frozen 清单受漂移门执法(17→18 文件)。
给嵌套工程补 packageManager pin 无效,此为唯一有效解。
验证
- pnpm -r typecheck 0 error;pnpm test 1152 passed;pnpm build 三个 Next 应用全绿
- 两个 Docker 镜像本地构建成功(frontend 493MB / wiki 24.6MB)
- pipeline/tests 261 项全绿;verify_skeleton --strict 未登记漂移 0 处
- 嵌套 install 实测根 lockfile 零变更;globalShims 新默认零副作用
- 回滚实测:pnpm 11 可正常读并保留 v12 多文档 lockfile,回滚只需改回 package.json
取证与复现详见 docs/.agents/issue.md ISSUE-175。
🤖 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>
* docs(pnpm-upgrade): 同步 frozen 计数至 15 并落定 travel-agent-ui 的实测风险结论;
评审收口,两处均为 ISSUE-175 变更的文档侧遗留:
1. frozen 计数与 SSOT 对齐(14 → 15)。新增 video/pnpm-workspace.yaml 使
skeleton.toml 的 frozen 清单增至 15 条,但三处散文未同步;scaffold.py 的
计数由清单动态派生(len(skel['classes']['frozen'])),运行时打印 15 而
文档写 14,且无测试或漂移门覆盖这些散文数字。改 pipeline/README.md 两处
与 skills/06 一处。skeleton.toml:50 的「14 个」是带日期的历史实测记录
(2026-08 两系列 4 集观测),非当前计数声明,保持原样。
2. travel-agent-ui 从「尚未验证」升级为实测结论。完整 5 member 夹具复现表明
风险形态与最初推断不同:根 pnpm-workspace.yaml 内注教的裸 pnpm install
不覆写根 lockfile(仅装到仓库根、子目录不生成 node_modules,示例跑不起来
但无数据损失);真正覆写的是 --ignore-workspace——实测根 lockfile
12991 → 12705 行、overrides 归零。故危险路径是「发现裸 install 没装到
子目录 → 照 8 集习惯补 --ignore-workspace」。该目录连 .npmrc 都没有,
三重隔离一条不具备,是本仓唯一还敞着的同款入口;修复方案照搬本次即可,
因不属 pnpm 升级的必要变更而未纳入。
另:评审中曾判定「新增 pnpm-workspace.yaml 使嵌套 install 退出码由 0 变 1、
影响 pipeline.py render 控制流」,经 pnpm 11 基线复测推翻——升级前该命令
即为 EXIT=1(ERR_PNPM_IGNORED_BUILDS),属 ISSUE-076/166 既存噪声,本次
未引入回归,故不作改动。
验证:verify_skeleton 未登记漂移 0 处;pipeline/tests 261 项全绿;
pre-commit 对三份改动文件全通过。
🤖 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>
#1117) * fix(wiki): 新增 remark-math-sanitize 插件净化 PDF 语料病态公式,消除构建期 KaTeX 告警与渲染缺陷; - 货币 \$ 误配对(数学体含 CJK)降级回正文文本,消除百余条 unicodeTextInMathMode 告警 - 未转义 % 补 \%,修复 TeX 注释符吞掉渲染内容(11.5%→15.0% 只显示 11.5) - ‖/∥/• 归一为 \Vert/\parallel/\bullet,消除 unknownSymbol 与 tofu 渲染 - display 公式下标裸 CJK 包进 \text{},走文本模式渲染 - 关键路径:mdast-util-math 把公式值存两份(node.value + data.hChildren 内 hast text 副本,层级 inlineMath/display 不同),须递归同步才能到达 KaTeX - 真实 135 篇内容构建复验:KaTeX 告警 164 → 0,产物 HTML 抽查四类修复全部正确 🤖 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> * fix(wiki): 修正 remark-math-sanitize 四处判据缺陷,补齐回归用例; 依 KaTeX 0.16.47 源码与实机渲染探测,修正插件四处会造成公式丢失或渲染错误的判据: 1. CJK 区间下界字形混淆:`豈`(U+8C48 普通汉字) 误作 `豈`(U+F900 兼容表意文字), 致区间展开为 U+8C48–U+FAFF、误纳谚文音节与代理项码位 U+D800–U+DFFF。 改以转义码位书写并提取 CJK_CLASS 单一常量,消除两处字面量漂移。 2. `%` 转义误豁免文本模式:KaTeX 的 `%` 是 Lexer 构造期设定的 catcode 14, 与数学/文本模式无关,`\text{增长 50%}` 会注释掉闭合 `}` 直接抛 ParseError (实测渲染 .katex-error)。转义改为作用于整串,不再走 replaceOutsideTextMacros。 3. `(?<!\\)%` 单字符回看漏判:`\\%`(换行符紧邻裸 `%`)被误判为已转义, `%` 及其后内容仍被当注释吞掉。改按前导反斜杠奇偶判定,对已转义输入幂等。 4. 文本宏白名单漏项:遗漏 KaTeX 支持的 `\textrm`/`\textsf`/`\textnormal`/ `\textmd`/`\textup`/`\emph`,其内 CJK 逃过剥离后被货币误配对分支整条降级、 丢失公式渲染。按 src/functions/text.ts 的 names 补齐并提为单一常量复用。 验证:新增 4 项回归用例(文本模式 `%`、`\\%` 奇偶判定、`\%` 幂等、文本宏 CJK 不降级、非 CJK 下标不误包),wiki 全量 122 项测试通过;对四处修复逐一做变异 回退,确认各用例均能红灯、无恒真断言;next build 成功且 KaTeX 告警计数为 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> * fix(ui): remark-math-sanitize 同步挂载至 negentropy-ui 插件链,消除两端渲染不对称; negentropy-ui 与 wiki 渲染同一份 PDF 提取语料(知识库文档详情页 / 静态站), 此前仅 wiki 挂载净化插件,两端行为不对称。本次同步挂载。 挂载范围经循证扩大至全局链 defaultRemarkPlugins(非仅文档渲染处):实测 「输入 $3/ 百万 token ,输出 $15/ 百万 token」在未净化链下正文被打乱重复 (`$15` 段渲染成 `$3` 段、中文空格被吞)并触发 5 次 KaTeX 告警——该缺陷源自 remark-math 对相邻货币符的通用误配对,非 PDF 语料专属,而 LLM 回复中报价文本 极常见,故 MessageBubble 等 5 个消费点均需覆盖。 实现要点: - 补 unified@^11.0.5 / unist-util-visit@^5.0.0 显式声明。二者是 remark-math 的 传递依赖,pnpm 严格隔离下未提升至 negentropy-ui,直接复制插件会 TS2307 + 运行时解析失败(同 @types/hast 未 hoist 之坑)。版本与 wiki 端对齐, lockfile 仅新增 2 条声明、复用既有解析,无新包引入。 - 插件采孪生副本而非提为共享包:agents-chat-core 是 AGUI 协议层专属包(tsup 构建), wiki 无 workspace 依赖且以 GitHub Pages 为出口,为单个插件引入构建链爆炸半径过大 (参照 rehype-notranslate 亦为单端持有)。两端文件头互加交叉标注约束单边漂移。 - 修正两端测试中 NBSP 归一化断言,改用显式 转义(字面空格与 NBSP 形近, 与 CJK 字形混淆同源)。 验证:ui 全量 1006 项(122 文件)通过、lint 与 typecheck/typecheck:test 零错误、 next build 成功且 KaTeX 告警计数为 0;wiki 全量 122 项通过无回归;摘除插件做变异 回退确认 4 项新用例(含 DocumentMarkdownRenderer 端到端护栏)均红灯;孪生副本 代码体经 diff 核对逐字节一致。 🤖 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> * ci(twin-files): 新增孪生文件一致性执法,把副本同步从人工纪律升格为机器保证; remark-math-sanitize 因构建边界无法提为共享包,以逐字节副本形式在 wiki 与 ui 两处持有。副本的固有风险是单边漂移:改了一处忘了另一处,缺陷从此静默分叉。 此前仅靠文件头注释约束,本次补上机器执法。 实现(照仓库既有 version-sync-check 三件套范式): - scripts/check_twin_files.py:PEP723 内联依赖脚本,登记表显式列出每组副本 (不用 glob 或内容嗅探猜测),精确字节相等比对,漂移时打印统一 diff 指明 行号与同步方向。只读不自动同步——哪份权威取决于改动意图,机器不该代猜。 - 两端副本的交叉标注改写为对称形式(同时列出全部路径、文字一致),使两文件 逐字节相同。校验遂退化为精确相等,零启发式;连「注释说 A 代码做 B」这类 最危险的漂移也在射程内(启发式剥离注释会放过它)。 - pre-commit 钩子 + CI workflow 双侧执法(后者兜底 --no-verify 绕过的提交)。 - 脚本自检触发覆盖:登记路径若未出现在 pre-commit 的 files 正则与 CI 的 paths 里则报错。二者是独立于登记表的第二/三份清单,漏配会使执法对新增副本组静默 失效,此自检把该风险闭合在脚本内。 验证:四态实测——通过 exit 0;代码漂移 exit 1 并输出精确 diff;副本缺失 exit 1; 纯注释漂移亦被捕获。覆盖自检注入未登记副本组后 exit 1 且点名两份触发清单。 pre-commit 全量 18 钩子通过(含新增 Twin files consistency),逐条暂存验证钩子 Passed 而非 Skipped;wiki 122 项、ui 1006 项测试无回归。 注:曾试图顺带给 scripts/ 加 ruff 门,因该目录不在任何 app 的 [tool.ruff] 覆盖内 会吃默认行宽 88(仓库约定 120),且会对既有 sync_versions.py 提出 3 项无关改动, 已撤回以守最小干预;新脚本自身按 120 行宽通过 ruff 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>
* fix(wiki-export): 启动期以进度与统计取代逐条 blob 日志刷屏; 启动期 Wiki 内容同步(cli.sh → sync-wiki-content.sh → export_wiki_content.py) 实测输出 412 行,其中 403 行为 blob_download_completed,把仅有的汇总行淹没。 根因为两层,只修一层无效: 1. postgres_client 对每次 blob 读取打 INFO——这是 per-IO trace 而非业务事件; 2. export_wiki_content.py 从未调用 configure_logging,也不经 engine.bootstrap, structlog 停留在出厂默认(不过滤 DEBUG + stock 渲染器,故 _name 键泄漏、 格式与后端不一致),NE_LOG_LEVEL 对该脚本完全失效——仅降级日志不会少一行。 变更: - postgres_client: blob_download_completed / blob_download_range_completed 降为 debug(读是 trace);upload / delete 保持 info(写是审计事件),error 分支不动; - 新增 scripts/_logging.py::configure_script_logging(),把 settings.log_* 映射到 项目唯一日志入口,不 import 重型 engine 包;export_wiki_content.py 在重型 import 之前调用(顺序即正确性),并将末尾 print 汇总改为结构化事件; - wiki_export_service: 补 started / publication / progress 日志,进度按 step=max(1, total//10) 节流,每 publication 恒定约 10 行,输出量与语料规模解耦; - 修正 wiki_export_done 的 publications 口径:len(pubs) 漏计注入的 docs pack, 致同一次运行日志报 1 而 CLI 汇总报 2,改用 len(result.publications)。 验证:实跑 sync-wiki-content.sh,日志 412 → 18 行、blob 行 403 → 0、_name 泄漏 0; NE_LOG_LEVEL=DEBUG 下 403 行明细可完整取回(未删除,仅门控);产物零回归—— 547 文件 / 403 assets 与改前逐字节一致,diff 仅 index.json 的 generated_at 不同; 新增回归用例(capture_logs 断言进度有界 + publications 计数),改前失败改后通过; knowledge 单测与 storage 集成测试 1086 passed。 🤖 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> * fix(wiki-export): 失败路径改走 logger.exception,避免被 NE_LOG_LEVEL≥WARNING 门控为静默失败; 🤖 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>
* docs(tts): 声音克隆判据体系补内容侧噪声地板,并勘误 emo_bias 的立论误用; 为「抑扬顿挫」备选音色做选段与向量 A/B 时核出三项与定档决策无关、但会误导后续工作的 问题,逐项落档(纯注释与文档,未改任何预设数值 ⇒ 已上线 8 集缓存零影响)。 1. emo_bias 立论勘误(tts.py sunny-pure 注释 + ADVANCED §3.2 告警块) 施加 bias 的 normalize_emo_vec(infer_v2_5.py:488)全仓唯一调用点是 webui.py:665; infer() 内对 emo_vector 的唯一变换是 :605-607 的 int(x*alpha*10000)/10000,无 bias 相乘。故本管线名义权重即实际权重。sunny-pure(路线图 #10)原注以「surprised 只兑付 69%、calm 56%」论证「配料维度不划算」,把 WebUI 语义套到了本管线的调用路径上,该 理由作废,本档退回纯 alpha 语义论证。反向证据:bias 表里被下调的恰是 surprised/calm, 说明上游认为二者在名义权重下偏强。另记 emo_num=[3,17,2,8,4,5,10,24]——happy 仅 3 个 原型(明快度天花板,加权重加不出来),surprised 有 10 个。 2. 新增 ADVANCED §6.6:内容侧噪声地板与三条判据设计教训 §6.4–6.5 只解决了耗时侧可测量性,内容侧一直缺地板值。实测固定 seed 后音频逐字节 可复现(热节流污染耗时不污染采样轨迹)⇒ 内容 A/B 免 75s 冷却,一轮 35 次合成从数 小时压到约 18 分钟;但换一条 take 的 |ΔIQR_rel| 中位达 10.4%,故韵律类参数的最小 可归因效应量约 21%。配套三条教训:主指标须无量纲(IQR_rel,否则「整体抬高」会假装 成「起伏变大」);身份护栏用中位而非逐句最大值(生产档自己就有单句冲到 186.9 Hz); n=7 下看符号一致性而非只看中位。 3. 新增 VOICE-CLONING §3.3b:第二轮选段勘探(含从未勘探的 me-full-*,663 s) 另立新表而不追加旧表——旧表质心列是路线图 #13 改「限带质心」前的尺子,混排即错。 me-1 @106S 的 IQR_rel 较成片在用段高 18%、静音占比高 0.08;新增两个「样本起伏高但 克隆起伏反而低」的反例,再次确认唯一有效判据是纯克隆小样;并指出旧表小样列自带约 ±10% take 噪声,行间小于 10% 的差异不可解读。 顺带修正 4 处过期档数(写死的「7 档」,实际已 9 档)——数量的事实源在代码,文档改为 不复制该数字。 🤖 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> * fix(tts): 修复声音克隆复现与实验口径文档; 同步样本命令、bias 语义、噪声阈值、章节编号与统计说明,避免误用并保持运行时行为不变。 🤖 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>
🤖 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>
* feat(tts): 新增内容寻址音频版本库,改稿跨工作区只重配变更句; 集内 audio/ 属 gitignored 本地产物,换 worktree/清盘即丢整集克隆合成成果(Claude Code 系列 mp3 已实测全量遗失)。版本库按「集 slug + 句 id + digest 前 12 位」落机器级持久 目录(默认 ~/Library/Application Support/negentropy-influence/tts-store,NE_TTS_STORE 可覆盖,--no-store 禁用):合成成功入库、集内缓存 miss 先按 digest 回收、--plan 报 「版本库可回收 N 句」并按净合成量估时;不同 digest 并存保留历史版本,整体换风格重配 除外。仅接 indextts(edge 秒级重合成无资产可丢)。纯函数契约由 test_tts_store.py 六用例钉死(回收等价缓存命中/digest 失配 miss/版本并存/同 digest 刷新/禁用直通/环境覆盖)。 🤖 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> * build(pnpm): 构建脚本许可迁 pnpm-workspace.yaml allowBuilds,修复 pnpm 12 安装中断; pnpm 12 不再读取 package.json 的 pnpm.onlyBuiltDependencies 字段:esbuild 构建脚本被静默 忽略,安装以 ERR_PNPM_IGNORED_BUILDS 中断、node_modules 半残(tsc 在而 esbuild 缺)。许可 迁至 pnpm-workspace.yaml 的 allowBuilds 键(与 `pnpm approve-builds esbuild --yes` 实际写入 形态逐字一致),并删除 package.json 中已死的 pnpm 字段。模板与 8 集同步(frozen/structured 档执法面),根 lockfile 零改动。 🤖 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> * feat(qa): 抽帧体检新增 beat 头部连抽与 A/B 对拍,动效列 @动词 标注机检闭环; --beat-heads N:每 beat 首句起点连抽 N 帧——ISSUE-170「句中点采样结构性错过亚秒 入场瞬态」的机械补盲(可组合 --scene 过滤幕;该模式冻帧判定关闭,静止 beat 头帧 指纹相同是合法态)。--compare A B:同帧号抽两版逐帧差异(meanΔ/差异像素占比/bbox, numpy+pillow 零新依赖,advisory 退出码恒 0)——重制/重构「不外溢的意图变更之外 一切差异须归因」的证据工具,JND=12 抗 jpeg 噪声。check_script --check-motion: 分镜动效列 @动词 标注 ↔ 场景代码运动模型调用互比(WARN-only,词表从本集 motion/hooks.ts 派生不复制)——「FadeUp 写在分镜却零调用」实测缺陷类的机械化。 pipeline.py qa 子命令同步转发两 flag;纯函数与互比逻辑均有单测钉死。 🤖 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> * feat(video): 《执行层》七幕全片重制于运动层,落地五语法与 HarnessStack 系列装置; 全部动效收敛 motion 模型:30 处进度变量/10 处弹簧/11 处错峰/6 处呼吸正弦换令牌化调用, 约 20 处布尔硬门瞬现改 useProgress 淡入(可感知质量提升),P2/P4 两段加速绕行累加器 克隆精确收敛 useAccelTravel,rise 入场与 P6 径向滑入内建 SAFE_TOP_Y 钳制(ISSUE-170 缺陷类构造性消灭),P6 渐黑改 useFadeOut(红线四模型化)。落地 skills/06 已声明未实现 的系列装置:HarnessStackP0 开场落板+缩退常驻、P1–P5 HarnessBadge 角标(SceneTag 让位 右上)、P6 收尾放大+下期层呼吸预告;层数据由 build_narration 从 series.json 派生 series-layers.json(硬编码即漂移)。分镜 39/39 镜补 @动词 标注,check-motion 全绿。 形状/构图/色彩/分镜/逐字稿零改动——总帧数复算恒等。EP2–5 的同步登记为后续批次。 🤖 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> * docs(influence): 运动层规格与 QA 新面落档——skills/06 铁律与逃生舱、落地状态块、issue 台账; skills/06 新增运动层一节(令牌/窗口/编排/模型清单 + 五条铁律 + 反模板化逃生舱 + gallery 评审面),场景动画规则改「优先 motion 模型、裸 interpolate 是逃生舱」;HarnessStack 落地 状态块更新为「EP1 已落地、EP2–5 待同步」(五集不一致显式化);动效语法表对齐 hooks 实现 (弹簧锚定本仓实测手感,注明不抄规格散文数值)。skills/08 补 --beat-heads/--compare 操作 契约与对拍基线纪律。pipeline README 复用边界补运动层条目;路由壳、知识索引同步;issue.md 登记 ISSUE-176(FadeUp 零调用 + 布尔硬门瞬现的根因与防法)。 🤖 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> * fix(video): 评审修复——常驻角标改顶边横条消五处碰撞,P0 缩退交叉淡出衔接; 对抗式评审抓出两类渲染前必修:① HarnessBadge 纵向角标(300×194)与既有左上内容五处 碰撞(P2 CornerRing 同坐标×8 拍、P3 三判定小抄、P5 官方标尺、P1 1-E 环弧、P6 循环标签) ——全片唯一零碰撞常驻区是顶边 y<50 横条(各幕左上内容最早 y=56 起),常驻形式改横向 五 chip(形式适配已落档 harness-stack 文件头);② P0 缩退终态与常驻条几何失配 + rec>0.98 档位切换单帧跳变——改为向左上收小 + 末 8 帧与常驻条交叉淡出。另恢复两处 被误删的 in-flow 布局门(P5 骨架小标顶起卡 1 底对齐 ~46px、P4 时机表顶高 ~80px)—— 门内保留淡入,布局归布局、透明度归透明度;清理 SourceAndFade 死变量。 🤖 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> * docs(skills): 常驻条形式适配的规格侧同步(顶边横条,EP1 评审实测依据); 🤖 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> * feat(video): 终渲交付与验收落档——七幕+beat头部+尾幕全绿,A/B 对拍归因闭环; 字幕缺失判据限定句中点采样(beat 头帧落在句首淡入与句间空隙,无字幕是合法态)。 final.mp4 13:58.80(25164 帧)+ captions.srt/vtt + cover.png(标题卡帧 1031)。 series.json statusNote 与分集 README 交付表更新:167 句勘误(原记 170)、TTS 复跑 漂移 -478 帧实录、A/B 对拍 167 帧归因表(2 帧 >5% 均为 HarnessStack 新装置,其余 ≤1.5% 归因常驻条/SceneTag 移位/令牌化缓动/硬门改淡入)、音频版本库 e2e 验证记录。 🤖 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> * fix(influence): 修复动效、QA 与 TTS 审查问题; 🤖 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>
* docs(research): 新增量化与投资科学分组暨凯利公式投资数学调研文献; - 新增 docs/research/quant-finance/150-kelly-criterion-and-investment-math.md: 以凯利公式 f*=(bp−q)/b 为起点,梳理七块严格成立的投资数学定理 (凯利仓位/统计功效/期望值与破产风险/波动拖累/复利年金/Markowitz 分散化/Sharpe 主动管理算术),配合经多智能体交叉核验的实证数据 (SPIVA/巴菲特十年赌局/Barber & Odean/上交所全账户研究),推导 中国市场 2026 时点可执行操作路径与避坑清单;全文严格区分 A 类 恒等式与 B 类实证统计,18 条 IEEE 引用; - 新增分组 _category_.json(position 7「量化与投资科学」); - 同步 docs/research/readme.md 新增第七分组阅读入口; - 同步 docs/.agents/knowledge-map.md 研究文献索引,并顺带清理 协同协议小节三条历史死链(PR #1120 前协议文档已上移用户级配置); - 已验证 build_docs_pack 正确拾取新文档与分组标签。 🤖 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> * docs(quant-finance): 修正凯利公式调研文献的数值、口径与引用缺陷; 代码审查发现 5 处问题,逐条修正: - §5 马丁格尔算例数字少一位:100 元起注连输 10 次后下一注为 100 × 2¹⁰ = 102,400 元(此前累计已投入 102,300 元),原值 10,240 把「有限资金撑不住翻倍序列」的论证削弱了一个数量级,方向与结论相反; - §3 Step 1 个人养老金节税额与同句口径不一致:前半句以「税前抵扣 − 领取时 3% 单独计税」定义净收益,但 2,400 元为未扣领取端税负的毛额; 改为展开净额推导 2,400 − 360 = 年净节税 2,040 元; - §0 立论与 §1.7 自述边界冲突:Sharpe 恒等式约束的是全体主动资金的 资金加权平均,并不排除个别人跑赢(§1.7 原文即如此),故「存在预测 公式」本身不违反该恒等式;条件收紧为「人人靠某公式跑赢市场」; - §1.4「精确 7.82%」依赖未声明的口径切换:补充 σ 为简单收益率标准差、 s 为对数收益率标准差及 s² = ln(1+σ²/(1+A)²) 换算关系,精确值按 σ 口径重算为 8.23%;同时将 e^{−s²/2} 改写为 exp(−s²/2),消除正文裸 花括号在 react-markdown + rehype-katex 下原样显示的问题; - §5 杠杆 ETF 行以文字形式引用「FINRA 09-31」,致参考文献 [18] 成为 全篇唯一无正文锚点的条目,按 IEEE 格式补上编号引用。 验证:全部 18 条引用编号双向闭合(无孤儿、无未定义);表格列数一致; 正文无裸花括号;G = 8.23% 与 102,400 元经 Python 独立复算确认。 🤖 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> * docs(links): 收口 Agent 指令源上移遗留的 42 处仓库内死链; 协作协议文档上移用户级配置后(AGENTS.md / CLAUDE.md / browser-validation.md / reference-specifications.md 四份已从仓库移除), docs/ 下仍有 42 处相对链接指向这些不存在的文件,发布到 wiki 后全部为死链。 前一次仅清理了 docs/.agents/knowledge-map.md 的 3 处,本次全量收口: - 本仓自有文档(concepts / research / i18n / reference/wiki,共 25 处): 改指用户级规范路径 `~/.claude/CLAUDE.md`、 `~/.agents/docs/browser-validation.md`、 `~/.agents/docs/reference-specifications.md`,保留原句语义与锚点作用; - 历史 Issue 记录(docs/.agents/issue.md,13 处):仅去链接、原文表述 与当时的仓内路径一并保留,不改写历史事实; - perceives 镜像目录(4 处):该目录描述的是另一仓库的结构,同样仅去 链接、不改指向,避免把本仓路径错误地断言给上游。 同步修正去链接后残留的两处中文排版空格。 验证:四份文档的仓库内死链归零(改前 42 处);diff 未新增任何链接; 19 个受改文件表格列数无回归;build_docs_pack 重跑,wiki 导航正常构建。 🤖 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>
以现役科普视频管线(Remotion 4.0.512 + frozen 运动层 + audio-first 时序 SSOT)为基线, 全网与 GitHub 全景调研动效建模与 Web 可视化搭建工具:54+9 候选长表、四路深评 (HyperFrames / Motion Canvas+Revideo / Cavalry·Jitter→Lottie / @Remotion 增强簇)、 87 条主张双反驳者核验,产出 A/B/C 三轨推荐(增强现栈 / HyperFrames 平行试点 / 设计师 Lottie 资产管线)、四道击穿门评估框架与 POC 验收清单; 同步 research 索引与 knowledge-map,pipeline README 交叉链接(check_series 全绿)。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
…rames PoC (#1123) * docs(research): 新增视频与动效生产分组暨动效建模与 Web 可视化搭建工具全景调研; 以现役科普视频管线(Remotion 4.0.512 + frozen 运动层 + audio-first 时序 SSOT)为基线, 全网与 GitHub 全景调研动效建模与 Web 可视化搭建工具:54+9 候选长表、四路深评 (HyperFrames / Motion Canvas+Revideo / Cavalry·Jitter→Lottie / @Remotion 增强簇)、 87 条主张双反驳者核验,产出 A/B/C 三轨推荐(增强现栈 / HyperFrames 平行试点 / 设计师 Lottie 资产管线)、四道击穿门评估框架与 POC 验收清单; 同步 research 索引与 knowledge-map,pipeline README 交叉链接(check_series 全绿)。 🤖 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> * feat(influence): EP1 落地动效工具三轨改造——paths/three 增强簇 + Lottie 管线 + HyperFrames PoC; A 轨(增强现役栈):P3 兜底弧/P4 回流弧改 @remotion/paths evolvePath(零时序改动, 落实 skills/06 既载未行的官方正解);HarnessStackP0/P6 层板 3D 化(@remotion/three + R3F,glow/dim/settle 全部复用既有 hooks 数值,chip 档与 HarnessBadge 不动); remotion.config 加 gl:angle。C 轨(设计师资产管线):LottieEmphasis 包装组件 (fonts/chars/表达式硬断言 + 时长现读钳制)+ 手工占位资产 plug-pulse 替换 4-C 二帧布尔闪。B 轨(平行管线):poc-hyperframes/ 垂直切片实测——lint/snapshot/ render/重定时往返全通过(441→501 帧自动重算实证),ffmpeg 经 shim 复用 Remotion 自带二进制,结论见 FINDINGS.md。 依赖 7+1 条 4.0.512 同版钉死零升级;skeleton.toml 新增 2 条指纹钉住的 [[drift]]; 评审面 video/src/dev/retrofit-gallery.tsx 三帧目检过;verify_skeleton --strict / check_series / tsc --noEmit 全绿;frozen 运动层与 4 兄弟集零改动。 🤖 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> * fix(influence): 三轨改造全链回归——TTS 版本库回收 + A/B 对拍归因,修 badge 塌陷/Lottie 定位/3D 读色三处实景缺陷; 全链回归:IndexTTS(8766/MPS)启动 + refs.py 按 sha1 台账重建 me-bright.wav → 音频版本库 167/167 句 1.7s 回收(零重合成)→ 总帧数复算 25164 与成片精确一致 → 全片草渲 → 七幕 --check / --beat-heads / 末 6 句全 FAIL 0;A/B 对拍 (基线=2722929e 同 manifest 硬链接)167 帧仅 p6-08 超 5%(3D 层板,目检归因)。 回归中修掉三处实景缺陷: ① HarnessBadge 五 chip 塌陷重叠(P1–P6 六幕)——共用件带 absolute 使 chip 失去 内容撑宽;PlateText 改返回 Fragment,平面 Plate 恢复改造前逐字等价的 flex 行; ② Lottie 脉冲定位偏移——按 190+218·cos/sin(-20°) 重算锚定节点 1 (347,67); ③ 3D 板读色脱节——emissive 把点亮层烧成实心橙块压掉文字对比;改 meshBasicMaterial 恒深底(active 仅掺暖意 #241C1E)+ 正面 lineLoop 描边加权。 教训入 ISSUE-177:A/B 低 meanΔ(0.8–1.0%)与 --check FAIL 0 双双放过小面积严重 缺陷;改跨幕常驻元素须抽非改动幕的帧逐帧目检。P2 唯一 WARN 查明为 16×16 均值 哈希假阳性(实测差异 13.83%≈基线 13.72%)。 🤖 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> * feat(influence): C 轨占位资产升级至交付级——按运动令牌生成三层 Lottie,M3 缓动与 snap 过冲与全片同源; 本机无 Cavalry/Jitter(安装需 Canva 账号登录、原生 GUI 不可自动化),故不走设计工具 导出,改由脚本按 motion/tokens.ts 的权威数值生成——Lottie 的关键帧切线本就是贝塞尔 控制点,M3 三条曲线可逐字写进 i/o 字段,使资产与全片 16 个动效模型**逐帧同源**, 而非事后目测对齐(设计工具导出的曲线是现场手拉的,反需按 tokens 回校)。 三层编排,时长全部落 DUR 令牌: 外环 26→132% 扩散 f6=21f decelerate 内环 f2=3f 错峰起跳、f5=12f 回响 decelerate 对勾 trim path 描画 f3→f3+f5 standard + 收束过冲 109.5% 落回 f4——取 SPRING.snap 的 ζ=0.6 经 overshootPeak 算得,与 P4「插头咬合」useSpring('snap') 同源同公式(motion.test.ts 钉死) 整体末 f3 淡出 accelerate(EXIT_FACTOR 出场快于入场) 生成脚本 gen_plug_pulse.py 随资产入库(自锚定路径可就地重跑,sha1 幂等已验), 资产即成为可复算产物而非不可追溯的二进制。sidecar 如实标注「脚本生成、非设计 工具导出」并说明同名覆盖即可替换。 验证:四条断言全过(无 fonts/chars/文本层/表达式)+ 单色 #64C4C0 三层一致 + 96×96/30fps/24f 契约;全片重渲 350s 无 cancelRender;七幕 --check FAIL 0、 P4 beat-heads FAIL 0、末 6 句 FAIL 0;A/B 对拍 167 帧仅 p6-08(3D 层板)超阈值。 🤖 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>
3 tasks
…e fast-uri HIGH (#1125) * fix(perceives): 修复 Security Audit 门——5 包定向升级 + transformers CVE-2026-9856 有据 ignore; - uv lock 定向升级:aiohttp 3.14.3 / cryptography 50.0.1 / pip 26.2.1 / pyasn1 0.6.4 / pypdf 6.17.0(新披露 advisory,OSV 验证新版本零漏洞) - transformers CVE-2026-9856(save_pretrained 路径穿越任意写文件)修复版 5.10.0 受 marker-pdf/surya <5.0.0 硬锁制约,按既有威胁模型(仅加载第一方模型 artifact、不加载不可信 HF 仓库)入 ignore 清单 🤖 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> * build(deps): influence 8 分集 + 骨架模板 lockfile 升级 fast-uri 3.1.5→3.1.7,修复 Dependency Review 门 4 项 HIGH; - GHSA-jqff-g426-hqxp / GHSA-fph4-wmhf-6fwf / GHSA-f65p-4m7j-42xc / GHSA-5jgf-p345-68v8(host confusion 与 SSRF)均在 3.1.6 修复 - 3.1.7 满足 ajv@8.20.0 的 ^3.0.1 依赖范围,纯 lockfile 定向升级;模板 lockfile 经临时物化 manifest 由 pnpm 规范生成,根 pnpm-lock.yaml 零变更 🤖 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.
背景
feature/1.x.x主线累积 81 次提交 / 783 文件 / +150597 / -4917 / 9 条 alembic 迁移(0091→0099),需以可审计的聚合 PR 形态合入master。核心变更
1. PDF→Markdown 高保真巡检闭环收敛(Perceives + Patrol)
2. 定义源 SSOT 与智能体架构(迁移 0095–0099)
NE_AGENTS_FROM_DB开关灰度。3. 科普视频 / 动效生产线(apps/negentropy-influence,513 文件)
media/→apps/negentropy-influence/(191 文件 R100 纯重命名),机制(pipeline/)与内容(episodes/)边界显式化 + 路径锚点/ignore 通配/stages 唯一声明/配置 schema/骨架模板等公共层抽取。pipeline.py单入口编排、check_series/check_script质量门、qa_frames视觉体检、source_ledgerB 型信源取证、多系列series.jsonSSOT(现两系列 8 集)。4. 全站 UI 规范对齐(negentropy-ui,92 文件)
5. Wiki 质量加固(negentropy-wiki)
data:图片协议放行 + 验证器校准(fix(patrol): wiki 放行 data: 图片协议 + 校准验证器与巡检文档现实对齐 #1092);wiki-export 启动日志收敛(fix(wiki-export): 启动期以进度与统计取代逐条 blob 日志刷屏; #1119)。6. 文档 / 调研 / 协作协议
7. 基础设施 / 工程
cli.shPhase 3 PostgreSQL 自愈链(残留 postmaster.pid / brew error 态,附 9 用例回归测试);pnpm 11.10.0→12.2.1 升级链并阻断嵌套 install 覆写根 lockfile(build(deps): pnpm 升级至 12.2.1 并阻断嵌套 install 覆写根 lockfile; #1116);soupsieve CVE-2026-49476/49477 修复(build(deps): 升级 soupsieve 至 2.8.4 修复 Perceives CI 安全审计失败 #1087);Perceives CI bandit B310 豁免(fix(perceives): 修复 Perceives CI Security Audit——bandit B310 豁免 + pip-audit 依赖升级/忽略 #1093)。风险与回滚
media/→apps/negentropy-influence/迁移:兄弟 worktree 的 gitignored TTS 产物留在旧路径,须按 #1111 runbook 逐个搬迁(前提=该 worktree 已拿到迁移),全程禁git clean -xdf。NE_AGENTS_FROM_DB默认 off;开区后 loaders 走 DB,需确认 definitions 数据完备性。git revert合并提交 + 逆序alembic downgrade(0099→0091)。验证证据
cli.shPG 自愈 9 用例回归通过。影响范围
cli.sh。Next Best Action
alembic upgrade head(0091→0099)确认迁移链完整。NE_AGENTS_FROM_DB开区条件与 definitions 数据完备性。