不要让构建中的意外消失在滚动记录里,让 agent 在发生时记录每一次偏离方案的情况——这样意外会成为你下次尝试的输入。
「在构建导出功能时维护一份实施笔记文件。若遇到迫使你偏离方案的边缘情况,选择保守选项,在「偏离」下记录,然后继续。」
在 apps/api/src/exports/exportJob.ts 添加 ExportJob,入队到现有 BullMQ media-tasks 队列,使用专用 export 任务名。迁移 0121_export_jobs 与方案 schema 完全一致(status 枚举、requested_by、review_id、format)。
POST /api/v1/reviews/:id/export 端点请求校验按方案复用 apps/api/src/validation/ 中的 zod schema。format 接受 mp4-burnin | csv | bundle。返回 202 及任务 id;轮询端点按方案推迟到步骤 6。
Review.duration_ms 已反规范化且偶尔陈旧三个 fixture 审阅的 duration_ms 与源资产的探测数据不一致(像是重新上传后从未刷新)。导出改为从 MediaAsset.probe.duration 读取时长——与 playbackManifest.ts 已采用的做法相同。方案不变,仅为后续接触此处的人记下这个陷阱。
frame_ts;烧录渲染器可排序并将它们全部放在时间轴上。annotations 中约 12% 的行早于迁移 0087 且 frame_ts = NULL——它们是逐帧批注出现前的通用审阅评论。frame_ts 留空并设 legacy_comment 标志。导出包中无任何内容被静默丢弃。created_at 相对审阅会话的偏移插值时间戳——决定是否足够诚实以在视频中展示。drawtext/drawbox 烧录批注,按方案执行滤镜图构建器在 apps/worker/src/exports/burnin.ts。方案的逐批注叠加窗口(enable='between(t,a,b)')可用;针对 40 条批注压力 fixture 验证——在 worker 实例类型上渲染时间为实时的 1.4 倍,在方案 2 倍预算内。
Date 对象往返为字符串ExportJobPayload.requestedAt: Date,传递到 worker 并与审阅的 updated_at 比较以检测陈旧导出。Date。陈旧性比较在单元测试中静默强制转换并通过,但在集成运行的重新投递任务中失败。requestedAt: string ISO-8601),在 exportConsumer.ts 的 worker 边界解析一次。无自定义序列化器。media-tasks 载荷可能有同样的潜在 bug——任务载荷的共享 zod codec 可修复整类问题。archiver 依赖archiver 将导出包(视频 + CSV + 缩略图)构建为 zip 流上传到 S3。packages/media/src/zipStream.ts 已实现带背压处理的流式 zip——它支撑批量资产下载功能,自三月起已在生产环境运行。zipStream.ts。少一个依赖,包导出继承与批量下载相同的已测试背压行为。zipStream 位于 packages/media 但现在被两个功能使用——清理时值得提升到 packages/shared。转码管道发出 media:progress:{assetId} 事件。遵循相同约定——导出发出 export:progress:{jobId}——前端可复用 apps/web/src/hooks/ 中的 useProgressChannel(),而非方案草拟的轮询 UI。也保留了轮询端点作为后备。
guest_reviewer 角色授予审阅访问但 can_download_assets = false——客户用它让外部利益相关方评论而不将媒体带出。仅审阅 ACL 检查会让访客通过导出外泄源视频。guest_reviewer 的导出返回 403,镜像 assetAccess.ts 中现有资产下载检查。最严格可辩护的解读。当前行为(来自偏离 4):访客在所有导出格式上均获 403。若你希望访客导出无媒体的批注 CSV,在 exportPolicy.ts 中约 10 行改动加一个测试即可——但这会改变客户对「无法下载资产」的理解,应由你决定。不阻碍合并或 QA。
方案未指定生成包的 TTL。我将它们放在 exports/ S3 前缀下,使用 7 天生命周期规则,与分享链接过期一致——保守,且客户可见内容未承诺更久。但若合同或数据保留政策另有规定,infra/s3.tf 中的生命周期规则是唯一需改的一行。
三条可粘贴到下次方案或提示词的内容,避免下次运行重新发现今天的意外。
frame_ts 为 null。在实施开始前决定插值 vs. 侧车,而非在 14:41 构建中途。Date——media-tasks 载荷的共享 zod codec 可消除整类 bug。zipStream.ts 和 useProgressChannel() 都已存在且都优于方案版本。在方案模板中加入「搜索既有实现」步骤,并在下一功能触及 ACL 前确定访客审阅者导出策略。