第 56 章 项目状态、账本和事件系统

第十一部 Agentic 制片系统与自动化

第 56 章 项目状态、账本和事件系统#

本章目录
56.1 稳定身份、事实事件与状态机56.2 并发、任务驱动、回滚与故障诊断56.3 实体关系、事件溯源与冲突案例56.4 删除保留、不变量、审计与迁移56.5 业务事件、存储架构与确定性边界

56.1 稳定身份、事实事件与状态机#

聊天记录不是数据库。

项目真相必须存在结构化账本。聊天可解释决定,不能作为角色服装、镜头状态和发布版本的唯一来源。

稳定 ID。

项目、人物、服装、地点、道具、声音、集、beat、shot、generation、edit、QC、广告和指标都使用稳定 ID。文件移动和版本变化不改变身份。

事实、决定、事件。

事实记录当前有效值;决定记录为何选择;事件记录值如何变化。当前状态由批准事件重放得到,因此可以审计和回滚。

event:
  id: EVT_00421
  type: asset_version_promoted
  entity: CH_LINYUN_FACE
  from: v02
  to: v03
  reason: 侧脸结构修正
  approved_by: ART_DIRECTOR_01
  affects: [38_keyframes, 21_motion_clips]

依赖图。

Shot 依赖 Episode Beat、人物、服装、地点和道具;Generation 依赖 Shot 和关键帧;Edit 依赖 Generation 与 Audio;Release 依赖 Edit、Subtitle、Rights 和 QC。

图 56-1 身份版本变更如何沿依赖图传播

图 56-1 身份从 v02 提升到 v03 后,事件先追加到日志并更新当前状态;依赖图找出受影响的关键帧、动态、剪辑和发布候选,使其失效;修复任务完成后生成新快照,历史版本仍然保留。

关键点是“先记录事件,再传播失效,再调度修复”。系统不能先覆盖人物文件,再依靠团队回忆哪些镜头使用过旧版。新快照代表新的当前状态,但不会把旧 RC 的生产事实改写成从未发生。

修改一项资产时沿图查询直接和下游影响,不靠全项目人工搜索。

状态机。

每种工件有合法状态转换。例如关键帧从 needed 到 candidate、review、approved、locked;不能从 needed 直接 exported。非法转换拒绝并记录。

56.2 并发、任务驱动、回滚与故障诊断#

乐观并发与冲突。

两个智能体同时修改同一 Episode Pack 时,使用版本检查。后提交者必须重新读取差异,不能静默覆盖。人工决议进入 Decision Log。

事件驱动任务。

episode_pack_approved 触发资产解析和分镜任务;asset_changed 触发影响分析;picture_locked 触发最终字幕、混音和导出;P1_opened 阻断闸门。

事件只安排任务,不自动绕过审批。

快照与回滚。

重要闸门保存项目快照。回滚创建新事件指向旧版本,不删除历史。已发布版本永远可重建。

SOP。

第一步,定义实体和稳定 ID。第二步,确定每类账本所有者。第三步,写状态转换。第四步,建立依赖边。第五步,把修改记录为事件。第六步,处理并发冲突。第七步,在闸门保存快照。第八步,测试影响分析和回滚。

故障树。

**症状:各部门持有不同真相。**状态散落文件。建立权威账本和版本。

**症状:改资产后漏镜头。**没有依赖图。所有引用用稳定 ID。

**症状:回滚丢失后续工作。**覆盖文件而非事件版本。保留不可变历史。

56.3 实体关系、事件溯源与冲突案例#

检查表、练习与交付物。

检查所有实体是否有 ID;事实、决定和事件是否分开;状态转换是否合法;依赖是否完整;并发是否防覆盖;发布版本是否可重建。

练习一:画 E001_S09 依赖图。练习二:模拟服装更新影响分析。练习三:从 picture lock 回滚到上一版。

本章交付物:Entity Model、Event Log、Dependency Graph、State Machines、Snapshots、Rollback Report。

《逆光收购》的实体关系。

MD_BOOK_001 包含 E001;E001 包含 B01–B06;B04 被 E001_S08–S12 实现;S09 引用林筠身份、灰西装、董事会议室、授权书、授权图形、光线状态和声音 cue;运动结果被 Edit Timeline 与广告素材引用。

因此一次授权书签名日期修改,不是换一张图片:它会影响图形资产、S09 关键帧、运动合成、正片、广告、字幕或对白中的日期,以及所有已导出 RC。依赖图让系统得到这张清单。

事件溯源示例。

- id: EVT_101
  type: fact_changed
  entity: GRAPHIC_AUTHORIZATION
  field: signature_date
  from: 2026-07-02
  to: 2026-07-03
  cause: SCRIPT_FIX_018
- id: EVT_102
  type: dependencies_invalidated
  entities: [KF_E001_S09, GEN_E001_S09_004, EDIT_E001_V12]
- id: EVT_103
  type: regeneration_approved
  scope: graphic_and_composite_only

系统没有删除旧日期;它记录旧事实何时失效。过去发布版本仍能按当时状态重建。

物化视图。

事件日志适合审计,但每次从头重放可能慢。系统定期生成快照:当前资产版本、当前人物状态、当前开放 Issue 和任务状态。快照是日志的可重建视图,不是另一个独立真相。

写入顺序是先验证事件,再追加日志,再更新视图;更新失败可从日志恢复。不要先改 JSON 文件,随后“有空再补日志”。

并发冲突案例。

编剧在 v09 把父亲账户金额改为 300 万,图形设计师同时基于 v08 制作 320 万总账。设计提交时发现父版本已过期,任务进入 conflict。界面显示字段差异,由设计师重新生成,不允许“最后保存者获胜”。

对无冲突字段可以自动合并,例如编剧修改对白,声音导演补充发音;但任何合并仍产生新版本和父版本列表。

56.4 删除保留、不变量、审计与迁移#

删除也是事件。

删除镜头不应直接抹去。记录 shot_deprecated,取消未开始任务,保留已生成素材的历史引用,并检查音乐、字幕和编号是否需要重排。已发布素材仍可引用旧镜头,但新版本不得自动检索。

数据保留层级。

永久保存批准事实、权利、事件、母版和关键生成参数;项目期保存所有候选与中间文件;可按政策清理大体积拒绝素材,但保留缩略图、哈希和失败标签。任何清理不得破坏发布版本重建。

状态不变量。

除了 Schema,还要定义跨实体不变量:批准镜头只能引用 approved/locked 资产;同一人物同一时间只有一个有效基础服装;Release Candidate 的文件哈希必须与 QC 证据一致;P0/P1 开放时 can_advance=false;权利过期自动使相关 RC 失效。

不变量在事件提交前检查。若授权资产退役,系统允许历史版本保留,但阻止新 RC 使用,并创建下架或重新授权任务。

审计查询。

系统至少能回答:谁在何时把角色 v02 提升为 v03;错误金额进入了哪些文件;E001 发布时使用哪个模型和音乐许可;一次客户变更增加多少返工;某 P2 为何豁免。无法回答,日志只是堆积而非生产记忆。

Schema 迁移。

数据结构升级不能直接重写旧项目。迁移脚本保留原值、生成迁移事件并验证发布版本仍可重建;无法映射的字段进入人工队列。迁移前制作快照,迁移后比较实体数量、引用完整性和关键哈希。新旧智能体在过渡期必须声明支持的 Schema 版本。

迁移报告本身也属于永久审计记录。

三层真相模型。

系统同时管理规范真相、生产真相和发布真相。规范真相是当前批准的人物、故事、资产和权利;生产真相是某项任务实际使用的输入版本与结果;发布真相是某个 RC 在某一时间真实包含的文件。三者不能被一个“当前版本”字段混在一起。

林筠身份已经从 v02 升到 v03,不代表旧 RC 从未使用 v02;当前规范金额改为 3.2 亿元,也不能改写已下架测试版曾显示 3 亿元的历史。审计必须能在任何时点重建三层状态。

56.5 业务事件、存储架构与确定性边界#

失效不等于删除。

上游变化时,下游工件进入 staleinvalidated,而不是立即删除。stale 表示输入已变化但结果可能仍可通过复核,例如轻微服装纹理更新;invalidated 表示关键事实、身份或权利变化,结果不得继续推进。

失效事件要携带原因、变更字段、传播路径和建议动作。调度器暂停受影响任务,已发布 RC 进入风险评估,人工决定重验、重算、豁免或下架。自动重生成所有依赖既昂贵,也可能破坏已批准表演。

事件应表达业务语义。

“文件已修改”不是有用事件。系统需要 character_identity_promotedepisode_pack_approvedrights_expiredpicture_lock_revoked 等业务语义,因为不同事件有不同传播和权限。对象存储上传成功只是技术事件,不能自动等于资产批准。

事件至少包含行为者、时间、实体、前后版本、原因、证据、权限上下文和幂等键。同一请求重复到达时,幂等键阻止写入两个批准事件。

最小可运行存储架构。

小团队不必先建设复杂平台,但至少分开四类存储:关系或文档数据库保存实体与状态;追加式事件日志保存变化;对象存储保存图像、音视频和工程文件;搜索索引提供文本与相似检索。数据库只保存对象 URI 与哈希,不把大型媒体塞进聊天历史。

所有层共享稳定 ID。备份策略优先保护事实、权利、批准事件和 RC;可重新生成的拒绝候选可以按保留策略清理。系统每月随机抽一个已发布版本做重建演练,验证所谓“可追溯”不是纸面承诺。

幂等、顺序和重复事件。

外部服务重试、网络超时和消息队列可能让同一事件到达多次。每个业务动作带幂等键,写入前检查是否已处理;重复 asset_approved 不能再次触发预算、通知和下游任务。事件消费者保存处理位置,并能在崩溃后从上次确认点继续。

跨实体事件可能乱序。motion_generated 若先于 keyframe_approved 到达,系统不应假装前置闸门已通过,而应暂存、拒绝或标为孤儿。依赖条件由状态机验证,消息时间戳不能替代业务顺序。

事件重放与确定性边界。

从快照重放事件应重建相同的结构化状态,但不重新调用随机生成模型。事件记录的是“哪个候选被批准”和其内容哈希,不是要求重放时再次生成一张相似图。确定性属于状态恢复,媒体生成结果由对象存储保存。

重放测试选取随机项目和时间点,比较实体数量、关键字段、依赖边、RC 清单与哈希。发现差异时先检查非确定性迁移、隐式副作用和缺失事件。任何只能依靠当前数据库、无法从历史解释的字段都是审计缺口。

数据删除、隐私与审计的冲突处理。

权利方或隐私主体要求删除数据时,系统需要在法律义务、合同和审计之间做受控处理。敏感原文或生物特征可删除或隔离,事件日志保留不可逆匿名标识、删除时间、依据和受影响工件,证明系统执行过删除而不继续暴露内容。

删除传播到缓存、搜索索引、训练集、备份恢复策略和第三方供应商。只删主数据库而旧备份恢复后重新出现,等于没有完成。正式项目应由专业法律意见确定具体保留与删除边界,本书只提供工程控制框架。