不要按执行顺序排列方案,而是按你最可能修改每部分的概率排序——值得关注的决策优先浮现,机械性工作沉到底部。
以 HTML 形式写一份批注导出的实施方案,但把我最可能微调的决定放在前面:数据模型变更、新类型接口,以及所有面向用户的内容。把机械性重构埋在底部——那部分我信任你。
Acme · 将审阅的批注导出为可分享的 PDF 或 CSV · 分支 feat/annotation-export
三处我做了你可能不同意的判断。每个标记的选择都展示了我考虑的替代方案——切换以对比。
代价:繁重审阅约 40 KB/行;快照可能相对于实时线程变得陈旧。
选这个如果:导出是工作文档而非记录。一行告诉我:「使用实时 JOIN。」
代价:需管理 blob 生命周期;我会添加 30 天 TTL 清理(C 节第 6 项)。
选这个如果:存储/合规规则使存储副本不便。
'xlsx' 或 'srt' 只需一个联合成员 + 一个渲染器。TimecodeRange 让制作人只导出某个场景的评论。若无人需要,砍掉它可省约半天。'wont_fix' 请告诉我。步骤 3 为何薄弱:大多数导出会在 3 秒内完成,因此即发即忘的提示可能显得过度——但含绘图的 400 条批注审阅需约 20 秒,阻塞太久。混合方案(最多等待 4 秒,然后回退到通知)更友好,但增加约半天。你来定。
我实际会按此顺序构建。每步在 CI 上变绿;第 5 步翻转标志前不会有用户可见内容上线。
功能所需的重构与管道。此处无判断点——有意折叠。
AnnotationSerializer 从 api/annotations.ts 提取到 lib/serializers/,供导出 worker 复用。纯移动,无行为变更。CommentMarker → AnnotationMarker 重命名——仍有 3 个文件导入已弃用别名。annotation_exports 加入 fixture 加载器和 CI 数据库重置脚本。workers/index.ts 注册 exports.render,并加入死信告警列表。flags.yaml 创建特性标志 export_annotations,默认关闭。jobs/cleanup.ts 添加过期导出 blob 的夜间 TTL 清理(仅当选择 ② 保持不变时)。openapi.yaml 加入两个新端点并重新生成客户端。player/utils.ts 移至 lib/time.ts——PDF 渲染器需要它,不应从 player 包导入。你可发送的最高杠杆回复。复制一条、编辑、发送——我会修订方案。