Repository navigation
A time-map solver to copy, a skeleton for data along a time axis; Ctrl-C under every uv run; two plainer messages - #117
Merged
Merged
Conversation
…l-C under every uv run; two plainer messages - engines/canvas-film/examples/time-map-solve.py (stdlib only) and a synthetic time-map-spec.json: an example of solving a time map for a project to copy and change (segments, Gaussian slow-downs cut at span edges, slow windows, holds, a reading-time check per lane, pins so an edit re-solves only the span between two pins). Not a bin/vh command. The canvas-film README's time-map section points to it. CI: the spec solves to a map timemap check takes; a card made longer between two pins moves knots in that span alone. - recipes/sequences/data-along-time.md: a whole-film skeleton for data told along its own time axis (one time map for picture and sound, locator ring and leader line, a change of view that carries the line, a card stack with reading time, when to slow), each with why and what varies. Linked from the recipe indexes and video-types/05. - on_ctrl_c now wraps every uv run in bin/vh (music, sfx, beats, qa, mix profiles, tts, pace, captions, cover-preview, style compare/gallery, sheet, fonts, check's scans, doctor's probes): uv exits 2 when Ctrl-C lands as its Python exits, and bash went on. CI: a fake uv that does that, under twelve commands, each 130. - sfx place with a duration that is not a number above 0: a plain message, exit 2. - canvas-film loadFonts names each missing face once; a unicode-range face says its range.
…, so a pinned event keeps its time
ZLHad
marked this pull request as ready for review
October 19, 2026 03:53
ZLHad
enabled auto-merge (squash)
October 19, 2026 03:53
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.
What and why · 改了什么、为什么
上一轮剩下的五件事,一个 PR。原则照旧:harness 给底线、准确的接口、做机械活的工具和带理由的参考;一支片子自己的解法留在项目里或者变成例子,不变成内置的规则或命令。例子一律是合成数据。
engines/canvas-film/examples/time-map-solve.py(只用标准库)和旁边一份合成的规格time-map-spec.json。不是bin/vh的命令,是项目复制过去照着改的参考:"pin"住(已定的落点,从映射里抄来的 t),定点把轴切成一个个跨度,每个跨度单独解;src/06-time-map.js和tools/audio/time_map.py读的格式(带spec的 sha256 和rebuild),报告每个定点前后的速度、为读时加了多少减速、还差多少。recipes/sequences/data-along-time.md:沿数据自己的时间轴讲的数据片。一份时间映射同时管画面各层和声音;定位环和从字卡到数据点的引线;换视图时把线带进下一个视图;字卡栈让每张卡都有读时;什么时候在事件附近放慢。每一处写了为什么,另有一节"什么会变,什么不变",免得变成一种固定长相。照 05 和styles/editorial-data写,bin/vh recipes check通过;两个配方索引和video-types/05各加一行链接。uv run的 Ctrl-C 竞态:Ctrl-C 正好落在 Python 退出时,uv 自己以 2 退出("Failed to get PID of child process"),bash 看见子进程是正常退出,就接着往下走。Small fixes: Ctrl-C ends readcheck, storyboard and rhythm quietly; X's weighted length; doctor <project> #114 只给 storyboard 和 rhythm 加了on_ctrl_c。现在bin/vh里每一处uv run都经过它:music、sfx、beats、qa、带 profile 的 mix、tts、pace、captions(含两次 jieba 探测)、cover-preview、style compare 和 gallery、sheet、fonts list/subset、check 的逐帧和缩放扫描(在$( )里,调用处见 130 就退出)、doctor 的两处缓存探测。还是一个 helper。sfx place … <duration>时长不是大于 0 的秒数(2s、nan、-1、0、inf):说清楚,退出 2,不再是float()的 traceback。loadFonts:同一个 family 和 weight 有两个 face(主 face 和只管几个字的unicode-rangeface)时,缺字体会把 "Film Serif 900" 报两次。现在每个缺的 face 报一次,unicode-range的 face 带上它管的范围;列表用·隔开(范围里自己有逗号)。English summary. An example time-map solver (stdlib only, synthetic spec) for projects to copy: fixed segment ends and pinned events cut the axis into spans solved one by one (Gaussian slow-downs cut at span edges, slow windows, holds, a per-lane reading-time check), so an edit between two pins re-solves that span alone. A whole-film skeleton for data told along a time axis, with reasons and what varies.
on_ctrl_cnow wraps everyuv runinbin/vh.sfx placewith a non-numeric duration exits 2 with a message. canvas-film names each missing font face once.How it was verified · 怎么验证的
tools/ci.sh --committed(VH_BASH=/bin/bash,shellcheck、pyflakes 真的跑了)通过。新的 CI 用例:bin/vh timemap check通过;把 15 s 定点和 32 s 段界之间一张卡的字加长再解,这个跨度外的折点逐个相同、跨度内变了、两个钉住的事件仍在 15 s 和 48 s;uv,收到 SIGINT 就像竞态那样以 2 退出,在 12 个命令下各发一次 Ctrl-C(发给进程组,和终端一样),都以 130 结束。同一个用例跑 main 的bin/vh:10 个是 2,sheet 是 1(接着跑了 ffmpeg 的后备),captions 卡住(第一次探测"失败"后开始第二次 uv);sfx place时长写2s:退出 2,有那句说明,没有 traceback;film.html的local()全换成不存在的名字,报出 8 个 face,没有重复,Film Serif 900和Film Serif 900 for U+2013, U+2212分开。main 上同一页报Film Serif 900和Film Mono 400各两次。time-map-solve.py -h、无参数(退出 2)、在 spec 的定点上加一个停留(钉住的事件仍在定点到达,停留在它之后);sfx place时长abc、nan、-1、0、inf都退出 2,2照常写出 2.00 s 的静音轨。Checklist · 自查
tools/ci.sh --committedpasses · 通过CHANGELOG.md→ Unreleased · 已记进 CHANGELOGCLAUDE.md→ ranbin/vh sync-agents· 没改 CLAUDE.md