Media Storage Lifecycle 是一个跨仓库的媒体与对象存储路由契约类技能,目的是为媒体存储选择最短生命周期且满足下一个真实消费者的存储边界,并使归属、过期、替换和删除行为显式化。该技能不承载实现细节,具体函数、模式、路径、保留配置和命令仍保留在各归属仓库的文档中。
用途 在添加、修改、审查或清理媒体与对象存储时使用,覆盖 WIN、modal_functions、aipodcasting、Remotion、本地转写、智能体等场景。
必需工作流
- 阅读当前活跃仓库的 AGENTS.md 以及 references/decision-guide.md 中列出的相关存储参考。
- 在选择存储前先命名下一个消费者,可能是:同一进程/容器;另一个 Modal 容器;WIN 或其他后台任务;浏览器或仅 HTTP 的服务商;面向用户的交付物;持久产品清单;或成为权威来源的外部服务商。
- 选择决策表中第一个满足该消费者的目标。
- 为任何公开对象定义所有者和稳定的键族,仅靠生命周期前缀不构成归属。
- 定义对象过期、被替换或所有者被删除时会发生什么。
- 为所选边界添加聚焦证明,并在行为变化时更新归属仓库的持久文档。
存储决策表
- 容器本地文件:当生产者和消费者在同一次容器调用中运行;必需行为是在 finally 中删除,绝不远程序列化或返回该路径。
- Modal 内部产物:当另一个 Modal 容器或有限重试需要这些字节;使用类型化 MediaArtifactRef,验证能力/清单,由 72 小时产物生命周期或精确运行清理移除。
- R2 cache/:当浏览器、独立调用方、后台任务或仅 HTTP 消费者需要 URL;视为临时传输,持久化来源,复用前验证,缺失时重新获取或重新生成。
- R2 share/:当有意限定时间、面向用户或跨机器的交付物需要比普通缓存存活更久;要求指定产品所有者并记录过期,绝不作为无归属的默认处理项。
- R2 permanent/:当对象是规范持久清单或保留的产品资产;使用所有者稳定的键、权威引用、替换清理和所有者删除清理。
- 服务商自有存储:当 Ghost、YouTube、Transistor、Frame.io 或其他目的地接收并拥有最终字节;尽可能直接上传,持久化产品所需的服务商身份,在没有单独消费者时不要在 R2 保留重复的最终副本。
对于全 Modal 子图中的每个中间产物,使用本地或 Modal 内部存储。仅在第一个真正需要 HTTP URL 的消费者处才公开物化。
归属与清理规则 通用工具默认使用 cache/;share/ 和 permanent/ 需要显式归属工作流。浏览器 API 暴露用途/上传意图,而非原始生命周期文件夹选择。每个持久键都应标识其所有者,例如 permanent/ads/<source_id>/... 或 permanent/channel-assets/<channel>/...。安全替换:先提交新的权威引用,仅当没有其他记录共享时才删除先前的精确受管对象。完全删除:移除依赖记录/配置以及精确归属对象;媒体缺失是幂等的无操作。如果提交后清理失败,保持新引用有效,记录孤儿,并让清单报告检测它,不要回滚到已失效的 URL。Mongo 中存储的 cache/ 或 share/ URL 不会仅因字符串保留而变为持久;活跃工作必须验证它并重新获取、重新生成,或明确要求重新上传。当临时存储可能过期时,保留原始服务商/来源出处。绝不批量删除前缀,除非先解析其精确候选集和受保护引用。为已批准的破坏性清理记录前后计数和字节数。
仓库路由 对于 Modal 入口点或产物契约,同时使用 $modal-function-sync。对于 WIN/AIP 公共任务或生成前端契约,同时使用 $win-aip-contract-sync。跨仓库决策保留在此处;确切的函数、模式、路径、保留配置和命令保留在决策指南链接的归属仓库文档中。将确定性清单、孤儿检测和生命周期验证放入归属仓库的 scripts/checks。技能教授工作流,不是执行机制。
验证清单 所选目标与下一个消费者匹配,且不存在更早的公开边界。没有新函数或浏览器上传默认使用 share/ 或 permanent/。过期引用具有验证和恢复行为。替换和删除测试证明顺序和共享引用安全。服务商上传证明未创建不必要的 R2 最终副本。计划清理覆盖新的 Modal 缓存命名空间和适用的已放弃分片上传。存储行为记录在持久架构/参考文档中,而不仅是活跃项目跟踪器。