@gitruck/cli 1.2.15 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENT.md +12 -23
- package/CHANGELOG.md +9 -5
- package/contracts/README.md +2 -0
- package/contracts/gsap-emit-v1-evidence.md +196 -0
- package/contracts/gsap-emit-v1.md +162 -408
- package/dist/index.js +213 -213
- package/docs/reference.en.md +11 -11
- package/docs/reference.md +12 -12
- package/package.json +1 -1
- package/skills/gtrk-ai-drama/SKILL.md +7 -7
- package/skills/gtrk-cover/SKILL.md +3 -3
- package/skills/gtrk-food-recap/SKILL.md +9 -11
- package/skills/gtrk-live-slicing/SKILL.md +17 -26
- package/skills/gtrk-long2short/SKILL.md +2 -2
- package/skills/gtrk-matrix/SKILL.md +11 -15
- package/skills/gtrk-mg/SKILL.md +21 -21
- package/skills/gtrk-music-visualizer/SKILL.md +3 -3
- package/skills/gtrk-narration/SKILL.md +23 -57
- package/skills/gtrk-oralcut/SKILL.md +4 -8
- package/skills/gtrk-splitter/SKILL.md +3 -3
- package/skills/gtrk-style-maker/SKILL.md +1 -1
- package/skills/gtrk-talking-head/SKILL.md +5 -6
- package/skills/gtrk-tools/SKILL.md +4 -4
- package/skills/gtrk-transcript/SKILL.md +4 -9
- package/skills/gtrk-travel-recap/SKILL.md +51 -76
- package/skills/gtrk-vlog-docu/SKILL.md +15 -15
- package/skills/gtrk-voiceover/SKILL.md +2 -2
|
@@ -1,409 +1,163 @@
|
|
|
1
|
-
# GSAP-emit 契约 v1 · HTML 动画颗粒的逐帧 seek 渲染合规
|
|
2
|
-
|
|
3
|
-
> **契约版本**:gsap-emit v1
|
|
4
|
-
>
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
###
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
>
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
>
|
|
108
|
-
|
|
109
|
-
>
|
|
1
|
+
# GSAP-emit 契约 v1 · HTML 动画颗粒的逐帧 seek 渲染合规
|
|
2
|
+
|
|
3
|
+
> **契约版本**:gsap-emit v1。产 HTML 动画颗粒、经同合云 `html_animate_render` 逐帧 seek 合成的 skill/工具,其产物 MUST 满足本契约。
|
|
4
|
+
> **边界**:本契约只约束机器可判定的管线消费属性(封装/注册/确定性/自包含/体积上限/依赖可达/禁 `var()`/字体名命中注册表)。颜色、字体取值、构图和节奏由调用方栏目规则决定。
|
|
5
|
+
|
|
6
|
+
## 原理(为什么不能用 CSS animation)
|
|
7
|
+
|
|
8
|
+
渲染引擎逐帧渲染时,靠调用每个子合成在 `window.__timelines` 注册的 GSAP 时间线的 `.seek(t)` 把画面定格到第 t 秒。GSAP `paused` 时间线 = 可被外部 seek 的虚拟时钟 → 逐帧正确;纯 CSS `animation-delay` 动画不在 `window.__timelines` 里,引擎 seek 不到 → 画面冻结。
|
|
9
|
+
|
|
10
|
+
## 回调与 seek 语义
|
|
11
|
+
|
|
12
|
+
> 颗粒可以用时间线回调(`onUpdate` 等)驱动画面;保证定帧时回调可达是渲染引擎侧的义务,不是颗粒作者的义务。本节是该主题的唯一口径来源。
|
|
13
|
+
|
|
14
|
+
- **引擎侧(MUST)**:定帧时必须保证 GSAP 时间线回调可达,使用 `seek(t, false)`、`time(t)`、`progress(p)` 或 `totalTime(t)` 等等价方式,不能使用默认会抑制回调的裸 `seek(t)`。
|
|
15
|
+
- **颗粒侧(MUST NOT)**:颗粒可以用 `onUpdate` / `onStart` / `onComplete` / `onRepeat` 写 DOM 或属性;不得运行时覆写 `tl.seek`,也不得替换 `window.__timelines[…]`。新颗粒不得添加 seek 垫片;已有垫片可在重渲复验后择期清理。
|
|
16
|
+
- **幂等回调**:逐帧 scrub 会反复触发回调,回调必须从当前补间状态重算画面,不得累加计数、追加数组或执行一次性 DOM 插入。
|
|
17
|
+
- **lint 哨兵**:`x-callback-driven`、`x-engine-api-override`、`x-raf-interval` 均为非致命提醒;它们用于提示引擎接口风险,不要求作者绕过契约自行添加垫片。
|
|
18
|
+
|
|
19
|
+
实验和版本证据见 [`gsap-emit-v1-evidence.md`](gsap-emit-v1-evidence.md)「回调与 seek 语义」节。
|
|
20
|
+
|
|
21
|
+
## 八条铁律(违反任一条 → 整片渲染失败 / 颗粒冻结 / 全黑 / 坑位内突兀消失 / 画面被切成横带)
|
|
22
|
+
|
|
23
|
+
1. **`<template>` 包裹根元素**:根元素必须位于 `<template>` 内,并带 `data-composition-id`、`data-width`、`data-height`。声明尺寸 MUST 为正整数且等于目标工程画幅;跨比例会拉伸,文字 IR 可在编译期按目标画幅缩放。
|
|
24
|
+
2. **GSAP `paused` 时间线 + 注册**:使用 `gsap.timeline({paused:true})`,并把时间线注册到 `window.__timelines["<id>"]`;`<id>` 必须等于根的 `data-composition-id`。
|
|
25
|
+
3. **确定性**:禁用 `Math.random`、`Date.now` 和无参 `new Date()`。需要随机感时使用固定种子、解析式或递归生成。
|
|
26
|
+
4. **自包含 + 实心底下沉子层 + 透明度显式声明**:颗粒不得依赖外部文件(脚本可由渲染管线 vendor 或可达 CDN 提供)。
|
|
27
|
+
- 实心底 MUST 写在根下第一个全幅子层,MUST NOT 写在根元素 `style` 上。
|
|
28
|
+
- 根元素 MUST 保持零视觉;透明 overlay MUST 在根显式写 `background:transparent`。
|
|
29
|
+
- `gtrk mg lint` 按根与首个全幅子层的 `background` 推导 `opaque`;`4-bg-explicit` 与 `4-bg-on-root` 为非致命提示。
|
|
30
|
+
- HTML 总长 MUST ≤ 2,000,000 个 JS UTF-16 码元,SHOULD ≤ 500,000;位图按实际显示尺寸裁剪缩放后再内嵌,不透明图优先 JPEG/WebP,需要 alpha 才用 PNG,超限则把大图放素材轨。
|
|
31
|
+
5. **脚本用渲染机可达的 CDN(编译期内联)**:使用 `lib.baomitu.com` GSAP 或渲染管线 vendor;不得依赖运行时相对路径。
|
|
32
|
+
6. **颜色/字体用字面值**:禁 CSS `var()` 自定义变量;SVG 属性同样适用。具名字体 MUST 命中渲染服务端注册表,并以 `sans-serif` / `serif` 通用族收尾;栏目主题在生成期替换字面值。
|
|
33
|
+
7. **占满坑位 + 终态驻留**:时间线总长 MUST ≥ 落轨 clip 的实际坑位时长(不是 `duration_hint`)。主叙事结束后定格或有限循环至坑位末尾;禁止 `repeat:-1`、整体渐隐到空或清空画面。循环次数按坑位算死:`repeat = ceil((坑位时长 − 循环起点) / 单圈时长) − 1`。
|
|
34
|
+
8. **重复图元合并**:同色、同 `stroke` / `fill`、整组同步驱动或静态的网格、排线、刻度、点阵 MUST 合并成单个元素;逐元素动画(stagger/逐条画入/逐个变色)可保留元素身份。该规则是作者侧规避,真实触发轴由渲染侧决定,命中批次 MUST 做真渲染抽帧验收。
|
|
35
|
+
|
|
36
|
+
> **⚠️ 铁律编号的唯一定义在本文件。** 栏目 skill / 作坊引用时直接写「gsap-emit v1 铁律 N」,不得另立同号条款;栏目自身规则请使用独立编号空间。
|
|
37
|
+
|
|
38
|
+
> 铁律 4 和铁律 8 的实验依据见 [`gsap-emit-v1-evidence.md`](gsap-emit-v1-evidence.md)。正文只保留当前可执行契约。
|
|
39
|
+
|
|
40
|
+
## 渲染成本:真卷积滤镜
|
|
41
|
+
|
|
42
|
+
> 本节约束逐帧成本,不改变八条正确性铁律;命中成本项时画面仍可能正确,lint 提示保持非致命、不拦铺轨。
|
|
43
|
+
|
|
44
|
+
### 射程
|
|
45
|
+
|
|
46
|
+
| 进射程(真卷积) | 射程外 |
|
|
47
|
+
|---|---|
|
|
48
|
+
| CSS `filter` / `-webkit-filter` / `backdrop-filter` 中的非零 `blur` 或带模糊半径的 `drop-shadow` | `blur(0)`、无模糊半径的 `drop-shadow`、`filter:none`、任何 `box-shadow` |
|
|
49
|
+
| SVG `feGaussianBlur` / `feDropShadow`(含 `filter:url(#id)` 引用) | `opacity`、`transform`、`mix-blend-mode`、`border-radius` |
|
|
50
|
+
|
|
51
|
+
`box-shadow` 整族不报警;铁律 4②管根元素绘制属性的位置,本节管卷积成本,两者互不冲突。
|
|
52
|
+
|
|
53
|
+
### 条文
|
|
54
|
+
|
|
55
|
+
- 真卷积每帧代价随**覆盖面积 × 模糊半径 × 帧数**增长。
|
|
56
|
+
- MUST NOT 用时间线补间驱动 `filter` 或 SVG `stdDeviation`;需要同一叙事动作时改用 `opacity` / `transform`,或做静态两态切换。
|
|
57
|
+
- 带静态滤镜的元素 MUST NOT 再用补间驱动 `transform`;优先拆分滤镜层与运动层,其次缩小覆盖面积,最后才考虑预烘。
|
|
58
|
+
- `gsap.set(el, {filter: …})` 只设一次属于静态形态;`opacity` 补间不在本节射程内。
|
|
59
|
+
- 整幅静态滤镜 SHOULD 缩小覆盖面积。预烘不是默认解法,确需预烘时 MUST 使用 RGBA PNG,并先做同颗对照;MUST NOT 用 JPEG 代替带 alpha 的颗粒素材。
|
|
60
|
+
- 判断权在作者,契约只规定成本机制与改法,不规定视觉取值。
|
|
61
|
+
|
|
62
|
+
### 维护边界
|
|
63
|
+
|
|
64
|
+
成本项保持非致命、不拦铺轨;实际收益取决于颗粒形态,不能把单批实验数字当成通用提速承诺。调整严重度时另开 change,并先复扫现网生产语料。实验和版本证据见 [`gsap-emit-v1-evidence.md`](gsap-emit-v1-evidence.md)。
|
|
65
|
+
|
|
66
|
+
## Alpha 交付口径
|
|
67
|
+
|
|
68
|
+
> 颗粒内一律使用直通 alpha;剪映 qtrle 交付由渲染管线负责预乘。颗粒与 CLI MUST NOT 再做第二次预乘。
|
|
69
|
+
|
|
70
|
+
1. **颗粒侧(MUST)**:颜色使用 `rgba(r,g,b,a)`、`#RRGGBBAA`、`opacity` 或渐变透明值;不得为迁就 NLE 自行把半透明色改暗或回避半透明。
|
|
71
|
+
2. **交付面**:客户端预览、本地 webm 和云端 overlay 合成使用直通 alpha;剪映 qtrle 由管线预乘。
|
|
72
|
+
3. **验收(MUST)**:含软光晕、渐变透明、带 blur 的 `text-shadow` 或 `opacity<1` 图层时,剪映验收必须使用本颗粒或同类半透明颗粒,不能用实心颗粒代验。
|
|
73
|
+
4. **哨兵**:`gtrk mg lint` 的 `x-soft-alpha` 为非致命提示,不拦铺轨、不要求作者改写。
|
|
74
|
+
|
|
75
|
+
## 模板颗粒(ir 态)的改法
|
|
76
|
+
|
|
77
|
+
> **一句话**:由 IR 编译出来的颗粒,改内容 **MUST 改 IR 再重编译**,**MUST NOT 直接改 HTML**。
|
|
78
|
+
> 词表、不变量、编译确定性与三态判定的正本在 infra capability `text-ir-profile`
|
|
79
|
+
> ,本节**只作导读、不复制规则**。
|
|
80
|
+
|
|
81
|
+
同合云的文字特效模板是由一份 **IR 文字子集**确定性编译出来的普通 gsap-emit v1 颗粒——
|
|
82
|
+
对本契约而言它和别的颗粒没有任何区别,`beat_track` 也不为它新增任何键。
|
|
83
|
+
|
|
84
|
+
区别只在**它自带出身证明**:编译产物在 `<template>` 内以
|
|
85
|
+
`<script type="application/json" data-gtrk-ir>` 内嵌完整 IR,并在首行注释写
|
|
86
|
+
`gtrk-ir-sha256` 与 `gtrk-html-sha256` 两个哈希。判定只看文件内容,不依赖文件名或目录。
|
|
87
|
+
|
|
88
|
+
| 三态 | 含义 | 还能云端改写吗 |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| `ir` | 内嵌 IR 在,且声明的 html 哈希与实测一致 | 能 |
|
|
91
|
+
| `detached` | 内嵌 IR 在但哈希对不上 ⇒ HTML 被直接改过 | 不能;可按内嵌 IR 重编回模板 |
|
|
92
|
+
| `html` | 无内嵌 IR(绝大多数颗粒) | 不能(本来也不需要) |
|
|
93
|
+
|
|
94
|
+
**手改 HTML 是单向操作**:改一个字节就从 `ir` 掉到 `detached`,`gtrk mg edit` 与客户端
|
|
95
|
+
属性面板都会拒绝它。颗粒本身照常能渲能铺,所以 `gtrk mg lint` 只给**非致命**的
|
|
96
|
+
`x-ir-detached` 提醒,不拦。
|
|
97
|
+
|
|
98
|
+
两条合法改法:
|
|
99
|
+
- **改字 / 换色 / 改字号描边阴影 / 改时长**:改 IR 后 `gtrk mg compile <ir.json>`(L0,0 积分)。
|
|
100
|
+
- **换效果**:`gtrk mg edit <particle.html> --say "<一句话>"`(经云端模型链,按候选计费)。
|
|
101
|
+
|
|
102
|
+
**内嵌的 JSON 块不参与渲染**,也不在本契约任何检查的射程内(它既没有 `src` 也不执行)。
|
|
103
|
+
|
|
104
|
+
## 颗粒骨架(中性模板)
|
|
105
|
+
|
|
106
|
+
```html
|
|
107
|
+
<template id="p">
|
|
108
|
+
<!-- 铁律4:根 MUST 零视觉。这里的 background 恒为 transparent(显式声明,不是省略),实心底一律下沉到下面的 .bgfill 子层 -->
|
|
109
|
+
<div data-composition-id="<id>" data-width="1920" data-height="1080"
|
|
110
|
+
style="position:absolute;inset:0;background:transparent;overflow:hidden;font-family:'<你的字体·须命中服务端 font_manifest.json>',sans-serif;">
|
|
111
|
+
<!-- 铁律4①:实心底 MUST 是根下第一个全幅子层。满屏颗粒填你栏目的底色;透明叠加(overlay)颗粒把整行删掉 -->
|
|
112
|
+
<div class="bgfill" style="position:absolute;inset:0;background:<你的底色>;z-index:0;"></div>
|
|
113
|
+
<style> [data-composition-id="<id>"] .xxx{ … } </style> <!-- 样式用属性选择器作用域,防跨颗粒污染 -->
|
|
114
|
+
<svg viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid meet" style="position:absolute;inset:0;width:100%;height:100%;">…</svg>
|
|
115
|
+
<script src="https://lib.baomitu.com/gsap/3.13.0/gsap.min.js"></script>
|
|
116
|
+
<script>(function(){
|
|
117
|
+
var ROOT='[data-composition-id="<id>"]';
|
|
118
|
+
/* 1) 确定性构建静态结构 */
|
|
119
|
+
/* 2) gsap.set 初始态 */
|
|
120
|
+
/* 3) var tl = gsap.timeline({paused:true}); … 编排 … */
|
|
121
|
+
window.__timelines = window.__timelines || {};
|
|
122
|
+
window.__timelines["<id>"] = tl;
|
|
123
|
+
})();</script>
|
|
124
|
+
</div>
|
|
125
|
+
</template>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
> **骨架里 `.bgfill` 那一行的三个要点**:① 它 MUST 是**根下第一个**子元素(后续前景层自然压在它之上,不必给前景排 z-index);
|
|
129
|
+
> ② 它 MUST **全幅**(`position:absolute;inset:0`,或等价的 `top/left/width/height` 铺满)——不铺满就不是「实心底」;
|
|
130
|
+
> ③ 类名 `bgfill` 只是**惯例**,其底色写在**行内 style** 上(不靠 `<style>` 里的类规则),故不受「样式作用域」那条专属坑影响;
|
|
131
|
+
> 换名字不违约,但 `gtrk mg lint` 认的是「根下首个全幅子层的 `background`」这个**结构**,不认类名。
|
|
132
|
+
|
|
133
|
+
缓动可用 CustomEase 精确还原你栏目自己的 cubic-bezier(缺插件时给近似回退)——bezier 数值属于栏目审美,本契约不规定。
|
|
134
|
+
|
|
135
|
+
## 确定性配方(替代 random)
|
|
136
|
+
|
|
137
|
+
- 递归结构:固定角度、比例、深度参数 → 完全确定。
|
|
138
|
+
- "噪声感":`Math.sin(i*0.18 + j*0.2)` 类解析式伪随机。
|
|
139
|
+
- 打散:用 index 派生(如 `i*137.5°` 黄金角),不要 `Math.random()`。
|
|
140
|
+
|
|
141
|
+
## 验证(交付前必做)
|
|
142
|
+
|
|
143
|
+
墙钟截图类工具驱动不了 paused 时间线(只看到 t=0),**不能**用来验收。必须真渲染引擎 seek 验证:
|
|
144
|
+
1. 颗粒放进最小 composition(root `index.html` 用 `data-composition-src` 引它);
|
|
145
|
+
2. 走渲染管线(html_animate_render)渲染;
|
|
146
|
+
3. 抽不同时间点的帧**比对应当不同**(相同=冻结=铁律没守住)。客观自检:根有 `<template>`、`window.__timelines["<id>"]` 已注册且 id 匹配、无 random/Date、tl 总长 ≥ 颗粒时长、HTML ≤ 2,000,000 字符(铁律 4;`gtrk mg lint` 的 `4-html-size`)。
|
|
147
|
+
> ⚠️ 不要用「本地等价 seek 脚本 / Node 无头模拟」替代真引擎渲染——它不经真编译+挂载,无法覆盖 var()、CDN 内联和 StaticGuard 等真引擎行为。
|
|
110
148
|
>
|
|
111
|
-
>
|
|
112
|
-
>
|
|
113
|
-
>
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
- **豁免**:需要**逐元素动画**(stagger / 逐条画入 / 逐个变色)的批次不在本条范围内——元素身份是该批动画所必需的。此类批次若同时是满幅大面积绘制,MUST 以真渲染出片抽帧验收;这是保守兜底,**不是**「满幅即危险」的风险判据,反向的「不满幅即安全」同样不成立。
|
|
127
|
-
- **违反表现**:画幅被切成等高横带、相邻带内容互相纵向重复叠印(同一元素在 `y` 与 `y±带高` 各画一次,或被顶部裁半)并逐帧闪烁;该表现与动画逻辑无关,同帧里零动画的静态元素也会重复。DOM 元素数与 `getBoundingClientRect` 均正常,本地播放器与客户端预览看不出。
|
|
128
|
-
- **这是规避,不是根治**:缺陷出在渲染侧已由真机行为确证——颗粒的 DOM 元素数与布局值正常,不是颗粒写错。机制层面**推断**为渲染侧按等高带做局部栅格刷新时失效区域算错,**属推断、未经渲染侧确认**;**真实触发轴至今未知**,「图元总数」「同页累积负载」「同父同类聚簇」均已被跨颗粒真渲反例否证。本条 MUST NOT 被读成「图元少 / 负载低就安全」。
|
|
129
|
-
- **根治登记**:根治方 = 渲染管线侧;当前状态 = **未立项(2026-07-26;决策角色 = 本 change 实施者,按 proposal 的跨仓授权边界不代提;是否立项仍待主理人另行授权)**。
|
|
130
|
-
- **根治后处置预案**:待渲染管线侧根治上线且经真机确认缺陷不再复现后,本条由 **MUST 降为 SHOULD**,并保留「本条曾于 2026-07-26、本证据锚所载引擎版本口径下作为规避所必需」的历史记录。
|
|
131
|
-
|
|
132
|
-
> **⚠️ 铁律编号的唯一定义在本文件。** 本契约的**铁律 7 = 「占满坑位 + 终态驻留」**,这是框架侧对该条号的**唯一**定义。
|
|
133
|
-
> 创作侧(栏目 skill / 作坊)的模板与 references **MUST NOT 另立同号铁律**——引用请写「gsap-emit v1 铁律 7」并指回本文件,
|
|
134
|
-
> 自己的栏目约束请用**栏目注记**或另起独立编号空间。
|
|
135
|
-
> **已知撞号(2026-07-26 记录,收口中)**:某栏目 references 曾把「根元素零视觉」编为其「铁律 7」、同一条在其模板里又编为「铁律③」——
|
|
136
|
-
> 该约束现已**升为本契约的铁律 4**(见上),栏目侧的两个同名条号 SHALL 改为引用铁律 4,不再另立。
|
|
137
|
-
|
|
138
|
-
### 铁律 4「实心底下沉子层」的真机证据锚(2026-07-26)
|
|
139
|
-
|
|
140
|
-
本条断言的是**渲染引擎行为**(「根元素的绘制属性在挂载时被丢弃」),故按契约库要求附可追溯证据锚:
|
|
141
|
-
|
|
142
|
-
- **结论**:根 `style` 的 `background` **不落成像素**;同一颗粒把同一底色改写到根下首个全幅子层则**满屏落地并盖住底轨**。
|
|
143
|
-
- **实验日期 / 机器**:2026-07-26 · 真机(生产同款渲染主机;真渲,非本地无头模拟)。
|
|
144
|
-
- **引擎版本口径**:渲染引擎 CLI 与 producer 同版 `0.6.101` · 无头浏览器内核 `131.x`。
|
|
145
|
-
- **设计**:同颗粒母本造两个变体,**唯一变量 = 实心底摆在根 `style` 还是根下首个全幅子层**,其余逐字节相同;
|
|
146
|
-
底色临时取高饱和标志色以便与「根合成兜底黑」区分;底轨用一段有明显画面、非黑的真人镜头;抽同一时间点 `t=8.0s` 的帧,
|
|
147
|
-
取四角 `crop=40:40` 于 `(20,20) (1860,20) (20,1020) (1860,1020)` 后 `scale=1:1` 读像素。
|
|
148
|
-
- **观测**(整轨拆分渲染路径,两格同素材同引擎同批)。
|
|
149
|
-
⚠️ 下表的六位数字是**抽帧读出的 RGB 像素读数**(实验观测),**不是本契约规定的任何底色**——
|
|
150
|
-
轴一边界照旧:契约不点名任何色值,底色取值永远由调用方栏目决定:
|
|
151
|
-
|
|
152
|
-
| 变体 | 四角像素 | 判读 |
|
|
153
|
-
|---|---|---|
|
|
154
|
-
| 实心底写**根 `style`** | `dfdad4 / fafcfb / 4e4f52 / f9fbfb` | ≈ 底轨基线 → **底丢失、底轨透出** |
|
|
155
|
-
| 实心底写**根下首个全幅子层** | `01ff81 / 00fe80 / 01fd80 / 01fd80` | ≈ 标志色 → **底存活、满屏盖住底轨** |
|
|
156
|
-
| 底轨本身(阴性对照) | `e0dbd4 / fbfdfc / 4f5052 / fbfdfd` | 四角始终高亮非黑,对照有效 |
|
|
157
|
-
|
|
158
|
-
- **阳性对照(关键,排除平凡解)**:「写根」那格的整帧里颗粒**前景元素完整渲出**(标题文字、网格、连线、色块都在)——
|
|
159
|
-
所以它**不是「颗粒没渲上」,而是「颗粒渲上了、根 `background` 被丢掉」**。缺这一步,两种情况在像素上同解。
|
|
160
|
-
- **复现方式**:造上述两变体 → 同一批走整轨拆分渲染 → 按上「设计」段的抽帧与四角取样口径(`t=8.0s` 单帧 / `crop=40:40` / `scale=1:1`)取样,
|
|
161
|
-
再以 RGB24 原始字节读出四角的十六进制像素值。取样工具与复现件的本地路径不进入分发契约(同铁律 8 证据锚口径)。
|
|
162
|
-
- **历史**:本条现象最早由创作侧于 **2026-07-15** 记载(一颗满屏颗粒的根 `background` 丢帧、成片只剩浮空面板),
|
|
163
|
-
当时未进框架契约,框架正本反而长期要求「写在根上」——2026-07-26 的实验复现并坐实了该记载,本条据此改写。
|
|
164
|
-
- **相关跨仓 change**:`gitruck-cli` / `align-particle-solid-backdrop-contract`(本条的来源);
|
|
165
|
-
`gitruck-infra` / `add-html-animate-opaque-fullscreen-cover`(**另一个独立问题**:渲染侧要不要按 `opaque` 位替颗粒兜一层黑底)。
|
|
166
|
-
⚠️ 两者**互不依赖**:上表的观测正是在后者**未 apply** 时取得的——即**本条的修法(下沉子层)当场生效,不需要渲染侧任何配合**。
|
|
167
|
-
|
|
168
|
-
### 铁律 8「重复图元合并」的真机证据锚(2026-07-26)
|
|
169
|
-
|
|
170
|
-
本条断言的是一条**作者侧规避写法**及其在真渲染中的效果,不断言已知触发轴。证据锚如下:
|
|
171
|
-
|
|
172
|
-
- **结论**:同一故障样本把 37 条满幅 `<line>` 合为一条 `<path>` 多子路径后,目标画面逐像素不变,横带重复率由 **65%~68% 降至 2%**;规避当场有效,但合并同时改变了图元数、DOM 结构与栅格化路径,故本实验**不能证明是哪一个变量生效**。
|
|
173
|
-
- **实验日期 / 机器**:2026-07-26 · 真机(生产同款渲染主机;真渲,非本地无头模拟)。
|
|
174
|
-
- **引擎版本口径**:渲染引擎 CLI 与 producer 同版 `0.6.101` · 无头浏览器内核 `131.x`。
|
|
175
|
-
- **二分设计**:以同一颗粒为母本逐项只改一个构建块,每个变体各做一次真渲;每格抽取 168 帧,按等高横带间的重复像素统计复现率。装配路径、分辨率、帧率、底轨与其余颗粒代码保持一致。
|
|
176
|
-
- **范围限定(硬约束)**:下表全部是**同一颗粒内部**的二分结果,**MUST NOT 跨颗粒外推**;它只能说明这些改动在该颗粒内与复现率同向变化,不能推出「元素数少就安全」或任何数字门槛。
|
|
177
|
-
|
|
178
|
-
| 同一颗粒内的变体 | 重复率 | 限定读法 |
|
|
179
|
-
|---|---:|---|
|
|
180
|
-
| 原件:背景网格为 37 条满幅 `<line>` | **65%~68%**(复跑一致) | 故障基线 |
|
|
181
|
-
| 37 条 `<line>` 合为一条 `<path>` 多子路径 | **2%** | 本条规避正例;目标画面逐像素不变 |
|
|
182
|
-
| 整块删除背景网格 | **2%** | 与合并同档;只说明该块在本颗粒内参与复现 |
|
|
183
|
-
| 删除两个静态术语文本块 | **0%~1%** | 删除任一块负载都退烧;作用域仅限本颗粒,机制未知 |
|
|
184
|
-
| 删除三行静态标签文本块 | **0%~1%** | 同上 |
|
|
185
|
-
| 换字体族 / 去斜体 / 关闭 3D 加速 / 改入场位移 / 把文字改为 SVG `<text>` / 给根加变换提示 / 把网格改静态 | **仍为 65%+** | 均无效 |
|
|
186
|
-
| 增加满屏失效脉冲层 | **14%** | 作者侧强制全幅失效仍不能根治 |
|
|
187
|
-
| 极简结构(20 个静态 `<div>` + 1 个网格) | **0%** | 空载变体不复现;不得外推为通用预算 |
|
|
188
|
-
|
|
189
|
-
- **阳性对照(排除平凡解)**:合并版仍完整绘制与原件相同的整张网格,逐像素对拍一致;它不是「把内容删没了所以不重复」。同一颗粒内另有 24 条局部短线在合并版中继续保留,故 24 与 37 也 **MUST NOT** 被写成安全 / 故障分界。
|
|
190
|
-
- **跨颗粒反证(同批全量体检)**:同装配、同引擎、同机完成 **21 颗粒 + 六 beat 同页聚合,共 24 次渲染 / 约 22,000 帧**。这些结果专门限制上表的外推范围:
|
|
191
|
-
|
|
192
|
-
| 样本 | 真渲结果 | 可否证的候选轴 |
|
|
193
|
-
|---|---:|---|
|
|
194
|
-
| 另一密阵样本:884 条短划、全颗共 921 个绘制图元 | **0.0% 脏帧** | 图元总数、同父同类聚簇 |
|
|
195
|
-
| 六 beat 同页聚合:约 1,400 个绘制图元 | **0.0% 脏帧** | 同页累积负载 |
|
|
196
|
-
| 当前修复版样本(回归 / 阴性对照) | **0.0% 脏帧** | 规避在整轨分片路径下仍稳 |
|
|
197
|
-
| 未修版样本(阳性对照) | **70.3% 脏帧** | 缺陷仍活且可稳定复现 |
|
|
198
|
-
|
|
199
|
-
**真实触发轴至今未知**;当前已否证的候选轴 = **图元总数 / 同页累积负载 / 同父同类聚簇**。上表中「921 个图元干净」与「较少图元的阳性对照中招」同时成立,因此数字方向不存在可据此写入契约的安全门槛。
|
|
200
|
-
- **复现方式**:从同一母本生成上述单变量变体 → 走生产同款整轨分片渲染 → 对每格 168 帧计算等高横带间的重复率并抽取高分帧肉眼复核;再以同一口径跑 21 颗全量语料、六 beat 同页聚合、修复版阴性对照与未修版阳性对照。复现件的本地路径与文件名不进入分发契约。
|
|
201
|
-
- **相关 change / 根治状态**:本仓 `add-particle-primitive-merge-law` 收录作者侧规避;渲染管线侧根治**未立项(2026-07-26,本 change 实施会话按非目标不代提;待主理人另行决定)**。根治上线并经真机确认后,按铁律 8 的预案把 MUST 降为 SHOULD。
|
|
202
|
-
|
|
203
|
-
## 渲染成本:真卷积滤镜(2026-07-30 增补)
|
|
204
|
-
|
|
205
|
-
> **本节不是铁律**(铁律仍是**八条**,编号空间不动)。铁律管的是**正确性失效**(渲不出 / 冻结 / 全黑 / 突兀消失 / 横带叠印);
|
|
206
|
-
> 本节管的是**每帧成本**——命中本节的颗粒**画面是对的,只是贵**。故本节用 MUST NOT / SHOULD 约束写法,
|
|
207
|
-
> 但**不进「违反即废片」的铁律清单**。
|
|
208
|
-
|
|
209
|
-
### 射程(本节说的「真卷积滤镜」精确指这三类)
|
|
210
|
-
|
|
211
|
-
| 进射程(真卷积) | 射程外(本节不管、消费侧也不报) |
|
|
212
|
-
|---|---|
|
|
213
|
-
| CSS `filter` / `-webkit-filter` / `backdrop-filter` 的值里含 `blur(<非零>)` 或 `drop-shadow(… <非零模糊半径> …)` | `filter: blur(0)` / `blur(0px)`、`drop-shadow(x y)`(模糊半径缺省 = 0)、`filter: none` |
|
|
214
|
-
| SVG `<feGaussianBlur stdDeviation="<非零>">`、`<feDropShadow>`(含经 `filter="url(#id)"` 引用者) | **任何 `box-shadow`** |
|
|
215
|
-
| 上述两类出现在 `<style>` 规则、元素内联 `style`、或时间线补间属性对象里的任一位置 | `opacity` / `transform` / `mix-blend-mode` / `border-radius` |
|
|
216
|
-
|
|
217
|
-
- **`box-shadow` 整族豁免、不报警**——包括 `box-shadow: 0 0 0 Npx <color>` 这类零卷积的纯 spread 描边/光圈写法
|
|
218
|
-
(脉冲扩散的标准句式,现网大量在用),**也包括 blur-radius > 0 的写法**。后者**确实是卷积**,
|
|
219
|
-
这一点如实记录在此;但把 `box-shadow` 纳入射程需要正确解析它的多值语法(`inset`、多组逗号、颜色可前可后、长度 2~4 个),
|
|
220
|
-
误报率高而现网收益为零,故整族排除。⚠️ 这是**已定的射程边界**,**不是**「待纳入 / 下版收编」;
|
|
221
|
-
要改变它,先证明存在受益的现网用法。
|
|
222
|
-
- **与铁律 4② 的语义分工(两条正交,不冲突)**:铁律 4② 把 `box-shadow` 列进「根元素 MUST 保持零视觉」的**绘制属性清单**,
|
|
223
|
-
管的是「绘制属性摆在根上不生效」;**本节管的是每帧卷积成本**。同一个属性名出现在两处不是口径打架——
|
|
224
|
-
一处论**位置**,一处论**成本**。
|
|
225
|
-
|
|
226
|
-
### 条文
|
|
227
|
-
|
|
228
|
-
- **成本模型**:真卷积滤镜的每帧代价 ∝ **被覆盖面积 × 模糊半径 × 帧数**。逐帧渲染要把每一帧都算一遍,
|
|
229
|
-
所以它与「本地播放器里看着很流畅」毫无关系。
|
|
230
|
-
- **MUST NOT 用时间线补间驱动 `filter` 属性**(也包括补间驱动被引用 SVG 滤镜的 `stdDeviation`):
|
|
231
|
-
滤镜值一变,上一帧的卷积结果**当场失效**,缓存彻底失灵,这是本节里最贵的形态。
|
|
232
|
-
同一叙事动作请改用 `opacity` / `transform`(`scale` / 位移)表达;确需滤镜就做成**静态两态切换**,别让它随时间连续变。
|
|
233
|
-
- **元素带静态滤镜时 MUST NOT 用补间驱动它的 `transform`**(2026-08-06 增补,真机实测 **+42.7%**,
|
|
234
|
-
比补间驱动 `filter` 本身的 **+36.2%** **还贵**——它是本节里最容易被忽略、也最贵的一档):
|
|
235
|
-
滤镜值虽然没变,但**被滤子树每帧换一个几何**,上一帧的卷积结果同样当场失效,
|
|
236
|
-
与「补间驱动 filter」是**同一类缓存失效**,只是驱动源换成了 transform。
|
|
237
|
-
改法按优先级:① 把滤镜**移到不参与位移/缩放的那一层**(滤镜层与运动层拆开,运动交给外层容器);
|
|
238
|
-
② 缩小被滤元素的几何覆盖面积;③ 预烘成 RGBA PNG 再随 transform 走(预烘图平移是零卷积)。
|
|
239
|
-
⚠️ **射程只收 `transform`**:`opacity` 被补间驱动**不在本节射程**——opacity 侧尚无对照实测,不凭推测扩;
|
|
240
|
-
且现网唯一含滤镜的生产颗粒恰恰只被 `opacity` 驱动,收它等于把一个已知便宜的写法打成命中。
|
|
241
|
-
- **`gsap.set(el, {filter: …})` 只设一次 = 静态形态**(2026-08-06 实测坐实:与写死在 CSS 里
|
|
242
|
-
**产物逐字节相同**、墙钟差 0.6% 在噪声内)。它按「整幅静态滤镜」那条走,**不按「补间驱动」那条判成本**。
|
|
243
|
-
(消费侧 lint 出于「宁误报不漏报」把它归在动画化项里报,属**检查项的保守取值**,不是本节的成本判定。)
|
|
244
|
-
- **整幅静态滤镜 SHOULD 缩小被滤元素的几何覆盖面积**:把滤镜收到它真正需要的那块矩形上。
|
|
245
|
-
面积一项**同时**压掉「卷积」与「整幅逐帧合成」两笔成本,故它是首选改法。
|
|
246
|
-
- **MUST NOT 把「预烘成图」写成一律解法**:整幅静态滤镜的每帧成本由**两项**构成——① 卷积本身;② 整幅逐帧合成。
|
|
247
|
-
预烘只消得掉 ①,② **照样每帧付**,故预烘的收益**存在上限、必有残差**;而且把活颗粒烤死会牺牲「全程可拖可调」这一产品前提。
|
|
248
|
-
预烘是**次选**,不是缺省答案。
|
|
249
|
-
⚠️ **2026-08-06 真机实测把这条推到更强的位置:整幅静态滤镜的预烘在本管线上可以是净亏。**
|
|
250
|
-
同颗对照下「把整幅 blur 层换成等效的无 filter 半透明渐变」= **64.46s vs 原样 38.07s,贵 69%**——
|
|
251
|
-
因为预烘把 blur 抹掉的高频还了回来,capture 与 ProRes 编码双双变贵(同 §证据锚 的频谱机制)。
|
|
252
|
-
⇒ **对「整幅静态滤镜」这一形态,首选改法只有「缩小被滤面积」一条**;
|
|
253
|
-
预烘 SHOULD 先做同颗对照实测再决定,**MUST NOT 当成默认改法开出去**。
|
|
254
|
-
(口径声明:该实测的「预烘」是**近似**——换成等效无 filter 渐变,给的是「每帧重卷积 → 一次性 blit」那一侧的**下界**;
|
|
255
|
-
下界已经是净亏,真离线烘图只会更差或持平。)
|
|
256
|
-
- **确要预烘时 MUST 用 RGBA PNG**,**MUST NOT** 用 JPEG 或任何无 alpha 格式:透明叠加颗粒的 alpha 是成片合成的**必需通道**,
|
|
257
|
-
丢了 alpha 的图在成片里会塌成一块不透明色块(前景盖住底轨)。
|
|
258
|
-
- **判断权在作者**:去不去某个滤镜属**视觉取值**,本契约不规定视觉取值——本节只给成本机制与改法。
|
|
259
|
-
|
|
260
|
-
### 证据锚(只收有出处的数;每条带测量日期 + 语料标注)
|
|
261
|
-
|
|
262
|
-
- **测量日期**:2026-07-30。**版本口径**:渲染引擎 CLI 与 producer 同版 `0.7.82` · 无头浏览器内核 `152.x`。
|
|
263
|
-
测量在真机(生产同款渲染主机)取得,非本地无头模拟。
|
|
264
|
-
- **现网既有栏目语料(21 颗生产颗粒)**:去掉真卷积滤镜的可省墙钟 **0~3.1%**——即**本节对现有语料近似零收益**,
|
|
265
|
-
它立在这里是**前置门**(防止大批带滤镜的新语料进渲染管线后整批返工),**不是**提速手段。
|
|
266
|
-
- ⚠️ **「去滤镜省墙钟」依颗粒形态而定,MUST NOT 一概而论**(2026-08-06 真机同颗粒对照,**测出方向相反的两侧**):
|
|
267
|
-
| 形态 | 去滤镜后墙钟 | 产物字节 | 方向 |
|
|
268
|
-
|---|---|---|---|
|
|
269
|
-
| **局部**滤镜、底下**平坦**(现网真颗粒:790×290 衬底 + 词光) | 51.66s → **46.10s(省 10.76%)** | −62% | **省** |
|
|
270
|
-
| **整幅**滤镜、底下**带抖动渐变** | 38.07s → **69.70s(慢 83%)** | +29%(356 MB → 459 MB) | **亏** |
|
|
271
|
-
**机制是同一条**:本管线的墙钟由 **capture + encode** 主导(capture 约占单次 CLI 全程 **89%**),
|
|
272
|
-
而 `blur` **抹掉高频** ⇒ 每帧截图与 ProRes 4444 编码都更便宜。
|
|
273
|
-
⇒ **决定墙钟的是「去掉滤镜后画面频谱的变化方向」,不是「有没有滤镜」**——
|
|
274
|
-
去滤镜让画面变平就省,让高频回来就亏。
|
|
275
|
-
📌 **这条不动摇本节的立项与条文**:本节真正要抓的是**每帧重卷积导致缓存失效**那一类
|
|
276
|
-
(补间驱动 `filter` / 静态 filter 而 `transform` 被补间驱动),它们是**同一颗粒内的对照**、方向确定为正
|
|
277
|
-
(实测 **+36.2%** / **+42.7%**),与「去不去某个滤镜」是两个不同的问题。
|
|
278
|
-
- **单次误用的止损量级(同一颗粒内对照)**:**1.3~3.3×**。
|
|
279
|
-
- **同一颗粒内的形态对照(2026-08-06 真机,1920×1080 / 180 帧 / 30fps,每档 3 次取中位数)**——
|
|
280
|
-
这组才是本节条文的直接依据(**控制内容不变、只换 filter 的用法**):
|
|
281
|
-
| 形态 | 中位墙钟 | 相对整幅静态 blur |
|
|
282
|
-
|---|---|---|
|
|
283
|
-
| 整幅**静态** `blur(24px)`(基准) | 38.07s | — |
|
|
284
|
-
| `gsap.set` **只设一次** filter | 38.29s | **+0.6%(噪声内,产物逐字节相同)** ⇒ 等价于静态 |
|
|
285
|
-
| 整幅 blur **被补间驱动**(8→40px) | 51.86s | **+36.2%** |
|
|
286
|
-
| **静态** filter、其 `transform` **被补间驱动** | 54.32s | **+42.7%(最贵的一档)** |
|
|
287
|
-
- **滤镜重语料(技法颗粒,单颗 646 帧)**:**7.0×**(339.6s → 48.3s)。
|
|
288
|
-
⚠️ 该数**只对该语料成立**,MUST NOT 外推成通用提速承诺。
|
|
289
|
-
- **消费侧沉默不等于便宜**:`gtrk mg lint` 的四个成本项(`c-filter-animated` / `c-filter-static-fullbleed` /
|
|
290
|
-
**`c-filter-static-transformed`**(2026-08-06 增补,覆盖上面那条 +42.7% 的漏报面)/ `c-filter-indeterminate`)
|
|
291
|
-
是**形态提示**,**当期一律非致命、不拦铺轨**;没报**不代表**这颗渲得快——
|
|
292
|
-
真判据永远是**真渲染出片计时**。
|
|
293
|
-
- **致命性的升级触发器(登记在此,免得日后凭印象改)**:把 `c-filter-animated` 提为**致命**
|
|
294
|
-
SHALL 另走一个独立 change,且 SHALL 同时满足两项前提——① 「滤镜重语料批量进渲染管线」那条路线**已立项**;
|
|
295
|
-
② 提级前对现网生产语料**全量复扫且零命中**(复扫在生产颗粒上命中 > 0 即 MUST NOT 提级)。
|
|
296
|
-
触发一次评估的时机 = 上述路线立项 **或** 本节首次改版,以先到者为准。
|
|
297
|
-
**MUST NOT** 以「规范就该严」为由径直提级,也 **MUST NOT** 把致命性做成可现场翻转的运行期开关。
|
|
298
|
-
|
|
299
|
-
### 根治登记
|
|
300
|
-
|
|
301
|
-
- **① 这是降本规范、不是缺陷规避**:命中项的画面本身是对的,逐帧也正确,只是每帧贵。
|
|
302
|
-
- **② 成本的根在渲染管线侧**:逐帧路径走**软件光栅**(无图形硬件加速),卷积按面积×半径吃 CPU。
|
|
303
|
-
- **③ 根治状态 = 明确不立项(2026-07-30)**:改走图形硬件加速路径会破坏「逐帧确定性」与「产出端版本对齐」这两项前提
|
|
304
|
-
(异构机器还会破坏分片与单次的产物等价),渲染侧调研已把它列为**已排除项**。故本节以作者侧写法收敛,不等渲染侧。
|
|
305
|
-
- **④ 根治后的处置预案**:若渲染侧将来换掉光栅路径并经真机复测确认成本塌陷,本节由 MUST NOT/SHOULD **降为提示**,
|
|
306
|
-
并保留「本节曾于 2026-07-30、本证据锚所载版本口径下作为降本规范所必需」的历史记录。
|
|
307
|
-
|
|
308
|
-
## Alpha 交付口径(2026-09-14 增补 · 真机事故沉淀)
|
|
309
|
-
|
|
310
|
-
> **一句话**:颗粒内**一律直通 alpha**(浏览器语义),半透明是合法且鼓励的手段;把直通换成预乘是**渲染管线在剪映交付面上的义务**,不是颗粒作者或 CLI 的事。本节是该主题的唯一口径来源,`gtrk mg lint` 的 `x-soft-alpha` 文案指向这里。
|
|
311
|
-
|
|
312
|
-
**事故**:文字特效模板库首批颗粒(径向渐变星芒 + `text-shadow` 软晕)经云端 qtrle 交付拖进剪映,软光晕塌成实心白多边形、50% 黄晕成满强度橙边。根因 = 剪映按**预乘** alpha 合成 qtrle(`dst×(1−α)+src`),而管线交付的是**直通** alpha;此前颗粒几乎全实心只有抗锯齿边,错配只在 1px 边缘上、看不出。修法落在 infra `html-render-qtrle-layer`(`fix-qtrle-premultiplied-alpha-for-jianying`):qtrle 编码前 `format=rgba,premultiply=inplace=1`。
|
|
313
|
-
|
|
314
|
-
### 条款
|
|
315
|
-
|
|
316
|
-
1. **颗粒侧(MUST)**:颗粒里的一切颜色按**直通 alpha** 写(`rgba(r,g,b,a)` / `#RRGGBBAA` / `opacity` / 渐变里的 `transparent`),作者 **MUST NOT** 为迁就任何 NLE 自行"预乘"(把半透明色改暗)或回避半透明。软光晕、渐变、`text-shadow` 软晕、`opacity<1` 图层都是合法手段;真卷积滤镜另见「渲染成本」节。
|
|
317
|
-
2. **交付面(事实,作者应知)**:客户端预览、本地 webm 层、云端 overlay 合成 = **直通**;剪映 qtrle 交付 = **管线预乘**(唯一一处)。颗粒与 CLI **MUST NOT** 再做第二次预乘(双重预乘会把软边压暗)。
|
|
318
|
-
3. **验收纪律(MUST)**:凡颗粒含**半透明面积**(软光晕 / 渐变到 transparent / `text-shadow` 带 blur / `opacity<1` 图层,半透明像素占比 ≥1%),剪映路径的真机格 **MUST 用这颗本身或同类颗粒**验,**MUST NOT** 拿实心 + 抗锯齿边的颗粒代验——后者对预乘错配结构性失明。抽帧判据:解出的 qtrle 帧里半透明像素满足 `RGB ≈ 直通色 × α`。
|
|
319
|
-
4. **哨兵**:`gtrk mg lint` 对含半透明面积的颗粒给**非致命**信息项 `x-soft-alpha`,只提醒「本颗粒的剪映交付依赖管线预乘配方(infra ≥ fix-qtrle-premultiplied-alpha-for-jianying),旧渲染服务会把软边渲成实心」,不拦铺轨、不要求作者改写。
|
|
320
|
-
|
|
321
|
-
## 模板颗粒(ir 态)的改法(2026-09-14 增补)
|
|
322
|
-
|
|
323
|
-
> **一句话**:由 IR 编译出来的颗粒,改内容 **MUST 改 IR 再重编译**,**MUST NOT 直接改 HTML**。
|
|
324
|
-
> 词表、不变量、编译确定性与三态判定的正本在 infra capability `text-ir-profile`
|
|
325
|
-
> (change `add-text-ir-profile-and-compiler`),本节**只作导读、不复制规则**。
|
|
326
|
-
|
|
327
|
-
同合云的文字特效模板是由一份 **IR 文字子集**确定性编译出来的普通 gsap-emit v1 颗粒——
|
|
328
|
-
对本契约而言它和别的颗粒没有任何区别,`beat_track` 也不为它新增任何键。
|
|
329
|
-
|
|
330
|
-
区别只在**它自带出身证明**:编译产物在 `<template>` 内以
|
|
331
|
-
`<script type="application/json" data-gtrk-ir>` 内嵌完整 IR,并在首行注释写
|
|
332
|
-
`gtrk-ir-sha256` 与 `gtrk-html-sha256` 两个哈希。判定只看文件内容,不依赖文件名或目录。
|
|
333
|
-
|
|
334
|
-
| 三态 | 含义 | 还能云端改写吗 |
|
|
335
|
-
|---|---|---|
|
|
336
|
-
| `ir` | 内嵌 IR 在,且声明的 html 哈希与实测一致 | 能 |
|
|
337
|
-
| `detached` | 内嵌 IR 在但哈希对不上 ⇒ HTML 被直接改过 | 不能;可按内嵌 IR 重编回模板 |
|
|
338
|
-
| `html` | 无内嵌 IR(绝大多数颗粒) | 不能(本来也不需要) |
|
|
339
|
-
|
|
340
|
-
**手改 HTML 是单向操作**:改一个字节就从 `ir` 掉到 `detached`,`gtrk mg edit` 与客户端
|
|
341
|
-
属性面板都会拒绝它。颗粒本身照常能渲能铺,所以 `gtrk mg lint` 只给**非致命**的
|
|
342
|
-
`x-ir-detached` 提醒,不拦。
|
|
343
|
-
|
|
344
|
-
两条合法改法:
|
|
345
|
-
- **改字 / 换色 / 改字号描边阴影 / 改时长**:改 IR 后 `gtrk mg compile <ir.json>`(L0,0 积分)。
|
|
346
|
-
- **换效果**:`gtrk mg edit <particle.html> --say "<一句话>"`(经云端模型链,按候选计费)。
|
|
347
|
-
|
|
348
|
-
**内嵌的 JSON 块不参与渲染**,也不在本契约任何检查的射程内(它既没有 `src` 也不执行)。
|
|
349
|
-
|
|
350
|
-
## 颗粒骨架(中性模板)
|
|
351
|
-
|
|
352
|
-
```html
|
|
353
|
-
<template id="p">
|
|
354
|
-
<!-- 铁律4:根 MUST 零视觉。这里的 background 恒为 transparent(显式声明,不是省略),实心底一律下沉到下面的 .bgfill 子层 -->
|
|
355
|
-
<div data-composition-id="<id>" data-width="1920" data-height="1080"
|
|
356
|
-
style="position:absolute;inset:0;background:transparent;overflow:hidden;font-family:'<你的字体·须命中服务端 font_manifest.json>',sans-serif;">
|
|
357
|
-
<!-- 铁律4①:实心底 MUST 是根下第一个全幅子层。满屏颗粒填你栏目的底色;透明叠加(overlay)颗粒把整行删掉 -->
|
|
358
|
-
<div class="bgfill" style="position:absolute;inset:0;background:<你的底色>;z-index:0;"></div>
|
|
359
|
-
<style> [data-composition-id="<id>"] .xxx{ … } </style> <!-- 样式用属性选择器作用域,防跨颗粒污染 -->
|
|
360
|
-
<svg viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid meet" style="position:absolute;inset:0;width:100%;height:100%;">…</svg>
|
|
361
|
-
<script src="https://lib.baomitu.com/gsap/3.13.0/gsap.min.js"></script>
|
|
362
|
-
<script>(function(){
|
|
363
|
-
var ROOT='[data-composition-id="<id>"]';
|
|
364
|
-
/* 1) 确定性构建静态结构 */
|
|
365
|
-
/* 2) gsap.set 初始态 */
|
|
366
|
-
/* 3) var tl = gsap.timeline({paused:true}); … 编排 … */
|
|
367
|
-
window.__timelines = window.__timelines || {};
|
|
368
|
-
window.__timelines["<id>"] = tl;
|
|
369
|
-
})();</script>
|
|
370
|
-
</div>
|
|
371
|
-
</template>
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
> **骨架里 `.bgfill` 那一行的三个要点**:① 它 MUST 是**根下第一个**子元素(后续前景层自然压在它之上,不必给前景排 z-index);
|
|
375
|
-
> ② 它 MUST **全幅**(`position:absolute;inset:0`,或等价的 `top/left/width/height` 铺满)——不铺满就不是「实心底」;
|
|
376
|
-
> ③ 类名 `bgfill` 只是**惯例**,其底色写在**行内 style** 上(不靠 `<style>` 里的类规则),故不受「样式作用域」那条专属坑影响;
|
|
377
|
-
> 换名字不违约,但 `gtrk mg lint` 认的是「根下首个全幅子层的 `background`」这个**结构**,不认类名。
|
|
378
|
-
|
|
379
|
-
缓动可用 CustomEase 精确还原你栏目自己的 cubic-bezier(缺插件时给近似回退)——bezier 数值属于栏目审美,本契约不规定。
|
|
380
|
-
|
|
381
|
-
## 确定性配方(替代 random)
|
|
382
|
-
|
|
383
|
-
- 递归结构:固定角度、比例、深度参数 → 完全确定。
|
|
384
|
-
- "噪声感":`Math.sin(i*0.18 + j*0.2)` 类解析式伪随机。
|
|
385
|
-
- 打散:用 index 派生(如 `i*137.5°` 黄金角),不要 `Math.random()`。
|
|
386
|
-
|
|
387
|
-
## 验证(交付前必做)
|
|
388
|
-
|
|
389
|
-
墙钟截图类工具驱动不了 paused 时间线(只看到 t=0),**不能**用来验收。必须真渲染引擎 seek 验证:
|
|
390
|
-
1. 颗粒放进最小 composition(root `index.html` 用 `data-composition-src` 引它);
|
|
391
|
-
2. 走渲染管线(html_animate_render)渲染;
|
|
392
|
-
3. 抽不同时间点的帧**比对应当不同**(相同=冻结=铁律没守住)。客观自检:根有 `<template>`、`window.__timelines["<id>"]` 已注册且 id 匹配、无 random/Date、tl 总长 ≥ 颗粒时长、HTML ≤ 2,000,000 字符(铁律 4⑤;`gtrk mg lint` 的 `4-html-size`)。
|
|
393
|
-
> ⚠️ 不要用「本地等价 seek 脚本 / Node 无头模拟」替代真引擎渲染——它不经真编译+挂载,测不出 var()-不解析、CDN-内联失败、StaticGuard 这类只在真引擎暴露的问题(实测教训:本地等价测试报 OK,真引擎全黑)。
|
|
394
|
-
>
|
|
395
|
-
> ⚠️ **客户端预览对「底色 / 透明度」类问题结构性失明,MUST NOT 用作这类验收的判据**(2026-07-26 增补)。
|
|
396
|
-
> 客户端预览会按 clip 登记的 `opaque` 位**给颗粒根盒强行打底**(`!important`,恒胜过颗粒自身的设计期底色)——
|
|
397
|
-
> 于是无论根 `background` 有没有被丢弃、有没有实心底子层,**预览看到的都是「按登记值应该长的样子」**。
|
|
398
|
-
> 铁律 4 的证据锚正是靠**真渲染出片抽帧**取得的,不是靠预览。预览截图只作对照留档,不入判据。
|
|
399
|
-
|
|
400
|
-
## 专属坑
|
|
401
|
-
|
|
402
|
-
- **样式作用域**:颗粒与其他颗粒/根同处一个文档,全局类会撞——用 `[data-composition-id="<id>"] .xxx` 属性选择器作用域。
|
|
403
|
-
- **`<template>` 内的 `<script>` 默认不执行**——引擎把 template 内容克隆进文档后才执行;本地直接开浏览器不会跑,必须经引擎/player。
|
|
404
|
-
- **transform-origin(SVG)**:缩放 `<g>` 用 GSAP `svgOrigin:"x y"`(SVG 用户坐标),别用 CSS transform-origin。
|
|
405
|
-
- **时间线总长 ≥ 坑位时长**:颗粒 tl 总时长 ≥ 落轨 clip 时长(坑位包络),否则 seek 越界(已升格为铁律 7,含终态驻留要求)。
|
|
406
|
-
- **整组同步驱动的重复图元必须合并**:网格、排线、刻度、点阵用单元素表达,SVG 以一条 `<path>` 的多子路径合成;逐元素动画批次豁免。详见 gsap-emit v1 铁律 8。
|
|
407
|
-
- **真卷积滤镜别用补间驱动(也别让带滤镜的元素被 `transform` 补间驱动)、整幅静态滤镜先缩面积**:`blur()` / `drop-shadow()` / `feGaussianBlur` 按「面积 × 半径 × 帧数」吃每帧墙钟;**每帧重卷积**才是最贵的形态(补间驱动 filter +36.2%、静态 filter + transform 补间 **+42.7%**)。预烘是次选、必须 RGBA PNG,且**对整幅静态滤镜实测可能净亏**(先做同颗对照再用)。`box-shadow` 整族不在射程内。⚠️「去滤镜省墙钟」**依颗粒形态而定、不能一概而论**。详见本文件「渲染成本:真卷积滤镜」一节。
|
|
408
|
-
- **别用 `requestAnimationFrame`/`setInterval` 驱动画面**——不被 seek,等于冻结。所有视觉变化必须挂在 tl 上。(与「回调与 seek 语义」一节同源:任何**不经 tl** 的自有时钟都不被定帧驱动;而挂在 tl 上的回调是否被触发,则由该节的引擎侧条款保证。`gtrk mg lint` 对本条给**非致命**项 `x-raf-interval`——静态正则分不清「驱动画面」与其它用途,故只提醒不拦。)
|
|
409
|
-
- **自包含 ≠ 无限内嵌**:原图整张 base64 塞进颗粒会撞客户端 2,000,000 字符硬限——客户端永远加载不出来,而 lint / 铺轨 / 云渲此前都不报。位图先按实际显示尺寸裁剪缩放再内嵌,大图走图片素材轨。详见铁律 4⑤;`gtrk mg lint` 报 `4-html-size`(致命)/ `4-html-size-heavy`(非致命)。
|
|
149
|
+
> ⚠️ **客户端预览对「底色 / 透明度」类问题结构性失明,MUST NOT 用作这类验收的判据**。
|
|
150
|
+
> 客户端预览会按 clip 登记的 `opaque` 位**给颗粒根盒强行打底**(`!important`,恒胜过颗粒自身的设计期底色)——
|
|
151
|
+
> 于是无论根 `background` 有没有被丢弃、有没有实心底子层,**预览看到的都是「按登记值应该长的样子」**。
|
|
152
|
+
> 铁律 4 的证据锚正是靠**真渲染出片抽帧**取得的,不是靠预览。预览截图只作对照留档,不入判据。
|
|
153
|
+
|
|
154
|
+
## 专属坑
|
|
155
|
+
|
|
156
|
+
- **样式作用域**:颗粒与其他颗粒/根同处一个文档,全局类会撞——用 `[data-composition-id="<id>"] .xxx` 属性选择器作用域。
|
|
157
|
+
- **`<template>` 内的 `<script>` 默认不执行**——引擎把 template 内容克隆进文档后才执行;本地直接开浏览器不会跑,必须经引擎/player。
|
|
158
|
+
- **transform-origin(SVG)**:缩放 `<g>` 用 GSAP `svgOrigin:"x y"`(SVG 用户坐标),别用 CSS transform-origin。
|
|
159
|
+
- **时间线总长 ≥ 坑位时长**:颗粒 tl 总时长 ≥ 落轨 clip 时长(坑位包络),否则 seek 越界(已升格为铁律 7,含终态驻留要求)。
|
|
160
|
+
- **整组同步驱动的重复图元必须合并**:网格、排线、刻度、点阵用单元素表达,SVG 以一条 `<path>` 的多子路径合成;逐元素动画批次豁免。详见 gsap-emit v1 铁律 8。
|
|
161
|
+
- **真卷积滤镜别用补间驱动(也别让带滤镜的元素被 `transform` 补间驱动)、整幅静态滤镜先缩面积**:`blur()` / `drop-shadow()` / `feGaussianBlur` 按「面积 × 半径 × 帧数」增加每帧成本。预烘是次选、必须 RGBA PNG,先做同颗对照再用;`box-shadow` 整族不在射程内。详见本文件「渲染成本:真卷积滤镜」一节。
|
|
162
|
+
- **别用 `requestAnimationFrame`/`setInterval` 驱动画面**——不被 seek,等于冻结。所有视觉变化必须挂在 tl 上。(与「回调与 seek 语义」一节同源:任何**不经 tl** 的自有时钟都不被定帧驱动;而挂在 tl 上的回调是否被触发,则由该节的引擎侧条款保证。`gtrk mg lint` 对本条给**非致命**项 `x-raf-interval`——静态正则分不清「驱动画面」与其它用途,故只提醒不拦。)
|
|
163
|
+
- **自包含 ≠ 无限内嵌**:原图整张 base64 塞进颗粒会撞客户端 2,000,000 字符硬限。位图先按实际显示尺寸裁剪缩放再内嵌,大图走图片素材轨。详见铁律 4;`gtrk mg lint` 报 `4-html-size`(致命)/`4-html-size-heavy`(非致命)。
|