@gitruck/cli 1.2.5 → 1.2.7

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.
@@ -125,6 +125,7 @@
125
125
  "visual_task": "用训练集、噪音、测试集、错误预测的动态图把过拟合先讲清楚",
126
126
  "irreplaceability": "优先 MG",
127
127
  "handoff": {
128
+ "visual_job": "data",
128
129
  "slug_hint": "neural-overfit",
129
130
  "theme": "overfitting",
130
131
  "bg": "paper",
@@ -146,6 +147,8 @@
146
147
  "visual_task": "把 AI 过拟合映射到创伤、自动化防御、现实崩溃,完成 AI 到人类的翻译",
147
148
  "irreplaceability": "优先 MG",
148
149
  "handoff": {
150
+ "visual_job": "relation",
151
+ "visual_brief": "左右两栏同尺寸并置,中间一条竖线分开;同一个词在两栏里给出互斥的两种读法,右栏字重更重",
149
152
  "slug_hint": "dual-pane-map",
150
153
  "theme": "overfitting",
151
154
  "bg": "paper",
@@ -378,6 +381,8 @@
378
381
  "visual_task": "把神经递质、创伤印痕、代际传递、大他者压成一张逐步收紧的因果网",
379
382
  "irreplaceability": "优先 MG",
380
383
  "handoff": {
384
+ "visual_job": "relation",
385
+ "visual_brief": "一枚孤立的点与一张规整网格并置,网格逐格吞掉它周围的空白,最后点与网格再也分不出来",
381
386
  "slug_hint": "grid-captured",
382
387
  "theme": "overfitting",
383
388
  "bg": "paper",
@@ -430,6 +435,7 @@
430
435
  "visual_task": "用偏差-方差权衡、插值阈值、双重下降曲线完成过拟合到泛化的结构反转",
431
436
  "irreplaceability": "优先 MG",
432
437
  "handoff": {
438
+ "visual_job": "data",
433
439
  "slug_hint": "overfit-to-double-descent",
434
440
  "theme": "overfitting",
435
441
  "bg": "paper",
@@ -505,6 +511,7 @@
505
511
  "visual_task": "把前文幽灵堵车回调出来,用自动驾驶车辆吸收刹车波浪的系统动画做出解法",
506
512
  "irreplaceability": "优先 MG",
507
513
  "handoff": {
514
+ "visual_job": "statement",
508
515
  "slug_hint": "recall-image-question",
509
516
  "theme": "overfitting",
510
517
  "bg": "paper",
@@ -1,141 +1,171 @@
1
- # 拆分稿字段契约 v1(JSON)
2
-
3
- `gtrk-splitter` 的产物是**机器 JSON 拆分稿**(不是 Markdown)——`gtrk split <拆分稿.json>` 校验落地。
4
- 目标:LLM 可稳定产出、校验器可硬拒、下游(matrix / mg / ai-drama)可直接消费。
5
-
6
- > 时码零触碰:拆分稿里**不含任何秒级时码字段**。轨道时码由 `gtrk split` 落地时现场投影写入 `struct_meta.split` / `dispatch.json`。
7
-
8
- ## 顶层结构
9
-
10
- ```jsonc
11
- {
12
- "contract_version": "v1", // 固定 "v1"
13
- "transcript_hash": "<64 位 hex>", // 必填:原样透传投影视图的 transcript_hash(hash 链,错版硬拒)
14
- "beats": [ /* Beat[],见下 */ ], // 必填非空
15
- "queues": { /* 人读派单汇总,可选;机器侧不消费,dispatch.json 由 beats 现场生成 */ }
16
- }
17
- ```
18
-
19
- - `transcript_hash` 不匹配当前 `transcript.json` 的 `text_hash` → **硬拒**(提示转写已变更、需重新导出视图重拆)。
20
- - `queues` 是给人看的四车道汇总(`a_roll/mg/ai_drama/film_broll` 各 `[{beat, note}]`),**可选**;真正的机器派单 `dispatch.json` 由落地时按 beats 现场生成,不读 `queues`。
21
-
22
- ## Beat 字段
23
-
24
- ### 必填
25
-
26
- | 字段 | 类型 | 取值 |
27
- |---|---|---|
28
- | `id` | string | `B` + 两位起序号(`B01`…);同稿内唯一 |
29
- | `span` | object | `{from, to}` 两端均为投影视图中存在的 utterance id;`from ≤ to`(id 序);beats 间**不重叠**(允许留空隙) |
30
- | `base_track` | enum | 口播底轨三态:`真人出镜` \| `口播继续` \| `旁白主导` |
31
- | `lane` | enum | 主层四选一:`A_ROLL` \| `MG` \| `AI_DRAMA` \| `FILM_BROLL`(遗留 `RRV_MG` 读旧归一为 `MG`) |
32
- | `narrative` | enum | 八枚举:`mirror-hook` \| `demolition` \| `container-translation` \| `abyssal-fall` \| `holding` \| `reversal-elevation` \| `callback-closure` \| `typography-emphasis` |
33
- | `container_stage` | enum | 七枚举:`none` \| `seed` \| `expand` \| `translate` \| `rupture` \| `flip` \| `callback` |
34
- | `rhythm` | string | 人读节奏标签(`快剪` / `平稳` / `渐升` / `停顿` / `悬停` / `回扣` 等);**机器不消费**、只透传 |
35
- | `visual_task` | string | 一句话:该 beat 让观众「看到什么变化」 |
36
- | `irreplaceability` | enum | `必须真人出镜` \| `优先 MG` \| `可被 B-roll 替代` \| `可降级处理` |
37
-
38
- ### 可选
39
-
40
- | 字段 | 类型 | 说明 |
41
- |---|---|---|
42
- | `handoff` | object | 按 `lane` 分型(见下)。`A_ROLL` 不应带,带了被警告忽略 |
43
- | `aux_layers` | array | 辅助层(见下) |
44
- | `fallback` | string | 预算/素材/AI 稳定性不足时的降级方案 |
45
- | `callback_of` | string | 回扣对象 beat id(如 `B07`);前文意象后文重调时**不合并 beat**,在后文 beat 写此字段 |
46
- | `note` | string | 其他对制作有帮助的信息 |
47
-
48
- ## handoff 按 lane 分型(校验器硬查)
49
-
50
- ```jsonc
51
- // lane === "MG"(遗留 "RRV_MG" 读旧兼容)
52
- "handoff": { "category": "overlay", "slug_hint": "neural-overfit", "theme": "overfitting", "bg": "paper", "duration_hint": 12 }
53
- // duration_hint(秒)必填;slug_hint / theme / bg / category 可选(bg 底色可由底轨态推导)
54
- // ⚠️ duration_hint 语义(2026-07-24 主理人硬性规定):只是「动画主叙事时长」参考,供生产 skill 排布节奏;
55
- // 落轨 clip 恒占满槽位包络(track_ed − track_st),颗粒 tl 总长须 ≥ 包络、终态定格或有限循环驻留、
56
- // 禁全局渐隐退场(gsap-emit v1 铁律⑦)。别把 duration_hint 当颗粒寿命写短。
57
- // category(颗粒品类子类型,裁决⑩):overlay(透明叠加,叠在 A-roll/B-roll 上,不挡主体)
58
- // | fullscreen(不透明满屏,旁白主导整帧);缺省=下游按颗粒 HTML 根 background 反推透明度。
59
- // 二期扩 subtitle/title。供剪辑器色带按品类分层(叠加/满屏 各一行)。
60
- // 读旧兼容:遗留品牌值 rrv-overlay/mg-fullscreen/explain-subtitle/op-ed-title 仍认。
61
-
62
- // lane === "FILM_BROLL"
63
- "handoff": { "queries": ["lonely person in a city apartment at night", "exhausted commuter on a crowded subway train"], "shots": 6, "per_shot_sec": 2, "exclude": ["卡通", "水印"] }
64
- // queries(非空字符串数组)必填;shots / per_shot_sec / exclude 可选
65
- // queries 语言规范(经真机中英 A/B 校准):
66
- // - 用**英文长句场景描述**(5-12 词,谁+在哪+做什么),不是关键词堆叠——检索后端向量模型英文场景级命中明显更准
67
- // - 每条 query 只装一个场景意象,多意象拆成多条
68
- // - **避多义/字面义强的动词**("pointing" 会召回手指特写、"hunting" 召回猎人——改用 "giving suggestions in a meeting" 这类场景语义)
69
- // - **exclude 保持中文**:负向过滤匹配的是服务端返回的中文 note,写英文会失效
70
- // anchors(可选,关键词锚 · add-keyword-anchored-broll):[{ keyword, utterance, query }] ≤2 个/beat——
71
- // - keyword 照原句抄写(须为所在句 text 子串);utterance 为该句 id(须在本 beat span 内);query 写该词的英文视觉描述
72
- // - 语义:铺轨把锚 query **原始 sim 最高的合格命中**(原始检索相似度,不是 mark/highlight 融合分)
73
- // 钉在关键词说出时刻(句级时码内插 −0.5s 提前量);无合格命中自动降级普通槽
74
- // - 锚预留**优先于**普通序贯槽消费(铺轨前先为每锚锁住 sim 第一名,落位或降级后立即释放);
75
- // 取不到第一名时锚 outcome 如实报名次与去向(第几名 / 第一名被谁取走),不静默当成钉准
76
- // - 圈「贵大奇多」类看点实词(地名/奇观/数字头衔),虚词泛词勿圈;圈定指引见 SKILL.md「关键词锚」节
77
-
78
- // lane === "AI_DRAMA" —— 全可选(下游框架 skill /gtrk-ai-drama 有推断默认)
79
- "handoff": { "narrative": "trauma-repetition", "theme": "freud-fort-da", "emotion_stage": "abyssal", "platform": "video-gen", "shot_count": 5 }
80
-
81
- // lane === "A_ROLL" —— 无 handoff
82
- ```
83
-
84
- ## 辅助层字段(aux_layers[])
85
-
86
- ```jsonc
87
- {
88
- "type": "quote-card", // 八类:quote-card | term-callout | network-diagram
89
- // | archive-caption | pause-card | data-annotation | timeline-tag | overlay
90
- "mount": { "from": "u0001", "to": "u0002" }, // 挂载范围三型:"same_beat" | {from,to} | {trigger:"uNNNN"}
91
- "role": "金句提炼", // 职责:金句提炼/术语解释/关系表达/证据标注/停顿加压/情绪聚焦/回扣提示
92
- "necessity": "强建议", // 可选:必须 | 强建议 | 建议 | 可省略
93
- "note": "为什么加它", // 可选
94
- "promote_condition": "若连续承担主要理解职责,则升级为下一个 beat 主层", // 可选
95
- "fallback": "该辅助层不可做时的替代方式" // 可选
96
- }
97
- ```
98
-
99
- - `mount` 里的所有 id(`from`/`to`/`trigger`)MUST 为视图中存在的 utterance id,否则硬拒。
100
- - 辅助层是补充理解职责,不是装饰。满足升级规则时**切出新 beat 升级为主层**,别硬塞辅助层。
101
- - 前七类是**纯建议性**(人读稿一行摘要,不承接派单);第八类 `overlay` 是**承接颗粒派单**的叠层类型(见下)。
102
-
103
- ### `overlay` 叠层颗粒 aux(第八类,承接派单)
104
-
105
- `overlay` = 与底轨主视觉(如 `FILM_BROLL` 电影感 B-roll)**同段共存的透明概念颗粒**——想「底轨放实拍情绪镜头、其上叠一层 MG 透明图解/金句」时用它。与前七类不同,`overlay` aux 必带 `handoff`,由 `gtrk split` 落地投影成派生颗粒(进 `dispatch.mg` + 合成 `struct_meta.split.beats`),后续 `gtrk mg` 铺出透明颗粒盖在底轨上。
106
-
107
- ```jsonc
108
- {
109
- "type": "overlay",
110
- "mount": "same_beat", // same_beat(复用当前 beat 落轨区间)| {from,to}(子区间);{trigger} 一期不支持
111
- "role": "概念叠层图解",
112
- "handoff": { // overlay 必带(镜像 MG lane 的 handoff)
113
- "duration_hint": 6, // 必填正数秒(该 aux 要生成颗粒,无时长不成立;缺/非正数硬拒)
114
- "category": "overlay", // 可选品类(软校验,非法只告警不拒;派生颗粒实际 category 恒 "overlay")
115
- "slug_hint": "overfit-mirror", // 可选:颗粒 slug 提示
116
- "theme": "overfitting", // 可选:主题
117
- "bg": "transparent" // 可选:底色(叠层通常透明)
118
- }
119
- }
120
- ```
121
-
122
- - **mount 投影**:`same_beat` → 复用当前 beat 的 `track_st/track_ed`;`{from,to}` → 取该子区间存活实例的包络(全被剪则计入 `skipped` 不落)。**`{trigger}` 点挂载一期不支持**(无干净源区间,`duration_hint` 是时间线秒非源秒 → 跟随会不准):遇到计入 `skipped` + 告警,二期再补。
123
- - **composition_id 命名**:派生颗粒 = `<工程slug>-<beatId>-aux<n>`(`n` 从 1,位置计数);同 beat 主颗粒仍是 `<工程slug>-<beatId>`。「一 beat 一 composition_id」松绑为「`composition_id` 全局唯一,一 beat 可派生主 + N 个 `-aux<n>` 颗粒」。
124
- - **一期约束**:`FILM_BROLL` 主(底轨不产 MG 颗粒)+ 一颗 `overlay` aux 同段安全;`MG` 主 beat 再挂 `overlay` aux 会同段两颗撞一轨(后续拆轨),先避开。
125
-
126
- ## 落地产物(CLI 写,供参照)
127
-
128
- - **`.gtrk` 的 `struct_meta.split`**:`{contract_version, transcript_hash, projected_at, material_id, beats:[{id, lane, span, track_st, track_ed, source_ranges, narrative, container_stage, visual_task, shrunk?, handoff}]}`——投影时刻快照。
129
- **谁负责重投影**:CLI 的消费方命令(`gtrk mg` / `gtrk matrix`)**每次消费都自己现场重投影**(`transcript × 当刻 .gtrk`,与 `gtrk split` 落地同一段代码),所以**用户在 split 之后继续微调口播轨是常态、无需重跑 split**;只有**拆分稿本身**变了才要重跑 `gtrk split`。快照只在重投影不可行时(transcript 缺失 / 工程定位不到 / 主轨查不到口播素材)作回退值,届时命令会显式告警并在 `--json` 里标注降级。
130
- - `material_id`:口播素材 id(= transcript.material_id),消费方脱离 transcript 文件即可定位素材。
131
- - `beats[].source_ranges`:`[{st, ed}]` 源时基秒(v1 恒单元素 = span 源包络,含句间静默与被剪词)——**源时基不随时间线编辑漂移**,消费方以「源区间 ∩ 当刻颗粒源窗口」投影可得实时覆盖(客户端色带跟随模式即此)。
132
- - **`split/dispatch.json`**:`{mg:[{beat, composition_id, duration, category?, theme, bg, slug_hint, track_st, track_ed, span}], film_broll:[{beat, queries, shots, per_shot_sec, exclude, track_st, track_ed, span}], ai_drama:[{beat, ...handoff, track_st, track_ed, span}]}`(去品牌化前 `mg` 键为 `rrv_mg`,消费方 `mg ?? rrv_mg` 双读)。
133
- - **`span:{from,to}`**:该条目对应的 utterance 区间——派单**自述「派什么」**,消费方据它现场重投影,时码不再是派单唯一的权威内容。**aux 派生条目写的是 aux 自己的 span**(`mount` 为子区间时 ≠ 主 beat span);注意 aux 条目的 `beat` 字段记的仍是**主 beat id**,所以按 `beat` 回查 `struct_meta.split` 会把 aux 错算成主 beat 的整段窗口——要回查一律用 `composition_id`。
134
- - **`track_st/track_ed` 是快照**:投影那一刻的值。老档(无 `span`)消费方会回落到 `struct_meta.split.beats[].span` 定位,照样重投影。`composition_id` = `<工程slug>-<beatId>`(MG 颗粒 `data-composition-id` 直接用它,打通 beat↔颗粒命名);`overlay` aux 派生颗粒 = `<工程slug>-<beatId>-aux<n>`(`n` 从 1)——`composition_id` 全局唯一,一 beat 可派生主 + N 个 `-aux<n>` 颗粒。
135
- - **`split/visual-split.md`**(`--md`):由机器 JSON 单向渲染的人读稿,不回读。
136
-
137
- ## 落地时的 dropped 处理(你要知道)
138
-
139
- - beat 的 span 内 utterance **全部** dropped(在当前时间线被剪光)→ 该 beat 被**跳过**(不写标注、不进派单),进 result 报告。
140
- - **部分** dropped → beat 轨道区间按存活 utterances 的包络**收缩**、标 `shrunk:true`,进报告提示人工复核。
141
- - 所以:别把 `dropped:true` 的句子划进 span;想让某段进画面,先让用户在客户端恢复它(拉长 clip)再重导视图。
1
+ # 拆分稿字段契约 v1(JSON)
2
+
3
+ `gtrk-splitter` 的产物是**机器 JSON 拆分稿**(不是 Markdown)——`gtrk split <拆分稿.json>` 校验落地。
4
+ 目标:LLM 可稳定产出、校验器可硬拒、下游(matrix / mg / ai-drama)可直接消费。
5
+
6
+ > 时码零触碰:拆分稿里**不含任何秒级时码字段**。轨道时码由 `gtrk split` 落地时现场投影写入 `struct_meta.split` / `dispatch.json`。
7
+
8
+ ## 顶层结构
9
+
10
+ ```jsonc
11
+ {
12
+ "contract_version": "v1", // 固定 "v1"
13
+ "transcript_hash": "<64 位 hex>", // 必填:原样透传投影视图的 transcript_hash(hash 链,错版硬拒)
14
+ "beats": [ /* Beat[],见下 */ ], // 必填非空
15
+ "queues": { /* 人读派单汇总,可选;机器侧不消费,dispatch.json 由 beats 现场生成 */ }
16
+ }
17
+ ```
18
+
19
+ - `transcript_hash` 不匹配当前 `transcript.json` 的 `text_hash` → **硬拒**(提示转写已变更、需重新导出视图重拆)。
20
+ - `queues` 是给人看的四车道汇总(`a_roll/mg/ai_drama/film_broll` 各 `[{beat, note}]`),**可选**;真正的机器派单 `dispatch.json` 由落地时按 beats 现场生成,不读 `queues`。
21
+
22
+ ## Beat 字段
23
+
24
+ ### 必填
25
+
26
+ | 字段 | 类型 | 取值 |
27
+ |---|---|---|
28
+ | `id` | string | `B` + 两位起序号(`B01`…);同稿内唯一 |
29
+ | `span` | object | `{from, to}` 两端均为投影视图中存在的 utterance id;`from ≤ to`(id 序);beats 间**不重叠**(允许留空隙) |
30
+ | `base_track` | enum | 口播底轨三态:`真人出镜` \| `口播继续` \| `旁白主导` |
31
+ | `lane` | enum | 主层四选一:`A_ROLL` \| `MG` \| `AI_DRAMA` \| `FILM_BROLL`(遗留 `RRV_MG` 读旧归一为 `MG`) |
32
+ | `narrative` | enum | 八枚举:`mirror-hook` \| `demolition` \| `container-translation` \| `abyssal-fall` \| `holding` \| `reversal-elevation` \| `callback-closure` \| `typography-emphasis` |
33
+ | `container_stage` | enum | 七枚举:`none` \| `seed` \| `expand` \| `translate` \| `rupture` \| `flip` \| `callback` |
34
+ | `rhythm` | string | 人读节奏标签(`快剪` / `平稳` / `渐升` / `停顿` / `悬停` / `回扣` 等);**机器不消费**、只透传 |
35
+ | `visual_task` | string | 一句话:该 beat 让观众「看到什么变化」 |
36
+ | `irreplaceability` | enum | `必须真人出镜` \| `优先 MG` \| `可被 B-roll 替代` \| `可降级处理` |
37
+
38
+ ### 可选
39
+
40
+ | 字段 | 类型 | 说明 |
41
+ |---|---|---|
42
+ | `handoff` | object | 按 `lane` 分型(见下)。`A_ROLL` 不应带,带了被警告忽略 |
43
+ | `aux_layers` | array | 辅助层(见下) |
44
+ | `fallback` | string | 预算/素材/AI 稳定性不足时的降级方案 |
45
+ | `callback_of` | string | 回扣对象 beat id(如 `B07`);前文意象后文重调时**不合并 beat**,在后文 beat 写此字段 |
46
+ | `note` | string | 其他对制作有帮助的信息 |
47
+
48
+ ## 顶层 `mg_visual_job_note`(条件必填)
49
+
50
+ 全片 `visual_job` 为 `relation` 或 `data` 的槽位数为 **0** 时,顶层须具名
51
+ `mg_visual_job_note`:一句话说明为什么这条片子通篇只有单一陈述。
52
+
53
+ ⚠️ **MUST NOT 实现成比例阈值。** 比例阈值(「模板占比 ≤ 60%」)是代理指标,两头都不成立:
54
+ 误伤合法形态(纯字卡包装的口播片本来就该全是模板),又可被「宣告一个例外槽位」绕过,
55
+ 且任何具体的 N 都给不出依据。「一个都不需要」是可以要求交代的**判断**;「不超过 N%」不是。
56
+
57
+ 纯字卡片是**合法**形态,本条只要求它是个有意识的选择。
58
+
59
+ ## handoff 按 lane 分型(校验器硬查)
60
+
61
+ ```jsonc
62
+ // lane === "MG"(遗留 "RRV_MG" 读旧兼容)
63
+ "handoff": { "visual_job": "relation", "visual_brief": "两列并置、破折号连起来、右列更重",
64
+ "category": "overlay", "slug_hint": "neural-overfit", "theme": "overfitting", "bg": "paper", "duration_hint": 12 }
65
+ // duration_hint(秒)必填;visual_job 必填(见下);slug_hint / theme / bg / category 可选(bg 底色可由底轨态推导)
66
+ //
67
+ // ★ visual_job(必填,gate-mg-visual-job):这段**为什么要动画**。四档:
68
+ // statement 单一陈述(一句话 / 一个词 / 一个标题)
69
+ // relation 有关系(对比 / 并置 / 因果 / 包含 / 递进 / 聚合 / 循环)—— 须同时填 visual_brief
70
+ // data 具体的量、步骤或拓扑
71
+ // decor 不承载信息(转场 / 角标)
72
+ // ⚠️ **判据是「这段的意思里有没有第二个东西与它并置」,不是「用不用文字」。**
73
+ // 一块「温柔—坚定 / 和善—有立场」的并置面板是纯文字画的,但它表达的是对照关系
74
+ // ⇒ relation,**不是** statement。第一档刻意叫 statement 而不叫 text——
75
+ // 叫 text 会让「它是文字做的」直接滑成「它是 text 档」,把结构化排版拍平成字卡。
76
+ // ⚠️ 本字段 MUST 必填、MUST NOT 有缺省值:可选字段在存量派单与偷懒路径上都会走缺省,闸等于没开。
77
+ //
78
+ // visual_brief(relation 档必填):一句话说清**这个关系靠什么视觉手段成立**。
79
+ // ⚠️ **MUST NOT 被要求是非文字的**:「两列并置、破折号连起来、右列更重」与「三个齿轮咬合」
80
+ // 是同一类合格答案。要求「必须非文字」会把**用排版画关系**这条路堵死,而那恰恰是要保住的东西。
81
+ //
82
+ // ⚠️ 派单阶段 MUST NOT 引用具体模板 id(`tfx-*`):判「这段要什么」的那一步不该看见模板库,
83
+ // 否则会从「库里有什么」倒推「这段需要什么」。产物里出现模板 id ⇒ 判红。
84
+ // ⚠️ duration_hint 语义(2026-07-24 主理人硬性规定):只是「动画主叙事时长」参考,供生产 skill 排布节奏;
85
+ // 落轨 clip 恒占满槽位包络(track_ed − track_st),颗粒 tl 总长须 ≥ 包络、终态定格或有限循环驻留、
86
+ // 禁全局渐隐退场(gsap-emit v1 铁律⑦)。别把 duration_hint 当颗粒寿命写短。
87
+ // category(颗粒品类子类型,裁决⑩):overlay(透明叠加,叠在 A-roll/B-roll 上,不挡主体)
88
+ // | fullscreen(不透明满屏,旁白主导整帧);缺省=下游按颗粒 HTML 根 background 反推透明度。
89
+ // 二期扩 subtitle/title。供剪辑器色带按品类分层(叠加/满屏 各一行)。
90
+ // 读旧兼容:遗留品牌值 rrv-overlay/mg-fullscreen/explain-subtitle/op-ed-title 仍认。
91
+
92
+ // lane === "FILM_BROLL"
93
+ "handoff": { "queries": ["lonely person in a city apartment at night", "exhausted commuter on a crowded subway train"], "shots": 6, "per_shot_sec": 2, "exclude": ["卡通", "水印"] }
94
+ // queries(非空字符串数组)必填;shots / per_shot_sec / exclude 可选
95
+ // queries 语言规范(经真机中英 A/B 校准):
96
+ // - 用**英文长句场景描述**(5-12 词,谁+在哪+做什么),不是关键词堆叠——检索后端向量模型英文场景级命中明显更准
97
+ // - 每条 query 只装一个场景意象,多意象拆成多条
98
+ // - **避多义/字面义强的动词**("pointing" 会召回手指特写、"hunting" 召回猎人——改用 "giving suggestions in a meeting" 这类场景语义)
99
+ // - **exclude 保持中文**:负向过滤匹配的是服务端返回的中文 note,写英文会失效
100
+ // anchors(可选,关键词锚 · add-keyword-anchored-broll):[{ keyword, utterance, query }] ≤2 个/beat——
101
+ // - keyword 照原句抄写(须为所在句 text 子串);utterance 为该句 id(须在本 beat span 内);query 写该词的英文视觉描述
102
+ // - 语义:铺轨把锚 query **原始 sim 最高的合格命中**(原始检索相似度,不是 mark/highlight 融合分)
103
+ // 钉在关键词说出时刻(句级时码内插 −0.5s 提前量);无合格命中自动降级普通槽
104
+ // - 锚预留**优先于**普通序贯槽消费(铺轨前先为每锚锁住 sim 第一名,落位或降级后立即释放);
105
+ // 取不到第一名时锚 outcome 如实报名次与去向(第几名 / 第一名被谁取走),不静默当成钉准
106
+ // - 圈「贵大奇多」类看点实词(地名/奇观/数字头衔),虚词泛词勿圈;圈定指引见 SKILL.md「关键词锚」节
107
+
108
+ // lane === "AI_DRAMA" —— 全可选(下游框架 skill /gtrk-ai-drama 有推断默认)
109
+ "handoff": { "narrative": "trauma-repetition", "theme": "freud-fort-da", "emotion_stage": "abyssal", "platform": "video-gen", "shot_count": 5 }
110
+
111
+ // lane === "A_ROLL" —— 无 handoff
112
+ ```
113
+
114
+ ## 辅助层字段(aux_layers[])
115
+
116
+ ```jsonc
117
+ {
118
+ "type": "quote-card", // 八类:quote-card | term-callout | network-diagram
119
+ // | archive-caption | pause-card | data-annotation | timeline-tag | overlay
120
+ "mount": { "from": "u0001", "to": "u0002" }, // 挂载范围三型:"same_beat" | {from,to} | {trigger:"uNNNN"}
121
+ "role": "金句提炼", // 职责:金句提炼/术语解释/关系表达/证据标注/停顿加压/情绪聚焦/回扣提示
122
+ "necessity": "强建议", // 可选:必须 | 强建议 | 建议 | 可省略
123
+ "note": "为什么加它", // 可选
124
+ "promote_condition": "若连续承担主要理解职责,则升级为下一个 beat 主层", // 可选
125
+ "fallback": "该辅助层不可做时的替代方式" // 可选
126
+ }
127
+ ```
128
+
129
+ - `mount` 里的所有 id(`from`/`to`/`trigger`)MUST 为视图中存在的 utterance id,否则硬拒。
130
+ - 辅助层是补充理解职责,不是装饰。满足升级规则时**切出新 beat 升级为主层**,别硬塞辅助层。
131
+ - 前七类是**纯建议性**(人读稿一行摘要,不承接派单);第八类 `overlay` 是**承接颗粒派单**的叠层类型(见下)。
132
+
133
+ ### `overlay` 叠层颗粒 aux(第八类,承接派单)
134
+
135
+ `overlay` = 与底轨主视觉(如 `FILM_BROLL` 电影感 B-roll)**同段共存的透明概念颗粒**——想「底轨放实拍情绪镜头、其上叠一层 MG 透明图解/金句」时用它。与前七类不同,`overlay` aux 必带 `handoff`,由 `gtrk split` 落地投影成派生颗粒(进 `dispatch.mg` + 合成 `struct_meta.split.beats`),后续 `gtrk mg` 铺出透明颗粒盖在底轨上。
136
+
137
+ ```jsonc
138
+ {
139
+ "type": "overlay",
140
+ "mount": "same_beat", // same_beat(复用当前 beat 落轨区间)| {from,to}(子区间);{trigger} 一期不支持
141
+ "role": "概念叠层图解",
142
+ "handoff": { // overlay 必带(镜像 MG lane 的 handoff)
143
+ "duration_hint": 6, // 必填正数秒(该 aux 要生成颗粒,无时长不成立;缺/非正数硬拒)
144
+ "category": "overlay", // 可选品类(软校验,非法只告警不拒;派生颗粒实际 category 恒 "overlay")
145
+ "slug_hint": "overfit-mirror", // 可选:颗粒 slug 提示
146
+ "theme": "overfitting", // 可选:主题
147
+ "bg": "transparent" // 可选:底色(叠层通常透明)
148
+ }
149
+ }
150
+ ```
151
+
152
+ - **mount 投影**:`same_beat` → 复用当前 beat 的 `track_st/track_ed`;`{from,to}` → 取该子区间存活实例的包络(全被剪则计入 `skipped` 不落)。**`{trigger}` 点挂载一期不支持**(无干净源区间,`duration_hint` 是时间线秒非源秒 → 跟随会不准):遇到计入 `skipped` + 告警,二期再补。
153
+ - **composition_id 命名**:派生颗粒 = `<工程slug>-<beatId>-aux<n>`(`n` 从 1,位置计数);同 beat 主颗粒仍是 `<工程slug>-<beatId>`。「一 beat 一 composition_id」松绑为「`composition_id` 全局唯一,一 beat 可派生主 + N 个 `-aux<n>` 颗粒」。
154
+ - **一期约束**:`FILM_BROLL` 主(底轨不产 MG 颗粒)+ 一颗 `overlay` aux 同段安全;`MG` 主 beat 再挂 `overlay` aux 会同段两颗撞一轨(后续拆轨),先避开。
155
+
156
+ ## 落地产物(CLI 写,供参照)
157
+
158
+ - **`.gtrk` 的 `struct_meta.split`**:`{contract_version, transcript_hash, projected_at, material_id, beats:[{id, lane, span, track_st, track_ed, source_ranges, narrative, container_stage, visual_task, shrunk?, handoff}]}`——投影时刻快照。
159
+ **谁负责重投影**:CLI 的消费方命令(`gtrk mg` / `gtrk matrix`)**每次消费都自己现场重投影**(`transcript × 当刻 .gtrk`,与 `gtrk split` 落地同一段代码),所以**用户在 split 之后继续微调口播轨是常态、无需重跑 split**;只有**拆分稿本身**变了才要重跑 `gtrk split`。快照只在重投影不可行时(transcript 缺失 / 工程定位不到 / 主轨查不到口播素材)作回退值,届时命令会显式告警并在 `--json` 里标注降级。
160
+ - `material_id`:口播素材 id(= transcript.material_id),消费方脱离 transcript 文件即可定位素材。
161
+ - `beats[].source_ranges`:`[{st, ed}]` 源时基秒(v1 恒单元素 = span 源包络,含句间静默与被剪词)——**源时基不随时间线编辑漂移**,消费方以「源区间 ∩ 当刻颗粒源窗口」投影可得实时覆盖(客户端色带跟随模式即此)。
162
+ - **`split/dispatch.json`**:`{mg:[{beat, composition_id, duration, visual_job, visual_brief?, category?, theme, bg, slug_hint, track_st, track_ed, span}], film_broll:[{beat, queries, shots, per_shot_sec, exclude, track_st, track_ed, span}], ai_drama:[{beat, ...handoff, track_st, track_ed, span}]}`(去品牌化前 `mg` 键为 `rrv_mg`,消费方 `mg ?? rrv_mg` 双读)。
163
+ - **`span:{from,to}`**:该条目对应的 utterance 区间——派单**自述「派什么」**,消费方据它现场重投影,时码不再是派单唯一的权威内容。**aux 派生条目写的是 aux 自己的 span**(`mount` 为子区间时 ≠ 主 beat span);注意 aux 条目的 `beat` 字段记的仍是**主 beat id**,所以按 `beat` 回查 `struct_meta.split` 会把 aux 错算成主 beat 的整段窗口——要回查一律用 `composition_id`。
164
+ - **`track_st/track_ed` 是快照**:投影那一刻的值。老档(无 `span`)消费方会回落到 `struct_meta.split.beats[].span` 定位,照样重投影。`composition_id` = `<工程slug>-<beatId>`(MG 颗粒 `data-composition-id` 直接用它,打通 beat↔颗粒命名);`overlay` aux 派生颗粒 = `<工程slug>-<beatId>-aux<n>`(`n` 从 1)——`composition_id` 全局唯一,一 beat 可派生主 + N 个 `-aux<n>` 颗粒。
165
+ - **`split/visual-split.md`**(`--md`):由机器 JSON 单向渲染的人读稿,不回读。
166
+
167
+ ## 落地时的 dropped 处理(你要知道)
168
+
169
+ - beat 的 span 内 utterance **全部** dropped(在当前时间线被剪光)→ 该 beat 被**跳过**(不写标注、不进派单),进 result 报告。
170
+ - **部分** dropped → beat 轨道区间按存活 utterances 的包络**收缩**、标 `shrunk:true`,进报告提示人工复核。
171
+ - 所以:别把 `dropped:true` 的句子划进 span;想让某段进画面,先让用户在客户端恢复它(拉长 clip)再重导视图。
@@ -21,7 +21,7 @@
21
21
  |---|---|---|---|
22
22
  | 拆分派单器 | 全片 beat 派单文档 | —(管线文档生产者,不登记) | — |
23
23
  | 动态图生成 | HTML 动画颗粒 | MG | gsap-emit v1(合规项进自检) |
24
- | AI 再现分镜 | 双语分镜提示词文本 | AI_DRAMA | 暂无契约 |
24
+ | AI 情景动画分镜 | 双语分镜提示词文本 | AI_DRAMA | 暂无契约 |
25
25
  | 封面设计 | 文生图 prompt + 排字工作台 | cover + routing:"none" | 管线外 |
26
26
 
27
27
  每个 skill 开头声明「这个 skill 不做什么 → 找谁」。
@@ -137,7 +137,7 @@ gtrk oralcut "<inputs/…_full.mp4>" --lang zh-CN [--script 稿.txt] [--preset c
137
137
 
138
138
  以上四项一次确认完 = 检查点①收口。
139
139
 
140
- ## 五、拆分与铺轨:三车道,无 AI 再现
140
+ ## 五、拆分与铺轨:三车道,无 AI 情景动画
141
141
 
142
142
  口播链拆分**只派三车道**(拍板:口播场景不需要 AI_DRAMA):
143
143
 
@@ -51,7 +51,7 @@ description: gtrk 单点工具与媒体转换能力的调用向导,覆盖 `gtr
51
51
  | `image_to_live` | 「图片变 LivePhoto / 静图微动 / 让照片动起来 / 要能长按播放的动态照片」 | 单张图片;可选 `--output-format`(见下文) | 约 4 秒短视频 `.mp4`(无声);或安卓动态照片 `.jpg` + 附带同一条 `.mp4` | 运行前实时查询 | 已上线 |
52
52
  | `image_classic_template` | 「做封面 / 智能拼图 / 标题配图出封面图」 | **多张图片**(可传多个路径,文件顺序即拼装顺序);**`--main-title <标题>` 必填**;可选 `--sub-title`、`--template-mode`、`--aspect`、`--quality`、`--output-pic-count`(服务端钳制 ≤20)、`--output-text-count`(≤20)、`--title-layout` | 封面/拼图成品(text/pic/render 三组、各组可空可多张) | 运行前实时查询 | 已上线 |
53
53
  | `image_vertical_stitch` | 「拼长图 / 多图竖拼 / 截图接成一张长图」 | **多张图片**(可传多个路径,顺序=自上而下拼接顺序) | 一张垂直拼接长图 | 运行前实时查询 | 已上线 |
54
- | `audio_tts_clone` | 「配音 / 文字转语音 / TTS / 用 xx 音色念这段 / 把这段稿子合成音频」 | **无文件**:`--text <短文本>` 或 `--text-file <txt>` 二选一(≤5000 字,服务端为真相)+ **`--speaker <音色代号>` 必填**(可用音色见官网文档,传错时报错会列出全部可用项);可选 `--text-lang`/`--output-format wav\|mp3`/`--speed`/`--split-method`/`--batch-size`/`--fragment-interval <秒>`(句间停顿,**仅自训音色**,云引擎音色传了会报错;speed/切分法缺省跟随该音色调好的参数)。**计量单位与单价以 `gtrk tool list` 实时显示为准 —— MUST NOT 在本文写死**(此处写死过一次「200 字/分钟」,服务端实为 240,且计量口径已改为千字符)** | 配音音频(wav/mp3) | 运行前实时查询 | 已上线 |
54
+ | `audio_tts_clone` | 「配音 / 文字转语音 / TTS / 用 xx 音色念这段 / 把这段稿子合成音频」 | **无文件**:`--text <短文本>` 或 `--text-file <txt>` 二选一(≤5000 字,服务端为真相)+ **`--speaker <音色代号>` 必填**(可用音色见官网文档,传错时报错会列出全部可用项);可选 `--text-lang`/`--output-format wav\|mp3`/`--speed`/`--split-method`/`--batch-size`/`--fragment-interval <秒>`(句间停顿,**仅自训音色**,云引擎音色传了会报错;speed/切分法缺省跟随该音色调好的参数)/`--subtitle-format <fmt>`(**可选出字幕**,如 `srt`;缺省不出字幕、不额外计费,取值以服务端为准,传了不认的格式服务端会拒并列出可用项)。**计量单位与单价以 `gtrk tool list` 实时显示为准 —— MUST NOT 在本文写死**(此处写死过一次「200 字/分钟」,服务端实为 240,且计量口径已改为千字符)** | 配音音频(wav/mp3);传了 `--subtitle-format` 时另产字幕 `tts-<音色代号>.srt`(服务端字幕降级时只落音频、不留空字幕文件) | 运行前实时查询 | 已上线 |
55
55
  | `mad` | 「一键剪 MAD / 素材文件夹自动出卡点成片 / 自动选技法 / 给这堆素材出个 AE 工程 / 我想要某某效果的卡点片」 | 一个素材文件夹(3~10 条视频)+ 可选 `--bgm 歌.mp3` + 可选 `--technique 技法名`;`--search <词>` 只查技法目录不要输入 | AE 母合成工程 `.jsx`(仅支持 AE) | 仅 `--bgm` 触发实时查价 | 已上线 |
56
56
 
57
57
  > 清单随 CLI 版本增补。**动手前先跑 `gtrk tool list --json` 拿最新清单**,别凭记忆——新工具、状态变化都在那里。
@@ -61,7 +61,7 @@ gtrk subtitle lay --project "<工程>" --style <样式> --color <色> --json
61
61
 
62
62
  > **停顿太长时**:自训音色加 `--fragment-interval 0.2`(合成时就对);云引擎音色**不支持**该参数(传了会报错,不会静默忽略),改在合成后跑 `gtrk audio tighten --project <工程>` 收紧句间停顿(纯本地零计费;只压跨句界的停顿,句内换气与原声引用段不动)。
63
63
 
64
- 配方口径(mark-weight 0.3 / BGM 0.10 宁低勿高 / gap-fill fast / 句界吸附缺省)与旅拍图纸 §五 同源,引用不复制。派单车道按内容走(FILM_BROLL 为主,可派 MG / AI 再现——AI 再现描述稿走 `/gtrk-ai-drama`,外部平台出片手动回铺)。
64
+ 配方口径(mark-weight 0.3 / BGM 0.10 宁低勿高 / gap-fill fast / 句界吸附缺省)与旅拍图纸 §五 同源,引用不复制。派单车道按内容走(FILM_BROLL 为主,可派 MG / AI 情景动画——AI 情景动画描述稿走 `/gtrk-ai-drama`,外部平台出片手动回铺)。
65
65
 
66
66
  ## 三、检查点①(必停一次)
67
67