HyperFrames Seam Gate 详解:用 ledger.json 向量台账与“生成-验证”脚本对,把多场景视频的镜头接缝变成可数值校验的构建门禁

HyperFrames Seam Gate 详解:用 ledger.json 向量台账与“生成-验证”脚本对,把多场景视频的镜头接缝变成可数值校验的构建门禁 HyperFrames Seam Gate 详解用 ledger.json 向量台账与“生成-验证”脚本对把多场景视频的镜头接缝变成可数值校验的构建门禁【免费下载链接】hyperframesWrite HTML. Render video. Built for agents.项目地址: https://gitcode.com/GitHub_Trending/hy/hyperframes在 HyperFrames 的多场景动画项目中最常见的质量事故不是单个场景做得不够好而是场景之间的“接缝”seam断裂退场先静止再切、入场从静止起步、缩放方向在切口两侧镜像、切点前后两个场景短暂同时可见。仓库中的references/seam-gate.md位于 seam-gate.md定义了 motion-doctrine 技能的核心构建门禁——Seam Gate一对零 npm 依赖的 Node 脚本 seam-stamp.mjs从台账生成主时间线接缝代码与 seam-gate.mjs驱动无头浏览器逐帧测量、数值校验每条接缝。读完本文你将掌握ledger.json向量台账的完整 schema、stamp/verify/probe 三类命令的用法与参数、门禁的每一项检查在源码中的判定逻辑与阈值以及该门禁在 changelog-video 技能流水线中的落地方式。一、Seam Gate 要解决的问题接缝成为“构建门禁”motion-doctrine 技能SKILL.md的向量定律规定场景 A 如何退场决定了场景 B 如何入场——同轴、同向、速度匹配、切口落在两侧运动中途。其配套的 Seam Gate 把这条“感觉层面的定律”变成一个可执行的构建门禁build gatenode SKILL_DIR/scripts/seam-stamp.mjs --ledger ledger.json --write index.html # 生成 node SKILL_DIR/scripts/seam-gate.mjs verify --ledger ledger.json --project . # 验证门禁通过exit 0才算这条接缝“完成”。脚本对每条接缝数值强制检查台账行一致性、切口时刻退场方仍在运动、入场方处于中途绝不从静止起步、实测方向等于台账方向、入/退场速度匹配WARN、零重叠每帧只有一侧可见——切口不是溶解过渡、Z 符号规则两侧 d(scale)/dt 同号并扫描入场场景自身的内部入场动画是否与 Z 符号“打架”、以及 carrier 矩形连续性含祖先缩放。motion-doctrine 同时列出了脚本查不了的三条人负责规则编辑会重新打开接缝任何改动场景首尾约 1 秒的修改都使其审计失效、音频是时钟按 VO 真实词时间戳重排场景、clip 门控陷阱data-start早于入场 tween 的 clip 会在初始透明度下被解除隐藏——必须设初始autoAlpha: 0且data-start等于切口时间。脚本对stamp gate的运行前提是node ≥ 22 与本地 Chrome零 npm 依赖门禁自动查找~/.cache/puppeteer下的 chrome-headless-shell 或系统 Chrome。这一点在 seam-gate.mjs 的findChrome()中得到印证优先环境变量CHROME_PATH然后依次扫描~/.cache/puppeteer/chrome-headless-shell与~/.cache/puppeteer/chromemacOS 上解析 Chrome for Testing.app 的二进制路径最后回退到系统/Applications/Google Chrome.app都找不到则报错要求设置CHROME_PATH。二、seam-stamp.mjs从台账生成主接缝代码2.1 基本用法# STAMP: 从台账写入 master seam 块base sets 全部 wrapper tweens。 # 替换 // seams:auto … // /seams:auto 块若标记不存在则插入在 # window.__timelines[main] 注册行之后。stamp 出来的接缝按构造通过门禁。 # match-cut/morph 行只生成可见性 set——carrier 交接仍需手写。 node SKILL_DIR/scripts/seam-stamp.mjs --ledger ledger.json --write index.html不带--write时脚本只把生成的接缝块打印到 stdout方便预览。stamp 的定位是“生成的那一半”凡是由台账 stamp 出来的普通接缝seam-gate.mjs verify会按构造by construction通过——这是“先写台账、再生成代码、再数值验证”这条流水线的关键性质。2.2 每条接缝的可选参数台账行内配置原文档给出的 per-seam 选项均可写在ledger.json的对应 seam 行中exit.dur/entry.dur覆盖默认时长entry.travelxPercent/yPercent 的入场偏移量默认 10想要更“软”的入场用8blurZ 接缝的模糊像素默认 18px 全画面对文字级缩放text-scale建议设为10。从 seam-stamp.mjs 的 stamp 主循环看这些参数落入的默认值是接缝轴侧默认时长默认 ease默认数值x/yexitex.dur ?? 0.34power3.in位移至12 * dir个 percent 并淡出x/yentryen.dur ?? 0.42power4.out从-travel * dirtravel 默认 10滑回 0初始 autoAlpha 0.35zexitex.dur ?? 0.21power3.in缩放到 0.8pull/ 1.18push加blur(Npx)并淡出zentryen.dur ?? 0.5expo.out从 1.25pull 到达/ 0.78push 到达 blur 收敛到 1.0注意入场侧初始 autoAlpha 为 0.15z或 0.35x/y而非 0这正是“切口落在入场中途”这一向量定律第 4 条Phase在生成代码里的体现。此外 stamp 在台账行 axis/dir 不匹配时会直接抛错并提示“fix the PLAN, not the stamp”修计划而不是修生成的代码见 seam-stamp.mjs。2.3 写入机制seams:auto标记块--write的替换逻辑在 seam-stamp.mjs用正则替换// seams:auto到// /seams:auto之间的整块若标记不存在则把整块插入到window.__timelines[main] tl;注册行之后两者都找不到则抛错。生成的块首部自带注释generated by seam-stamp.mjs from ledger.json; do not hand-edit.和再生成命令保证该区域归属脚本所有。对type非cut的 match-cut/morph 行stamp 只输出两行可见性切换exit 侧autoAlpha: 0、entry 侧autoAlpha: 1时间点即 cut并留注释提醒 carrier 交接是“Tier-A”手工活——台账里的 carrier 行仍要保留供门禁校验。这个插入锚点在真实项目脚手架中可以看到changelog-video 技能的 master-skeleton.html 在window.__timelines[main] tl;下专门留了注释seam-stamp.mjs inserts the seams:auto block after the registration above.。三、ledger.json向量台账的数据 schema台账位于项目根目录一条接缝一行——“向量台账的数据形态”。原文档给出的完整示例{ fps: 30, seams: [ { id: hook→claim, cut: 4.2, technique: cut-the-curve LEFT, exit: { selector: #el-hook, axis: x, dir: -1 }, entry: { selector: #el-claim, axis: x, dir: -1 } }, { id: claim→payoff, cut: 10.2, technique: inverse zoom-through, exit: { selector: #el-claim, axis: z, dir: -1 }, entry: { selector: #el-payoff, axis: z, dir: -1, scanRoot: #el-payoff } }, { id: ui→player (match cut), cut: 60.6, type: match-cut, carrier: { out: #resting-card, in: #product-video } } ] }各字段语义全部继承自原文档并结合源码核实fps主时钟帧率。verify 时以此计算dt 1/fps用于“cut 前后 1 帧”的采样点seam-gate.mjs。cut主时钟上的秒数即入场侧点火的那一帧。typecut默认执行全部向量检查、match-cut/morph只查 carrier 连续性 零重叠运动允许恰好在边界上开始。axisx、y或zz 即 scale。dir是运动符号x −1 向左y −1 向上z 1 push增大z −1 pull缩小。selector承载接缝运动的元素。主时间线动的是 wrapper 就用 wrapper接缝运动写在子 comp 内部就用 in-comp heroid 或[data-hf-id…]——probe命令会告诉你该用哪个。entry.scanRootz 接缝用扫描“符号打架”的内部入场动画的子树默认取 entry selector。carriercut行可选match-cut/morph 必填。out/in两个 selector 的 rect 必须在cut ± 1 帧处匹配容差为中心偏移 12px、尺寸差 5%且包含祖先变换velocity 与 rect 都基于getBoundingClientRect测量见第五节。motion-doctrine 对台账的书写要求是“在写任何主时间线之前先写”exit 与 entry 必须匹配若某行不匹配修的是计划而不是缓动验证器会在任何运行时采样之前先静态检查行一致性。四、seam-gate.mjs verify数值验证如何工作4.1 三类命令# 验证台账中每条接缝exit 0 门禁通过 node SKILL_DIR/scripts/seam-gate.mjs verify --ledger ledger.json --project project-dir # 复用已在运行的预览服务器comp 编辑后必须重启——否则是过期 bundle node SKILL_DIR/scripts/seam-gate.mjs verify --ledger ledger.json --url http://localhost:5244 # 发现某个切口附近的 movers用于书写/修正台账行 node SKILL_DIR/scripts/seam-gate.mjs probe --t 44.8 --project project-dir--project会启动一个全新的预览服务器并在结束后杀掉且刻意把HYPERFRAME_RUNTIME_URL从环境中删除源码注释错误的值会静默失败成 200 HTML——这是推荐方式--json输出机器可读结果--fps默认 30。从 seam-gate.mjs 的ensureServer()看--project模式下门禁会在5380 随机(0..19)端口上拉起npx --yes hyperframes preview --foreground --no-open --port port轮询/api/projects就绪最长 120 秒然后自动解析出 comp 预览页地址/api/projects/id/preview/comp/index.html供无头浏览器打开。页面加载后要等到 HF 运行时玩家出现window.__playerReady window.__renderReady window.__player并等待document.fonts.ready才注入测量 harness。设备度量被强制为1920×1080Emulation.setDeviceMetricsOverride这是所有 rect 测量的坐标系前提。4.2 采样窗口与阈值常量verify 对每条接缝在四个时间点采样seam-gate.mjs退场侧cut − 0.1s与cut − 1帧入场侧cut 1帧与cut 0.1s——即“切口前 0.1s 窗口”和“切口后 0.1s 窗口”各取两个点用两点差分算速度。源码顶部的判定阈值seam-gate.mjs常量值含义VIS0.04累计透明度低于此值 不可见沿祖先链连乘 opacitydisplay:none/visibility:hidden直接记 0EPS_XY15 px/s低于此速度 “静止”判*-movingFAILEPS_Z0.04 es/sz 轴的“有效缩放”宽度/未变换宽度之比静止阈值SPEED_RATIO3入/退场速度比超过 3 倍 speed-matchWARNCARRIER_POS_TOL12 pxcarrier 中心偏移容差CARRIER_SIZE_TOL5%carrier 尺寸差容差测量 harness注入页内的__seamGate对象seam-gate.mjs提供seek/sample/scanread()用getBoundingClientRect取中心点(cx, cy)与es 当前宽度 / offsetWidth未变换宽度做分母从而祖先 wrapper 的缩放会自动计入——这正是原文档所说“velocities 在 getBoundingClientRect 上测量x/y 用中心、z 用宽度比祖先 wrapper transform 自动包含”的实现方式。4.3 每条检查强制什么规则 ↔ 报告行对照原文档的核心对照表完整继承如下并与 verify 源码逐条对应报告行规则ledgerexit/entry 向量在计划中匹配axis direxit-moving/entry-moving规则 1/3——不允许已静止的退场不允许从静止的入场exit-direction/entry-direction规则 3——实测符号与台账一致speed-match(WARN)定律 §3——入场初速 ≈ 退场末速zero-overlap规则 6——每帧只有一侧可见绝不允许两侧同时可见z-sign-scan规则 7——入场场景自身的入场动画不与 Z 符号打架carrier-*规则 3/4——carrier rect 连续性含祖先缩放几个值得注意的判定细节均出自 seam-gate.mjs可见性方向性exit-visible要求退场侧在 cut 前可见entry-visible要求入场侧在 cut 后可见——退出侧“提前消失”与入场侧“迟到”都会以*-visibleFAIL 报出并附上实测 opacity。zero-overlapcut 前 1 帧若入场侧已可见报告“reads as a dissolve”读起来像溶解过渡cut 后 1 帧退场侧仍可见同样 FAIL。motion-doctrine 指出clip 门控data-start早于入场 tween是这项 FAIL 的常见原因。z-sign-scan仅对axis z的入场侧执行在 entry 窗口内对scanRoot子树默认最多 900 个元素、跳过宽高不足 32px 的小元素做两次 scan凡有效缩放速度绝对值 ≥EPS_Z且符号与dir相反的元素全部列为 offender报告最多展示前 5 个。carrier 检查任何声明了carrier的接缝类型都会做match-cut/morph 的全部检查就是它未声明 carrier 的 match-cut/morph 行会收到一条 WARN。退出码存在 FAIL 时 exit 1全部通过 exit 0参数/环境错误 exit 2。人类可读输出形如每条接缝一行■ id (cut 4.2s, cut) ✓ / ✗ N FAIL其下逐行PASS/WARN/FAIL check detail末尾汇总SEAM GATE: PASSED/FAILED — N fail, M warn across K seams。五、probe在切口附近找出真正的 movernode SKILL_DIR/scripts/seam-gate.mjs probe --t 44.8 --project project-dirprobe 解决台账书写时的核心难题selector字段“用 wrapper 还是 in-comp hero”的实现手段。它在±window默认 0.1s窗口内对整个#root做两次全量 scan切口前一段、切口后一段diff 出“movers”——中心位移速度vx/vy、缩放速度vscale、opacity 变化op a→b按运动强度排序取前 14 条并给出每个元素的稳定选择器优先 id /[data-hf-id]否则推导 nth-child 路径见pathOf()。输出末尾提示符号约定x-: left, y-: up, scale: push, scale-: pull直接把 probe 结果抄成台账行即可。六、实战流水线在 changelog-video 技能中的落地Seam Gate 不是孤立工具而是 changelog-video 技能流水线里被显式引用的质量门禁之一。其 build-spec.md 规定项目根目录放ledger.json所有普通接缝统一cut-the-curve LEFTx 轴、dir −1exit/entry selector 就是 slide wrapperoutro 入场travel: 8即上文“软入场”取值seam-stamp.mjs --ledger ledger.json --write index.html独占所有 wrapper 的入场/退场——“author none yourself”自己一行都不要写slide 用 CSSopacity: 0打底data-start严格等于台账 cut 时间对应“clip 门控陷阱”规则的正面写法场景内部节拍internal beats落在 VO 词时间戳上且要在切口后 ≥0.4s 开始、下一切口前 ≥0.45s 结束因为 stamp 的退场从 cut −0.34s 开始门禁清单中 seam-gate 与 lint 并列hyperframes check0 error、seam-gate.mjs verify0 fail、重启预览服务器后抽查节拍、按需渲染后抽帧验证。项目布局中ledger.json的定位是 “vector ledger (seam-stamp input)”changelog-video SKILL.md整套顺序为ledger.json先写计划→ seam-stamp生成→ 内部节拍对齐 VO 词 → seam-gate verify验证。七、适用前提与限制运行环境node ≥ 22门禁使用原生 WebSocket 与 fetch、本地 Chrome~/.cache/puppeteer或系统 Chrome可用CHROME_PATH覆盖、可运行npx hyperframes preview的项目目录--project模式或已就绪的预览服务--url模式。坐标系假设设备度量固定 1920×1080CDP 覆盖rect 的“在屏”判定也按 1920×1080 边界计算测量基于getBoundingClientRect因此祖先 wrapper 变换自动计入但前提是被测元素确实在该坐标空间内呈现。门禁边界速度匹配只是 WARN 而非 FAILmatch-cut/morph 不查向量只查 carrier 连续性与重叠脚本查不了“编辑重开接缝”“VO 重开接缝”这类流程规则——这些仍由作者负责见 SKILL.md “Rules the script cannot check” 一节。stamp 与 gate 的分工只有普通cut接缝“按构造通过”match-cut/morph 的 carrier 交接必须手写手写部分只能靠 verify 兜底。八、小结Seam Gate 的本质是把 motion-doctrine 中“眼睛动量不在切口处死亡”这一审美定律转写为一个可重复执行的工程闭环写计划在项目根写ledger.json每个接缝一行——cut 时间、exit/entry 向量axis dir、selector、technique生成seam-stamp.mjs --ledger ledger.json --write index.html产出seams:auto块base states wrapper tweens参数默认值 0.34/0.42s x/y、0.21/0.5s z、travel 10、blur 18验证seam-gate.mjs verify --project .在全新预览服务器上逐帧测量按ledger / *-moving / *-direction / speed-match / zero-overlap / z-sign-scan / carrier-*报告行输出 PASS/WARN/FAILexit 0 才算接缝完成修正定位台账行写不对时用probe --t cut发现切口附近的真实 mover 与符号。相关入口文件seam-gate.md本文主体文档、seam-stamp.mjs、seam-gate.mjs、motion-doctrine SKILL.md向量定律与门禁的完整语境、cut-the-curve SKILL.mdtechnique 目录、changelog-video build-spec.md 与 master-skeleton.html真实项目的 stamp 锚点与门禁清单。【免费下载链接】hyperframesWrite HTML. Render video. Built for agents.项目地址: https://gitcode.com/GitHub_Trending/hy/hyperframes创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考