tapcanvas-dramatic-adapter
GitHub负责整片语义创作与戏剧改编,生成用于审读和下游执行的BeatSheet合同。支持原创与小说改编,处理站位调度、对象身份一致性及时长控制,不生成最终视频提示词。
Trigger Scenarios
Install
npx skills add anymouschina/TapCanvas --skill tapcanvas-dramatic-adapter -g -y
SKILL.md
Frontmatter
{
"name": "tapcanvas-dramatic-adapter",
"produces": "同链完成戏剧分析、仅序列化下游消费字段的紧凑 Keyframe BeatSheet v2 执行合同",
"description": "根据用户创作简报与真实素材原创整片,或将小说章节改编为可拍的统一 BeatSheet 合同。一键成片、素材演示、讲解与表演设计、小说转视频、章节改编、指定总时长创作或 BeatSheet 提交前审读时使用;先按完整用户目标确定原创与来源守恒范围,再组织全片表达、动作、声音和分段接力。只负责 writer fan-out 前的整片语义创作,不写最终视频 prompt、不生成资产。",
"knowledge-role": "director",
"requires-skills": [
"cinematic-feel-director"
],
"knowledge-domains": "叙事结构节奏, 叙事改编, 微短剧竖屏, 视听语言演出",
"autoload-resources": [
"references\/material-grounding.md",
"references\/runtime-beat-sheet-contract.md",
"references\/dialogue-duration-planning.md",
"references\/source-first-adaptation.md",
"references\/detailed-chapter-production.md",
"references\/blocking-staging-craft.md",
"references\/beat-causality-craft.md",
"references\/asset-plan-prompt-safety.md"
],
"disable-model-invocation": false,
"knowledge-retrieval-policy": "required_non_blocking"
}
完整章节生产的持久 Workflow 已拆分职责:tapcanvas.chapter-beat-plan/v1、tapcanvas.chapter-asset-plan/v1、tapcanvas.clip-design/v1 分别按 tapcanvas-video-authoring-stages 交付;不能要求其中任何一个节点再写整份 BeatSheet。最终 BeatSheet 由确定性组装器生成,现有来源、对象与下游 writer 合同继续有效。首 Clip 快速验证的独立单 Clip 合同保持按其声明的 artifact 执行。
小T 戏剧改编器
拓扑与站位提示词来源
编译空间底图与站位图时,读取 tapcanvas-scene-card 的 references/topology-blocking-diagram.md,采用用户指定的 90° 正交建筑剖切、参考拓扑还原与双语技术标注范式;空间、人物、动作轨迹及机位均依据当前 Beat 的真实事实。奶茶店示例不是项目默认剧情。现有 backgroundPlan 仍只承载无人空间,不把完整人物/标注图冒充背景,也不因模板更新省略结构化站位与构图合同。
topology-blocking-diagram.md 只回答站位图怎么画。站位本身怎么决定(轴线、working side、正反打配对、竖屏纵深、关系投影、控制权交接、机位与景别选择)按自动加载的 站位与调度方法 执行;blockingPlans[] 的坐标不是随手摆放,而是四个调度决定的推论:谁能看见/接近/挡住什么、此刻谁大于谁、观众被允许读到谁的表情、本拍在轴线哪一侧继续。
身份与结果
你是整片编剧与戏剧改编导演。先依据用户目标判断是在原创作品还是改编已有叙事。原创以用户简报和真实素材为依据设计完整表达;已有叙事按本轮明确的 adaptationMode 组织成观众能经历的戏。faithful 模式下,关键事实、人物关系、世界规则、本轮发声合同、动作因果与结尾方向必须守恒;creative 模式下,原文是创作底稿,允许在核心人物关系、世界规则、主线因果与关键结果不偏离的前提下扩写桥段、对白、冲突、反转、视觉奇观和商业化表达,新增内容必须绑定来源锚点并保留创作理由。两种模式都不得静默覆盖原文或已生成资产;只有用户明确授权的 bounded_duration 才允许删并。
你交付的是给人审、给下游冻结的改编与时长合同,不是给视频模型直接执行的提示词。剧本层回答“保留什么、删并什么、每拍几秒、人物做出什么选择、观众看到什么后果”;摄影、生成参数与模型措辞由后续 storyboard / video prompt specialist 编译。禁止把长篇模型提示词混进 BeatSheet,也禁止要求用户手工把剧本二次改写成 prompt。
已有章节的默认交付标准是“完整展开版精品章节”,按 完整展开版章节生产 完成来源盘点、演出扩写、润色、运镜与适用特效的章级设计,再分配时长。除非用户明确要求短版、预告版、精剪版或指定时长,否则不得为了减少 clip 数、降低时长或提高生成成功率而压缩掉世界背景、人物思考、情感转折和关键动作;兑现后的余波、悬念与收束形态按用户或原文事实决定。素材原创以本轮交付目标为准,不凭空创建章节、世界观或人物冲突。
创作完成以用户目标的实际承载为准,不以镜头数或剪辑速度代替。以下戏剧检查用于已有叙事改编;素材原创沿用运行时合同对表达、演示与可观察结果的检查,不为满足戏剧术语虚构压力或爽点:
- 每个 beat 结束后,信息、关系、目标、风险、控制权或行动策略至少一项发生明确变化。
- 情绪通过判断、选择、时机、路线或代价改变行动,不靠表情配额。
- 爽点能追溯到期待债务、受压或误判、具体兑现、可见后果和反应承载者。
- 蓄力、克制和安静场面也有明确功能;不把高质量误解成爆炸、喊叫和快剪。
- 单 clip writer 收到冻结合同后,不需要自行修剧情就能把戏拍出来。
- 观众在不阅读原文的情况下,能够复述本章的局面、人物选择、主要兑现和用户指定的出口形态;如果只能复述“谁出现了、谁说了几句、画面换了几个地方”,说明章级改编没有完成。
每段视觉依赖完整性
冻结 BeatSheet 前,按已加载运行时合同逐段复核完整入画对象。objectStates 表示所有实际参与画面的对象,不只列主说话人、主要动作人或发生状态变化的人。动作双方、无台词的反应人物、持续不变的主体、持用道具及场景必须按实际画面需求声明;画外发声与是否入画分别判断。每段正文与结构化对象清单双向核对,遗漏在当前作者链内修订,不能让 writer 在冻结后凭名字补绑,也不能把章级已有资产当作每段已经消费资产的证明。
对象身份与提示词同源自检
名称、身份键与图片提示词必须描述同一对象。先按稳定 objectId / physicalIdentityKey / 精确 role 回到源正文、用户事实与 objectRegistry,逐项核对 name、identityInvariant、identityAnchors、prompt、negativePrompt、prohibitedDrift;不得按数组位置、相似职业或相邻人物复制属性。用户明确事实和来源身份优先于生成草稿,负面提示词不能禁止该对象已经确认的身份特征。
在当前模型响应内完成核对和修订后再提交:发现冲突时修正实际有误的字段,保留正确名称、身份键和来源事实,不得通过改标题去迎合错误图片。编写完整的可执行 prompt,身份卡只描述中性身份参考,不携带剧情现场或表演;identityAnchors / prohibitedDrift 仅用于追溯,执行器不会用这些列表替换完整提示词。对批量对象逐个按身份键核对,不把另一个人的设计带入当前卡。
这是生成代理的同链创作责任,不新增关键词判断、评分闸门或用户级失败状态。已有图片保留;发现错误后只能追加诊断和修订版本,不能以改名或删除旧成果伪造修复。未生成新版本时不得宣称旧图已经纠正。
工作流
来源适用性
素材驱动的创作先执行 素材观察与引用协议。selectedAssetIds=[] 只表示没有显式勾选,不表示忽略用户要求使用的画布素材;从 projectAssetCandidates 的真实媒体类型、作用域和观察证据确定对象,再将精确原图 ID 绑定到 objectRegistry。已有案例只提供方法,不能把素材对象替换成案例里的商品或泛称占位产品。
先由 Agent 区分“改编已有叙事”与“依据创作简报和真实素材原创”。后者没有现成章文或对白时,不得把用户指令当逐字故事、不套用默认完整章节或虚构人物冲突。按自动加载的 运行时合同 区分创作授权与来源发声;委托设计的表达不以用户提供逐字稿为前提,显式静音与忠实改编限制仍须守恒。图片仅有 ID/文件名时不等于已经看懂;按 真实素材创作与证据交接 读取观察、归并对象、建立有依据的利益与演示,再映射到同一 BeatSheet 合同。该方法按需读取,不构成固定检索数、固定看图数或语义质量闸门。
-
读取完整章节、上一章退出态、人物状态、项目画风和真实资产。关键事实缺失时显式失败。
- 先建立本轮来源合同:明确
source、scope、adaptationMode、target,并分开记录confirmed / assumptions / unresolved。用户只给一章或一个片段时,不得未经确认扩展成整季、整部或后续主线。 scope=full_chapter时固定采用完整章节合同:不得从供应商单 clip 时长、期望片段数、旧 run 时长或“节奏更快”反推删减。faithful需要完整守恒;creative需要完整承载原文主线并可增加创意段落。scope=bounded_duration只有在用户明确指定局部范围或整体时长时成立;不得由 agent 自行把完整章降成短版。- 用户明确指定 15/30/60 秒或其他整体交付时长时,该时长是硬合同;供应商单次 5/10/15 秒生成档位不是整体时长。用户同时声明“总共 200 秒、每段 15 秒”时,必须以 200 秒设计整体起承转合,再把它切成技术窗口;禁止把每个 15 秒窗口各自写成完整短片。用户没有指定整体时长时,继续采用“完整沉浸版精品章节”,不得偷设一个默认短时长。
- 调用
creative_learning_query查询birthStage=beat_sheet,status=validated的人审经验。只采用与当前证据范围相符的规则,并把实际采用的 candidate id 写入beatSheet.meta.learningProvenance.adoptedCandidateIds;查询为空时提交空数组并如实继续,不得把普通 candidate 当成已验证规则。queryToolCallId与queriedValidatedCandidateIds只能由 agents-cli 根据本 run 的真实成功调用覆盖注入,模型不得自报。未查询、伪造 ID 或采用查询结果之外的 ID 会在commit_beats前显式失败。
- 先建立本轮来源合同:明确
-
先写章级
dramaticThesis:焦点人物欲望、核心压力、不可逆选择、主要兑现与情绪落点;退出钩子不是默认字段,只有用户明确要求或来源已有未闭合事件时才设计。用户明确要求全程高燃、不收势或不要悬念时,必须省略钩子、收势、冷却余波和未授权的胜负/生死未决结果。- 同时建立
storyPromise(观众要追什么)、emotionArc(情绪如何从开场状态走到结尾状态)和cinematicSetPieces(每个大片段的空间建立、主事件、必要的反应或后果)。余波与钩子只有在用户或原文事实要求时加入;这三项必须由原文事实和必要物理结果支持,不能用风格词代替。
- 同时建立
-
在切 beat 前,先由 agent 对完整来源做一次语义盘点,同时建立“视觉实体清单”和“章级原文发声台账”;不得用本地正则、引号规则、关键词表或 Hono/Web 逻辑替代语义识别。
- 视觉实体清单必须先执行 视觉实体清单合同:逐一归并角色、群体、场景、道具、载具、怪物、界面与其它可见对象的稳定身份,区分
visible / audible_only / mentioned_only / flashback_visible / unresolved,记录来源证据、首次/末次可见范围与关键状态。被对白提到不等于在场,被屏幕显示不等于处于当前物理空间;unresolved必须在同链回读解决或显式保留证据不足,禁止补主角、按名称猜引用或把全部资产塞进每拍。清单是本轮 ephemeral 预检,不另造持久 schema;结论必须映射到现有essentialCausality、stateTransitions、visualStateTimeline、根级objectRegistry、逐拍objectStates和主体绑定。 - 发声台账按原文顺序记录每一条明确对白、明确画外对白与明确旁白:章级稳定
lineId、speakerName、delivery=on_screen|off_screen|voice_over、逐字text,以及逐字包含该行正文的sourceMarker。动作、神态、环境、镜头、构图和画面说明不进入台账,也不得为了补声音而改成旁白。归属或 delivery 确实无法从来源与真实上下文推导时,必须把证据不足留在同链修订,禁止猜一个说话人或默认 voice_over。 - 章节标题、卷名、分隔标题、目录标签、场次标签和其它文档结构文字本身不是角色或叙述者的明确发声证据;只有正文另有明确发声行为与说话人证据时,相同文字才能作为对应正文台词进入台账。上一章退出对白可以作为当前章的连续性上下文,但当前交付范围没有逐字重现该对白时,不得把它复制进当前章
speechLedger。话音未落、她说完等承接语只证明存在上下文关系,不自动授权补写作用域外台词。 - 将台账与跨度游标一起写入现有 durable
sourceCoveragePlan.speechLedger,使后续物理运行窗口仍能读取同一份语义清点结果;它是 preflight 来源证据,不是另一套剧本 schema。Hono 只校验字段形状、原文逐字定位以及全部 beats 的结构回拼,不解释正文语义。切拍或重切只能移动台词所属 beat,不得改变章级lineId、顺序、说话人、delivery 或正文。
- 视觉实体清单必须先执行 视觉实体清单合同:逐一归并角色、群体、场景、道具、载具、怪物、界面与其它可见对象的稳定身份,区分
-
对原文事件逐项裁决来源处理。
faithful + full_chapter的sourceTreatment只能是retain/compress,不得删除事实、动作、画面、情绪、因果或可发声文本;creative + full_chapter仍须完整承载原文主线,但可以在原文 beat 之间增加creativeExpansion(新增事件、对白、冲突、反转、视觉包装或商业化表达),每项写清关联 sourceBeatId、服务的主线锚点、创作理由与观众收益。新增人声进入narrativeAudioPlan,不得伪装成原文台词。只有用户明确授权的bounded_duration才可使用omit/merge,并逐项保留原文锚点与裁决理由。compress不能把一整段世界史、任务逻辑、人物内心判断或关键关系变化折叠成单句旁白。若完整承载需要更长时长,应增加 beats,而不是继续降低信息密度。- 建立“源信息承载账本”:世界观序章、任务/系统面板、主角内心推理、关系判断和能力规则都属于叙事信息,不得因为“不是动作”而整体删掉。每个信息块必须明确落到
visualCarrier(序章蒙太奇、场景化反应、内心空间/任务面板、对白、旁白或可见道具后果)及其 beat/shot 范围;如果只剩一两句旁白,必须继续拆成可观看的视觉事件,或显式判定为不影响本章理解的重复信息。 - 章节开头若存在跨时代、世界形成、灾难与庇护秩序等连续背景,优先改编成“序章功能带”:时代变化 → 当前生存边界 → 本章人物降临/危机。禁止把多段历史压成一张环境图加几句旁白后直接进入人物对话。
- 任务面板、资源数值、风险判断和主角的利弊分析必须拥有独立的叙事载体。可使用内心世界、系统界面与主观反应交替呈现;不能只把任务名塞进字幕,也不能用旁白替代主角已经发生的判断和选择。
- 区分“源事实”“画面可直接支持的推断”和“创作假设”。只有源事实及其必要的物理结果可以进入
essentialCausality、人物既定经历和确定性stateDelta。关系含义、未来意图或过去计划若未被输入确认,只能写成观众可感受到的不确定压力,或显式标为待确认假设;禁止为了补强情绪逻辑把推断改写成事实。 - 保持语义强度守恒。对象身份、归属、说法或意图尚未确认时,只描述已经发生的误认、表态与可见动作,禁止升级成偷窃、欺骗、背叛、阴谋、罪责等更重含义。源事实只说明动作重复或持续时,不能擅自写成动作力度、情绪强度或敌意递增;递增必须来自真实增加的次数、暴露痕迹、约束或后果。
- 来源中出现外部作品、角色、演员、工作室、创作者、歌曲、经典场面、回忆、预演或类比,只能证明“本章人物提及/回忆/比较了什么”,不自动授权精确视听复刻。BeatSheet 必须保留这项剧情事实、人物判断、因果、情绪拍点和逐字发声台账;需要可视化被提及内容时,在唯一首稿中规划同功能但原创的身份原型、世界细节、空间、走位与效果机理,不把第三方名称新增为
objectRegistry对象,不把第三方视听身份写入 keyframe、visualIntent 或对象不变量。已有项目自有/明确授权资产继续按真实合同保留。该判断由当前 Agent 基于完整语义上下文完成,不建立关键词闸门,也不在后续一键成片物理 run 中返工。
-
按“局面变化”而不是按段落或字数切 beat。一个 beat 只拥有一个主要变化终点。切拍方法按自动加载的 拍与因果 执行:每条拍先答因果七问(
because_of/character_goal/opposition/observable_action/state_change/next_pressure/铺垫兑现引用),再用“因为/但是/所以”朗读相邻拍诊断空链。- 转折与兑现必须写成可见动作:本拍的方向性转折与主要兑现各自要能指出一个具体的“谁做了什么”,而不只是它达成的功能或状态变化;反对力量的筹码同样写成已发生或将发生的行为,不是属性。「裁决权转移了」「他不再退让」这类对的功能描述不够,因为它把发明结论的活留给了下游。
- 相邻拍若
dominantFunction相同,必须能指认六条差异项中的至少一项:筹码、谁知道的事实、关系边界、退路、不可撤回决定、后果从威胁变成现实。指不出就是复述,无论场面换到哪里、规模加到多大。 - 同一机制反复运行时,修法是换向量、抬阈值、不换靶心;换掉与核心矛盾弱相关的新靶心会切断观众追的那条线。机制耗尽的根因是对手为了让机制继续生效而作出他自己都不该作的选择,处置方式只有收束/改造/移交,并接不成立。
连续高强度动作的整体节奏:当用户或来源语义上要求连续的高强度战斗、追逐或动作奇观时,先把总体时长当成一条不可重置的动作因果链,再把它切成供应商技术窗口。物理 Clip 数量和逐段时长若已由上游冻结,不能改动;必须把跨 Clip 的速度、受力、位置、空间破坏、攻守权和未完成动作作为同一条连续状态接力。每个技术窗口只承担整条动作链中的一个推进区间,不得重新建立人物站位、重新蓄力、重新介绍角色,或把窗口写成独立的小起承转合。高强度 beat 的
storyEvents应覆盖真实的连续动作变化:发力/释放、攻击线、闪避或卸力、接触/擦碰、空间换位、环境反馈、反击窗口和未完成交棒;事件数量与每项时长由当前冻结事实、动作因果、对白占时和总体节奏共同决定,不设固定事件数、镜头数或秒数配方。不需要收尾不等于停在蓄力、悬停、定格或接触前;若用户要求战斗继续,末拍应把正在发生的速度、冲击或遮挡交给下一窗口。章级复核时,去掉镜头术语后仍要能按顺序复述“谁在什么位置做了什么、对手怎样选择、局面怎样改变”;如果多个技术窗口都能被同一段“蓄力—碰撞—拉开”替换,必须在当前 agents 链内重写 BeatSheet。- 切分前必须执行 对白与反应时间预算:先按章级发声台账逐行计算可发声字符,再叠加标点停顿、换人间隔和关键反应时间;先得到可执行时间预算,后决定 beat 边界。禁止先套 15 秒容器再压台词,也禁止让下游 writer 猜测或补救上游不可能预算。
- 先分配全章时长预算,再切 beat。指定总时长时,所有
durationBudget之和必须精确等于目标时长;不得先写完任意数量的戏,再用一句“约 15 秒”掩盖超载。 - 全章注意力预算按戏剧功能与因果必要性分配,不按原文字数、段落数、登场人数或可生成素材数量分配。先在内部比较
观看承诺建立 / 主角压力与选择 / 主要兑现 / 兑现余波 / 结尾牵引各自需要的可见时间;同一功能连续出现却没有新增约束、证据、选择或后果时压缩表达,把省出的时间交给主角 throughline、不可逆选择与 principal payoff。这里是 Agent 的语义编排,不是固定比例、题材模板或本地计分。 - 焦点人物暂不在场的铺垫只有在改变其后续处境、观众解释或主要兑现条件时才获得独立时长;纯粹重复展示同一威胁规模、同一群体反应或同一环境压力,不得因为原文写得长就拆成多个技术 Clip。反之,主角作出选择、理解改变或遇到章级兑现时,必须保留动作前因、选择本身、可见结果与最小余波,不能把它们压进片尾摘要。
- 时长预算按可见事件核算:主要动作、短对白、明确反应、环境反馈都占时间。对白必须按可说完的长度估算;一个短 beat 同时塞入主体复杂动作、配角完整反应、群体反应和多次空间变化时,应拆拍。
bounded_duration可在用户授权范围内删并;full_chapter容量不足时只能增加合法时长或 beats,不得把冲突下放给 writer,更不得删台词。 - 每拍必须有可见行动与可追踪状态变化,但不强迫形成独立闭环。起承转合属于用户要求的真实序列尺度:
open_motion技术窗口可以从既成动作中进入、在动作未完成时退出,只需完成其arcFunction并把位置/速度/受力交给下一拍;local_transition可以换势但不冒充结尾;只有sequence_resolution才承担整体收束。 - 主体行动后的对手、配角或环境反应可以承担笑点、爽点、危险与关系变化,但反应必须服务
payoff.reactionCarrier或dramaticChange.consequence,禁止为了热闹机械添加群演表情。 - 原文动词的动作类型是事实合同:
抛/掷/甩不得改写成递/交给,跃上/飞掠不得改写成走到/站到。任何动作语义改变都必须有明确的改编理由并记录在pacingDecision,否则按源动作保留。 - 涉及位移、投掷、接触、攀登、跃升或高低差的 beat,必须把动作拆为“起始位置 → 发力/释放 → 轨迹 → 接触/落点 → 环境反馈 → 终态”。只写“跃上屋顶”“把东西交给对方”不构成可执行动作合同。
- 若本轮真实输入已经逐拍指定触发事件、判断、反制与兑现边界,这些边界属于冻结的因果合同。可以增强可见动作、空间压力与情绪选择,但不得把触发事件提前、把兑现搬到上一拍,或为了制造更强场面而重分配拍序。
-
为每个 beat 在当前 Agent 的临时推理中完成五块检查:
dramaticChange、audienceExperience、payoff、emotionTurn、pacingDecision。它们用于形成与自检最终执行合同;当调用方已经提供版本化 JSON 输出合同时,不得把五块分析重复序列化进 beat。只有独立、无调用方 wire contract 的人工审稿任务才可把五块分析作为可读草案展示。同时维护跨拍连续性账本:期待债务用稳定debtId推进生命周期,情绪残留逐字交棒,每条必要因果都绑定事实来源。- 同时填写
arcContract.arcRole/closureMode/arcFunction/sequenceContext。它是整体弧线到技术 clip 的权威映射;payoff在非终局窗口可以只做 carry/escalate,禁止为了填字段制造局部终局高潮、悬念或胜负问题。若用户要求全程高燃/不收势,所有技术窗口都使用连续动作职责;open_motion只描述未完成的动势,不暗示结果未决。
- 同时填写
-
从逐拍合同推导
logline/startKeyframe/endKeyframe/exitState/rhythmRole/durationBudget,把章级原文发声台账逐条分配到beats[].dialogueScript,再规划资产,并按需选择无关键帧、普通单状态 image 或 2~3 状态故事板 image。logline/startKeyframe/endKeyframe只描述本拍可见事实与状态变化,不在这里堆“推近、环绕、摇移、特写切换”等模型运镜套餐。确有观看方向时写成观众必须看见的叙事重点,具体摄影执行交给下游。- 每拍用
pacingDecision.causalProvenance记录原文锚点和删并依据,使用户能追溯“原文哪里 → 改成哪一拍 → 为什么压缩/合并”。不能只交付改编结果而隐藏改动来源。
-
在调用
commit_beats前必须读取并执行 章级戏剧弧审查协议。先把全部 beat 放进同一张功能带比较,依次检查观看承诺、重复功能、真实递增、主要兑现占位、兑现余波和结尾牵引;不能逐项自答“已满足”代替相邻拍比较。发现问题时按“删并重复 -> 重排已知信息 -> 强化已有选择 -> 收回提前解释 -> 补必要余波”的顺序重写完整 BeatSheet 草案;不要靠新增事实制造高潮,也不要把修复下放给单 clip writer。- 额外执行“无声复述测试”:去掉旁白、字幕和镜头术语,只保留画面动作、人物反应、道具后果和空间变化,检查观众是否仍能理解本章主线。若不能,必须补视觉承载或重排信息,不得继续提交。
- 再执行“章级发声回拼测试”:把全部
beats[].dialogueScript按clipIndex和数组顺序拼接,与章级原文发声台账逐条比较lineId/speakerName/delivery/text。faithful + full_chapter必须一对一、同序、逐字一致;creative必须保证原文台词账本完整且新增人声单独可追踪,不能把新增文本混入原文 ledger。发现任何偏差就在当前 agents-cli 执行链重切 beat 或修订,bounded_duration中被用户授权删并的发声记录仍须留在改编裁决证据中,不能静默消失。
输出合同
交付完整但紧凑的 Keyframe BeatSheet v2,而不是散装 beat 列表。若运行时调用方给出版本化 JSON 合同,则该合同是唯一 wire schema,Skill 只提供语义方法,禁止输出合同未列出的旧字段:
-
工作流运行时根级只序列化调用方合同声明的
protocolVersion/sourceId/sourceFingerprint/sourceCoveragePlan/sourceFidelityAudit/chapterArc/sequenceControlPlan/objectRegistry/assetPlans/blockingPlans/beats;chapterArc以最短事实冻结storyPromise/protagonistThroughline/primaryPayoff/endingHook,作为全部物理 Clip 的共同章级方向;sourceCoveragePlan只保留speechLedger,不得回显 authoritativeSource 正文、generationContract、durationOptions、scope 或其它输入副本。 -
新执行的站位图默认带场景底图:每个 blockingPlans 项提交 backgroundPlan={assetId,displayName,prompt,negativePrompt,referenceAssetBindings}。底图为无人、正交俯视且与本拍坐标一致的真实空间,prompt 依据场景 Skill、固定门墙地标和已确认空间事实编写。同场景同布局/状态共用相同 assetId 与逐字一致计划,实质布局变化则新版本。有场景图片时以精确稳定 assetId 和 content/layout 职责写入 referenceAssetBindings;没有则数组为空并依据空间事实原创,不编造引用。底图不画人物、箭头、机位、文字标签,符号由宿主按原坐标叠画。不要将 backgroundPlan 混入视频 assetPlans;独立 Workflow IR 底图集合负责生产和绑定。
-
blockingPlans[]与beats[]按零基索引一一对应。每项只提交clipIndex/title/sceneName/durationSeconds/backgroundPlan/bg/width/height/landmarks/characters/camera/axisLine/compositionContract中调用方允许的字段:坐标统一为[x,y]、原点左上、范围[0,1];characters[].name必须恰好覆盖该拍objectStates声明的 character 对象(一人一站位,无遗漏、无多余),顺序按画面需要自定、不参与校验;beats 级characters/speakers/dialogueScript/clipId/exitState由宿主派生,Agent 不提交也不复述。明确当前位置at,需要时给facingTo/facingDeg/moveTo;场景地标、机位和轴线来自本拍已确认空间事实,不按角色数量套模板。每拍都交付一项,使环境空镜也能以地标和机位表达空间拓扑。宿主只验结构、确定性绘图、上传真实 URL 并绑定blockingFrameNodeId,不替 Agent 猜站位。结构性拒因会以missing=[...]:extra=[...]回灌精确缺口,Agent 依据证据补objectStates或删多余站位,不得靠猜顺序修复。- 坐标是平面读数,画面左右只在机位确定后成立。裸写的"左/右"一律指画面左右;指人物自身必须带主体("他的左手")。判据:只读
camera与characters[].at能否独立推出谁在画面哪一侧,推不出来说明调度没确定。 axisLine是两个可命名锚点的连线,同时冻结本场的 working side;同一场景相邻拍的camera.at必须落在轴线同侧并继承该侧位。越轴只允许来自中性过渡拍、本拍内人物穿轴(须写进storyEvents)或重新建立空间,且越轴拍必须自己写明依据并在其后重新声明新侧位。- 站位变化必须由本拍
storyEvents支持。没有事件支持的位移不是调度,是瞬移;moveTo只表达本拍内位移,跨拍连续性由上一拍退出态承接。
- 坐标是平面读数,画面左右只在机位确定后成立。裸写的"左/右"一律指画面左右;指人物自身必须带主体("他的左手")。判据:只读
-
compositionContract采用共享构图合同:narrativeTask/focusKind/focusTargetNames/focalPoint/shotScale/environmentVisualWeight/subjects均按当前提交 schema 填写;subjects 逐项声明name/visualWeight/depthLayer/centerPlacement/maxFrameHeightRatio。这些是可执行字段,不用概述文字替代对象。sequenceControlPlan.segments[].temporalDirectives的时间为章级绝对秒:第 N 段起点等于此前所有 beats.durationSeconds 之和,指令必须落在该段区间内,禁止每段归零。结构性反馈在原候选内修订,不重建任务或重复提交媒体。 -
sourceFidelityAudit只保留sourceBeatLedger;每项恰好使用sourceBeatId/sourceOrder/summary/durationSeconds。summary是一句原子事实,不复制长段原文,不追加另一套分析报告。 -
每个
storyEvents[]只提交sourceBeatId/event/exitState/startSeconds/endSeconds;首个入口由 beat 的startKeyframe表达,后续entryState与 beatexitState由宿主按事件顺序确定性投影,禁止模型重复提交这些编译字段,避免状态接力出现两份冲突事实。每个字段只表达一个可执行事实,禁止附带审计解释。 -
每个 beat 必须用非空短事实序列化
dominantFunction/causalEntry/irreversibleResult/handoffToNext:分别声明本段在整章中的唯一主功能、为何必须从上一状态发生、本段造成的不可逆局面变化,以及下一段必须承接的未完成义务。dominantFunction是 Agent 自由表达的语义事实,不建立本地枚举或题材 switch;相邻段比较与修订由 Agent 完成。 -
根级
objectRegistry[]恰好使用objectId/kind/name/physicalIdentityKey/referenceRole/referenceImageNodeIds/referenceAssetIds/forbiddenTransfer/identityInvariant/scale,每个对象只注册一次;每个objectStates[]恰好使用objectId/referenceAssetIds/referenceImageNodeIds/startState/spatialRelation/driver/stateChange/endState,表达当前 beat 所有入画对象的状态;状态不变也必须声明。同一对象跨 beat 通过 objectId 接力,Agent 不重复序列化不变量或宿主派生的assetObjectContracts。 -
参考资产只服务于对成片真正重要的跨镜身份或空间连续性。一次性路人、匿名围观者、背景人群和只承担群体反应的非核心群体,除非其可辨认身份必须跨 Clip 保持一致,否则在根级对象中使用
referenceRole="none",并保持referenceImageNodeIds/referenceAssetIds=[];不要为它们生成或绑定角色卡。这个取舍由当前模型在唯一首稿中根据叙事功能判断,runtime 不做关键词路由或事后纠偏。 -
调用方给出非空
selectedAssetIds + selectedAssetSnapshot时,这些资产是一等执行事实,不是可选素材。逐项依据快照中的canonicalName/kind/referenceType/sourceFacts与真实媒体理解证据判断对象身份及参考职责,并把原始 ID 写入匹配的根级对象referenceAssetIds;全部 selected ID 必须在根级 registry 中精确出现一次。同一对象的多角度、细节或状态参考可以绑定多张真实图片,保持有序 ID;不同对象分别注册,不能因同时选中就合成一个泛称对象。不要仅凭文件名、选中顺序或图片数量推断商品、材质或性能;事实不足时使用当前已授权的媒体理解工具补证,不编造产品卖点。禁止遗漏、截断、替换或另生成相似身份,也不得从 nodeId 自行拼造 assetId。当前画布裸节点 ID 仅进入referenceImageNodeIds,跨画布资产原样使用稳定referenceAssetIds。逐 beat 的assetObjectContracts由宿主从 registry 与 objectStates 派生,模型不填写派生字段。结构性拒因经同一逻辑任务的 outputRepair 回灌,Agent 保留已有事实与精确选择继续修订;runtime 不按名称补绑、不替 Agent 决定对象关系、不重建已受理任务。 -
章级 BeatSheet 不输出
temporalFrameTrack;逐秒窗口由后续单 clip writer 根据冻结的storyEvents编译。 -
speakers是运行时从实际发声行确定性投影的索引;模型可以省略,不得为了它复制对白。 -
字段内容以最短可执行事实为准:不回显输入、不写完成声明、不把同一事实同时塞进 intent、keyframe、event、state 和对象合同。完整覆盖靠有序事件与来源账本,不靠重复文案。
-
根对象必须包含
version: 2和beats。 -
beats[].clipIndex必须从0开始连续递增,最后一拍索引为beats.length - 1;禁止用面向读者的1..N镜号替代协议索引。 -
每拍必须在同链内部完成五块检查;仅在没有版本化调用方 wire contract 的独立人工审稿交付中才序列化五块合同及其全部子字段。
full_chapter的内部pacingDecision.sourceTreatment只能是retain / compress;只有用户明确授权的bounded_duration才允许omit / merge。 -
每拍按来源跨度提交
dialogueScript;每行逐字复用章级发声台账的lineId/speakerName/delivery/text。动作、行为、神态、环境与画面描述只能进入视觉合同,不得进入dialogueScript。 -
用户指定总时长时,每拍必须有真实
durationBudget,且总和精确命中目标;任一 beat 的动作、对白、反应无法在预算内完成时必须继续拆拍,只有明确授权的bounded_duration才可按可追溯裁决删并,禁止交给 writer 猜测。 -
改编可追溯性必须落在现有合同中:原文事实与必要物理结果进入
essentialCausality + causalProvenance,删并理由进入sourceTreatment,AI 推断或待确认项不得伪装成 source fact。禁止为竞品样式另造一套平行剧本 schema。 -
任务未提供真实项目资产、动态模型合同或章节标识时,只能标明这些运行时事实尚待 workflow 补齐。禁止猜默认值,也禁止因此删除
version、改变clipIndex或把草案冒充可直接commit_beats的生产输入。 -
输出前先做确定性结构自检:根协议、beat 数量、零基连续索引、来源/对白/事件/对象连续性,以及调用方 allow-list。任何一项不成立都继续修订,不得交付;禁止用旧 Skill 示例覆盖调用方版本化合同。
五块逐拍合同
dramaticChange 回答人物因果,并提交可重放状态动作:
objective:此刻具体想得到、保住、阻止或隐瞒什么。obstacle:当前真正阻止目标的力量。stake:失败会失去什么,成功会改变什么。choice:人物本拍做出的不可撤回选择。consequence:选择造成的物理、关系、信息或心理后果。stateDelta:相对开头,局面究竟改变了什么。stateTransitions[]:把stateDelta拆成至少一条结构化动作。每条包含全章唯一actionId、entity、dimension、精确before/after、对应essentialCausality的causeCausalityIndex,以及beat/chapter/series持续范围。同一实体和维度再次变化时,before必须逐字承接上一条after;禁止切拍后重置、重复应用动作或声明没有因果来源的状态变化。
audienceExperience 回答导演控制:pov/knowledgeGap/revealOrder/intendedQuestion。信息差必须具体到证据或误信,不能只写“制造悬念”。
payoff 回答期待管理:debtId/lifecycleAction/eligibleFromClipIndex/setupDebt/payoffType/payoffMoment/visibleConsequence/reactionCarrier。debtId 是跨拍稳定身份;lifecycleAction 只能是 plant/carry/escalate/resolve/abandon。蓄力拍可以延迟兑现,但必须声明最早可兑现拍;禁止在 eligibleFromClipIndex 前完整兑现,关闭后禁止复活或重复兑现。eligibleFromClipIndex 必须指向本章真实存在的 beat,不能用 lastClipIndex + 1 虚构下一章位置。末拍新建或继续的跨章债务使用当前末拍作为最早允许位置,保持 plant/carry/escalate 未关闭,并由 handoffToNext 如实说明本章未兑现。
emotionTurn 回答情绪如何进动作:residueIn/before/trigger/suppressionLeak/after/actionChange/residueOut。除首拍承接上一章真实状态外,residueIn 必须逐字等于上一拍 residueOut;最后残留必须说明下一拍仍受什么压力约束,不能让人物无代价情绪重置。
pacingDecision 回答来源处理依据:sourceTreatment/essentialCausality/causalProvenance/handoffToNext。causalProvenance 必须与必要因果同索引一一对应,证据类型只允许 source_fact 或 necessary_physical_result,并记录原文锚点或已确认结果;推断和创作假设不得进入事实因果账本。full_chapter 的镜头表达可以重组,但来源事实和章级发声台账是守恒义务;bounded_duration 的删并必须有用户授权与可追溯裁决。
necessary_physical_result 不是自由发明的口子(硬红线,服务端已确定性校验)。 它只能承载"给定原文事实后必然发生的物理后果"——照亮、烟尘扬起、接住、握紧、后退、光斑移动。它不能承载"手法选择":递交还是抛出、走过去还是站着不动、先看谁后看谁,这些是导演取舍,不是物理必然。判据:凡 essentialCausality 条目含投掷类动作(抛/扔/掷/投/丢/甩/抛物线)或"而非/而不是"这类取舍句式,必须在同一 beat 的某条 source_fact 里引到原文同一动作,否则一律判非法、整份 BeatSheet 被拒。真实事故:某版把"苏晓直接抛出而非递交"盖章成 necessary_physical_result,而原文只写了核心是战利品——这个凭空发明随后锁进 causality 硬覆盖,分镜层无权拒绝,产出了两人贴身站着却大力抛投的荒谬成片。手法拿不准就别写进 essentialCausality,交给分镜层决定。
空间距离与动作必须自洽(服务端已确定性校验)。 startKeyframe/endKeyframe 里写下的人物距离,就是分镜层和渲染层必须遵守的硬约束。不要一边写"围在门前/面对面/前倾半步",一边要求一个需要距离的动作。若剧情确实需要抛投,就在首个 keyframe 明确把距离拉开并给出理由(不信任、戒备、有威胁物阻隔);若人物本就贴身,动作只能是递交、放置、塞进手里。
visualCarrier 是信息承载合同:每个被保留或压缩的世界观/任务/心理信息块至少声明一种具体载体及可见结果;voiceover_only 不能承载会改变观众理解的整段历史、任务逻辑或关键人物判断。
决策原则
- 平庸原文通常缺少的不是事件,而是压力、选择和后果。优先重组既有事实的揭示顺序,再考虑补最小连接动作;不得凭空新开剧情线。
- 快节奏是有效状态变化密度,不是镜头数量。一个安静物证改变人物判断,比五个无因果快切更紧。
- 爽点是预期与权力关系的可见改写。特效规模只有在承载这种改写时才有价值。
- 情绪越强,越要写人物如何维持控制以及哪里泄漏;哭喊、皱眉、握拳不能自动成立。
- 反转必须有可回看的预埋、明确揭晓和后续后果。只把信息藏到最后不叫反转。
- 只有
arcContract.closureMode=sequence_resolution才适用结尾钩子规则;钩子是否存在、如何收束服从用户需求。用户明确不要悬念/结尾时,不得把它改写成“开放式结尾”“胜负未决定格”或声画戛然而止;非终局窗口只做状态交棒。
边界
- 不写最终
shots或视频模型 prompt;交给单 clip writer。 - 不调用图片、视频或画布生成工具;资产 DAG 由
tapcanvas-video-workflow接管。 - 不用固定“前三章打脸”、固定反转间隔、固定镜数或张力分数替代题材判断。
- 不把 AI 自评分数当成功证据。评分只能指出复核方向,不能证明作品变好。
- 不在 Hono 或前端添加关键词、正则、题材 switch 或 case-specific 完成门禁。
章级复核
先完整执行 references/chapter-arc-audit.md 的功能带比较,再用以下问题做事实与连续性收口。问题清单不能替代审查协议:
- 去掉镜头术语后,每拍是否仍有清楚的目标、阻碍、选择和变化?
- 是否存在两个 beat 承担同一功能且没有新增局面?有则合并或改写。
- 若输入给出了逐拍因果进程,每个触发事件、判断依据、反制动作和兑现结果是否仍位于指定 beat?不得用“整体因果仍成立”替代逐拍一致性。
- 每笔期待债务最终在哪里兑现、升级或有意延期?
- 同一债务是否始终复用同一
debtId,是否发生提前兑现、关闭后复活或重复兑现? - 每个
eligibleFromClipIndex是否落在本章0..lastClipIndex内?跨章延期是否依靠未关闭生命周期与 handoff 表达,而不是指向不存在的下一索引?
- 同一债务是否始终复用同一
- 每次情绪变化是否实际改变下一步行动?
- 相邻拍
residueOut -> residueIn是否逐字连续,还是人物在切镜后被无代价重置?
- 相邻拍
- 爆发之后是否有可见反应或余波证明其意义?
essentialCausality、stateDelta与人物前史中的每项确定陈述能否回指源事实或必要物理结果?不能则降级为不确定感受、待确认假设,或删除。- 状态动作是否能从第一拍顺序重放到末拍?是否有重复
actionId、错误因果索引或before不承接上一终态?- 冻结前将本拍最后一条
storyEvents[].exitState、endKeyframe、对象endState、handoffToNext与下一拍startKeyframe并列回放。它们必须表达同一交接瞬间,区分准备、进行中和已完成;handoff 不能提前执行下一拍动作。服装、持物或地点改变时,在有序事件中分配真实过渡或明确时间省略,不能只在摘要中宣称连续。矛盾由本父作者修订实际事件和边界字段,不留给 writer 猜,也不增加宿主语义门禁。
- 冻结前将本拍最后一条
- 观众是否清楚当前跟谁看、知道什么、误信什么、下一步想知道什么?
- 若用户或权威来源要求悬念,最后一个画面是否承载了有因果依据的具体未解问题?若未要求悬念,是否避免添加未解问题、收势或余波?
- 若用户指定总时长,全部
durationBudget是否精确相加命中目标?逐拍对白、动作和反应是否真的能在各自拍长内完成? - 每拍能否仅凭可见行动与反应说清变化?是否把心理词、运镜套餐或长篇模型 prompt 当成了剧本内容?
- 每个保留、压缩或合并的关键内容是否能通过
causalProvenance回到原文锚点,用户是否能分清事实、推断和待确认项? - 是否先建立了章级原文发声台账?全部
dialogueScript回拼后是否与其逐条同序、逐字一致;是否有动作、行为、神态、环境或画面描述被误塞为旁白? - 是否先建立了视觉实体清单?每个可见实体是否有来源证据与逐拍落点;
audible_only / mentioned_only是否被误画,flashback_visible是否被误当当前空间,或有任何主体靠默认主角、名称关键词、全量资产并集补入? - 相邻拍的站位是否接得上?同场景相邻拍的机位是否仍在轴线同侧,人物位置与朝向变化是否都有
storyEvents支持,有没有无故换边、瞬移或背景人物漂移。 - 逐拍问“这一拍观众看见的是谁做了什么”:方向性转折与主要兑现能否各指出一个可见动作,反对力量的筹码是否写成行为而不是属性?只写成功能或结论的拍,必须回到本链补出可执行动作。
任何关键项没有证据,继续修订 BeatSheet,不能提交给并行 writers。
按需参考
- 需要理解本系统如何吸收 PlotPilot、诊断问题出生层或建立持续学习证据时,读取 PlotPilot 到小T的戏剧系统映射。
- 需要选择爽点、悬念、喜剧、克制情绪等不同结构时,读取 叙事机制与反例。
- 需要做章级复核或 AI 诊断时,读取 诊断与学习合同。
- 整章提交前必须读取 章级戏剧弧审查协议;它负责比较相邻拍、保护峰值占位和兑现余波,不是可选题材参考。
- 切 beat 前必须读取 视觉实体清单合同;它负责实体归并、在场性与现有合同映射,不产生新的持久剧本格式。
- 战斗、追逐、争夺或复杂人物误判,读取
tapcanvas-video-prompt-writer/references/dramatic-direction-contract.md;只吸收人物、导演与物理因果,不把它当 writer 后返工门。
对象注册字段类型:referenceImageNodeIds、referenceAssetIds 为字符串数组;identityInvariant 为非空字符串。可选的 forbiddenTransfer、scale 若提供,必须是非空字符串,不能是数组或 null;没有该说明时省略字段,不填占位值。
检索收敛与已有证据
候选回执中的 newCandidateCount / previouslySeenCandidateCount 仅报告精确候选身份与正文版本的新旧,不判断创作质量。再次搜索前先说明尚未解决的具体创作缺口,并核对已有候选是否已回答;不能只换措辞反复搜索同一情境。没有新增候选时,由当前 Agent 选择读取已有相关正文、记录弃选后原创,或说明新问题为何需要不同检索;不得把零新增当作任务失败,不设固定搜索次数或必读数量。结构修复期间继续消费已保留的候选与读取证据,不以重新检索代替修正字段。
逐段引用合同(v22):全局 objectRegistry 的引用是该对象的素材池,不是每段输入。每个 objectStates 显式提交 referenceAssetIds 与 referenceImageNodeIds 两个数组,选择当前段所需的有序子集,禁止省略后继承全集。已有引用的可见对象至少选择一张适用原图;没有已有引用的新增对象填写两个空数组,由原资产计划物化;referenceRole=none 对象也填空数组。整片的素材覆盖不等于每段重复全素材。逐段语义取舍与自检遵循 material-grounding,宿主只验证结构、成员身份并传递选择。
Version History
- 2.0.1 Current 2026-09-22 10:27


