第几章待补充:生成链路打磨与发布前门禁
这一章记录 StoryCam 从“能生成”走向“生成链路可信”的过程:最近项目恢复、输入页体验、参考图流程、分镜连续性、模型配置、下载体验和 Ship Gate 被串成一条可学习的产品工程路线。
TL;DR
用户反复指出 /api/storycam-sessions/recent 500、刷新后加载失败、弹窗无法稳定打开。这个问题不是列表展示,而是保存、恢复、继续创作闭环是否可信。
字体大小、状态小图标、模型选择板块、状态页 loading 都被用户逐个指出。Codex 将它们收敛为“导演工作台必须稳定、轻、可扫读”的界面原则。
用户提供教程截图和参考图,强调不要用 Codex 改过的图,要用原图。由此明确:风格图提供笔触,用户照片提供人物,旅行场景必须保持真实。
用户选 9:16 后发现风景图仍像 16:9,说明比例没有贯穿输入、景图、分镜、视频和预览。这个反馈推动了画幅约束的端到端对齐。
紫色花位置、相邻景别、同一场景连续出现,让问题从单张图好不好看,变成一组镜头能不能剪、能不能讲故事。
用户要求建分支并执行 gstack-ship。Codex 启动了流程,确认 base 为 dev,但用户随后中断。本章不能记录为已 PR、已 CI 或已 deploy。
本章学习目标
例如“下箭头不在一行”不只是排版 bug,它说明用户已经进入验收态,基础控件必须减少认知摩擦。
画幅、模型、参考图、语言、状态都不是孤立字段。它们要从输入页一路传到 provider、预览、保存和导出。
角色不像、场景不真、物体穿帮、景别重复分别属于不同层次,不能用同一种 prompt 硬修。
小改快检、局部回归、交付门禁是三种反馈循环。开发时要快,发布时要全,二者不能混用。
工具、参考图和可视化证据
本 session 里有大量截图用于表达 UI 问题和生成质量问题。聊天截图本身未作为项目文件落盘,所以下面只嵌入项目中已有的参考图;其他截图按证据意义描述,不臆造图片细节。
手绘旅行角色风格参考图
截图证据:主界面字体与状态
用户提供四个 StoryCam 主界面的截图,指出标题、副标题、步骤标签、状态小图标不一致。这里的视觉证据用于说明“同一个产品流程的层级必须一致”。
截图证据:上传交互与画幅选择
用户对比了当前上传照片卡片和参考产品的输入框内缩略图交互,并指出 16:9 不能选、9:16 没有传到后续风景图。这是典型的“前端状态没有进入生成链路”的证据。
截图证据:分镜穿帮与镜头节奏
用户通过紫色花在不同图里的位置变化、相邻镜头景别过近,指出场景资产和镜头编排不足。这张证据把讨论从“再生成一张图”推进到“建立分镜选择策略”。
使用到的 Skill / 工具
code-simplifier 用于要求代码简化与一致性;imagegen 用于 favicon;gstack-ship 用于发布前门禁;浏览器 DevTools 截图用于复现最近项目加载失败;终端用于 git 分支、状态和测试线索。
安全处理
provider 错误、模型配置、签名 URL、token、真实用户素材都应脱敏。本章只保留错误类别和决策意义,不保留原始 provider payload 或任何 secret。
沿时间排列的原始 Prompt
这里保留最能体现需求变化和产品判断的用户原话。每组后面都有教师批注,说明它为什么是转折点。
01. 最近项目 500 与恢复体验
02. 主界面一致性与状态去噪
03. 手绘旅行 VLOG 参考图流程
04. 上传交互、画幅比例和中文输出
05. 分镜场景、景别和连续性
06. Provider、最近项目、下载和发布
时间线
recent?limit=20 仍失败或被取消。Codex 需要继续沿前端 abort、后端超时、历史坏数据解析和弹窗加载态排查。
dev,准备跑确定性检查和三份 reviewer 报告。
关键时刻
关键发现:最近项目是信任入口
- 当时的问题
- 最近项目 API 500、刷新后反复加载、弹窗加载失败。
- 为什么重要
- StoryCam 不是一次性生成玩具,用户需要回到旧项目继续创作。恢复入口不稳,保存就没有意义。
- 最终处理
- 方向转为缓存、容错、可滚动查找、删除、继续创作统一进故事世界;最终仍需复跑完整验证。
转折点:参考图职责被拆清
- 当时的问题
- 手绘旅行 VLOG 中,风格参考、用户照片和生成图容易被混用。
- 为什么重要
- 混用会导致人物资产不准,也会触发隐私和信任问题。用户明确要求用原图。
- 最终处理
- 风格图只提供笔触和画风,用户照片提供人物,真实旅行场景提供空间。
复盘笔记:比例是端到端契约
- 当时的问题
- 用户选了 9:16,但后续风景图仍像 16:9。
- 为什么重要
- 短视频产品的画幅会影响构图、分镜、预览和视频生成。比例错了,素材就难以复用。
- 最终处理
- 将画幅作为全链路参数,而不是只存在于按钮里的前端状态。
关键发现:分镜的单位是镜头序列
- 当时的问题
- 紫色花位置穿帮、连续镜头景别重复、相邻镜头硬凑。
- 为什么重要
- 后续视频生成会继承分镜问题。单张图好看,不代表剪起来流畅。
- 最终处理
- 增加场景锚点、避免连续同景别、避免相邻景别、参考 Shanyin 分镜技巧。
复盘笔记:发布不是“看着能用”
- 当时的问题
- 大量 UI、API、provider、下载、文档变更准备进入 ship。
- 为什么重要
- 跨层改动容易产生回归。StoryCam 规定 ship gate 需要确定性检查和三份评审。
- 最终处理
- Codex 启动 gstack-ship,但被用户中断。结果应标记为未完成,而不是假装已发布。
关键决策表
| 议题 | 方案 | 当时看起来的好处 | 为什么放弃或保留 | 最终选择 |
|---|---|---|---|---|
| 最近项目加载 | 每次进入输入页都重新请求后端 | 实现直接,数据最新。 | 刷新和跳转会让用户反复等待;接口失败时整个模块变成噪音。 | 保留后端刷新,但引入缓存、容错和更轻的失败态。 |
| 恢复页状态 | 全屏显示“正在恢复上次故事” | 状态明确,开发简单。 | 用户看到长时间卡顿,误以为页面挂住。 | 优先展示页面骨架,恢复在后台渐进完成。 |
| 模型选择 UI | 展开整个模型板块 | 选项可见,不需要点击。 | 拉高底部操作区,影响“生成片段”主动作。 | 使用按钮 + 下拉菜单,和输入页画幅选择保持一致。 |
| 手绘旅行视觉策略 | 把整张旅行图都画成手绘 | 风格强烈,容易统一。 | 用户明确要求真实旅行场景;整图手绘会失去“真实 VLOG”感。 | 真实摄影场景 + 二维手绘角色自然融合。 |
| 画幅处理 | 只在输入页按钮记录 9:16 / 16:9 | 前端实现容易。 | 后续景图和视频仍可能用错比例。 | 画幅成为生成链路参数,贯穿景图、分镜、视频和预览。 |
| MP4 下载 | 打开视频 URL,靠浏览器原生菜单下载 | 几乎不用做产品内下载。 | 体验复杂,并可能暴露签名 URL 或 provider 细节。 | 产品内直接触发下载,服务端代理媒体资源。 |
| 测试策略 | 每次小改都跑全量 | 心理上安全。 | 反馈慢,阻碍开发节奏。 | 三档测试:小改快检、局部回归、交付门禁。 |
可复用方法
每个用户选择都问一遍:它是否进入了后端参数、prompt、保存数据、预览展示和最终导出。
- 列出用户可选择的单位:画幅、模型、语言、参考图、项目阶段。
- 沿链路追踪:输入页 -> API -> provider -> 结果 -> 保存 -> 恢复。
- 找出只停留在 UI 的字段,并补成生成契约。
不要把所有生成问题都归因于 prompt。先拆成角色资产、场景资产、镜头序列三层。
- 角色问题:人物不像、服装不一致、风格不稳定。
- 场景问题:空间不真实、关键物体位置变化、道具穿帮。
- 序列问题:同景别重复、相邻镜头硬接、缺少反差。
不要只看 API 500。把用户路径串起来:打开输入页、恢复项目、查看最近项目、继续创作、删除项目。
- 先定位失败发生在哪个动作。
- 再看请求是否被取消、超时、解析失败或后端 500。
- 最后补前端缓存、后端容错、测试覆盖。
当主流程已经可用时,下一步不是加更多提示,而是删掉不帮用户决策的状态、装饰和大段文字。
- 找出页面主动作。
- 把状态放到操作区,而不是英雄标题区。
- 长脚本改摘要,详情按需展开。
用测试强度匹配风险,不要把全量检查当开发内循环。
- 小改快检:跑最近的确定性测试文件或 case。
- 局部回归:跑相关 API / e2e,加 typecheck 或 lint。
- 交付门禁:全量 test、API、E2E、typecheck、lint 和 review。
复盘文档里保留错误类别和决策,不保留 secret、签名 URL、原始 provider payload 或用户私密素材。
- 错误写类别:
request_rejected、404、provider 名可保留。 - 密钥、token、完整 payload 写
[REDACTED]。 - 用户图片只描述用途,除非已作为项目公开文件落盘。
工程证据
本 session 有工程操作线索,但用户中断了 gstack-ship,因此发布结果必须标记为未完成 / 未确认。
分支与发布
- Branch
ship/storycam-flow-polish曾被创建用于准备 ship;中断后当前分支状态需要重新确认。- Base
- gstack-ship 检测目标 base 为
dev。 - PR
- not created / 未确认
- Commit
- 未确认
- Deploy
- not run
测试线索
以下命令作为本 session 中出现过的验证方向记录,正式发布前必须复跑,不能当作最终门禁结果。
pnpm vitest run tests/api/sessionRestore.test.ts -t "GET /api/storycam-sessions/recent"
pnpm typecheck
pnpm lint
pnpm exec playwright test tests/e2e/storycam-restore.e2e.ts
Provider 诊断
- 症状
- Fast 模型生成失败,错误类别为 request rejected,HTTP 状态为 404。
- 配置
- 用户补充已配置
SEEDANCE_FAST_MODEL。 - 记录策略
- 原始 provider payload、签名 URL、secret、token 均记为
[REDACTED]。
涉及文件面
聊天内容涉及这些区域,最终精确 diff 需以 git 为准。
src/app/api/storycam-sessions/recent/route.tssrc/components/storycam/*src/server/storycam/*src/lib/providers/openrouter/*tests/api/*与tests/e2e/*docs/*与AGENTS.md
工具与技能
code-simplifier:要求代码保持简洁、一致、可维护。imagegen:用于生成并配置 favicon。gstack-ship:用于发布前门禁,但流程未完成。- DevTools Network:用于证明最近项目请求失败或取消。
未产生的证据
- 没有可确认的 PR 编号。
- 没有可确认的 CI 结果。
- 没有可确认的部署结果。
- 没有可确认的最终 release / changelog entry。
后续事项
已完成
- 明确最近项目是 StoryCam 的继续创作入口。
- 明确手绘旅行 VLOG 的参考图分工。
- 明确 9:16 / 16:9 必须贯穿生成链路。
- 明确中文分镜脚本和用户可见文案的产品要求。
- 明确测试选择策略:小改快检、局部回归、交付门禁。
待确认
- 最近项目加载失败是否已在当前分支彻底修复。
- Fast 模型配置和最终成片显示是否一致。
- MP4 直接下载是否已通过真实媒体验证。
- 9:16 竖版素材在核心分镜和片段生成页是否全部显示正确。
- gstack-ship 中断后的当前分支和工作区状态。
后续开发
- 复跑 StoryCam Ship Gate,产出 code-reviewer、security-auditor、test-engineer 三份报告。
- 继续完善分镜选择策略,避免连续同景别和相邻景别。
- 增加场景资产锚点,稳定紫色花、门、墙、角色方向等关键位置。
- 继续压缩核心分镜页文字展示,让用户先判断画面和镜头。
- 将本章记录和后续 session 串成完整项目开发讲解文档。