---
name: gitruck-gtrk-travel-recap
description: "旅拍解说一站式成片图纸——输入一个旅拍素材文件夹（长视频或素材集），AI 理解素材、写三段式解说稿、一次确认后全自动跑完配音/建工程/拆分/B-roll/字卡/BGM/字幕，直达客户端可出片工程。当用户想「旅拍解说 / 旅行视频解说 / 把这条旅行长视频做成解说视频 / 旅拍素材做成片 / 长视频二创解说 / vlog 解说化 / travel recap」时使用本 skill。凡涉及把旅拍素材（自拍或网络长视频）做成中文解说成片，优先用本 skill 编排 gtrk CLI 全链，不要手搓单命令、别让用户逐步驱动。"
license: "MIT"
metadata:
  decimalai-skill-id: "54a2032e-2d11-4172-a799-7bc32bd9b832"
  decimalai-version-id: "bfdfe3b0-5568-48ed-92a8-f1d7229cee40"
  decimalai-version: "1"
  decimalai-body-sha256: "6b83ad7d8838aeb690fb041fdfb22f469fe425360412402c92e1a5c35cae05dc"
  decimalai-name: "gitruck/gtrk-travel-recap"
  decimalai-format: "1"
  decimalai-invocation: "model"
  decimalai-category: "design-media"
  decimalai-source: "https://app.decimal.ai/s/gitruck-gtrk-travel-recap@1/SKILL.md"
---
# gtrk-travel-recap（旅拍解说 · 组合成片图纸）

把**一个旅拍素材文件夹**变成**一条中文解说成片工程**：理解素材 → 三段式写稿 → 检查点①一次拍板 → 配音/建工程/拆分/B-roll/字卡/BGM/字幕 全自动 → 客户端出片。

> **定位**：本 skill 是第一张 **structure 级组合图纸**——它不新增任何命令，只编排既有原子零件（transcript / matrix / project init / split / mg / audio lay / subtitle lay / TTS 工具）。零件的参数细节以各自 skill（`gtrk-matrix` / `gtrk-splitter` / `gtrk-mg` / `gtrk-transcript`）与 `--help` 为准，**本图纸引用不复制**；但**编排次序、检查点、配方级参数**以本图纸为准。**CLI 是手，你是脑**：写稿、切 beat、挑候选信号、产字卡颗粒、管检查点，都是你的活。
>
> **家族归位**：本图纸是**解说链**（`gtrk-narration` 正本）的旅拍垂类实例。时序铺排、引用段、出处对齐等链级条款以 `gtrk-narration` 为正本；本图纸只补充旅拍要素层（贵大奇多钩子、攻略 tips、升华笔法）。素材无自带时序的题材（科普/情感/带货）走 `gtrk-voiceover`。
>
> **本 skill 已含跑通全链需要的编排信息**。

## 一、输入契约与双场景识别

用户给**一个素材文件夹**（或多个，逗号分隔传 `--dirs`）：

| 内容 | 必须性 | 说明 |
|---|---|---|
| 视频/图片素材 | **必须** | 一条长视频（二创）或一堆素材（原创拍摄）皆可；图片会被自动运镜成动态上轨 |
| BGM 音频文件 | 可选 | 没有就走素材矩阵搜索（见检查点①） |
| 介绍类文本（txt/md） | 可选 | 有则作写稿补充素材 |

**一夹多片时检索域按场景分流**：二创场景一个夹里常躺着好几条互不相干的片，
**B-roll 检索域 MUST 收窄到正在做的那一部片本身**——`--dirs` 既吃文件夹也吃**单个素材文件**，传文件即把域收窄到该素材（见 §五 ⑦ 的★铁则）。
原创（自拍素材集）那一档整夹就是这一片的素材域，**传夹正确**。

**MUST NOT 下载二创源片 / 主体素材**：网络视频二创场景下，用户提供的文件夹就是输入，下载动作归用户。平台授权素材（素材矩阵的 BGM / 空镜）可按其签名直链落地；这条例外不适用于源片与主体画面素材。

**双场景识别**（决定理解编排走法）：
- **二创**：文件夹里是网络旅行长视频（通常含博主解说语音）→ 原片文案是写稿主料；
- **原创**：用户自己拍的素材集（通常无解说语音）→ 素材理解（describe）是写稿主料。
- 拿不准就 ffprobe 看时长与条数：单条 10 分钟以上大概率二创；几十条短素材大概率原创。仍拿不准，问用户一句。
- 原创场景的素材集常常**通篇没有对白**——那就不跑转写，下表的语种一问以「无对白 / 不转写」闭合，MUST NOT 因缺这个答案阻塞开工。

**开工三问：稿源 · 声音基座 · 源片语种**。三问开工时与双场景识别**一并问清、一张表一次问完、MUST NOT 代猜**：

| 问 | 选项与走法 |
|---|---|
| 稿从哪来 | **AI 代写**（缺省，§三 规约写）/ **用户自备稿**——跳过写稿，稿直接进检查点①过目（文风铁律不强加于用户手稿，只提示明显硬伤） |
| 声音怎么来 | **TTS 配音**（缺省，检查点①挑音色）/ **用户自己念**——拿念稿毛片先走 `gtrk oralcut` 粗剪（带稿最准；外录收音先 `gtrk audio align` 对轨），产出的粗剪工程即时间基座，§五 的「配音④→建工程⑤」两步跳过，从拆分⑥接入，后续铺排/字卡/BGM/字幕照旧 |
| **源片语种 / 方言** | 取证=**听一段 / 看片内有无内嵌字幕 / 看素材出处**；答案定 §五 ① 的 `gtrk transcript --lang`（`zh-CN` 普通话 / **`zh-HK` 粤语** / `en-US` / `ja-JP`…）。**MUST 问用户、MUST NOT 代猜、MUST NOT 以缺省 `zh-CN` 静默开跑转写**——转写是计费动作且早于检查点①，非中文素材传错语种会让检查点①拿到错误稿件并产生重复 ASR 成本。粤语建议如实填 `zh-HK`；当前 `--json` 路径按字级转写。素材无对白：答「无对白 / 不转写」即闭合 |

> **推荐面（公约 §三‴）**：问答收口时可问一句「要不要看看第三方 skill？」；题材命中场景触发词才定向推荐，读取 `gtrk skills recommend --scene <id> --json`；用户拒绝后不执行推荐动作。

> **精剪包装（公约 §三⁵）**：开工时告知一句「快速成片会在适合的段落做合成包装，最多全片四分之一，不要就说一声」——不是问题，用户说不要即零动作；`gtrk composite bake --abi` 报烘焙浏览器没装时，在这张问询表里多问一句装不装（不装用本机 Chrome / Edge）。

## 一′、素材适配闸（写稿前必过）

> 本闸判的是题材，与「有无自带时序」正交。剧情短片、摆拍表演和单一室内场景不能直接套用旅拍要素层。

**取证零新增计费**（读的都是编排里本来就要产的东西，MUST NOT 为这道闸新加一次 describe 或转写）：

- **原创场景**：读 `gtrk matrix index` / `gtrk matrix describe` 已产的 `desc`（中文视觉描述）与 `tags`；
- **二创场景**：读 `gtrk transcript` 全文。

**判据（可判定，逐条素材过一遍）**：

- 主判据——这一条**能不能回答「这是在哪、看到了什么」**（可辨认的地点 + 所见之物）。能答的占比过低 ⇒ 不适配；
- 反向命中任一即不适配：文本呈现**剧情对白**（人物一来一往推进情节）/ **摆拍表演**（演出来的而非记录下来的）/ **单一室内场景**（全片不出一个可辨认的地点）。

**命中即硬停：MUST NOT 进入写稿**（形制照 `gtrk-vlog-docu` 的立神闸）。
硬停位置是**写稿之前 = TTS 计费之前**——它与 §四 检查点①「未经确认 MUST NOT 发起计费动作」是同一条防线的**前置一层**：
检查点①拦的是「稿子对不对」，本闸拦的是「**这活该不该接**」。停下时 MUST 如实列出**哪几条不适配 + 依据原文**
（引 `desc` / `tags` / 转写里的原句，别只下结论），并给三条出路：

| 出路 | 怎么走 |
|---|---|
| ① **剔除** | 把不适配的那几条摘出去，用剩下的素材继续跑本图纸 |
| ② **改投** | 剧情 / 影视 / 游戏这类有时序但非旅拍的题材走 `gtrk-narration`（解说链正本）；素材无自带时序的题材（科普/情感/带货）走 `gtrk-voiceover` |
| ③ **照跑** | 用户坚持就照办，但 **MUST 在交付说明里如实登记**「素材与旅拍垂类不匹配、要素层（贵大奇多钩子 / 攻略 tips）多半落空」（降档路径如实登记，口径同《成片型图纸公约》） |

**两条边界写死**：agent **MUST NOT 自行判死**（决定权在用户，本闸只提名不宣判）、**MUST NOT 静默照跑**——
静默照跑会让整条链在错误题材上完成并产生不必要的计费，因此必须在此停下。

## 二、全链总览（快速成片）

```
① 理解        transcript 原片（二创）/ matrix index + describe（原创）
①′ 适配闸【必过】读 ① 的既有产物判题材（见 §一′）——不是旅拍就硬停，MUST NOT 进入写稿
② 写稿        三段式规约（见 §三）→ 解说稿 + 标题 + HashTag
③ 检查点①     【必停】稿件确认 · 画幅 · 音色 · BGM（gtrk matrix material --scope audio）· 字幕样式 · B-roll 编排量预估（§四）
④ 配音        gtrk tool audio_tts_clone（≤5000 字，句级时码直出）
⑤ 建工程      gtrk project init --tts-task <id> --canvas <WxH>
⑥ 拆分派单    gtrk split 投影 → 你写拆分稿（含字卡 overlay aux）→ split 落地
⑦ B-roll      matrix --local --dirs（二创钉单片）→ describe --plan → lay --mark-weight 0.3 --yes
⑧ 抽帧检查    对字卡挂点抽帧看底轨构图（gtrk-mg SOP）
⑨ MG 字卡     按 §六 轻量规约产颗粒 → mg lint → gtrk mg --project
⑩ BGM        gtrk audio lay --volume 0.1 --beat-align（-20dB 口径）
⑪ 字幕        gtrk subtitle lay --style <检查点①拍板样式>（用户没选用 default）
⑪′ 精剪包装   交棒 /gtrk-composite（公约 §三⁵：auto ≤ 25% → 复核 → 构建机检 → 铺轨烘焙，不停）
⑫ 交付        客户端打开工程出片（gtrk render 仅主轨快照预览，见 §八）
```

检查点①之后一路跑完不再打扰用户——**垂类示例的承诺面就是快速成片一杆到底**。
⚠️ 这条承诺**以 ①′ 适配闸通过为前提**：闸命中时的那次停顿不算「打扰用户」，它是在把钱花出去之前问一句「这活该不该接」。交付后对个别环节不满意走 §七 增量重跑，对垂类玩法本身不满意走 §七 个性化出路。

## 三、三段式写稿规约

### 通用框架层（可移植——其他垂类图纸原样复用本层）

**结构三段式**：第一部分「钩子」抓眼球保留存 → 第二部分「干货」给内容价值 → 第三部分「升华」给情绪价值。爆款四属性贯穿：快乐+知识+共鸣+节奏。

**背景检索建议**：写稿信息源除了画面与音频（字幕不一定有），
**建议**执行 agent 对素材主题的关键词做一轮背景/上下文检索（地名典故、店家来历、片名与
公开报道等），检索所得须与素材内可见事实互证后才可入稿，并标注来源。
有检索能力就做、没有不强求（能力缺席按纯素材信息写，不算违约）；检索到的**外部数字与
争议性说法宁缺勿滥**。

**文风铁律**：
- 禁模板连接词：让我们/首先/然后/最后/此外 等一律不用；
- 拒翻译腔：全部短句中文语感，无欧化从句；
- **禁「否定—转折」对举句式（最高优先级）**：禁的是整个家族，不只字面：
  - 「这不是 X，而是 Y」／「与其说是 X，不如说是 Y」
  - 「X 不仅仅是 Y，更是 Z」／「X 不只是 Y，它还是 Z」
  - 「重要的不是 X，而是 Y」／「真正的 X 从来不是 Y」
  - 「不是因为 X，而是因为 Y」／「X 靠的不是 Y，是 Z」
  - **识别特征**：先立一个没人主张过的靶子再推翻它、用对偶结构制造顿悟感、句子的信息量全在后半句而前半句只是垫脚。
  - **改法**：把后半句直接说出来，删掉前面那个假靶子。「这不是一条水渠，而是一条生命线」→「几百个村民用铁锤在悬崖上凿了三年，就为这一条水渠」。**能直接陈述的事实，绝不用对举包装**。
  - 这条也适用于标题与 HashTag。
- **禁幼稚拟声与过度儿化**（★ 打样校准）：「轰隆隆砸下来」这类拟声，换成**真实事实**（「从九十多米高处坠进谷底，比尼亚加拉还高出近一倍」）——数字与事实比拟声词有力得多；
- **风格目标 = 与原素材旗鼓相当**：原片多吸引人，解说就得配得上——贴着原片气质走，**不加分**（加分是业务化的事，走栏目风格）**不减分**。

**成片时长 = min(内容所支撑, 素材所支撑)**：
- 内容支撑：有多少真东西说多少话，素材再多也不注水；
- 素材支撑：按「30% 图片×8 秒 + 70% 视频素材时长」估算上限，稿子在写稿阶段就按上限收敛（不要等铺轨时开天窗）；把这个秒数换算成字数用下一条的折算口径（**公式本身不动**）；
- **折算口径 = 挂钟语速**（wall-clock：稿件字数 ÷ 合成音频总时长，**含**句间停顿），**按检查点①选定的那条音色取值：读 catalog 该音色的 `speech_rate_cpm`（字/分钟），并把 `speech_rate_basis` 一并报给用户（`measured` = 实测 / `derived` = 由声学参数推算）**；catalog 没给该字段（非中文音色）或拉不到 catalog 时才用**缺省 ≈330 字/分钟**，并明说这是缺省估值、**不是该音色的实测值**。3 分钟成片 ≈ **1000 字**。
  缺省 330 的依据与标定方法见 `references/speech-rate.md`，本图纸只引用该单一真值源。
- ⚠️ **MUST NOT 拿计费折算常量（240 字/分钟）推稿子字数**：计费口径与写稿口径分开，计费常量只用于估算费用。

**写后自校验清单**（逐项过，不过重写）：
- [ ] 三段结构完整、时长在 min 公式内
- [ ] 禁词零命中、无翻译腔、无幼稚拟声
- [ ] **「否定—转折」对举句式零命中**（逐句扫「不是…而是」「不仅…更是」「与其…不如」及其变体；含标题与 HashTag）
- [ ] **重复字/错字扫描**（★ 打样实锤：「下瀑布瀑布」重复字 TTS 会照念）
- [ ] 事实矫正：转写稿的明显错误（如数量级离谱的数字）按常识矫正或模糊处理，不确定的不引用
- [ ] 解说序 ≈ 素材序（二创场景：按原片游览顺序写，B-roll 时间窗天然可用）
- [ ] 同批产出：标题 3-5 个（≤30 字）+ HashTag 3-5 个

### 旅拍要素层（垂类专属）

- **钩子要素**（第一部分重点找）：贵大奇多 / 热门 IP / 名人名著 / 知名历史事件 / 全球 TOP 榜 / 奇闻轶事 / 脍炙人口；
- **干货要素**（第二部分）：攻略 tips / 游览流程 / 干货&经验 / 旅途见闻，幽默口吻、隔几句一个梗（谐音/反转/无厘头），在精不在多；
- **升华笔法**（第三部分）：思考/感悟/启发/感动，正能量收束；第一人称历数、物象隐喻收尾都是成熟笔法；
- 有文化衍生空间（历史典故/风俗人文）可适当发挥，但以原素材内容为锚。

## 三′、L1 看点 rubric · 画面投影版（供 `--highlight-weight` 使用）

`highlight` 是**镜头看点分**——服务端 VLM 对着一帧画面打 0–100。旅拍这一档的准则
（`highlight_rubric`）：

```
判这一帧对旅拍短视频有没有「看点」，0-100：
- 奇观地貌：雅丹/冰川/星空/沙漠/峡谷等罕见地形
- 极端天候光线：日出日落、逆光、雪雾、暴雨、极光
- 人文场面密度：市集、节庆、宗教仪式、当地人劳作
- 反差罕见：人与巨大景观的比例、无人区里的人造物、动物
- 规模感：能看出「有多大/有多高/有多远」的构图
低分：车内挡风玻璃前方公路、酒店房间、无主体的天空、拍糊的中间帧
```

> **分工注记（MUST 遵守）**：本 rubric 只判**镜头可见之物**。知识侧要素——地名典故、
> 历史事件、人文背景——**不进画面 rubric**，它们归写稿与背景检索（§三 通用框架层已列）。
>
> 分工是：**画面 rubric 管「这一帧值不值得看」，写稿管「这件事值不值得讲」。**
> 平淡的过渡帧判低分不等于不可用——降权不排除，候选稀疏时照样上（留空更难看）。

**传入方式**：把上面代码块**原样**存成工程目录下的
`highlight-rubric.txt`，理解那一步带上它——

```bash
gtrk matrix describe --plan <工程>/split/broll-plan.json --highlight-rubric @<工程>/highlight-rubric.txt
```

存成文件而非内联，除了免去多行转义，还留下「这条片用的是哪套准则」的可查痕迹。跑完 `gtrk matrix lay`
自动读 plan 里钉存的同一个桶，不必再传；真传了而且与 plan 钉的不同源，CLI 会**硬失败**（不静默择一）。
⚠️ 换准则重新打分要**重新看片**（1 积分/张）：客观描述缓存不被覆盖，但看点分按准则分桶，新桶没分就得重打。

## 四、检查点①（双模式共有，必停）

写完稿**必须停下**，把以下六项一次给用户拍板。**未经确认 MUST NOT 发起 TTS 与 B-roll 云端编排计费动作**。

> 本地素材的编排缺省走云端并按编排量计费。`matrix lay` 跑前必须报告预估用量，取得同意后才能带 `--yes`；无 TTY 且未确认时整轮中止，工程不改动，plan 可重跑。

> **语种不在这六项里**：它在 §一 开工三问就已定，检查点①对它最多做**过目复核**。
> MUST NOT 把语种拖到这一步才问——此时 ① 的 `gtrk transcript` 已经跑完并已计费，稿子也已按错语种写出来了。

1. **解说稿 + 标题**：正文全文贴给用户（不是给路径），标题候选列出；
2. **画幅**：问目标平台——横屏 B 站/西瓜=1920x1080，竖屏抖音=1080x1920。**素材几何与画幅不一致时明确提示**（横素材→竖画布会裁切或留边）；
3. **TTS 音色**：拉 catalog（`GET {apiBase}/task/tts/voices`，免鉴权）按内容调性挑 2-4 个候选，**每个附试听链接**（catalog 的 audition_url 字段，api.ai-mcn.tv:9000 静态直链）——用户在对话框里直接点开听。internal 标注的音色注明「仅内部成员」。也可按用户描述语义挑（「要个温柔女声」）。
   **每个候选还 SHALL 附上该音色的挂钟语速与据此推的稿件字数区间**（取同一份 catalog 载荷里的 `speech_rate_cpm` + `speech_rate_basis`，零额外往返；该字段缺席就明说「用缺省 330 估」；标定方法见 `references/speech-rate.md`）——挑音色的同时也是在挑稿子长度，别让用户回头才发现稿子长了三成。这条是**加项**，MUST NOT 削弱既有的「无试听链接 = 未完成推荐」义务；
4. **BGM 处置（双来源）**：
   - 用户有本地音乐 → 询问是否 `gtrk tool audio_separation` 伴奏分离后取伴奏（缺省建议分离——TTS 配音不与歌曲人声打架）；
   - 用户未提供 → **搜同和素材矩阵**：`gtrk matrix material "<按稿件情绪+地理文化写的检索词>" --scope audio --top-k 5 --diversity --json`
     （检索词口径见公约 §三′：**内容驱动、禁通用词、至少含一个只有这一片才成立的词**；候选
     MUST 给用户挑不许默认 top1；跨片避让由 `audio lay` 记账 + 检索缺省 `--exclude-recent` 自动完成（按成片时长可加 `--min-duration <秒>`）。身份路由与计费口径由零件持有；**版权状态要如实转述**——`is_copyright=true` = 可商用、`false` = 不可商用。矩阵成员档缺省搜全库并逐条给 `copyright_label`；用户**特意说明**只要可商用或商用发布时才加 `--commercial-only` 收紧。`upsell` 是独立顶层字段，不是候选。
     推荐 3-5 首、**每首附试听链接**（结果的 `download_url`）；`audio_type:"pure"` 纯音乐直接用，`"song"` 直接取 `accompaniment_url` 现成伴奏（零处理成本，两档都有）；注意曲长 vs 成片时长（`duration` 字段）：`audio lay` **缺省循环叠满至工程末尾、尾段裁齐**（多 clip 首尾相接，命令会打 INFO 报段数），短曲只是**接缝多一些**、不会铺一半就静音（想少几道接缝，挑曲时加 `--min-duration <秒>`）；要单次铺请显式传 `--no-loop`；
   - **试听链接义务（MUST）**：音色与 BGM 的推荐没有试听链接=未完成推荐。
   - **BGM 落地一步（MUST）**：检索出参只给签名 URL，而 `gtrk audio lay --file` 只收本地路径。拍板后先把选中曲落成本地文件：`audio_type:"song"` 取 `accompaniment_url` 伴奏版，`"pure"` 取 `download_url`。文件名按 `bgm-<曲名>[-伴奏].<扩展名>`，供跨片避让记账使用。
5. **字幕样式**：7 种样式（default/outline/cinema_yellow/immersive_box/wide_spacing/deep_shadow/boxed）× 11 色（雅黑/淡绿/森林绿/湖蓝/道奇蓝/钢蓝/浅粉红/深橙/珊瑚橙/橙红/土豪金）挑选；**用户没选就用 default+雅黑**（不追问不阻塞）。拍板值在 ⑪ `gtrk subtitle lay` 落地，客户端里仍可整轨换样式（悔棋通道）。
6. **B-roll 编排量预估（本地素材路必报）**：本地素材产的 plan 走 `matrix lay` 时缺省即云端编排并按编排量计费（`--arrange local` 不受理）。先拿数再拍板：

   ```bash
   gtrk matrix lay --project "<工程目录>" --arrange-estimate-only --json   # 停在计价确认之前：零云端调用、工程文件零改动
   ```

   把它与 TTS / describe 的预估**同屏**报给用户，一次拿到同意——§五 ⑦ 的 lay 才允许带 `--yes`。**报不出这笔就不许开跑**。

## 五、快速成片编排（打样验证过的真实命令）

> **产物落点纪律（MUST · 全文见随包 `AGENT.md` 同名一节）**：文本产物写入 CLI 返回路径或用户显式指定的 `-o, --out`；交付物直接写入工程目录；引用媒体用原路径，不复制到 agent 工作目录；临时文件放系统 temp，用完即删。
> 交付物 MUST NOT 先写 agent 自有目录再拷进工程；中转本身即违规，体积不是豁免理由。

```bash
# ① 理解（二创：转写原片，--json 顺产 transcript.json 备用）
gtrk transcript "<原片>" --lang <zh-CN 普通话 | zh-HK 粤语 | en-US | ja-JP …> --json -o "<工程目录>/transcript/<片名>-transcript.md"
#   ↑ 产物落点：不带 -o 时两个产物都落**源片同目录**（`<名>-transcript.md`；--json 另产 `<名>-transcript.json`，
#     .json 跟随 .md）。缺省本身是在案设计，但二创素材多在用户素材库里 ⇒ SHOULD 用 -o 挪进工程目录（见本节顶部纪律块）
#   ↑ 语种取开工三问的答案，MUST NOT 拿缺省 zh-CN 顶上去 —— **但这条对「非中文」素材才有钱可省**：
#     粤语 SHOULD 如实填 zh-HK（元数据诚实 + 备将来链路切换），当前链路下它与 zh-CN **对粤语无差别** ——
#     CLI 写死 word_level: true（src/commands/transcript.ts:178）⇒ 链路钉在豆包、到不了 Whisper
#     （infra utils/process/media/audio/asr.py:44-49 在 AsrFunc.Whisper 分支里仍把 word_level_handler 钉成豆包）；
#     而豆包字典里 zh-CN 与 zh-HK **都映射空串**（utils/partner/volcengine/doubao_llm_asr.py:36-37）
#     ⇒ 两种写法发出的请求逐字段相同。粤语能识别对，靠的是豆包空串模式自己的方言自适应，与这个参数无关。
#     "zh-HK": "yue" 那条映射真实存在（utils/partner/openai/__init__.py:18），但只在 word_level=false
#     走 Whisper 时生效，CLI 今天走不到那条路。
#   ↑ **MUST NOT 以「粤语语种传错」为由重跑转写**：la 进 ASR 缓存键（asr_result_cache.py:71-75），
#     换码必然 cache miss，白扣一次时长换回逐字段相同的请求与同一份结果。
# 原创场景改跑：gtrk matrix index --dirs "<素材夹>" && gtrk matrix describe --materials ...
#   ↑ **这个 `&&` 现在真的会拦住**：全域零枚举（一个素材都没枚举到）是**硬失败**（退出码 1），
#     `describe` 不会执行 —— 这是改对了：以前 index 报 0/0 也 exit 0，`describe` 会对着空清单空跑一趟。
#     报 0/0 先看两件事：路径里有没有**英文半角逗号**（有就把 --dirs 重复传 `--dirs "A" --dirs "B"`，累加不覆盖）、
#     素材夹里有没有断链。⚠️ 「个别素材处理失败」不算硬失败（那是既有 failed 计数口径，退出码仍 0）。
#   ↑ 原创（自拍素材集）这一档**整夹即该片素材域，传夹正确**，不受 ⑦ 那条「钉单片」铁则约束——
#     那条治的是二创：一个夹里躺着几条互不相干的片，才会互相抢候选

# ②③ 写稿（你执笔，§三规约）→ 检查点①拍板
#   BGM 候选（用户没自带音乐时，检查点①之前搜好一起拍板；试听链接=结果的 download_url）
gtrk matrix material "<情绪+地理文化检索词>" --scope audio --top-k 5 --diversity --json

# ④ 配音（音色 code 用 catalog 的 voice_id；稿子存 txt 传 --text-file）
gtrk tool audio_tts_clone --text-file <稿.txt> --speaker <voice_id> --json

# ④′ 语速回校（零成本自我标定；快速成片照跑不停顿，只汇报）
#   实测挂钟语速 = 稿件字数 ÷ 音频实际时长（时长取 ffprobe duration；字数口径同服务端：Unicode 码点、含标点与英文数字）
#   与写稿时所用的估值比对：**偏差 >15% MUST 在交付汇报里点名**（报「估 X / 实测 Y / 偏 Z%」），
#   并按 references/speech-rate.md 的五项格式追加本片标定记录，供后续估值复核。
#   MUST NOT 自动改稿、MUST NOT 自动重跑 TTS：改稿得从 ④ 重跑（TTS 变=全链时码变，⑤起全部重建）、要重付 TTS 费用，返工与否是用户的决定。

# ⑤ 建工程（画幅按检查点①拍板；产物目录含 gtrk/transcript/audio）
gtrk project init --tts-task <TTS任务id> --canvas 1920x1080 --no-open --json
#   ↑ 产的 transcript 文稿缺省去逗号句号（成片字幕口径）；要**带标点的文稿版本**
#     （回头改稿、转投他处、给人读）加 --keep-punctuation，工程结构与时码不受影响

# ⑥ 拆分：先投影拿句表，再写拆分稿，再落地
gtrk split --project "<工程目录>" --json          # 投影：拿 utterance id/时码/hash
# 你写 split/visual-split.json：beat 全覆盖（配音工程无 A-roll 画面，留隙=黑屏！）、
#   lane 全 FILM_BROLL、base_track="旁白主导"、narrative 用八枚举、
#   字卡挂 aux_layers type:"overlay"（handoff.category:"overlay"+duration_hint，进 dispatch.mg）、
#   看点关键词圈 handoff.anchors（[{keyword,utterance,query}] ≤2 个/beat——地名/奇观/数字头衔类实词，
#   铺轨把锚 query **原始 sim 最高的合格命中**（原始检索相似度，不是 mark/highlight 融合分）
#   钉在关键词说出时刻：听到「野牛高速」的瞬间看到野牛；锚预留优先于普通序贯槽消费，
#   取不到第一名时锚 outcome 如实报名次与去向；圈定指引见 gtrk-splitter）
#   ⚠️ 上面这串是**非穷举**摘录（另含 irreplaceability / rhythm / visual_task / container_stage 四个必填项）：
#   beat 必填字段全表以 gtrk-splitter 的 references/field-schema.md 为准，MUST 照该表写全
gtrk split "<拆分稿>" --project "<工程目录>" --json
#   ↑ 落地后走一遍 §六 末的**字卡自检清单**：数 type:"overlay" 的 aux 条数、核对 --json 回执里
#     queues.mg 的条数是否落在「每片 2-4 颗」

# ⑦ B-roll 三连（describe 给字卡抽帧检查与 mark 加权供料；internal 用户 describe 免费）
# ★ 铁则（口径同 gtrk-narration 与 gtrk-matrix，不许长出第二种说法）：解说链**一稿对一片**——
#   二创场景 --dirs MUST 钉到**这一部片的绝对路径**，**不许传素材夹**。传文件就是把检索域收窄到该素材；同夹多片时一次实测 187 条候选中有 86 条来自邻片（46.0%），不能把邻片结果当作次优解。
gtrk matrix index --dirs "<这一部片的绝对路径>" --json
#   ↑ 二创也要先建索引（原来 index 只挂在原创分支下，于是只能顺手对整夹建、正好把三条片灌进同一个 index.db）；
#     如果整夹已有索引，**不必重建**，检索侧传单片即可收窄（判据是路径前缀，传的就是那一条素材本身）
gtrk matrix --project "<工程目录>" --local --dirs "<这一部片的绝对路径>" --lay 0 --json
gtrk matrix describe --plan "<工程目录>/split/broll-plan.json" --yes --json
#   ↑ describe 结果里的 usable_flags 由你裁定（text_overlay 命中=撞原片字幕区,考虑换段或保留交客户端悔棋）
#   ↑ 同时读 describe 输出的**剔除风险**清单：候选数 ≤1 的 beat 一删就掏空
#     （音频驱动 ⇒ 整段黑屏或跨 beat 借片；口播 ⇒ 露 A-roll）。先补素材再剔，MUST NOT 见 flag 就删。
#     候选稀疏时先补素材再剔除，按 flag 直接删除可能掏空整段
gtrk matrix lay --project "<工程目录>" --mark-weight 0.3 --highlight-weight 0.2 --gap-fill fast --yes --json
#   ↑ --yes 的前提是**编排量预估已在检查点①（§四.6）报过并拿到同意**；MUST NOT 未经同意就带 `--yes`。
#     不带 --yes 且无 TTY 时本步**整轮铺轨中止**、工程零改动（plan 照常可用、可重跑）——
#     未报预估或未取得同意时不要继续执行

# ⑧⑨ 字卡（§六 规约产颗粒 → lint → 铺）
gtrk mg lint "<工程目录>/mg/<composition_id>.html" --dispatch "<工程目录>/split/dispatch.json"
gtrk mg --project "<工程目录>" --json

# ⑩ BGM（音量口径见下；<bgm> 是**本地文件**，检查点①拍板后先落地——URL 传给 --file 必炸）
# BGM 是带人声歌曲（audio_type:"song"）→ MUST 下载 accompaniment_url 伴奏版上轨，
# 不得用 download_url 原曲（人声与配音会打架）；"pure" 取 download_url。
# 文件名 bgm-<曲名>[-伴奏].<扩展名>：跨片避让按**标题归一化键**记账（剥 bgm- 前缀与伴奏/instrumental/off-vocal 后缀），乱命名=下一轮 --exclude-recent 失准
# --beat-align 的高潮点取自 split.beats 的 narrative / container_stage（升华段 → 容器转折 → 回扣段）；
# 拆分稿没带这两个字段 ⇒ 落 0.75×全片兜底档，**CLI 会明示那是猜的**。不接受就用 --climax <轨秒> 指定。
# 两侧都够长时零平铺（恰好 1 个 clip）；不够长才按小节线平铺补齐、接缝吸附 downbeat。
gtrk audio lay --project "<工程目录>" --file "<bgm>" --volume 0.1 --beat-align --json

# ⑪ 字幕（样式/颜色 = 检查点①拍板值；用户没选用 default/雅黑；零计费——拆行走云端 subtitle_line_split 0 积分留痕，离线可加 --offline 用本地拆窗、重跑幂等替换）
gtrk subtitle lay --project "<工程目录>" --style default --color 雅黑 --json

# ⑪′ 精剪包装：见下方引注
```

> **⑪′ 精剪包装**：交棒 `/gtrk-composite` 做**精剪包装**（公约 §三⁵：快速成片 auto ≤ 25% → 逐窗口复核 → 构建机检 → 铺轨烘焙，不停；回执列「做了 / 建议了没做 / 烘焙结果」；逐步推进按合成 skill 两个检查点停；开工时用户说了不要就跳过）。旅拍主画面多是素材本身，按「没有讲者」口径只用 B-roll 与排版。

> **停顿太长时**：自训音色加 `--fragment-interval 0.2`（合成时就对）；云引擎音色**不支持**该参数（传了会报错，不会静默忽略），改在合成后跑 `gtrk audio tighten --project <工程>` 收紧句间停顿（纯本地零计费；只压跨句界的停顿，句内换气与原声引用段不动）。

**配方级参数口径**：
- `--mark-weight 0.3`：美观度加权起步值（mark 缺失素材中性不受罚）；
- `--highlight-weight 0.2`：看点加权，配 §三′ 的 rubric——
  **须在 describe 那一步带 `--highlight-rubric @<工程>/highlight-rubric.txt`**，
  不带就是按服务端缺省准则打分，旅拍这一档的奇观地貌/极端天候/规模感全不算数。与 mark 正交——
  mark 判「好不好看」、highlight 判「有没有看点」。两权之和 0.5，语义仍占一半，
  **MUST NOT 加到语义压不住**（那会变成「专挑好看的，不管说的是什么」）。
  ⚠️ 两个权重与 blurry 降权**都依赖 `matrix describe --plan` 跑过**（编排 ⑦ 那一步）；
  没跑就是全部候选中性、排序与不开权重逐字节一致——lay 会就此打告警，看到就说明漏了；
- `--gap-fill fast`：主轨空洞按**五级**依次填——放宽地板取剩余候选 → 段界内延长相邻颗粒 → **跨 beat 借未消费候选** → **次地板补真画面** → 仍不够才落黑片。借来的画面与本段稿子相关性可能较弱，次地板槽可能很短；两者都会在日志里指名报出。CLI 缺省是 solid，本配方须**显式传 fast**；
- 句界吸附（`--cut-align`）默认 0.7，约七成字幕句起点贴近镜头切点，其余有意错开；
- **BGM 音量口径 = -20dB（线性 0.10）**：BGM 作为垫底，`volume` 字段只写线性增益；客户端需要更响时再调整。
- 时间窗（`--source-window`）：二创场景解说序≈素材序时按 beat 对应的原片区间约束检索（可选增强，全库检索在几百场景规模下命中率已够）；
- 素材不二用、候选片段自带纯黑底与空档补黑、层序（common<concept<local，契约=大号在上；旧工程的黑底垫轨在最低号）均由 lay 内建，MUST NOT 绕过。

## 六、MG 轻量字卡规约（旅拍向最小集，不建栏目 skill）

> 本节采用「因势象形、不建栏目 skill」原则：风格锚定本片内容，不强行套用预设模板。原则正本见《成片型图纸公约》§三。

快速成片**禁留白**——字卡按下述规约直接产好叠上，用户不满意在客户端删，别等确认。

- **内容**：地名字卡为主（地标名中文+英文/头衔副标），可加里程/价格数字卡；每片 2-4 颗、挂在地标出场句（拆分稿 aux_layers overlay）；
- **形态**：左下安全区地名条——竖色条装饰+半透明深色衬底圆角条+主标题（60px 级粗体白字）+副标题（28px 级 75% 白）；透明叠加不挡画面主体；
- **动效**：入场滑入淡入约 1.5-2s → **定格驻留到坑位末尾**（gsap-emit v1 铁律⑦：时间线总长≥坑位+0.3s，禁全局渐隐）；
- **工艺**：严格按 `contracts/gsap-emit-v1.md` 颗粒骨架（`<template>` 包裹/1920×1080/`gsap.timeline({paused:true})`/`__timelines` 注册/无随机无时钟/lib.baomitu.com GSAP CDN）；字体用渲染字体注册表在册族（如 `Alibaba PuHuiTi`）；实心衬底写子层不写根（铁律 4）；
- **产前抽帧**（overlay 必做）：对挂点用本地 ffmpeg 抽 1 帧看底轨明暗与主体位置（临时文件落系统 temp 用完即删）；
- 产物存 `<工程目录>/mg/<composition_id>.html`，逐颗 lint 过了再铺。

**字卡自检清单**（形制同 §三「写后自校验清单」）：

- [ ] 拆分稿写完，**数一遍** `aux_layers` 里 `type:"overlay"` 的条数，是否落在**每片 2-4 颗**；
- [ ] 落地后核对 `gtrk split --json` 的 `queues.mg` 条数，与上一条对得上、且仍在 2-4；
- [ ] 不足按地标出场句补挂；超出按「稀缺才有力」裁掉。

> 这是图纸层的审美自检，不是 CLI 通用硬闸：`split` 与 `mg` 负责报告实际条数，是否在 2–4 颗由本垂类图纸裁定。
> 补在缺口上最省，**零代码变更**。⚠️ 反方也如实记：颗数是 `dispatch.mg.length` 一行就能算的机器可判量，
> 若这类漂移反复发生，改上「通用可选入参 + 由图纸传值 + 非致命告警」是正当的。

## 七、增量调整与个性化出路（垂类示例定位）

**本图纸是解说链的垂类示例，承诺面只有快速成片**（检查点①一次拍板后一杆到底；决策前置三条腿照公约执行，单模式不豁免）。交付后对**个别环节**不满意，用下表增量重跑悔棋——改哪步跑哪步，不整链重来：

| 环节 | 暂停点产物 | 调整方式 | 增量重跑 |
|---|---|---|---|
| 写稿 | 解说稿 vN | 用户改意见 → 你改稿 | 改稿后从 ④ 重跑（TTS 变=全链时码变，⑤起全部重建） |
| 拆分 | split/view.json + 拆分稿 | 改 beat 划分/queries | `gtrk split <拆分稿> --project` 重落 |
| B-roll | broll-plan.json | 编辑 plan（删候选/换段/pinned 钉选） | `gtrk matrix lay`（消费 plan **零检索**；⚠️ 本地素材路的**编排仍按编排量计费**，不是零计费——重跑前照 §四.6 再报一次预估） |
| 字卡 | mg/*.html | 改颗粒 HTML | `gtrk mg --project --only <beatId>` 单颗重铺 |
| BGM | audio_track | 换歌/换音量 | `gtrk audio lay` 同文件幂等替换 |
| 字幕 | cve 字幕 lane | 换样式/颜色 | `gtrk subtitle lay --style/--color` 重跑幂等替换（手加 text 不受影响）；逐条微调在客户端 |
| 精剪包装 | `composite/plan.md` + 合成颗粒 | 不要某颗 / 补一段 | 客户端关合成轨可见或删那一颗；补做走 `/gtrk-composite` 指定区间（`plan --range`） |

改口播轨后 matrix/mg 消费侧自带现场重投影，无需回跑 split。

**个性化出路**：对垂类玩法/审美**本身**不满意（想要另一套写稿腔调、字卡风格、节奏观），MUST NOT 在示例图纸上堆个性化补丁——引导用户用 `gtrk-style-maker` 建**他自己的**垂类 skill。示例图纸演示的是链路怎么跑，真正个性化的项目工程归用户自建的 skill 持有；示例对它差着火候是**定位使然**，这句丑话开工时就说。

## 八、交付与出片

- **成片出口 = 客户端**（OpenCut Gitruck Edition「打开工程」选 `gtrk/project.gtrk`）：多轨合成（B-roll+字卡+黑底+双音轨混音）只有客户端出片链完整支持；
- **`gtrk render` 仅是主轨快照预览**（★ 打样误用教训）：只渲一条视频轨、不合成字卡 overlay——可以当粗查混音与 B-roll 落位的预览片，**MUST NOT 当成片交付**；
- **云渲必拒**：含本地 B-roll 的工程提交云渲会被直接拒绝（`local_broll_cloud_render_rejected`）——出片走客户端本地导出或 `gtrk render` 预览，如实告知用户；
- 交付话术：报产物目录+客户端打开指引+各环节计费实耗；候选轨小眼睛切换、字卡可删可改、BGM 音量客户端可终调、字幕客户端可整轨换样式——把悔棋通道讲清楚。
  - 报计费实耗 SHALL 转述 `--json` 的 `credits_estimated`（**实耗口径**，豁免时为 0），MUST NOT 转述 `credits_would_be`（原价）；`exempt_probe:"failed"` 时须注明『身份没探到，此数按非豁免保守估』。

## 九、计费速查

| 环节 | 计费 | 备注 |
|---|---|---|
| transcript 转写 | ASR 按分钟 | 二创场景一次 |
| matrix index（embed） | 会话计量按实际用量 | 同合云内部成员豁免 |
| matrix describe | 1 积分/张 | 内部成员豁免；同帧缓存永不重复计费 |
| **B-roll 云端编排（`matrix lay`，本地素材路）** | 按「**编排量**」计费（服务端复算为准） | 缺省即走云端（`--arrange local` 已不受理）；素材矩阵路的编排在本机跑、不计费。预估用 `--arrange-estimate-only`（§四.6），跑前须已拿到同意 |
| TTS 配音 | 按成本档 1-12 积分/计费分钟（240 字/分钟折算） | **计费分钟按标准语速折算，不等于音频实际时长**；音色 catalog 可查档位；同参重合成走缓存不重复扣费 |
| project init / split / audio lay / subtitle lay | 0 积分 | **`matrix lay` 不在此列**（见上一行的云端编排）；producer 同步口 0 元留痕；beat 分析（--beat-align）走 audio_music_analyze 计费 |
| BGM 矩阵搜索（`gtrk matrix material`） | 公开口 1 积分/次；矩阵成员口 0 积分 | 档位由零件自动路由，命令输出如实报口径与计费 |
| image_move 图片运镜 | 2 积分/张 | 素材夹含图片且被选中上轨时 |

> ★ **脚注（划界）**：表里那个 **240 字/分钟是计费折算常量**，
> **MUST NOT 用于写稿篇幅估算** —— 写稿口径在 §三（挂钟语速，按音色取、缺省 ≈330），两者保守方向相反。
> 本脚注**只划界，不动**该行的积分档位与计量单位（单位口径归 infra `refactor-billing-measure-kchar` 的 CLI 联动件）。

起跑前把预估总消耗报给用户（检查点①一并确认），结束报实耗。
**§一′ 适配闸命中而中止时，已经发生的计费（transcript / index / describe）SHALL 如实报出**——MUST NOT 只报一句「已中止」把账藏起来。

## 十、已知边界与排障

- **闪帧**：VFR 素材的场景切点可能产生闪帧（专项修复中）——用户报闪帧时告知已立案，客户端可手动微调切点避开；
- **拆分注释投影**：客户端暂不显示 beat 注释（调查中）；
- **字幕**：⑪ `gtrk subtitle lay` 已直接上好（7 样式 × 11 色，客户端可整轨换样式、逐条可编辑）；改稿重跑 TTS 后须重跑 subtitle lay（时码变了）；
- describe 的 `text_overlay` 信号命中多为撞上原片烧录字幕区（片头片尾高发）——裁定换段或保留交客户端；
- `matrix lay` 拒铺（`tracks_edited`）不是失败：用户在客户端动过候选轨，plan 照产（`planReusable:true`），提示用户后按其意愿 `--replace-all` 或保留；
- BGM 曲长 < 成片：缺省**循环叠满至工程末尾、尾段裁齐**（多 clip 首尾相接，命令打 INFO 报段数）；要单次铺才传 `--no-loop`。

---

## 改工程：走 `gtrk patch`，不要裸手改 JSON

跑完之后要**微调某个片段**（挪位置 / 改时长 / 切开 / 改音量）时，一律用 `gtrk patch`：

```bash
gtrk patch move --project <dir> --clip <clip_id> --to 5.0
gtrk patch trim --project <dir> --clip <clip_id> --out -1s
```

**MUST NOT 直接编辑 `.gtrk` 的 JSON。** 片段时码是两套并存的（`clip_st`+`clip_ed` 与
`clip_st`+`duration`）：改一份不改另一份，客户端优先读 `clip_ed`、后端又不强校验它 ⇒
**没人报错，成片却用了陈旧出点**。`gtrk patch` 替你做恒等式同步 + 帧对齐 + 写前全档校验。

> 参数手册在 `AGENT.md` 的「元素级编辑：`gtrk patch`」一节与 README 命令参考。
> 本节**只指路不搬手册** —— 搬过来就会长出会漂移的副本。
