@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.
@@ -52,7 +52,7 @@ description: B-roll 检索铺轨编排手册——成片管线里第一个铺的
52
52
  - **变奏点**:`--top-k` 控理解成本(1 积分/张,只理解你会认真考虑的那几条);云端 plan 同样可 describe(帧从签名 url 现抽);理解产物有本地缓存,反复迭代不重复扣费。
53
53
  - **裁定要点**:`usable_flags` 是信号不是判决——结合 `desc` 复核(水印在角落的航拍也许仍可用);剔除动作=从 plan 删掉那条 result,CLI 不会替你剔。
54
54
  另读 describe 输出的**剔除风险**清单:候选数 ≤1 的 beat 一删就掏空(音频驱动 ⇒ 整段黑屏或跨 beat 借片;口播 ⇒ 露 A-roll)。先补素材再剔,MUST NOT 见 flag 就删。
55
- ——260902 真机 P3 八个 beat 里七个只有 1 条候选;该清单只是判据,剔不剔仍归你(铁律①「零件不裁定」,见 §四层架构与三条铁律)。
55
+ 该清单只是判据,剔不剔仍归你(铁律①「零件不裁定」,见 §四层架构与三条铁律)。
56
56
 
57
57
  ### 配方 C · 时间窗匹配(电影解说式)
58
58
 
@@ -139,7 +139,7 @@ description: B-roll 检索铺轨编排手册——成片管线里第一个铺的
139
139
  | 填充门槛 | `--score-floor <f>` | 浮点 0–1 · `0.2` | 低于不采纳、槽位留空露黑底;调完必看空洞告警 |
140
140
  | 切点对齐字幕句 | `--cut-align <r>` | 浮点 0–1 · `0.7`(`0`=关闭) | 三七开拍板:约七成字幕句起点恰逢镜头切点、三成有意错开;句级时码取 transcript 重投影(降级自动回旧节奏并告警);开启时结果 JSON `lay.cut_align` 报实测比例 |
141
141
  | 主轨空洞填充 | `--gap-fill <m>` | `fast` \| `solid`(默认)\| `none` | **仅音频驱动工程主轨**(口播工程不适用零回归):fast=放宽地板随便填候选→延长相邻颗粒→**跨 beat 借候选**→**次地板补真画面**→仍不够才黑片;借来的画面与本段稿子相关性弱、次地板槽是不到 1.2s 的快切,两者都会在日志里**指名报出**(`kind` 为 `borrowed` / `subfloor`)——那是如实告知,**不是缺陷,别当 bug 上报**;solid=黑片垫齐(精修一眼看出没匹配到);none=留 gap(客户端主轨磁吸会吸除 gap 致画面与配音错位,慎用);生效时结果 JSON `lay.gap_fill` 报明细 |
142
- | 编排交给云端跑 | `--arrange <m>` | **按素材来源自动定档,一般不用传** | 铺**自己电脑里的素材**→`cloud`(编排在服务端,按编排量计费);铺**素材矩阵的素材**→`local`(编排仍在本机、不计费,逐字不动)。`shadow`=本机照跑照铺轨、云端只对拍不采纳。⚠️ 本地素材路上 `--arrange local` **已不受理**(2026-08-31 拍板:编排只在服务端迭代,留旧路等于让用户在不知情时拿到另一套算法的结果);云端拿不到产物时**直接报错**,不会换算法把活干完。⚠️ **它不是省钱开关**——矩阵素材要付检索费,两条路都花钱、只是花在不同环节,MUST NOT 对用户说「用本地就不花钱」 |
142
+ | 编排交给云端跑 | `--arrange <m>` | **按素材来源自动定档,一般不用传** | 铺**自己电脑里的素材**→`cloud`(编排在服务端,按编排量计费);铺**素材矩阵的素材**→`local`(编排仍在本机、不计费,逐字不动)。`shadow`=本机照跑照铺轨、云端只对拍不采纳。⚠️ 本地素材路上 `--arrange local` **不受理**;云端拿不到产物时**直接报错**,不会换算法把活干完。⚠️ **它不是省钱开关**——矩阵素材要付检索费,两条路都花钱、只是花在不同环节,MUST NOT 对用户说「用本地就不花钱」 |
143
143
  | 落轨前先质检画音对齐 | `--arrange-qc` | 开关 · 缺省关 | 只查各 beat 的**卡点句**(span.from 领衔句):画面没给到稿句说的东西就换候选重排,最多 2 轮,到限即交付 + 如实登记残余。零渲染。⚠️ 按帧计费(每卡点句 1 帧/轮),跑前报预估求确认。**默认关,用户没说就别带**。拿不到卡点句(无 dispatch / 重投影降级)时会明说「跳过 ≠ 查过」,别把那条日志读成通过 |
144
144
  | 云端编排本次上限 | `--arrange-cost-cap <n>` | 正整数 · 不限 | 超限服务端**前置拒绝**、零执行零计费(不是跑一半掐断)。只在 `--arrange shadow\|cloud` 时有意义 |
145
145
  | 先估价再决定跑不跑 | `--arrange-estimate-only` | 开关 · 缺省关 | 走到云端编排的计价确认那一步就停:报出编排量后**成功**返回(`ok:true` + `estimateOnly:true`,不是「被拒绝」),零云端调用、工程零改动。机读值在 `lay.arrange.units` 与 `lay.arrange.scale`。⚠️ 它省的是**云端那一次调用与其计费**(及其后的下载落轨),不是整条链——工程/plan/重投影照样要走。素材矩阵路会报 `applicable:false` 而**不是 0**。与 `--yes` 同给时以它为准 |
@@ -196,12 +196,7 @@ description: B-roll 检索铺轨编排手册——成片管线里第一个铺的
196
196
  > **`false` MUST NOT 读作「无版权、可以随便用」——它恰恰相反。** 决定性反证:概念素材(他人版权物)
197
197
  > 入库时固定写 `is_copyright=0`;字段若真是「是否受版权保护」,那批必须是 1。
198
198
  >
199
- > **真机事故(2026-09-02,这条警示的由来)**:AI 执行方连续两轮**特意去挑 `is_copyright:false`**,
200
- > 以为那是「没版权、随便用」的安全选项,结果把**不可商用**素材铺进了 5 个工程;唯一安全的
201
- > `true` 反倒被主动避开。**病灶是把极性读反了,不是「用了 `false` 的素材」**——认准这一条,
202
- > 下面那条缺省口径才不会被误读成「事故的教训被推翻了」。
203
- >
204
- > **选材口径按档位分流**(⟲ 2026-09-06 主理人拍板):
199
+ > **选材口径按档位分流**:
205
200
  >
206
201
  > - **internal 矩阵成员口:缺省搜全库,MUST NOT 自设一道命令面并不存在的闸。** 命令面缺省本就是
207
202
  > `copyright_scope=all`,你 **MUST NOT 默认写上 `--commercial-only`**,也 MUST NOT 以「保险起见」
@@ -226,11 +221,11 @@ description: B-roll 检索铺轨编排手册——成片管线里第一个铺的
226
221
  |---|---|---|---|
227
222
  | 给素材夹建索引 | `gtrk matrix index --dirs <a,b,...>` | 逗号分隔**目录或素材文件** · — | 免切片只记时间戳;指纹增量零重算;断点续传 |
228
223
  | 本地检索模式 | `--local` | 开关 · 关 | 必配 `--dirs`;跳过身份探针、不触云端检索端点;与 `--column`/`--material-class` 互斥 |
229
- | 圈定检索域 | `--dirs <a,b,...>` | 逗号分隔**目录或素材文件** · — | 检索域永远显式可见;绝不与云端结果混合。**传文件即把域收窄到该素材**——一稿对一片时钉到那一部片,同夹邻片就抢不走候选(实测三片同夹时 46% 的候选来自邻片) |
224
+ | 圈定检索域 | `--dirs <a,b,...>` | 逗号分隔**目录或素材文件** · — | 检索域永远显式可见;绝不与云端结果混合。**传文件即把域收窄到该素材**——一稿对一片时钉到那一部片,避免同夹邻片抢候选 |
230
225
  | **源时间窗过滤** | `--source-window <start,end>` | 秒,`start<end` · 不过滤 | 仅 `--local`:只返回与窗口**有交集**的命中段(段边界不裁剪);与其他过滤器 AND 叠加;图片候选自动排除;**空窗 = ok 空结果非错误**,扩窗是你的裁定 |
231
226
  | 场景切分粒度 | `--scene-threshold <f>` | 浮点 (0,1) · `0.3` | 仅 index:镜头切换快调高、长镜头调低 |
232
227
  | 固定机位判稳阈值 | `--stability-threshold <f>` | 浮点 (0,1) · `0.05` | 仅 index:场景内最大帧间变化低于此值判 stable,抽帧收敛为**中点 1 帧**(60s 固定机位从 30 帧省到 1 帧);summary 分列 stable/unstable 场景数与省帧数;误判 stable 丢检索粒度、误判 unstable 只是不省钱——**宁严勿松**;默认为保守值待标定 |
233
- | 索引强制重建 | `--rebuild` | 开关 · 关 | 忽略指纹全部重算向量;**理解缓存(describes)不清**。存量索引库(2026-08-19 闪帧修复之前建的)**没有切点全集**:铺轨消不到段内切点、消不掉 2~3 帧异景残片——用户报「成片有闪帧」且素材是高帧率长视频时,先带本开关重建一次索引。⟲ 2026-09-10 起多一条重建理由:**倍帧素材的假切点治法**与**段级运动量信号**都只在重建时落库(见「本地素材检索模式要点」) |
228
+ | 索引强制重建 | `--rebuild` | 开关 · 关 | 忽略指纹全部重算向量;**理解缓存(describes)不清**。需要补齐切点、倍帧判定或段级运动量信号时使用;这些索引信号只在重建时落库 |
234
229
  | 不要图片候选 | `--no-image-broll` | 开关 · 默认参与 | 检索与铺轨完全排除图片(零图片上云);pinned 也不豁免这条 |
235
230
  | 跳过计费确认 | `--yes` | 开关 · 关 | 图片运镜 / describe >20 张两处护栏通用 |
236
231
 
@@ -247,7 +242,8 @@ description: B-roll 检索铺轨编排手册——成片管线里第一个铺的
247
242
 
248
243
  **⚠️ 一条 describe 只代表一段,不代表整条候选**(`--plan` 形态):每个候选**只抽一帧**(`segments[0]` 的 `best`),这条判决的有效射程就是**那一帧所属的那一个 segment**。`at_sec` 就是那一帧的时刻(**素材时基**秒,与 `segments[].best` 同轴——注意与 `beats[].anchors[].at_sec` 的**工程轴**秒同名不同轴,别换算)。缺这个字段的旧 plan 按 `segments[0]` 推定,**不外推到全部段**。
249
244
 
250
- - 真机 260902 量级:32 个被理解候选共带 **843 段,只有 32 段(3.8%)被看过**;95 个落轨坑位里只有 12 个(12.6%)含那一帧。命令跑完会打一行「理解覆盖率:N 帧 / M 段 = X%」(`--json` 读 `describe_coverage`),**M 是段数不是候选数**——别把「注入 N 条 result.describe」读成「这 N 条候选都看过了」。
245
+ - 命令跑完会报告「理解覆盖率:N 帧 / M 段 = X%」(`--json` 读 `describe_coverage`),**M 是段数不是候选数**——别把「注入 N 条 result.describe」读成「这 N 条候选都看过了」。
246
+ - 量级示例:843 个候选中只有 32 段被抽帧理解时,覆盖率是 3.8%;覆盖率低时必须按段说明射程,不能外推到整条素材。
251
247
  - 转述给用户时 MUST 按段说:「这条候选的 X–Y 秒那一段有字幕」,MUST NOT 说成「这条素材有字幕」。要判更多段就得多抽帧 = 多花钱(1 积分/张),是否加抽由用户拍板,CLI 不替他加。
252
248
 
253
249
  **plan 消费零件**(`gtrk matrix lay`):
@@ -318,9 +314,9 @@ description: B-roll 检索铺轨编排手册——成片管线里第一个铺的
318
314
  - **段带运动量,据此换段(`add-material-motion-signal`)**:重建过索引的素材,检索结果的每个 `segments[]` 会多带一个可选 `motion`(去重后帧间跳变分位 `p50`/`p90` + 样本数 + 有效帧率)。它答的是**「这段抖不抖」**,与 `score`(像不像)正交:`p50` 超 `0.05` 视为高运动,铺轨排序时降权 0.02 分(**只降权、不排除**——候选稀疏时宁可用高运动段也不留空,留空的观感代价更大)。用户报「这段画面晃得看不清 / 想换一段」时,`motion.p50` 就是挑替补的依据:同 beat 里挑 `p50` 更低的段。
319
315
  - ⚠️ **缺席 = 不可判,不是「平稳」**。存量索引库(本能力上线前建的)没有这份信号,段上整键无 `motion`;此时高运动降权对该素材**不生效**,不是「它很稳」。要拿到信号得 `gtrk matrix index --dirs <夹> --rebuild` 重建一次。
320
316
  - ⚠️ **样本不足也报缺席**:长静止镜头去重后可能只剩个位数帧,分位不可信,`p50`/`p90` 如实为 `null`(`samples` 仍照报)。同样 MUST NOT 读成「平稳」。
321
- - **倍帧素材(30fps 内容装进 60fps 容器)**:这类素材每隔一帧就是上一帧的复制。索引会认出来并落**有效帧率**(`motion.effective_fps`,如容器 60 而实际 30)。判据取近零帧的**连续长度**而非占比——倍帧运动段呈单帧交替(连零 ≤2),静止镜头是长串连零(实测 15–118 帧),两者近零帧都多、只有连零长度分得开。
317
+ - **倍帧素材(30fps 内容装进 60fps 容器)**:这类素材每隔一帧就是上一帧的复制。索引会认出来并落**有效帧率**(`motion.effective_fps`)。判据看近零帧的连续长度而非占比,以区分倍帧运动段和静止镜头。
322
318
  - 见到 `effective_fps` 明显低于容器帧率时,**如实告诉用户这条素材是倍帧的**(画面实际流畅度只有标称的一半,不是铺轨铺坏了)。
323
- - **假切点已在索引侧治掉**(2026-09-10):倍帧会让快摇镜头的帧间分被顶过切点阈值,从而在**单一镜头内**吐出一串假切点(实测某段 0.43s 内记了 11 个)。现在切点判定在**去重后的帧序列**上进行——持续快摇在去重序列上是一条连续高分串、整串不算刀,真实一刀仍是孤立尖峰、照留。非倍帧素材的判定一字未动。
319
+ - 倍帧素材的切点判定在**去重后的帧序列**上进行:持续快摇作为连续高分串处理,真实切换仍按孤立尖峰保留。
324
320
  - ⚠️ **存量索引里的假切点不会自己消失**:这条修法只在**重建索引**时生效。素材被判 `doubled` 且某段 `cuts` 密得离谱(零点几秒里十几刀)时,多半是本能力上线前建的库 ⇒ `gtrk matrix index --dirs <夹> --rebuild` 重建一次;重建前别把那些切点当真。
325
321
  - ⚠️ **一个已知取舍**:倍帧区里**紧挨着**的两刀(去重后相邻)会被判成持续运动而漏掉。它们在信号上与「快摇的头两帧」不可分——宁可漏这一对,也好过把十几个假切点放进去。
326
322
  - 含本地 B-roll 的工程云渲会被提交口直接拒绝(`local_broll_cloud_render_rejected`)——走客户端本地出片或 `gtrk render`。
@@ -356,8 +352,8 @@ description: B-roll 检索铺轨编排手册——成片管线里第一个铺的
356
352
 
357
353
  ## 执行(每次都带 `--json`)
358
354
 
359
- > **产物落点纪律(MUST · 全文见随包 `AGENT.md` 同名一节)**:一切产物只落**工程目录**或**用户显式指定的输出路径**;**MUST NOT** 把成片/预览/素材复制到 agent 自有工作目录——引用媒体用原路径;临时文件放系统 temp 用完即删。违者后果=用户系统盘被静默吃满(真机事故)。
360
- > 交付物(颗粒 HTML / 工程文件 / 派单稿 / 文稿等)SHALL **直接以工程目录内的最终路径为写入路径**,MUST NOT 先写 agent 自有工作目录再拷进工程——**中转本身即违规**,不以「最后拷进去了」免责,**体积不是豁免理由**(2026-09-07 事故里漂掉的是 2.7–6.2 KB 的 HTML)。与上一条的分界:抽帧图这类**不交付**的中间物走系统 temp;**要交付的东西没有暂存态**。
355
+ > **产物落点纪律(MUST · 全文见随包 `AGENT.md` 同名一节)**:交付物只写入工程目录或用户显式指定的输出路径;引用媒体用原路径,不复制到 agent 工作目录;不交付的临时文件放系统 temp,用完即删。
356
+ > 交付物 MUST NOT 先写 agent 自有目录再拷进工程;中转本身即违规,体积不是豁免理由。
361
357
 
362
358
  ```bash
363
359
  gtrk matrix --project "<split 产物目录>" [--lay N] [--score-floor F] [--top-k K] [--column <id>] --json
@@ -17,7 +17,7 @@ description: MG 动态图颗粒铺轨器——成片 SOP 第 ⑤ 步(**最后
17
17
 
18
18
  **你是第 ⑤ 步、也是最后一层。** MG 颗粒是**唯一的叠加层**——底下那整层底轨必须先定死(**三源全落齐**),否则你的排版避让是对着一个不完整的画面做的。
19
19
 
20
- > ⚠️ **AI 情景片段属于底轨 B-roll 画面家族,不是叠加层**。旧序把你排在 AI 情景动画之前、理由写「越往后叠得越上层」——**那是把「工序次序」误当成了「图层次序」**。AI 片段在你之后回铺,底轨构图就变了,你先产的颗粒必然避让错位、甚至盖住 AI 画面主体。
20
+ > ⚠️ **AI 情景片段属于底轨 B-roll 画面家族,不是叠加层**。先完成 AI 片段回铺,再依据最终底轨构图产出 MG,避免遮挡主体。
21
21
 
22
22
  所以动手前先过前置硬门。
23
23
 
@@ -158,10 +158,10 @@ description: MG 动态图颗粒铺轨器——成片 SOP 第 ⑤ 步(**最后
158
158
  ## 逐槽位工作流(产 → lint → 铺,循环到铺满)
159
159
 
160
160
  > **产物落点纪律(MUST · 全文见随包 `AGENT.md` 同名一节)**:
161
+ > 交付物 MUST NOT 先写 agent 自有目录再拷进工程;中转本身即违规,体积不是豁免理由。
161
162
  > 一切产物(颗粒 HTML / 成片 / 预览 / 素材 / 工程文件)只落**工程目录**(颗粒恒存 `<产物目录>/mg/`)或**用户显式指定的输出路径**;
162
163
  > **MUST NOT** 把成片、预览或任何大媒体文件复制到 agent 自有工作目录(如用户文档目录下 agent 产品自建的目录、agent 家目录缓存、会话工作区)——需要引用媒体时**用原路径引用**,不做副本;
163
- > 临时文件(抽帧图等)一律放系统 temp 且**用完即删**(含中断 / 失败路径)。违者后果 = 用户系统盘被静默吃满(真机事故,非假设)。
164
- > 交付物(颗粒 HTML / 工程文件 / 派单稿 / 文稿等)SHALL **直接以工程目录内的最终路径为写入路径**,MUST NOT 先写 agent 自有工作目录再拷进工程——**中转本身即违规**,不以「最后拷进去了」免责,**体积不是豁免理由**(2026-09-07 事故里漂掉的是 2.7–6.2 KB 的 HTML)。与上一条的分界:抽帧图这类**不交付**的中间物走系统 temp;**要交付的东西没有暂存态**。
164
+ > 临时文件(抽帧图等)一律放系统 temp 且**用完即删**。交付物直接写入工程目录或用户显式指定的路径;引用媒体用原路径。
165
165
 
166
166
  ### 1. 看板起手:先看 `dispatch.mg` 有哪些槽位、铺到哪了
167
167
 
@@ -176,9 +176,9 @@ gtrk mg status --project "<split产物目录>" --json
176
176
 
177
177
  对每个「缺 HTML」的槽位:把它的 `composition_id` + `handoff`(`theme` / `duration_hint` / `category`:`overlay` 透明叠加·不挡主体 / `fullscreen` 不透明满屏)+ beat 语义上下文,**交给第「业务分离」节解析出的栏目 MG 生产 skill 产一颗 html-particle**。产颗粒时 SHALL **直接以** `<产物目录>/mg/<composition_id>.html` **为写入路径**(MUST NOT 先在别处产再拷过来)(`gtrk mg` 就从这里读)。
178
178
  - **产前先抽帧看底轨(`overlay` 槽位必做,别只凭派单盲产)**:颗粒最终要叠在真实画面上,构图必须因势象形。对该槽位挂点用本地 ffmpeg 抽 1-2 帧(`ffmpeg -ss <track_st秒> -i <底轨视频> -frames:v 1 "<系统temp>/<beat>.jpg"`,成本≈0;抽帧图是临时文件——落系统 temp、用完即删,**别落 cwd / agent 自有目录**)看清三件事——①真人主体/人脸的位置(颗粒 bbox 避开,呼应栏目「不盖说话人」铁律);②该处是否已有烧入包装或 AI 画面(有 → 别铺这颗,报用户裁决——二次过毛片高发);③画面明暗基调(深底/浅底影响衬底与配色取舍)。把这些**连同抽帧图一起附进产片订单**交给栏目生产 skill;`fullscreen` 槽位可免(满屏不透明无避让问题)。
179
- - **产片订单必须附带坑位硬约束(gsap-emit v1 铁律⑦,2026-07-24 主理人硬性规定)**:颗粒 GSAP 时间线总长 ≥ **坑位时长**(该槽位 `track_ed − track_st` 包络,**不是** `duration_hint`)+ 0.3s 余量;`duration_hint` 只是动画主叙事节奏参考。主叙事播完后颗粒必须**定格保持或有限循环驻留到坑位末尾**——坑位内任意一帧核心内容都可见;**禁全局渐隐/整体退场/清空画面**(渐隐与剪辑层转场冲突,淡出由剪辑层决定);定格不动是合法终态。违反的观感 = 动画一过完颗粒突兀消失。
179
+ - **产片订单必须附带坑位硬约束(gsap-emit v1 铁律⑦)**:颗粒 GSAP 时间线总长 ≥ **坑位时长**(该槽位 `track_ed − track_st` 包络,**不是** `duration_hint`)+ 0.3s 余量;`duration_hint` 只是动画主叙事节奏参考。主叙事播完后颗粒必须定格保持或有限循环驻留到坑位末尾;禁止全局渐隐、整体退场或清空画面。
180
180
  - **`-aux<n>` 叠层颗粒同样处理**:`gtrk split` 若在某 beat 的 `aux_layers` 派了 `overlay`,会派生 `<beat>-aux<n>` 进 `dispatch.mg`(多为 B-roll 底轨之上叠透明概念图解)——照样产、照样存到对应 `composition_id.html`。
181
- - **category 决定叠法**:`overlay` 颗粒背景透明、盖在 B-roll 上不挡主体;`fullscreen` 不透明满屏。最终透明度由颗粒 HTML 的 `background` 声明反推的 `opaque` 定,生产 skill 要让二者自洽(lint 会查)。**「实心底该写在哪个元素上」的正本条款是 `contracts/gsap-emit-v1.md` 铁律 4(含真机证据锚)——本 skill 不复述元素位置,改了要以契约为准**;`fullscreen` 颗粒把实心底写错地方会吃非致命 `4-bg-on-root`(见下节)。
181
+ - **category 决定叠法**:`overlay` 颗粒背景透明、盖在 B-roll 上不挡主体;`fullscreen` 不透明满屏。最终透明度由颗粒 HTML 的 `background` 声明反推的 `opaque` 定,生产 skill 要让二者自洽(lint 会查)。**「实心底该写在哪个元素上」的正本条款是 `contracts/gsap-emit-v1.md` 铁律 4——本 skill 不复述元素位置,改了要以契约为准**;`fullscreen` 颗粒把实心底写错地方会吃非致命 `4-bg-on-root`(见下节)。
182
182
 
183
183
  ### 3. lint 门:铺之前先单测每颗(不过就退回生产 skill,别硬铺)
184
184
 
@@ -189,24 +189,24 @@ gtrk mg lint "<产物目录>/mg/<composition_id>.html" --dispatch "<产物目录
189
189
  - 纯本地静态校验颗粒 HTML 的**铁律机器可判定子集**:`<template>` 包裹、`data-composition-id` + 1920×1080、`gsap.timeline({ paused: true })`、`window.__timelines` 注册、无 `Math.random` / `Date.now`(可逐帧 seek 的确定性)、自包含无相对外链、`background` 声明与 `opaque` 自洽…;给 `--dispatch` 会额外校验 `composition_id` 命中派单。
190
190
  - **`1-cid-expect`(致命)——复制改名必查**:颗粒内部的 `data-composition-id` 必须等于期望 id(`--dispatch` 命中时 = 该条派单的 `composition_id`,否则 = 文件名)。**你从别的颗粒复制模板时最容易漏改内部 id**:那样铺出来的 clip 指向 A、文件注册的却是 `__timelines["B"]`,渲染必错,且两颗粒抢同一个 `[data-composition-id]` 样式作用域。改名的临时副本(`./tmp.html`)不比对,不会误伤。
191
191
  - **铁律④⑤「体积上限」两项**(正本条款 = `contracts/gsap-emit-v1.md` 铁律 4⑤;上限**同源自客户端颗粒运行时**,不是 CLI 的取舍):
192
- - `4-html-size`(**致命,命中即短路、其余项不跑**):颗粒 HTML 超过 **2,000,000 字符**——客户端 bootstrap 直接拒载、每次 seek 的快照同限,这颗在客户端**永远加载不出来**(此前 lint / 铺轨 / 云渲全绿放行,2026-09-18 真实案例:整张 4.4 MB PNG base64 内嵌进 CSS 背景)。文案会点名**最大的一段 data: URI**(类型 / 字符数 / 解码字节数 / 落点)。**处置**:回步骤 2,让生产 skill 把那张图**按它在颗粒里的实际显示尺寸裁剪缩放**后再内嵌(不透明图改 JPEG / WebP,只有需要 alpha 才留 PNG);仍超就把大图放图片素材轨、颗粒只留透明叠加层。**别拿云渲成功当反证**——云端没有这条上限,客户端有。
192
+ - `4-html-size`(**致命,命中即短路、其余项不跑**):颗粒 HTML 超过 **2,000,000 字符**,客户端无法加载。文案会点名最大的一段 `data:` URI。处置:按实际显示尺寸裁剪缩放,不透明图改 JPEG/WebP;仍超就把大图放图片素材轨,颗粒只留透明叠加层。云渲成功不代表客户端可加载。
193
193
  - `4-html-size-heavy`(非致命):500,000~2,000,000 字符——客户端每次 seek 都把颗粒根节点的 outerHTML 整份快照回传,体积直接决定预览帧率。能缩就缩;**不拦铺轨**。
194
- - **铁律④「实心底与透明度」两项恒非致命**(正本条款 = `contracts/gsap-emit-v1.md` 铁律 4,含 2026-07-26 真机证据锚;**本处只说看到该码怎么办,元素位置以契约为准**):
194
+ - **铁律④「实心底与透明度」两项恒非致命**(正本条款 = `contracts/gsap-emit-v1.md` 铁律 4;**本处只说看到该码怎么办,元素位置以契约为准**):
195
195
  - `4-bg-on-root`:这颗把**实心底写在了根元素的 `style` 上**。**根元素的绘制属性会在子合成挂载时被丢弃**——那层底在成片里**一个像素都不落地**:前景照常渲出、底没了、底轨透出来,观感是「浮空面板」;而**本地播放器与客户端预览都看不出**(预览会按登记的 `opaque` 位自己给根盒打底,对这个问题结构性失明)。**报了要回步骤 2 让生产 skill 把实心底下沉为子层**——改法是机械的(把那条 `background` 声明整体搬到根下第一个全幅子层,根上改写 `background:transparent`)。⚠️ 它**不影响退出码、不拦铺轨**(避免存量颗粒一夜之间铺不进去),但**不是可以放着不管的噪音**:不改就是出片丢底。
196
196
  - `4-bg-explicit`:根与根下首个全幅子层**都**没有 `background` 声明 → lint 只能按「透明叠加」处理。契约要求**透明与否显式**:满屏颗粒在全幅子层写实心底,透明叠加颗粒在根写 `background:transparent`。**别靠「不写」表达透明**——作者与机器都分不清「想透明」和「忘了想」。
197
- - 两项都**只看 `background` 声明摆在哪**,不看色值(色值属栏目审美,契约不管)。`opaque` 的推导面 = 「根 `style` ∪ 根下首个全幅子层 `style`」,与契约铁律 4 同源;**合规的子层写法不会再被误判成 `opaque=false`**(旧版 CLI 会,导致满屏颗粒被登记成透明叠加)。
197
+ - 两项都**只看 `background` 声明摆在哪**,不看色值(色值属栏目审美,契约不管)。`opaque` 的推导面 = 「根 `style` ∪ 根下首个全幅子层 `style`」,与契约铁律 4 同源;**合规的子层写法会正确识别为不透明**。
198
198
  - **铁律⑦ 估长三项恒非致命、不是放行凭据**(`--dispatch` 命中派单条目才跑,因为要拿该条的坑位包络):
199
199
  - `7-fill-slot`:静态估长 < 坑位包络 → 「疑未占满」。估长是**下界**(表达式 position、非字面量 duration 那些调用算不了、跳过不计),报出来基本就是真短,**回步骤 2 让生产 skill 把驻留补到坑位末尾**。
200
200
  - `7-no-estimate`:一条时长调用都解析不到 → **明说「铁律⑦这颗没校验」**,不是通过。这时 tl 总长只能靠真引擎 seek 或人读代码确认,别当它过了。
201
- - `7-infinite-repeat`:颗粒里写了 `repeat:-1` → 总长变 `Infinity`、铁律⑦不可验证(契约 2026-07-26 已明文禁)。让生产 skill 改成按坑位算死的有限次数:`repeat = ceil((坑位 − 循环起点) / 单圈) − 1`。
201
+ - `7-infinite-repeat`:颗粒里写了 `repeat:-1` → 总长变 `Infinity`、铁律⑦不可验证。让生产 skill 改成按坑位算死的有限次数:`repeat = ceil((坑位 − 循环起点) / 单圈) − 1`。
202
202
  - 三项都**不影响退出码、不拦铺轨**——真判据是渲染引擎逐帧,静态估长只做提醒。**但「没报 7-fill-slot」≠「时长够了」**,要看是否同时出了 `7-no-estimate`。
203
203
  - **铁律⑧「重复图元合并」为恒非致命提示,但看见必须处理**:
204
204
  - `8-primitive-merge`:这颗有一批由循环直接创建、或由循环调用具名工厂创建的可合并重复图元;它们落到同一父节点,且没有逐元素动画驱动。纯数字循环可算且同父累计 **≥ 8** 时会报数;边界算不出时会报「条数未知」。逐元素 `gsap.set` / tween、或作为 tween 首实参使用的元素数组会被排除。
205
205
  - 本项报的是「这批图元可**无损**合并,合并后画面逐像素不变」这一写法事实,**不是**「该颗粒有缺陷」或「超过某个数量会出问题」;真实触发轴未知。反过来,没报也**不代表安全**,真判据仍是真渲染出片抽帧。
206
206
  - **处置**:回步骤 2,把原始提示完整交给栏目 MG 生产 skill,让它把整组同步驱动的网格 / 排线 / 刻度 / 点阵合成单元素(SVG 用一条 `<path>` 多子路径;同色分档可分档合成),然后重产、重 lint。**别硬铺,也别当没看见**;CLI 为兼容存量把它做成**非致命、不影响退出码、不拦铺轨**,不等于 agent 可以跳过修正。确需 stagger / 逐条画入 / 逐个变色的逐元素动画批次属于契约豁免,不要为了消项删掉动画身份。
207
- - **「回调与 seek 语义」三项恒非致命**(契约同名一节,2026-07-26 增补;**报了不用改颗粒**):
208
- - `x-callback-driven`:这颗的画面靠 `onUpdate` 等时间线回调写 DOM 驱动,且没带任何 seek 兜底(GSAP `seek(t)` 的 `suppressEvents` 缺省为 `true`,会吞掉回调)。**该写法合规**——回调可达性由契约压在**引擎侧**的 MUST 条款保证(引擎定帧 MUST 用 `seek(t,false)` / `time(t)` / `progress(p)`),**且该条款已于 2026-07-26 经真渲染引擎核实**(producer `0.6.101`,纯回调驱动无垫片颗粒三帧读数各不相同)。本项**核实之后照留**做**哨兵**:结论绑死引擎版本,引擎换实现或失守时补间属性照常插值、回调不跑 → 画面**静默定格在初始态**(不是黑屏,本地播放器和预览都看不出)。**别因为它去让生产 skill 改写法,更别让它自己加垫片。**
209
- - `x-engine-api-override`:颗粒运行时覆写了 `tl.seek`(老颗粒常见的 `rr-seek-shim`)或把 `__timelines[…]` 换成了包装对象。它会推翻引擎显式传的 `seek(t, true)`,且引擎改走 `time()`/`progress()` 就完全失效。**既有垫片属过渡态**:2026-07-26 引擎侧结论已核实(引擎本就不抑制回调),垫片已无保护作用、也无害,**可择期清理**(删后须重跑 lint 并重渲复验),不清也不拦;新颗粒别再加。
207
+ - **「回调与 seek 语义」三项恒非致命**(**报了不用改颗粒**):
208
+ - `x-callback-driven`:颗粒画面由时间线回调写 DOM 驱动时,回调可达性由引擎侧契约保证。本项保留为哨兵;若引擎实现变化导致回调不跑,画面可能静默停在初始态。不要因此改写生产 skill 或自行添加垫片。
209
+ - `x-engine-api-override`:颗粒运行时覆写 `tl.seek` 或替换 `__timelines[…]` 时会绕过引擎接口。既有垫片可保留,但新颗粒不要再加。
210
210
  - `x-raf-interval`:颗粒里有 `requestAnimationFrame(` / `setInterval(`。这类自有时钟**不被 seek 驱动**,逐帧渲染时等于冻结(契约明令:所有视觉变化必须挂在 tl 上)。静态正则分不清用途,报了要**人眼确认它是不是在驱动画面**;若是 → 回步骤 2 让生产 skill 改挂 tl。
211
211
  - 另:引擎不抑制回调 = 逐帧 scrub 时 `onComplete`/`onStart`/`onRepeat` 会**反复触发**。颗粒里**别写「只跑一次」的回调**(累加计数 / `push` 数组 / 一次性 DOM 插入),要写成每次从补间状态**重算**的幂等形式。
212
212
  - **成本项 `c-filter-*` 三项恒非致命、当期全部不拦铺轨**(正本条款 = `contracts/gsap-emit-v1.md`「渲染成本:真卷积滤镜」一节):这组查的是**每帧成本**、不是正确性——命中的颗粒**画面是对的,只是渲得慢**。
@@ -214,7 +214,7 @@ gtrk mg lint "<产物目录>/mg/<composition_id>.html" --dispatch "<产物目录
214
214
  - `c-filter-static-fullbleed`:**整幅静态真卷积滤镜**(该声明自身就是 `position:absolute;inset:0` 一类铺满形态)。每帧对整幅做一次卷积。**首选改法是缩小被滤镜覆盖的几何面积**(面积一项同时压掉卷积与整幅逐帧合成两笔成本);次选把静态滤镜结果预烘成图,且**必须是 RGBA PNG**(透明叠加颗粒的 alpha 是成片合成的必需通道,烘成 JPEG 或无 alpha 格式会在成片里塌成不透明色块),但预烘只消得掉卷积、消不掉整幅逐帧合成,**收益有上限**。去不去滤镜属审美取值,**判断权在作者**,本项只给信息与改法。**不拦铺轨**。
215
215
  - `c-filter-indeterminate`:补间的 `filter` 值不是字符串字面量(变量 / 模板串 / 函数返回),lint **对该处没作判定**——既不是「判过且通过」,也不是命中。**人眼确认它到底会不会驱动 blur / drop-shadow**;会就按 `c-filter-animated` 的改法处理。**不拦铺轨**。
216
216
  - **`box-shadow` 整族不在射程内**(含 `box-shadow: 0 0 0 Npx` 这类零卷积脉冲写法,也含带模糊半径的写法)——看到 `box-shadow` 没被报**不是漏报**,是既定射程边界。
217
- - ⚠️ **没报 ≠ 这颗便宜**:这三项是**形态提示**,真判据永远是**真渲染出片计时**。收益也别外推——现网既有栏目语料(21 颗)去掉滤镜只省 **0~3.1%**(2026-07-30 真机实测,仅对该语料成立),这组规则的价值在**滤镜重的新语料进管线前先把门立好**。
217
+ - ⚠️ **没报 ≠ 这颗便宜**:这三项是形态提示,真判据永远是实际渲染计时;不要把单批素材的收益外推到所有语料。
218
218
  - **id 前缀读法**(三个命名空间,别按前缀反推错阻断行为):**数字前缀 `1-`~`8-`** = 契约铁律项,致命性**按项声明**(`4-html-size` **致命**且命中即短路;其余 `4-*` / `5-*` / `7-*` / `8-*` 非致命);**`x-`** = 哨兵项,**恒不拦**;**`c-`** = 成本项,致命性按项声明,**当前三项均不拦**。
219
219
  - **不过(非 0 退出、逐条报因)→ 把报错原样丢回栏目 MG 生产 skill 修,重产重 lint,别硬铺**。铺一颗不合规颗粒会污染工程。
220
220
  - 只想批量干校验不写回:`gtrk mg --project <dir> --lint-only`(有 beat 没过就 `ok:false` + **非 0 退出**,工程一个字节都不动)。
@@ -235,7 +235,7 @@ gtrk mg --project "<split产物目录>" --json
235
235
  - 真要**重置整轨**(连其余已铺颗粒一起剥掉重来):加 `--replace-all` 显式授权。
236
236
  - **素材表不再囤积**(剥离键按「自产身份 × 零引用」判,不认客户端可改写的 `html_material` 前缀):
237
237
  在 opencut 里编辑过工程之后重铺,旧的自产素材条目照样剥得掉,`mg-` 素材数**恒等于轨上颗粒数**;
238
- 历史遗留的重复 / 孤儿条目会在下一次重铺时一并清掉。**非自产素材零连带**——`broll-*`、`ex-solid-*`
238
+ 重复 / 孤儿条目会在下一次重铺时一并清掉。**非自产素材零连带**——`broll-*`、`ex-solid-*`
239
239
  垫轨、你自己加的素材一条不碰(哪怕它当前没被任何 clip 引用)。盘上 `assets/mg/` 的 html 副本从不删。
240
240
  - `--json` 输出:`{ ok, mode:"lay", laid, track_total, kept, kept_ids, removed, skipped, reason?, integrity?, … }`。
241
241
  - **`laid`** = **本次**铺成数;**`track_total`** = **轨上现存**已铺数;**`kept`** = 其中**上轮遗留**(本次没重铺)的颗数。三个数一起读——只看 `laid` 会让「铺 1 颗、剥 20 颗」跟「补铺 1 颗」长得一模一样。恒有 `track_total = laid + kept`。
@@ -253,7 +253,7 @@ gtrk mg --project "<split产物目录>" --json
253
253
  `danglingReferenced` / `danglingOrphan` = 被时间线引用数 / 孤儿数——**两者严重度差一个量级,回报时分开说**;
254
254
  `external` = 绝对路径素材找不到文件(另一档,不进 `dangling`)。
255
255
  **告知不拦阻**:查出悬空不改 `ok`、不改退出码、不删任何东西;非零就报给用户(哪几条、在哪一段),
256
- 多半是历史遗留(如客户端「确认原片」下载中断),修法在客户端而不在这里。**别自己去删素材或文件。**
256
+ 多半来自客户端「确认原片」下载中断,修法在客户端而不在这里。**别自己去删素材或文件。**
257
257
  - **退出码**:`ok:false` 一律连带**非 0 退出**(含「有 beat 被 skip」这种循环中途的正常态)。**别把非 0 读成「命令崩了」**——它说的是「这一轮没全铺成」,按 `reason` / `skipped` 处理后重跑即可。
258
258
  - **只铺单个 beat**:`--only <beatId>`(收的是 **beat id** 如 `B12`,不是 `composition_id`;主颗粒 + 其 `-aux<n>` 叠层一并选)。
259
259
  - **语义 = 真增量合并**:只重铺命中的那几颗,轨上**其余已铺颗粒原样保留**——连它们的透明度与用户在 opencut 的手调一起活着(保留的是既有 clip 原件,不是照登记重建的)。适合迭代改单段。
@@ -261,7 +261,7 @@ gtrk mg --project "<split产物目录>" --json
261
261
  - 代价看 `kept` / `kept_ids`:轨上会同时存在「本次这版」和「上轮那版」。要把全部颗粒刷成最新(含按当刻时间线重投影的新位置),**去掉 `--only` 全量重铺**(幂等、多铺几颗不花钱)。
262
262
  - 确实要**重置整轨**(连其余已铺颗粒一起剥掉重来)才加 `--replace-all` 显式授权。
263
263
  - **仍会拒写的唯一情形**:本次**一条都没定位到**(`--only` 打错 beat id、`dispatch.mg` 为空、或本次条目全被 skip)**而轨上已有已铺颗粒**——那是派单或选择器出问题的信号,不是清空指令,CLI 拒绝写回并报因(`.gtrk` 逐字节不变)。
264
- - **铺完必核「clip 占满坑位」**:读回 `.gtrk`,各 beat clip 的时长必须 = 槽位包络(`track_ed − track_st`)。若你的 CLI 版本按 `dispatch.mg[].duration`(旧 `duration_hint` 语义)落轨、导致 clip 短于坑位(颗粒在 beat 中途突兀消失,2026-07-24 真机实测),**把 `dispatch.mg[]` 各条 `duration` 改为包络秒数(`track_ed − track_st`)后重铺**(铺轨幂等、直接覆盖)。CLI 侧根治(落轨恒用包络)落地后此步可省。
264
+ - **铺完必核「clip 占满坑位」**:读回 `.gtrk`,各 beat clip 的时长必须 = 槽位包络(`track_ed − track_st`),不能使用 `duration_hint` 作为落轨时长。若发现 clip 短于坑位,把 `dispatch.mg[]` 各条 `duration` 改为包络秒数后重铺。
265
265
 
266
266
  ### 5. 循环到铺满
267
267
 
@@ -284,7 +284,7 @@ gtrk mg --project "<split产物目录>" --json
284
284
 
285
285
  `dispatch.mg` 全铺满、`gtrk mg status` 全绿后**别收工**——你已是最后一层,顺势收口。快速成片模式先 `gtrk subtitle lay --project <目录>` 把字幕上好(样式取用户拍板值,没选用 default)再 `gtrk render` 出片。一句话交代即推进:「MG 颗粒已叠铺完,我接着上字幕出片」。
286
286
 
287
- ### ⚠️ `render` 收口会花钱(2026-09-09 起,add-render-overlay-compositing)
287
+ ### ⚠️ `render` 收口会花钱
288
288
 
289
289
  `gtrk render` 现在**会把 MG 颗粒真的渲进成片**——做法是把每颗颗粒送去同合云烤成透明 MOV,再本地叠。于是这条命令**不再是零计费**:
290
290
 
@@ -295,10 +295,10 @@ gtrk mg --project "<split产物目录>" --json
295
295
 
296
296
  **MUST 在推进前把这件事说给用户**(一句话即可:「渲这条会对 N 颗未命中缓存的颗粒云渲、约 X 分钟计费;不想花钱可以先出无颗粒版」),**MUST NOT** 一声不吭替他确认。
297
297
 
298
- ### 剪映交付的 alpha 口径(2026-09-14 起,正本 = `contracts/gsap-emit-v1.md`「Alpha 交付口径」)
298
+ ### 剪映交付的 alpha 口径(正本 = `contracts/gsap-emit-v1.md`「Alpha 交付口径」)
299
299
 
300
300
  - 颗粒里一律写直通 alpha,半透明光晕 / 渐变 / `text-shadow` 软晕都合法;**别为迁就剪映把半透明色改暗或回避半透明**,预乘是云端 qtrle 转码的义务(infra `fix-qtrle-premultiplied-alpha-for-jianying`),CLI 与颗粒 MUST NOT 再乘一次。
301
- - lint 报 `x-soft-alpha`(非致命)= 这颗含半透明面积:照常铺、照常渲;只是**剪映真机格 MUST 用这颗验**,实心颗粒验不出预乘错配(2026-09-14 事故:软星芒在剪映成实心白多边形)。若用户反馈剪映里软边成了实心,先查渲染服务是否已含预乘配方,不是颗粒的错。
301
+ - lint 报 `x-soft-alpha`(非致命)= 这颗含半透明面积:照常铺、照常渲;剪映验收必须使用含半透明的颗粒。若软边成了实心,先查渲染服务是否已含预乘配方。
302
302
 
303
303
  另一条路仍在:**客户端出片**(opencut 打开工程 → 云渲)同样能出带颗粒的成片,且与 CLI 共用缓存。两条路选哪条由用户定。
304
304
 
@@ -341,7 +341,7 @@ SHALL NOT 自动上字幕出片**(`gtrk render` 还是计费/耗时动作,
341
341
 
342
342
  **渲完必看质检摘要**:`gtrk render` 收口后会自动扫一遍成片(闪帧 / 段内跳切 / 黑帧 / 冻结 / 爆音 / 静音 / 音画不同步),落 `<成片名>.qc.json` 并打摘要。**「严重」条目要如实转述给用户并给出路**,别把有缺陷的片子说成出好了:
343
343
 
344
- - **过短镜头 / 段内跳切** → B-roll 颗粒窗口跨过了源素材的镜头切点。**先看严重级再决定要不要动**:报「严重」的是**我们剪出来的节奏断裂**(镜头有一端落在颗粒拼接处,长镜头之间突然插进半拍短镜头,最难受),让用户在 opencut 里微调那几颗的入出点或重铺该 beat;报「备注」的是**素材自身的快剪节奏**(整段落在同一颗粒内部,比如源片本来就是蒙太奇轮播),那是素材语言、**不必动**。若素材是 2026-08-19 之前建的本地索引,先 `gtrk matrix index --dirs <素材库> --rebuild` 重建再重铺。
344
+ - **过短镜头 / 段内跳切** → B-roll 颗粒窗口跨过了源素材的镜头切点。报「严重」时让用户在 opencut 里微调那几颗的入出点或重铺该 beat;报「备注」且属于素材自身的快剪节奏时无需处理。若索引缺少切点,先 `gtrk matrix index --dirs <素材库> --rebuild` 重建再重铺。
345
345
  - **音画不同步(`av_drift`)** → 画面与配音总长不一致。本地渲染的逐段帧对齐已按累计时间线修好(不再渐进失步),所以这一项**报出来就是异常**:先确认成片是不是旧版 CLI 渲的,再看工程时间线本身有没有轨间长度冲突。云渲成片在后端跟进帧对齐前仍可能报此项(已知过渡态)。
346
346
  - **黑帧** → 对照黑底空洞告警:已登记的会自动降为「备注」,报成「提示」的是意料外的纯黑,值得回工程看一眼。
347
347
 
@@ -385,7 +385,7 @@ gtrk patch trim --project <dir> --clip <clip_id> --out -1s
385
385
 
386
386
  **MUST NOT 直接编辑 `.gtrk` 的 JSON。** 片段时码是两套并存的(`clip_st`+`clip_ed` 与
387
387
  `clip_st`+`duration`):改一份不改另一份,客户端优先读 `clip_ed`、后端又不强校验它 ⇒
388
- **没人报错,成片却用了陈旧出点**。`gtrk patch` 替你做恒等式同步 + 帧对齐 + 写前全档校验。
388
+ `gtrk patch` 负责同步两套时码、帧对齐与写前校验,避免手改 JSON 后客户端与后端读取不同出点。
389
389
 
390
390
  > 参数手册在 `AGENT.md` 的「元素级编辑:`gtrk patch`」一节与 README 命令参考。
391
391
  > 本节**只指路不搬手册** —— 搬过来就会长出会漂移的副本。
@@ -18,11 +18,11 @@ description: 音乐可视化成片——把一首歌通过同合云出成一条
18
18
 
19
19
  ## 一条命令
20
20
 
21
- > **产物落点纪律(MUST · 全文见随包 `AGENT.md` 同名一节)**:
21
+ > **产物落点纪律(MUST · 全文见随包 `AGENT.md` 同名一节)**:
22
+ > 交付物 MUST NOT 先写 agent 自有目录再拷进工程;中转本身即违规,体积不是豁免理由。
22
23
  > 成片等一切产物只落产物目录(缺省 = 音频同目录)或**用户显式指定的 `--out`**;
23
24
  > **MUST NOT** 把成片、预览或任何大媒体文件复制到 agent 自有工作目录(如用户文档目录下 agent 产品自建的目录、agent 家目录缓存、会话工作区)——需要引用媒体时**用原路径引用**,不做副本;
24
- > 临时文件一律放系统 temp 且**用完即删**(含中断 / 失败路径)。违者后果 = 用户系统盘被静默吃满(真机事故,非假设)。
25
- > 交付物(颗粒 HTML / 工程文件 / 派单稿 / 文稿等)SHALL **直接以工程目录内的最终路径为写入路径**,MUST NOT 先写 agent 自有工作目录再拷进工程——**中转本身即违规**,不以「最后拷进去了」免责,**体积不是豁免理由**(2026-09-07 事故里漂掉的是 2.7–6.2 KB 的 HTML)。与上一条的分界:抽帧图这类**不交付**的中间物走系统 temp;**要交付的东西没有暂存态**。
25
+ > 临时文件一律放系统 temp 且**用完即删**。交付物直接写入工程目录或用户显式指定的路径;引用媒体用原路径。
26
26
 
27
27
  ```
28
28
  gtrk music-visualizer <音频> --template <模板id> [可选样式/文件] [--json]
@@ -37,37 +37,17 @@ description: 通用解说视频创作图纸(解说链正本)——把「一
37
37
  | ⑦ | **源片语种 / 方言** | **问用户**:听一段 / 看片内有无内嵌字幕 / 看素材出处 | `gtrk transcript --lang`(`zh-CN` 普通话 / **`zh-HK` 粤语** / `en-US` / `ja-JP`…);素材通篇无对白答「无对白 / 不转写」即闭合,MUST NOT 因缺这个答案阻塞开工 |
38
38
 
39
39
  > ②③④⑤⑦ MUST 问用户、MUST NOT 代猜;一张表一次问完,不碎问。
40
- > ⟲ **推荐面(公约 §三‴)**:问答收口时多问一句「要不要看看第三方 skill?」,不列名;题材命中场景触发词才多 1–2 句定向推(`gtrk skills recommend --scene <id> --json` 取 tier 最高者,各给一句为什么),用户追问才展开完整块;轻提加定向合计不超三句、同会话同场景只推一次、答「不要」零动作。
40
+ > **推荐面(公约 §三‴)**:问答收口时可问一句「要不要看看第三方 skill?」;题材命中场景触发词才定向推荐,读取 `gtrk skills recommend --scene <id> --json`;用户拒绝后不执行推荐动作。
41
41
  >
42
- > ⟲ **2026-09-02 六问补为七问(新增 ⑦ 语种)**:260902 真机一条**粤语对白**的片子按缺省 `zh-CN`
43
- > 静默转写跑完,整条链上无一处问过语种。⑦ MUST 早于 ① 的转写发起:转写是计费动作且在检查点①**之前**,
44
- > **非中文素材**(`en-US` / `ja-JP`…)语种传错,用户在检查点①拿到的稿子就是坏的、重来要再付一次 ASR
45
- > (真机 `--lang en-US` 出英文稿即实证);且豆包 14 项白名单外的语种码在 `word_level=true` 下会裸
46
- > `KeyError` 炸任务。**MUST NOT 以缺省 `zh-CN` 静默开跑**,检查点①对语种只做过目复核。
42
+ > 语种必须在转写前确认。非中文素材传错语种会让检查点①拿到错误稿件并产生重复 ASR 成本;不要静默使用 `zh-CN`。粤语建议填写 `zh-HK` 作为元数据,当前 `--json` 路径按字级转写;无对白素材回答「无对白 / 不转写」即可。
47
43
  >
48
- > ⟲ **2026-09-02 同日订正(这一问的原粤语论证段已被求证推翻,问本身照旧成立)**:原文写
49
- > 「`zh-CN` 与 `zh-HK` 在后端是两个不同的识别语种(Whisper `zh` vs `yue`)」——**该因果论断错**。
50
- > `gtrk transcript` 写死 `word_level: true`(`src/commands/transcript.ts:178`)⇒ 链路钉在豆包、
51
- > 到不了 Whisper(infra `utils/process/media/audio/asr.py:44-49` 在 `AsrFunc.Whisper` 分支里
52
- > 仍把 `word_level_handler` 钉成豆包);而豆包字典里 `zh-CN` 与 `zh-HK` **都映射空串**
53
- > (`utils/partner/volcengine/doubao_llm_asr.py:36-37`)⇒ 两种写法发出的请求**逐字段相同**。
54
- > 粤语能识别对,靠的是豆包空串模式自己的方言自适应,与这个参数无关;`zh-HK→yue` 那条映射真实存在
55
- > (`utils/partner/openai/__init__.py:18`)但只在 `word_level=false` 走 Whisper 时生效,CLI 今天走不到。
56
- > ⇒ 粤语 **SHOULD** 如实填 `zh-HK`(元数据诚实 + 备将来链路切换),但 **MUST NOT 以「粤语语种传错」
57
- > 为由重跑转写**:`la` 进 ASR 缓存键(`asr_result_cache.py:71-75`),换码必然 cache miss,
58
- > 白扣一次时长换回同一份结果。
59
- > ⟲ **2026-09-19 订正**:上段「写死 `word_level: true`」已过时。现口径按产物消费面分流
60
- > (cli `adjust-transcript-json-word-level`):**无 `--json`** ⇒ 句级、走自部署引擎 + 服务端纠错(小工具用法);
61
- > **`--json`**(本图纸的用法)⇒ 字级,transcript.json 带 `words[]`,字幕拆行后时间按语音贴。
62
- > 粤语在 `--json` 路照旧落厂商字级腿;无 `--json` 路的粤语代价见 `switch-transcript-to-selfhosted-asr`。
63
-
64
44
  ## 三、时序铺排三档(本图纸的技术正本)
65
45
 
66
46
  每段叙述配什么画面,按下面三档路由,**高档优先**:
67
47
 
68
- > **⚠️ 甲档的射程已收窄(260828 主理人拍板 adjust-narration-alignment-first)**:
48
+ > **⚠️ 甲档的适用范围**:
69
49
  > **整份手写 plan(免索引直排)降级为「引用段与硬出处段专用」**,叙述段缺省不再走它。
70
- > 原因是走查实锤——手写 plan 断掉的不止「对齐」,而是**整条质量流水线**:
50
+ > 手写 plan 缺少检索结果携带的质量信号,因此:
71
51
  >
72
52
  > | 信号 | 断在哪 | 后果 |
73
53
  > |---|---|---|
@@ -77,9 +57,6 @@ description: 通用解说视频创作图纸(解说链正本)——把「一
77
57
  > | `motion` 高运动 | 手写 `segments` 不带该字段 | 抖/摇段不降权 |
78
58
  > | `cuts` 切点 | 同上 | **端点残片收缩失效 = 闪帧的机制性根因** |
79
59
  >
80
- > 260828 三条美食片实测 `describes` 行数为 **0**——`--mark-weight 0.3` 明明传了,一分没参与。
81
- > 这也解释了当时「低清 scdet 事后吸附零改善」:那是在成片上补救,根因在 plan 侧信号缺失,补不回来。
82
- >
83
60
  > ⇒ **叙述段缺省走「出处窗内检索」**(见下方「甲′」),既保出处准、又拿回五条信号。
84
61
  > 用户坚持免索引时照办,但 **MUST 先把上表的代价说清**——它不是「快一点」,是质量档位下降,
85
62
  > 且 MUST 在交付说明里如实登记本片走的是降档路径。
@@ -126,42 +103,36 @@ description: 通用解说视频创作图纸(解说链正本)——把「一
126
103
  > 两条独立,回执分别以 `has_cuts` / `fps` 报,`cut_snap` 三态再把「按你的标注主动不吸」
127
104
  > 与「素材没索引想吸也无从吸」分开。
128
105
 
129
- > **直写 plan 操作注记(260827 美食批真机标定)**:整份 plan 可以手写——甚至**不依赖本地索引**
106
+ > **直写 plan 操作注记**:整份 plan 可以手写——甚至**不依赖本地索引**
130
107
  > (4K 长片索引很慢,甲档直排等不起也不必等)。逐 beat 一条 query、逐出处窗一条 result,
131
108
  > `segments:[{start,end,best,score}]`(源片秒)。三条铁则:① `best` 是**窗内代表帧时刻**
132
109
  > (秒),落窗外会被校验拒;lay 取段大致**以 best 为中心**——想 start 锚定就把 best 设为
133
- > 「窗起点 + 意图时长/2」;② 预算三量齐足——`per_shot_sec` 按「beat 时长 / 窗数」给、**窗宽 ≥ 份额**(窗宽不足时缺口=份额−窗宽)、且**单窗实际供片有内部上限(实测 ≈12s)**:长 beat 直接把出处区间切成 ≤12s 的子窗批量给(260827 组二实测 199s beat 用 21 个 11s 子窗铺满,宽窗少窗恒留尾洞);③ 引用段窗与配音时轴**逐秒对齐**(窗起点 = 引用音频对应的
110
+ > 「窗起点 + 意图时长/2」;② 预算三量齐足——`per_shot_sec` 按「beat 时长 / 窗数」给、**窗宽 ≥ 份额**,长出处区间拆成多个子窗;③ 引用段窗与配音时轴**逐秒对齐**(窗起点 = 引用音频对应的
134
111
  > 源时刻),铺后按 `clip_st 与 track_st 的差恒等` 复核零漂移;④ **口播基座下 beat 预算按
135
112
  > dispatch 的成片轴包络算**——`transcript.json` 的 st/ed 是源时码,且 beat 连续化会把句间
136
- > 停顿带并入下一 beat,窗预算不给足就出纯黑段(260827 组一实测 7.5s 纯黑,补窗即愈);
137
- > ⑤ **beat 粒度=关键句粒度,按七三开编(主理人原则,260828 双向实证)**。先认清机制:
113
+ > 停顿带并入下一 beat,窗预算不足会产生空洞;
114
+ > ⑤ **beat 粒度以关键句为主,采用约七三的对齐与游离比例**。先认清机制:
138
115
  > `matrix lay` 在 beat 内按候选分数贪心铺满、**槽序与句序无关**——一个 beat 跨多句时,
139
116
  > 只有「领衔句」能拿到为它挑的画面,其余句是跟随。由此定编排法(**顺序不可颠倒**):
140
117
  > **①关键词卡点先行**:先挑出有明确视觉指涉的句子(实体/动作/可拍之物),逐句独立成 beat、
141
118
  > 一 beat 一窗,保证「稿说什么就给什么」。**划分判据是「素材里有没有」,不是「句子抽不抽象」**
142
- > (主理人 260828 定调:卡不到别硬卡,能卡到就不许不卡)——素材里有对应画面的句子 MUST 卡点
119
+ > ——素材里有对应画面的句子 MUST 卡点
143
120
  > (哪怕它夹在抽象段里,如「昨天的老汤兑进今天的新汤」有汤锅镜头就必须给汤锅);素材里
144
121
  > 确实没有的才允许降为跟随(「卖过三十年汽车」片里无车、「多线程游戏」无从拍)。判据的
145
122
  > 落地取证=渲后 `gtrk qc --alignment`:**卡点句 mismatch MUST 收敛到 0,且每一条 mismatch
146
- > 都要先问「是我窗选错了,还是素材真没有」**——260828 实测两种错各中一次(「一锅汤卖完打烊」
147
- > 素材有标牌镜头却被我把窗猜到别处 = 能卡没卡;u0016 老汤该卡却被我编成跟随 = 该严没严);②**其余填坑**:抽象句、数字句、修辞句、情绪句
123
+ > 都要先问「是我窗选错了,还是素材真没有」;②**其余填坑**:抽象句、数字句、修辞句、情绪句
148
124
  > (日期/克数/"比太阳起得早"/"多线程游戏")**没有对应画面可给**,合并进相邻关键句的
149
125
  > 长镜头当跟随,或用主题相近的群像长镜头覆盖;③**七三开收口**:约 70% 时长逐句对齐、
150
126
  > 30% 游离创造自然感——**游离不是妥协是设计**。
151
- > ⚠️ **反面实证(勿重蹈)**:260828 拉面店做过一版「一句一 beat」100% 逐句对齐,
152
- > 32 句 32 clip、中位 3.1s 一刀,真闪帧 3→**17**,片子碎成 PPT。**追求 100% 对齐率
153
- > 就是在毁观感**——对齐质检的靶子是「关键句零 mismatch」,不是「rate 冲 100」。
154
- > 反向的错也实证过:beat 跨六句共用一窗(B02)会让四五句集体错位,对齐率压到 62%。
155
- > 两头都是坑,七三开是那条中线。
156
- > ⑥ **盲选窗跨源镜头切点**——这条曾是免索引直排的固有代价,**走 `direct_slots` 之后
157
- > 大部分消掉**:直排槽照样过窗口精修,`provenance` 段的端点会被自动吸到切点。
127
+ > ⚠️ **不要追求 100% 逐句硬切**:对齐质检的靶子是「关键句零 mismatch」,其余句允许跟随;一个 beat 也不要跨太多关键句,以免集体错位。
128
+ > ⑥ **盲选窗跨源镜头切点**——`direct_slots` 的直排槽同样会过窗口精修,`provenance` 段的端点会自动吸到切点。
158
129
  > 仍会剩下两种情形,都要如实报账而不是靠重铺硬碰:
159
130
  > · **素材未索引**(无 `cuts`)⇒ 收缩无数据可用。先索引再铺是正解,等不起就照实说明。
160
131
  > · **`quote` 引用段** ⇒ 它按设计**不吸**(吸走就是画音错开)。若那一口确实横跨切换,
161
132
  > 那是内容本身如此,正确处置是改稿或改引用区间,不是让铺轨替你挪。
162
133
  > 渲后 QC 的 flash/intra_cut 证据仍可反算源切点(clip_st + into_clip_sec)供人工复核。
163
134
 
164
- ### 甲′ · 出处窗内检索(叙述段缺省路,260828 新增)
135
+ ### 甲′ · 出处窗内检索(叙述段缺省路)
165
136
 
166
137
  **出处准与检索对齐可以兼得**,不必二选一:把出处区间当**检索域**而不是当**答案**。
167
138
 
@@ -202,7 +173,7 @@ QC 反算重铺);② 段带 `cuts`,端点残片收缩生效;③ 段带 `
202
173
  - **切取用流拷贝**(`ffmpeg -c copy`,零重编码);想让 AI 帮你海选可引用的高光,可先跑一遍 `gtrk long2short` 拿选段清单当候选(可选辅助,明示计费)。
203
174
  - **装配**:逐段 TTS + 引用段原声按稿序拼成总音频 → 合成 transcript(各段句级时码换算到拼接轴)→ `gtrk project init --audio <总音频> --transcript <合成转写>` 建工程(自备配音兜底路);引用段画面 = 该源区间直排上轨。无引用段时装配退化为单条 TTS + `--tts-task` 主路(与旅拍同款)。
204
175
  **产物文件名别硬拼(fix-tool-outdir-collision)**:多段 TTS 落**同一个 `--out`** 时,第二段起的产物会带 taskId 后 6 位后缀(`tts-narrator-a1b2c3.wav`),基名只有第一份是干净的。拼接清单 MUST 按每次回执的 `files` 取路径,MUST NOT 按 `tts-<speaker>.wav` 猜——猜出来的名字会一路指向第一段,拼出来的总音频会把某一段重复多遍而不报错。
205
- **主轨无缝铁则(260828 主理人挑刺定案)**:合成 transcript 里引用段 utterance 的 st/ed **MUST 写物理拼接位**(拼接轴上的真实起止),MUST NOT 加 ±0.1s 字幕 pad——dispatch 的 beat 轨窗派生自转写时刻,pad 会在主轨上留 0.1s 缝(三片实测各 4 处)。已有 pad 的存量工程修法:改转写引用句时刻→重导视图→重落拆分(hash 只随文本不失效)→重铺(plan 引用窗随之外扩,Δ=0 不破)→字幕重出。
176
+ **主轨无缝铁则**:合成 transcript 里引用段 utterance 的 st/ed **MUST 写物理拼接位**(拼接轴上的真实起止),MUST NOT 加字幕 pad;已有 pad 的工程按「改时刻→重导视图→重落拆分→重铺→字幕重出」修复。
206
177
  - **克制丑话**:引用段是佐料——时长占比失衡会让片子变成搬运,平台判定风险归用户(§八 一并告知)。
207
178
 
208
179
  ## 五、快速成片编排
@@ -222,9 +193,8 @@ gtrk transcript "<长片>" --lang <开工⑦所答语种> --json # 影视/游
222
193
 
223
194
  # ②③ 写稿(甲档出处共生 / 乙路对照表对齐)→ 检查点①拍板(§六)
224
195
  gtrk matrix material "<情绪 题材 检索词>" --scope audio --top-k 5 --json # BGM 候选附试听
225
- # ⚠️ is_copyright 的权威语义是 1/true=可商用、0/false=**不可商用**——反直觉,MUST NOT 把 false
226
- # 读成「无版权、可随便用」(真机上正是这一步读反,把不可商用素材铺进了 5 个工程)。
227
- # ⟲ 260906 拍板 · 选材口径:矩阵成员档**缺省搜全库**,MUST NOT 默认加 --commercial-only、
196
+ # ⚠️ is_copyright 的权威语义是 1/true=可商用、0/false=**不可商用**,MUST NOT 把 false
197
+ # 读成「无版权、可随便用」。矩阵成员档**缺省搜全库**,MUST NOT 默认加 --commercial-only、
228
198
  # 也 MUST NOT 以「保险起见」为由剔掉 is_copyright:false 的候选(全库正是成员身份买到的东西)。
229
199
  # 对价是**如实标注**:推荐时 MUST 逐条带上 copyright_label(派生位,中文标签),不可商用的照直说,
230
200
  # 但 MUST NOT 升级成追问或阻塞。用户**特意说明**只要可商用 / 要商用发布 / 客户商单时才加
@@ -247,7 +217,7 @@ gtrk matrix lay --project "<工程>" --mark-weight 0.3 --highlight-weight 0.2 --
247
217
 
248
218
  # ⑧⑨⑩ 字卡(MG 临场泛化,公约 §三)→ BGM(0.10 垫底、短了自动循环铺满)→ 字幕直出
249
219
  # BGM 是带人声歌曲(audio_type:"song")→ MUST 下载 accompaniment_url 伴奏版上轨,
250
- # 不得用 download_url 原曲(人声与配音打架,260827 美食批踩坑)
220
+ # 不得用 download_url 原曲(人声与配音会打架)
251
221
  gtrk mg --project "<工程>" --json
252
222
  # --beat-align 的高潮点取自 split.beats 的 narrative / container_stage(升华段 → 容器转折 → 回扣段);
253
223
  # 拆分稿没带这两个字段 ⇒ 落 0.75×全片兜底档,**CLI 会明示那是猜的**。不接受就用 --climax <轨秒> 指定。
@@ -259,25 +229,21 @@ gtrk subtitle lay --project "<工程>" --style <样式> --color <色> --json
259
229
  > **停顿太长时**:自训音色加 `--fragment-interval 0.2`(合成时就对);云引擎音色**不支持**该参数(传了会报错,不会静默忽略),改在合成后跑 `gtrk audio tighten --project <工程>` 收紧句间停顿(纯本地零计费;只压跨句界的停顿,句内换气与原声引用段不动)。
260
230
 
261
231
  配方口径(`--mark-weight 0.3`、BGM 0.10、`--gap-fill fast`、句界吸附缺省)与旅拍图纸 §五 同源,本图纸引用不复制。
262
- `--highlight-weight 0.2`(260828 新增):看点维度与 mark 正交——mark 判「好不好看」、highlight 判
232
+ `--highlight-weight 0.2`:看点维度与 mark 正交——mark 判「好不好看」、highlight 判
263
233
  「有没有看点」(信息量/戏剧性/情绪强度/稀缺性)。看点准则按垂类走 L1 rubric(美食/旅拍图纸各持一份
264
234
  **画面投影版**)。两权之和 0.5,语义仍占一半——**MUST NOT 加到语义压不住的程度**,那会变成
265
235
  「专挑好看的,不管说的是什么」。
266
236
  ⚠️ 三个权重(mark/highlight)与 blurry 降权**全都依赖 `matrix describe --plan` 跑过**;
267
237
  没跑就是全部候选中性、排序与不开权重逐字节一致。
268
- 质检照公约 §二′「三级收敛前移」(260829 拍板,替代原「渲后必跑」):**L1 恒开**(零成本结构自检,含闪帧风险不可判的前置声明);**L2 落轨前**查各 beat 卡点句的画音对齐、没给到就换候选重排(`gtrk matrix lay --arrange-qc`,用户可选、按帧计费、轮数硬上限 2,到限即交付 + 残余如实登记);**L3 渲后终检改用户可选**——本地渲交付时随渲附带(缺省质检 + `--no-qc` 逃生舱照旧),**不再为质检单独逼渲**(4K AV1 渲一遍太久)。跑过的质检结论一律随交付一句人话分层呈现(致命点名给修法/良性如实登记)。
238
+ 质检按公约「三级收敛」执行:**L1 恒开**;**L2 落轨前**可用 `gtrk matrix lay --arrange-qc` 检查卡点句画音对齐;**L3 渲后终检**随本来就要交付的本地渲附带,不为质检单独逼渲。跑过的质检结论随交付分层呈现。
269
239
 
270
240
  ## 六、检查点①(拍板停一次;铺画面前另有一次用量确认)
271
241
 
272
- > ⟲ **2026-08-31 订正**:本节标题原写「必停一次,计费动作恒在其后」。前半句已不成立——
273
- > 本地素材的编排自该日起默认走云端并按「编排量」计费,`matrix lay` **跑前会再停一次**报预估。
274
- > 后半句仍成立(那次确认也在检查点①之后)。
275
- > **agent 纪律**:无 TTY 时 CLI 问不到人会回落本机编排并打告警——MUST 先把预估用量告诉用户、
276
- > 拿到同意再带 `--yes` 重跑;MUST NOT 未经同意就带 `--yes`,也 MUST NOT 看到回落告警当没事发生。
242
+ > 本地素材的编排缺省走云端并按编排量计费。`matrix lay` 跑前必须报告预估用量,取得同意后才能带 `--yes`;无 TTY 且未确认时整轮中止,工程不改动,plan 可重跑。
277
243
 
278
244
  稿件(含引用窗口标注)+ **出处对照表**(乙路时;低置信段标出)+ 画幅 + 音色(附试听)+ BGM(附试听)+ 字幕样式(不挑走默认)——一屏给齐一次拍板。**未经确认 MUST NOT 发起 TTS/长剪短等计费动作。**
279
245
 
280
- ## 六′、稿句↔镜头对照表(铺轨前必给,260828 新增)
246
+ ## 六′、稿句↔镜头对照表(铺轨前必给)
281
247
 
282
248
  候选选定、**铺轨动作发起之前**,把「哪句配哪个镜头、为什么是它」摊开给用户过目。
283
249
  出处对照表回答「这段稿从哪来」,本表回答「这段稿给什么画面」——两张表不互替。
@@ -295,7 +261,7 @@ gtrk subtitle lay --project "<工程>" --style <样式> --color <色> --json
295
261
  用户在这里改判的成本最低:他说「u0012 我记得片尾还有个更好的标牌镜头」,此时换窗重检索
296
262
  只花几秒;等铺完渲完再改,就是整轮返工。
297
263
 
298
- ## 六″、验收判据(260828 拍板升级)
264
+ ## 六″、验收判据
299
265
 
300
266
  含 B-roll 覆盖的成片,验收 MUST 同时满足两条:
301
267
 
@@ -303,7 +269,7 @@ gtrk subtitle lay --project "<工程>" --style <样式> --color <色> --json
303
269
  2. **`gtrk qc --alignment` 的卡点句 mismatch = 0**。
304
270
 
305
271
  > ⚠️ **判据是 lead_mismatch 归零,不是全句对齐率冲 100。**
306
- > 全句率趋近 100% 恰恰意味着 100% 逐句硬切——260828 实证那样做闪帧 3→**17**,片子碎成 PPT。
272
+ > 全句率趋近 100% 往往意味着逐句硬切,可能让片子变碎。
307
273
  > 全句 rate 只作参考量看趋势,**MUST NOT 当达标线**。
308
274
  >
309
275
  > 每一条 lead mismatch 都先问「**是我窗选错了,还是素材真没有**」:前者换窗重铺,
@@ -113,11 +113,8 @@ gtrk oralcut "<align 结果 JSON 的 output,即 *_extaudio.mp4>" [原有参数
113
113
 
114
114
  ## 执行(每次都带 `--json`)
115
115
 
116
- > **产物落点纪律(MUST · 全文见随包 `AGENT.md` 同名一节)**:
117
- > 一切产物(成片 / 预览 / 代理 / 素材 / 工程文件)只落**工程目录**或**用户显式指定的输出路径**;
118
- > **MUST NOT** 把成片、预览或任何大媒体文件复制到 agent 自有工作目录(如用户文档目录下 agent 产品自建的目录、agent 家目录缓存、会话工作区)——需要引用媒体时**用原路径引用**,不做副本;
119
- > 临时文件一律放系统 temp 且**用完即删**(含中断 / 失败路径)。违者后果 = 用户系统盘被静默吃满(真机事故,非假设)。
120
- > 交付物(颗粒 HTML / 工程文件 / 派单稿 / 文稿等)SHALL **直接以工程目录内的最终路径为写入路径**,MUST NOT 先写 agent 自有工作目录再拷进工程——**中转本身即违规**,不以「最后拷进去了」免责,**体积不是豁免理由**(2026-09-07 事故里漂掉的是 2.7–6.2 KB 的 HTML)。与上一条的分界:抽帧图这类**不交付**的中间物走系统 temp;**要交付的东西没有暂存态**。
116
+ > **产物落点纪律(MUST · 全文见随包 `AGENT.md` 同名一节)**:交付物只写入工程目录或用户显式指定的输出路径;引用媒体用原路径,不复制到 agent 工作目录;临时文件放系统 temp,用完即删。
117
+ > 交付物 MUST NOT 先写 agent 自有目录再拷进工程;中转本身即违规,体积不是豁免理由。
121
118
 
122
119
  ```bash
123
120
  gtrk oralcut "<毛片绝对路径>" [--script "<txt路径>"] [--preset steady|concise|compact] [其它参数…] --json
@@ -175,8 +172,7 @@ gtrk oralcut "<毛片绝对路径>" [--script "<txt路径>"] [--preset steady|co
175
172
 
176
173
  ⚠️ **上面的词只是举例、不是白名单**——判据是「**用户表达了节奏/范围保留**」,换个说法照样得听懂。
177
174
  典型误判:「先智能剪口播 **然后我们逐步推进**」——用户说了「然后」,明确表示还要往下,
178
- **范围**逃生门逐字不成立;但**节奏**逃生门成立 ⇒ **SHALL 停**。(2026-09-04 真机事故就栽在这里:
179
- 当时只写了范围侧,agent 一口气连跑了三个 skill。)
175
+ **范围**逃生门逐字不成立;但**节奏**逃生门成立 ⇒ **SHALL 停**。不要因用户说「然后」就忽略明确的逐步推进要求。
180
176
 
181
177
  停下时**必须交代下一步是什么、他说一声就继续**,别退化成事事请示。示范:
182
178
  「口播工程已就绪。按你说的逐步来,我先停在这。下一步是拆成 beat 级分镜派单,你说一声我就接着做。」
@@ -198,7 +194,7 @@ gtrk patch trim --project <dir> --clip <clip_id> --out -1s
198
194
 
199
195
  **MUST NOT 直接编辑 `.gtrk` 的 JSON。** 片段时码是两套并存的(`clip_st`+`clip_ed` 与
200
196
  `clip_st`+`duration`):改一份不改另一份,客户端优先读 `clip_ed`、后端又不强校验它 ⇒
201
- **没人报错,成片却用了陈旧出点**。`gtrk patch` 替你做恒等式同步 + 帧对齐 + 写前全档校验。
197
+ `gtrk patch` 替你做恒等式同步 + 帧对齐 + 写前全档校验。
202
198
 
203
199
  > 参数手册在 `AGENT.md` 的「元素级编辑:`gtrk patch`」一节与 README 命令参考。
204
200
  > 本节**只指路不搬手册** —— 搬过来就会长出会漂移的副本。
@@ -12,7 +12,7 @@ description: 视觉拆分派单器——把一条已剪好的口播工程(gtrk
12
12
  ## 三条铁律(先记死,再动手)
13
13
 
14
14
  1. **只引用视图里存在的 utterance id**:beat 的文稿范围 = `span:{from:"u0007", to:"u0011"}`(utterance id 区间)。id 必须来自 `gtrk split --project` 导出的投影视图,**不许臆造**(`u9999` 一定被硬拒)。
15
- 2. **绝不抄原句文字作定位**:旧版用「前锚点……后锚点」原文片段定位——**已退役**。锚点文字会诱发幻觉、会和实拍漂移。一律用 id 区间。
15
+ 2. **绝不抄原句文字作定位**:原文片段会诱发幻觉、也会和实拍漂移。一律用 utterance id 区间。
16
16
  3. **绝不自造/推算任何时码**:拆分稿里**不写任何秒级时码字段**。轨道时码由 `gtrk split` 落地时现场投影写入 `struct_meta.split` / `dispatch.json`。你只管语义(lane / 叙事功能 / handoff),时间线交给 CLI。
17
17
 
18
18
  ## ★ MG 槽位的视觉职能 `visual_job`(必填)
@@ -73,10 +73,10 @@ description: 视觉拆分派单器——把一条已剪好的口播工程(gtrk
73
73
  ## 完整流程(取视图 → 拆分 → 落地 → 修正循环 ≤3 轮)
74
74
 
75
75
  > **产物落点纪律(MUST · 全文见随包 `AGENT.md` 同名一节)**:
76
+ > 交付物 MUST NOT 先写 agent 自有目录再拷进工程;中转本身即违规,体积不是豁免理由。
76
77
  > 一切产物(拆分稿 / 派单 / 成片 / 预览 / 素材 / 工程文件)只落**工程目录**或**用户显式指定的输出路径**;
77
78
  > **MUST NOT** 把成片、预览或任何大媒体文件复制到 agent 自有工作目录(如用户文档目录下 agent 产品自建的目录、agent 家目录缓存、会话工作区)——需要引用媒体时**用原路径引用**,不做副本;
78
- > 临时文件(抽帧图等)一律放系统 temp 且**用完即删**(含中断 / 失败路径)。违者后果 = 用户系统盘被静默吃满(真机事故,非假设)。
79
- > 交付物(颗粒 HTML / 工程文件 / 派单稿 / 文稿等)SHALL **直接以工程目录内的最终路径为写入路径**,MUST NOT 先写 agent 自有工作目录再拷进工程——**中转本身即违规**,不以「最后拷进去了」免责,**体积不是豁免理由**(2026-09-07 事故里漂掉的是 2.7–6.2 KB 的 HTML)。与上一条的分界:抽帧图这类**不交付**的中间物走系统 temp;**要交付的东西没有暂存态**。
79
+ > 临时文件(抽帧图等)一律放系统 temp 且**用完即删**。交付物直接写入工程目录或用户显式指定的路径;引用媒体用原路径。
80
80
 
81
81
  ### 1. 取投影视图(你的唯一创作输入)
82
82
 
@@ -50,7 +50,7 @@ description: "能生产 skill 的 meta skill——通过启发式访谈引导视
50
50
  ### ⑤ 词表沉淀
51
51
 
52
52
  访谈中**反复出现的自造词**(他给自己概念起的名字)逐个登记。这些词就是他栏目的语法词汇。
53
- - 条件产出:家族 ≥2 个 skill **或** 沉淀出自造词时,单独产共享词表文件(家族各 skill 引用它,防多处定义漂移——这是血泪教训);单 skill 且无自造词时,词表并入 SKILL.md 一节即可。
53
+ - 条件产出:家族 ≥2 个 skill **或** 沉淀出自造词时,单独产共享词表文件(家族各 skill 引用它,防多处定义漂移);单 skill 且无自造词时,词表并入 SKILL.md 一节即可。
54
54
 
55
55
  ### ⑥ 家族切分
56
56
 
@@ -29,11 +29,11 @@ description: 通用口播视频创作图纸(口播链)——把一条或一
29
29
  | ② | 有无独立外录音轨? | 看目录配对(每条视频旁的音频文件)+ ffprobe 时长比对 | 走不走双轨换声(§二) |
30
30
  | ③ | 有没有文稿? | 问用户。**⚠️ 即兴内容禁传事后整理稿**——oralcut 会把「终稿外内容」当废话剪掉,即兴场景必须走无稿智能重建 | `--script` 传不传 |
31
31
  | ④ | 毛片几何 | ffprobe | 画幅随片(**非拍板项**,与旅拍不同——那边是无中生有须拍板画幅);非标帧率会被吸附到标准值,属预期 |
32
- | ⑤ | **B-roll 素材来源**(主理人 2026-08-27 真机挑刺拍板) | **问用户,MUST NOT 硬塞**:有没有本地素材文件夹(要路径)?要不要用云端素材填充? | §五 matrix 走法三选一:本地(`--local --dirs`)/ 云端 / **都不要 = 不铺 B-roll**(纯 A_ROLL + MG 字卡也是完整成片形态) |
32
+ | ⑤ | **B-roll 素材来源** | **问用户,MUST NOT 硬塞**:有没有本地素材文件夹(要路径)?要不要用云端素材填充? | §五 matrix 走法三选一:本地(`--local --dirs`)/ 云端 / **都不要 = 不铺 B-roll**(纯 A_ROLL + MG 字卡也是完整成片形态) |
33
33
 
34
34
  | ⑥ | **有没有与人像同步录制的屏录 / 第二机位?** | **问用户,MUST NOT 代猜**(看目录里有没有同时段的屏录 / 另一机位文件只是提示,不是答案)。有则追问三样:画中画形状(圆 / 圆角方 / 爱心 / 菱形 / 星形,缺省圆)、位置(缺省右下)、大小(缺省约 28% 画幅高) | 走不走 §二′ 双源画中画(`gtrk pip lay`);屏录题材 **⑤ 默认答「不铺 B-roll」**(屏幕本身即画面) |
35
35
 
36
- > ⟲ **推荐面(公约 §三‴)**:问答收口时多问一句「要不要看看第三方 skill?」,不列名;题材命中场景触发词才多 1–2 句定向推(`gtrk skills recommend --scene <id> --json` 取 tier 最高者,各给一句为什么),用户追问才展开完整块;轻提加定向合计不超三句、同会话同场景只推一次、答「不要」零动作。
36
+ > **推荐面(公约 §三‴)**:问答收口时可问一句「要不要看看第三方 skill?」;题材命中场景触发词才定向推荐,读取 `gtrk skills recommend --scene <id> --json`;用户拒绝后不执行推荐动作。
37
37
 
38
38
  ## 二、双轨收音:对轨 → 换轨(本图纸最大的新东西)
39
39
 
@@ -47,8 +47,7 @@ description: 通用口播视频创作图纸(口播链)——把一条或一
47
47
  gtrk audio align "<毛片>" "<外录>"
48
48
  ```
49
49
 
50
- 已对齐、未对齐**都直接跑自动分支**——已对齐的素材会测出 offset≈0 且高置信(真机实证:三段等长 wav
51
- 全测得 0、置信度 8.8–13.6)。**测出 0 比假设 0 更稳**:万一素材其实没对齐,假设 0 会静默错轨。
50
+ 已对齐、未对齐**都直接跑自动分支**——已对齐素材会测出接近 0 的偏移与高置信。**测出 0 比假设 0 更稳**:万一素材其实没对齐,假设 0 会静默错轨。
52
51
  `--offset 0` 只在你确知偏移时用(跳过检测省几秒)。
53
52
 
54
53
  命令自动互相关测偏移并给**置信度**,按置信度分流:
@@ -158,11 +157,11 @@ gtrk split(投影 → 你写拆分稿 → 落地)→ gtrk matrix(按⑤走
158
157
  拆分稿写完自查两条:
159
158
  - **lane 里出现 AI_DRAMA 即改派**(机检 grep 即可);
160
159
  - **字卡要产颗粒的,aux 必须用 `type:"overlay"` + handoff(含 duration_hint)**——`quote-card` 等
161
- 前七类 aux 只是语义标注、**不产派单**(真机踩过:五张字卡全写成 quote-card,dispatch.mg 为空)。
160
+ 前七类 aux 只是语义标注、**不产派单**;需要颗粒的字卡必须用 `type:"overlay"` + handoff。
162
161
 
163
162
  ## 六、MG 风格:内容驱动的临场泛化(成片型图纸通用条款)
164
163
 
165
- > 横切原则**正本已迁仓内《成片型图纸公约》§三**(`docs/成片型图纸公约.md`,主理人 2026-08-27 拍板,射程 = 所有含 MG 铺轨面的成片型图纸);本节是口播链的执行文本,改公约须同批同步。旅拍图纸 §六「因势象形」是它的旅拍实例。
164
+ > 横切原则正本见仓内《成片型图纸公约》§三(`docs/成片型图纸公约.md`);本节是口播链的执行文本,旅拍图纸 §六「因势象形」是它的旅拍实例。
166
165
 
167
166
  - **有栏目风格 skill** → 走栏目(经栏目配置注入),本节不适用。
168
167
  - **没有栏目风格 skill** → **按当下这片的内容,现场泛化一套自洽风格直接用**: