Commit c638c96c5d9574d3df47dedb0c80163d18aa39eb

Authored by yibo
1 parent daebde4d

Rewrite the prompt-optimization system prompt against H3's own methodology

The previous system prompt asked GLM for a free-form "shot-by-shot" expansion,
which reliably produced 4-5 fake cuts with timestamps running out to 8-10s —
impossible for a clip fixed at ~5s (H3_GEN_PARAMS.frames / FPS). Rewrote it
against docs/h3skill.md (MiniMax's own H3 prompt-writing methodology, added
alongside this commit): every chat prompt has no reference images, so it's
always T2VA mode, and at ~5s it's one continuous shot, never a montage.

The new prompt asks for H3's actual three-field T2VA structure
(integrated_multimodal_description / overall_soundscape / non_diegetic_music,
fixed order and labels), a single dominant camera movement from the official
vocabulary (type + amplitude + speed), concrete lighting (no hollow buzzwords
like "8K"/"cinematic" alone), and — previously missing entirely — explicit
sound design. Verified against the real GLM endpoint on several sample
prompts: single continuous shot throughout, correct field structure, no more
impossible multi-shot timestamps.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144MiJ2cLjMd9jWaeEpVfUJ
docs/h3skill.md 0 → 100644
  1 +---
  2 +name: h3-video-prompt-main-skill
  3 +version: 0.6.1 (hotfix: url 载体硬不变量)
  4 +status: enabled(2026-08-29 由 org-innovator 热修 Deploy 落位,取代 v0.6.0;回滚源 = git 或 train/evolve/SKILL_v5.md)
  5 +source: MiniMax 官方一手飞书语料(train/hunt/cache_v5/,revision doc1=1297 / doc2=252,逐字落盘):
  6 + doc1 = H3 使用手册(feishu_doc1…FIWjwgL33ipnkekzk30crmKUnIh.md)
  7 + doc2 = Prompt 写作全能指南(feishu_doc2…Vztzwstuqi3MQKkxs8QcGmxinxe.md)
  8 + v4 及以前的 GitHub 镜像信源(base-en.txt / ref-en.txt / co-op 模板等)降为 R 级同型佐证,
  9 + 凡本文已给 docN:line 的条款一律以 A 级一手为准。引句全部可在 cache_v5 逐字回查。
  10 +supersedes: v0.5.0(train/evolve/SKILL_v4.md)
  11 +v0.6.0_changes: 按 benchmark_v5 C-1/C-2/H1-H16 做作用域重写(非追加)。①§0 从「习语甲/乙」改为
  12 + 「三种交付形态 ①②③④ + 语言按形态划界 + 记号硬互斥」;②新增链路四层交付义务与映射纪律;
  13 + ③v4 从镜像推演的长描述替换为官方短条款(带 docN:line);④H9 关系标记按官方落 8 个取值(v4 任务
  14 + 书误写 6 个);⑤篇幅自 88,655 B 收敛至 ≤60,000 B:合并重复示例、删冗余叙事、条款表化。
  15 +v0.6.1_changes: 线上热修(conv-mtekh2bm 实证,非重训、无新分数):url 载体被「输入显式约定 > 本节
  16 + 默认」+「不得夹带 schema 外字段」合法吞掉。§2 url 逐字保留升硬不变量;只有 id 时追加
  17 + reference_assets;§1.7 第 19 条加豁免、新增第 22 条;§7 加第 25 条。
  18 +---
  19 +
  20 +# H3 视频提示词写作方法论
  21 +
  22 +## 0. 交付形态判定(先判形态,再谈语言与记号)
  23 +
  24 +**第 0 步永远先判交付形态。** 形态决定正文语言、分段记号、适用硬约束与判分落点。
  25 +官方一手语料内部并存多种分段记号(doc1 案例层 4 种变体、doc2 规范层 1 种),**判形态先分「规范层
  26 +条款」与「案例层行为」:格式判据只取规范层(doc2),案例(doc1)只作行为先例与模型参数正源。**
  27 +
  28 +### 0.1 三种合法交付形态
  29 +
  30 +| 形态 | 识别特征 | 分段记号 | 判分落点 |
  31 +|---|---|---|---|
  32 +| **① 型**(doc2 结构化) | 需求要英文结构化 Prompt / JSON / 官方字段结构(六段或三主体字段 + instruction) | `[Shot N]` + 递增 `At MM:SS.mmm`,第一镜不写时间戳(A:doc2:107/:111/:114/:455) | §0.4 全部 H 条款 |
  33 +| **② 型**(窗式) | 需求是**分镜类**:连续故事情节 + 按时长切分显示内容(「每隔几秒显示什么」「分镜」「时间窗」);或需求是**分镜脚本交付物** | `[N 秒-M 秒]` 窗标题(A:doc1:97 官方「提示词」列六窗一手案例) | §0.5 + 跨形态不变量 |
  34 +| **③④**(登记合法,不考察) | ③ `N-M 秒:` 行式(doc1:200);④ `0〜3 秒` 全角波浪 + 正向/反向(doc1:237) | 不作为判分形态;交付中出现**不判违规**,只判其内容是否满足所申报形态的三要素义务 | — |
  35 +
  36 +**判据理由(不要丢)**:② 是官方四种形态里唯一窗口边界显式成对、可逐窗相加核验总时长的形态,
  37 +而「边界可核对」正是分镜脚本这一交付物的核心义务;doc1:97 把窗式文本直接放在「提示词」列,
  38 +所以 ② 在最终 Prompt 层同样是 A 级合法形态,只是不走 ① 的 H4/H5/H6/H10。
  39 +doc1 案例层的分段记号有 4 种变体(②③④ + `Shot 1 —`),官方在案例层不做记号统一(doc1:231 坑表
  40 +甚至要求删掉多余【镜头 N】结构)——**案例记号不得升格为格式判据**。
  41 +
  42 +### 0.2 形态切换判据(B 级内部规范;官方没有「何时选哪种」的条款,不得对外表述为官方规则)
  43 +
  44 +1. 输入含**连续故事情节 + 按时间切分**,或需求明确要**分镜脚本/分镜设计文档** → ② 型。
  45 +2. 输入要**英文结构化 Prompt / JSON / 官方字段结构** → ① 型。
  46 +3. **「拆成 N 个镜头」≠ ② 型**:只要求镜头切分、情节照给、无逐窗「每隔几秒显示什么」要求的,
  47 + 是 **① 型多镜**(`[Shot 1..N]` + `At MM:SS.mmm`)——官方 ① 型本来就用 `[Shot N]` 表达多镜。
  48 + ② 型的判据是**逐窗显示内容**(「每隔几秒显示什么」「每窗出现什么 UI」)或**明确要分镜脚本/
  49 + 分镜设计文档交付物**。两者都沾时才判 ②。
  50 +4. 两者都不满足 → 按 §2 五模式判定(T2VA/I2VA/FL2VA/L2VA/全能参考),交付形态默认 ①。
  51 +5. 形态误判是 D1 档 2:分镜需求交英文六段、英文结构化需求交中文窗式散文,都算。
  52 + 交付说明 / 中文沟通不受此限(说明层语言自由)。
  53 +6. **多件交付(链路模式)**:需求同时要「分镜设计 + 分镜脚本 + 最终 Prompt」→ 按 §0.6 链路四层
  54 + 交付,各层用各自形态;**不要**把链路需求做成单件 ① 型交付,也不要给单件需求硬拆四层
  55 + (过度交付同样按 D1/HP1 扣)。
  56 +
  57 +### 0.3 语言规则按交付形态划界(C-2 裁决)
  58 +
  59 +**按形态划界,不按「哪份官方文档」划界**:doc1 自己的案例就是中文散文、同时声明多语言支持
  60 +(doc1:35「支持多语言提示词输入与输出」);doc2 的英文条款明文限定在「扩写的六个段落正文」
  61 +这个形态上(doc2:242)。把「正文必须英文」套到 ② 型交付上 = 判据越界违规;反向同罪。
  62 +
  63 +| 交付形态 | 语言判据 | 级 | 出处 |
  64 +|---|---|---|---|
  65 +| ① 型(六段 / 三主体字段 / instruction) | **正文英文**;`<d>` 内台词/歌词、画面实际可见文字保留原语言 | A(硬) | doc2:242「扩写的六个段落正文统一使用英文;只有 `<d>` 中的台词、歌词以及画面中实际可见的文字保留原始语言。」 |
  66 +| ② 型(窗式 / 分镜脚本) | **跟随用户输入主导语言**(中文输入 → 中文正文) | A(硬) | doc1:97 官方案例正文全中文 + doc1:35 |
  67 +| 分镜设计(链路第 2 层,给人类的内部档) | 语言自由 | B(内部规范) | 官方无此条款,从 doc1:220-222 收口 |
  68 +| 台词 / 歌词(跨形态不变量) | 原词、原语言、原标点不改写;无法辨认写 `[unclear]` | A(硬) | doc2:137 / :575 |
  69 +| 画面实际可见文字(跨形态不变量) | 英文双引号包围,原文与标点逐字保留,不翻译 | A(硬) | doc2:154(:157 中文招牌 `"营业中"` 示例) |
  70 +| 字段名写法 | 「非叙事性音乐:N/A」与 `"non_diegetic_music": N/A` 两种**都合法** | A | doc1:200 同段并列 |
  71 +
  72 +### 0.4 ① 型官方硬约束(H1-H16,逐条带级与行号)
  73 +
  74 +| # | 约束 | 级 | 出处 | 适用 |
  75 +|---|---|---|---|---|
  76 +| H1 | 提示词总长 ≤ **7000 字符**(含标点与空白,`len()` 口径) | A | doc1:35 | 跨形态 |
  77 +| H2 | 输出时长 **4–15 秒**;超限不得静默 | A | doc1:35 | 跨形态 |
  78 +| H3 | 输出帧率 24 FPS:**提及则不得写错**;需求指定非 24 帧时显式说明该参数不在提示词层控制;**不写帧率不扣分** | A(参数层) | doc1:35 | 跨形态 |
  79 +| H4 | `instruction` 必须**位于第一行,后空一行**再写主体字段 | A | doc2:57 | 仅 ① 型 I2VA/FL2VA/L2VA |
  80 +| H5 | `At MM:SS.mmm` 递增切镜时间,毫秒 3 位、落在视频时长内;**第一镜不写时间戳** | A | doc2:107/:111/:114/:455 | 仅 ① 型 |
  81 +| H5b | **记号硬互斥**:① 型内零处 `[N 秒-M 秒]`;② 型内零处 `At MM:SS.mmm` | A(反证) | doc2 全文 0 处窗式、doc1 全文 0 处时间戳(grep 复算) | 跨形态 |
  82 +| H6 | 生成类 `detailed_description` **350–500 英文词**;三条豁免:台词密集型以容纳台词时间线为先 / 视频编辑类按源视频复杂度展开 / 单镜头并不自动缩短。**区间外且不落在任一豁免才扣分**;无豁免依据的机械补字数也扣 | A | doc2:543 | 仅 ① 型 |
  83 +| H7 | 听不清写 `[unclear]` 不猜测改写;标点规范化为基础书面标点 `,` `.` `?` `!`,删波浪号/emoji/装饰标点;完整陈述句/疑问句/感叹句在 `</d>` 前以 `.`/`?`/`!` 结束 | A | doc2:575 | 跨形态(台词) |
  84 +| H8 | 复杂/易乱码文字:**以图片形式提供作参考图 + 在提示词中明确「这张内容必须按"图片"来理解,不能按"文字"来处理」** | A | doc1:71 | 跨形态 |
  85 +| H9 | 关系标记是**固定英文取值,共 8 个**:可见内容 4(`fully_preserved` / `partially_preserved` / `attribute_transfer` / `weak_reference`)+ 音频 4(`fully_copy` / `partially_copy` / `reference` / `weak_reference`)。自创中文或变体取值 = 词法违规 | A | doc2:398/:400-405/:427-434 | 六段交付 |
  86 +| H10 | `overall_soundscape` **1–4 句**英文连续段落概括贯穿全片的环境声;`non_diegetic_music` **1–3 句**英文描述角色听不到、只有观众能听到的配乐 | A | doc2:162 / :170 | 仅 ① 型六段/三字段 |
  87 +| H11 | **台词长短与 shot 长短对齐**:不出现一个 3s shot 说一大段话(官方标注的口型问题一手根因) | A | doc1:206 | 跨形态 |
  88 +| H12 | 画外音固定短语 `says in an off-screen voiceover`(逐字相邻,不得插语打断)+ 唇部保持闭合;跨镜台词 `<scenetrans>`、结尾截断 `<cutoff>`;`(Sx)` 稳定编号、组合编号、无声者不编号 | A | doc2:144/:147/:150/:459/:135 | 仅 ① 型 |
  89 +| H13 | 素材硬上限:图片 ≤9、视频 ≤3(单段 2-15s、总时长 ≤15s)、音频 ≤3 **且必须配图/视频、不能单独输入**、混合总上限 12 个文件 | A | doc1:35 | 跨形态 |
  90 +| H14 | 标签一经分配,在 `subject_definitions`、`summary`、`retention_analysis`、`detailed_description` 与声音段落**五处同义** | A | doc2:272 | 六段交付 |
  91 +| H15 | `<Video N>` / `<Audio N>` **独立编号**,序号只表示本类内顺序,不表配对;普通参考视频不因含声而自动产生 `<Audio N>` | A | doc2:347/:349 | 六段交付 |
  92 +| H16 | **分镜参考图映射到镜头而非秒数**:`<Picture 3> is a storyboard reference for [Shot 1] and [Shot 2], defining their viewpoint, subject placement, and shot order.`;分镜草稿图在 ② 型写窗口映射;每条素材至少被一个镜头/窗认领 | A | doc2:310/:553 + doc1:200「故事版」 | 跨形态 |
  93 +
  94 +配套 A 级短条款:六段顺序 `subject_definitions → summary → retention_analysis → detailed_description → overall_soundscape → non_diegetic_music`(doc2:250);三主体字段顺序(doc2:62-66);`summary` 带方括号任务类型前缀,六类型 `keyframe completion` / `reference generation` / `video editing` / `video continuation` / `audio reuse` / `audio reference`,可用 `+` 组合(doc2:360/:371-378);`retention_analysis` 逐标签一行并沿用 `subject_definitions` 含义、**不写 `(Sx)`**(doc2:394/:579);边界处新增内容不得误写成参考损失(doc2:444);音色参考只取音色不带入原台词(doc2:577);环境声无则写 `N/A`(doc2:594)。
  95 +
  96 +### 0.5 ② 型窗式交付规范
  97 +
  98 +**窗式结构**:窗标题 `[N 秒-M 秒]`(doc1:97 六窗逐字);窗序覆盖 0 → 总时长、相邻窗相接、窗序与
  99 +故事情节因果序一致;窗长可以不等(官方六窗即 2/2/3/1.5/1.5/5 秒);子秒节拍允许但不留 gap。
  100 +**窗边界四条分行标级**(不得合并成一句「官方要求无缝隙无重叠且总和等于总时长」):
  101 +
  102 +| # | 纪律 | 级 | 出处 |
  103 +|---|---|---|---|
  104 +| 1 | 相邻窗无缝隙 | A | v4 镜像 shot-table-spec:65(R 级;官方一手无逐字句,行为先例 doc1:97 六窗相接) |
  105 +| 2 | 无重叠 | A(① 型相邻条款) | doc2:111 严格递增 ⇒ 不重叠 |
  106 +| 3 | 各窗之和 = 总时长 | C(构造性设计) | 官方模板构造性首尾相接,无明文条款 |
  107 +| 4 | 首窗从 0s 开始 | C(构造性设计) | 行为先例 doc1:97 首窗 `[0 秒-2 秒]` |
  108 +
  109 +#3/#4 照常扣分,但对外表述保持 C 级标注——判分强度与出处等级是两件事。
  110 +
  111 +**每窗三要素**(判内容,不判有没有字段名标签):
  112 +① **机位/运镜**:每窗首行显式声明机位或主导运镜(A 同型:doc1:97 各窗首行即 `景别` 字段);
  113 +② **主体动作**:该窗内主体做什么,可量化状态是官方文风;
  114 +③ **UI/覆盖元素**:该窗出现的 UI/字幕/HUD 内容与位置。
  115 +声音写在**窗内**(doc1:97 各窗「声音:」字段先例);官方无独立转场字段,转场信息写进机位行,
  116 +**不得硬切**(v4 镜像 co-op:117/:133 R 级);「每窗必须写明转场」不是判据,不要自加。
  117 +
  118 +**参考素材落位**:头部一行职责声明(每份素材负责什么)+ 窗内语义回指,回指与声明同一体系;
  119 +分镜草稿图按 H16 写窗口映射(映射到哪几个窗、提供什么规划信息),**非锚点图零秒级对齐**
  120 +(v4 反证 ref-en 全文 0 处 "aligns with",R 级);幽灵素材禁令(C 级收口)。
  121 +**UI 文字四禁令**(R 级 v4 镜像 co-op:133):UI 字符串可读、无随机字母、用户名不拼错、
  122 +菜单/选项集合不得超出输入给定集合。输入自带中英并列时沿用(输入事实),只给英文时英文单语,
  123 +两种互不判违规;把中英并列表述成官方要求 = 出处纪律违规。
  124 +**时长**:`duration_seconds` 由请求体指定、不写进正文;正文时长信息只以窗标题体现;
  125 +交付说明注明本次取值(B 级);需求超 4–15s 不得静默,给拆分方案或与调用方确认;
  126 +节拍总合 ≠ 请求时长时按最小改动解决并显式说明改了哪里,不删情节凑时长。
  127 +**对白**:`<d>` 包裹与 `(Sx)` 编号非硬判据(不强制、出现亦不算违规,用了就守同一套稳定性纪律);
  128 +台词逐字保真与「画外 + 唇部闭合」语义要求**跨形态成立**;说话人身份须窗内可辨识。
  129 +**词法**:url 不进正文;散文交付无 JSON 通道要求,不因「没交 JSON」扣分。
  130 +
  131 +### 0.6 链路四层交付(需求理解 → 分镜设计 → 分镜脚本 → H3 Prompt)
  132 +
  133 +当需求要求**多件交付**(先出分镜设计/分镜脚本,再出最终 Prompt)时,按四层依次交付,各层实体
  134 +计分(LU15 + SD20 + SS30 + HP35 = 100;#62 标 C 级构造性设计、0 真实先例——官方没有「分几层
  135 +交付」的条款,这是工程收口,不得表述为官方规则)。
  136 +
  137 +| 层 | 义务 |
  138 +|---|---|
  139 +| **LU 需求理解** | 从 raw_brief 判定模式(T2VA/I2VA/FL2VA/L2VA/全能参考,doc2:28-57)+ 交付形态 ①/② + 素材组合是否合法(H13);**逐字锁定复述** raw_brief 与 note 原文中的硬事实(时长、UI 文案集合、素材职责、必须替换类 note)——改写程度词(「必须换」→「建议优化」)= 0;零臆造(不编造 raw_brief 未给的主体/UI 文案/台词) |
  140 +| **SD 分镜设计** | 每段时长落 4–15s(H2),需求超 15s 给拆分方案而非静默;相邻段/镜之间显式给**至少一个衔接锚点**(同一动作方向/视线目标/光/道具/轮廓/声音/受力任一),无理由跳切 = 0(B 级:TFboy1 storyboard-schema:7-11;官方相邻条款 doc1:216 切镜写清景别与主体 + doc1:231 禁无理由分镜);每镜给镜号/时长/景别/运镜/内容/声音/转场(B 级:chiphoton 单镜 10 项 + TFboy1 7 列镜头卡;官方相邻条款 doc1:200「想要」栏字段集);台词字数与该镜秒数不失衡(H11)。**语言自由(B 级内部规范)** |
  141 +| **SS 分镜脚本** | **② 型**:`[N 秒-M 秒]` 窗标题覆盖 0 → 总时长、相邻窗相接;窗内零处 `At MM:SS.mmm`(H5b);每窗三要素;每条素材至少被一个窗认领(幽灵禁令)、分镜参考图映射到镜头零秒级对齐(H16);台词逐字落在对应窗内、画外发声语义等价标记 + 唇部闭合、静默窗也写声音 |
  142 +| **HP H3 Prompt** | 形态按 C-1 判定正确;与 SS 层构成窗号 ↔ 镜号一一对应;适用的 H1/H2/H4/H5/H6/H10 全过;`(Sx)`/`<d>`/画外音/`<scenetrans>`/`<cutoff>`(H12);段落顺序、标签五处同义(H14)、`<Video N>`/`<Audio N>` 独立编号(H15)、关系标记 8 取值(H9) |
  143 +
  144 +**映射纪律(B 级内部规范)**:脚本层 `[N 秒-M 秒]` ↔ Prompt 层 `[Shot N]`/`At MM:SS.mmm` 必须
  145 +**窗号 ↔ 镜号一一对应**(脚本第 N 窗 = Prompt 的 [Shot N] 或跨窗),且**只允许存在一套时间轴**——
  146 +脚本写窗边界、Prompt 写切镜时刻,两件不得各自再发明一套编号或时长。理由:官方 4–15s 单次上限
  147 +(doc1:35)决定链路里两件交付描述的是同一段视频,双时间轴必然矛盾。
  148 +收口来源:doc2:111「连续编号」+ doc1:202-216「镜头怎么拆」。
  149 +**单件需求不要硬拆四层**:`expected_chain` 只含 h3_prompt 时交单件,多拆 = LU1/HP1 扣。
  150 +
  151 +---
  152 +
  153 +## 1. 七步工作流
  154 +
  155 +第 0 步判形态(§0)。第 1/2/3/4/7 步在动笔前落定,第 5/6 步写作中逐句遵守。
  156 +**优先级顺序不能反**:先满足硬性格式与引用规范 → 再忠实保留用户意图 → 识别输入冲突与不可用素材
  157 +→ 不擅改剧情的前提下增强可拍摄性 → 最后才是电影感/氛围/细节。先想「写得漂亮」再回头补格式校验,
  158 +正是历史失败的结构性原因。
  159 +
  160 +| # | 步骤 | 落点 | 对应维度 |
  161 +|---|---|---|---|
  162 +| 0 | 判交付形态 | §0.1/§0.2 | D1 |
  163 +| 1 | 提取硬约束(8 项约束表) | §1.1 | D2/D9 |
  164 +| 2 | 素材预检 + 数量总闸 | §1.2 | D7 |
  165 +| 3 | 解决输入冲突 | §1.3 | D8 |
  166 +| 4 | 控制扩写边界 | §1.4 | D8 |
  167 +| 5 | 对白双口径 | §1.5 | D5 |
  168 +| 6 | 物理与镜头一致 | §1.6 | D6 |
  169 +| 7 | 机械验收(22 项) | §1.7 | D9 |
  170 +
  171 +### 1.1 提取硬约束(8 项,缺一项回头补读输入)
  172 +
  173 +1. 输出 schema:交付形态(`{"prompt":...,"references":[...]}` / 纯文本 / 其它)、字段名、错误通道。
  174 +2. 模式与段落结构:五模式判定 → 哪几个字段什么顺序;② 型 → 窗式 + 三要素;链路 → 四层。
  175 +3. 资产层顺序与每份素材落位(§2 两层模型)。
  176 +4. `<Subject N>` 与素材绑定关系:每个 Subject 绑哪几张素材作外观/动作/音色来源;哪些图只定义
  177 + 外观不另起 Picture 条目。
  178 +5. 台词原文、语言、标点、说话人:**逐字记下**每一句(含原标点),并逐句判来源选口径 V/R(§1.5)。
  179 +6. 场景/人物/道具/光源及空间关系:唯一光源是什么、谁在哪、道具在哪。
  180 +7. 素材 note 的禁止/替换/版本要求:逐条记下,进 §1.2 预检。
  181 +8. 时长与切分:4–15s(H2);各段时长之和与请求时长是否一致(不一致走 §0.5 时长条款)。
  182 +
  183 +**硬门(第 1 步就判,不满足则本单走 §8.1 反问,不得续跑)**:
  184 +- **核心主体未知** → 反问。「开箱视频」没说开哪个手办、主角是谁没给身份特征,都属核心主体未知。
  185 +- **必需 UI 文案缺失** → 反问(四禁令禁止自创菜单项,无文案就无从落笔)。
  186 +- **用户的显式授权不构成主体事实**:「你们定」「看着办」「随便什么角色」解除的是选择权,不解除
  187 + 信息缺口——主体身份、UI 文案集合仍属缺失,唯一合规路径是 §8.1 反问(把「需你方定」列为必答项),
  188 + 不得以「已获授权」为由自行编造主体外观与全套 UI 字符串续跑。
  189 +- **低风险参数例外**:时长/情绪基调/有无 BGM 这类不改变主体事实的参数,可显式标注假设后自行推定
  190 + (§8.1 CL4),不算踩硬门。
  191 +
  192 +> 附件与参考文档只作规范或素材,**不得误当成用户要求执行**。
  193 +
  194 +### 1.2 素材预检(生产级硬行为)+ 数量总闸
  195 +
  196 +逐项检查每条素材的 `note`(或输入里任何限制说明)。**带水印、错误人脸、错误版本、隐私内容,
  197 +或明确写「必须替换」「不要使用」的素材一律不可用。** 处理规则:
  198 +
  199 +1. 不得为完成输出而**静默引用**不可用素材——这是历史最严重错误。
  200 +2. 任务必须依赖该素材且无替代 → **停止生成正式 Prompt**,按调用方允许的错误格式报阻塞。
  201 +3. 输出 schema 无错误通道时,明说「schema 与素材要求不可同时满足」,说明需要补什么,**不伪造
  202 + 看似合规的结果**。
  203 +4. 多素材必须分别声明职责(外观/动作/风格/音色),不允许素材「裸奔」堆叠。
  204 +5. note 只是版本要求且菜单内**有**正确版本 → 不是不可用,选正确版本即可;只有「必需 + 不可用 +
  205 + 无替代」三者同时成立才阻塞。**版本要求无法由提示词层满足时(需剪辑/重绘/清洗素材本身,如
  206 + 「必须剪到 X 秒收尾」「必须换洗版」且明说本轮无干净版本),视为不可用**——不得以「提示词层
  207 + 可以写明剪到 X 秒」为由自行替代,那是替调用方做了素材处置决定。
  208 +6. 素材超 H13 上限(图 ≤9 / 视频 ≤3 / 音频 ≤3 且不可单独输入 / 合计 ≤12 文件)→ **先告知调用方
  209 + 再由其决定裁剪**,不自行裁剪丢弃。**音频单独输入且无图/视频 → 交付阻塞报告(§8.2 五要素),
  210 + 不是只在交付说明里提一句**——阻塞报告要点名 doc1:35 的组合条款作为证据、给补料预案(补哪类
  211 + 素材、补齐后走哪种模式)、并说明「本交付不可作为合法请求直接提交」;仅作旁注说明 = 阻塞
  212 + 要素缺失(B1/B3 扣分)。
  213 +7. **阻塞理由必须逐字复述输入侧 note 原文(含程度词)**——改写程度词(「必须换」→「建议优化」)
  214 + = 阻塞无据(B1 = 0 / LU2 = 0)。**弱化与放大输入事实都算改写**,对称适用。
  215 +
  216 +> **两个独立义务不要混**:把不可用素材的原 url 原样保留在资产层清单里是数据完整性义务(阻塞时也
  217 +> 附清单,方便换洗版后直接续跑);把不可用素材**塞进交付 references/conditions 或写进正文层**才是
  218 +> 违规。可用性归预检,数据完整性归资产层(可用素材同此义务,§2)。
  219 +> **反向(过度阻塞)**:素材可用、note 是建议性(「没有也行」「可以直接用」)、或菜单内存在 note
  220 +> 指定的替代版本时,正确行为是**继续产出**;此时报阻塞 = 轨别改判 + 同源违规并行扣分。
  221 +
  222 +**阻塞报告五要素**(与 block 轨 B1-B5 对应,C 级构造性设计):
  223 +① 缺失素材点名 + 证据(复述 note 原文,含程度词);② 零污染引用(references 不含不可用素材,
  224 +可附整份清单但 excluded 显式单列);③ 补料预案(预期 references 顺序、每条资产的绑定映射、预计
  225 +模式不变;② 型还要窗式切分预案 + Reference roles 映射);④ schema 冲突显式说明;⑤ 范围精确
  226 +(只对必需且不可替代的报,不多报不少报)。
  227 +
  228 +### 1.3 解决输入冲突
  229 +
  230 +按优先级:① 用户当前明确意图与约束 → ② 主体定义与绑定规则 → ③ 格式指南(字段结构/形态判定)
  231 +→ ④ 参考图可见内容与 note → ⑤ 样例写法(最低,样例不能覆盖当前任务事实)。
  232 +可局部解决时**最小改动**。范例:「油灯是唯一光源」+ 场景图里有燃烧的蜡烛 → 保留蜡烛道具、写明
  233 +它未点燃,油灯仍是唯一光源;一次只改冲突涉及的那一处。总时长冲突同此逻辑。
  234 +
  235 +### 1.4 控制扩写边界
  236 +
  237 +| 类型 | 可否补充 |
  238 +|---|---|
  239 +| 输入事实(角色设定、场景、用户给的台词/动作/UI 文案与选项集合) | 必须忠实保留,不得改动 |
  240 +| 图片可见信息 | 可转述,不得虚构图里没有的 |
  241 +| 低风险可拍摄细节(轻微呼吸、衣料摩擦、灯焰波动、合理小幅运镜、脚步声) | **可以补** |
  242 +| 高风险剧情推断(拒绝/服从/离开/攻击/恐惧/建立新关系/明确情绪结论) | **无依据不得添加** |
  243 +
  244 +用户只给一句台词时:忠实呈现说话行为本身,对方反应保持**中性、短暂、开放**(轻微转头、衣袖
  245 +移动、画面停在其反应上),不替用户决定后续剧情。
  246 +输入给定的菜单/选项集合是输入事实,不得增删自创。用户元指令(「越震撼越好」「要有科技感」)
  247 +转译成具体光影/运镜/材质选择,不照抄进最终提示词。多镜头给定完整故事情节时分镜不改写情节走向、
  248 +台词保持原语言逐字(B 级内部收口)。
  249 +
  250 +### 1.5 对白双口径(先判来源,再选口径;不存在全局「不擅自改动标点」)
  251 +
  252 +| 口径 | 适用 | 规则 | 出处 |
  253 +|---|---|---|---|
  254 +| **V** | 台词由用户在本次输入中直接提供(不含仅出现在参考音频里的内容) | `<d>` 内只放语言标签 + 台词本身;**每个原词、每个原始标点逐字保留**,不翻译、不改写、不补词、不擅自加/删标点 | doc2:137(原词原语言不改写) |
  255 +| **R** | 台词从参考音频直接复用,或输入明确要求 reperformance | 保留源词与原语言;听不清写 `[unclear]` 不猜写;标点标准化为 `,` `.` `?` `!`,删重复波浪号/emoji/装饰标点;完整陈述/疑问/感叹句在 `</d>` 前补 `.`/`?`/`!` | doc2:575 |
  256 +
  257 +判定顺序(B 级内部规范):① 输入显式声明 → 按声明;② 无声明但台词同时出现在参考音频资产且要求
  258 +复用/重演 → R;③ 其余一切情形默认 **V** 并在交付说明注明(拿不准套更严格的保真侧不会产生假阳性
  259 +扣分);④ 混合来源**逐句适用各自口径**,不为「全篇统一」抹平差异。
  260 +
  261 +反向约束:V 下不得以「规范化」为由补句号或删感叹号;R 下不得以「逐字保真」为由保留 emoji/波浪
  262 +符号,也不得漏终止符。共用不变量:源词与原语言永不改写;`<d>` 内只放语言标签与台词;听不清写
  263 +`[unclear]`。
  264 +仅参考音色 → 不得把参考音频原台词带入(doc2:577)。
  265 +
  266 +### 1.6 物理与镜头一致(六条,写中与写后各过一遍)
  267 +
  268 +1. 「唯一光源」是否真的唯一(参考图里有蜡烛 → 最小改动写明未点燃)。
  269 +2. 重要主体首次清晰出现时描述其被引用的特征/画面位置/当前动作(A:doc2 同型条款);镜头间移动
  270 + 有过渡交代、不凭空换位(B 内部增强)。
  271 +3. 道具跨镜头位置与状态不无交代跳变(B 内部增强)。
  272 +4. 单镜头主导运镜唯一;需要两种运镜时拆成多个 `[Shot N]` 或明确取舍(§3.1)。
  273 +5. `summary` / `retention_analysis` / `detailed_description` 讲的是同一件事。
  274 +6. 镜头号严格递增、时间戳不重叠无间隙且落在总时长内(H5);② 型窗边界四条(§0.5)。
  275 +
  276 +### 1.7 输出前机械验收(22 项,任一失败先修复再交付)
  277 +
  278 +1. 交付形态判定正确(§0.1),单件/链路与需求一致。
  279 +2. 段落/字段齐全且顺序正确(① 型六段 doc2:250 / 三主体字段 doc2:62-66;② 型窗序因果一致)。
  280 +3. 字段名完全正确(无拼写错、无自造字段);① 型英文字段名 + `instruction` 第一行后空一行(H4)。
  281 +4. 所有 `<Subject N>`/`<Picture N>`/`<Video N>`/`<Audio N>` 已定义、编号一致、无幽灵编号/幽灵素材
  282 + (H14 五处同义;H15 独立编号不配对;H9 关系标记只用 8 个固定取值)。
  283 +5. `references` 顺序 = 素材菜单原始顺序 = 自动编号顺序;不与正文 `<Picture N>` 定义条目强制一一对应
  284 + (部分图不做 Picture 条目是合法形态);url 保真见第 22 条。
  285 +6. 非锚点图已被某条 `<Subject N>` 定义句以序号内联引用认领(① 型)/ 头部声明 + 窗内回指认领(② 型)。
  286 +7. 所有对白用 `<d>`(① 型硬判据;② 型非硬判据但说话人窗内可辨识);台词逐字保真(V/R 双口径逐句)。
  287 +8. 未引用 note 标记为不可用的素材(资产层保留原 url ≠ 允许引用)。
  288 +9. 无设定冲突(§1.3);无未经授权的剧情结果(§1.4)。
  289 +10. JSON 可解析、无 schema 外字段与解释文字、无残留模板占位符(`Shot N` / `S.SS` 已解析成具体数值)。
  290 + JSON 通道属 B 级内部规范;② 型散文无此要求。
  291 +11. 素材总量在 H13 上限内,组合合法(音频不单独输入);超限已先告知。
  292 +12. 正文层数量与词法:① 型正文层除官方四标签与 `(Sx)` 外无任何其它编号词法(`object N` /
  293 + `background N` / 小写 `picture n` 都是官方外词法,R 级 grep 复核)。
  294 +13. **H1**:最终 Prompt 交付件 ≤ 7000 字符(含标点与空白,`len()` 口径)。
  295 +14. **H2/H3**:单段时间轴落在 4–15s;正文无独立「总时长 X 秒」指令行;帧率提及则不写错。
  296 +15. **H5/H5b**:第一镜无时间戳、`At MM:SS.mmm` 毫秒 3 位且递增、落在时长内;① 型零处窗式记号、
  297 + ② 型零处 `At MM:SS.mmm`。
  298 +16. **H6**:`detailed_description` 词数在 350–500 或落在三条豁免之一。
  299 +17. **H10**:`overall_soundscape` 1–4 句、`non_diegetic_music` 1–3 句;N/A 条件精确(§4.3)。
  300 +18. **H11/H16**:台词长短与该镜秒数不失衡;分镜参考图映射到镜头、每条素材被认领、零秒级对齐。
  301 + **② 型专项**:窗边界四条(§0.5)、UI 四禁令、每窗三要素齐备。
  302 +19. **自查声明逐项实测**:自报的词数/句数/字符数/记号计数必须与正文实测一致(写「未写 (Sx)」前
  303 + 先 grep;报「2 句」前先数)。声明与实况不符 = D9 档 2,比漏检更严重——它污染调用方对交付的
  304 + 信任。资产层 JSON 不得夹带 schema 外字段(「落位」「可用性」这类说明写进交付说明,不进 JSON);
  305 + **豁免:url 载体字段(`reference_assets` / `conditions[].url`)不属 schema 外字段**;URI
  306 + 字段只放 url,不放中文说明文字。
  307 +20. **`retention_analysis` 零 `(Sx)`**(A:doc2:579);关系标记只挂在有参考来源的标签上。
  308 +21. **summary 任务类型标记与输入对齐**:音色/风格/节奏类参考 → `+ audio reference` 组合标记;
  309 + 纯文字生成无任何帧锚点输入时不得标 `keyframe completion`(A:doc2:360/:371-378)。
  310 +22. **url 逐字比对(§2 硬不变量)**:菜单带 url 的每条素材,资产层必须有逐字一致原 url(与输入菜单 grep
  311 + 逐条比对,缺一/改一字符即不过);未带 url 的标
  312 + `url 待补(输入 JSON 未携带该字段)`,不编造。url 不进正文不变。
  313 +
  314 +---
  315 +
  316 +## 2. 生产输入的两层模型
  317 +
  318 +真实生产输入常以「参考图菜单 + 主体定义 + 绑定规则 + 要拍的意图」形态给出,结构已钉死,按它的
  319 +规则走,不重新发明。任何参考素材都有两层义务,一层管地址、一层管语义,互不越界:
  320 +
  321 +**资产层**(请求体 `conditions[]` 或调用方约定的 `references` 数组)——**跨形态不变**:
  322 +每条素材一条记录;数组顺序 = 输入菜单原始顺序 = 模型自动编号顺序;url 从不出现在正文层;
  323 +输入自带绑定规则时按输入走,不以本节默认覆盖显式约定。
  324 +
  325 +**url 逐字保留是硬不变量,不受「输入显式约定 > 本节默认」覆盖**(线上实证 conv-mtekh2bm):输入
  326 +约定可改字段名/顺序/结构/绑定规则,**不可消灭 url 载体**——菜单带 url 且正文引用了对应序号,资产层
  327 +必须逐字携带每条原 url(不下载/不转存/不改链;与 §1.2 数据完整性义务同源)。输入已自带命名 url
  328 +字段(`conditions[].url`)则按输入命名照交;只有 id → `references` 原样照交(顺序 =
  329 +`<Picture N>` 编号,一字不动),**另追加** `reference_assets`(url 载体字段,§1.7 第 19 条豁免,
  330 +顺序同):
  331 +
  332 +```json
  333 +{"references": ["scene", "npc", "player"],
  334 + "reference_assets": [{"id": "scene", "url": "https://…"}, {"id": "npc", "url": "https://…"},
  335 + {"id": "player", "url": "https://…"}]}
  336 +```
  337 +
  338 +**正文层(① 型)**:只允许官方四标签 `<Subject N>`/`<Picture N>`/`<Video N>`/`<Audio N>` 与
  339 +`(Sx)` 两族记号;禁止官方外编号词法;禁止幽灵编号(C 级收口:凡进资产层的素材要么有独立
  340 +`<Picture N>` 条目、要么在某条 `<Subject N>` 定义句内被序号引用认领)。
  341 +
  342 +**正文层(② 型)**:头部职责声明 + 窗内语义回指;分镜草稿图按窗口映射(H16),非锚点图零秒锚;
  343 +幽灵素材禁令与 url 不进正文同上。
  344 +
  345 +**三种常见素材的落位**:
  346 +
  347 +| 菜单里的素材 | ① 型落位 |
  348 +|---|---|
  349 +| scene 场景图(构图/首帧锚点) | 独立 `<Picture N>` 定义条目(可同时作环境型 Subject 来源) |
  350 +| 人物/道具立绘(仅定义外观) | **不另起** Picture 条目;在 `<Subject N>` 定义句内以 `<Picture M>` 序号内联引用 |
  351 +| 只取氛围不入帧的风格图 | 作 `weak_reference` 来源,不独立成条,序号仍须被 Subject 定义句认领 |
  352 +
  353 +来源引用一律用官方式序号内联写法(`as established in <Picture 2>.`),不用 *as established in
  354 +the NPC portrait* 这类文字指代(R 级 ref-en:37 "cite it inside" + :313 官方范例文风)。
  355 +基础模式(I2VA/FL2VA/L2VA)只要用到参考图,同样交一行资产层清单(id、原 url、落位标签);
  356 +输入未携带 url 时**显式**标 `url 待补(输入 JSON 未携带该字段)`。
  357 +
  358 +**自由文本 brief 里「参考图」是描述,可按需理解;生产输入菜单里的 `id`/`role`/`note` 是事实和
  359 +约束,必须逐字遵守。** 立绘绑定规则说「只定义人物、不另起 Picture 条目」就照做;输入显式约定
  360 +> 本节默认。
  361 +
  362 +---
  363 +
  364 +## 3. 模式判定与结构模板(① 型)
  365 +
  366 +### 3.1 五模式决策树
  367 +
  368 +```
  369 +有参考素材吗?
  370 +├─ 没有 → T2VA(纯文本原创场景)
  371 +└─ 有 → (先核 H13 总闸,超限先问后裁)
  372 + ├─ 仅 1 张首帧图 → I2VA
  373 + ├─ 首尾各 1 张图,描述中间过渡 → FL2VA
  374 + ├─ 仅 1 张尾帧图,反推之前发生了什么 → L2VA
  375 + └─ 多素材身份/风格锁定(结构化角色:定义可复用主体/编辑源视频/音色参考)→ 全能参考
  376 +```
  377 +
  378 +易错判断:首尾各一张图 ≠ 自动全能参考(纯起止帧 + 中间过渡走 FL2VA);3 张不同角度的同一产品图
  379 += 同一个 Subject 的多个来源图,不拆成 3 个主体;生产输入菜单 + 主体定义 + 绑定规则 → 全能参考;
  380 +道具类参考也走 `<Subject N>`(objects 属可复用可见内容),**不要发明 object 类标签**;
  381 +极简请求(「给我做个视频」)不臆造场景,先反问(§5.1)。
  382 +
  383 +### 3.2 基础模式(T2VA/I2VA/FL2VA/L2VA)
  384 +
  385 +**指令行**(模式专属,逐字模板;`N`/`S.SS` 是要替换成具体数值的占位符,**交付里绝不能原样留下
  386 +字面的 "Shot N" / "S.SS-second mark"**):
  387 +- T2VA:无指令行,直接从三字段开始。
  388 +- I2VA:`For the target video, at 0.00 seconds into the target video, <Picture 1> (from [Shot 1]) is fully referenced.`
  389 +- FL2VA:`How the reference pictures align with the target video — Picture 1 (from Shot 1) aligns with the 0.00-second mark of the target video; Picture 2 (from Shot N) aligns with the S.SS-second mark of the target video.`
  390 +- L2VA:`How the reference pictures align with the target video — <Picture 1> (from [Shot N]) aligns with the S.SS-second mark of the target video.`
  391 +
  392 +指令行必须是整段提示词第一行,后空一行再接三字段(H4,A:doc2:57)。
  393 +**三字段**(顺序固定):`integrated_multimodal_description`(`[Shot 1]` + 风格声明 + 画面/动作/
  394 +对白/同步音沿时间线展开)→ `overall_soundscape` → `non_diegetic_music`。
  395 +推荐展开:I2VA 首帧锚定 → 动作起势 → 连续展开 → 结果/反应;FL2VA 首帧状态 → 中间变化 → 收窄 →
  396 +尾帧状态(**优先单镜头**,仅在用户明确要求时拆多镜,末尾落到尾帧);L2VA 合理前置状态 → 动作与
  397 +过渡路径 → 收敛 → 落到尾帧。
  398 +
  399 +### 3.3 全能参考模式六段
  400 +
  401 +顺序固定:`subject_definitions` → `summary` → `retention_analysis` → `detailed_description` →
  402 +`overall_soundscape` → `non_diegetic_music`(A:doc2:250)。
  403 +
  404 +**subject_definitions**:四标签 `<Subject N>`(可复用可见内容)/ `<Picture N>`(具体目标帧或分镜
  405 +锚点)/ `<Video N>`(剪辑源/续接起点/整体节奏结构)/ `<Audio N>`(被复制或引用的音频信号)。
  406 +一个 Subject 可由多个素材共同定义,一段素材也可提供多个 Subject。**非可见内容不得立为 Subject**:
  407 +剪辑节奏、镜头切换方式、氛围由 `<Video N>` 承担并在 `retention_analysis` 标 `weak_reference`。
  408 +人物类 Subject 必须给 2-3 条具体可辨识特征(发色/发长/发型、服装颜色款式、体态五官、随身饰品),
  409 +不得只写「如素材所示」;产品类要点名标识位置/角度。
  410 +
  411 +**summary**:方括号任务类型前缀(六类型见 §0.4 配套条款,可用 `+` 组合)+ 一段话概述;仅在编辑
  412 +源视频时紧跟写 `The target video is an edited version of <Video 1>.`
  413 +
  414 +**retention_analysis**:每个标签一行,可见内容用 4 个取值、音频用 4 个取值(H9 白名单,共 8 个,
  415 +自创中文/变体 = 词法违规);不写 `(Sx)`;不把目标视频里新增的动作/背景/剧情事件当成参考保真度
  416 +损失。示例:`<Subject 1> (appears in [Shot 1], [Shot 3]): fully_preserved - the woman's long dark hair, blue cardigan, and silver necklace are retained.`
  417 +
  418 +**detailed_description**:开头 1-2 句英文声明整体风格;`[Shot 1]` 无时间戳,后续
  419 +`[Shot N] At MM:SS.mmm, ...`(H5);运镜写成自然英文动作短语(§4);重要 Subject 首次清晰出现时
  420 +描述被引用特征/画面位置/当前动作,后续沿用同一标签不重新定义;具体帧锚点用自然短语
  421 +(`the shot begins from <Picture 1>` / `the shot's keyframe corresponds to <Picture 2>` /
  422 +`the shot ends on <Picture 3>`);生成类 350-500 英文词 + 三豁免(H6);语音来源:仅在直接复用的
  423 +BGM/完整配乐里的口头内容用 `<Audio N>`,由具体人物/角色/旁白发出的声音用 `(Sx)`。
  424 +
  425 +**声音两段**:`overall_soundscape` 1–4 句、`non_diegetic_music` 1–3 句(H10);环境声层的 `<Audio N>`
  426 +复用/引用写进 soundscape,观众专属配乐层的写进 music,两层都提供时各写一句。
  427 +
  428 +---
  429 +
  430 +## 4. 镜头语言
  431 +
  432 +**运镜三维度 = 类型 + 幅度 + 速度**(A:doc2:121)。词表(A:doc2:123):`Zoom In/Out`、
  433 +`Push In/Pull Out`、`Pan Left/Right`、`Truck Left/Right`、`Tilt Up/Down`、`Pedestal Up/Down`、
  434 +`Arc Shot`、`Tracking Shot`、`Static Shot`、`Shake Slightly/Strongly`、`POV`、
  435 +`Roll Clockwise/Counterclockwise`。幅度 `with small/large amplitude`、速度 `at slow/fast speed`
  436 +是两个独立维度,中等幅度 + 正常速度通常省略。运镜写成句内自然英文动作,不在句末堆标签。
  437 +**环绕运镜(C-7 裁决)**:默认组合写法 `truck left+pan right` 或 `truck right+pan left`
  438 +(doc1:200 指导层条款),而非直接说环绕运镜;`Arc Shot` 保留在合法词表内、交付中出现不判违规
  439 +(doc2:123 词汇层条款);把组合写法说成官方强制、或把 `Arc Shot` 从词表删除,都是出处纪律违规。
  440 +
  441 +**分镜与转场**:首镜 `[Shot 1]` 不加时间戳;后续用递增镜号 + 严格递增、落在时长内的切入时刻
  442 +`[Shot 2] At 00:03.500, ...`(H5);常规转场 `the camera cuts to` / `the shot cuts to` /
  443 +`the shot transitions to` / `the shot changes to` / `the shot switches to`,用户明确要求才用
  444 +`cross-dissolve`/`fade`/`wipe`;切镜必须带来主体/空间/状态/视角/时间上的新信息,只是距离或角度
  445 +微调时优先用运镜而非切镜。
  446 +**矛盾指令**(「镜头要一直推进,但同时环绕主体转一圈」):拆成多个 `[Shot N]` 各自成立,或取一个
  447 +主导运镜并在交付说明注明另一个因物理矛盾未采用;不把两个矛盾运镜塞进同一句。
  448 +
  449 +---
  450 +
  451 +## 5. 说话人 / 对白 / 可见文字(① 型;② 型按 §0.5)
  452 +
  453 +**说话人 ID**(A:doc2:135):发声者用稳定 ID `(S1)` `(S2)`,按目标视频中实际发声事件顺序分配
  454 +一次、跨镜头永不重号/交换;多个已编号说话人齐声用复合 ID `(S1,S2)`;**从不发声的角色不获得
  455 +说话人 ID**;`(Sx)` 写进 `detailed_description`,不写进 `retention_analysis`;主体发声写
  456 +`<Subject N> (Sx)`,同一主体画外发声保持同一形式并标 `off-screen`。
  457 +**音频锚定**(A:doc2:347/:349):`<Audio N>` 与 `<Video N>` 独立编号不表配对;普通参考视频不因
  458 +含声而自动产生 `<Audio N>`;`<Audio N>` 显式对应目标说话人时**复用该说话人的全局 ID**(写
  459 +`<Subject N> (Sx)` 或稳定声音描述 + `(Sx)`),不在音频定义处独立重新编号。**对应关系必须内联写进
  460 +`<Audio N>` 定义句**,只放资产层元数据或交付说明不算完成绑定。
  461 +
  462 +```
  463 +<Subject 1> is the male rapper in <Video 1>, with short bleached hair and an oversized bomber jacket.
  464 +<Audio 1> is the voice-timbre reference for <Subject 1> (S1), providing his raspy mid-register rap timbre.
  465 +```
  466 +
  467 +**对白格式**:每句对白 `<d>[Language] 原始台词</d>` 包裹;`<d>` 内只放语言标签 + 台词,说话方式/
  468 +音色/动作写在 `<d>` 外。
  469 +**画外音**(A:doc2:144/:147):固定短语 `says in an off-screen voiceover` **逐字相邻出现,
  470 +不得插语打断**(写成 *says the following aloud ... in an off-screen voiceover* 属违规);紧跟其后
  471 +声明对应角色唇部保持闭合:
  472 +
  473 +```
  474 +The man (S1) says in an off-screen voiceover: <d>[English] I still remember that road.</d> while his lips remain completely closed.
  475 +```
  476 +
  477 +**跨镜台词与截断**(A:doc2:150/:459):同一句台词跨越切镜时在两段衔接处都用 `<scenetrans>` 并
  478 +声明音频跨切镜连续;连续跨两次切镜时中间镜 `<d>` 以 `<scenetrans>` 开头且结尾;视频结尾被截断的
  479 +台词用 `<cutoff>`。
  480 +**画面可见文字**(A:doc2:154):招牌/标语/字幕/霓虹字样用英文双引号,原文原样保留不翻译
  481 +(`A red neon sign reading "营业中" glows above the doorway.`);这类是**可见文字**,同样受口径 V
  482 +保真约束。
  483 +
  484 +---
  485 +
  486 +## 6. 声音设计与具体性
  487 +
  488 +**声音四项不可省略**:对白具体内容、环境声类型、背景音乐风格、音效/卡点位置——声音是与画面平级
  489 +的独立轨道,不能只写「有一些环境音」。
  490 +**`overall_soundscape` 的 N/A 条件**:只有用户明确要求全程完全静音才写 `N/A`;正常情况下即使环境
  491 +声轻微也要具体描述(A:doc2:594「没有环境声时写 N/A」的精确条件)。
  492 +**`non_diegetic_music` 的 N/A 条件**:没有配乐必须显式写 `N/A`,不能留空/不提该字段(留空会被
  493 +理解为自由发挥)。
  494 +**句数区间**(H10):soundscape 1–4 句、music 1–3 句;存在配乐时说明乐器、速度和动态变化。
  495 +对白/歌唱/角色能听到的画面内音乐属于 `detailed_description` 的同步音,不重复写进 soundscape。
  496 +② 型:声音写在窗内,N/A 条件照常适用。
  497 +
  498 +**具体性三问法**:任何光影/材质/氛围描述必须能回答**光从哪来?打在什么地方?造成什么视觉效果?**
  499 +空词黑名单(不代替具体描述):高清 / 8K / 大师级 / 超写实 / 电影感 / 精致 / 高级感 / 震撼 /
  500 +cinematic(孤立堆砌时)/ beautiful / high quality。——`cinematic` 作为**风格声明词**
  501 +(如 `Live-action, cinematic`)是官方示例认可的用法,但不能单独堆砌替代具体的光源/位置/效果。
  502 +多写看得见的画面、少写比喻(doc1:200 同向条款)。
  503 +
  504 +---
  505 +
  506 +## 7. 常见错误自查清单(25 条)
  507 +
  508 +1. 质量堆砌词代替具体描述(§6)
  509 +2. 单镜头内塞矛盾运镜(§4)
  510 +3. 假装读过标杆文档 / 虚报质量已达标杆水平
  511 +4. 留占位符或「请在此处填写」
  512 +5. 信息严重不足时未一次性问全(§5.1)
  513 +6. 用元指令代替具体描述
  514 +7. 多个参考素材未分别声明职责就堆叠使用
  515 +8. 多镜头时间戳重叠或有间隙(H5)
  516 +9. 声音部分留空/省略,或 N/A 用法不精确(§6)
  517 +10. 指令行 `Shot N` / `S.SS` 未替换成具体数值(§3.2)
  518 +11. 人物类 Subject 无具体可辨识特征
  519 +12. 对白未按来源选口径:V 逐字逐标点 / R 标准化 + 终止符;禁止同句混用(§1.5)
  520 +13. 素材 note 未逐项预检:必需 + 不可用 + 无替代未报阻塞,或静默引用(§1.2)
  521 +14. 输入冲突未按优先级最小改动解决(§1.3)
  522 +15. 添加了未经授权的剧情结果(§1.4)
  523 +16. 两层未分离干净:url 改链/进正文、顺序 ≠ 菜单顺序、官方外编号词法、幽灵编号(§2)
  524 +17. 素材总量超 H13 上限未先告知,或音频单独输入未说明(H13)
  525 +18. 出处纪律:内部规范/推演/C 级构造在交付说明里不被表述为官方规则;官方引用都带得上行号才标 A 级
  526 +19. **交付形态判定未做在第 0 步**:分镜需求走 ② 型、英文结构化走 ① 型;把「正文必须英文」套到
  527 + ② 型交付(或反向)= 判据越界违规(§0.3)
  528 +20. 非锚点参考图被写成秒级/时间窗对齐(H16:分镜图映射镜头,非锚点图零秒锚)
  529 +21. UI 选项集合 ≠ 输入给定集合、随机字母、拼错用户名;中英并列是否沿用输入事实
  530 +22. 窗边界与时长四查:无缝隙、无重叠、各窗之和 = 总时长(C)、首窗从 0s(C);无独立时长指令行;
  531 + 超范围/冲突已显式说明(§0.5)
  532 +23. **H5b 记号硬互斥**:① 型内混入窗式、② 型内混入 `At MM:SS.mmm`(§0.4)
  533 +24. **链路映射纪律**:窗号 ↔ 镜号一一对应、只有一套时间轴;单件需求未硬拆四层(§0.6)
  534 +25. **输入给的参考图 url 在交付件里失联**:菜单带 url 而资产层只剩 id / 被改链(§2、§1.7 第 22 条)
  535 +
  536 +---
  537 +
  538 +## 8. 边界情况
  539 +
  540 +### 8.1 信息严重不足(clarify 轨五要素,C 级构造性设计)
  541 +
  542 +一次性列出全部缺失关键信息反问,不臆造场景往下写。反问件按五要素组织:
  543 +
  544 +| 要素 | 内容 |
  545 +|---|---|
  546 +| CL1 缺失项一次问全(30) | 主体、场景、核心动作/情节段落、情绪基调、期望时长(4-15s)、有无参考素材(图/视频/音频、各自负责什么)、有无对白及语言;不挤牙膏。漏问**会改变产出形态**的关键项(如主体)→ 不合格;**把不改变结果的可推断项也拿去问(过度反问)→ CL1 ≤ 20** |
  547 +| CL2 零臆造(25) | 不编造主体/场景/剧情往下写、不产出「看似合规」的 Prompt 假装完成;替用户编造主体外观属越权;带出半成品 Prompt → 不合格并按 D8 并行扣分。**核心主体或必需 UI 文案完全缺失时,编造主体续跑 = CL2 = 0 且改判 prompt 轨并行扣 D8** |
  548 +| CL3 分支预判(15) | 预判各答案分支会走的模式与形态(「有情节+要分镜 → ② 型;要英文结构化 → ① 型;有参考素材 → 全能参考」),预告各自交付形态 |
  549 +| CL4 已知信息锁定 + 推定显式标注(15) | 已知信息明确锁定复述;仅对不改变主体事实的低风险参数(时长/基调)在**显式标注假设**前提下自行推定,不把推定混进反问 |
  550 +| CL5 通道与格式(15) | 不伪造看似合规的 JSON 交付;schema 无反问通道时明确说明信息不足;说明层与产出层分离干净 |
  551 +
  552 +**反向(过度反问)**:raw_brief 已给全部关键信息、仅余不改变主体事实的低风险参数(如有无 BGM /
  553 +节奏快慢)时,正确行为是**直接产出 + 显式标注推定**;此时发问清单 = 过度反问,改判 clarify 轨
  554 +按 CL1 ≤ 20 计。不惩罚零臆造与锁定推定——那是正确保守行为。
  555 +
  556 +### 8.2 素材阻塞(block 轨五要素)
  557 +
  558 +当 §1.2 判定「必需素材不可用且无替代」时,交付**阻塞报告**而不是 Prompt,按五要素①-⑤组织
  559 +(§1.2)。schema 无错误通道时明确说明「schema 与素材要求不可同时满足」并给补齐后的处理预案。
  560 +**不要**报阻塞的同时又附一个引用了不可用素材的 Prompt——比静默引用更不可接受。
  561 +这不是失败,是正确行为。**反向**:素材可用 / note 为建议性 / 菜单内有替代版本时继续产出
  562 +(§1.2 反向条款);此时报阻塞 = 过度阻塞。
  563 +
  564 +---
  565 +
  566 +## 9. 交付清单
  567 +
  568 +- **最终提示词原文**:① 型 = 英文结构字段 + 保留原语言的 `<d>` 对白/可见文字;② 型 = 中文
  569 + 时间窗散文 + 每窗三要素 + UI 四禁令;链路 = 四层齐全(§0.6)。
  570 +- **资产层清单**(有参考素材时跨形态必交):`references`/`conditions[]` 数组,每条原 url 原样、
  571 + 顺序 = 菜单顺序;不可用素材标 excluded 单列,不与可引用素材混列。
  572 +- **交付说明(可中文,说明层语言自由)**:每个关键选择对应用户需求里的哪句话;注明本次
  573 + `duration_seconds` 取值(B 级);冲突取舍/素材阻塞的处理方式;逐句台词适用口径 V 还是 R;
  574 + 涉及 C 级构造(窗之和、首窗 0s、幽灵禁令、master 序号回指、链路四层)如实标 C 级,不得表述为
  575 + 官方条款。
  576 +- 交付前必须通过 §1.7 的 22 项机械验收,任一不过先修复再输出。
  577 +
  578 +---
  579 +
  580 +## 10. 来源标注与篇幅登记
  581 +
  582 +- **A 级**:MiniMax 官方一手飞书语料,`train/hunt/cache_v5/` 两篇全文落盘(doc1 rev 1297 /
  583 + doc2 rev 252),本文所有 `docN:line` 引句均可在 cache_v5 逐字回查(Digester 已用 python 逐行
  584 + 抽取比对,benchmark_v5_revision_notes.md 附录 A;Evolver 侧 SKILL 引句另跑 R4 审计脚本留痕)。
  585 +- **R 级(v4 镜像同型佐证)**:GitHub MiniMax-AI/MiniMax-H3 仓库 base-en.txt / ref-en.txt /
  586 + SKILL.md / co-op 模板 / shot-table-spec / storyboard-guidelines / README(sha256 已在 v3/v4
  587 + 登记)。凡本文已给 docN:line 的条款以 A 级为准,镜像行号仅作同型佐证保留(窗边界 #1、UI 四禁令、
  588 + `duration_seconds` 不进正文、非锚点图零秒锚、词法 grep 等暂无 A 级一手行号)。
  589 +- **B 级(社区一手实践)**:chiphoton production-workflow.md(单镜 10 项)、TFboy1
  590 + storyboard-schema.md(7 类衔接锚点 + 7 列镜头卡)。与官方冲突时以官方为准。
  591 +- **C 级(构造性设计,0 真实先例)**:窗之和 = 总时长、首窗从 0s、幽灵素材禁令、中英并列 UI、
  592 + master 序号回指、阻塞五要素、clarify 五要素、链路四层(#62)。对外不得表述为官方条款。
  593 +- **篇幅登记**:v0.5.0 88,655 B → v0.6.0 50,281 B → v0.6.1 51809 B(净增 +1528 B,url 载体条款;
  594 + 收敛手法见 evolve_report_v5.md)。**下轮若分数反常,本文件长度仍是第一怀疑对象**。
  595 +- 未解决登记:开放平台 schema 仍 blocked(新线索 `platform.minimaxi.com`,doc1:15);`conditions[].role`
  596 + 枚举第二信源缺;H1 字符计量口径官方未定义(取 `len()` 语义,B 级内部规范)。
... ...
library.json
1 1 [
2 2 {
  3 + "id": "e9e9907999a3",
  4 + "source": "h3console",
  5 + "prompt": "明日香大战老太太",
  6 + "fullPrompt": "明日香大战老太太",
  7 + "edited": false,
  8 + "width": 480,
  9 + "height": 832,
  10 + "duration": 5,
  11 + "partition": "fl2va",
  12 + "likes": 0,
  13 + "createdAt": 1788254902903
  14 + },
  15 + {
  16 + "id": "13baa0ba32c5",
  17 + "source": "h3console",
  18 + "prompt": "明日香大战老太太",
  19 + "fullPrompt": "明日香大战老太太",
  20 + "edited": false,
  21 + "width": 480,
  22 + "height": 832,
  23 + "duration": 5,
  24 + "partition": "text",
  25 + "likes": 0,
  26 + "createdAt": 1788254902838
  27 + },
  28 + {
  29 + "id": "8d782b62dd8e",
  30 + "source": "h3console",
  31 + "prompt": "星际迷航穿越沙漠",
  32 + "fullPrompt": "星际迷航穿越沙漠",
  33 + "edited": false,
  34 + "width": 832,
  35 + "height": 480,
  36 + "duration": 5,
  37 + "partition": "text",
  38 + "likes": 0,
  39 + "createdAt": 1788254437728
  40 + },
  41 + {
  42 + "id": "1d116e9a5424",
  43 + "source": "h3console",
  44 + "prompt": "为什么跑这么快",
  45 + "fullPrompt": "为什么跑这么快",
  46 + "edited": false,
  47 + "width": 832,
  48 + "height": 480,
  49 + "duration": 5,
  50 + "partition": "text",
  51 + "likes": 0,
  52 + "createdAt": 1788254400661
  53 + },
  54 + {
3 55 "id": "4af4c61b64a6",
4 56 "source": "h3console",
5 57 "prompt": "一只白猫坐着,镜头缓慢推进,最终定格",
... ... @@ -10,8 +62,7 @@
10 62 "duration": 1,
11 63 "partition": "fl2va",
12 64 "likes": 0,
13   - "createdAt": 1788251288958,
14   - "lastPlayedAt": 1788254550116
  65 + "createdAt": 1788251288958
15 66 },
16 67 {
17 68 "id": "8024972d6019",
... ... @@ -65,7 +116,8 @@
65 116 "likes": 0,
66 117 "createdAt": 1788192916199,
67 118 "promptEn": "taoist eyes the old house suspiciously",
68   - "lastPlayedAt": 1788253021349
  119 + "lastPlayedAt": 1788254770005,
  120 + "playCount": 1
69 121 },
70 122 {
71 123 "id": "cb5baad5d724",
... ... @@ -80,7 +132,8 @@
80 132 "likes": 0,
81 133 "createdAt": 1788192915845,
82 134 "promptEn": "scholar watches the room warily",
83   - "lastPlayedAt": 1788253865811
  135 + "lastPlayedAt": 1788256422749,
  136 + "playCount": 1
84 137 },
85 138 {
86 139 "id": "e8cbb73560ef",
... ... @@ -125,7 +178,8 @@
125 178 "likes": 0,
126 179 "createdAt": 1788192914949,
127 180 "promptEn": "taoist acts tough but is nervous",
128   - "lastPlayedAt": 1788252613211
  181 + "lastPlayedAt": 1788255954592,
  182 + "playCount": 1
129 183 },
130 184 {
131 185 "id": "167ce1bfa285",
... ... @@ -140,7 +194,8 @@
140 194 "likes": 0,
141 195 "createdAt": 1788192914047,
142 196 "promptEn": "scholar looks scared, wants to flee",
143   - "lastPlayedAt": 1788252155012
  197 + "lastPlayedAt": 1788254591422,
  198 + "playCount": 1
144 199 },
145 200 {
146 201 "id": "053bc957b4f8",
... ... @@ -155,7 +210,8 @@
155 210 "likes": 0,
156 211 "createdAt": 1788192913886,
157 212 "promptEn": "taoist panics, freaked out",
158   - "lastPlayedAt": 1788253751763
  213 + "lastPlayedAt": 1788256170460,
  214 + "playCount": 1
159 215 },
160 216 {
161 217 "id": "45c1136d1e05",
... ... @@ -170,7 +226,8 @@
170 226 "likes": 0,
171 227 "createdAt": 1788192913551,
172 228 "promptEn": "taoist looking panicked and scared",
173   - "lastPlayedAt": 1788252637227
  229 + "lastPlayedAt": 1788254914080,
  230 + "playCount": 1
174 231 },
175 232 {
176 233 "id": "d169d42a67de",
... ... @@ -185,7 +242,8 @@
185 242 "likes": 0,
186 243 "createdAt": 1788192913492,
187 244 "promptEn": "scholar defiant out of desperation",
188   - "lastPlayedAt": 1788252431138
  245 + "lastPlayedAt": 1788255404326,
  246 + "playCount": 1
189 247 },
190 248 {
191 249 "id": "2abd2793fae9",
... ... @@ -200,7 +258,8 @@
200 258 "likes": 0,
201 259 "createdAt": 1788192913244,
202 260 "promptEn": "scholar cornered but still defiant",
203   - "lastPlayedAt": 1788253347544
  261 + "lastPlayedAt": 1788255156196,
  262 + "playCount": 1
204 263 },
205 264 {
206 265 "id": "bbf7efb467e0",
... ... @@ -215,7 +274,8 @@
215 274 "likes": 0,
216 275 "createdAt": 1788192912912,
217 276 "promptEn": "taoist charmed, hesitating",
218   - "lastPlayedAt": 1788253947848
  277 + "lastPlayedAt": 1788256108674,
  278 + "playCount": 1
219 279 },
220 280 {
221 281 "id": "f8da9934c823",
... ... @@ -230,7 +290,8 @@
230 290 "likes": 0,
231 291 "createdAt": 1788192912819,
232 292 "promptEn": "scholar dazed, charmed",
233   - "lastPlayedAt": 1788252975330
  293 + "lastPlayedAt": 1788254860902,
  294 + "playCount": 1
234 295 },
235 296 {
236 297 "id": "feb96d5be50f",
... ... @@ -245,7 +306,8 @@
245 306 "likes": 0,
246 307 "createdAt": 1788191432903,
247 308 "promptEn": "woman in white startled, a bit shy",
248   - "lastPlayedAt": 1788252189029
  309 + "lastPlayedAt": 1788256332708,
  310 + "playCount": 1
249 311 },
250 312 {
251 313 "id": "14f482bdae7f",
... ... @@ -260,7 +322,8 @@
260 322 "likes": 0,
261 323 "createdAt": 1788191432362,
262 324 "promptEn": "woman in white being intimate and alluring",
263   - "lastPlayedAt": 1788251702786
  325 + "lastPlayedAt": 1788255084160,
  326 + "playCount": 1
264 327 },
265 328 {
266 329 "id": "362b15ab1811",
... ... @@ -290,7 +353,8 @@
290 353 "likes": 0,
291 354 "createdAt": 1788191431505,
292 355 "promptEn": "woman in white scared, dodging the question",
293   - "lastPlayedAt": 1788252941314
  356 + "lastPlayedAt": 1788256176464,
  357 + "playCount": 1
294 358 },
295 359 {
296 360 "id": "667978d52305",
... ... @@ -305,7 +369,8 @@
305 369 "likes": 0,
306 370 "createdAt": 1788191431016,
307 371 "promptEn": "woman in white coldly threatening",
308   - "lastPlayedAt": 1788251764831
  372 + "lastPlayedAt": 1788255162198,
  373 + "playCount": 1
309 374 },
310 375 {
311 376 "id": "7f5213748d87",
... ... @@ -334,8 +399,9 @@
334 399 "partition": "ref2va",
335 400 "likes": 0,
336 401 "createdAt": 1788187365789,
337   - "lastPlayedAt": 1788251380546,
338   - "promptEn": "woman in white being gentle and comforting"
  402 + "lastPlayedAt": 1788255462355,
  403 + "promptEn": "woman in white being gentle and comforting",
  404 + "playCount": 1
339 405 },
340 406 {
341 407 "id": "88d71d85058f",
... ... @@ -365,7 +431,8 @@
365 431 "likes": 0,
366 432 "createdAt": 1788185090875,
367 433 "promptEn": "woman in white cold and threatening",
368   - "lastPlayedAt": 1788253487611
  434 + "lastPlayedAt": 1788255142186,
  435 + "playCount": 1
369 436 },
370 437 {
371 438 "id": "a46f1daa9ee0",
... ... @@ -395,7 +462,8 @@
395 462 "likes": 0,
396 463 "createdAt": 1788162094002,
397 464 "promptEn": "woman in old chinese robe talking, gentle but wary, in an old room",
398   - "lastPlayedAt": 1788250690213
  465 + "lastPlayedAt": 1788254868055,
  466 + "playCount": 1
399 467 },
400 468 {
401 469 "id": "e17cfe57f56a",
... ... @@ -455,7 +523,8 @@
455 523 "likes": 0,
456 524 "createdAt": 1788157177505,
457 525 "promptEn": "constable bursts in and blocks the door, talks to a pale woman behind the screen",
458   - "lastPlayedAt": 1788250622191
  526 + "lastPlayedAt": 1788254955075,
  527 + "playCount": 1
459 528 },
460 529 {
461 530 "id": "a9c4ba5e453b",
... ... @@ -470,7 +539,8 @@
470 539 "likes": 0,
471 540 "createdAt": 1788156878022,
472 541 "promptEn": "constable bursts in and blocks the door, talks to a pale woman behind the screen",
473   - "lastPlayedAt": 1788254209972
  542 + "lastPlayedAt": 1788256376724,
  543 + "playCount": 1
474 544 },
475 545 {
476 546 "id": "a0b752e7ac0d",
... ... @@ -485,7 +555,8 @@
485 555 "likes": 0,
486 556 "createdAt": 1788154942596,
487 557 "promptEn": "constable talking, looking scared",
488   - "lastPlayedAt": 1788252145004
  558 + "lastPlayedAt": 1788254919873,
  559 + "playCount": 1
489 560 },
490 561 {
491 562 "id": "b6608e2eac60",
... ... @@ -500,7 +571,8 @@
500 571 "likes": 0,
501 572 "createdAt": 1788153988474,
502 573 "promptEn": "astronaut at a martian canyon, visor reflecting alien ruins, then aerial view of the city",
503   - "lastPlayedAt": 1788253845801
  574 + "lastPlayedAt": 1788256486789,
  575 + "playCount": 1
504 576 },
505 577 {
506 578 "id": "194fc2b56cb5",
... ... @@ -515,7 +587,8 @@
515 587 "likes": 0,
516 588 "createdAt": 1788138492364,
517 589 "promptEn": "astronaut on a Martian canyon, helmet reflecting an alien ruined city",
518   - "lastPlayedAt": 1788253805777
  590 + "lastPlayedAt": 1788255096170,
  591 + "playCount": 1
519 592 },
520 593 {
521 594 "id": "f84b8f044ec5",
... ... @@ -530,7 +603,8 @@
530 603 "likes": 0,
531 604 "createdAt": 1788120171725,
532 605 "promptEn": "constable bursts in and blocks the door, talks to a pale woman behind the screen",
533   - "lastPlayedAt": 1788253571659
  606 + "lastPlayedAt": 1788255758515,
  607 + "playCount": 1
534 608 },
535 609 {
536 610 "id": "5c364152e54c",
... ... @@ -560,7 +634,8 @@
560 634 "likes": 0,
561 635 "createdAt": 1788106707982,
562 636 "promptEn": "constable bursts in and blocks the door, talks to a pale woman behind the screen",
563   - "lastPlayedAt": 1788247638248
  637 + "lastPlayedAt": 1788254838039,
  638 + "playCount": 1
564 639 },
565 640 {
566 641 "id": "1fa40bca47f5",
... ... @@ -575,7 +650,8 @@
575 650 "likes": 0,
576 651 "createdAt": 1788085282201,
577 652 "promptEn": "constable stands still, quietly says he won't make a sound, woman stays silent behind the screen",
578   - "lastPlayedAt": 1788254023891
  653 + "lastPlayedAt": 1788255328296,
  654 + "playCount": 1
579 655 },
580 656 {
581 657 "id": "683ab2fd4681",
... ... @@ -590,7 +666,8 @@
590 666 "likes": 0,
591 667 "createdAt": 1788071067702,
592 668 "promptEn": "constable stands still, quietly says he won't make a sound, woman stays silent behind the screen",
593   - "lastPlayedAt": 1788253999874
  669 + "lastPlayedAt": 1788256078660,
  670 + "playCount": 1
594 671 },
595 672 {
596 673 "id": "2e09fcd3d42c",
... ... @@ -605,7 +682,8 @@
605 682 "likes": 0,
606 683 "createdAt": 1788062322252,
607 684 "promptEn": "constable stands still, quietly says he won't make a sound, woman stays silent behind the screen",
608   - "lastPlayedAt": 1788252491166
  685 + "lastPlayedAt": 1788255426343,
  686 + "playCount": 1
609 687 },
610 688 {
611 689 "id": "12ea9ce00f36",
... ... @@ -680,7 +758,8 @@
680 758 "likes": 0,
681 759 "createdAt": 1788026876886,
682 760 "promptEn": "apartment manager in an eerie corridor, red elevator light flickering, holding out a key",
683   - "lastPlayedAt": 1788253825788
  761 + "lastPlayedAt": 1788255138188,
  762 + "playCount": 1
684 763 },
685 764 {
686 765 "id": "cdd03cca8461",
... ... @@ -695,7 +774,8 @@
695 774 "likes": 0,
696 775 "createdAt": 1788026569422,
697 776 "promptEn": "stitched-face long-haired curse on a subway platform, flickering lights, cruel smile",
698   - "lastPlayedAt": 1788253043365
  777 + "lastPlayedAt": 1788256094667,
  778 + "playCount": 1
699 779 },
700 780 {
701 781 "id": "b8dd0f62f648",
... ... @@ -755,7 +835,8 @@
755 835 "likes": 0,
756 836 "createdAt": 1788026568242,
757 837 "promptEn": "magma commander in a white coat, raising a lava fist on the battlefield",
758   - "lastPlayedAt": 1788254205974
  838 + "lastPlayedAt": 1788256448766,
  839 + "playCount": 1
759 840 },
760 841 {
761 842 "id": "1442013e94f0",
... ... @@ -770,7 +851,8 @@
770 851 "likes": 0,
771 852 "createdAt": 1788026068497,
772 853 "promptEn": "black-haired prince in a red cloak, pressing down an execution order in the trial hall",
773   - "lastPlayedAt": 1788253425586
  854 + "lastPlayedAt": 1788255396328,
  855 + "playCount": 1
774 856 },
775 857 {
776 858 "id": "0a5e37bb328c",
... ... @@ -800,7 +882,8 @@
800 882 "likes": 0,
801 883 "createdAt": 1788025640972,
802 884 "promptEn": "Voldemort in a graveyard, wand raised, stepping closer",
803   - "lastPlayedAt": 1788253469603
  885 + "lastPlayedAt": 1788254858047,
  886 + "playCount": 1
804 887 },
805 888 {
806 889 "id": "c3875fbd6cc4",
... ... @@ -815,7 +898,8 @@
815 898 "likes": 0,
816 899 "createdAt": 1788025632028,
817 900 "promptEn": "a giant mouth embedded in the wall at the end of an endless hotel corridor, slowly opening",
818   - "lastPlayedAt": 1788252701202
  901 + "lastPlayedAt": 1788256138682,
  902 + "playCount": 1
819 903 },
820 904 {
821 905 "id": "1c6e2df243f4",
... ... @@ -830,7 +914,8 @@
830 914 "likes": 0,
831 915 "createdAt": 1788025630249,
832 916 "promptEn": "white-haired villain in a ruined street at night, cracked smile, reaching out a hand",
833   - "lastPlayedAt": 1788251462624
  917 + "lastPlayedAt": 1788254713983,
  918 + "playCount": 1
834 919 },
835 920 {
836 921 "id": "d735f1fc010f",
... ... @@ -845,7 +930,8 @@
845 930 "likes": 0,
846 931 "createdAt": 1788025624377,
847 932 "promptEn": "cat-eared white-haired guard crouching in a ruined palace, purple aura around them",
848   - "lastPlayedAt": 1788252499167
  933 + "lastPlayedAt": 1788255436346,
  934 + "playCount": 1
849 935 },
850 936 {
851 937 "id": "b16b64e52f83",
... ... @@ -860,7 +946,8 @@
860 946 "likes": 0,
861 947 "createdAt": 1788025623833,
862 948 "promptEn": "cat-eared white-haired guard crouching in a ruined palace, purple aura around them",
863   - "lastPlayedAt": 1788253528965
  949 + "lastPlayedAt": 1788255754514,
  950 + "playCount": 1
864 951 },
865 952 {
866 953 "id": "0d721acbc298",
... ... @@ -875,7 +962,8 @@
875 962 "likes": 0,
876 963 "createdAt": 1788025622363,
877 964 "promptEn": "detective in a surveillance room squinting at the monitors",
878   - "lastPlayedAt": 1788253255505
  965 + "lastPlayedAt": 1788256282688,
  966 + "playCount": 1
879 967 },
880 968 {
881 969 "id": "639069dea7c5",
... ... @@ -890,7 +978,8 @@
890 978 "likes": 0,
891 979 "createdAt": 1788025620717,
892 980 "promptEn": "alien tyrant holding a glowing energy sphere, sneering on a rocky green battlefield",
893   - "lastPlayedAt": 1788253757767
  981 + "lastPlayedAt": 1788255248247,
  982 + "playCount": 1
894 983 },
895 984 {
896 985 "id": "9db41d807330",
... ... @@ -935,7 +1024,8 @@
935 1024 "likes": 0,
936 1025 "createdAt": 1788024900966,
937 1026 "promptEn": "player 101 blocking the path on a high glass bridge, threatening you",
938   - "lastPlayedAt": 1788253797782
  1027 + "lastPlayedAt": 1788255958603,
  1028 + "playCount": 1
939 1029 },
940 1030 {
941 1031 "id": "d6aab3fce63d",
... ... @@ -950,7 +1040,8 @@
950 1040 "likes": 0,
951 1041 "createdAt": 1788024747209,
952 1042 "promptEn": "wounded hunter leaning on a subway turnstile, ordering you into the tunnel",
953   - "lastPlayedAt": 1788253507622
  1043 + "lastPlayedAt": 1788255324295,
  1044 + "playCount": 1
954 1045 },
955 1046 {
956 1047 "id": "fdefca4e4980",
... ... @@ -965,7 +1056,8 @@
965 1056 "likes": 0,
966 1057 "createdAt": 1788024491625,
967 1058 "promptEn": "prince signs an execution order in the trial hall, points at the guillotine",
968   - "lastPlayedAt": 1788253737754
  1059 + "lastPlayedAt": 1788255392324,
  1060 + "playCount": 1
969 1061 },
970 1062 {
971 1063 "id": "8a933feb52c4",
... ... @@ -1010,7 +1102,8 @@
1010 1102 "likes": 0,
1011 1103 "createdAt": 1788016434846,
1012 1104 "promptEn": "pirate negotiation, catching Barbossa's flaw and turning the tables",
1013   - "lastPlayedAt": 1788251638752
  1105 + "lastPlayedAt": 1788254979611,
  1106 + "playCount": 1
1014 1107 },
1015 1108 {
1016 1109 "id": "03e32ff5f0ef",
... ... @@ -1040,7 +1133,8 @@
1040 1133 "likes": 0,
1041 1134 "createdAt": 1788015968838,
1042 1135 "promptEn": "pirate negotiation, held the goal but paid a price",
1043   - "lastPlayedAt": 1788249093401
  1136 + "lastPlayedAt": 1788256104663,
  1137 + "playCount": 1
1044 1138 },
1045 1139 {
1046 1140 "id": "b328649000d1",
... ... @@ -1070,7 +1164,8 @@
1070 1164 "likes": 0,
1071 1165 "createdAt": 1788015493445,
1072 1166 "promptEn": "pirate negotiation, went in head-on and Barbossa saw it coming",
1073   - "lastPlayedAt": 1788250790245
  1167 + "lastPlayedAt": 1788256412747,
  1168 + "playCount": 1
1074 1169 },
1075 1170 {
1076 1171 "id": "3f30f5097438",
... ... @@ -1085,7 +1180,8 @@
1085 1180 "likes": 0,
1086 1181 "createdAt": 1788015035234,
1087 1182 "promptEn": "pirate negotiation, stayed passive and got cornered",
1088   - "lastPlayedAt": 1788251632751
  1183 + "lastPlayedAt": 1788255772518,
  1184 + "playCount": 1
1089 1185 },
1090 1186 {
1091 1187 "id": "6a0d14cabe17",
... ... @@ -1100,7 +1196,8 @@
1100 1196 "likes": 0,
1101 1197 "createdAt": 1788014791733,
1102 1198 "promptEn": "pirate negotiation, stayed passive and got cornered",
1103   - "lastPlayedAt": 1788252169019
  1199 + "lastPlayedAt": 1788254585426,
  1200 + "playCount": 1
1104 1201 },
1105 1202 {
1106 1203 "id": "08120928cc77",
... ... @@ -1115,7 +1212,8 @@
1115 1212 "likes": 0,
1116 1213 "createdAt": 1788014790969,
1117 1214 "promptEn": "pirate negotiation, stayed passive and got cornered",
1118   - "lastPlayedAt": 1788253191467
  1215 + "lastPlayedAt": 1788256262677,
  1216 + "playCount": 1
1119 1217 },
1120 1218 {
1121 1219 "id": "e14fe7c3220e",
... ... @@ -1130,7 +1228,8 @@
1130 1228 "likes": 0,
1131 1229 "createdAt": 1788014563344,
1132 1230 "promptEn": "captain's cabin on the Black Pearl, surrounded by pirates, negotiation could turn into an execution",
1133   - "lastPlayedAt": 1788252563192
  1231 + "lastPlayedAt": 1788254910082,
  1232 + "playCount": 1
1134 1233 },
1135 1234 {
1136 1235 "id": "c6e8560f62a2",
... ... @@ -1160,7 +1259,8 @@
1160 1259 "likes": 0,
1161 1260 "createdAt": 1788014099497,
1162 1261 "promptEn": "glass bridge game, exploiting a flaw to push back player 101",
1163   - "lastPlayedAt": 1788251098395
  1262 + "lastPlayedAt": 1788255994616,
  1263 + "playCount": 1
1164 1264 },
1165 1265 {
1166 1266 "id": "24576c264a25",
... ... @@ -1190,7 +1290,8 @@
1190 1290 "likes": 0,
1191 1291 "createdAt": 1788013634333,
1192 1292 "promptEn": "glass bridge game, held the goal but paid a price",
1193   - "lastPlayedAt": 1788254355883
  1293 + "lastPlayedAt": 1788256336707,
  1294 + "playCount": 1
1194 1295 },
1195 1296 {
1196 1297 "id": "5b8ef21616d4",
... ... @@ -1205,7 +1306,8 @@
1205 1306 "likes": 0,
1206 1307 "createdAt": 1788013632065,
1207 1308 "promptEn": "glass bridge game, held the goal but paid a price",
1208   - "lastPlayedAt": 1788252935312
  1309 + "lastPlayedAt": 1788256464777,
  1310 + "playCount": 1
1209 1311 },
1210 1312 {
1211 1313 "id": "892b923eed29",
... ... @@ -1220,7 +1322,8 @@
1220 1322 "likes": 0,
1221 1323 "createdAt": 1788013393463,
1222 1324 "promptEn": "guessed wrong in a survival game, got countered",
1223   - "lastPlayedAt": 1788250071902
  1325 + "lastPlayedAt": 1788256516804,
  1326 + "playCount": 1
1224 1327 },
1225 1328 {
1226 1329 "id": "7880a91928c6",
... ... @@ -1250,7 +1353,8 @@
1250 1353 "likes": 0,
1251 1354 "createdAt": 1788012917294,
1252 1355 "promptEn": "standing on the glass bridge, facing off with player 101",
1253   - "lastPlayedAt": 1788253839798
  1356 + "lastPlayedAt": 1788255356310,
  1357 + "playCount": 1
1254 1358 },
1255 1359 {
1256 1360 "id": "8f23de61904f",
... ... @@ -1265,7 +1369,8 @@
1265 1369 "likes": 0,
1266 1370 "createdAt": 1788012917185,
1267 1371 "promptEn": "standing on the glass bridge, facing off with player 101",
1268   - "lastPlayedAt": 1788250786246
  1372 + "lastPlayedAt": 1788256286703,
  1373 + "playCount": 1
1269 1374 },
1270 1375 {
1271 1376 "id": "bb4a8351d822",
... ... @@ -1280,7 +1385,8 @@
1280 1385 "likes": 0,
1281 1386 "createdAt": 1788012679740,
1282 1387 "promptEn": "in the mental lair, exploiting a flaw to counter Vecna",
1283   - "lastPlayedAt": 1788250124975
  1388 + "lastPlayedAt": 1788255036140,
  1389 + "playCount": 1
1284 1390 },
1285 1391 {
1286 1392 "id": "3913752bbe3a",
... ... @@ -1340,7 +1446,8 @@
1340 1446 "likes": 0,
1341 1447 "createdAt": 1788011964828,
1342 1448 "promptEn": "facing Vecna, stayed passive and got cornered",
1343   - "lastPlayedAt": 1788247774359
  1449 + "lastPlayedAt": 1788254655959,
  1450 + "playCount": 1
1344 1451 },
1345 1452 {
1346 1453 "id": "7161aecafa32",
... ... @@ -1355,7 +1462,8 @@
1355 1462 "likes": 0,
1356 1463 "createdAt": 1788011727444,
1357 1464 "promptEn": "entering Vecna's mental lair, red lightning, twisted space",
1358   - "lastPlayedAt": 1788251520666
  1465 + "lastPlayedAt": 1788254934172,
  1466 + "playCount": 1
1359 1467 },
1360 1468 {
1361 1469 "id": "6a9af7e7368d",
... ... @@ -1370,7 +1478,8 @@
1370 1478 "likes": 0,
1371 1479 "createdAt": 1788011488775,
1372 1480 "promptEn": "graveyard standoff, exploiting a flaw to counter Voldemort",
1373   - "lastPlayedAt": 1788253875818
  1481 + "lastPlayedAt": 1788255500375,
  1482 + "playCount": 1
1374 1483 },
1375 1484 {
1376 1485 "id": "24845be71ea0",
... ... @@ -1385,7 +1494,8 @@
1385 1494 "likes": 0,
1386 1495 "createdAt": 1788011488667,
1387 1496 "promptEn": "graveyard standoff, exploiting a flaw to counter Voldemort",
1388   - "lastPlayedAt": 1788252803254
  1497 + "lastPlayedAt": 1788254960102,
  1498 + "playCount": 1
1389 1499 },
1390 1500 {
1391 1501 "id": "f1012a3d7aa7",
... ... @@ -1415,7 +1525,8 @@
1415 1525 "likes": 0,
1416 1526 "createdAt": 1788011013309,
1417 1527 "promptEn": "facing Voldemort, went in head-on and got seen through",
1418   - "lastPlayedAt": 1788252965327
  1528 + "lastPlayedAt": 1788254930090,
  1529 + "playCount": 1
1419 1530 },
1420 1531 {
1421 1532 "id": "682cbc166479",
... ... @@ -1490,7 +1601,8 @@
1490 1601 "likes": 0,
1491 1602 "createdAt": 1788009825082,
1492 1603 "promptEn": "facing Thanos, went in head-on and got seen through",
1493   - "lastPlayedAt": 1788252393143
  1604 + "lastPlayedAt": 1788256098668,
  1605 + "playCount": 1
1494 1606 },
1495 1607 {
1496 1608 "id": "a6ead2cbe03f",
... ... @@ -1505,7 +1617,8 @@
1505 1617 "likes": 0,
1506 1618 "createdAt": 1788009586293,
1507 1619 "promptEn": "facing Thanos, stayed passive and got cornered",
1508   - "lastPlayedAt": 1788253869815
  1620 + "lastPlayedAt": 1788256306693,
  1621 + "playCount": 1
1509 1622 },
1510 1623 {
1511 1624 "id": "438c98cf4973",
... ... @@ -1535,7 +1648,8 @@
1535 1648 "likes": 0,
1536 1649 "createdAt": 1788009108302,
1537 1650 "promptEn": "in the endless hotel, exploiting a flaw to counter the Eternity Devil",
1538   - "lastPlayedAt": 1788252247056
  1651 + "lastPlayedAt": 1788255052143,
  1652 + "playCount": 1
1539 1653 },
1540 1654 {
1541 1655 "id": "71c590b0ea8f",
... ... @@ -1580,7 +1694,8 @@
1580 1694 "likes": 0,
1581 1695 "createdAt": 1788008394344,
1582 1696 "promptEn": "facing the Eternity Devil, stayed passive and got cornered",
1583   - "lastPlayedAt": 1788252833268
  1697 + "lastPlayedAt": 1788255400330,
  1698 + "playCount": 1
1584 1699 },
1585 1700 {
1586 1701 "id": "1a57de01bad0",
... ... @@ -1640,7 +1755,8 @@
1640 1755 "likes": 0,
1641 1756 "createdAt": 1788007441156,
1642 1757 "promptEn": "battlefield in Jaku city, the city in ruins, heroes in crisis",
1643   - "lastPlayedAt": 1788253771767
  1758 + "lastPlayedAt": 1788256522850,
  1759 + "playCount": 1
1644 1760 },
1645 1761 {
1646 1762 "id": "68219d6b68c8",
... ... @@ -1670,7 +1786,8 @@
1670 1786 "likes": 0,
1671 1787 "createdAt": 1788006964122,
1672 1788 "promptEn": "grabbing an evidence flaw to counter L",
1673   - "lastPlayedAt": 1788253259502
  1789 + "lastPlayedAt": 1788255550395,
  1790 + "playCount": 1
1674 1791 },
1675 1792 {
1676 1793 "id": "0c6306b07f79",
... ... @@ -1685,7 +1802,8 @@
1685 1802 "likes": 0,
1686 1803 "createdAt": 1788006725887,
1687 1804 "promptEn": "facing off with L, went in head-on and got seen through",
1688   - "lastPlayedAt": 1788252617213
  1805 + "lastPlayedAt": 1788255738510,
  1806 + "playCount": 1
1689 1807 },
1690 1808 {
1691 1809 "id": "ee82188227fa",
... ... @@ -1730,7 +1848,8 @@
1730 1848 "likes": 0,
1731 1849 "createdAt": 1788006015175,
1732 1850 "promptEn": "on the ruined planet, exploiting a flaw to counter Frieza",
1733   - "lastPlayedAt": 1788252971329
  1851 + "lastPlayedAt": 1788256212662,
  1852 + "playCount": 1
1734 1853 },
1735 1854 {
1736 1855 "id": "e6fda5c2237d",
... ... @@ -1745,7 +1864,8 @@
1745 1864 "likes": 0,
1746 1865 "createdAt": 1788005778588,
1747 1866 "promptEn": "facing Frieza, held the goal but paid a price",
1748   - "lastPlayedAt": 1788249925828
  1867 + "lastPlayedAt": 1788256090667,
  1868 + "playCount": 1
1749 1869 },
1750 1870 {
1751 1871 "id": "b96cc9762cf6",
... ... @@ -1775,7 +1895,8 @@
1775 1895 "likes": 0,
1776 1896 "createdAt": 1788005305091,
1777 1897 "promptEn": "facing Frieza, stayed passive and got cornered",
1778   - "lastPlayedAt": 1788252623220
  1898 + "lastPlayedAt": 1788254619433,
  1899 + "playCount": 1
1779 1900 },
1780 1901 {
1781 1902 "id": "d680e111ade5",
... ... @@ -1790,7 +1911,8 @@
1790 1911 "likes": 0,
1791 1912 "createdAt": 1788005066484,
1792 1913 "promptEn": "Namek is about to be destroyed, the dragon ball wish still up for grabs",
1793   - "lastPlayedAt": 1788251174432
  1914 + "lastPlayedAt": 1788255118176,
  1915 + "playCount": 1
1794 1916 },
1795 1917 {
1796 1918 "id": "565059763888",
... ... @@ -1820,7 +1942,8 @@
1820 1942 "likes": 0,
1821 1943 "createdAt": 1788004590937,
1822 1944 "promptEn": "facing Mahito, held the goal but paid a price",
1823   - "lastPlayedAt": 1788253015358
  1945 + "lastPlayedAt": 1788255308286,
  1946 + "playCount": 1
1824 1947 },
1825 1948 {
1826 1949 "id": "9996a8ac8326",
... ... @@ -1835,7 +1958,8 @@
1835 1958 "likes": 0,
1836 1959 "createdAt": 1788004353928,
1837 1960 "promptEn": "facing Mahito, went in head-on and got seen through",
1838   - "lastPlayedAt": 1788251822858
  1961 + "lastPlayedAt": 1788256418748,
  1962 + "playCount": 1
1839 1963 },
1840 1964 {
1841 1965 "id": "971d80ec087c",
... ... @@ -1850,7 +1974,8 @@
1850 1974 "likes": 0,
1851 1975 "createdAt": 1788004115725,
1852 1976 "promptEn": "facing Mahito, stayed passive and got cornered",
1853   - "lastPlayedAt": 1788252799252
  1977 + "lastPlayedAt": 1788256356716,
  1978 + "playCount": 1
1854 1979 },
1855 1980 {
1856 1981 "id": "5dd52c568f66",
... ... @@ -1865,7 +1990,8 @@
1865 1990 "likes": 0,
1866 1991 "createdAt": 1788004115612,
1867 1992 "promptEn": "facing Mahito, stayed passive and got cornered",
1868   - "lastPlayedAt": 1788253899831
  1993 + "lastPlayedAt": 1788256128678,
  1994 + "playCount": 1
1869 1995 },
1870 1996 {
1871 1997 "id": "f4a2870386c6",
... ... @@ -1925,7 +2051,8 @@
1925 2051 "likes": 0,
1926 2052 "createdAt": 1788003166117,
1927 2053 "promptEn": "facing Enmu, stayed passive and got cornered",
1928   - "lastPlayedAt": 1788252727219
  2054 + "lastPlayedAt": 1788254595913,
  2055 + "playCount": 1
1929 2056 },
1930 2057 {
1931 2058 "id": "a3f39da74c1f",
... ... @@ -1940,7 +2067,8 @@
1940 2067 "likes": 0,
1941 2068 "createdAt": 1788002929455,
1942 2069 "promptEn": "facing Reiner, exploiting a flaw to counter him",
1943   - "lastPlayedAt": 1788254288010
  2070 + "lastPlayedAt": 1788255768521,
  2071 + "playCount": 1
1944 2072 },
1945 2073 {
1946 2074 "id": "ea8b38014674",
... ... @@ -2000,7 +2128,8 @@
2000 2128 "likes": 0,
2001 2129 "createdAt": 1788001981272,
2002 2130 "promptEn": "basement in Shiganshina, the titan secret weighing down on you",
2003   - "lastPlayedAt": 1788252675244
  2131 + "lastPlayedAt": 1788255694482,
  2132 + "playCount": 1
2004 2133 },
2005 2134 {
2006 2135 "id": "7c2351a27a96",
... ... @@ -2015,7 +2144,8 @@
2015 2144 "likes": 0,
2016 2145 "createdAt": 1788001508988,
2017 2146 "promptEn": "in the ruins of Konoha, exploiting a flaw to counter Pain",
2018   - "lastPlayedAt": 1788253801782
  2147 + "lastPlayedAt": 1788255128181,
  2148 + "playCount": 1
2019 2149 },
2020 2150 {
2021 2151 "id": "79304c061606",
... ... @@ -2045,7 +2175,8 @@
2045 2175 "likes": 0,
2046 2176 "createdAt": 1788001285796,
2047 2177 "promptEn": "in the ruins of Konoha, exploiting a flaw to counter Pain",
2048   - "lastPlayedAt": 1788253477606
  2178 + "lastPlayedAt": 1788255410335,
  2179 + "playCount": 1
2049 2180 },
2050 2181 {
2051 2182 "id": "808e89ca06a4",
... ... @@ -2060,7 +2191,8 @@
2060 2191 "likes": 0,
2061 2192 "createdAt": 1788001049233,
2062 2193 "promptEn": "facing Pain, held the goal but paid a price",
2063   - "lastPlayedAt": 1788254115931
  2194 + "lastPlayedAt": 1788255476364,
  2195 + "playCount": 1
2064 2196 },
2065 2197 {
2066 2198 "id": "7ecd480a3c31",
... ... @@ -2090,7 +2222,8 @@
2090 2222 "likes": 0,
2091 2223 "createdAt": 1788000577474,
2092 2224 "promptEn": "facing Pain, stayed passive and got cornered",
2093   - "lastPlayedAt": 1788253009344
  2225 + "lastPlayedAt": 1788255208219,
  2226 + "playCount": 1
2094 2227 },
2095 2228 {
2096 2229 "id": "5ef9489bdc5b",
... ... @@ -2105,7 +2238,8 @@
2105 2238 "likes": 0,
2106 2239 "createdAt": 1788000341927,
2107 2240 "promptEn": "Konoha destroyed by Shinra Tensei, Pain declaring order in the ruins",
2108   - "lastPlayedAt": 1788253434714
  2241 + "lastPlayedAt": 1788255484369,
  2242 + "playCount": 1
2109 2243 },
2110 2244 {
2111 2245 "id": "e245dbcc6d36",
... ... @@ -2120,7 +2254,8 @@
2120 2254 "likes": 0,
2121 2255 "createdAt": 1788000105889,
2122 2256 "promptEn": "facing Sakazuki, exploiting a flaw to counter him",
2123   - "lastPlayedAt": 1788253821783
  2257 + "lastPlayedAt": 1788255314291,
  2258 + "playCount": 1
2124 2259 },
2125 2260 {
2126 2261 "id": "c9be7c07b793",
... ... @@ -2135,7 +2270,8 @@
2135 2270 "likes": 0,
2136 2271 "createdAt": 1787999869694,
2137 2272 "promptEn": "facing Sakazuki, held the goal but paid a price",
2138   - "lastPlayedAt": 1788251688777
  2273 + "lastPlayedAt": 1788255056146,
  2274 + "playCount": 1
2139 2275 },
2140 2276 {
2141 2277 "id": "677941e683c4",
... ... @@ -2150,7 +2286,8 @@
2150 2286 "likes": 0,
2151 2287 "createdAt": 1787999633745,
2152 2288 "promptEn": "facing Sakazuki, went in head-on and got seen through",
2153   - "lastPlayedAt": 1788251912902
  2289 + "lastPlayedAt": 1788255042142,
  2290 + "playCount": 1
2154 2291 },
2155 2292 {
2156 2293 "id": "932d15f7f8bd",
... ... @@ -2165,7 +2302,8 @@
2165 2302 "likes": 0,
2166 2303 "createdAt": 1787999633670,
2167 2304 "promptEn": "facing Sakazuki, went in head-on and got seen through",
2168   - "lastPlayedAt": 1788253777771
  2305 + "lastPlayedAt": 1788255204217,
  2306 + "playCount": 1
2169 2307 },
2170 2308 {
2171 2309 "id": "a8b8b4430ee3",
... ... @@ -2195,7 +2333,8 @@
2195 2333 "likes": 0,
2196 2334 "createdAt": 1787999161013,
2197 2335 "promptEn": "execution platform at Marineford, Ace about to be executed, navy vs pirates",
2198   - "lastPlayedAt": 1788253025350
  2336 + "lastPlayedAt": 1788254924211,
  2337 + "playCount": 1
2199 2338 },
2200 2339 {
2201 2340 "id": "00476b62bf75",
... ... @@ -2210,7 +2349,8 @@
2210 2349 "likes": 0,
2211 2350 "createdAt": 1787903583872,
2212 2351 "promptEn": "constable asks if she's always been alone here, she doesn't answer",
2213   - "lastPlayedAt": 1788253047365
  2352 + "lastPlayedAt": 1788255504379,
  2353 + "playCount": 1
2214 2354 },
2215 2355 {
2216 2356 "id": "2ab2094e5679",
... ... @@ -2240,7 +2380,8 @@
2240 2380 "likes": 0,
2241 2381 "createdAt": 1787850191899,
2242 2382 "promptEn": "constable reaches out to touch her hand through the screen gap, no response",
2243   - "lastPlayedAt": 1788251708784
  2383 + "lastPlayedAt": 1788255918582,
  2384 + "playCount": 1
2244 2385 },
2245 2386 {
2246 2387 "id": "9bd8c9fbf1f6",
... ... @@ -2255,7 +2396,8 @@
2255 2396 "likes": 0,
2256 2397 "createdAt": 1787847447661,
2257 2398 "promptEn": "constable tells the woman behind the screen he'll trust her tonight",
2258   - "lastPlayedAt": 1788253581662
  2399 + "lastPlayedAt": 1788256396733,
  2400 + "playCount": 1
2259 2401 },
2260 2402 {
2261 2403 "id": "8cb493338cb3",
... ... @@ -2285,7 +2427,8 @@
2285 2427 "likes": 0,
2286 2428 "createdAt": 1787762342686,
2287 2429 "promptEn": "woman tells him from behind the screen to go check outside, he steps out warily",
2288   - "lastPlayedAt": 1788250091902
  2430 + "lastPlayedAt": 1788255062148,
  2431 + "playCount": 1
2289 2432 },
2290 2433 {
2291 2434 "id": "47a6de809c61",
... ... @@ -2300,7 +2443,8 @@
2300 2443 "likes": 0,
2301 2444 "createdAt": 1787762332289,
2302 2445 "promptEn": "woman behind the screen stirs and softly reassures him",
2303   - "lastPlayedAt": 1788251932913
  2446 + "lastPlayedAt": 1788255220228,
  2447 + "playCount": 1
2304 2448 },
2305 2449 {
2306 2450 "id": "0abf6e529c92",
... ... @@ -2330,7 +2474,8 @@
2330 2474 "likes": 0,
2331 2475 "createdAt": 1787762286261,
2332 2476 "promptEn": "constable stares at her through the screen, silent, saying nothing",
2333   - "lastPlayedAt": 1788251618745
  2477 + "lastPlayedAt": 1788256182461,
  2478 + "playCount": 1
2334 2479 },
2335 2480 {
2336 2481 "id": "59711a102e84",
... ... @@ -2345,7 +2490,8 @@
2345 2490 "likes": 0,
2346 2491 "createdAt": 1787762224218,
2347 2492 "promptEn": "constable stands under the lamp, holding her gaze through the screen, not backing away",
2348   - "lastPlayedAt": 1788253631690
  2493 + "lastPlayedAt": 1788254940098,
  2494 + "playCount": 1
2349 2495 },
2350 2496 {
2351 2497 "id": "f2e70205766b",
... ... @@ -2375,7 +2521,8 @@
2375 2521 "likes": 0,
2376 2522 "createdAt": 1787730413689,
2377 2523 "promptEn": "constable grabs the oil lamp and hurls it at the portrait, the scroll catches fire",
2378   - "lastPlayedAt": 1788253556971
  2524 + "lastPlayedAt": 1788255020134,
  2525 + "playCount": 1
2379 2526 },
2380 2527 {
2381 2528 "id": "e6c23c6adc42",
... ... @@ -2405,7 +2552,8 @@
2405 2552 "likes": 0,
2406 2553 "createdAt": 1787730331663,
2407 2554 "promptEn": "constable steps in from the rainy night, spots her, introduces himself with a cover story",
2408   - "lastPlayedAt": 1788253781772
  2555 + "lastPlayedAt": 1788256000614,
  2556 + "playCount": 1
2409 2557 },
2410 2558 {
2411 2559 "id": "84e8337de242",
... ... @@ -2420,7 +2568,8 @@
2420 2568 "likes": 0,
2421 2569 "createdAt": 1787724313620,
2422 2570 "promptEn": "first-person view bursting into the room, glancing back in fear, the woman startled",
2423   - "lastPlayedAt": 1788252843270
  2571 + "lastPlayedAt": 1788254753999,
  2572 + "playCount": 1
2424 2573 },
2425 2574 {
2426 2575 "id": "81b6c3789111",
... ... @@ -2435,7 +2584,8 @@
2435 2584 "likes": 0,
2436 2585 "createdAt": 1787708713767,
2437 2586 "promptEn": "constable stops looking around, turns to face the screen, speaks to her silhouette",
2438   - "lastPlayedAt": 1788254322029
  2587 + "lastPlayedAt": 1788255720502,
  2588 + "playCount": 1
2439 2589 },
2440 2590 {
2441 2591 "id": "5dc95a15cd5d",
... ... @@ -2450,7 +2600,8 @@
2450 2600 "likes": 0,
2451 2601 "createdAt": 1787708701547,
2452 2602 "promptEn": "constable gently tells her he'll stay and keep her company",
2453   - "lastPlayedAt": 1788252873286
  2603 + "lastPlayedAt": 1788255778520,
  2604 + "playCount": 1
2454 2605 },
2455 2606 {
2456 2607 "id": "8d9c1dad041f",
... ... @@ -2480,7 +2631,8 @@
2480 2631 "likes": 0,
2481 2632 "createdAt": 1787708684658,
2482 2633 "promptEn": "constable sees her silent gesture, lets go of his sword hilt, steps closer and agrees",
2483   - "lastPlayedAt": 1788251970926
  2634 + "lastPlayedAt": 1788254641958,
  2635 + "playCount": 1
2484 2636 },
2485 2637 {
2486 2638 "id": "abdbe25f3121",
... ... @@ -2495,7 +2647,8 @@
2495 2647 "likes": 0,
2496 2648 "createdAt": 1787708674508,
2497 2649 "promptEn": "constable sees through her painted disguise and rips her face off, revealing a demonic visage underneath",
2498   - "lastPlayedAt": 1788252661239
  2650 + "lastPlayedAt": 1788254693983,
  2651 + "playCount": 1
2499 2652 },
2500 2653 {
2501 2654 "id": "6d433dcc104c",
... ... @@ -2510,7 +2663,8 @@
2510 2663 "likes": 0,
2511 2664 "createdAt": 1787708663418,
2512 2665 "promptEn": "constable catches his breath, thanks her, and rests on the couch while she watches",
2513   - "lastPlayedAt": 1788253353548
  2666 + "lastPlayedAt": 1788256266678,
  2667 + "playCount": 1
2514 2668 },
2515 2669 {
2516 2670 "id": "cd22c2b491fc",
... ... @@ -2540,7 +2694,8 @@
2540 2694 "likes": 0,
2541 2695 "createdAt": 1787708648409,
2542 2696 "promptEn": "she reaches a hand through the screen gap beckoning him, he steps back and firmly refuses",
2543   - "lastPlayedAt": 1788254125936
  2697 + "lastPlayedAt": 1788256362719,
  2698 + "playCount": 1
2544 2699 },
2545 2700 {
2546 2701 "id": "3f0c28f5373a",
... ... @@ -2555,7 +2710,8 @@
2555 2710 "likes": 0,
2556 2711 "createdAt": 1787708646888,
2557 2712 "promptEn": "constable studies her through the screen growing suspicious, hand drifting to his sword",
2558   - "lastPlayedAt": 1788253697730
  2713 + "lastPlayedAt": 1788255522386,
  2714 + "playCount": 1
2559 2715 },
2560 2716 {
2561 2717 "id": "1c0c203cfb3b",
... ... @@ -2570,7 +2726,8 @@
2570 2726 "likes": 0,
2571 2727 "createdAt": 1787708641782,
2572 2728 "promptEn": "constable sits down at the table, studying her expression through the screen",
2573   - "lastPlayedAt": 1788252435140
  2729 + "lastPlayedAt": 1788255934591,
  2730 + "playCount": 1
2574 2731 },
2575 2732 {
2576 2733 "id": "89975be9def4",
... ... @@ -2585,7 +2742,8 @@
2585 2742 "likes": 0,
2586 2743 "createdAt": 1787708626228,
2587 2744 "promptEn": "constable drinks some water first, thanks her, watching the screen warily as he drinks",
2588   - "lastPlayedAt": 1788253265514
  2745 + "lastPlayedAt": 1788254986119,
  2746 + "playCount": 1
2589 2747 },
2590 2748 {
2591 2749 "id": "e08f7f7e54dd",
... ... @@ -2600,7 +2758,8 @@
2600 2758 "likes": 0,
2601 2759 "createdAt": 1787708622306,
2602 2760 "promptEn": "constable gives a clasped-hand salute and thanks her, she gives a subtle nod",
2603   - "lastPlayedAt": 1788250263997
  2761 + "lastPlayedAt": 1788256382726,
  2762 + "playCount": 1
2604 2763 },
2605 2764 {
2606 2765 "id": "538dc7e5746f",
... ... @@ -2615,7 +2774,8 @@
2615 2774 "likes": 0,
2616 2775 "createdAt": 1787708622178,
2617 2776 "promptEn": "constable gives a clasped-hand salute and thanks her, she gives a subtle nod",
2618   - "lastPlayedAt": 1788253057370
  2777 + "lastPlayedAt": 1788256532860,
  2778 + "playCount": 1
2619 2779 },
2620 2780 {
2621 2781 "id": "1721c75dbc3b",
... ... @@ -2630,7 +2790,8 @@
2630 2790 "likes": 0,
2631 2791 "createdAt": 1787708615415,
2632 2792 "promptEn": "she slides her hand through the screen gap asking him to warm it, he hesitates without touching",
2633   - "lastPlayedAt": 1788252911303
  2793 + "lastPlayedAt": 1788254789321,
  2794 + "playCount": 1
2634 2795 },
2635 2796 {
2636 2797 "id": "c2b145b111e2",
... ... @@ -2645,7 +2806,8 @@
2645 2806 "likes": 0,
2646 2807 "createdAt": 1787708613364,
2647 2808 "promptEn": "constable steps in, notices her behind the screen, greets her, she just watches silently",
2648   - "lastPlayedAt": 1788252945316
  2809 + "lastPlayedAt": 1788254723988,
  2810 + "playCount": 1
2649 2811 },
2650 2812 {
2651 2813 "id": "a5d5d353bbf8",
... ... @@ -2660,7 +2822,8 @@
2660 2822 "likes": 0,
2661 2823 "createdAt": 1787674768144,
2662 2824 "promptEn": "constable lifts a bronze mirror, reflecting candlelight onto the portrait on the wall",
2663   - "lastPlayedAt": 1788251856874
  2825 + "lastPlayedAt": 1788255968600,
  2826 + "playCount": 1
2664 2827 },
2665 2828 {
2666 2829 "id": "3be1f275fde2",
... ... @@ -2675,7 +2838,8 @@
2675 2838 "likes": 0,
2676 2839 "createdAt": 1787674743188,
2677 2840 "promptEn": "constable draws his sword and breaks the sealed talisman on the screen, revealing her behind it",
2678   - "lastPlayedAt": 1788252539184
  2841 + "lastPlayedAt": 1788255174203,
  2842 + "playCount": 1
2679 2843 },
2680 2844 {
2681 2845 "id": "693e0b9ca66a",
... ... @@ -2705,7 +2869,8 @@
2705 2869 "likes": 0,
2706 2870 "createdAt": 1787674716075,
2707 2871 "promptEn": "constable watches the oil lamp flame flicker, her silhouette motionless behind the screen",
2708   - "lastPlayedAt": 1788251352521
  2872 + "lastPlayedAt": 1788255706491,
  2873 + "playCount": 1
2709 2874 },
2710 2875 {
2711 2876 "id": "23d1ae1982e6",
... ... @@ -2720,7 +2885,8 @@
2720 2885 "likes": 0,
2721 2886 "createdAt": 1787674713724,
2722 2887 "promptEn": "constable enters and cautiously looks around, his gaze settling on her silhouette behind the screen",
2723   - "lastPlayedAt": 1788252056963
  2888 + "lastPlayedAt": 1788254882052,
  2889 + "playCount": 1
2724 2890 },
2725 2891 {
2726 2892 "id": "b69389094416",
... ... @@ -2735,7 +2901,8 @@
2735 2901 "likes": 0,
2736 2902 "createdAt": 1787674695703,
2737 2903 "promptEn": "constable stops, faces the screen, quietly promises to keep his voice down",
2738   - "lastPlayedAt": 1788252743222
  2904 + "lastPlayedAt": 1788254661960,
  2905 + "playCount": 1
2739 2906 },
2740 2907 {
2741 2908 "id": "94dc455e26bf",
... ... @@ -2750,7 +2917,8 @@
2750 2917 "likes": 0,
2751 2918 "createdAt": 1787674688717,
2752 2919 "promptEn": "constable agrees to stay, lets his guard down, she gives a barely-there nod",
2753   - "lastPlayedAt": 1788254161950
  2920 + "lastPlayedAt": 1788256144453,
  2921 + "playCount": 1
2754 2922 },
2755 2923 {
2756 2924 "id": "4874fe3fdbc9",
... ... @@ -2780,7 +2948,8 @@
2780 2948 "likes": 0,
2781 2949 "createdAt": 1787674642139,
2782 2950 "promptEn": "constable forms hand seals and summons a giant toad out of smoke",
2783   - "lastPlayedAt": 1788254251995
  2951 + "lastPlayedAt": 1788256216659,
  2952 + "playCount": 1
2784 2953 },
2785 2954 {
2786 2955 "id": "e9a6320e18a9",
... ... @@ -2810,7 +2979,8 @@
2810 2979 "likes": 0,
2811 2980 "createdAt": 1787674639055,
2812 2981 "promptEn": "constable checks his reflection in the mirror, sees her behind his shoulder in it, turns around to find the screen empty",
2813   - "lastPlayedAt": 1788253073377
  2982 + "lastPlayedAt": 1788255000140,
  2983 + "playCount": 1
2814 2984 },
2815 2985 {
2816 2986 "id": "ebaf0dde3d9f",
... ... @@ -2825,7 +2995,8 @@
2825 2995 "likes": 0,
2826 2996 "createdAt": 1787674623678,
2827 2997 "promptEn": "constable bows to the screen, thanking her for sheltering him",
2828   - "lastPlayedAt": 1788253536965
  2998 + "lastPlayedAt": 1788254739995,
  2999 + "playCount": 1
2829 3000 },
2830 3001 {
2831 3002 "id": "d94991a1e21b",
... ... @@ -2840,7 +3011,8 @@
2840 3011 "likes": 0,
2841 3012 "createdAt": 1787674609636,
2842 3013 "promptEn": "constable silently watches her through the screen gaps, camera slowly zooming in on her face",
2843   - "lastPlayedAt": 1788253983858
  3014 + "lastPlayedAt": 1788256196466,
  3015 + "playCount": 1
2844 3016 },
2845 3017 {
2846 3018 "id": "5e53f7f5fe9b",
... ... @@ -2855,7 +3027,8 @@
2855 3027 "likes": 0,
2856 3028 "createdAt": 1787674446841,
2857 3029 "promptEn": "player panics into the room, glances back, out of breath, says something's chasing him outside",
2858   - "lastPlayedAt": 1788254185961
  3030 + "lastPlayedAt": 1788256062650,
  3031 + "playCount": 1
2859 3032 },
2860 3033 {
2861 3034 "id": "c25d53a5e086",
... ... @@ -2885,7 +3058,8 @@
2885 3058 "likes": 0,
2886 3059 "createdAt": 1787674361187,
2887 3060 "promptEn": "constable presses his hand to his chest, vowing his heart to her, she gives a knowing smile",
2888   - "lastPlayedAt": 1788252451148
  3061 + "lastPlayedAt": 1788254774002,
  3062 + "playCount": 1
2889 3063 },
2890 3064 {
2891 3065 "id": "8aba0a6bf05b",
... ... @@ -2900,7 +3074,8 @@
2900 3074 "likes": 0,
2901 3075 "createdAt": 1787674351536,
2902 3076 "promptEn": "constable searches an old house at night, candle flickering, woman hiding behind the screen",
2903   - "lastPlayedAt": 1788253615680
  3077 + "lastPlayedAt": 1788255680474,
  3078 + "playCount": 1
2904 3079 },
2905 3080 {
2906 3081 "id": "dc13e4f165dc",
... ... @@ -2930,7 +3105,8 @@
2930 3105 "likes": 0,
2931 3106 "createdAt": 1787665100787,
2932 3107 "promptEn": "constable politely asks the woman behind the screen for tea",
2933   - "lastPlayedAt": 1788253439598
  3108 + "lastPlayedAt": 1788254709984,
  3109 + "playCount": 1
2934 3110 },
2935 3111 {
2936 3112 "id": "d2c77b87b84b",
... ... @@ -2960,7 +3136,8 @@
2960 3136 "likes": 0,
2961 3137 "createdAt": 1787642579766,
2962 3138 "promptEn": "a summoner chants and calls a giant toad, which swallows the white-robed ghost whole",
2963   - "lastPlayedAt": 1788253597668
  3139 + "lastPlayedAt": 1788256502800,
  3140 + "playCount": 1
2964 3141 },
2965 3142 {
2966 3143 "id": "22a666455198",
... ... @@ -2989,8 +3166,9 @@
2989 3166 "partition": "ref2va",
2990 3167 "likes": 0,
2991 3168 "createdAt": 1787639957338,
2992   - "lastPlayedAt": 1788251344514,
2993   - "promptEn": "constable talking to the woman through the screen"
  3169 + "lastPlayedAt": 1788254613432,
  3170 + "promptEn": "constable talking to the woman through the screen",
  3171 + "playCount": 1
2994 3172 },
2995 3173 {
2996 3174 "id": "9f9638cb5b62",
... ... @@ -3020,7 +3198,8 @@
3020 3198 "likes": 0,
3021 3199 "createdAt": 1787635935502,
3022 3200 "promptEn": "constable bursts in panicked, spots the woman behind the screen",
3023   - "lastPlayedAt": 1788250520137
  3201 + "lastPlayedAt": 1788255092168,
  3202 + "playCount": 1
3024 3203 },
3025 3204 {
3026 3205 "id": "b32769bf80db",
... ... @@ -3035,7 +3214,8 @@
3035 3214 "likes": 0,
3036 3215 "createdAt": 1787632587351,
3037 3216 "promptEn": "constable bursts in panicked, spots the woman behind the screen",
3038   - "lastPlayedAt": 1788250612184
  3217 + "lastPlayedAt": 1788255382318,
  3218 + "playCount": 1
3039 3219 },
3040 3220 {
3041 3221 "id": "282281777d1b",
... ... @@ -3050,7 +3230,8 @@
3050 3230 "likes": 0,
3051 3231 "createdAt": 1787615243753,
3052 3232 "promptEn": "robot arm picks up a red block and puts it down",
3053   - "lastPlayedAt": 1788251258468
  3233 + "lastPlayedAt": 1788254681970,
  3234 + "playCount": 1
3054 3235 },
3055 3236 {
3056 3237 "id": "d040eec16a88",
... ... @@ -3065,7 +3246,8 @@
3065 3246 "likes": 0,
3066 3247 "createdAt": 1787615242602,
3067 3248 "promptEn": "otome game male lead showcase PV",
3068   - "lastPlayedAt": 1788251108401
  3249 + "lastPlayedAt": 1788256248669,
  3250 + "playCount": 1
3069 3251 },
3070 3252 {
3071 3253 "id": "423a20afba5a",
... ... @@ -3080,7 +3262,8 @@
3080 3262 "likes": 0,
3081 3263 "createdAt": 1787615241814,
3082 3264 "promptEn": "xianxia character turning, only back and side profile shown",
3083   - "lastPlayedAt": 1788253329541
  3265 + "lastPlayedAt": 1788256310695,
  3266 + "playCount": 1
3084 3267 },
3085 3268 {
3086 3269 "id": "1a398591663e",
... ... @@ -3155,7 +3338,8 @@
3155 3338 "likes": 0,
3156 3339 "createdAt": 1787588545243,
3157 3340 "promptEn": "ergonomic office chair 360 showcase ad",
3158   - "lastPlayedAt": 1788253031360
  3341 + "lastPlayedAt": 1788256232664,
  3342 + "playCount": 1
3159 3343 },
3160 3344 {
3161 3345 "id": "b0d258352c3c",
... ... @@ -3170,7 +3354,8 @@
3170 3354 "likes": 0,
3171 3355 "createdAt": 1787588544667,
3172 3356 "promptEn": "white studio shoot, two models wearing futuristic glasses",
3173   - "lastPlayedAt": 1788248729194
  3357 + "lastPlayedAt": 1788255666469,
  3358 + "playCount": 1
3174 3359 },
3175 3360 {
3176 3361 "id": "71a4d093aebc",
... ... @@ -3215,7 +3400,8 @@
3215 3400 "likes": 0,
3216 3401 "createdAt": 1787588542968,
3217 3402 "promptEn": "mystery crime title sequence, collage split-screen credits",
3218   - "lastPlayedAt": 1788251444607
  3403 + "lastPlayedAt": 1788255236243,
  3404 + "playCount": 1
3219 3405 },
3220 3406 {
3221 3407 "id": "67ababbea78f",
... ... @@ -3230,7 +3416,8 @@
3230 3416 "likes": 0,
3231 3417 "createdAt": 1787588542426,
3232 3418 "promptEn": "fashion guy in sunglasses and coat by a fire",
3233   - "lastPlayedAt": 1788250364064
  3419 + "lastPlayedAt": 1788255510380,
  3420 + "playCount": 1
3234 3421 },
3235 3422 {
3236 3423 "id": "c1237b599bf4",
... ... @@ -3260,7 +3447,8 @@
3260 3447 "likes": 0,
3261 3448 "createdAt": 1787588541164,
3262 3449 "promptEn": "tiny silhouette before a huge cosmic gate, title fades in",
3263   - "lastPlayedAt": 1788252110986
  3450 + "lastPlayedAt": 1788255982612,
  3451 + "playCount": 1
3264 3452 },
3265 3453 {
3266 3454 "id": "5cc09dcdf470",
... ... @@ -3275,7 +3463,8 @@
3275 3463 "likes": 0,
3276 3464 "createdAt": 1787588540642,
3277 3465 "promptEn": "telescope view searching for a MiniMax device, fashionable passerby",
3278   - "lastPlayedAt": 1788250804249
  3466 + "lastPlayedAt": 1788256452766,
  3467 + "playCount": 1
3279 3468 },
3280 3469 {
3281 3470 "id": "a59cae01ec39",
... ... @@ -3290,7 +3479,8 @@
3290 3479 "likes": 0,
3291 3480 "createdAt": 1787588540567,
3292 3481 "promptEn": "telescope view searching for a MiniMax device",
3293   - "lastPlayedAt": 1788253197469
  3482 + "lastPlayedAt": 1788254623432,
  3483 + "playCount": 1
3294 3484 },
3295 3485 {
3296 3486 "id": "ba8c0758e5b4",
... ... @@ -3320,7 +3510,8 @@
3320 3510 "likes": 0,
3321 3511 "createdAt": 1787577878370,
3322 3512 "promptEn": "man barges into the old house apologizing, woman in white behind the screen",
3323   - "lastPlayedAt": 1788253661702
  3513 + "lastPlayedAt": 1788255748510,
  3514 + "playCount": 1
3324 3515 },
3325 3516 {
3326 3517 "id": "0e75ef71c3d0",
... ... @@ -3335,7 +3526,8 @@
3335 3526 "likes": 0,
3336 3527 "createdAt": 1787577088842,
3337 3528 "promptEn": "man thanks the woman for taking him in, behind the screen",
3338   - "lastPlayedAt": 1788252705203
  3529 + "lastPlayedAt": 1788256134682,
  3530 + "playCount": 1
3339 3531 },
3340 3532 {
3341 3533 "id": "e656777b6eef",
... ... @@ -3350,7 +3542,8 @@
3350 3542 "likes": 0,
3351 3543 "createdAt": 1787577088778,
3352 3544 "promptEn": "man thanks the woman for taking him in",
3353   - "lastPlayedAt": 1788253473612
  3545 + "lastPlayedAt": 1788255122181,
  3546 + "playCount": 1
3354 3547 },
3355 3548 {
3356 3549 "id": "8d0270466c35",
... ... @@ -3365,7 +3558,8 @@
3365 3558 "likes": 0,
3366 3559 "createdAt": 1787576943673,
3367 3560 "promptEn": "man lowers his voice like she said, checks the door, window and lamp",
3368   - "lastPlayedAt": 1788253482789
  3561 + "lastPlayedAt": 1788255386322,
  3562 + "playCount": 1
3369 3563 },
3370 3564 {
3371 3565 "id": "396de15c1439",
... ... @@ -3410,7 +3604,8 @@
3410 3604 "likes": 0,
3411 3605 "createdAt": 1787576651668,
3412 3606 "promptEn": "man silently looks at her, doesn't respond",
3413   - "lastPlayedAt": 1788251536684
  3607 + "lastPlayedAt": 1788256326705,
  3608 + "playCount": 1
3414 3609 },
3415 3610 {
3416 3611 "id": "5958b86ab8f4",
... ... @@ -3424,8 +3619,9 @@
3424 3619 "partition": "text",
3425 3620 "likes": 0,
3426 3621 "createdAt": 1787576506447,
3427   - "lastPlayedAt": 1788250053889,
3428   - "promptEn": "man does as she says but stays on guard"
  3622 + "lastPlayedAt": 1788256244668,
  3623 + "promptEn": "man does as she says but stays on guard",
  3624 + "playCount": 1
3429 3625 },
3430 3626 {
3431 3627 "id": "dd69b54fb2ce",
... ... @@ -3500,7 +3696,8 @@
3500 3696 "likes": 0,
3501 3697 "createdAt": 1787575164766,
3502 3698 "promptEn": "man apologizes, says something outside was chasing him",
3503   - "lastPlayedAt": 1788251998941
  3699 + "lastPlayedAt": 1788255420339,
  3700 + "playCount": 1
3504 3701 },
3505 3702 {
3506 3703 "id": "fb3000701384",
... ... @@ -3515,7 +3712,8 @@
3515 3712 "likes": 0,
3516 3713 "createdAt": 1787573698485,
3517 3714 "promptEn": "underground rap duo freestyling at the camera",
3518   - "lastPlayedAt": 1788254075916
  3715 + "lastPlayedAt": 1788256114676,
  3716 + "playCount": 1
3519 3717 },
3520 3718 {
3521 3719 "id": "e5246eae814e",
... ... @@ -3530,7 +3728,8 @@
3530 3728 "likes": 0,
3531 3729 "createdAt": 1787569314178,
3532 3730 "promptEn": "man apologizes, says something outside was chasing him",
3533   - "lastPlayedAt": 1788252793246
  3731 + "lastPlayedAt": 1788255430342,
  3732 + "playCount": 1
3534 3733 },
3535 3734 {
3536 3735 "id": "a0d7a106b8d6",
... ... @@ -3544,8 +3743,9 @@
3544 3743 "partition": "text",
3545 3744 "likes": 0,
3546 3745 "createdAt": 1787568512602,
3547   - "lastPlayedAt": 1788254065909,
3548   - "promptEn": "man apologizes, says something outside was chasing him"
  3746 + "lastPlayedAt": 1788255488369,
  3747 + "promptEn": "man apologizes, says something outside was chasing him",
  3748 + "playCount": 1
3549 3749 },
3550 3750 {
3551 3751 "id": "d71c09a38248",
... ... @@ -3559,8 +3759,9 @@
3559 3759 "partition": "ref2va",
3560 3760 "likes": 0,
3561 3761 "createdAt": 1787559156410,
3562   - "lastPlayedAt": 1788251306490,
3563   - "promptEn": "two characters sitting, game menu UI swaps in a mechanical arm"
  3762 + "lastPlayedAt": 1788254804016,
  3763 + "promptEn": "two characters sitting, game menu UI swaps in a mechanical arm",
  3764 + "playCount": 1
3564 3765 },
3565 3766 {
3566 3767 "id": "87c065ab0f98",
... ... @@ -3575,7 +3776,8 @@
3575 3776 "likes": 0,
3576 3777 "createdAt": 1787542770522,
3577 3778 "promptEn": "clip cut to match a reference video's editing rhythm",
3578   - "lastPlayedAt": 1788251906899
  3779 + "lastPlayedAt": 1788255166199,
  3780 + "playCount": 1
3579 3781 },
3580 3782 {
3581 3783 "id": "f9286d694bad",
... ... @@ -3590,7 +3792,8 @@
3590 3792 "likes": 0,
3591 3793 "createdAt": 1787497396594,
3592 3794 "promptEn": "otome game male lead showcase PV",
3593   - "lastPlayedAt": 1788253932562
  3795 + "lastPlayedAt": 1788255340303,
  3796 + "playCount": 1
3594 3797 },
3595 3798 {
3596 3799 "id": "36ac12f2f29e",
... ... @@ -3605,7 +3808,8 @@
3605 3808 "likes": 0,
3606 3809 "createdAt": 1787493339415,
3607 3810 "promptEn": "game menu UI, character swaps out a mechanical arm",
3608   - "lastPlayedAt": 1788252205054
  3811 + "lastPlayedAt": 1788255294279,
  3812 + "playCount": 1
3609 3813 },
3610 3814 {
3611 3815 "id": "656c897b04fc",
... ... @@ -3620,7 +3824,8 @@
3620 3824 "likes": 0,
3621 3825 "createdAt": 1787493303602,
3622 3826 "promptEn": "game menu UI, character swaps out a mechanical arm",
3623   - "lastPlayedAt": 1788253767768
  3827 + "lastPlayedAt": 1788256526857,
  3828 + "playCount": 1
3624 3829 },
3625 3830 {
3626 3831 "id": "e1fd99e4ab97",
... ... @@ -3650,7 +3855,8 @@
3650 3855 "likes": 0,
3651 3856 "createdAt": 1787470101693,
3652 3857 "promptEn": "black-background product-launch style shot of a roast duck",
3653   - "lastPlayedAt": 1788251246462
  3858 + "lastPlayedAt": 1788254601425,
  3859 + "playCount": 1
3654 3860 },
3655 3861 {
3656 3862 "id": "99e771bbb50d",
... ... @@ -3665,7 +3871,8 @@
3665 3871 "likes": 0,
3666 3872 "createdAt": 1787470101411,
3667 3873 "promptEn": "vertical family-fight drama, arguing with an older woman",
3668   - "lastPlayedAt": 1788254011880
  3874 + "lastPlayedAt": 1788256158453,
  3875 + "playCount": 1
3669 3876 },
3670 3877 {
3671 3878 "id": "57169e6751d0",
... ... @@ -3695,7 +3902,8 @@
3695 3902 "likes": 0,
3696 3903 "createdAt": 1787470100377,
3697 3904 "promptEn": "all-black background, experimental Chinese kinetic typography",
3698   - "lastPlayedAt": 1788250298018
  3905 + "lastPlayedAt": 1788254898074,
  3906 + "playCount": 1
3699 3907 },
3700 3908 {
3701 3909 "id": "c24c15736daa",
... ... @@ -3770,7 +3978,8 @@
3770 3978 "likes": 0,
3771 3979 "createdAt": 1787470098914,
3772 3980 "promptEn": "evening kitchen footage mixed with a glowing hand-drawn creature",
3773   - "lastPlayedAt": 1788252599204
  3981 + "lastPlayedAt": 1788254826035,
  3982 + "playCount": 1
3774 3983 },
3775 3984 {
3776 3985 "id": "6639b07acc7b",
... ... @@ -3785,7 +3994,8 @@
3785 3994 "likes": 0,
3786 3995 "createdAt": 1787470098570,
3787 3996 "promptEn": "fast-cut spaceship trailer title sequence",
3788   - "lastPlayedAt": 1788252235049
  3997 + "lastPlayedAt": 1788255538396,
  3998 + "playCount": 1
3789 3999 },
3790 4000 {
3791 4001 "id": "1e55e540df11",
... ... @@ -3800,7 +4010,8 @@
3800 4010 "likes": 0,
3801 4011 "createdAt": 1787461994394,
3802 4012 "promptEn": "a quiet mountain village at dawn (second attempt)",
3803   - "lastPlayedAt": 1788251098955
  4013 + "lastPlayedAt": 1788255112176,
  4014 + "playCount": 1
3804 4015 },
3805 4016 {
3806 4017 "id": "8e16b6faafd9",
... ... @@ -3815,7 +4026,8 @@
3815 4026 "likes": 0,
3816 4027 "createdAt": 1787455895150,
3817 4028 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
3818   - "lastPlayedAt": 1788254418063
  4029 + "lastPlayedAt": 1788255794528,
  4030 + "playCount": 1
3819 4031 },
3820 4032 {
3821 4033 "id": "2a4e45820135",
... ... @@ -3830,7 +4042,8 @@
3830 4042 "likes": 0,
3831 4043 "createdAt": 1787453697093,
3832 4044 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
3833   - "lastPlayedAt": 1788250986335
  4045 + "lastPlayedAt": 1788255554397,
  4046 + "playCount": 1
3834 4047 },
3835 4048 {
3836 4049 "id": "bfe13d1cc4a2",
... ... @@ -3890,7 +4103,8 @@
3890 4103 "likes": 0,
3891 4104 "createdAt": 1787444313690,
3892 4105 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
3893   - "lastPlayedAt": 1788253967852
  4106 + "lastPlayedAt": 1788256428755,
  4107 + "playCount": 1
3894 4108 },
3895 4109 {
3896 4110 "id": "e56962bd770f",
... ... @@ -3920,7 +4134,8 @@
3920 4134 "likes": 0,
3921 4135 "createdAt": 1787437988124,
3922 4136 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
3923   - "lastPlayedAt": 1788252010944
  4137 + "lastPlayedAt": 1788256016633,
  4138 + "playCount": 1
3924 4139 },
3925 4140 {
3926 4141 "id": "e497093c79ce",
... ... @@ -3950,7 +4165,8 @@
3950 4165 "likes": 0,
3951 4166 "createdAt": 1787432295531,
3952 4167 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
3953   - "lastPlayedAt": 1788248396902
  4168 + "lastPlayedAt": 1788255262253,
  4169 + "playCount": 1
3954 4170 },
3955 4171 {
3956 4172 "id": "79368c9cf499",
... ... @@ -3980,7 +4196,8 @@
3980 4196 "likes": 0,
3981 4197 "createdAt": 1787426955312,
3982 4198 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
3983   - "lastPlayedAt": 1788253219489
  4199 + "lastPlayedAt": 1788255360311,
  4200 + "playCount": 1
3984 4201 },
3985 4202 {
3986 4203 "id": "734d28c52670",
... ... @@ -4040,7 +4257,8 @@
4040 4257 "likes": 0,
4041 4258 "createdAt": 1787413999418,
4042 4259 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
4043   - "lastPlayedAt": 1788251954922
  4260 + "lastPlayedAt": 1788255444349,
  4261 + "playCount": 1
4044 4262 },
4045 4263 {
4046 4264 "id": "ade0318a7a4a",
... ... @@ -4055,7 +4273,8 @@
4055 4273 "likes": 0,
4056 4274 "createdAt": 1787413511959,
4057 4275 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
4058   - "lastPlayedAt": 1788254235982
  4276 + "lastPlayedAt": 1788256470780,
  4277 + "playCount": 1
4059 4278 },
4060 4279 {
4061 4280 "id": "5d4f40bf0889",
... ... @@ -4115,7 +4334,8 @@
4115 4334 "likes": 0,
4116 4335 "createdAt": 1787397450973,
4117 4336 "promptEn": "a cat sitting on a windowsill",
4118   - "lastPlayedAt": 1788251736809
  4337 + "lastPlayedAt": 1788255000124,
  4338 + "playCount": 1
4119 4339 },
4120 4340 {
4121 4341 "id": "580d1d722adc",
... ... @@ -4130,7 +4350,8 @@
4130 4350 "likes": 0,
4131 4351 "createdAt": 1787388090646,
4132 4352 "promptEn": "a cat sitting on a windowsill",
4133   - "lastPlayedAt": 1788254205967
  4353 + "lastPlayedAt": 1788256442760,
  4354 + "playCount": 1
4134 4355 },
4135 4356 {
4136 4357 "id": "c551457bc55e",
... ... @@ -4144,8 +4365,9 @@
4144 4365 "partition": "text",
4145 4366 "likes": 0,
4146 4367 "createdAt": 1787386316175,
4147   - "lastPlayedAt": 1788253015347,
4148   - "promptEn": "a cat sitting on a windowsill"
  4368 + "lastPlayedAt": 1788255040143,
  4369 + "promptEn": "a cat sitting on a windowsill",
  4370 + "playCount": 1
4149 4371 },
4150 4372 {
4151 4373 "id": "f9b68e5daaed",
... ... @@ -4190,7 +4412,8 @@
4190 4412 "likes": 0,
4191 4413 "createdAt": 1787383911831,
4192 4414 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
4193   - "lastPlayedAt": 1788245394359
  4415 + "lastPlayedAt": 1788255700490,
  4416 + "playCount": 1
4194 4417 },
4195 4418 {
4196 4419 "id": "9cba879e263d",
... ... @@ -4205,7 +4428,8 @@
4205 4428 "likes": 0,
4206 4429 "createdAt": 1787375413935,
4207 4430 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
4208   - "lastPlayedAt": 1788252421136
  4431 + "lastPlayedAt": 1788255252253,
  4432 + "playCount": 1
4209 4433 },
4210 4434 {
4211 4435 "id": "10112fb3c1fd",
... ... @@ -4220,7 +4444,8 @@
4220 4444 "likes": 0,
4221 4445 "createdAt": 1787375413623,
4222 4446 "promptEn": "golden portal opens, man in green jacket throws a glowing spear",
4223   - "lastPlayedAt": 1788253532966
  4447 + "lastPlayedAt": 1788256324704,
  4448 + "playCount": 1
4224 4449 },
4225 4450 {
4226 4451 "id": "78e698c924b1",
... ... @@ -4235,7 +4460,8 @@
4235 4460 "likes": 0,
4236 4461 "createdAt": 1787375413203,
4237 4462 "promptEn": "golden portal opens, man in green jacket throws a glowing spear",
4238   - "lastPlayedAt": 1788252725215
  4463 + "lastPlayedAt": 1788255090167,
  4464 + "playCount": 1
4239 4465 },
4240 4466 {
4241 4467 "id": "219ed88c3ea7",
... ... @@ -4250,7 +4476,8 @@
4250 4476 "likes": 0,
4251 4477 "createdAt": 1787375412946,
4252 4478 "promptEn": "golden portal opens, man in green jacket throws a glowing spear",
4253   - "lastPlayedAt": 1788252407133
  4479 + "lastPlayedAt": 1788255736512,
  4480 + "playCount": 1
4254 4481 },
4255 4482 {
4256 4483 "id": "a72236902363",
... ... @@ -4280,7 +4507,8 @@
4280 4507 "likes": 0,
4281 4508 "createdAt": 1787367454065,
4282 4509 "promptEn": "golden portal opens, man in green jacket throws a glowing spear",
4283   - "lastPlayedAt": 1788253735749
  4510 + "lastPlayedAt": 1788255482366,
  4511 + "playCount": 1
4284 4512 },
4285 4513 {
4286 4514 "id": "e6c241be377f",
... ... @@ -4310,7 +4538,8 @@
4310 4538 "likes": 0,
4311 4539 "createdAt": 1787363956909,
4312 4540 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
4313   - "lastPlayedAt": 1788254362044
  4541 + "lastPlayedAt": 1788256296687,
  4542 + "playCount": 1
4314 4543 },
4315 4544 {
4316 4545 "id": "5692965402f5",
... ... @@ -4325,7 +4554,8 @@
4325 4554 "likes": 0,
4326 4555 "createdAt": 1787332996051,
4327 4556 "promptEn": "golden portal opens, man in green jacket throws a glowing spear",
4328   - "lastPlayedAt": 1788253717746
  4557 + "lastPlayedAt": 1788255076159,
  4558 + "playCount": 1
4329 4559 },
4330 4560 {
4331 4561 "id": "bf7d973d02a3",
... ... @@ -4340,7 +4570,8 @@
4340 4570 "likes": 0,
4341 4571 "createdAt": 1787332047061,
4342 4572 "promptEn": "golden portal opens, man in green jacket throws a glowing spear",
4343   - "lastPlayedAt": 1788253407577
  4573 + "lastPlayedAt": 1788255218227,
  4574 + "playCount": 1
4344 4575 },
4345 4576 {
4346 4577 "id": "a5688d8f5db3",
... ... @@ -4355,7 +4586,8 @@
4355 4586 "likes": 0,
4356 4587 "createdAt": 1787330101793,
4357 4588 "promptEn": "a red apple on a wooden table, cinematic lighting",
4358   - "lastPlayedAt": 1788253473602
  4589 + "lastPlayedAt": 1788256286688,
  4590 + "playCount": 1
4359 4591 },
4360 4592 {
4361 4593 "id": "0024d3c2d4cb",
... ... @@ -4370,7 +4602,8 @@
4370 4602 "likes": 0,
4371 4603 "createdAt": 1787326019663,
4372 4604 "promptEn": "misty Jiangnan old town at dawn, woman walking with an oil-paper umbrella",
4373   - "lastPlayedAt": 1788252891295
  4605 + "lastPlayedAt": 1788254717984,
  4606 + "playCount": 1
4374 4607 },
4375 4608 {
4376 4609 "id": "ab42a6fba515",
... ... @@ -4400,7 +4633,8 @@
4400 4633 "likes": 0,
4401 4634 "createdAt": 1787309864037,
4402 4635 "promptEn": "transparent gaming mouse product film, blue and orange lighting",
4403   - "lastPlayedAt": 1788254219979
  4636 + "lastPlayedAt": 1788256342714,
  4637 + "playCount": 1
4404 4638 },
4405 4639 {
4406 4640 "id": "073f5df6427a",
... ... @@ -4415,7 +4649,8 @@
4415 4649 "likes": 0,
4416 4650 "createdAt": 1787305544815,
4417 4651 "promptEn": "transparent gaming mouse product film, blue and orange lighting",
4418   - "lastPlayedAt": 1788253209480
  4652 + "lastPlayedAt": 1788255494373,
  4653 + "playCount": 1
4419 4654 },
4420 4655 {
4421 4656 "id": "e23b04ac2c78",
... ... @@ -4430,7 +4665,8 @@
4430 4665 "likes": 0,
4431 4666 "createdAt": 1787304875681,
4432 4667 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
4433   - "lastPlayedAt": 1788253051367
  4668 + "lastPlayedAt": 1788254820032,
  4669 + "playCount": 1
4434 4670 },
4435 4671 {
4436 4672 "id": "c84bc1c7bfa0",
... ... @@ -4445,7 +4681,8 @@
4445 4681 "likes": 0,
4446 4682 "createdAt": 1787304031214,
4447 4683 "promptEn": "constable asks how she's sure it's not human, she says a person would make a sound",
4448   - "lastPlayedAt": 1788251466626
  4684 + "lastPlayedAt": 1788255188208,
  4685 + "playCount": 1
4449 4686 },
4450 4687 {
4451 4688 "id": "23d2fd81eb4d",
... ... @@ -4475,7 +4712,8 @@
4475 4712 "likes": 0,
4476 4713 "createdAt": 1787290119529,
4477 4714 "promptEn": "misty Jiangnan old town at dawn, woman walking with an oil-paper umbrella",
4478   - "lastPlayedAt": 1788253747759
  4715 + "lastPlayedAt": 1788255414334,
  4716 + "playCount": 1
4479 4717 },
4480 4718 {
4481 4719 "id": "06bb43196c46",
... ... @@ -4490,7 +4728,8 @@
4490 4728 "likes": 0,
4491 4729 "createdAt": 1787290119114,
4492 4730 "promptEn": "misty Jiangnan old town at dawn, woman walking with an oil-paper umbrella",
4493   - "lastPlayedAt": 1788253429580
  4731 + "lastPlayedAt": 1788254852045,
  4732 + "playCount": 1
4494 4733 },
4495 4734 {
4496 4735 "id": "0f22388f7847",
... ... @@ -4564,8 +4803,9 @@
4564 4803 "partition": "fl2va",
4565 4804 "likes": 0,
4566 4805 "createdAt": 1787224701504,
4567   - "lastPlayedAt": 1788252757232,
4568   - "promptEn": "constable burns the beauty portrait with the lamp, the door opens on its own"
  4806 + "lastPlayedAt": 1788254966105,
  4807 + "promptEn": "constable burns the beauty portrait with the lamp, the door opens on its own",
  4808 + "playCount": 1
4569 4809 },
4570 4810 {
4571 4811 "id": "f78ebe4c01c8",
... ... @@ -4595,6 +4835,7 @@
4595 4835 "likes": 0,
4596 4836 "createdAt": 1787220579189,
4597 4837 "promptEn": "gothic castle at night, vampire noble carries a princess, rose petals falling",
4598   - "lastPlayedAt": 1788253381560
  4838 + "lastPlayedAt": 1788254675967,
  4839 + "playCount": 1
4599 4840 }
4600 4841 ]
4601 4842 \ No newline at end of file
... ...
server.js
... ... @@ -129,11 +129,33 @@ function glmChat(messages) {
129 129 });
130 130 }
131 131  
132   -const PROMPT_OPTIMIZE_SYSTEM = `You are a prompt engineer for a text-to-video model. Expand the user's short
133   -request (which may be in Chinese or English) into a detailed shot-by-shot generation prompt written in
134   -English: camera angle/movement, lighting and mood, the subject's specific actions, and the setting.
135   -Output only the expanded English prompt itself — no preamble, no quotes, no "Prompt:" prefix — under
136   -150 words.`;
  132 +// Distilled from docs/h3skill.md (MiniMax's own H3 prompt-writing methodology) down to the one
  133 +// path that applies here: T2VA (no reference images — every chat prompt is plain text) on a clip
  134 +// fixed at ~5s (H3_GEN_PARAMS.frames / FPS). At that length it's one continuous shot, never a
  135 +// multi-cut montage — the earlier version asked for "shot-by-shot" and reliably got 4-5 fake cuts
  136 +// with timestamps running out to 8-10s, which the model can't actually deliver in 5 seconds.
  137 +const PROMPT_OPTIMIZE_SYSTEM = `You are writing H3 text-to-video generation prompts (T2VA mode — no
  138 +reference images, pure text-to-video). Expand the user's short request (may be in Chinese or English)
  139 +into the official H3 three-field format, in this exact order, using these exact field labels:
  140 +
  141 +integrated_multimodal_description: [Shot 1] one short style statement, e.g. "Live-action, cinematic."
  142 +Then describe, in one continuous unbroken shot (the clip is only about 5 seconds long — never split
  143 +into multiple shots or write more than [Shot 1]): the setting, the subject's specific action, and ONE
  144 +dominant camera movement using this vocabulary — Zoom In/Out, Push In/Pull Out, Pan Left/Right, Truck
  145 +Left/Right, Tilt Up/Down, Pedestal Up/Down, Arc Shot, Tracking Shot, Static Shot, Shake Slightly/
  146 +Strongly, POV, Roll Clockwise/Counterclockwise — stated as type + amplitude (small/large) + speed
  147 +(slow/fast). Describe light concretely: where it comes from, what it hits, what effect it creates.
  148 +Never use hollow quality words alone (8K, HD, masterpiece, stunning, cinematic used alone, beautiful,
  149 +high quality) — replace them with what is actually visible. 40-70 English words.
  150 +
  151 +overall_soundscape: 1-4 English sentences describing the ambient environmental sound the scene would
  152 +naturally have.
  153 +
  154 +non_diegetic_music: 1-3 English sentences describing the score the audience (not the characters) hears,
  155 +or exactly "N/A" if none fits.
  156 +
  157 +Output only these three labeled fields in this exact order and exact labels, nothing else — no
  158 +preamble, no extra commentary, no markdown formatting.`;
137 159  
138 160 // Best-effort — a viewer's short chat line ("一只猫跳舞") makes for a weak
139 161 // H3 prompt on its own. Never let a GLM outage or slow response block
... ...