Files
ttstd-infinite-canvas/docs/content/docs/progress/pending-test.mdx

2397 lines
321 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 待测试
description: 当前项目已实现功能的手工验证清单与未确认边界
---
# 待测试
## 工作台菜单表面与素材显示密度
- [x] 根据焦点样式反馈,内容库筛选下拉取消鼠标 / 触屏点击后的粗外圈,聚焦和展开改用柔和底色;工具栏区分指针与键盘输入,键盘聚焦保留 1px 细轮廓,不主动移除焦点。离开工具栏后恢复键盘默认状态,相关复用筛选入口同步生效。本轮 12 项专项测试及类型检查通过;指针 / 键盘切换仍需真实页面验收。
- [x] 顶部和侧栏账户菜单共用无描边、无投影表面,去掉箭头、装饰分隔线和积分卡渐变;清理旧版 `ant-popover-inner` 覆盖,使用当前组件的 `ant-popover-container`。
- [x] 用户工作台 Select、Dropdown、Popover 通过显式组件类共用柔和表面和中性选中态;内容库工具栏的 Select 统一使用 filled 变体,保留禁用、危险操作和键盘焦点状态。后台、画布编辑器的通用浮层以及 Modal / 通知不纳入本次修改。
- [x] 修复素材密度状态被固定 224px 网格覆盖的问题:舒适 / 标准 / 紧凑分别采用 272 / 208 / 160px 卡片最小宽度,随容器自动换列,窄容器不会超宽;保持原有本地偏好值。密度入口补充无障碍名称,网格图标前置,恢复下拉箭头。
- [x] 13 项专项测试通过,覆盖偏好恢复、密度尺寸策略、真实工具栏静态渲染与浮层配置、主题 token、样式边界及 CSS 层顺序;前端类型检查、生产构建和 `git diff --check` 通过。构建仍提示部分 chunk 超过 500 kB,未在本次进行无关拆包。
- [ ] 本地真实 `/assets` 路由跳转登录页,尚未完成浏览器视觉与交互验收:登录后在明暗主题检查两个账户入口和列表菜单;切换三档密度、刷新恢复偏好,检查窄屏、长文案、禁用态和键盘导航。静态渲染及尺寸策略测试不等同于浏览器验收;未部署线上。
## Agent 磨砂面板与紧凑操作区
- [x] 根据视觉反馈增强磨砂:外壳底色混合比例由 88% 降至 68%,背景模糊调为 32px、饱和度调为 145%,加入轻微柔光而不增加描边;保留减少透明度偏好的不透明降级。模型选择框由 144px 加宽至 208px,保留最大宽度限制、操作区换行和完整名称悬停提示。
- [x] 真实 Agent 组件改为磨砂外壳、无分隔线头部、柔和消息与工具表面;新增空态技能入口和只填草稿的创作建议,保留审批与错误状态。
- [x] 执行权限入口只显示当前模式图标,点击打开原权限选择菜单;只读、请求审批、自动执行使用不同图标,悬停提示和无障碍名称保留当前权限。Skills 入口缩短为 `Skills(x)`。
- [x] 左上缩放手柄向面板内部偏移并改为对角缩放图标,保留拖动和方向键调整;欢迎语从品牌配置读取名称,显示「在这里,和{品牌名称}让灵感,慢慢成形」。
- [x] 发送按钮从 36px 缩小为 28px、箭头从 16px 缩小为 14px,去掉发光阴影;停止按钮同步缩小。发送、空草稿禁用、发送中禁用逻辑不变。
- [x] 27 项专项测试通过,覆盖空态品牌文本转义、空画布入口、三种权限图标、发送禁用状态、面板尺寸算法、工具消息和 CSS 层顺序;前端类型检查通过。
- [ ] 在已登录的真实画布复验明暗主题、窄屏及长品牌名称换行;确认左上缩放图标与键盘焦点不再被圆角裁切、权限菜单和 Skills 入口可用、发送按钮大小合适。本次本地浏览器停留在登录页,未完成这些视觉/交互验收;未调用生成任务或部署线上。临时预览网络拦截已撤销。
## 生产构建 CSS 层顺序
- [x] 本地产物确认:应用动态加载的依赖列表中,内置编辑器 CSS 先于全局 CSS;编辑器先声明 `utilities` 层,会使随后出现的 `base` reset 优先于工具类,影响画布和 Agent 等区域的间距、边框与布局。
- [x] HTML 最早内联样式固定 `theme, base, components, utilities` 顺序,不依赖生产拆包的 CSS 加载顺序;未调整画布业务逻辑或逐个组件添加覆盖。
- [x] 两项层顺序回归和一项相邻滚动条回归通过;前端类型检查与生产构建通过,并确认构建后的 HTML 在外部样式和脚本之前保留层顺序声明。
- [x] 登录线上真实画布确认同样的 CSS 加载顺序:Agent 内容区 `px-5 py-5` 计算内边距为 `0px`。仅在调试标签页头部临时声明层顺序后,内容区恢复 `20px`,头部恢复水平 `16px`,输入区外层恢复 `8px 12px 12px`;截图确认留白恢复。撤掉临时声明后内容区再次变为 `0px`,验证因果关系。未修改服务器、提交生成/审批或编辑画布内容,临时样式已移除。
- [ ] 发布后复验画布与 Agent 的消息内边距、待办间距、输入区和工具栏,覆盖冷启动直达、站内导航、明暗主题。本次浏览器验证为暗色空对话面板,未覆盖原截图的历史审批会话;线上尚未部署修复。
## 画布素材链路与工作条改造(2026-09-19)
已实现:
- 素材库已有手动新增、重命名、删除分类,以及分类筛选和批量移动能力。
- 画布支持“设置隐藏节点连线”:开启后隐藏普通连线,悬停、聚焦或选中节点时显示关联连线。
- 画布底部素材入口改为带“素材”文字和数量徽标的按钮;手势切换恢复无文字的纯图标胶囊滑块,不使用标签按钮外观。
- 手势图标固定为 16px,统一选中 / 未选中描边粗细,未选中态使用不透明颜色而非整体半透明。工具栏切换专项覆盖普通 / 紧凑尺寸、无文字及单个圆形滑块的真实组件静态渲染;尚未完成浏览器视觉验收。
- 远程素材展示统一走资源文件地址;Blob 只保留给字节处理和本地缓存,不作为远程媒体展示 `src`。
- 画布生成视频在进入成功态前先完成 Blob 缓存;缓存失败不得标记成功。
- 文本节点字号随节点尺寸联动,普通文本、富文本和编辑态保持一致。
自动化验证已完成:画布连线可见性与文本字号专项测试通过,前端类型检查和 `git diff --check` 通过。以下仍需真实页面验收:
- [ ] 登录真实账号打开素材库,新建、重命名、删除分类并移动素材;确认刷新后分类和素材归属仍正确,删除分类不会删除素材文件。
- [ ] 在浅色、深色主题和窄屏布局下检查画布底部工作条,确认素材数量徽标、选择 / 移动切换、键盘焦点和提示文案可读。
- [ ] 开启隐藏节点连线后,确认默认连线不可见且不可点击;悬停、聚焦、单选和多选节点时只显示关联连线,取消交互后恢复隐藏。
- [ ] 使用真实视频生成渠道验收:资源缓存完成后再显示成功;网络或资源下载失败时显示失败,不出现“成功但视频不可播放”。
- [ ] 调整文本节点宽高,确认普通文本、富文本和编辑态字号都随尺寸变化,极端尺寸仍在可读范围内。
## Agent 工具诊断与错误恢复
针对交互日志中的字段误报、输出可引用状态被误认为输入缺失、已绑定任务无法诊断、展示字段导致审批快照失效等问题,调整工具的数据合同和共用准入规则。没有新增场景关键词路由、自动选参考图、自动重试生成或新的系统提示词规则;工具说明明确区分编辑画布和提交收费生成,去除具体广告场景例子。
- [x] 后端 `go test ./internal/app -run 'TestCloudAgent' -count=1` 通过:操作字段错误与修正后的预览、失败/取消任务诊断及跨用户/画布隔离、敏感错误脱敏、已绑定任务拒绝、展示信息自动保存不阻断审批、实际内容变化仍阻断、取消来源只记录一次;使用临时 SQLite 和模拟任务,未调用收费模型。
- [ ] 真实模型验收:相同画布分别请求“只连线”“只创建节点”“生成视频”,确认工具选择符合意图;读取失败视频时能区分产物不可引用与实际任务错误,按字段诊断修正参数,不自行换节点重复生成。
- [ ] 发布后验证页面引用标签与任务错误可见性、审批期间移动/缩放节点及自动保存、取消后导出日志中的来源与关联任务。旧审批快照算法变化时需重新读取审批;未做线上部署或真实收费模型对比,不能以合同测试代替模型行为验收。
## Agent 媒体提示词引用标签
Agent 创建或续用未提交媒体草稿时,保留已有 `@图片N` / `@视频N` / `@音频N` 引用,为遗漏的已选画布素材补齐带名称的引用块。各类型独立编号,目标入边与任务参考数组顺序一致;草稿、审批与实际提交使用相同提示词。模型工具说明同步要求在对应描述中使用引用标签,编号越界和补齐后超长均在提交前报错。
- [x] 后端媒体、画布阶段事件与审批专项通过,覆盖编号与顺序、已有引用不重复、无引用任务、临时标注图、长度上限、草稿持久化、审批后提交及重放不重复收费。
- [x] 前端 11 项实际引用解析与生成上下文测试通过,覆盖图片/音频/文本混排、槽位编号、引用移除和再次提交。
- [ ] 更新后端后,在真实页面验证 Agent 生成节点中的引用标签、缩略图/音频标识、刷新和续用草稿。本次未进行浏览器验收或线上部署;历史节点不自动补写。
## MiniMax H3 视频失败原因透传
MiniMax Hailuo Video V2 / H3 插件更新至 `2.0.1`,创建和查询均优先读取 `task.error.message`,并识别 `task.error.code`。参考图片尺寸不符合要求等具体错误通过已有任务错误字段返回,避免被替换成“上游返回失败状态”。补回该插件的可维护源码目录,并同步插件包和接口文档。
- [x] 插件专项回归覆盖嵌套错误、缺少任务状态、具体错误优先级、已有错误格式和成功响应;相邻视频媒体角色测试通过。
- [x] 后端模拟 HTTP 上游验证创建失败与轮询失败,具体原因进入任务错误文案,且不重复提交;前端实际错误格式化函数和画布失败元数据保留该原因。插件包与源码一致,其他请求、结果映射保持不变。
- [ ] 更新线上插件后,以真实失败任务验收画布和任务详情的错误展示;本次未部署、未调用收费模型。历史失败任务已保存的通用错误不会自动改写。
## 模型展示名归组与管理员积分成本
创作目录固定直接读取系统渠道模型,一级按模型展示名跨渠道分组,二级按各模型的渠道展示名展示;删除渠道级“前台名称”,不反查逻辑模型。成本配置限定在管理员价格档编辑,按下单快照核算,后台请求记录与 CSV 显示销售价、成本价;普通用户目录、报价和账单不返回成本字段。
- [x] 前端生产构建(含类型检查)与 35 项专项通过,覆盖跨渠道展示名分组、独立调用身份、成本回填与微积分换算。后端数据库、仓储、HTTP handler 全套回归通过;全包编译与成本/目录专项通过,覆盖管理员权限、用户接口字段隔离、历史快照、精确用量核算、迁移幂等和备用线路成本切换。
- [ ] 在真实后台对调历史填反的模型展示名/渠道展示名,确认 MiniMax H3 一级下显示秘塔(满血渠道);同名模型跨渠道归组,不同调用 ID 保持独立。
- [ ] 在 PostgreSQL 部署验证 schema v27,编辑按次、按秒、Token 成本后刷新回填;生成成功后核对销售金额与成本金额,改价不得影响旧订单。
- [ ] 用普通用户登录检查网络响应,确认没有成本配置、快照或成本金额;对管理员成本接口的读写均应被拒绝。
## 画布删除不再预加载关联素材
登录后的画布删除直接按 ID 请求服务端,不再先进入编辑加载流程,避免历史素材的 MIME 等字段校验阻塞删除。保留账号会话检查、服务端删除失败上抛及成功后清理本地缓存的顺序。
- [x] 26 项画布同步与素材合同专项测试通过;新增回归覆盖关联素材为 `image/*`、未缓存画布、重复 ID,以及批量删除部分失败后缓存与模拟服务端状态一致。
- [ ] 在真实账号下从画布列表和编辑页删除包含异常 MIME 素材的画布,刷新确认已删除;自动化验证使用模拟 API,未删除实际账号数据。
## 站点皮肤、控件焦点与外观分类
主按钮填充改为主题参数统一管理,经典黑白采用黑白基础色与 115° 紫蓝渐变;复制主题后可分别编辑明暗模式的纯色/渐变、角度、常态/悬停/按下双色和文字色。创作页“开始创作”与前后台主按钮使用相同参数,危险、幽灵和禁用按钮不套用渐变。后台隔离用户工作台外壳与浮层样式。输入、选择、日期和搜索控件移除重复焦点阴影,保留键盘焦点与错误状态。站点及外观按品牌、登录页、欢迎页、SEO、页尾备案、皮肤六个 Tab 展示,页面草稿统一保存,欢迎页开关继续独立即时保存。
- [x] 前端生产构建、后续类型检查及 9 项主题/渐变专项通过,覆盖主按钮状态、纯色切换清理、复制隔离和非法参数降级。后端外观专项通过,覆盖保存/读取/公开投影、旧数据补齐、非法参数拒绝及经典主题保护。外观 JSON 升为版本 8,无表结构迁移。
- [x] 隔离浏览器在真实外观路由验证跨 Tab 草稿保留、撤销、校验定位、隐藏视频卸载,以及明暗模式下经典/自定义按钮常态和悬停颜色、输入框无阴影、键盘焦点可见及 390px 无横向溢出。会话与配置使用测试状态,未保存真实站点设置。
- [x] 渐变扩展后,真实创作页和插件页验证经典主按钮明暗配色;后台编辑器验证纯色/渐变切换、角度修改、跨 Tab 草稿保留、撤销后保存按钮禁用、危险按钮不套用渐变。修复旧配置归一化后误报未保存状态;选择框键盘导航使用可见外框。浏览器 API 为隔离测试配置,持久化由后端临时 SQLite 服务测试验证。
- [ ] 用真实管理账号保存主题并刷新前后台,确认常态、悬停、按下、禁用、危险操作和浮层控件配色一致;验证媒体文件跨 Tab 选择后保存与刷新回填。
- [ ] 渐变相关三文件回归为 16 通过、1 失败,失败为原有后台旧警告色别名断言。上一轮完整相关回归还发现模型编辑器网格 CSS 顺序、首屏内置 Logo 引用、BrandLogo 旧主题 hook 三项原有失败;未修改这些无关实现。
## 模型描述与稳定悬浮
后台渠道模型编辑的“模型身份”区新增“模型描述”,公开目录和会话配置透传到二级选项。说明行预留固定高度,一级菜单取消悬浮位移,二级选项取消高度动画;选中、悬浮及键盘聚焦仍显示说明。系统模型未填写描述时不生成名称推测文案。
- [x] 前端 21 项专项测试及含类型检查的生产构建通过;后端保存/公开投影/描述长度专项、数据库包全套迁移回归及接口路由/OpenAPI 冒烟通过。
- [x] 隔离浏览器加载真实选择器,连续六次切换悬浮的位置和尺寸一致;已配置/空描述、聚焦显示、渠道选择、键盘、明暗图标及 390px 无横向溢出通过。真实编辑组件验证描述回填、修改后提交去空白文本、清空后提交空字符串;接口被测试拦截,未写真实模型。
- [ ] 在真实管理账号下保存、重新打开并清空描述,刷新创作端确认内容同步;在画布与创作页确认长描述、明暗主题与键盘选择。
- [ ] PostgreSQL 部署验证 schema v26。此次迁移只添加默认空字符串列;关闭自动迁移时先执行 `migrate-schema up` 和 `migrate-schema verify`。不提供降级迁移,回退使用匹配的数据库备份与二进制版本;未操作实际部署数据库。
## 产品模型分组与渠道展示名
系统渠道目录按模型展示名分组,二级展示独立渠道名称和价格;“渠道展示名”留空使用所属渠道名称。选中值仍为渠道 ID 与模型调用标识,个人渠道保持原选择合同。模型 Logo 按需加载原色版本,移除菜单位置染色。
- [x] 前端专项覆盖同产品多个渠道、价格透传、名称变化不改调用身份、能力隔离、排序时元数据稳定,以及逻辑模型和个人渠道边界。
- [x] 后端 SQLite 专项覆盖字段保存、公开目录及会话投影、长度与管理员校验;版本 24 迁移重复执行保留旧记录的身份和价格。
- [x] 前端构建与类型检查通过;隔离浏览器在现有应用中加载真实选择器组件,验证 3 个渠道及 0.3/0.3/0.2 积分单价、鼠标和键盘选中身份、Esc 关闭、390px 无横向溢出,以及明暗主题下图标原色保持一致。使用测试配置,未修改真实渠道。
- [x] 数据库包全套回归通过;旧迁移测试夹具补齐基线应有的 `billing_orders`,覆盖 v24、v25 连续升级。
- [ ] 使用实际配置确认跨渠道的产品模型标识、展示名和 Logo 一致,填写各渠道展示名后验证画布、创作页与 Agent 模型入口。
- [ ] 在 PostgreSQL 部署执行版本 24 迁移并验证目录;迁移只新增默认空字符串列,不自动规范化现有产品模型标识。关闭自动迁移的部署先运行 `migrate-schema up` 与 `migrate-schema verify`;没有降级迁移,回退需匹配数据库备份与二进制版本。
## 全协议视频 Token 计费闭环
所有视频协议开放 Token 价格,包含 NewAPI 通道 2;系统渠道和前台逻辑模型共用报价与火山式 24 FPS 公式。平台额外预留 10%,成功后优先有效上游用量,无有效用量时按提交的公式快照结算并退回余量,账单标注公式来源。schema v25 新增公式快照和来源列,不重算历史订单。方案与回滚边界见[视频 Token 计费](/docs/backend/video-token-billing)。
- [x] 后端专项覆盖官方公式、不同代际像素、4K、参考时长非法值、音频分档、免费价、真实用量严格解析、账单退差和补扣。
- [x] SQLite 集成测试覆盖系统渠道报价与任务预留一致、两种逻辑模型价格策略、报价无账户/账本/任务写入、不可用渠道拒绝与非法素材数量拒绝。
- [x] 收尾回归覆盖内部模型别名下的报价/预留一致、统一价格保存强校验,以及最高合法单价、倍率、最终金额溢出和汇总后一次取整;预估与结算共用精确金额算法。
- [x] 前端专项覆盖表单保存/回填、音频 false 匹配、Token 单价摘要、新旧报价接口与预估边界文案。
- [x] NewAPI 通道 2、NewAPI 视频及自定义视频的 SQLite 集成覆盖报价、预留、无上游用量公式结算、退回 10% 余量和重复结算幂等;v25 迁移重复执行保留历史账单。
- [x] 最新后端 app/repository/database 视频计费专项、数据库包全套回归通过;前端 41 项计费测试、`bun run build` 和文档 `bun run types:check` 通过。未执行真实收费生成或真实数据库迁移。
- [ ] 登录管理端配置有声/无声及参考视频价格档,在模型菜单、画布与短剧生产页变更时长/清晰度/音频,确认当前参数报价更新,切换免费档显示 0。
- [ ] 用真实方舟与 Agent Plan 渠道完成视频任务,核对上游 `completion_tokens`、账单实际金额及退补差额;参考视频最低消耗可能高于公式预估,确认用户能查看预估边界说明。
- [ ] 使用 Artbox 的 NewAPI 通道 2 保存“视频 Token”,完成无用量视频任务后确认公式结算、10% 余量退回、来源标注;重复轮询/回调不重复扣费。
- [ ] PostgreSQL 部署验证 schema v25;新代码未启动或未迁移时不要用旧后端保存非 Ark Token 价格。历史无公式快照的收费订单缺少用量仍进入待核对。
## Agent 历史事件重放导致画布反复冲突
旧会话的画布增量可能缺少版本号。页面刷新重放事件时,原实现先标记冲突;后续完整快照即使确认内容一致,也提前返回而不清除冲突。现在增量拒绝只触发快照校准,由完整快照确认真实冲突;内容一致时更新同步基线并恢复已同步状态。云端仍为已核对的同一基线时,保留待保存的本地编辑,不误判为并发修改。真实冲突继续保留草稿并阻止覆盖,不重放无版本增量,不修改历史数据。
- [x] 47 项画布版本、Agent 增量合并、事件调度与刷新测试通过,覆盖加载云端、保存、重建会话后三次重放旧事件,以及版本缺口、未核对离线草稿与真实冲突保护。
- [x] 前端 `bun run build` 通过;同时补齐 Agent 会话预览缺少的 `markdownPlainText` 导入。
- [x] 隔离浏览器使用实际前端同步模块与 IndexedDB、模拟云端 API,执行保存后三次整页刷新和旧事件重放:均保持已同步,未增加草稿或重复提交。不访问真实账号数据。
- [ ] 登录真实账号验证问题画布:加载云端、保存、刷新后不再因旧 Agent 事件回到冲突;已有草稿仍可读取。自动化浏览器当前未登录,尚未完成该账号的页面验收。
## 画布 Agent 读取参数纠错
画布读取工具明确首次调用 `{}` 及三个可选字段;读取工具区分 JSON 结构、格式、未知字段和类型错误。可修正参数失败会将本轮工具规范反馈给模型,画布读取附带空对象示例;分页范围在数据库读取前校验。未获取反馈用户的实际失败参数,因此尚不能确认线上频发错误的具体触发方式。
- [x] 后端专项测试覆盖非法字段、类型错误、非对象、多对象、分页越界、错误反馈脱敏、规范随检查点保存,以及错误调用后修正、摘要和精读成功、对话完成、画布不被修改与跨用户读取拒绝。
- [ ] 使用用户实际模型和渠道验收:首次画布读取使用 `{}`;发生参数错误时能根据反馈修正调用并继续,而不是重复提交同样参数。
- [ ] 聊天工具卡和调试导出能显示分类后的失败原因;确认已发布新版后端,再收集仍失败调用的工具参数及模型 / 渠道信息。
## Agent 媒体错误分层与回写目标校验
修复生成失败与回写失败同时发生时原始生成错误被覆盖的问题。工具结果、运行失败事件与持久化失败说明分别保留生成状态、脱敏原因、目标节点及回写原因;媒体回写同时匹配目标节点和任务绑定,损坏会话的清理从任务元数据恢复目标,缺少目标时不猜测。能力速查新增从注册表生成的连线能力,工具说明明确连线不是普通归档或排版关联。快照、资源归属、审批和收费防重试约束保持强校验。
- [x] `go test ./internal/app -run 'TestCloudAgent' -count=1` 通过;新增回归覆盖生成/回写双重失败、目标删除或换绑、复制 taskId 不得改写其他节点、敏感错误脱敏、长错误仍可读、损坏会话清理及不会重复提交媒体任务。未运行收费模型或修改真实任务。
- [ ] 真实渠道生成失败且目标节点已删除或换任务时,聊天与调试导出同时显示生成原因和回写原因,不再只显示通用“无法回写”。
- [ ] 生成成功但节点消失时准确显示“生成成功,回写未完成”;保留任务结果,不重建节点或重复收费。
- [ ] 分镜、Markdown 归档流程遵循注册表的 canSource / canTarget / inputKind,避免为了布局创建不支持的引用连线。
- [ ] 快照过期时重新读取和审批;不把并发校验错误通过无条件刷新哈希掩盖。
## 画布 Agent 提示词与用户意图治理
对话主链路已将行为规则集中到版本化系统策略,动态上下文和输出恢复改为带来源的事实消息;移除默认创作授权、关键词推断强制参考和“做完新要求再继续旧任务”的催办。已送达插话进入下一轮可信历史,未变化清单最多提醒一次且不强制工具调用。详见[维护边界](/docs/backend/agent-prompt-policy)。
- [x] 后端 `internal/app`、`internal/handler` 完整测试通过;策略版本断言同步后 `internal/prompts` 完整测试通过。最终 Agent/记忆/上下文专项再次通过,覆盖插话续聊、否定参考需求、计划取消、有界催办、恢复事件和四类模型协议适配。未运行真实模型或浏览器联调。
- [ ] 画布已有参考图时请求“不要用参考图,只修正标点”或“解释图生视频”,确认不擅自引用、生图、建分镜或改写风格。
- [ ] 运行中插话“停止生成,只给文字分析”,确认后续步骤遵循新要求;续聊“继续”仍保留该约束,不恢复已取消的生成。
- [ ] 先规划多个镜头,再取消部分镜头,确认 `plan_update` 移除对应项,不把取消标成完成;遇阻时不会因未完成清单无限请求模型。
- [ ] 用户只要求英文或指定输出格式时,确认默认创作汇报格式让位于用户要求;未命中记忆时不强制检索。
- [ ] 在真实渠道验证输出为空、参数截断恢复及收费任务审批;自动测试不调用真实模型、不产生媒体费用。
- [ ] 发布前处理旧版本在途/待审批运行,确认旧终态历史可读、新轮使用新策略;不要把合同版本变化视为可无缝恢复旧运行。
## 批量创作表交互升级
在当前批量表视觉样式上补齐全局提示词、参考图点击替换/空槽上传、列排序、缩略图拖拽交换,以及连线后自动刷新。顶栏仍用于拖动整表,表内控件不会误触发表格拖动或“放入创作空间”遮罩。未整棵合并 PR #530 的旧画布页面重写和黄色拖动手柄。
- [ ] 填写全局提示词后,未写行提示词的任务也能生成,行提示词输入显示覆盖说明。
- [ ] 点击空参考槽上传图片,点击已有缩略图替换;缩略图可跨行跨列拖拽交换。
- [ ] 拖动列表头可重排参考图列,对应任务行参考图一起移动。
- [ ] 连线到参考端口后缩略图自动更新;“同步连线”仍可手动增量同步。
- [ ] 在表格内拖动或上传不会出现整页“放入创作空间”遮罩;拖动顶栏空白处可移动整表。
- [ ] Agent `canvas_edit_batch_table` 的 `set_global_prompt` 写入后,生成任务使用全局提示词。
## 提示词放大编辑窗口
画布图片/视频节点“放大编辑”窗口改为 `min(1200px, 92vw)`,编辑区最小高度 200px,右下角可对角拖拽,方向键可微调。不改变节点浮动面板的现有视觉。
PR #507 核心能力已按主分支实现保留,并补齐小视口尺寸约束、浏览器缩放窗口后的尺寸收敛、短屏滚动和展开态单一调整手柄。尺寸回归测试与 Vite 生产打包通过;真实 Chrome 组件验证(临时数据,未调用生成接口)覆盖图片/视频、参考图、首尾帧控件、明暗主题、窄屏/短屏、鼠标与键盘调整、切换节点重置。完整 `bun run build` 仍被既有 `canvas-cloud-agent-panel.tsx` 中未定义的 `markdownPlainText` 阻断。
- [ ] 点击放大后窗口明显大于节点面板;右下角拖动手柄可同时改宽高,桌面最小约 560×320,小视口优先限制在视口减 24px 内。
- [ ] 方向键可调整,Shift 加速;切换节点后尺寸恢复默认。
- [ ] 窗口缩小后弹窗尺寸自动收敛;短屏下可滚动访问编辑区、参数和提交按钮,右下角手柄保持可达。
- [ ] 展开态仅显示右下角窗口手柄;紧凑面板仍可独立调整输入高度。明暗主题继续跟随当前画布。
## 支付订单与对账 CSV 导出
已通过支付相关 Go 测试(含 SQLite 两连接重跑快照、10000/10001 行边界)、前端下载与请求测试、修改文件 ESLint 和 Vite 打包;Excel 隐藏实例打开测试文件验证中文、长数字/前导零、金额/积分及公式保护通过。完整前端构建的类型检查被现有 `canvas-cloud-agent-panel.tsx` 中未定义的 `markdownPlainText` 阻断;浏览器交互、WPS 和 PostgreSQL 并发仍待人工验收。
- [ ] 在 `/admin/payments` 使用超过一页的订单,确认导出包含筛选后的全部记录;关键词、渠道、状态、创建/支付/入账时间及北京时间起止日一致生效。
- [ ] 修改筛选条件未查询时不能导出;查询失败不能导出旧结果。快速切换筛选、分页及明细记录时,旧请求不能覆盖新数据。
- [ ] 汇总包含失败原因、自动补发笔数和异常笔数;“已完成”但有异常仍如实导出。明细“仅异常”排除一致和已自动补发。
- [ ] 重跑期间明细导出禁用;直接调用接口也返回 409。并发重跑时导出的记录和明细保持同一数据库快照,补充 PostgreSQL 实例上的并发验收。
- [ ] 单次 10000 行成功,10001 行拒绝;前端显示业务原因且不下载错误文件。空结果、未登录和普通用户权限也需覆盖。
- [ ] 用 Excel/WPS 验收中文、含逗号/引号/换行名称、长数字及前导零订单号、微积分和公式触发文本。数字订单号的单引号保护前缀属于预期;不要按数值列导入。
- [ ] 检查明暗主题、窄屏筛选换行、键盘操作及导出 loading;本清单中的人工验收尚未由用户确认。
## 火山方舟 Agent Plan 图片 / 视频插件
- 新增官方协议插件:`volcengine-ark-agent-plan-seedream`(provider `volcengine-ark-agent-plan-image`)与 `volcengine-ark-agent-plan-seedance`(provider `volcengine-ark-agent-plan-video`)。
- 与官方 Ark 插件的差异只在接入面:默认 Base URL 为 `https://ark.cn-beijing.volces.com/api/plan/v3`,创建路径分别为 `/api/plan/v3/images/generations` 与 `/api/plan/v3/contents/generations/tasks`;请求体、参考素材 role、能力档位与官方 Seedream/Seedance 对齐。必须使用 Agent Plan 专属 API Key,不可与 `/api/v3` 官方 Key 混用。
- 宿主已把 Agent Plan 协议纳入与官方 Ark 相同的能力默认值、Token 计费校验、方舟素材引用、取消任务与前端 payload 分支。
- 待管理端安装这两个 `.yingce-plugin` 后:分别创建图片/视频渠道,确认默认 Base URL 为 `/api/plan/v3`;用 Agent Plan Key 文生图、参考图生图、Seedance 文生视频与全模态参考成功;故意混用官方 Key 应失败;官方 `volcengine-ark-*` 渠道行为不受影响。
## Seedream 声明式结果裸 b64_json(2026-09-17)
根因:`volcengine-ark-seedream` / `volcengine-ark-agent-plan-seedream` 响应把 `response.data` 原样映射为 images;解析回退把裸 `b64_json` 写入 `DataURL` 却未加 `data:` 前缀,随后 `decodeProviderDataURL` 失败。UI 报「声明式协议媒体结果下载失败:音频 data URL 格式无效」(旧错误文案误写「音频」),但管理端请求明细显示上游 HTTP 200 且已返回内嵌编码。修复:声明式媒体解析对裸 base64 按 `output_format`/kind 补全 data URL;错误文案改为通用「data URL 格式无效」。协议单测已覆盖。需重建后端容器后浏览器验收:
- [ ] Agent Plan / 官方 Seedream 图片渠道(`response_format=b64_json`)文生图、参考图生图成功落盘,不再出现「媒体结果下载失败」。
- [ ] 上游返回 `output_format=jpeg` 时结果可正常预览。
- [ ] 管理端该任务对应 create 日志仍为 succeeded / 200,与前端成功态一致。
## Agent Plan Seedream 误走可信素材(2026-09-17)
根因:`isArkPlanVideoConfig` / 前端 `usesArkVideoAssetReference` 仅按 Base URL 含 `/api/plan/v3` 判断,Agent Plan Seedream 与 Seedance 共用该路径,图片生成被误判为视频可信素材路径,自动 CreateAsset 并把参考图改成 `asset://`,上游图片接口拒绝。修复:后端仅 `mode=video` 且非图片协议时同步可信素材;前端仅视频 mode + 视频协议(或非图片协议的 Plan BaseURL)才提交 `asset://`。后端单测已覆盖。需浏览器验收:
- [ ] Agent Plan Seedream / 任意 Base URL 为 `/api/plan/v3` 的图片渠道带参考图生成:任务进度无「同步方舟可信素材」,请求 `image` 为公网 URL 或 data URL,不是 `asset://`。
- [ ] 同一张已录入方舟素材 ID 的参考图用于 Agent Plan / 方舟 Seedance 视频生成时,仍可走 `asset://` 并跳过重复上传。
- [ ] 官方 `volcengine-ark-image` / `volcengine-ark-video` 行为不变。
## 画布保存保护与版本记录
已增加版本 CAS、冲突草稿、视口与内容分离、打开时核对云端、历史快照和恢复,以及右侧历史树和独立只读预览。上游云端 Agent 与创作任务使用同一版本和历史事务。专项测试覆盖并发旧写入、断档增量、草稿写入失败、恢复冲突、历史权限、保留数量和历史媒体删除保护。Schema 顺延为 v23,不占用已发布的 v16 Agent 记忆版本。
隔离 SQLite/PostgreSQL 的迁移与版本/快照测试已通过;前端构建、类型检查与 lint 通过。真实 Chrome 的组件测试(合成数据与模拟接口)通过了明暗主题、桌面预览缩放、草稿查看、窄屏抽屉、恢复确认与无内容写请求检查;完整登录态和真实生成渠道仍按下列清单验收。
- [ ] 双标签页编辑同一画布:旧页平移/缩放不发内容 PUT,旧页内容保存收到冲突后保留草稿,另一画布仍可正常保存。
- [ ] 出现「版本冲突 · 未同步」后点「加载云端最新版本」:画布不整页卸掉,状态变为已保存或等待保存;平移/缩放不能再次卡死加载。
- [ ] 在有未同步编辑时加载最新版或恢复历史,确认本地草稿可下载,恢复后版本递增且恢复前内容仍可找到。
- [ ] 明暗主题、桌面和窄屏下检查右侧历史树、草稿页、预览缩放和恢复确认;预览期间快捷键和拖拽不能修改当前编辑器,返回当前画布后可继续生成和编辑。
- [ ] 使用真实受控模型验收 Agent 生成任务完成与本地编辑同时发生时的冲突提示;自动化测试不调用收费渠道。
- [ ] 既有部署执行 schema 23 迁移并刷新前端,确认旧画布正文保留;历史只从升级后积累,不能恢复升级前已被覆盖的内容。
## 首页常驻滚动通知(2026-09-18)
工作台首页顶部新增常驻滚动通知条,后台「运营 / 常驻通知」可配置类型、有效期、富文本标题和跳转。Schema 顺延为 v20-v22,不占用已发布的 v19 支付插件版本。待登录后:
- [ ] 后台能新增、编辑、启用/禁用、设置生效窗口;公告 / 活动 / 更新 / 警告四种底色在明暗主题下都正确。
- [ ] 前台顶部轮播展示生效中的通知;关闭后刷新仍保持关闭快照;外链新窗口、站内路径走前端路由。
- [ ] 无生效通知时首页不出现空条,也不把页面顶栏顶出明显空隙。
## 开发镜像标签可在线更新到正式版(2026-09-18)
`CANVAS_IMAGE_TAG=sha-5509b17` 这类非正式标签不再被字典序判成比 `v1.5.0` 更新。待登录管理后台「系统配置 / 系统更新」:
- [ ] 当前运行显示 `vsha-...`,最新发布显示 `v1.5.0`(或当前正式版),状态是可更新而不是「已是最新」。
- [ ] 「开始更新」可点;更新完成后 `CANVAS_IMAGE_TAG` 变成正式版本号,页面两边版本一致。
## 创作参数弹窗表面色(2026-09-17)
画幅 / 清晰度 / 时长弹窗改用工作台 `--user-surface-raised`,选中块用 `--user-control-pressed`,不再画 1px 描边。待登录后打开视频生成设置:
- [ ] 暗色下弹层颜色贴近输入条,四周没有细线框,只靠阴影浮起。
- [ ] 选中的画幅、清晰度是实心底块,比例图标是色块不是空心线框。
- [ ] 时长弹窗同样没有描边;浅色主题也没有细线框。
## 积分中心改为弹窗(2026-09-17)
独立 `/wallet` 页面已删除。顶栏积分、账户卡片充值、命令面板「积分中心」、画布顶栏余额,以及访问 `/wallet` 或支付回跳,都应打开同一「积分中心」弹窗,并回到首页。待登录工作台后:
- [ ] 打开 `/wallet` 不再出现积分超市整页,而是弹出积分中心;刷新后停留在首页。
- [ ] 顶栏积分胶囊、侧栏账户「充值 / 兑换」、⌘K 搜索「积分中心」、画布顶栏余额都打开同一弹窗,不离开当前页(`/wallet` 访问除外,会回到首页)。
- [ ] 支付渠道回跳 `/wallet?paymentOrder=` 后弹出积分中心并展示支付结果。
## 对话工具条上移与输入区收紧(2026-09-17)
开始对话后,镜头时间线 / 画布中继续收到工作台顶栏,底部提示词面板变矮,视频/图片/文本横排在录音按钮左侧。待登录后发一条消息:
- [ ] 对话页不再单独占一行工具条;顶栏中间能看到「镜头时间线」「画布中继续」、新建和历史。
- [ ] 底部输入框明显变矮;模式切换在录音左侧,能看到「视频 / 图片 / 文本」文字。
- [ ] 消息区右侧不是浏览器自带宽滚动条,而是细轨道;窄屏仍能切换模式、打开镜头列表和历史。
## 对话开始后输入区加宽与圆角底板(2026-09-17)
开始对话后,消息列和底部输入框从 820px 加宽约 30% 到 1066px;输入框圆角后不再垫一块更黑的矩形底。待登录后发一条消息:
- [ ] 对话列、顶栏和底部输入框明显变宽,但仍居中,窄屏仍吃满左右边距。
- [ ] 暗色下输入框四角只看到圆角卡片,背后没有一块尖角黑底。
## 首页默认图片生成(2026-09-17)
- [ ] 新会话打开首页 `/`,模式页签默认选中「图片」,而不是「视频」。上次手动切到视频后刷新,仍应恢复视频。
## 侧栏签到加油站(2026-09-17)
积分开启且签到奖励大于 0 时,首页侧栏容量条上方出现领取卡片。待登录工作台后:
- [ ] 未领取时固定显示「{后台品牌名}加油站」和今日可领积分数,点「立即领取」后积分到账,卡片消失。
- [ ] 当天已领取、关闭积分或签到积分为 0 时不出现该卡片。
- [ ] 卡片为白底黑按钮、积分数青绿,侧栏本身不是浅蓝底。
- [ ] 收起侧栏后仍能领取;在积分中心弹窗外完成签到后回到首页,侧栏卡片也应消失。
## 侧栏账号容量进度(2026-09-17)
登录后首页侧栏左下角用户头像上方展示账号文件容量。待登录工作台后:
- [ ] 展开侧栏时能看到硬盘图标、已用容量、剩余容量、总容量和进度条;数字为真实配额,不是占位。
- [ ] 收起侧栏后头像上方仍有硬盘图标和细进度条,悬停能看到剩余/总容量。
- [ ] 用量到 70% 变警告色,到 90% 或已满变危险色;点进度条进入资产页,两边数字一致。
- [ ] 未登录不显示该进度;接口失败时可重试。
## Agent 生成失败闭环与快照补全(2026-09-17)
媒体任务失败不再把整轮 Agent 判死;漏传画布快照由服务端补当前内容哈希;没有长期偏好层时本轮不暴露 `agent_profile_read`。待登录画布后:
- [ ] 让 Agent 生成一条视频,在审批通过后若上游 503 / 失败:节点应变 error,对话应继续,Agent 能用人话说明失败,而不是整轮「执行失败」。
- [ ] 同一轮先建文本节点再生成视频,即使模型没带 `snapshotHash`,也应能进入审批而不是报「缺少画布快照」。
- [ ] 未设置用户/项目/画布偏好时,Agent 不应连打三次空的偏好读取;设置了用户偏好后才应读取该层。
- [ ] 已提交的失败任务不得自动再扣费重提。
## 虎皮椒聚合支付插件(2026-09-17)
新增官方支付插件 `official-payment-xunhupay`(渠道 ID `xunhupay-aggregate`),不把虎皮椒协议写入宿主。待管理员在插件中心确认插件已开放后,到「财务 / 支付」填写 APPID、APPSECRET 和公网地址并启用渠道:
- [ ] 插件中心支付分类能看到「虎皮椒聚合支付」,停用后钱包不再出现该渠道。
- [ ] 配置保存后用户积分中心可选该渠道;扫码(默认)或 `checkoutMode=redirect` 跳转收银都能创建订单。旧库重启后应自动补上 `plugin_version` 列,不再 500。
- [ ] 支付成功回调返回纯文本 `success` 后积分入账;查单可补单;未支付订单可关闭。
- [ ] 错误 APPSECRET、伪造回调或金额不一致不得入账。
- [ ] 暗色主题下扫码区是白底黑码,微信 Native 可直接扫;虎皮椒展示网关返回的二维码图片,扫码应进入支付而不是再看到一张二维码图。
## 支付插件跨平台可执行文件(2026-09-17)
官方支付包内同时带有 macOS、Linux、Windows 的 amd64/arm64 产物,宿主按本机 `GOOS/GOARCH` 选择,不再把 Linux ELF 当成 macOS/Windows 入口。待在对应系统上启用任意官方支付插件后:
- [ ] macOS(Apple Silicon 或 Intel)开启渠道后可保存配置并创建充值订单,不再出现「支付插件可执行文件或其运行时加载器不可用」。
- [ ] Linux amd64/arm64 与 Windows amd64/arm64 同样能启动对应 `backend/provider-*`,错误 APPSECRET 仍应失败而不是进程起不来。
- [ ] 只有 Linux 产物的旧包在 macOS/Windows 上应提示格式或架构不兼容,而不是误报加载器缺失。
## 管理后台独立设计系统(2026-09-17)
管理后台改为独立 token / Ant 主题 / 壳层控件,不再消费用户端皮肤和 `WorkspacePage`。待管理员登录后核对:
- [ ] `/admin/settings/features`:命令条不再是玻璃大卡,功能域是紧凑分组表,开关立即保存逻辑不变。
- [ ] `/admin/users` 与 `/admin`:侧栏无树状分组线、无选中描边和左侧指示条;表格、分页与用户工作台视觉隔离;用户首页/作品库样式未被带动。颜色回到原来的中性黑白台阶,不是冷蓝灰。
- [ ] 亮/暗切换只改变后台冷灰台阶,不套用当前产品皮肤的圆角、主色或动效。
- [ ] 抽屉、下拉、确认框仍可操作;关闭积分/前台模型仍有确认。用户详情、支付订单、提示词版本、模型编辑器不再使用产品 `AppDrawer`/`AppModal`。
## 模型选择器、画布摘要与首页视频入库
- 全站 `ModelPicker` 统一为先选品牌、再选模型的左右二级菜单(左品牌轨 + 右模型列表),含 Agent 对话、审批卡、章节提取、分镜脚本节点、项目设置。窗口窄于 720px 时才收成单栏。
- 「提取章节角色、场景与道具」及同类默认 `ModelPicker` 品牌列表改为纵向卡片;Agent 对话审批卡切换生成模型同样不再横排重叠。
- 大画布 Agent 不再因摘要超过 64KB 整轮拒绝:按约 60KB 截断节点列表,`omittedNodes` 标明未列入数量,细节仍用 `canvas_get_state`。
- 首页创作视频宽高未知(0)时允许入库并展示成功;图片仍要求正数尺寸。待登录后:打开提取弹窗、Agent 对话、画布脚本节点核对模型菜单均为左右二级;大画布可发送 Agent;首页文生视频成功后对话显示视频而非「素材字段 width 必须大于 0」。
## Agent 计划清单、插话与提问(待用户确认)
- 多步任务可出现待办清单:`request_approval` 下首次 ≥2 项会弹审批,`auto` 直接建清单。PlanBar 随 `plan_update` 刷新,全部完成后收起;新一轮第一拍就应带上未完成项。
- 简单问答不应被强行催去建清单;有未完成项时只回文字会被催办(软约束,不验收真实产出)。
- 运行中输入框可打字:发送走插话(下一步生效),停止按钮仍可用;本轮结束前未送达的插话应标「未送达」并可再发成新一轮。
- Agent 调用 `ask_user` 后本轮收尾,输入框上方出现选项;点选或自由输入应开新一轮。
- 官方「发送到 Agent」预填提示词仍可用。
## Agent 个人记忆(待用户确认)
- 用户在「设置 → Agent 记忆」或画布 Agent 设置的「个人记忆」批准、拒绝、添加、编辑、删除、导出导入;手动添加直接生效。
- 记忆页视觉:顶部是筛选/添加,空态用产品空态组件;压缩优化收成次要区域(设置页在列表上方,Agent 面板贴在底部),「立即压缩」不再抢主按钮。
- 可选择文本模型后立即压缩,或设为每天/每周/每月自动压缩;压缩走真实文本计费任务,完成后相近记忆应合并、含糊条目应被改写,别人的记忆不得被动。
- Agent `remember_lesson` 写入待审;已批准记忆在系统提示里只出现索引(标题+适用场景),卡住或同类任务动手前用 `recall_lessons(topic)` 取全文。用户 A 的记忆不会进入用户 B 的会话。
- 管理后台「运营 → Agent 记忆」可按用户、状态、关键词查看并删除,没有批准/拒绝按钮。
- 只读 Agent 运行不应出现 `remember_lesson`;普通运行在真实画布/生成工具成功后才允许记录。
- 新一轮系统提示可出现分类概览和最多 20 条索引,不应出现做法全文或路线。待办清单改挂在会话末尾,不能改写系统提示;同一轮连续模型调用应能复用前缀缓存。当前用户消息是本轮目标;跨轮只带最近 10 轮对话,接近 64KB 时丢掉更早轮次。记忆不得覆盖审批、预算或工具契约。
## 画布节点快速引用 Agent
- 多选节点后,选区浮动工具栏应显示 `@` 图标;点击「发送到 Agent」后,Agent 输入框应自动带入所有选中节点引用。
- 单节点右键菜单(图片、视频、文本及其他节点)应显示「发送到 Agent」;点击后仅带入当前节点引用。
- 引用应以节点 mention token 保存,发送前可以继续补充操作描述。
## Agent 对话模型选择器复用创造页样式
- Agent 底部 Composer 与设置页「对话模型」改为复用画布节点 / 创造页的 `ModelPicker` `variant="creation"`:先选品牌、再选模型,不再把品牌挤成一行。
- 目录只展示文本模型;图片、视频、音频模型不进入 Agent 对话选择。当前选中若不是文本模型,回退到第一个可用文本模型。
- 待登录后打开画布 Agent:核对品牌列表为纵向卡片、点入后出现双栏模型列表且高度跟品牌列表走、不再被 300px 最小高度撑空;设置页同样;深浅主题与窄面板不裁切。
## 设置页页头与生成偏好精简
- 设置页去掉「创作偏好 / 配置默认模型、生成参数和素材存储。」页头;仅在 `?continue=1` 时保留返回创作按钮。
- 「生成偏好」移除音频默认值与音频指令;音频参数仍在画布音频节点内设置。
- 积分弹窗 Tab 与内容卡拉开间距并对齐左右缩进,避免内容卡圆角从 Tab 左侧露出。
- 待登录后核对 `/settings?section=preferences` 不再出现页头与音频分区;打开积分中心切换「积分消耗历史」,Tab 与列表卡之间应有明确空隙。
## 侧栏图标、宽度与提示词面板
- 用户端侧栏展开宽度从 180px 调整为 216px(约 +20%),折叠轨从 58px 调整为 70px;折叠态图标按钮同步加宽。
- 侧栏菜单图标改为分色色块:创作橙、短剧蓝、画布绿、资产金、技能粉、插件紫、历史青;悬停轻微抬起并有图标摆动,激活项带同色浅底。
- 导航项上下间距加大:展开行高约 44px、分组内 8px 间隙;折叠态行高约 62px、组内 10px。
- 首页与对话中的提示词面板改为柔和渐变底、聚焦时抬起与光晕、胶囊工具条、分色图标、参考内容和开始创作的 hover 光泽;尊重减少动效。
- 待登录后在 1440px 展开/折叠侧栏,核对首页 Composer 聚焦、工具按钮 hover、明暗主题和 390px 无横向溢出。
## 项目工作台头部导航
- 项目详情导航从全局顶栏扩展区挪到页面内独立页头:左侧返回与项目名/状态,中间分段导航,右侧新建画布或章节定位。
- 制作阶段改为纯文字分段控件,不再用图标+下划线+横向滚动条挤在顶栏剩余空间里;900px 以下导航折到第二行。
- 路由、权限、画布创建和分镜章节定位逻辑未改。待登录后在 1440px、1100px、390px 及深浅主题核对标签完整显示、无横向裁切、概览/章节/分镜切换与新建画布。
## Agent 生成审批、对话轮数与连线可读性
- 媒体生成快照忽略节点位置,审批期间移动参考图或草稿可继续生成并保留新坐标;提示词、资源、锁定状态和连线改变仍拦截。画布修改与撤销保留完整布局校验。
- 图片审批卡支持切换平台模型、画幅和质量,采用现有模型选择与图片设置控件;修改只影响本次生成,服务端重新校验并记录最终审批参数,拒绝或无效参数不创建媒体任务。
- 移除历史 8 轮对话硬限制及策略 / capabilities 中遗留的 8 次模型调用声明;历史保留 64000 字节限制,积分预算、正数任务预算与单次响应工具数量限制继续生效。
- Leafer 常态连线从 1px / 24% 不透明度提升为 2px / 80%,SVG 路径同步调整,缩放时线宽保持稳定。
- 已通过后端新增回归:生成前后移动、内容冲突、模型参数修改、无效参数、跨用户拒绝、重复批准只生成一次、连续 11 轮对话和历史字节边界。未请求真实收费上游。
- 已通过前端生产构建、审批 / SSE / 画布同步等专项测试,以及后端 HTTP handler 测试。Agent 专项除既有 `TestCloudAgentNodeTypesExposeExecutableAllowList` 外通过;该测试仍断言 7 种节点,当前注册表含批量创作表共 8 种,本次未调整该断言。
- 独立浏览器组件验证已通过:真实模型选择及图片设置组件切换模型、质量、画幅,明暗主题连线显示,390px 设置区无横向溢出。使用测试模型数据,不能替代登录态和收费上游验收。
- 待登录态验收:审批卡中切换图片模型、质量及比例;移动参考图和草稿后批准;密集画布在明暗主题与缩放下检查连线;超过 8 轮实际对话。当前浏览器访问需登录,未完成真实收费生成端到端验证。
## 用户端创作型工作台 UI 重构
### 首页创作区收窄
- 模式切换、输入框与快捷入口归入独立的 960px 居中区域,精选作品保留宽幅布局。模式栏改为紧凑分段控件;输入区减高,统一 36px 工具按钮;快捷入口去除大卡片外壳与冗余示例文字。
- 已完成登录态验证:1920px 下创作区为 960px、作品区为 1668px;1440px 深浅主题输入框均为 960 × 250px;390px 内容宽度为 366px,无横向溢出;模型下拉、模式切换、参考素材弹窗打开与关闭正常。
- 前端 build(含 TypeScript)、lint 和 diff 检查通过。未执行收费生成;控制台仍有既存公告图片接口 500。
### 首页与内容库第二轮调整
- 首页空态不再执行对话的自动跟随到底部;恢复历史对话仍沿用消息跟随逻辑。
- 素材库分类(素材类型、业务分类、我的分类、回收站)改为左侧导航;桌面端 220px 粘性侧栏,窄屏仍收成内容上方横排。顶栏搜索只保留关键词和密度。
- 积分弹窗「积分消耗历史」列表独立滚动,分页固定在面板底部;记录不足一页时也保留分页条。
- 首页收敛标题、模式栏、输入区和四个并列快捷入口;移除旧 Composer 规则中的强制覆盖,让主题和选中态生效。
- 技能页改为页标题、范围导航、独立搜索筛选、能力卡片;安装入口集中在页头。项目页增加标题与可展开的故事设置,输入区扩为三行起步。
- 资产网格按最小 180px 卡片宽度自适应,避免固定列数挤压标题;密度设置仍保存原有偏好。
- 修复窄屏隐藏侧栏仍占据 180px 的布局问题,统一列表和浮层的主题变量。
- 功能入口移除模块级一次性检查标记,避免 StrictMode 清理后永远停在“正在确认功能状态”;仍使用真实功能开放接口与原权限判断。
- 已运行浏览器验证:1440px、1920px 首页滚动位置为 0 且无页面横向溢出;390px 内容宽度为 366px;侧栏折叠为 58px;深浅主题输入区几何尺寸一致;模式切换可用。
- 插件页改为页标题、横向分类与全宽卡片网格;设置页统一页头和内容宽度,积分弹窗文案改为用户操作说明。
- 已验证技能无结果搜索及清除后恢复、项目故事设置展开/收起、积分弹窗打开;390px 侧栏展开后点击技能路由会自动收起。构建(含 TypeScript)、lint 和 diff 空白检查通过,构建仍有大 chunk 提示。
- 已打开技能、资产、项目、设置、插件及历史路由。当前任务中心未开放,不能将权限阻挡页视为任务列表验证通过。
- 待完成:画布核心交互、生成/上传/删除/兑换写路径、全部浮层深浅主题、离线与账号切换回归;当前改动不是所有用户页面的最终验收。
- 已知环境异常:公告图片接口返回 500;参考站在验收浏览器要求重新登录,目前视觉依据为用户截图及已有测量记录。
- 已完成全局用户端浅灰工作区、侧栏、顶栏、导航状态、首页创作 Composer 和画布项目侧栏的第一轮视觉收敛;保留现有路由、权限、API、缓存和画布交互。
- 已为资产、技能、任务和项目页补齐统一的内容库壳层:最大宽度、工具栏、焦点态、卡片悬浮反馈、移动端内边距和减少动效策略;未改变这些页面的数据加载、筛选、分页、上传、删除、重试和恢复逻辑。
- 画布积分入口已改为“积分超市”;钱包页已改为消费型“积分超市”入口,余额、兑换码、真实充值、支付状态和积分使用明细仍走原有接口与强校验。
- [x] `cd web && bun run typecheck`
- [x] `cd web && bun run lint`
- [x] `cd web && bun run build`
- [x] `git diff --check`
- [ ] 登录后验证 `/`、`/create`、`/canvas`、`/canvas/:id`、`/assets`、`/skills`、`/tasks`、`/wallet` 的关键路径、空态、错误态和写操作。
- [ ] 在 1200px、1440px、390px 视口核对侧栏、顶栏、Composer、画布 Dock、卡片裁切和横向溢出。
- [ ] 登录后检查浏览器控制台、保存/恢复、生成失败重试、画布拖拽缩放连线及账号切换后的缓存隔离。
## 价格档上游键级联与重命名告警
- 修复“管理端重命名渠道模型的产品标识 / 显示名称 / 上游模型 ID 后,任务请求仍把旧上游键发给供应商”的问题:价格档 `provider_model_key` 非空时优先于模型级上游键,此前统一价格档会把当时的顶层上游键固化为档位显式值,重命名后被旧值静默遮蔽。
- `SaveAdminChannelModel` 现在在模型级上游键变更时,把与旧值相同的档位键级联更新为新值;管理员显式配置的其他上游 SKU 不受影响。前端编辑无价格档的旧模型时不再预填顶层上游键,统一价格档检测到与模型级不一致的存量上游键时展示告警并支持一键清除恢复“跟随模型默认”,模型级字段提示存在独立档位上游键。
- 已通过后端 app 包级联与请求解析回归测试、前端价格档表单单测和生产构建;生产已验证:清除浏览器缓存并强刷后重新保存模型配置,后续请求实际发往新上游 ID。排查过程确认级联盲区符合设计——档位上游键若早于当前模型键谱系(改名发生在线上旧代码时期),来回改名需经过"改回旧键再改回新键"一轮才会被级联覆盖,期间需依赖管理端"清除并跟随模型"告警或直接修库;浏览器缓存的模型目录与 Agent 会话选中值在管理员改名后不会自动刷新,需重新登录或清缓存才会重建。
- 已知未覆盖:前台逻辑模型(`price_policy=channel`)的路由快照同样会固化档位上游键(`applyRoutedProviderSelection`),本次级联只在渠道模型保存路径生效;逻辑模型路由如出现同类旧键残留,需重新保存对应渠道模型或后续单独处理。
## 生成素材删除的任务来源引用
- 素材删除不再被已成功、失败或取消任务的输出结果及日志阻止;保留任务历史记录。任务输入、未结束或未知状态任务、画布和其他业务引用仍参与删除校验。
- 该规则仅用于素材删除,后台孤儿资源清理和管理员资源检查仍保留完整任务引用,避免自动清理尚未入素材库的生成结果。
- 已补充后端回归用例,覆盖任务状态、输入引用、画布引用、删除事务 Outbox、历史记录保留和自动清理边界;测试包编译通过,本地数据库测试因 `CGO_ENABLED=0` 无法初始化 SQLite,尚未验证通过。
- 待部署验收:未绑定画布的生成图片可单个及批量彻底删除;被画布或其他任务输入引用时仍提示来源。删除后任务历史中的原文件不再可用,共享素材仍保留其资源。
## 画布手动保存与强制覆盖保存
- 画布左上角菜单新增「保存」(与 ⌘/Ctrl+S 等价,本地落盘后同步云端,适配平板无键盘场景)与「强制覆盖保存」(确认弹窗后以本地内容覆盖云端,并自动修复画布媒体与素材库的绑定)。
- 根因修复:同节点原地重生成(如视频节点改提示词后重新生成)走兜底写回路径时,节点保留旧 assetId 却指向新资源,后端画布媒体校验拒绝后,自动修复被节点自身声明掩盖,形成“自动重试但永远失败”。现节点声明不再覆盖素材库真实绑定,错误配对会在下一次自动同步时自愈。
- 强制覆盖语义:按服务端素材记录(与本地缓存合并)校验所有画布媒体节点与时间线片段的素材绑定,不一致时重绑到引用同一资源的素材或按节点新建,再按“素材先于画布”整体推送;素材远端版本冲突时采纳远端为基线继续用本地覆盖。后端不变式与接口未改动。
- 已通过 `web/test/canvas-asset-repair.test.ts`(8 例)与前端生产构建。待浏览器实测:改提示词原地重生成视频后不再出现“画布媒体与素材库记录不一致”的持续报错;出现历史遗留报错时「强制覆盖保存」能立即恢复且后续自动同步不再报错;平板设备上「保存」菜单可用。
## 欢迎页开放开关
- 管理员在 `/admin/settings/appearance` 的英文品牌标识下方切换欢迎页,立即保存,沿用功能配置保存及审计流程,默认开启;功能开放页不再编辑该字段。
- 欢迎页入口直接导入展示组件,Babel runtime 辅助代码固定独立分包(不按最小体积合并回路由),避免 AntD 反向加载工作台入口触发循环初始化错误。
- 已通过前端类型检查和生产构建,并用构建产物在浏览器验证启用展示、关闭跳转、接口失败重试入口;外观页开关位置及真实管理员保存待部署验收。
- 待浏览器验收:关闭后访客及已登录用户访问 `/welcome`、`/welcome/` 均跳转首页;重新开启后恢复展示;配置请求失败时显示重试入口,不展示欢迎页内容。
- 开关在进入页面时检查,已经打开的欢迎页不主动退出;静态图片、视频资源不受此页面开关限制。
## 思考模型 Agent 工具选择兼容
- 当前 Cloud Agent 和首页创造规划入口均使用自动工具选择,不固定发送 `tool_choice=required`。后端仍防御旧任务、旧客户端和其他结构化调用携带的强制选择。
- 首页创造规划提示词只声明真实注册的 `creative_respond`,并把画布、模型和素材上下文明确标记为只读快照;不再诱导模型调用并不存在的 `canvas_*` 工具或假报节点已创建、分镜已生成。
- OpenAI Chat Completion 兼容协议的自动选择在首个上游请求中直接省略 `tool_choice`;显式思考模式还会移除旧任务携带的 `required` 或指定函数对象,内置协议和声明式已知协议均有回归覆盖。非思考模式保留强制函数选择,上游隐式思考仍保留 `required` → `auto` → 省略字段的失败后兜底。
- 已通过 Agent 工具选择专项后端测试;待用百炼 `qwen3.7-flash` 与 DeepSeek 思考模型真实渠道分别验收首请求正文,确认不再出现强制工具选择参数错误,且模型仍能自行调用画布工具。
## Agent 模型能力筛选与跨轮草稿续用
- 模型工具支持按生成模式和真实参考节点筛选,复用统一模型目录的能力匹配;多图视频不再依赖模型名称猜能力。具体时长、画幅、音频和价格仍由目录配置与任务准入共同约束,不提供静默换模型兜底。
- 可续用未提交的空白媒体占位节点、当前运行草稿和已结束且清理完成的同用户同画布草稿,保持原节点 ID;仍在审批、清理中、已提交任务、已有成品、锁定节点和跨用户 / 画布草稿不可接管。续用重新审批,不跳过收费授权。
- 媒体策略明确用户要求生成且参数齐备时直接调用生成工具进入审批;仅改词不擅自收费。此行为仍需真实模型验收,不能以策略文本测试代替模型实际执行。
- 已通过后端 app / prompts 两包完整测试;最终引用连线调整后再次通过 Agent 专项回归。覆盖双图筛选、无候选不兜底、非法引用与跨用户拒绝、草稿状态与权限边界、跨轮原节点续用、新审批前无媒体任务、审批后只提交一次及移除过期引用连线。未调用真实收费模型。
- 待验收:配置文生视频和多图视频模型,带两张参考图选择正确候选;上一轮取消后在原节点继续生成并出现新审批卡;确认不重复建节点、只填词不假报已提交、拒绝审批不收费。
## Agent 节点能力卡与结构化分镜
- 节点能力 registry 已升级,文本、Markdown、图片、视频、音频、背板和分镜脚本均向 Agent 返回用途、适用场景、不适用场景和维护代价;媒体能力卡还区分单图、单镜头文生视频、图生视频、多图参考视频与音频用途,并明确仍须按真实参考节点调用 `model_list` 筛选模型。
- 节点选择采用软路由:单画面和临时试验可使用轻量节点;多镜头、连续性、逐镜审查 / 生成、资产关联或交接维护时优先结构化分镜。系统不强制所有任务创建分镜,但禁止把普通文本宣称为具备镜头级维护能力的分镜表。
- 新增分镜脚本创建、分页读取和单行追加 / 修改 / 删除工具。镜头行 ID 由服务端生成;修改和删除必须使用最新读取的真实 `rowId` 与 `snapshotHash`,写入继续经过现有权限、审批、快照冲突和画布持久化路径。
- 后端相关专项测试、前端生产构建和文档类型检查已通过。待真实模型和浏览器验收:简单单镜头自主选择轻量节点,多镜头任务创建结构化分镜;审批前画布不变化,审批后可在分镜 UI 中逐镜编辑,连续对话不改用 Markdown 重建整表。
## 混合节点画布 Agent
- 未注册 Agent 能力的节点(包括插件、配置、绘图节点)不再阻断整张画布的 Agent 摘要与分页读取;返回基础信息和 `agentSupported: false`,不读取任意 metadata,也不授予创建、修改或媒体引用能力。
- 已补混合类型摘要、列表与指定节点读取、私有字段隔离、快照/连线保留和未支持类型创建拒绝测试。待真实账号验证混合画布能启动 Agent 并创建受支持的图片节点;不代表新增了插件节点编辑或全画布布局工具。
## 画布 Agent 预算与按需技能
- 已取消前后端最多 8 个技能、生成预算 8 / 120 秒和固定模型循环次数约束;生成数与视频累计秒数默认 0 表示不限,积分、权限、生成审批和供应商实际能力仍强校验。
- 技能仅保存版本与路径,读取正文按 12000 字符分页;支持总正文超过 128KB 的多技能选择。读取版本变化或跨用户访问拒绝;运行事件只存技能回执。
- 上下文瘦身只卸载可重新读取的历史正文,保留调用配对、生成回执、用户要求及最近完整工具轮次;不宣称语义摘要或无限上下文。原始字节安全边界仍保留。
- 已补后端回归:10 个大技能、正文不预存、分页、跨用户拒绝、版本变更拒绝、0 预算可见生成工具、大于 120 秒和正预算约束、上下文配对与生成回执保留。
- 待真实模型验收:多技能任务中按入口选择引用、跨多页读取和上下文卸载后重读、视频模型支持的长时任务及收费审批;浅蓝用户消息在明暗主题下的交互外观。
## 素材 bytes 数字合同
- 修复后端将 `bytes: null` 按数字零通过校验的问题,避免保存后被前端素材合同拒绝;图片、视频、音频、模型素材均覆盖。
- 部署维护工具新增 `migrate-schema repair-asset-bytes`(默认只检查)和 `--apply`:仅使用同用户、同类型、就绪且大小为正的资源元数据修复;保留素材 ID、其他 JSON 字段和引用。无可靠资源的记录输出未解决报告,不填零;并发冲突或数据库写入错误整批回滚。操作步骤见后端数据库专题。
- 已在 SQLite 和隔离 PostgreSQL 17 测试:只读预检、跨 100 条分页修复、缺失/null/字符串/负数处理、跨用户拒绝、合法值及其他 JSON 精度保留、重复运行幂等、写入失败整批回滚;待实际部署备份后执行并验收用户素材库。
- 待确认:用户报错素材的实际 `data.bytes` 值及写入来源。此修复只阻止新的无效写入,不自动修改或删除历史素材;历史值需依据真实资源大小修复,不能批量填零。
## 百炼多模态图像协议插件(dashscope-qwen-image)
- 新增官方协议包 `plugin-packages/dashscope-qwen-image.yingce-plugin`,解决 `qwen-image-3.0-pro` / `wan2.7-image-pro` 无法调用的问题:这两个模型属于百炼多模态模型,走 OpenAI 图片端点会被网关判为“模型与端点不匹配”,官方错误码表现为 `url error, please check url`。
- 协议形态:`POST /api/v1/services/aigc/image-generation/generation`(`X-DashScope-Async: enable`)+ 轮询 `GET /api/v1/tasks/{taskId}`;参考图放在 `input.messages[].content[].image`(优先 Base64 data URL),不使用 `/v1/images/edits` 的 multipart。
- 已由单元测试覆盖:端点与异步头、文生图只发 text、图生图按 order 排序并优先 Base64、`size` 采用 DashScope 的星号格式且未登记档位省略、`enable_thinking` 固定 false、响应从 `output.choices[0].message.content[].image` 取图、上游失败保留错误信息。`go test ./internal/protocol/` 与 `go build ./...` 通过。
- 待真实账号验收:用北京地域 Key 走一次文生图与一次图生图(换装),确认出图成功、参考图不报 url error。
- 已知边界:协议用 `originPath` 声明请求路径,请求路径会替换渠道 Base URL 的路径段,因此渠道继续沿用 `.../compatible-mode/v1` 也能命中原生端点(`.../api/v1/services/...`);只有域名需要正确。协议把 `size` 映射为 1024 级竖版/方形档位,未登记的档位会被省略并交由模型自动推荐(官方要求像素面积 512*512~2048*2048)。
- 尚未处理:AI 模特页仍按“带参考图即走 `/images/edits`”的通用规则分支,未按协议能力判断;换成该插件后两阶段派生能否直接复用需实测确认。
## Agnes 图像协议插件(agnes-image)
- 新增官方协议包 `plugin-packages/agnes-image.yingce-plugin`,解决 Agnes 图片模型无法调用的问题:内置 OpenAI 图片路径会固定发送 `n`,并按渠道能力开关发送 `output_format` 与顶层 `response_format`,而 Agnes 的参数表没有这些字段,`POST /v1/images/generations` 直接返回 HTTP 400 `invalid_request`,上游原话为“output_format 不是文生图队列支持的字段”。`n` 无法通过任何开关摘除,因此必须独立协议。
- 协议形态:同步 `POST /v1/images/generations`(`originPath`),文生图与图生图共用同一入口。`size` 必填,由统一层质量归一为 `1K`/`2K`/`3K`/`4K` 档位,`WxH` 像素尺寸原样透传;画面比例走独立的 `ratio` 字段;参考图放 `extra_body.image` 并优先 Base64 data URL,多图合成传多张,不使用 `/v1/images/edits` multipart;输出格式只能声明在 `extra_body.response_format`(默认 `url`,可用 `providerOptions.agnes-image.response_format` 覆盖为 `b64_json`)。
- 前端能力默认值同步新增 `agnes-image` 分支:尺寸按“比例 + 1k/2k/4k 档位”选择,关闭上游不支持的 `output_format`、顶层 `response_format`、透明背景和蒙版编辑,`maxOutputs` 固定为 1(该端点不接受 `n`,单次请求固定返回一张)。官方另有 `3K` 档位,统一层只提供 1k/2k/4k 三档,故界面不露出。
- 已由单元测试覆盖:逐项断言 `n`、`output_format`、`quality`、`background`、顶层 `response_format` 与顶层 `image` 均不出现在请求体中,参考图进 `extra_body.image` 且按 order 排序并优先 Base64,比例落档位 / 像素原样透传 / `auto` 与空值回落档位,不在官方比例表内的取值在校验阶段拒绝,响应同时读取 `data[0].url` 与 `data[0].b64_json`。`go test ./internal/protocol/`、`go build ./...`、`bun run typecheck` 与相关前端测试均通过。
- 已完成真机验收(Agnes 中国站 Key,`agnes-image-2.1-flash` 与 `agnes-image-2.5-flash` 各一轮,AI 模特页):母版与派生任务全部 `succeeded`,`portrait_role` 分别为 `anchor` 与 `derive` 并拿到 Agnes 的 `task_*` 号;调用日志里母版对应 `/images/t2i/...`、派生对应 `/images/i2i/...`,且两张派生图都被宿主成功下载。派生阶段能产出 i2i 结果,证明参考图确实经 `extra_body.image` 送达——内置 OpenAI 路径只会把参考图送去 Agnes 没有的 `/images/edits`,因此这条链路只可能由本插件完成。
- 待验收:多图合成(单次传多张参考图)、`providerOptions.agnes-image.response_format=b64_json` 覆盖、以及 `size`/`ratio` 的实际取值。任务行只持久化 `mode` 与 `metadata`,调用日志也不记录请求体,因此档位与比例发出去的具体值无法从库中读回,需要抓包或在插件侧临时打印才能确认,目前只能由上游行为反推。
- 渠道配置注意:模型协议改为本插件后必须重启后端,官方插件目录只在启动时装载;已保存过的 `capabilityConfig` 不会被新协议默认值覆盖,需要手动把尺寸参数改为 `aspect_ratio`、最大参考图设回大于 0,否则 AI 模特会退化为不带参考图的单阶段候选图。
- 已知边界:默认输出 URL,由宿主立即下载并持久化;若上游图片地址无法公开回源,改用 `providerOptions.agnes-image.response_format=b64_json`。官方比例表只有 8 种,其他比例(如 `4:5`、`9:21`)在请求前即被拒绝,不会静默回落为 1:1。
## 云端 Agent 行为、能力和偏好分层(待真实环境验收)
- [x] 系统/媒体行为资源由后端发布物加载,运行快照记录策略和能力版本/哈希;用户 → 项目 → 画布偏好经归属校验和独立 revision CAS,合并 revision 固定到新轮次,旧轮次保留原快照。system prompt 只注入偏好清单,正文由 `agent_profile_read` 从固定快照按层读取。工具 schema、节点类型、可写字段和画布读取来自服务端节点能力 registry;收费生成还需实际媒体任务适配器。写入、审批与预算仍以服务端强校验为准。
- [x] 数据库 append-only 迁移 v15 为关闭自动迁移的部署创建 `agent_profiles`;OpenAPI、功能清单、代码地图和数据库文档已同步。相关 Go 专项测试与前端构建结果以本次交付记录为准。
- [x] 图片 / 视频 / 音频能力描述符允许更新标题和下一版提示词草稿,`content` 经字段合同映射到 `metadata.composerContent`;服务端回归测试覆盖失败视频节点,确认媒体结果、已提交 `prompt`、任务状态和引用问题不被覆盖。前端手工编辑与引用同步也已收敛到统一提示词写入器,纯函数测试覆盖三种媒体、空草稿、仅 storageKey 图片和文本节点。
- [x] 终态旧 Capability 轮次可作为不可变历史创建当前合同的新轮,父运行保持原始 JSON;旧合同活动运行会明确终止,不恢复模型或工具执行。历史结构损坏改为 409,不再落成通用 500。客户端提交错误区分服务端明确失败和未收到响应。
- [x] 审批预览与实际画布写入共用解析/校验/规划路径并固定 `callHash`;审批卡和 `canvas_updated.actions` 均携带节点标题、类型、修改字段、修改后标题及引用连线两端。解释信息不授权能力,执行仍校验归属、快照、Capability、锁和预算。
- [ ] 在备份后的隔离 PostgreSQL 部署执行 `migrate-schema up` 和 `migrate-schema verify`,确认 v14→v15 后原有 Agent 轮次可查,新用户/项目/画布偏好能独立更新且不串账号。
- [ ] 在真实登录态检查偏好编辑、并发冲突、三层继承、SSE 重连及续聊:修改偏好后新轮次使用新版本,旧轮次历史保持原样;试图在偏好中要求越权工具、跳过审批、任意 URL 或提升预算应被服务端拒绝。
- [ ] 使用真实模型、计费与画布验证 read_only / request_approval / auto、节点精读/分页和 image/video/audio 生成的审批、收费限额、引用边界与失败恢复。静态测试不等于生产验收;系统策略 md 当前不是后台热更新。
- [ ] 在真实画布分别选择失败和已完成的图片 / 视频 / 音频节点,让 Agent 修改标题与下一版提示词:编辑框应显示新草稿,旧媒体仍可预览或播放,已提交提示词、任务状态和引用状态保持不变;刷新后结果一致。
- [ ] 对锁定媒体节点执行同类更新应被拒绝;尝试经 Agent 修改媒体 URL、`storageKey`、任务字段或其他未登记 metadata 也应被服务端拒绝,不能因 `content` 草稿别名扩大写权限。
- [ ] 更新后重启本地后端,用调试包中的已完成父轮次 `ag045cb29d5cebb44cb42cedb235d2fc5a` 续发“继续操作”:应创建当前 Capability 合同的新轮,不再返回“系统处理失败”;父轮次状态和冻结合同保持不变。
- [ ] 在真实审批和执行结果中确认:更新节点显示执行前名称、节点类型、修改字段和修改后名称;新增连线显示来源与目标标题/类型,点击可定位对应节点;普通 UI 不暴露完整内部 ID。
## 多角度编辑器与宫格切分交互
多角度改为贴在节点下方的 3D 轨道/天空盒预览(摄像头与天空盒切换、常用角度、方向箭头),宫格切分放在「图片工具」子菜单(预设 + 5×5 自定义点选),沿用当前 `--fg/--bg` 与 dock token,明暗主题共用同一套样式。
- [ ] 打开图片节点「多角度」:面板贴在节点下方;拖动节点或平移画布时编辑器跟着节点走,不和节点分离。
- [ ] 点「正面 / 左侧 / 右侧 / 背面 / 俯拍 / 仰拍」后滑条与底部「当前视角」同步;生成新角度仍创建子节点。
- [ ] 切换浅色/深色:选中的标签、常用角度、镜头分段和滑条都跟随前景/背景,不出现浅色皮肤残留。
- [ ] 「宫格切分」在节点工具栏「图片工具」里,不单独占一个工具栏按钮;与「裁剪 / 调整尺寸 / 标注」同一列表样式(图标 14px、标题/说明字号与左右对齐一致);点开后有 4/9/16/25 宫格预设,点「自定义」后 5×5 板留在菜单内不闪退,最少 2 格才会切分。
- [ ] 宫格列表左侧小宫格图标垂直居中,右侧箭头约 10px,不出现过大的 LayoutGrid。
- [ ] 切分后子节点按网格排在原图右侧,互不覆盖,并保留原图提示词。
- [ ] 框选多张图后拖动:虚线选框跟着被选节点一起移动,松手后仍贴合,不留空框或错位。
## Agent 增量联动与可点击操作留痕
- 服务端将草稿、提交和媒体成功 / 失败 / 取消的节点增量与运行检查点一起持久化;前端 40ms 合批投影,不按每条完成 / 失败事件全量刷新。缺口、断流或冲突才单请求校准,发起间隔至少 1 秒,期间重复通知仅保留一次尾随校准。
- 按钮与提交入口共用节点任务状态,排队 / 运行中禁用,终态解锁;旧事件不能覆盖已换任务的节点。无关拖动、提示词编辑和视口保留,同字段冲突明确提示,不静默覆盖。
- 参数选择允许用户授权的目录默认值,已接受推荐方案不再追加文字确认;图生视频参考图只进 `referenceNodeIds`,校验错误说明可执行修正方法。独立收费审批、能力和预算校验保持不变,失败不自动重提收费任务。
- 聊天保存创建 / 更新 / 引用的节点名和节点 ID,点击复用画布聚焦,同一画布操作按工具调用 ID 去重;失败显示节点名、任务 ID、短摘要及可展开的完整错误。
- [x] 96 项前端专项测试通过,覆盖 50 个不同节点完成的一次 Store / 编辑器投影、零全量 GET,50 条事件合批、限频 / 单请求、乱序 / 幂等、新任务隔离及冲突保护。后端 `TestCloudAgent` 专项覆盖失败 / 取消终态、画布删除后的失败检查点和审批边界;前端构建、文档类型检查通过,仍有既有大分块提示。
- [x] 复用现有开发服务的隔离组件浏览器验证通过:创建 / 引用记录可点击,键盘可聚焦操作,模拟失败后共享任务状态解除按钮禁用,失败记录保留节点名且完整错误可展开。该验证使用真实工具卡组件与增量 / 聚焦函数,不等于完整画布路由或真实后端联调;未调用生成接口、未重启服务。隔离浏览器的开发热更新 WebSocket 受本地网络检查阻止,不影响这些组件断言。
- [ ] 真实登录态验收多节点同时生成、SSE 断线重连、切换会话 / 画布及失败后的节点展示;核实实际模型遵循默认参数策略。未调用真实收费模型,附件中 MiniMax 上游协议失败仍需独立渠道排查,不能视为供应商问题已解决。
## Agent 导出、媒体审批与文本引用
- [ ] Agent 顶部下载按钮导出当前对话消息、当前运行的服务端事件、工具参数、审批和错误为 JSON;服务端读取失败仍导出本地记录并附错误。凭证、签名 URL 参数及内嵌媒体已尽力过滤,提示词和对话仍可能含隐私,分享前需检查。历史轮次未缓存的原始事件不在本次导出范围内。
- [ ] 图片 / 视频遵守用户指定规格,明确授权默认时按上节选择;创建草稿及引用连线后显示独立审批,卡片展示真实模型名和规格。自动模式也必须等批准;拒绝 / 取消保留草稿,不创建媒体任务或预留媒体账单。聊天本身的文本模型费用不属于媒体生成审批。
- [ ] 视频提示词输入 `@` 可选择全画布未连线文本,选中后建立真实引用连线、使用正确编号并将正文带入生成;已有引用编号、Config 输入、自引用、循环及锁定保护保持正确。
- [ ] 仅平移 / 缩放 / 自动聚焦不会阻塞 Agent 同步或使审批快照失效;增量与本地无关字段编辑可合并,同字段冲突保留本地内容。审批仍对真实节点 / 连线变更进行快照校验。
- [ ] 工具失败行直接显示具体错误及已有任务 ID,不必悬停;区分未提交任务与任务完成后回写失败。旧日志缺失的上游错误无法追溯补齐,需新导出记录验证实际渠道问题。
- [x] 95 项前端专项测试、类型检查与生产构建通过(仍有大分块提示);后端 Agent、任务准入和模型能力相关测试通过,覆盖自动模式审批、拒绝 / 取消无任务无媒体账单、重复审批幂等、草稿归属、视口保存后批准、真实快照冲突及错误详情保留。尚未进行本轮浏览器交互或真实模型生成验收,未启动 / 重启服务或操作真实画布数据。
## 分镜表节点提示词面板
- [ ] 新建、连线创建、复制、粘贴和定位分镜表节点时不打开通用提示词面板,并关闭之前节点残留的面板;单击和拖动继续保持不弹出。分镜表内部编辑、生成与图片 / 视频节点提示词面板不变,待真实浏览器确认。
- [x] 4 项入口源码回归检查及前端类型检查 / 生产构建通过;构建仍有大分块提示,未进行浏览器交互验证。
## Agent 运行闭环
- [ ] 画布 Agent 媒体闭环:`model_list` 使用与生成面板一致的生效目录;支持读取节点 / 分镜表 / 角色资产绑定,审批时展示参考数量、画幅、质量、时长和音频。先创建图片 / 视频草稿和来源 / 资产连线,审批通过后原子绑定任务和账单;SSE 同步编辑器并聚焦新增节点,生成成功 / 失败 / 取消回写原节点。需使用真实已上传资产和模型渠道验证完整生成,不把测试数据库中的结果回写等同于真实出片。
- [x] 媒体闭环专项:后端 63 个顶层测试通过(Agent、任务准入、模型选择和能力相关),包含双图有序引用、图片生成、审批拒绝、快照过期、跨账号 / 未就绪资源、事务失败无媒体任务和账单、模型错误可恢复、结果 / 失败 / 取消回写及分镜分页。前端 22 项测试通过,包含审批规格、媒体节点与连线刷新、结果回写、聚焦及冲突保护。前端类型检查与生产构建通过(仍有大分块提示)。本次未启动 / 重启开发服务、未调用真实收费模型、未读写用户画布;发布后需新发起一轮 Agent 请求以获取新工具合同,旧失败轮次不自动续跑。
- [ ] 工具成功行取消重复的右侧“已完成”,参考路径允许换行;审批期间停止正文流式动效。模型选择器收窄至 144px,新增思考开关;真实模型兼容性、明暗主题和窄屏待浏览器验收。
- [ ] Agent 写入后同步持久化 Store 与打开的编辑器节点 / 连线;新增节点时选中并平滑聚焦本批节点,优先保持缩放,范围过大才缩小,尽量避开可移动 Agent 浮窗。不新增节点及相同快照重放不抢视口;未提交的本地编辑仍拒绝覆盖并显示冲突。窄屏浮窗遮满画布时回退全画布居中,需收起浮窗查看。待真实审批、连续写入、浮窗换位及断线重放验收。
- [ ] 节点标题增加明确拖动手柄,正文编辑 / 滚动与名称单击编辑保持不变;锁定节点显示锁定提示且不可拖动,只读画布不开放拖动。补齐 HTML / SVG 沙箱 iframe 吞掉拖动事件的问题:手柄捕获指针,拖动期间屏蔽画布内 iframe 命中,结束后恢复;全局手势监听保持稳定,避免重渲染中断拖动。待用户原画布节点、组合选择与解锁后拖动验收。
- [x] 聚焦与拖动专项 11 项测试通过,覆盖视口几何、浮窗避让、拖动入口与 iframe 保护静态约束、刷新冲突和重复事件;前端类型检查与生产构建通过(仍有大分块提示)。复用现有开发服务,在隔离 Chromium 中挂载真实节点组件和手势控制器:合成 HTML 节点从 `(100,100)` 拖至 `(300,268)`,松手后停止;结束与失焦取消后 iframe 的 pointer-events 恢复为 auto;锁定 / 只读手柄禁用。未读写用户画布数据、未启动或重启服务,真实审批联调仍待验收。
- [x] 本轮自动回归:前端 16 项测试通过,覆盖成功 / 失败工具行、长参考路径、编辑器刷新通知、本地冲突和重复事件;前端类型检查与生产构建通过(仍有大分块提示)。后端 `TestCloudAgent|TestRunAgentToolTask` 通过,覆盖审批写入、首轮及工具续轮思考配置、上游请求携带推理参数。未启动开发服务、未重启后端、未进行真实付费模型或浏览器验收。
- [ ] Agent 工具调用后的下一轮模型请求:Chat Completions 的 `tool_calls` 补齐 `type: "function"`,Claude 保留 `tool_use`;真实渠道连续调用与失败任务重新发起待验收。
- [ ] 后端重启窗口内读取已加入 Skills:对 5xx 做最多 3 次有限重试,恢复后清除旧错误卡;裸代理 502 不再展示 Axios 英文错误。需在重启后端期间打开 Agent 面板确认自动恢复且不污染对话。
- [ ] Skills 工具回归:目录始终列出固定快照入口 `SKILL.md`,Agent 先读入口再读取必要 reference;实际读取显示技能名与路径,失败事件不再出现成功摘要。同一轮同技能同路径的重复请求被拒绝,并引导使用历史结果;刷新恢复后仍保留去重状态。技能正文不整段进入 system prompt,入口中的未知工具名不能突破本轮工具清单。
- [ ] 模型断连回归:连接重置、超时、拒绝连接显示安全分类和模型任务 ID,未知错误仍引导任务中心排查;不向聊天面板暴露原始上游地址或密钥。不自动重试或恢复旧失败运行。
- [x] Skills 反馈专项:前端 19 项工具摘要 / 错误语义 / 审批与布局测试通过,前端构建通过;后端 `TestCloudAgent` 专项通过,覆盖空目录、重复路径持久化、不同技能与文件隔离、缺失文件反馈,以及模型失败事件与脱敏。未调用真实模型或重启现有服务,真实浏览器验收仍待完成。
- `/api/agent` 已注册能力、创建、追加消息、读取、取消、审批与事件流路由;一条消息对应一个持久化 `canvas_text` 任务,`cloud_agent_executions` 保存模型循环、工具、审批和事件状态,复用现有 Worker 与扣费事务。
- 服务端校验画布 / 运行归属、幂等键、三档权限、用户技能快照、有限画布上下文与每轮预算;已开放 `canvas_get_state`、`skill_read_file`、`task_get`、`model_list`、受限 `canvas_apply_ops` 和 `generate_media`。禁止 shell、任意网络请求和外部 MCP。
- [x] 专项测试覆盖请求校验、越权、预算拒绝、重复提交、可信连续对话、公共任务入口隔离;4 个并发请求仅产生一条任务 / 账单 / 预留流水;模拟上游经真实 Worker 得到并持久化回复。
- [x] 隔离浏览器通过模拟 Agent 接口完成发送 → 事件流 → 回复 → 已完成;不代表真实模型渠道或登录态联调通过。
- [ ] 真实登录态验证首轮 / 连续对话 / 取消 / 刷新恢复 / 审批 / SSE 断线重连;压力验证 PostgreSQL 扣费回滚。提交幂等键已按画布和会话持久化,仍需真实浏览器验证响应丢失后的同键恢复。
- [ ] 原本运行中的旧后端需重新构建或重启加载新路由;本次未重启用户服务、未调用付费上游。
## Agent 浮窗与设置布局
- 聊天列表增加底部跟随:发送后回到底部,内容或窗口尺寸改变时跟随;主动上翻阅读时暂停跟随。相同错误仅合并连续提示,不再吞掉后续发送的失败反馈。
- [x] 前阶段隔离浏览器模拟 404 连续发送 7 次及上翻后再发送:每次失败可见,最终距底部均为 0;前端构建通过。后端实现的验收边界见上节。
- 入口改为静态简洁按钮;桌面端支持拖动标题移动、上边缘 / 左边缘 / 左上角调整大小,位置与尺寸保存为浏览器 UI 偏好。窄屏使用全宽布局。
- 设置与 Skills 子页收缩边界、长文换行和内部滚动已调整;修正技能搜索及全选,模型选择仅保留一个图标,输入框移除聚焦位移。
- MCP 不再显示未经验证的连接成功状态。Agent 错误按 HTTP 状态呈现,不再根据错误文案断言系统模型渠道仍启用。
- [x] 专项测试:窗口几何与恢复、错误语义、会话缓存、资源引用输入,共 23 项通过。
- [x] 隔离组件浏览器验证:拖动 / 缩放 / 刷新恢复、Skills 搜索全选、明暗主题和 375px 窄屏无横向溢出、输入聚焦不位移。使用模拟接口,不代表后端联调通过。
- [ ] 登录真实画布验收入口、设置、详情、输入及窗口偏好;检查画布缩放和快捷键不干扰浮窗。
- [ ] 真实 Agent 运行、工具写入、媒体生成与 SSE 重连待联调;当前专项测试使用模拟模型和本地数据库,不替代真实上游验收。
## 异步视频统一轮询容错
- 声明式视频插件、遗留内置视频协议和 RunningHub 视频工作流统一在创建成功后等待 30 秒首次查询,后续每 30 秒查询;图片、音频和文本协议不受影响。
- 查询阶段的 HTTP 408/409/425/429/5xx、临时网络错误、断流、渠道槽位或熔断,以及最多连续两次非法 JSON 不再直接结束任务;HTTP 404 和结构化 `task_not_exist` 连续第三次才结束。
- 结果下载复用同一暂态错误分类,最多尝试 3 次且不重新创建或轮询上游任务。默认视频任务执行窗口由 30 分钟改为 60 分钟;已保存的管理员策略不会被覆盖。
- [x] `cd backend && go test ./internal/app ./internal/platform -count=1`:通过。
- [x] `cd backend && go test ./... -count=1`、`go vet ./...`:通过。
- [ ] 在测试渠道制造一次查询 502,确认任务保持运行、供应商任务 ID 不变,后续查询恢复后正常完成且不重复扣费。
- [ ] 检查任务日志只出现一次「查询暂时异常」与一次「查询已恢复」,请求明细仍保留每次上游调用。
- [ ] 让视频下载首次返回 502、第二次成功,确认宿主不重新查询或创建任务;连续三次下载失败时应返回包含供应商任务 ID 的错误。
- [ ] 将管理员视频超时仍设为旧值的升级环境启动一次,确认保存值保持不变;新安装环境默认显示 60 分钟。
## 画布图片资源缓存链路优化
消除首屏满屏转圈与"一直在下载":后端图片资源改 30 天磁盘强缓存(`Cache-Control: max-age=2592000`),前端内存防抖 IndexedDB 元数据写入、O(1) 淘汰预检、并发下载 4→16,视口内远程图片直链首帧上屏(走原生磁盘缓存秒开),Blob 缓存后台平滑升级。已编译通过,需浏览器最终确认:
- [ ] 打开含 50+ 张图片的大画布(如无限画布 1):图片不再全屏长时间转圈,视口内图片在 200ms 内显示(浏览器原生缓存或网络秒级完成)。
- [ ] 刷新页面后再次打开同一画布:单张图片耗时 ≤4ms(from disk cache),无网络请求。
- [ ] 监视器 Console Network 选项卡:图片资源响应头为 `Cache-Control: private, max-age=2592000`;HTTP 304 不再出现(本地磁盘命中无需 If-None-Match 验证)。
- [ ] 超大画布(200+ 图片)冷启动后,并发下载队列在 1~2 轮完成(不再串行 20+ 秒排队)。
- [ ] 切换不同画布、打开多个标签页均无 IndexedDB 阻塞卡顿(touchCacheMeta 内存防抖 + evictFor O(1) 预检生效)。
- [ ] 视频资源仍保持 `Cache-Control: private, no-cache`(每次播放仍需校验服务端 ETag)。
## 后端业务域拆包
- `internal/service` 只保留别名(4 个文件)。组合根和未拆出实现在 `internal/app`。已抽出域:`kernel`、`platform`、`skills`、`prompts`、`auth`、`canvas`、`assets`、`outbound`、`generation`。handler 仍只打 `*service.Service`。
- [x] `cd backend && go test ./internal/kernel/ ./internal/platform/ ./internal/skills/ ./internal/prompts/ ./internal/auth/ ./internal/canvas/ ./internal/assets/ ./internal/handler/ -count=1`
- [x] `cd backend && go build ./internal/service/ ./internal/handler/ ./cmd/server/`
- [ ] 登录后打开技能库:列表、加入、GitHub/ZIP 安装、内置技能正文仍可用。
- [ ] 管理后台提示词模板、用户风格库、画布按项目画风生成仍走原接口。
- [ ] 注册、登录、邮件验证码、密码重置、Linux.do 登录仍走原 Cookie 接口。
- [ ] 公开画布分享链接仍能打开,分享资源 URL 不泄露密钥和任务字段。
- [ ] 登录后画布库分页、按 ID 读素材、上传/替换用户素材仍走原接口。
## 固定分辨率图片模型
- 比例协议未配置质量参数时,图像设置按管理员启用的尺寸档位显示;未启用的档位仍隐藏。
- 选中档位会写入 `1k` / `2k` / `4k`;Gemini 图片由官方插件 `google-gemini-image` 映射为上游 `1K` / `2K` / `4K`,业务层不再手写组包。插件优先读 `quality`,画布残留的视频 `vquality`(如 `720`)不能盖掉 4K。
- [ ] 选 4K 后抓上游请求,确认 `generationConfig.imageConfig.imageSize` 为 `"4K"`,且没有 `candidateCount` 被误写成视频清晰度 `720`。
- 前台模型从系统模型同步 `imageSize` 预设和 `aspect_ratio` 参数;旧前台快照会从供应线路补回档位,不再把 1K/4K 压成只有 1K。未启用的 1K 不能因为协议默认 `low/medium/high` 出现。未声明 `quality` 的前台模型不能因选 4K 档位报“不支持参数 生成质量”。
- [ ] 系统模型启用 1K+4K 全尺寸后,打开对应前台模型:画布图像设置应同时出现 1K 和 4K。
- [ ] 保存同时启用 1K 和 4K 全尺寸、且未配置质量参数的模型后,画布图像设置应同时出现 1K 和 4K,切换档位后参考像素跟着变。
- [ ] 保存仅启用 4K 的模型后,在画布重新选择该模型,确认只显示 4K,切换比例和重新打开面板仍保持 4K。
- [ ] 实际生成后确认上游模型输出分辨率;面板参考尺寸不保证上游实际像素。
## HTTP API 错误码与 OpenAPI
- 路径仍是 `/api`。不做 `/api/v1` 双挂;前后端一起发布。
- 失败信封增加 `reason`。配额是 HTTP 403 / `code` 40301 / `reason=quota_exceeded`,不再用 400。限流是 429 / 42901 / `rate_limited`。
- `GET /api/openapi.yaml` 提供 OpenAPI 3.0。不要生成 TS 客户端替换 `http`。
- [x] `cd backend && go test ./internal/handler/ ./internal/service/ ./cmd/server/ -count=1`
- [x] `cd web && bun test test/api-request.test.ts`
- [ ] 登录后走素材库、画布、任务中心:Cookie 仍有效,请求仍打 `/api/...`。
- [ ] 打开已有图片/视频资源 URL(`/api/resources/.../file`)仍能加载。
- [ ] 文本任务 SSE 与系统渠道流式仍逐条到达。
- [ ] 账号配额打满时前端能用 `reason === "quota_exceeded"` 区分,而不是当可重试 429。
## JSON 字符串类型与素材写入合同
- 上游 JSON 不再把数字/布尔伪装成空字符串。`optionalJSONString` / `requireJSONString` / `firstJSONString` 在字段类型错误时返回 `expected string, got T`。视频 / 音频 / 声明式协议的任务 ID 走这条路径。
- `stringField` 仍用于可选查找(status、error.message、SSE 增量)。缺字段或类型错误对该键视为空,避免异构上游把整段解析打爆。
- 用户库素材写入强制 `kind`、`coverUrl`、`tags`(字符串数组)和按类型完整的 `data`。前端 `parseAssetRecord` 拒绝不完整记录,素材库页不再读时 `normalizeAssetRecord`。
- 已入库、缺 `tags` 或 `data` 的历史 payload:GET 仍原样返回;登录快照或素材库分页会解析失败。没有读时补丁,需要重新保存或清洗。
- [x] `cd backend && go test ./internal/service/ -count=1`
- [x] `cd web && bun test test/asset-record.test.ts test/asset-storage-revision.test.ts test/user-scoped-generation-persistence.test.ts`
- [ ] 上传/生成一条完整素材后刷新:素材库、画布引用、跨端同步仍可用。
- [ ] 用数字 `id` 的视频/音频上游(若有)应看到类型错误,而不是“没有返回任务 ID”。
- [ ] 本地 IndexedDB 若仍是缺 `tags` 的旧缓存,打开素材库应失败而不是 tags 变成 `[]`。
## 巨型文件按能力/容器拆分
- `provider.go` 只保留调度、水合和共享类型。文本 / 图片 / 视频遗留 / 音频 / HTTP / 声明式协议分别在 `provider_text.go`、`provider_image.go`、`provider_video.go`、`provider_audio.go`、`provider_http_client.go`、`provider_protocol.go`。未导出函数仍同包,测试无需改 import。
- 画布助手:容器 `canvas-assistant-panel.tsx`;展示层 `canvas-assistant-panel-views.tsx`;`onlineToolToOps` 在 `canvas-assistant-online-tools.ts`;影视续写边界在 `canvas-cinematic-continuation.ts`。测试仍从面板文件 re-export 取值。
- 创作页:`create/index.tsx` 只做提交和会话状态;历史抽屉、Composer、消息视图在 `creation-workspace.tsx`。
- 画布页时间线入轨从 `project.tsx` 抽到 `use-canvas-timeline-asset-insert.ts`。页面仍装配工作区 JSX。
- [x] `cd backend && go test ./internal/service/ -count=1`
- [x] `cd web && bun test test/generation-task-local.test.ts test/user-scoped-generation-persistence.test.ts test/generation-task-materializer.test.ts test/create-library-button.test.ts test/create-canvas-handoff.test.ts`
- [ ] 画布在线助手:发一条会改画布的指令、确认工具、影视项目续写/刷新恢复,行为与拆分前一致。
- [ ] 创作页空态/对话流、历史抽屉重命名删除、素材库插入仍可用。
- [ ] 画布时间线弹窗内从素材库/项目资产插入音视频仍直连入轨;图片仍提示先插入画布。
## 前端 HTTP 与产品浮层壳
- 业务 JSON 模块统一走 `http.get/post/put/patch/delete`,不再写 `request(apiClient.*)`。CSV / 诊断包 zip 走 `http.raw`。资源 404 缓存认 `ApiError.status`,不再看已经解包后的 axios 错误。
- image / video / audio 渠道请求经 `createChannelTransport`;语音合成走 `postBlob`,避免把音频当 JSON 解析。
- 自带外壳的产品弹窗改用 `AppModal flush`;技能编辑和管理员用户详情改用 `AppDrawer`。不要再复制 `padding: 0` 的 Modal styles。
- [x] `cd web && bun test test/api-request.test.ts test/http-ownership.test.ts`
- [ ] 登录后打开素材库、画布上传、风格选择、技能详情、渠道模型编辑:弹窗主题、关闭、内部滚动与改造前一致。
- [ ] 上传资源、导出管理日志 CSV、导出诊断包:仍走同一登录 Cookie,失败文案可读。
- [ ] 用音频渠道生成一条语音:应得到音频,而不是 JSON 解析错误。
## 产品 LLM 任务收进官方提示词目录
- 短剧一句话生成和技能库 AI 草稿不再把整段指令写在页面里。前端只传 `promptTemplateOperation` 与变量;服务端按启用模板 + 用户偏好编译,并校验 JSON 契约 `short-drama-outline/v1` / `skill-draft/v1`。
- 画布预设、反推提示词、工作流起步稿、文本改写、视频操作包装、字幕高亮指令集中在 `web/src/lib/prompts`。在线 Agent 系统提示词和读写工具名单集中在 `canvas-agent-protocol` / `canvas-agent-tools`,在线写门控与本地日志分类共用同一份读工具列表。
- 批改管线、提示词优化器、肖像比对等插件内指令仍留在各自模块,下一刀再收。
- [x] `go test ./internal/service/ -run 'TestPromptOperationCatalog|TestRenderShortDrama|TestValidatePromptTemplateResultShortDrama|TestValidatePromptTemplateResultSkillDraft|TestValidatePromptTemplateResultCharacter' -count=1`
- [x] `cd web && bun test test/prompt-catalog-ownership.test.ts test/canvas-agent-workflow.test.ts`
- [ ] 重启后端后,设置 → 提示词偏好和管理后台提示词模板应出现「短剧大纲」「技能草稿」。改平台默认或用户追加后,项目页一句话生成和技能草稿应吃到新文案,JSON 结构仍能导入章节 / 填入编辑器。
- [ ] 在线画布助手仍先读上下文再写;本地助手只读工具日志分类不变。画布预设、反推提示词、工作流缺省 prompt 文案与改造前一致。
## 最小 ESLint 只锁已退场的 AntD API
- `web` 增加 `bun run lint`。不是风格检查:只禁止再 `import { Empty } from "antd"`,以及静态 `Modal.confirm(`。
- 解析器用 `@babel/eslint-parser` + TypeScript preset。`typescript-eslint` 8 在仓库的 TypeScript 7 上会直接拒绝启动,所以没有用它。
- CI Quality / Web checks 在 typecheck 之后跑 `bun run lint`。
- [x] `cd web && bun run lint`:通过。
- [ ] CI 确认 Web checks 出现 lint 步骤且现有 PR 能过。
## web / canvas-agent 只认 bun.lock
- 删除遗留的 `web/pnpm-lock.yaml` 和 `canvas-agent/pnpm-lock.yaml`。同一套 `node_modules` 被 pnpm 覆盖过,会把 Tiptap 和 `lightningcss` 装成两套版本。
- `web/package.json` 去掉仅给 pnpm 用的 `overrides` 副本,并声明 `packageManager: bun@1.3.9`。仓库内 Canvas Agent 安装/构建改写为 `bun install` / `bun run build`;对外仍用 `npx -y @ddcat666/open-ai-canvas-agent`。
- CI 在 `bun install --frozen-lockfile` 之前拒绝 `pnpm-lock.yaml` / `package-lock.json` / `yarn.lock`。
- [x] `bun test test/package-manager-lockfile.test.ts`。
- [ ] 干净目录执行 `cd web && bun install --frozen-lockfile` 与 `cd canvas-agent && bun install --frozen-lockfile`,不要再用 pnpm/npm 装前端依赖。
## 确认框与空态退场静态 API
- 命令式确认不再使用静态 `Modal.confirm`(拿不到 App 主题和上下文)。画布取消任务、方舟素材上传、任务中心删除本机记录改为 `App.useApp().modal.confirm`。行内危险操作仍用 `Popconfirm`。
- 全库最后一处 AntD `Empty`(渠道排序弹窗)改为 `EmptyState`。插件中心筛选空态和提示词偏好空列表也接到 `EmptyState`。工作区整页空态仍用 `WorkspaceState`(信号图标),画布引导空态保持产品专用实现。
- [x] `bun test test/ui-kit-retirement.test.ts test/channel-presentation.test.tsx test/plugin-state-switch.test.ts`。
- [ ] 画布取消进行中任务、上传到方舟素材库:确认框明暗主题与页面一致,确认后仍执行原操作。
- [ ] 任务中心删除本机记录:确认框主题正确,只删本机记录不删素材。
- [ ] 管理后台渠道「设置排序」在无条目时显示 EmptyState;插件中心清空筛选后的空态可点「清除筛选」。
## 后端 Service 域边界试点(generation / outbound)
- 目标:横向按业务域拆包;handler 仍依赖 `*service.Service` 组合根,域包禁止 import `service`。
- 本轮已落地:`internal/outbound`(SSRF/出站 HTTP)、`internal/generation`(Engine + Deps 端口 + 官方协议注册表运行时)。`service` 通过薄包装再导出。
- `provider_*` 执行簇仍在 `service`(与编排水合/计费耦合深),后续按 Engine 端口继续迁入 generation。
- [x] `go build ./internal/generation/ ./internal/outbound/ ./internal/service/`
- [x] `go test ./internal/generation/ ./internal/outbound/ ./internal/protocol/ -count=1`
- [x] `go test ./internal/service/ -count=1`:完整 service 回归。
- [ ] 任选一条图片或视频生成,确认官方插件路径与结果落库仍正常。
- [x] `go list` 确认 `internal/generation` 的 import 不含 `internal/service`。
## 官方图片 / 音频 InterfaceType 只走声明式插件
- `runImageTask` / `runAudioTask` 对白名单官方接口只走声明式插件:`ensureOfficialProtocolAdapter` → declarative;未安装时报「…插件未安装」,不再回退手写组包。
- 图片白名单:`openai-image`、`grok-image`、`volcengine-ark-image`、`volcengine-jimeng-image`、`gemini-image`。音频白名单:`openai-audio`、`async-audio`。
- 已从 Builtins 移除对应 host adapter;真相源为 `plugin-packages/*.yingce-plugin`(含新建 `openai-audio` / `async-audio`,以及重写的 openai-images / grok / ark / jimeng)。
- 表达式引擎补 `$divide`(配合 `$split` / `$toFloat`);同步音频支持 `BinaryPayload`。
- [x] `go test ./internal/protocol/ ./internal/service/ -count=1`:协议与 provider 回归。
- [ ] 用 OpenAI Images(generations + edits)、Grok Images、方舟 Seedream、即梦图片、Gemini Image 各跑一条,确认创建与结果落库走对应官方包。
- [ ] 用 `openai-audio` 同步 speech 与 `async-audio` 异步任务各跑一条,确认二进制 / 轮询结果可播放。
- [ ] 卸掉对应官方图片或音频插件后再提交同类型任务,应看到「…插件未安装」。
## 官方视频 InterfaceType 只走声明式插件
- `runVideoTask` 对已有官方插件的接口类型不再回退到手写协议。生产注入插件注册表;单测未注入时会补官方包。显式放入空注册表则报「…视频插件未安装」。
- 覆盖的接口:`minimax-video`、`gemini-veo`、`novita-video`、`newapi-channel-1`、`newapi-channel-2`、`xai-video`、`volcengine-ark-video`、`volcengine-jimeng-video`、`newapi`、`agnes-video`。任务恢复也只查询声明式 adapter,不再回退 `queryNewAPIChannel2VideoTask`。
- 仍保留的手写路径只有:BaseURL 含 `/api/plan/v3` 的 Ark Plan Seedance,以及模型名含 seedance 的 Seedance `/videos` 遗留;OpenAI multipart / Grok JSON 视频死代码已删。
- 插件契约与旧手写实现不一致处按插件为准:MiniMax 时长必须 4–15 秒且不再把 `720`/`1440p` 映射成 `768P`/`2K`;Channel 2 不再做 grok 单图/音频校验;xAI 结果 URL 不可达时不再回退 `/videos/{id}/content`;Channel 1 音频 `type` 跟随宿主 role(当前为 `reference_audio`)。
- [x] `go test ./internal/service/ ./internal/protocol/ -count=1`:通过。
- [ ] 用 MiniMax / Veo / Novita / NewAPI Channel 1+2 / xAI / 方舟 / 即梦视频各跑一条生成,确认创建、轮询、下载仍走对应官方插件路径。
- [ ] 卸掉某个官方视频插件后再提交同类型任务,应看到「…视频插件未安装」,而不是静默改走另一套协议。
- [ ] Channel 2 创建后短暂 `task_not_exist` 仍应延期查询,不要二次创建。
## 列表分页查询改为 page + pageSize
- 业务列表查询不再使用 `page_size`、`project_id`、`folder_id`、`media_type`、`unit_id` 或管理端 `limit`。查询名和分页响应字段统一为 camelCase:`page`、`pageSize`,以及 `projectId` / `folderId` / `mediaType` / `unitId`。
- 技能库列表信封同步改为 `totalCount`、`hasMore`、`nextOffset`、`pageSize`。技能条目、安装表单、技能包文件与 GitHub 安装请求也已改为 camelCase;`createdAt` / `updatedAt` / `lastCheckedAt` / `lastSyncedAt` 为 RFC3339。内置技能种子文件仍是仓库内部 snake_case,读取后转换成对外合同。
- Eagle 素材连接器、Dreamina 本地任务和肖像比对仍走对方自己的 `limit`/`offset`,不纳入这次契约。
- [ ] 登录后翻页素材库、画布库、项目资产、技能库和积分流水,确认请求查询是 `pageSize` 而不是 `page_size`/`limit`。
- [ ] 管理后台用户、渠道、日志、公告、兑换码、计费、支付订单、对账和存储资源列表翻页正常,响应里是 `pageSize`。
- [ ] 技能库列表、详情、创建/编辑、ZIP/GitHub 安装:确认接口字段是 `skillId`、`skillName`、`createdAt` 等 camelCase,时间是 ISO 字符串而不是 unix 毫秒。
- [ ] 画布 @技能 提及和技能运行时仍能解析已加入技能。
## 前端测试改为全目录自动发现
- `web/package.json` 的 `test` 脚本从手工枚举约 100 个文件改为 `bun test`,CI 的 `bun run test` 会跑到此前从未进闸门的用例(含素材弹窗、上传边界、同步文案等)。
- 打开闸门前修了过时源码快照,以及:无入边时 `@图片1` 可引用节点自身;账号切换中止进行中请求的测试不再因 localforage 缺驱动而误失败。
- [x] `bun test`:全目录应通过。
- [ ] CI Quality / Web checks 确认 `bun run test` 覆盖新增文件且无顺序依赖失败。
## 写路径诚实化(存储直传 / 云端同步 / 计费退款 / 转码终态)
- 资源直传失败按 `ApiError.retryable` 分类:401/403/400/413 等永久失败当场抛出;429/5xx 与断网允许退回 IndexedDB,由云端同步用同一幂等键重传。UI 不得把 `pendingRemoteUpload` 说成已保存到服务器。
- 素材页、素材弹窗还原、批量上传、画布保存在云端同步失败时会排队 `scheduleRemoteUserDataSync`,文案改为「本地已保存,云端同步失败:…将自动重试」。LibTV/TapNow 导入仍只在本地写失败时回滚,云端失败不回滚已写入的节点。
- 系统渠道代理:退款或待核对写失败会打进程日志;退款失败会转 `uncertain`,避免订单停在 running。空 `billingOrderID` 不再假装退款。
- 播放转码终态回写失败会重试 3 次并打日志;`mark none` 写失败会恢复内存状态,避免前端把空状态当成 processing 轮询。
- Responses→Chat Completions 回退只认 404/405/501,不再把 502/503/504 当成“接口不存在”。
- [x] `bun test test/resource-upload-boundary.test.ts test/user-data-sync-message.test.ts`;`go test ./internal/service/ -run 'TestShouldFallbackTextToChat|TestPersistPlaybackResource'`。
- [ ] 登录后上传一张图时断开后端:应看到本地已保存+将自动重试,而不是“已保存”。恢复后端后素材应出现在云端。
- [ ] 用错误密码/过期登录上传:应直接报鉴权失败,文件不应静默进“稍后同步”。
- [ ] 画布导入 LibTV 后人为让同步失败:节点保留,出现云端失败提示。
- [ ] 系统渠道明确 4xx 后核对计费订单已退款;退款写库失败时订单应进入待核对。
## 引用素材库弹窗新增媒体类型筛选
- `AssetLibraryPickerModal` 左侧在「分类」之上新增「媒体类型」分组:全部类型 / 图片 / 视频 / 音频(可选文本)。媒体类型在分类之前收窄数据源,左侧分类计数、网格和分页描述同一批素材。
- 新增 `mediaKinds` prop 声明可选类型,只有一种或调用方已用 `remoteKind` 锁定类型时不展示该分组;新增 item 字段 `mediaKind`,缺省时按本地素材或插件素材的 kind 推断,角色卡这类非媒体条目在筛选生效时不出现。
- 远端素材库按服务端 `kind` 过滤并重置到第一页;`remoteKind` 仍是调用方的硬约束,媒体筛选不会覆盖它。
- 各入口传参:创作首页与项目主图沿用默认/图片单类型;画布插入素材、画布项目资产、短剧制造引用个人素材声明含文本的四类;角色三视图与角色声音已由 `remoteKind` 锁定,不展示分组。
- [x] `bun run typecheck`、`bun test test/canvas-asset-picker.test.ts test/create-library-button.test.ts test/asset-ingest.test.ts test/assets-page-batch-toolbar.test.ts`:23 passed。
- [ ] 创作首页「参考内容」:切换图片/视频/音频,确认分类计数、网格和分页一致,翻页后筛选保持。
- [ ] 画布「插入素材」「项目资产」:确认文本类型可筛选,角色卡在筛选非全部时不出现。
- [ ] 短剧制造「引用个人素材」以及角色三视图/声音绑定:确认前者有媒体类型分组、后两者没有。
- [ ] 窄屏(≤680px)下左栏横向滚动,媒体类型与分类合并成一排后仍可点选。
## 画布顶栏提示被生成任务面板遮挡
- 现象:画布右上角有进行中任务时,顶栏按钮的悬浮提示被「生成任务」面板压住,文字读不全。
- 原因:顶栏是 `--z-toolbar`(30) 的绝对定位浮层,会为子元素建立层叠上下文;顶栏提示原来是行内绝对定位、`--dock-tooltip-z`(140) 只在该上下文内生效,实际仍低于 `--z-panel-floating`(80) 的任务面板。提示向下展开的位置又正好落在 `--canvas-topbar-offset`(72px) 的面板顶边。
- 修复:`CanvasTopBarTooltip` 改用 Ant Design `Tooltip`(portal 到浮层层级),与专注模式工具栏、节点悬浮工具的提示实现一致;底部 dock 的提示向上展开,不受影响,保持原样。
- 视觉变化:顶栏提示改用全局浮层配色(`--popover`),不再是 dock 提示的自定义样式。
- [x] `bun run typecheck` 通过。未做浏览器验证:复现需要画布上有进行中的生成任务。
- [ ] 登录画布并发起一个生成任务,逐个悬停顶栏按钮,确认提示显示在任务面板之上、明暗主题下都可读。
- [ ] 确认菜单类按钮(画布菜单、导入第三方画布、媒体性能)的下拉仍能正常打开。
## 远端素材未归一化导致的 tags undefined
- 现象:部分素材的 `tags` 是 `undefined`,首页点击「参考内容」时页面报「当前页面没有正常加载,Cannot read properties of undefined (reading 'join')」。
- 原因:素材在服务端是不透明 payload,早期记录没有 `tags` 字段。本地缓存、登录快照和素材库页面都会走 `normalizeAssetRecord`,但 `user-data-sync` 的 `acceptRemoteAssets`(素材选择弹窗分页、按 ID 拉取引用素材)把服务端原样对象直接写进 store。
- 修复:`acceptRemoteAssets` 与登录快照都在写入前归一化,并让 acknowledged 基线复用同一份对象。顺带修掉登录时 store 存归一化副本、基线存原始副本导致这些素材被永久标记为待上传的差异。
- [x] `bun test test/user-scoped-generation-persistence.test.ts test/asset-storage-revision.test.ts test/asset-remote-sync.test.ts test/canvas-asset-picker.test.ts`:58 passed;`bun run typecheck` 通过。
- [ ] 登录后在首页点击「参考内容」,翻页浏览历史素材,确认不再白屏。
- [ ] 观察一次同步周期,确认历史素材没有被反复回传服务端。
## 声明式协议插件丢失系统指令
- 现象:短剧「AI 生成章节」报「AI 没有返回有效的章节内容,请重试」。上游请求只带一条 user 消息,要求输出 JSON 的系统指令被丢弃,模型返回散文,前端解析不到章节。
- 原因:`manifestRequestValues` 构造的 `request.messages` 不包含 `request.instructions`,而 OpenAI 系官方插件(chat-completion、deepseek-chat、atlascloud-chat 等 26 个)只映射 `request.messages`。
- 修复:宿主在 `request.messages` 前补一条 system 消息(请求本身已有 system 消息时不重复);`openai-responses` 和 `google-gemini-generate-content` 改为过滤 system 角色,改用各自的 `instructions` / `systemInstruction` 字段,与 `anthropic-messages` 一致。
- 需要重新打包并重装的官方插件:`openai-responses`、`google-gemini-generate-content`。其余 OpenAI 系插件只需后端升级,无需重装。
- [x] `go test ./internal/protocol/ ./internal/service/`:通过。
- [ ] 登录后用 DeepSeek 等 chat-completion 渠道跑「开始一部新短剧 → AI 生成章节」,确认章节正常导入。
- [ ] Claude、Gemini、OpenAI Responses 渠道各跑一次文本生成,确认系统指令生效且没有重复出现在正文里。
## 画布智能引用
- [ ] 在简洁、专业模式及展开提示词面板中打开智能引用,检查明暗主题、弹层宽度和开关状态。
- [ ] 输入素材名称、`image1` 或独立序号,按 Tab 和点击候选项均能插入正确引用;关闭 AutoLink 后不再提示。
- [ ] 一键引用全文保留重复指代,跳过已有引用、重名和“约2秒”等普通文本;无匹配时按钮禁用。
- [ ] 长提示词滚动、移动光标、中文输入和切换节点后,引用插入位置正确;素材原有双击预览正常。
## 图片节点打光与镜头控制
- 图片节点支持基于原图的打光与镜头控制;确认操作只生成明确的编辑请求,不修改源节点内容。
- 打光支持光位、俯仰、亮度、光色、轮廓光和预设;镜头控制由声明式参数构建提示词,生成结果保留对应操作元数据。
- 打光弹窗确认后只创建空图片节点并连到原图,不立刻发起生成;提示词、模型和尺寸可在新节点面板里改完再生成。
- [ ] 登录画布后分别执行打光与镜头控制,确认新节点、连线、模型配置、失败状态和窄屏菜单行为正确。
- [ ] 检查明暗主题、键盘焦点、弹窗滚动、复制提示词与自定义模板;确认取消操作不会触发生成。
- [ ] 点击「生成打光效果」后应出现空图片节点和连线,节点面板可改提示词/模型/尺寸;确认不会立刻进入 loading 或打上游。
## 创作页生成类型胶囊切换
- 创作页 Composer 的生成类型从「图片生成」下拉菜单改为 视频 | 图片 | 文本 三段胶囊切换(`creation-mode-capsule`),选中态使用 `--control-selected-bg/fg` 中性高亮;旧下拉 `creation-mode-picker-menu` / `creation-menu-icon` / `creation-chat-control.is-mode` 样式已删除。
- 录音时控制行不换行(`:has(> .voice-recording-inline)` 时 `nowrap`),录音条改为可压缩(`flex: 1 1 236px; min-width: 140px`,波形可缩);≤680px 恢复换行。
- [ ] 创作页(含首页空态和会话态)确认胶囊明暗主题选中/悬停层次正确、高度与其他控件协调,切换视频/图片/文本后模型选择器与参数菜单仍跟随模式变化。
- [ ] 录音时右侧模型、清晰度、时长、清空等控件保持在同一行,波形被压缩但不遮挡;窄屏(≤680px)录音时仍可换行不溢出。
## v1.2.8.rc1 候选版本发布
- 发布版本与镜像标签分别为 `v1.2.8.rc1` 和 `1.2.8.rc1`;GitHub Release 应标记为预发布,不能被当作正式版本推荐,也不覆盖已发布的 `latest`。
- 待验证:前后端镜像的 Linux amd64/arm64 构建、Release 更新器附件与校验文件,以及实际部署后的版本展示和核心流程。本次发布不自动部署服务,构建成功不代表业务验收通过。
- [ ] 拉取 `ghcr.io/ddcat-ai/open-ai-canvas-web:1.2.8.rc1` 与 `ghcr.io/ddcat-ai/open-ai-canvas-backend:1.2.8.rc1`,验证 amd64/arm64 manifest、容器内版本和提交信息,以及 `docker-compose.deploy.yml` 使用 `CANVAS_IMAGE_TAG=1.2.8.rc1` 启动。
## 框选工具栏精简与自适应整理
- 多选悬浮栏默认只保留对齐、等距、分镜组和批量连接;横向/纵向/宫格/连线排列和引用组改到工具栏设置里,需要时再打开。
- 框选多个节点后,在节点或画布空白处右键会出现「自适应整理画布」:保持现有相对占位,把间距至少加到约 56px,不按媒体类型重排。
- 右键已选中的节点不再拆掉多选。
- [ ] 登录画布框选一组松散节点,确认悬浮栏变短,右键整理后左右上下关系不变、间距变大,撤销可恢复。
- [ ] 工具栏设置里仍能重新打开隐藏的排列入口。
## 画布抓手 / 框选胶囊开关
- 主工具栏左侧的抓手工具和区域选择合并为一个胶囊开关:选中项是白色圆形滑块,未选项直接落在纯黑轨道上;左右留白比参考图更松。
- 默认仍是区域选择;切换到抓手后空白处拖动平移画布,切回后空白处拖动框选。空格 / 中键临时平移不受影响。
- 旧工具栏偏好里的 `tool-move` / `tool-box-select` 会合并成 `tool-canvas-mode`;两个都隐藏时开关才隐藏。
- [ ] 登录画布验证明暗主题、开关切换后光标和拖动语义、工具栏设置中的显隐与排序。
- [ ] 触屏或窄屏下开关仍可点按,不与 dock 横向滚动冲突。
## 画布本地媒体转换节点(PR #446)
- 合并本地媒体转换节点与 Canvas Agent Runtime:灰度、Canny、AI 线稿、Depth Anything V2、OpenPose;官方插件注册;图片输入约束、结果指纹与缓存。
- 合并冲突处理:保留主分支连线创建菜单的展开描述样式,并补上「转换」选项。
- 修复:完成后的转换结果可进入下游生成参考图;stale 写入不再覆盖 processing;hover「转换」识别 `storageKey` 媒体;pose `personCount` 允许 0。
- 已知边界:抠图(cutout)与视频转换仍标记为暂不可用;插件开关未像肖像排查那样隐藏创建入口。
- 修复:POSIX 主机上 Windows 风格绝对路径环境变量不再被 `path.resolve` 错误拼接工作目录。
- [x] `bun test test/media-conversion.test.ts`:7 passed。
- [x] canvas-agent depth/lineart/pose 路径覆盖测试:通过。
- [ ] 登录画布:图片 → 转换(灰度/Canny)→ 下游图片生成,确认参考图实际进入请求。
- [ ] 本机 Agent:深度 / 线稿 / 姿态转换;无人物姿态显示 skipped。
- [ ] 更换上游图片后转换节点变 stale,重新运行后下游可继续生成。
## Agent 聊天附件、局部重绘次数与多图展开
- Agent 输入框附件改为 80px 预览,标签在图片下方,不再盖住画面;点击/双击放大,可用 `@图片N` 插入正文,鼠标移开后图片保持可见。
- **在线 Agent**(画布助手面板)选中节点引用同步改为 80px 预览、点击放大、`@图片N` 插入,并接入输入框 `@` 候选;预览走 `storageKey` 解析,避免 blob 失效导致黑块。引用列表与画布选区解耦,逐个点选图片会累积到 Agent,不再只能保留最后一张。
- 提示词内联 `@图片N` 芯片恢复紧凑尺寸(约 22px 高 / 18px 缩略图),不再撑高整行文本。
- 图片/视频节点提示词面板的参考素材改为 44px 横向胶囊(缩略图 + `@标签`),单行左右滑动;「参考图 · N」移到标题栏「图片/视频生成」后面;**单击缩略图预览**,**点击 `@标签` 插入引用**。
- 画布局部重绘:核心区只保留笔刷、修改要求、生成张数;模型/质量/尺寸/比例收进「高级生成设置」折叠区,侧栏限高滚动,底部操作栏固定。
- 画布局部重绘增加模型选择、尺寸和生成张数;张数大于 1 时按多图组并行出图并默认展开。
- 局部重绘多图取消时清掉未出图的占位节点;单路失败不影响其余并行任务,部分失败会提示并保留成功结果。
- 重新生成会把源节点的参考图连线带到新结果,避免提示词里的 `@图片` 缩略图丢失。
- 管理员尺寸预设每个分辨率档位提供全选/全不选;左侧档位标题列加宽,4K / 8 个比例分行显示不再挤成「4K8 个比例」。
- 新的多图组默认展开成 4 张,不再叠在旧结果上;取消或重生成会清掉没有结果的占位子图,已有结果拆成独立节点。
- [ ] 登录画布验证 Agent 附件放大、`@` 插入、局部重绘侧栏不溢出且高级设置可折叠、局部重绘多张、改提示词重生成后参考图仍在,以及 4 张结果直接铺开。
- [ ] 管理员尺寸预设页确认 1K/2K/4K 左侧标题不换行、全选/全不选可用。
## 刷新画布后提示词引用缩略图恢复
- 修复参考图可见、正文 `@引用` 图片却加载失败:图片地址异步解析完成后,即使提示词未变化,也按引用 ID 同步正文缩略图,不再保留旧地址。
- 仅替换发生变化的预览元素,保留引用标签、文字和光标;地址不变时复用现有图片,不触发提示词保存。
- [x] 真实浏览器挂载实际编辑器,验证失效 blob 地址切换到有效图片后解码成功、光标和标签保持、相同地址复用图片,且没有触发 onChange。
- [ ] 在登录后的真实画布中刷新页面,确认原有参考图及正文引用均恢复;覆盖素材库引用和多个引用。
## 连线目标节点 3D 倾斜反馈
- 拖动连线进入现有合法目标吸附区时,目标节点按接近点倾斜,最大约 5°,以接近点作为支点;支持单条和批量连线,不扩大连线命中区域或改变节点坐标。移出、完成或取消后恢复,普通 hover、点击和选中不启用此效果。
- 性能降级模式、拖动节点和系统减弱动态效果下不启用倾斜。修复逐帧传入鼠标坐标导致目标节点 memo 失效的问题:仅在进入目标时锁定接近点,同一目标内移动保持引用和倾斜不变,切换、退出或取消时更新;连线端点仍按原有 RAF 节奏更新。
- [x] 方向、边界、缩放、600 次同目标移动引用稳定性及相邻连线/媒体专项共 40 项测试通过,前端构建通过。真实浏览器验证样式在普通/选中状态为 `none`,目标状态为 3D 变换,清除后恢复 `none` 和 `will-change: auto`。
- [ ] 在用户出现卡顿的大画布复验连线延迟和渲染开销;独立浏览器渲染计数实验初始计数异常为零,未获得有效的渲染次数对比,不能据此认定性能验收通过。
- [ ] 登录画布验证不同缩放下从各方向接近目标、完成、Escape 取消、窗口失焦,以及批量连线的合法/非法目标切换。
## 画布视频悬停预览
- 鼠标停留 350ms 后静音播放前 3 秒,播放完恢复静态封面;短视频结束即停止,不循环。触屏、按键拖拽以及系统减弱动态效果下不自动播放,点击播放仍使用完整播放器。
- 同时仅一个悬停预览(包括待加载任务),快速划过不解析视频地址;离开、滚轮、按下鼠标、键盘操作、窗口失焦、页面隐藏、节点离开视口或画布变换均释放播放器。手动播放优先,悬停不触发整文件后台缓存。
- [x] 悬停生命周期与相邻媒体专项测试共 31 项通过,前端完整构建通过;真实浏览器以 4.2 秒本地生成视频验证静音播放及约 3 秒后播放器移除。此验证不依赖登录,也不等同于完整画布验收。
- [ ] 在真实大画布中验收大量视频节点下的快速划过、拖拽、缩放、慢网和跨域失败,记录目标设备的帧率与内存;本地专项测试不代表所有设备的性能保证。
预览使用原视频,3 秒限制是播放时长而非下载字节上限;实际网络流量取决于浏览器缓冲、源视频码率和服务端 Range 支持。
## 任务详情、章节资产与请求明细
- [x] 前端专项回归覆盖图片自引用、任务同步边界、章节三类资产解析及相邻媒体逻辑;无角色章节允许保留场景和道具,缺失必填字段仍报错。
- [x] 后端 repository、service、handler 测试通过,覆盖请求/下载筛选及导出、章节资产输出校验。
- [x] 视频首帧组件使用浏览器内生成的视频验证:输出 400×225 缩略图,卸载后释放对象 URL;此项不等同于登录态任务页面验收。
- [ ] 登录后打开画布任务和短剧任务详情,确认不再因详情读取触发画布同步而报 `record not found`。
- [ ] 检查生成图片的提示词面板:不含自身引用,原有上游素材引用仍保留。
- [ ] 使用真实文本模型提取章节,确认角色、场景、道具均进入待确认资产,重复提取与刷新恢复不重复入库。
- [ ] 请求明细默认仅请求,切换仅下载/全部后,分页、检索、CSV 导出一致。
- [ ] 视频任务列表和网格检查已有封面、无封面、跨域失败、滚动懒加载及明暗主题。
- [ ] “参考 LibTV 的深度动作捕捉”尚未实现,需确认对应功能入口、截图或预期输入输出。
本轮不涉及数据库迁移;前后端需一起更新,后端重启后才会提供新章节提取模板和日志筛选参数。
## 文件上传占位、真实进度与磨砂流光
- 图片、视频按本地读取的真实宽高比占位;音频、TXT / Markdown 文本使用各自节点尺寸。普通 multipart 与大文件分片上传回传真实字节进度,磨砂和流光随百分比逐渐变淡;传输 100% 后显示保存处理中,不能当作服务端保存成功。
- 四类文件共用上传、拖入、替换及失败重试流程;完成后填入同一节点,上传弹窗提前关闭,批量仍按顺序处理。纯剪贴板文字直接插入,不伪造网络上传过程。文本按 UTF-8 读取,不支持 PDF / Word 文档解析。
- 上传失败保留明确错误和重新选择入口;替换失败保留原资源;上传中删除节点不会在完成后重新插入;刷新后中断占位转为错误。减弱动态效果设置下禁用流光和淡出过渡;媒体本地降级明确提示尚未上传到服务器。
- [x] 占位、进度浓度、四类文件、错误状态、相邻回归与普通/分片传输模拟测试通过,前端类型检查和完整构建通过;静态渲染与模拟传输不等同于真实网络及浏览器视觉验收。
- [ ] 慢速网络下验证横图、竖图、视频、音频、TXT / Markdown、拖入和替换:比例正确,遮罩随实际进度变淡,完成前后位置稳定,右上角与节点状态同步。补验大于 50MB 的分片上传及保存失败。
- [ ] 验证明暗主题、上传失败重试、刷新中断、上传中拖动或删除节点,以及系统减弱动态效果;未确认真实网络上传的浏览器交互。
## 上传图片保护与画布浮层顺序(#438 / #436)
- 上传/导入的纯图片素材不再显示生成框和生成设置入口;空白生成节点、已有生成结果和显式复制/版本节点仍保留配置入口。替换上传会清除旧生成落点状态。
- 人物质感操作创建独立图片编辑节点,通过入边引用原图;底部添加与外观面板接入统一浮层管理,打开或交互时置顶。
- [x] 图片素材判定、人物质感节点构造、入口接线、浮层接线及相邻布局/引用测试共 24 项通过;前端完整构建通过。浏览器访问现有服务进入登录页,尚未完成登录后的交互验证,也未调用真实生成接口。
- [ ] 上传、拖入和替换图片,确认原图没有生成框;执行人物质感、局部重绘、裁剪、放大与表情编辑,确认原图保留、结果生成到新节点并有原图连线。
- [ ] 先打开节点编辑框,再打开底部添加/外观菜单,确认后打开的面板在上层;再次点击节点编辑框能置顶,键盘操作、明暗主题和菜单关闭正常。
## 可视化排序与注册限流
- [x] 排序使用完整列表快照与事务保存,回归验证取消前的本地移动、过期快照、重复 ID、跨渠道修改及非管理员拒绝;价格和模型能力保持不变。
- [x] 验证验证码 SMTP 失败后可重试、同邮箱 60 秒冷却、429 响应的 Retry-After、小时窗口剩余时间与前端目录顺序。
- [x] 浏览器确认渠道和模型的“设置排序”、上下移动后保存及取消、用户端同时采用渠道与模型顺序;默认选择保留,临时顺序已恢复。拖动手势尚未单独做浏览器自动化验证。
- [x] 最终部署后日志记录 4 次验证码请求成功、3 次注册成功;自动化使用模拟 SMTP,未代替用户发送测试邮件。
- [x] 上线验收发现旧定时清理漏掉全局外观引用,启动时误删过期 Logo;已精确恢复原记录和文件,并验证清理保留四类外观资源、配置异常时拒绝清理。
- [ ] 用户继续验收不同邮箱服务商的收件体验及较多用户共用网络的情况。
## 系统渠道排序与前台别名
- [x] 系统渠道及模型列表保存排序、刷新后持久化的浏览器验收通过;自动化验证分页前排序、别名筛选及相同值按创建时间和 ID 排列。
- [x] 用户端模型设置与创作模型选择器沿用目录顺序;浏览器验证渠道换序、模型移至末尾、别名显示和清空回退,临时配置已恢复。
- [x] 自动化回归验证排序独立保存不改价格、启用状态或能力版本,普通用户无权保存排序,不能跨渠道修改模型;前端会话归一化保留目录顺序与当前所选模型。
- [x] SQLite 与独立 PostgreSQL 内存盘环境验证版本 8 升级至 9、重复迁移和默认值;生产迁移后业务指纹一致,保留数据库备份及已验证启动的 schema 9 兼容回滚程序。
## Tiptap 依赖版本对齐
- Tiptap 核心、React、扩展及间接依赖统一锁定为 `3.28.0`,同步 Bun 与 pnpm 锁文件;显式声明 `pm` 和 `extensions`,避免 pnpm 保留旧 peer 解析。此项不修改编辑器业务代码和 UI 样式。
- [ ] 使用 `pnpm install --frozen-lockfile` 后启动 `pnpm dev`,打开画布文本编辑器与项目章节编辑页,确认没有依赖预打包缺失导出错误。
- [ ] 验证正文编辑、标题、列表、颜色、高亮、撤销重做、保存后重新打开,以及明暗主题外观。
## v1.2.7 正式版本发布
- 版本与镜像标签分别为 `v1.2.7` 和 `1.2.7`;发布流程构建前后端 Linux amd64/arm64 镜像并生成 GitHub Release、双架构 Host Updater 与 SHA256 校验文件,同时更新主分支 `latest` 镜像。
- 本次发布目标是提供可用镜像,不自动部署服务、不修改线上数据库或运行配置。发布前应确认主分支质量检查、双架构镜像与 Release 附件均成功。
- [ ] 拉取 `ghcr.io/ddcat-ai/open-ai-canvas-web:1.2.7` 与 `ghcr.io/ddcat-ai/open-ai-canvas-backend:1.2.7`,验证 amd64/arm64 manifest、容器内版本和提交信息,以及 `docker-compose.deploy.yml` 使用 `CANVAS_IMAGE_TAG=1.2.7` 启动。
- [ ] 部署后验收登录、插件中心、文本节点、多角度编辑器、对象存储参考素材、模型批量操作、任务轮询、系统性能页面和真实生成链路;升级前备份数据库与数据目录。
## 创作页面附件缩略图
- 聊天消息与分镜简报附件的放大图标样式排除 `.cached-resource-image-shell`,避免缓存图片容器被误设为透明和绝对定位;悬停与键盘聚焦仍显示放大图标。
- [ ] 在真实创作会话中确认远端图片加载后无需悬停即可显示,移开鼠标后保持可见,点击可放大;同时确认分镜简报附件、本地图片和视频预览正常。
## MiniMax H3 分辨率能力与价格档
- 视频能力比较复用请求意图和价格档的分辨率别名归一规则,修复 MiniMax H3 供应线路配置 2K 价格档后,前台模型声明 2K 时误报「创作端参数超出供应线路能力:vquality」。内部价格档仍使用归一值,MiniMax 请求保持官方参数 `resolution: "2K"`。
- [x] 回归测试在修复前复现相同保存校验错误,修复后通过;相关能力匹配、线路覆盖和 MiniMax 专项测试通过。模拟 HTTP 请求验证 2K 与内部 1440p 均发送 2K,未声明的 4K 仍被拒绝,图片 quality 参数不受视频别名影响。
- [ ] 在实际 `/admin/channels` 配置 768P / 2K 价格档后,于 `/admin/models` 保存包含 2K 的模型能力,确认创作端可选并正确报价;未调用真实收费生成接口或部署服务。
## 对象存储优先发送媒体 URL
- 开启对象存储后,参考图、视频、音频发给上游时:协议支持 URL 就优先发对象存储签名链接;协议必须传文件字节时仍走 Base64 或 multipart。不会在上游失败后再自动重发一次生成。
- 强制 URL:NewAPI 系列、火山方舟视频、MiniMax 视频,以及声明需要公网媒体 URL 的插件协议。优先 URL:chat-completion、openai-response、claude-api、Grok 图片、火山方舟图片、xAI/Novita/Grok/Seedance 视频等。Gemini 图片、Gemini Veo、带蒙版的 OpenAI 图片编辑继续走字节。
- 本地资源在“优先 URL”协议下仍读成 Base64;对象存储资源签发失败、资源不存在或未就绪会直接报错,不会伪装成“不支持 URL”。存储桶不必公开读,使用短期签名链接即可。
- [x] 后端专项测试覆盖协议策略、OSS 强制 URL、本地强制 URL,以及 preferURL 时对象存储走签名 URL、本地回退 Base64。
- [ ] 用户浏览器验收:开启 OSS/COS/七牛/S3 后,图生图或视频参考素材应发对象存储 URL;Gemini 或蒙版编辑仍发文件字节。签名失败不能变成静默回退 Base64。
## 管理后台系统性能
- 管理后台「系统配置」新增独立「系统性能」页面,集中展示主机与 Go 进程、数据目录所在磁盘、系统/进程内存、数据库连接池与 Schema、PostgreSQL 统计、Redis 运行状态和运行时缓存 key 数量;连接地址、账号、密码、DSN 与 Redis URL 不返回前端。
- 页面提供 15 秒自动刷新、手动刷新、降级提示和紧凑 KPI。SQLite 环境明确隐藏 PostgreSQL 专属统计,Redis 未配置时显示单实例本地协调状态;macOS 无可靠系统可用内存时降级展示 Go 堆内存,避免把未知可用量误报为 100% 占用。
- 缓存维护仅接受 `runtime` scope,通过 Redis `SCAN + UNLINK` 清理请求频控、渠道失败/熔断和线路临时禁用四类白名单;保留活动并发租约、跨实例目录版本以及用户、任务、素材、模型配置和数据库数据,同时清理可重建的进程内读缓存并写入管理员审计。
- [x] 后端专项测试覆盖管理员权限、SQLite/无 Redis 状态、非法 scope 拒绝、本地缓存清理和审计写入;专项竞态测试、handler 路由注册、repository/service 和前端生产构建通过。Redis 白名单删除与保留边界的集成用例已实现,但本机无 `redis-server`,本轮自动跳过。
- [x] 浏览器 mock 已验证 PostgreSQL + Redis 完整态、SQLite + 本地协调降级态、桌面浅色与 390px 深色布局、无横向溢出,以及缓存清理二次确认文案;未调用真实清理接口。
- [ ] 在真实部署的 `/admin/settings/system-performance` 验证 PostgreSQL 统计、Redis 指标、自动刷新和 Redis 断连降级;仅在测试环境执行缓存清理,确认流量高峰期间不影响活动并发租约和业务数据。
## 图片组预览、连线菜单与尺寸设置
- 折叠图片组背板读取真实子图,排除当前主图、最多显示五张,并复用资源缓存与视口懒加载;未完成的子图保留占位背板。
- 连线创建菜单的说明与禁用原因可换行,菜单限制在视口宽高内并允许纵向滚动。隔离组件页已通过浏览器确认真实图片背板与长说明显示。
- 管理员固定展示 1K / 2K / 4K 三组,可选择或手动输入每档比例,等价比例归一去重;1K + 16:9 自动换算为 1824x1024,已有精确像素保持原值。未配置分档时,从已有尺寸按总像素推导档位(例如 1920x1080 为 2K)。
- 图片协议的尺寸参数独占首行,输出数量与可选参数移到下方;每个分辨率档位用横向比例卡片直接点选,额外比例通过输入框添加,默认输出也改为直接点选,不再使用比例下拉框。窄容器自动改为单列,视频协议布局保持不变。
- 后台未保存的新增模型表单已验证:比例选中/取消、32:18 等价去重、17:11 添加与像素展示、0:9 错误提示、默认输出切换、Enter 添加而非提交表单;1440px 桌面尺寸卡片独占整行,390px 明暗主题和长比例标签无横向溢出,焦点轮廓可见。验证后已取消表单、放弃测试修改并恢复原主题。截图工具未成功,本轮布局依据浏览器 DOM 几何测量与交互结果,视觉效果仍待人工确认。
- 画布、创作和短剧生产接入同一“分辨率 → 宽高比 → 像素展示”组件。用户端仅显示协议支持且已配置比例的档位:例如 2K 比例为空时隐藏 2K,允许自定义也不额外显示空档位;剩余按钮等宽填充。管理员仍保留三档配置入口。允许自定义时开放比例或像素输入,切档尽量保持比例;重新打开保留真实自定义尺寸展示,不将已隐藏档位的旧尺寸伪装成其他档位选中,也不自动改写尺寸。
- 空档位隐藏已在隔离组件页验证:仅配置 1K/4K 时无 2K 按钮,选择 4K 返回 3840x2160;仅一档时按钮铺满可用宽度,全空时隐藏分辨率标题和按钮,保留自动尺寸与自定义入口。未保存模型或发起生成,真实路由仍待人工复验。
- 比例请求配置 aspect_ratio;精确像素配置 size。独立分辨率字段由对应模型协议适配,仅比例不能保证输出像素。模型声明的精确像素预设不受自定义尺寸的 16 倍数对齐限制,保持原值发送,其余尺寸边界继续校验。
- 浏览器隔离组件页已确认:旧比例配置切 4K 实际交给请求转换函数的是 3840x2160;自定义 2:1 后切 2K 保持比例;0:9 显式报错且不改已选值;管理员输入 32:18 去重、17:11 自动计算并同步用户选项;Grok 禁用 4K。390px 视口内的 264px 面板在明暗主题下测得无横向溢出,含长比例标签。以上不等同于真实上游生成或三个路由的完整验收。
- 前端 29 项尺寸、协议及能力专项测试和生产构建通过,包含空档位隐藏、比例无下拉框、禁用状态与图片/视频布局隔离回归;此前后端尺寸预设、能力规格转换及图片任务相关测试通过,覆盖默认组合拒绝、跨档位比例拒绝及 JSON 往返,本轮纯 UI 改造未重跑后端。构建仍有既有的大分包与无效动态导入警告。
- [ ] 复验画布、创作、短剧真实路由中的模型切换、保存后重开、默认档位与比例组合、明暗主题和键盘交互;管理员真实保存由用户确认后执行。
- [ ] 用真实模型确认新增尺寸是否受上游支持、实际输出与计费档位是否一致;本次未修改已保存模型配置或执行收费生成。
## Issue #432 多角度编辑器
- 多角度编辑器改为居中 Modal,复用遮罩点击、Escape 和关闭按钮的取消行为,不再定位到节点底部或随节点拖拽卸载。
- #428、#429、#432 的定向源码回归检查与前端生产构建通过;浏览器访问现有服务停在登录页,未完成真实登录态交互验收。构建保留现有大分包和混合静动态导入警告。
- [ ] 人工复验不同缩放和明暗主题下的位置、遮罩与 Escape 关闭、重新打开重置参数、预设与角度拖动;本轮不执行收费生成。
## Issue #429 文本节点选中
- 普通文本和富文本预览恢复鼠标事件冒泡,单击进入节点选中和编辑面板流程;编辑中的输入框仍隔离拖拽和滚轮。
- [ ] 人工复验正文单击、标题拖拽、富文本、组合键多选、双击编辑和正文滚动。
## Issue #428 插件协议分类
- 分类筛选同时限制展示分区,避免音视频协议在音频筛选结果中重复展示;全部分类仍展示各自支持的能力分区。
- [ ] 人工复验 AutoDL 在音频、视频和全部分类中的展示,以及搜索、状态筛选和详情入口。
## 画布多图分组与展开动画
- 新生成的多图组默认展开,直接看到全部结果;仍可手动收起,复制图片或替换节点生成多图时保留分组归属、收起和设置主图。
- 子图入场动画仅在主动展开图片组时触发;普通选择、拖动或重新进入视口不播放入场动画,快速切换展开与收起时清理上一轮动画状态。
- 22 项相关测试及前端生产构建通过,包含子图普通挂载、选中与展开/收起的组件渲染回归;浏览器已确认本地画布可加载,尚未复验截图中的多图场景。
- [ ] 人工确认多图生成后的堆叠预览、数量按钮展开/收起、子图点击与拖动、主图切换,以及保存后重新打开画布。已有画布保留用户保存的展开状态。
## PR #426 本地整合验收
- 保留主分支图片尺寸选择器、后台尺寸预设布局、插件分类筛选、文本节点单击编辑、多角度居中弹窗、附件缩略图、站点外观与系统性能页面;接入 PR 的 UI 组件族和创作会话交互。
- 创作结果添加到画布前继续校验全部结果均有归属明确的素材记录,避免部分结果尚未落库时只转交部分素材;测试同步到消息级结果组件。
- 本次不接入 PR 新增的用户彻底删除功能,移除其按钮、客户端调用、路由和级联实现,原有停用/启用及素材回收站功能保持不变。临时 SQLite 回归已复现原实现成功返回后残留镜头修订和素材展示记录;其资源物理清理、账务保留与事务边界需单独完善后再接入。
- 无新增数据库迁移,不运行开发服务、不操作真实用户数据、不推送远程或部署。
- [x] 前端生产构建、前端主测试及主分支交互/外观和剪辑专项测试通过;后端 `go test ./...` 全量通过。
- [ ] 浏览器验收:明暗主题下图片分辨率/比例、自定义尺寸、后台模型能力预设、插件分类、文本节点编辑、多角度弹窗、附件常显、创作历史与完整结果转交画布。
- [ ] 确认后台用户管理保留查看/编辑/启用/停用入口,不展示未完成的用户彻底删除功能;实际生成与剪辑链路由用户验证后再决定是否推送。
## UI 组件同角色迁移(P0,2026-09-06)
依据 `docs/plans/ui-kit-consumption-audit.md` 实施:主界面/后台同角色控件统一消费 `components/ui`,消除 antd 与 ui 双观感。变更范围:Tooltip 29 处、Switch 10 处、朴素单选 Select 12 处、Checkbox.Group 1 处迁移至 ui 族;同步清理 globals.css 中 3 段 antd Checkbox 死选择器。antd `Switch`/`Checkbox`/`Tooltip` 全库归零;Empty/Alert/Badge/状态 Tag 维持零。
- [x] `tsc --noEmit` + `vite build` 通过(跳过与本次无关的 build:bridge 预构建)。
- [x] 代码级核对:`size="small"→"sm"`、`mouseEnterDelay` 秒→`delay` ms(ui 契约)、`id`/`htmlFor`→`ariaLabel`(ui Select 不接收 id)、`rootClassName` 死类删除、CheckboxGroup 泛型对齐;antd import 行同步剔除。
- [ ] 浏览器目验(待用户确认):
- [ ] Switch(ui 版):画布节点配置面板、字幕弹窗、工具栏显隐设置、人像抠图弹窗「浏览器调试」开关、图片/视频生成设置面板——尺寸/轨道/焦点态与设置页、后台开关一致。
- [ ] Tooltip(ui 版):后台左侧栏折叠提示、项目详情页签栏与新建按钮、画布各图标按钮、技能/插件/设置页——悬停提示正常、无溢出裁剪(ui 版外层 span 包裹)。
- [ ] Select(ui 版):后台邮件/存储设置、用户编辑抽屉、皮肤主题编辑器、画布页布局切换、项目详情设置、设置页与技能编辑/安装——下拉观感与尺寸、placeholder、暗色模式正常;skill 模板/皮肤阴影下拉值回显正确。
- [ ] CheckboxGroup(ui 版):脚本节点右键「显示列」选择器——勾选/反选、列显隐即时生效,无残留 antd 勾选样式。
- [ ] 已知保留(非本次改动,不判回归):搜索/多选 Select(约 24 处)与画布 11 处 Segmented 维持 antd,ui 能力缺口补足前不迁移。
## v1.2.6.rc3 候选版本发布
- 本版本在 rc2 基础上纳入此前未提交的模型编辑弹窗、协议浏览器、后台切页与画布网格源码及相邻回归测试;版本为 `v1.2.6.rc3`,镜像标签为 `1.2.6.rc3`,不覆盖 rc2。
- 默认前端测试命令已接入模型编辑表单、价格档、前台模型与画布网格回归;最终 `bun run test` 的 39 + 4 + 1120 + 1 项测试全部通过,前端生产构建通过,仍有既有包体积与混合静动态导入警告。
- 隔离组件页使用明确的测试协议数据完成浅色桌面、390px 暗色窄屏、协议搜索选择与详情联动、长内容滚动和固定底栏验收;后台编辑器跨页签必填校验能定位基本信息,取消修改会确认且可继续编辑。校验期间无 XHR/fetch 请求及控制台错误,不代表真实路由或后端保存已验收。
- 本轮相对 rc2 无后端源码变更,未重跑后端全量;rc2 记录的既有后端测试失败仍不视为解决。
- 标签推送后的远程质量检查中,后端全量与支付插件检查通过,前端被 9 个文件的格式检查阻断。主分支追加格式修复,并将协议浏览器静态回归的定位条件改为忽略换行缩进;本地 1164 项前端测试复跑通过。已推送的 rc3 标签不改写,该补充提交不改变应用业务逻辑。
- [ ] 发布产物验收:前后端 Linux amd64/arm64 镜像、双架构更新器校验和、部署 Compose 附件以及镜像内版本和提交信息。
- [ ] 部署后验收:实际模型新增/编辑保存、真实协议与计费组合、后台路由切换、画布缩放以及登录和任务生成。本次不部署、不写入真实模型配置、不执行收费生成。
## v1.2.6.rc2 候选版本发布
- 发布版本与镜像标签分别为 `v1.2.6.rc2` 和 `1.2.6.rc2`,GitHub Release 应标记为预发布。发布范围包含 PR #423 合并后的远程主分支,不包含本地未提交改动。
- 发布前代码验证:前端完整测试与生产构建通过;后端相关专项通过,全量测试仍有 4 项在合并前基线同样失败,另一次素材清理测试出现 SQLite 表锁且独立复跑通过,不将后端全量标记为全绿。
- [ ] 发布产物验收:前后端 Linux amd64/arm64 镜像、Release 双架构更新器、SHA256SUMS 与部署 Compose 附件,以及镜像内版本和提交信息。
- [ ] 部署后验收:版本展示、登录、画布任务恢复、图片规格报价、真实邮件与生成流程;本次仅发布镜像和附件,不部署服务或修改线上数据库。
## 缓存回源与任务队列止血
- 已加入进程内有界读缓存:SSE 按用户、任务、游标合并回源;并发策略短缓存;路由版本短缓存和目录回源失败冷却。强校验的计费、配额、权限读取不改为缓存。
- worker 改为可续期全局槽位和每次领取独立 owner;数据库进度、终态、完成事务、延迟回查检查有效租约;旧执行者条件更新失败后不继续退款和完成会话。渠道槽位等待改为有上限的随机退避。
- 已通过定向回归与缓存 / 租约 race 检查,覆盖突发同 key 合并、失败冷却、容量与正文预算、取消、缓存失效、用户 / 游标隔离、调用者副本和旧 owner 写入拒绝。完整 repository / handler 测试通过;完整 service 仍有 4 项既有失败,已在 HEAD 隔离副本复现(渠道私网策略 2 项、视频恢复策略 2 项),不将其标记为全绿。
- [ ] Redis Lua 与 PostgreSQL 双实例故障注入、长任务续租、worker 强退后恢复及真实 SSE 重连验收;本地缺少 Redis 服务且 Docker daemon 未运行,尚未执行真实 Redis / PostgreSQL 集成测试。
- [ ] 线上故障时段取证及灰度效果确认;本次没有部署、清缓存或重投任务,不能认定早间事故已修复。
- [ ] 独立 worker、可靠投递、渠道前置队列、全部回调 owner 校验、业务 Redis 缓存、请求链路日志和事件驱动 SSE 属于后续阶段。范围、上线风险及验收步骤见“开发文档 → 任务缓存与队列稳定性”。
## 后台模型编辑与紧凑布局
- [x] 模型编辑改为固定操作栏的高弹窗,按基本信息、能力与参数、积分定价分组;隐藏页签校验失败时定位到对应页签,未保存修改关闭前确认。
- [x] 基本信息采用双列字段,次要说明收进提示;价格档的定价方式、计费方式与金额横向排列,规格条件单独展开,启用状态收进档位标题栏。
- [x] 引用与限制改为左侧标签、右侧数字框,支持/默认开关横排,压缩卡片头部和行距,卡片按内容高度展示;样式限定后台编辑弹窗,不改变设置页的共享组件布局。
- [x] 调用协议由下拉框改为固定高度的内嵌协议浏览器:支持按协议名称、厂商和请求路径搜索,以单选列表切换,右侧持续展示当前协议的请求、请求体、响应方式和来源;约 30 个视频协议下仍保持弹窗高度稳定。
- [x] 管理后台“前台模型”和用户端“自定义渠道”的新增/编辑统一为居中分组弹窗;前台模型的供应线路改为可搜索单选浏览器。自定义渠道把连接信息、模型与能力合并为一个可滚动页面,不显示页签;调用协议仅在渠道内模型的“编辑模型使用配置”中选择,用户自定义模型不提供积分定价。
- [x] 隔离组件验收已覆盖前台模型新增、类型切换、线路添加与详情联动,以及自定义渠道新增、完成后重新编辑、渠道内模型协议搜索切换和嵌套编辑;验收适配窄屏单列布局,未向后端写入测试数据。统一改造后的 46 项相关回归测试和前端生产构建通过。
- [x] 协议选择专项与后台 UI 回归共 27 项通过,前端生产构建通过;浏览器已确认当前协议选中态、协议详情和 `sora` 搜索筛选正常,未执行协议切换或保存。
- [x] 31 项相关回归测试和前端构建通过。浏览器验证引用数量字段可编辑并恢复原值,未支持参数的默认开关仍禁用;桌面与 390px 窄屏无横向溢出,底部操作栏可见、长内容可滚动。未保存模型或触发收费上游测试。
- [ ] 人工确认紧凑布局、浅色主题、新增/编辑实际保存、协议切换和规格计费组合;当前真实路由受前台模型与自定义渠道功能开关限制,本轮只在隔离组件页完成交互验收。
- [ ] 后台切页已移除入场透明度动画并收敛为持久布局内的 Suspense 边界;冷/热路由切换的闪屏效果仍需浏览器复验。
## 邮箱域名白名单与公告自动提醒(PR #417)
- 新增注册邮箱域名白名单:默认常见服务商、空列表不限制、精确域名匹配;发送注册验证码及提交注册都会校验,已有账号找回密码不受限制。保存失败不覆盖既有配置。
- 公告允许仅标题发布;工作区自动提示未读公告,支持关闭本次及今日不再提醒。保留弹窗按需加载;主动打开后即使已读同步失败,关闭也不会立刻重新弹出。
- 合并沿用主分支历史迁移方案,不重复执行迁移或重写版本 6 的历史记录;未修改用户数据库,历史升级仍需备份及 PostgreSQL 实际环境验收。
- 已通过前端构建及本次相关后端数据库、handler、service 专项测试;公告提醒前端回归使用静态契约检查,不等同于浏览器交互验收。
- 基线复测确认既有失败:后端渠道私网策略 2 项、视频恢复策略 2 项,以及前端工作区加载骨架断言 1 项;本次不修改这些无关逻辑。
- 待人工验证:邮箱设置保存/清空/刷新及错误展示、仅标题公告发布与重新发布、明暗主题、窄屏弹窗、跨日提醒、不同账号的今日免打扰隔离,以及网络失败后的手动关闭与重试。
## v1.2.6.rc1 候选版本发布
- 发布版本与镜像标签分别为 `v1.2.6.rc1` 和 `1.2.6.rc1`;GitHub Release 应标记为预发布,不能被当作正式版本推荐。
- 待验证:前后端镜像的 Linux amd64/arm64 构建、Release 更新器附件与校验文件,以及实际部署后的版本展示和核心流程。本次发布不自动部署服务,构建成功不代表业务验收通过。
## 历史迁移 6 编号冲突
- 已修复历史 `asset_library_folders` 占用版本 6 导致启动失败的问题:保留既有记录,精确验证名称与校验和后,在版本 7 补齐播放副本字段;现行数据库迁移顺序不变。
- 已验证 SQLite 数据库测试:历史版本升级、目录数据与迁移时间保留、播放字段实际补齐、重复执行、未知名称/校验和及冲突记录拒绝;未直接修改用户数据库。
- 待验证:实际部署备份后的迁移与后端重启,以及 PostgreSQL 历史数据库升级。回退必须使用匹配备份与代码,不能直接修改 `schema_migrations`。
## 登录与个人库按需加载
- 登录不调用全量 snapshot;画布库每页 40 条摘要、服务端搜索排序;详情、导出和重命名按 ID 加载。素材选择按页读取,画布引用素材每批最多 100 个 ID。
- 已验证:前端构建、账号持久化专项 50 项测试、后端分页与批量读取隔离测试、handler 包测试。待新后端加载代码后验证登录首页网络、分页滚动、搜索、跨页选择、导出、重命名及失败重试;本轮浏览器连接中断,未取得改造后请求数。
- 后端 service 包更大范围测试有 4 项失败:`TestChannelFromRequestStoresAndClearsHeaders`、`TestRuntimeConcurrencyUsesEnvironmentFallback`(私网地址策略),`TestOnlyResumableNewAPIChannel2VideoDeadlinesStayRunning`、`TestResumableVideoDeadlineUsesResolvedSystemChannelProtocol`(视频恢复策略);未借本次分页优化调整这些逻辑。
- 待验证:新账号无缓存时的生成回填、历史创作转画布、项目图片与声音选择、跨设备编辑冲突和 PostgreSQL 查询。
- 边界:Vite 开发模块请求不能当作业务 API 数量;本地 IndexedDB 仍整体恢复,后端仍解析当前页完整画布。增量会话不基于未加载数据推断删除或自动归档素材。
## 提示词编辑器顶栏精简
- 标题改为“图片生成 / 视频生成”等无底色文本;“提示词模板”和“润色”右对齐,辅助操作默认透明,仅悬停、展开或键盘聚焦时强调。
- 参考数量移到缩略图行,纯图片引用显示“参考图”,混合引用显示“参考素材”;保留预览、插入引用和移除连接行为。
- [x] 前端生产构建通过;浏览器确认图片普通面板与放大面板的标题、参考数量位置,以及模板菜单展开。
- [ ] 确认明暗主题、窄窗口、视频及音频面板的显示;启用润色插件后检查入口与原有优化流程。当前验证环境未启用该插件,未触发生成或收费操作。
## 画布浮层平移同步
- [ ] 连续平移、缩放时,节点工具条与提示词卡片逐帧跟随,结束后不回跳;调整窗口宽度后仍正确定位。
- [ ] 顶部空间不足时工具条仍避让提示词卡片;明暗主题下移动无模糊残影,菜单、输入和键盘操作正常。
- 实现:卡片改用逐帧视口事件和 transform 定位,尺寸变化使用最新视口;工具条合并重复通知并缓存尺寸,交互期间关闭浮层滤镜。
- [x] 工具条及媒体性能专项测试 31 项通过,前端生产构建通过;浏览器连续平移与缩放采样中,卡片与节点间距约 10px、工具条与节点间距 30px,未出现定位回跳。大画布性能、不同设备上的残影观感仍待确认。
## 图片与视频节点工具条重组
- [ ] 图片:局部重绘、人像调整(表情/质感)、多角度、图片工具(构图与尺寸/拆分与标记),预览与下载为图标操作。
- [ ] 视频:截取片段、字幕、提取素材(画面/音频)、进入剪辑;替换素材收进更多,移除节点单独分组。
- [ ] 调整尺寸明确为插值放大而非 AI 超分;未实现的超分入口不再展示。裁剪、标注、放大、宫格和音频结果名称保留源素材名。
- [ ] 窄画布折叠工具与剪辑入口,顶部空间不足时工具条保持在可视范围;检查明暗主题、滚轮不穿透和点击后关闭。
- [x] 工具条专项测试覆盖分组、文案、空态、简洁模式、忙碌禁用和动作派发;前端类型检查与生产构建通过(存在分包体积及混合导入警告)。
- [x] 已在现有开发服务确认图片菜单分组、方向键进入菜单、Escape 关闭并返回触发按钮;390px 视口下工具条为单行且不越界。
- [x] 已确认视频四个一级入口及提取素材菜单;边缘节点工具条避让生成面板后可正常点击。
- [ ] 素材预览端到端验证受当前资源接口 500、本机 Agent 连接失败影响;不将界面验证视为媒体链路全部通过。
- [ ] 真实素材端到端复核:局部重绘与表情生成、质感设置、音频提取保留原声、项目时间线定位;本次不自动触发收费模型任务。
## 验证码邮件
- [ ] 邮件配置保存自定义发件名称后,新发送的注册验证码邮件发件名称、标题和正文保持一致;密码重置验证码邮件同样使用该名称。
- [ ] 发件名称留空或使用默认名称时,验证码邮件继续继承站点品牌名称;再次修改自定义发件名称后,新邮件使用最新名称。
## 画布任务恢复
- [ ] 缺少任务 ID 的节点,通过当前项目最近 100 条任务摘要的 `clientContext.nodeId` 恢复;完成后正常回填。超出发现范围的旧任务不保证自动恢复。
- [x] 回归覆盖任务摘要节点关联、敏感输入不泄露,以及前端在没有完整输入时读取节点 ID。
## 图片规格价格
- [ ] 仅配置 1K、2K、4K 三档价格(无统一兜底),画布逐一切换分辨率,显示与对应档位一致的积分价格。
- [ ] 分别配置文生图、图生图规格价格;添加、移除参考图或角色参考后,报价与实际生成命中对应档位。
- [ ] 新建图片节点时,报价使用节点模型默认规格,而不是全局旧参数;刷新后再次核对。
- [ ] 配置统一价格时仍正常兜底;未配置且没有兜底的规格不能被计为其他档位价格。
- [x] 合并检查补修:缺少质量参数时按有效尺寸匹配档位;不把空参数转为 `"<nil>"`;面板保留实际生成的“自动”参数,不以价格表第一档替换请求规格。
- [x] PR #423 合并验证:前端完整测试脚本 1139 项通过、生产构建通过;后端邮件、任务摘要和图片计价专项通过。后端全量仍有 4 项既有失败(私网上游校验 2 项、视频恢复策略 2 项),已在未合并的 `main` 基线上复现;最后一轮另有资源清理测试 SQLite 表锁失败,该项在合并分支与基线单独复跑均通过。未为通过测试而放宽安全或恢复策略。
- [ ] 真实 SMTP 投递、浏览器刷新恢复和收费生成仍待人工验证。本次不触发外部邮件或收费请求。
## NewAPI Video Generations Channel 2 轮询恢复
- [x] 官方插件兼容从 `data.task_id` 和 `data.taskId` 读取上游任务 ID;Channel 2 创建成功后首次查询等待 2 秒,仅将结构化 `400 task_not_exist` 识别为上游同步延迟,并按 2 秒、3 秒、5 秒、5 秒退避复查同一任务。
- [x] 短期重试耗尽后,Worker 保留本地任务 `running`、原 `provider_request_id` 和计费状态,延后 15 秒继续查询;恢复过程不重复发送创建请求、不切换渠道,也不立即失败或退款。其他接口类型、HTTP 状态和错误码仍按原失败语义处理。
- [x] 合并补修为跨轮次 `task_not_exist` 增加 5 分钟总同步上限;超过上限进入明确失败态并释放任务与计费资源,正常 pending/running 长视频仍可跨执行窗口恢复。
- [x] Channel 2 终态响应兼容 `data.result_url`、`data.video_url`、`data.output_url`、`data.url`、`data.metadata.url` 及对应的 `data.data.*` 嵌套路径;API 调用日志在该接口下优先记录嵌套真实任务 ID。协议与日志富化专项回归测试通过。
- [ ] 使用真实 Channel 2 分别验证上游任务 ID 短暂不可见和生成耗时 500 至 600 秒的任务:本地不再提示“模型服务拒绝了请求”,创建请求只出现一次,后续始终查询同一 Provider Task ID,最终视频正常回写;真实参数错误仍应及时失败。
- [ ] 使用返回 `SUCCESS` 且视频地址位于 `data.result_url` 或 `data.data.video_url` 的真实任务,确认不再提示“声明式协议已完成但没有返回结果”,并在当前 OSS 配置下成功下载并持久化为本地资源。
## 编辑器(M2 命令状态机)
- [x] 命令协议黄金文件:`editor-commands` 8 个黄金 op(addClip/moveClip/trimClip/splitClip/removeClip/setClipProperty/addSubtitle/removeSubtitle)全量快照比对通过;未知 op、非法 payload 一律抛错(fail-closed)且输入不可变。
- [x] 快照撤销:`editor-history` 有界 200 层,undo 后新命令清空 redo;边界测试(0 层/200 层/undo 后 redo 清空)通过。
- [x] 命令状态机 store:`editor-store` 命令入队→reducer→新状态,手势预览(previewGesture 连续预览/commitGesture 一次性入历史/cancelGesture 丢弃),1.5s 防抖保存(保存层依赖注入),保存串行链防旧快照覆盖,失败置 saveError 且保持 dirty;11 项测试通过。
- [ ] 浏览器冒烟(待用户确认):项目详情 → 剪辑成片 → 编辑器,拖拽片段移动、拖拽边缘裁剪(trim-start/trim-end)、撤销/重做按钮与缩放按钮;松手提交后可一次撤销;刷新后本地时间线(localforage scope 隔离)保留;状态栏显示 未保存/保存中/已保存/保存失败。
- [ ] M2.4 手势与画布拖拽不冲突(时间线容器 `data-canvas-no-zoom`),快捷键(Cmd/Ctrl+Z)与全局冲突项待 M3 统一处理。
## 编辑器(M3 预设插件八连)
- [x] 命令层新增 `rebuildSubtitleClips`(9 个黄金 op):从节点权威 subtitleEntries 重建字幕快照,确定性 id(nodeId:subtitle:index)重复导入原地替换;非法 entries(index/startMs/endMs/text/重复 index)与非法轨道(非字幕轨/无字幕轨)fail-closed;黄金文件追加用例通过(26 项)。
- [x] M3.1~M3.4:timeline-panel(选中联动 + 撤销/重做/缩放 UI)、preview-monitor(buildTimelineRenderPlan 预览)、inspector(setClipProperty 可撤销)、asset-ingest(addClip 入轨)插件与 editor.tsx 三段式接线已提交。
- [x] M3.5 subtitle-tools:SRT 粘贴导入(parseSrt → rebuildSubtitleClips 重建快照)、当前时间线字幕导出 .srt(serializeSrtEntries 往返一致);AI 高亮占位(M6 接入)。
- [x] M3.6 transcription:确定性 mock 转写(mockTranscriptionEntries 同输入同输出,3 项测试),结果按 ADR-0004 协议重建到字幕轨道;M4 替换真实任务客户端。
- [x] M3.7 export:渲染计划(buildTimelineRenderPlan 与画布同源)+ ffmpeg.wasm 降级导出(exportTimelineToMp4 带进度);悬空 nodeId 源按计划跳过。
- [x] M3.8:editor.tsx 全 8 槽三段式渲染(左素材/转写,中预览/时间线,右检查器/字幕/导出/AI)+ ai-assistant 占位(M6);typecheck 零错误、专项 53/53、全量 build 通过。
- [ ] 浏览器三段式冒烟(待用户确认):编辑器六个区域(时间线/预览/检查器/素材库/字幕/转写/导出)逐区域可见可操作;拖拽/裁剪/撤销重做回归;SRT 导入导出往返;mock 转写落轨;导出面板显示渲染计划。
## M5(编辑器插件权限执行,fail-closed)
- [x] M5.1:`plugin-permission-check.ts` 新建——8 插槽→最小权限表(timeline.read/timeline.command/export.run 三类域)+ `pluginMayRenderEditorSlot`/`assertEditorPermission` fail-closed 判定;测试 10 用例(表完整性/空权限拒绝/未注册拒绝/缺权限拒绝含 missing 域/editor-shell 真实回归 8 插槽可渲染)全绿。
- [x] M5.2 执行路径接入:editor.tsx SlotStack 渲染前过滤——缺权限插槽不渲染、改显一行诊断条(含缺失域);editor-shell manifest 权限补全为 timeline.read/timeline.command/export.run;tsc 全绿、全量 bun test 失败集与改动前一致(零新增回归)。边界:宿主全局命令(editor-commands,v1 语义)与宿主 UI 手势不经过此校验,仅 v2 插件插槽贡献与后续 M6 AI 命令代发通道受约束——ADR-0007「v1 权限语义一字不动」。
- [ ] M5 浏览器验证(待用户确认):停用/注册一个缺 timeline.command 权限的第三方插件时对应面板被拒渲染并显示诊断;editor-shell 全部 8 面板正常。
## M6(AI 编辑助手:schema + 摘要 + 面板)
- [x] M6.1:`ai-command-schema.ts` 新建——AI 命令 JSON 解析(容忍 markdown fence/前后杂讯/字符串内括号)、批级 dry-run 预检(走 M2 命令注册表,任一非法整批拒绝并报下标与 op)、12-op LLM 提示词契约(`AI_EDITING_OP_CATALOG` + `buildAiEditingSystemPrompt`)、`AI_COMMAND_SCHEMA_VERSION` 版本化;`ai-commands.golden.json` 固化 op 集与 registry 黄金同步(漂移即测试失败);20 用例全绿。
- [x] M6.2:`timeline-summary.ts` 新建——确定性中文摘要(轨道按 order 排序逐行、片段逐行含 id/kind/时间区间、字幕字数统计、空态提示);片段行数超限折叠(SUMMARY_MAX_CLIP_LINES);同输入同输出;10 用例全绿。
- [x] M6.3:`editor-ai-assistant.tsx` 从占位替换为真实 AI 助手——右上悬浮对话面板(OpenAI Canvas 风格):面板内文本模型选择器(`effective.textModels` 即文本能力模型目录,选择即 `updateConfig("textModel", …)` 持久化并在请求时同时覆写 `config.model/textModel`,绕过默认/误配图像模型的根因)、消息流(user/assistant/error/preview 四类气泡 + 思考中占位)、空态引导(示例意图文案,点击建议指令 chips 即发送,跨轮记忆)、底部输入条;顶部工具栏常驻 Sparkles 入口(aria-pressed 切换)。宿主链路:`buildAiEditingSystemPrompt(summarizeTimeline(project))` 喂上下文 → 流式增量渲染 → `parseAiCommandPlan` → `validateAiCommandBatch` dry-run(任一非法整批拒绝,同步 registry 校验、不落盘)→ ≤3 条 `dispatch` 直执行 / >3 条渲染 diff 预览卡片「确认执行(N)/ 放弃」→ 解析/校验拒绝时错误气泡可「修正后重试」(`failTurn` 回填 `FAILED_MARK`,历史含用户文本不重发;registry 直执行本身 fail-closed——拒绝写入 `saveError` 顶部提示,同步 dispatch 不抛错故不回填 FAILED_MARK)。修复了上一版文件的重复/截断函数(appendToEntry 双定义、settleAnswer 三声明等);typecheck 零错误、编辑器/插件相关测试通过、生产构建通过。
- [ ] 浏览器冒烟(待用户确认,需真实文本渠道):顶部工具栏 AI 图标开关面板 → 切换面板内模型下拉(无可用模型时展示禁用态)→ 输入自然语言;确认 ≤3 条指令直接执行且可撤销(撤销按条回退,N 条需 N 次撤销)、>3 条出现预览确认卡片(放弃不动时间线、确认后预览卡转为执行汇报、重复点击不再二次提交)、模型输出非法 JSON 时错误气泡出现「修正后重试」并回填失败标记、ESC/关闭按钮收起面板后再次打开会话仍在。
## M4(后端转写/渲染任务)
- [x] M4.1 执行侧(e9d1b8ad):本地 whisper.cpp HTTP(`CANVAS_WHISPER_BASE_URL`)转写;语音数据不出本机;未配置时任务明确失败并提示设置;`processClaimedTask` 顶部按类型分叉、旁路计费/模型路由,20 分钟超时;ffmpeg 预处理 16k 单声道 wav;`verbose_json` 解码/`formatSRTTimestamp`/`buildTimelineSRT` 单测 PASS。
- [x] M4.1 创建 API(bf26ebb1):`POST /api/timeline/transcriptions`(注册于 `RegisterTaskRoutes`)→ `CreateTimelineTranscriptionTask`:draining 503 → feature 门控 → 资源归属/可转写类型校验 → 配额入队(local/whisper.cpp,无 billing order);活跃任务上限 → 可读 400;测试 3 项 PASS。
- [x] M4.2 渲染任务(3f16d13b):`POST /api/timeline/renders` → `CreateTimelineRenderTask`:`buildRenderPlan` 校验 ≥1 可渲染媒体 → 配额入队(local/ffmpeg);worker 分叉 `processTimelineRender`(60 分钟超时):ffmpeg 合成 → 产物写资源存储 → `ResultJSON{resourceId,...}`;计划/失败快路径测试 PASS。
- [x] M4.3 前端字幕回写(fd5e8139):`timeline-tasks.ts` 客户端 + `editor-transcription.tsx` 真实任务替换 mock;资源范围放宽到音视频;`resourceId` 由 `storageKey` 推导;`waitForGenerationTask` 显式 25 分钟超时轮询;结果 segments → SrtEntry → `rebuildSubtitleClips` 落字幕轨;typecheck 通过。
- [x] M4.1 运行时端到端(2026-09-04,真实 whisper.cpp):`brew install whisper-cpp` + `ggml-base.bin`,whisper-server `127.0.0.1:8082`(`-l auto`);后端注入 `CANVAS_WHISPER_BASE_URL=http://127.0.0.1:8082` 重启;真实 mp4 资源经 worker 队列(status=queued → running → succeeded 100%)跑通:ffmpeg 16k mono 提取 → `/inference` verbose_json → 中文分段含 start/end/text 入库,与 `transcription_whisper.go` 解码协议一致。失败路径(未配置)此前 5 条任务均按设计报“撰写失败未配置本地转写服务”。启动步骤已写入 `local-development.mdx`,脚本 `scripts/start-whisper-local.sh`。
- [ ] 浏览器端到端(待用户确认;本机 whisper-server 已就绪,直接重试转写即可):媒体面板选音视频素材 → 转写 → 进度可见 → 完成后字幕分段入轨可编辑;错误路径(未配置/删除素材/非音视频/活跃任务上限/功能未开放)提示可读。
- [x] M4.2 渲染前端接线:`timeline-tasks.ts` 增 `createTimelineRenderTask`(timeline 整传 TimelineProject v2,与后端 renderProject 契约同构);`editor-export.tsx` 主路径改提交 `POST /api/timeline/renders` → `waitForGenerationTask` 轮询(62min)→ ResultJSON.resourceId 内嵌预览/下载;ffmpeg.wasm 降级保留;tsc 全绿、无新增测试失败。
- [ ] M4.2 渲染浏览器验证(待用户确认,需 ffmpeg 可用):导出面板「渲染成片(服务端)」→ 轮询进度 → 完成后内嵌预览/下载渲染产物;无后端时「本地导出」ffmpeg.wasm 仍可用。
- [ ] 文档回写(已提交):`docs/plans/m4-transcription-render-design.md` §2 决策 3/4/5 按“单一池 + 类型分叉”与旁路终态修正;端点统一为复数 `/api/timeline/transcriptions` 与 `/api/timeline/renders`(注册于 `RegisterTaskRoutes`);`auth.go` 前缀白名单补 `timeline`。
## 编辑器 UI 打磨(主题/布局/导入媒体)
- [x] 主题联动修复:globals.css `.dark` 块未闭合导致 `.editor-workbench` 规则被 CSS 嵌套吞并、浅暗主题三栏配色反转;补齐花括号后编译产物恢复顶层两规则,director token 明暗两主题齐备。
- [x] 播放条修复:预览卡与时间线卡容器补 `flex flex-col`,恢复 absolute 播放条的高度链。
- [x] 时间线右端截断修复:内容宽度改为 `trackWidth + 标签列(160px)`,标尺左列占位与轨道标签列改为 sticky(`left-0` + 不透明底),滚动到最右端时末端片段完整可见;容器宽度监听改用 ResizeObserver。
- [x] 顶部栏图标化:删除「剪辑工作台」标题 + Film 图标 + 分隔线等死图标;导出按钮改为纯图标(aria-label/title 保留)。
- [x] 媒体导入失败修复:`linkProjectAsset` 原来只认 assets 表记录,而上传只落 resources 表,导入必然 404。后端 `LinkProjectAsset` 在资产不存在时按资源元数据(storageKey/mimeType/kind/宽高/时长/状态)合成资产记录并幂等补齐(`UpsertAsset`),`Title` 透传原始文件名;资源与资产都不存在时仍 fail-closed。前端导入调用补传 `title: file.name`。
- [x] 后端新增 `TestLinkProjectAssetCreatesAssetFromUploadedResource` 与 `TestLinkProjectAssetMissingResourceKeepsFailingClosed` 专项测试;前端 typecheck、生产构建、后端全量测试通过。
- [ ] 用户浏览器 re-test(第 35 条):媒体面板中导入的素材与项目资产分组显示、筛选 Tab 切换、分组折叠与资产行展开;浅色/深色主题切换后媒体面板配色与编辑面板一致;时间线横跨整个编辑面板宽度,拖动分隔条调整高度正常。
- [x] 对象存储上传降级:OSS 上传失败(密钥失效、配置错误、网络故障、设置被删)自动回退本地存储并同步改写资源记录,本地媒体导入不再因外部存储故障整体失败;覆盖新上传与重试两条路径。专项测试 2 个(OSS 不可用降级成功 + 本地路径不受他人 OSS 设置影响),后端全量测试通过。
- [ ] 用户浏览器 re-test(对象存储降级):重新启动后端后再次导入视频,应显示成功且素材出现在媒体面板;资源走本地存储(`provider=local`)。
- [x] 编辑器 UI 打磨(第 36 条 5 项):① 时间线/监视器分隔条拖拽方向反转(上拖=时间线变大);② 导出按钮图标去蓝(灰白描边风格),媒体面板来源徽章去蓝,轨道类型徽章保留语义色;③ 时间线 pxPerMs 独立化(不再随时长漂移),末片段向右拖轨道随内容等比扩展不再被钉住(新增守护测试 3 例);④ 监视器控制条重做为 Concat 风格:回到开头/退 1s/播放/进 1s/到结尾五键传输组 + 播放速度展开菜单(0.5x/1x/1.5x/2x)+ 进度条,全部灰白描边;⑤ 检查器重做为 Concat 风格:分组小标题(片段/基本/转场)+ 紧凑控件 + sunken 滑块(新增 .editor-slider),全部使用 director token 随主题联动。
- [ ] 用户浏览器 re-test(第 36 条):上拖分隔条时间线变大;导出按钮与监视器控制条图标均为灰白描边风格;时间线末片段可正常向右拖拽且轨道随内容扩展;监视器速度菜单展开选择生效;检查器分组与滑块在明暗两主题下配色一致(无主题不同步)。
- [x] 媒体面板改版:资产按来源分组(「本地上传」/「项目素材」),顶部提供 全部/项目素材/本地上传 筛选 Tab;分组头可折叠、资产行可展开查看详情(类型/分类/来源/预览文本)并一键添加到时间线;每项带来源徽章与计数徽章。后端 `projectAssetSummary` 透出 `source`(上传链路写入 `uploaded`),前端 `ProjectAsset` 类型补 `source?: string`,仅展示层使用,后端读取不再查询本地存储。
- [x] 概览成片完成度接线:项目概览指标新增 `renderSucceededCount`(repository 聚合 SQL 子查询 `tasks` 表 `type=timeline_render` 且成功的计数),概览「剪辑成片」步骤卡的 complete 态由写死的 false 改为 `renderSucceededCount > 0`,提示文案随计数/就绪情况切换;新增后端专项测试 1 个、前端类型检查通过。
- [ ] 用户浏览器 re-test(概览完成度):渲染成功一次后刷新概览,「剪辑成片」卡应显示已输出 N 个成片且步骤完成态点亮;删除该成片对应任务后计数回退。
- [x] 时间线横跨编辑面板全宽:时间线卡从内容区独立出来,与左栏+预览+右栏同处编辑面板,横跨从左到右全宽(含拖拽高度分隔条);左栏收窄到 256px、右栏 320px,为全宽时间线腾出空间。
- [x] 主题明暗一致性:媒体面板分组/筛选/徽章/展开详情全部使用 director token(surface/control-hover/dock-fg/sequencer-border),无新增硬编码色值;后端 `source` 字段不参与任何配色。前端 typecheck、生产构建、后端全量测试通过。
- [x] 时间线面板补齐 Concat 风格工具栏与编辑交互(对齐第 2 条 runbook 与 `Concat/desktop/.../TimelinePanel.tsx`):新增 选择/剃刀 工具切换(剃刀点击分割、非字幕片段、边缘留 100ms)、播放头时码只读显示与标尺拖动 scrub、分割播放头处、删除选中片段、磁吸开关(默认开)、加轨道下拉(视频/音频/字幕,`addTrack` 黄金命令确定性生成 id/order/label,undo/redo 可重放)、适应宽度(`getFitTimelineZoom`);工具栏布局重排为 Concat 顶部条结构。`editor-commands.ts` golden ops 由 9 增到 10(`addTrack`)。
- [x] 磁吸失效修复:片段拖拽移动分支原本只保留「左边缘目标与右边缘目标同时命中」的结果,单边命中(如最后一个片段右边缘无目标)或双目标取整后偏移为 0(原始位置已在目标上)时整组吸附被丢弃,表现为「第一个和第二个片段能吸附、后续片段与剃刀分割出的片段都吸不住」。改为以 `computeSnap` 返回的 `targets.length` 判定命中、左右候选独立比较取更近者,单边命中与零偏移命中均可正常吸附。
- [ ] 用户浏览器 re-test(时间线工具栏与磁吸):拖拽任意片段(含剃刀分割出的片段)靠近其他片段边缘或播放头时磁吸生效且可吸附回自身原位置;剃刀点击在指针处分割;分割按钮在播放头落在片段中段时可用;删除选中片段后再次拖拽正常;加轨道后新轨道带确定性标签与序号;适应宽度后内容恰好铺满可视宽度;磁吸关闭后拖拽自由、无取整跳动。
- [x] 工具按钮选中态样式修正:时间线工具栏 选择/剃刀/磁吸 的按下态原来是蓝色背景块,改为「仅图标变 accent 色、无背景块」;颜色职责收敛为 `TOOL_FG_IDLE` / `TOOL_FG_ACTIVE` 两常量(唯一来源),工具栏与加轨道下拉不再散落重复的颜色字面量。
- [x] 监视器播放条重构(Concat 布局):删除叠加在画面底部的渐变进度条与 `<input type=range>` scrub;改为画面下方独立一行 `grid h-11 grid-cols-[1fr_auto_1fr]`:左 播放头/总时长时码、中 回开头/退 1s/播放暂停/进 1s/到结尾(播放态仅图标变 accent)、右 速度菜单(0.5x/1x/1.5x/2x,带 Gauge 图标与展开箭头)。
- [ ] 用户浏览器 re-test(选中态与播放条):点击 选择/剃刀/磁吸 时只看到图标变色(无蓝底块),深色/浅色主题一致;监视器底部控制条不悬浮于画面、无进度条,播放态播放图标变主题强调色,速度菜单展开/选择生效,拖拽分隔条改变监视器高度时画面区域与控制条高度正常。
- [x] 轨道操作按钮(Concat 对齐):时间线轨道行头新增「移除轨道」X 按钮(hover/键盘 focus 显现,danger 强调,仅该 kind 非最后一条时可用);新增 `removeTrack` 黄金命令——每类轨道至少保留一条(删除该 kind 最后一条会被守卫拒绝),删除时级联移除轨道上全部片段、无悬挂引用,undo/redo 可重放;`editor-commands.ts` golden ops 10→11(`removeTrack`),新增 3 条单测(级联删除并保留其余 / 最后一条拒绝 / 未知 trackId 拒绝)。
- [x] 资源上传 400 修复:`POST /api/resources` 在文件超过 MaxBytesReader 上限(单文件限制 50MB +1MB 缓冲)时 `FormFile` 返回英文 `http: request body too large` → 现翻译为与 service 配额校验一致的中文「单个上传文件必须小于 50MB」(`backend/internal/handler/user_data.go`),前端可正常展示失败原因而非裸 400。
- [x] antd Modal `maskClosable` deprecation 清理:5 处改用 `mask={{ closable: … }}`(canvas-upload-modal / asset-library-picker-modal / projects index「AI 生成章节」/ skill-editor-drawer / skill-install-modal)。
- [ ] 用户浏览器 re-test(轨道移除与上传):hover 轨道行头出现 X,点击移除非最后一条轨道后其与片段消失且可 undo;该 kind 仅剩一条时行头不出现 X;移除轨道后选中片段同步取消;导入超过 50MB 的本地视频不再报 400、可正常入库(见下方分片导入复测)。
- [x] 本地媒体导入对齐 Concat 分片化:前端 `uploadResourceFile` 超过 50MB 自动切分片上传(8MB/片、失败整传重试、回调进度);后端新增分片会话三接口 `POST /api/resources/uploads`(开始)、`PUT /api/resources/uploads/:id/chunks/:index`(逐片原始二进制)、`POST /api/resources/uploads/:id/complete`(合并落库,复用 UploadResourceFile 幂等/落盘/探测,保留上传中唯一键 → 提示“上传中请稍候”);单片上限 8MB 使文件整体不再受 multipart 单请求限制,普通本地视频可导入。
- [x] 上传默认配额放宽:运行时默认策略 `DailyUploadMB` 200→2048、`StoredFileGB` 2→20(管理员后台仍可调回);`UploadResourceFile` 经 `reserveChunkedUploadQuota` 豁免单文件大小上限、仅受日/总量约束;`upload_quota_test.go` 对总量文案、daily 上限文案与逻辑按新默认同步,`resource_upload_session.go` 分片会话(内存 TTL 90min、并发/单片限长防护、超总量提前拒绝),新增路由注册测试。
- [ ] 用户浏览器 re-test(分片导入):本地选择 `>50MB` 的视频导入成功并入库(进度可见、失败自动整传重试);断网重连后重试完成;`<50MB` 小文件仍走原 multipart 路径无回归;重复导入同一文件命中幂等返回原资源不重复占额度;超日限/总量时提示中文配额文案。
- [ ] 用户浏览器 re-test(第 35 条):媒体面板中导入的素材与项目资产分组显示、筛选 Tab 切换、分组折叠与资产行展开;浅色/深色主题切换后媒体面板配色与编辑面板一致;时间线横跨整个编辑面板宽度,拖动分隔条调整高度正常。
- [x] 轨道可见/静音开关(Concat 行头对齐):轨道行头补齐 eye(显示/隐藏轨道)与 volume(静音/取消静音)按钮,与移除 X 三按钮同组(行头加宽 w-40→w-48);关闭态图标变 accent 色(无背景块),轨道名与片段区随隐藏降透明度;新增 `setTrackFlag` 黄金命令(flag 白名单 visible/muted,golden ops 11→12),隐藏轨道(visible=false)上的片段不再参与监视器预览合成(getClipAtTime 过滤);新增 3 条单测(目标轨设置且其余不受影响、muted 独立于 visible、未知轨道/flag/非布尔拒绝),输入不可变校验。
- [ ] 用户浏览器 re-test(轨道可见/静音):行头 hover 出现三按钮组;点 eye 隐藏轨道后监视器该轨画面消失、轨道行与轨道名变淡、再点恢复;点 volume 静音后图标变 accent(音频在 M4 播放/导出阶段生效);仅剩一条轨道时无移除 X;以上操作均可一步 undo。
## 任务预览、文本创作与首屏加载优化
- [x] 任务列表视频改为后端海报字段与前端懒加载图片占位,列表本身不再挂载视频源;后端安全 URL、视频海报专项测试通过。
- [x] 图片、视频、文字节点的编辑面板统一定位在节点下方;文本创作新增默认开启的流式输出与默认关闭的思考开关,并完成前后端协议、推理内容解析和专项测试。
- [x] 创作输入支持一键清空,生成结果刷新后保持展开,“生成同款”入口移至结果标题区,对话文字默认左对齐。
- [x] 匿名首屏移除画布、素材、插件、用户数据同步和品牌视频的提前加载;生产预览的请求数由 203 降至 71,前端生产构建与相关专项测试通过。
- [x] 首屏骨架屏替换为平台 Logo、分镜、文字稿和时间线组成的创作动画,并支持减少动态效果偏好。
- [ ] 使用真实登录态分别生成 Responses、Chat Completions 与 Claude 文本,验证流式开关、思考内容、刷新后的结果展开状态和历史消息左对齐。
- [ ] 在任务中心打开含海报、无海报两类视频任务,确认列表滚动时不下载视频正文,进入详情后才加载并播放视频。
- [ ] 在画布底部边缘分别选择图片、视频和文字节点,确认编辑面板仍固定在节点下方且控件可通过画布滚动或平移访问。
- [ ] 在弱网、浅色/深色主题及 `prefers-reduced-motion` 下刷新首页,确认 Logo 创作动画清晰、无闪屏且登录后工作区模块正常按需加载。
## 生成结果项目资产同步限流恢复
- [x] 生成成功后的自动资产同步会识别后端 HTTP 429,读取 `Retry-After` 并在可取消等待后重试;普通校验失败仍立即上抛,专项测试与前端生产构建通过。
- [ ] 在启用常规素材/画布写入频控的部署环境连续完成一批图片、视频或音频生成,确认结果先保留在画布,临时 429 不再立即显示为项目资产同步失败,等待频控窗口后资产自动出现在项目资产库。
## 平台外观管理
## 支付插件跨平台构建
- [x] 微信与支付宝 provider 已使用同一 target-aware 构建脚本完成 `CGO_ENABLED=0` 的 linux/amd64、linux/arm64 交叉编译;目录 provider 与 `.yingce-plugin` 内 provider 的 ELF 架构和内容一致性校验通过。
- [x] 包内外产物一致性、完整包摘要缓存、同版本 provider 更新失效、未完成解包恢复等专项测试通过;RPC 错误映射的跨平台单元测试通过。
- [ ] 在 Linux CI 完成无文件、无权限、错误格式、异常退出与无效 JSON 的 RPC 进程测试,并使用 Docker Buildx/QEMU 执行 `payment-package-smoke` 的 amd64/arm64 双平台构建,确认目标容器内两个 provider 均能真实执行无效 JSON 冒烟请求。
- [ ] 保留含旧 Mach-O runtime 的生产 `/data` 卷升级到修复镜像,确认启动后自动选择新 package digest,管理后台保存微信和支付宝配置进入真实凭证校验。
## 站点及外观与皮肤主题
管理后台“系统配置 → 站点及外观”统一品牌、登录页、SEO、首页收尾/备案和皮肤主题,并让公开配置在应用渲染前完成解析;以下真实浏览器与媒体场景需要持续确认:
- [x] 后端专项与全量测试通过,覆盖内置默认值、管理员权限、资源类型/归属、公开 URL 不泄漏资源 ID、媒体字节嗅探、删除保护与路由注册。
- [x] 前端专项测试、后台回归测试、TypeScript 检查和生产构建通过,覆盖初始 HTML 品牌中立、自定义视频不回退内置封面、不安全 URL 回退、单 Logo 深浅主题复用、双 Logo 主题选择、外框关闭与登录场景固定使用深色 Logo。
- [x] 站点名已覆盖注册邮件、密码重置邮件、继承型发件人名称、诊断说明、批量导出、插件与协议文档中的运行时品牌文案;技术兼容键继续保留稳定值。
- [x] SEO、版权、ICP备案和主题库通过前后端归一化、持久化、公开投影、metadata/页脚和亮暗语义令牌专项测试;经典皮肤不写覆盖变量且由服务端锁定,三套初始扩展主题可编辑或删除。
- [x] 主题库支持从经典或当前主题完整复制、改名、新建、编辑、删除、启用和统一保存;每套包含浅/深各 50 项颜色与 17 项控件参数,公开接口只投影当前主题。
- [x] 危险删除、系统警告、错误/成功/信息状态与全站 Ant Switch 已统一消费主题语义色;开关有可编辑的开/关轨道、悬停和滑块色,并以边界与外环增强开启态辨识。主题卡按频次显示全部去重色,取色器只由色块直接触发。
- [x] 生产站 `/register` 与 `/forgot-password` 在 1440×900、1280×800、430×932、390×844 下无横向溢出,页面标题、SEO 描述、Open Graph 和版权均使用当前自定义站点名,正文无内置品牌残留。
- [ ] 使用管理员账号依次保存品牌名、英文品牌标识、登录页标题/说明、浅色 PNG/WebP Logo、可选深色 Logo、外框开关、MP4/WebM 视频与封面,确认工作台和登录页立即更新,刷新后保持一致。
- [ ] 在已登录管理后台从经典主题复制一套自定义主题,修改名称、浅色/深色、按钮 hover/active/focus、输入框、开关开/关轨道与滑块、选中卡、警告/危险色、图标、圆角、阴影和动效;保存刷新后确认保持,再删除测试主题并恢复运营方实际选择。
- [ ] 在浅色/深色下检查后台、创作页、插件页和设置页的开关开启/关闭状态,确认颜色、滑块、边界与外环均清晰;检查删除主题、普通危险按钮、确认弹窗、warning/error message 和状态徽标均随主题色变化且文字对比可读。
- [ ] 保存 SEO 标题/描述/关键词、版权与ICP备案开关,确认 metadata 和公共页脚刷新后同步;备案链接只指向 `https://beian.miit.gov.cn/`。
- [ ] 分别只上传浅色 Logo、只上传深色 Logo、同时上传两套 Logo,并切换浅色/深色主题,确认单图自动复用、双图按主题选择;开启“禁用 Logo 后面的圆角矩形外框”后确认工作台和管理后台导航只显示等比放大到原外框可用区域的 Logo,布局不跳动。
- [ ] 在“对象存储”中点击“使用品牌标识”,确认只更新当前路径前缀草稿;未点击或未保存时保留服务端已有前缀,历史资源读取不受影响。
- [ ] 保存一套自定义品牌后点击“恢复影策默认”,确认品牌名称、英文标识、Logo、登录页文案和媒体立即恢复内置值,自定义素材文件仍保留在存储资源中。
- [ ] 清空浏览器缓存并以慢速网络打开 `/login`、`/register` 和 `/forgot-password`,确认加载阶段不出现内置品牌名、Logo、favicon 或视频封面闪烁。
- [ ] 更换品牌视频但不上传封面,确认首帧出现前只显示中性深色背景;再配置封面,确认只显示当前自定义封面。
- [ ] 在存储资源页尝试删除当前浅色 Logo、深色 Logo、视频和封面,确认显示“外观”引用并保留文件;解除绑定后可正常删除。
- [ ] 将公开配置接口模拟为超时或 5xx,确认 4 秒内结束等待并完整回退内置外观,应用仍可进入。
## 画布导入同步、素材回收站与历史
- [x] 画布压缩包导入会先校验媒体完整性,并统一通过远端同步入口上传资源;失败时保持脏状态和自动重试,不再把浏览器本地 storage key 误报为已同步。
- [x] 素材回收站使用独立归档状态;彻底删除复用服务端引用校验与资源删除 Outbox,自动过期清理不会旁路业务引用。
- [x] 已删除画布历史改为按用户 scope 存入 IndexedDB;删除失败不记录历史,共享素材不会因删除单个画布被错误归档。
- [ ] 使用两个账号分别删除画布并切换登录,确认历史记录和回收站素材不串账号;刷新后记录仍在,清理历史只影响当前账号。
- [ ] 删除仍被其他画布或项目引用的回收站素材,确认服务端拒绝并显示引用来源;解除引用后彻底删除,确认资源记录进入 Outbox 并最终清理物理对象。
- [ ] 导入包含图片、视频、音频的真实画布压缩包,分别模拟上传中断和服务端保存失败,确认进度遮罩最终关闭、页面可离开且恢复网络后自动重试。
## 邮箱找回密码
- [ ] 后端专项测试验证验证码用途隔离、错误和过期验证码拒绝、单次消费、bcrypt 密码更新,以及重置事务撤销全部旧登录会话。
- [x] 前端专项测试和生产构建验证登录页入口、独立找回路由、验证码倒计时、新密码表单及账户邮件设置文案。
- [ ] 使用真实 SMTP 账号发送一次注册验证码和一次密码重置验证码,确认发件身份、正文、投递结果和 10 分钟有效期符合配置。
- [ ] 在桌面、窄屏和键盘操作下确认“忘记密码?”与密码标签同行右对齐,找回页没有横向溢出,焦点顺序和提示信息清晰。
- [ ] 使用两个浏览器会话登录同一账号后重置密码,确认两个旧会话都失效,旧密码无法登录且新密码可登录。
- [ ] 分别使用未知邮箱、禁用账号和 Linux.do-only 账号请求验证码,确认公开响应不泄露账号是否存在或是否可找回。
## 服务升级运行基础
- 完整架构、状态机、Release 清单、备份和回退边界见 `docs/design/dynamic-update.md`。
- [x] 后端新增权威 BuildInfo、`schema_migrations`、独立 `migrate-schema` 命令、分层健康检查以及可停止 Worker;专项 Go 测试通过。
- [x] 生产 Compose 在 Backend 前运行一次性迁移服务,并使用 `CANVAS_AUTO_MIGRATE=false` 阻止业务进程隐式修改 Schema;Backend 收到 SIGTERM 后进入 drain、停止领取任务并等待活动任务。
- [ ] 使用 PostgreSQL 部署执行一次无迁移启动和一次跨版本迁移,确认 migrate 成功后 Backend 才启动,checksum 漂移和高版本 Schema 均会阻止旧 Backend 就绪。
- [ ] 在存在图片、视频和文本长任务时发送 SIGTERM,确认 readiness 立即返回 503、新任务被拒绝、已领取任务在宽限期内完成,超时后租约可由重启实例恢复。
- [ ] 构建带版本参数的前后端镜像,确认 `/api/system/version`、管理后台版本、OCI Commit 和 Release Tag 一致。
## 画布视频静态首帧
- [x] 普通上传与生成视频会在入库时串行截取并持久化 400px JPEG 首帧;历史视频仅在可见、未选中且浏览器空闲时单并发补图,选中媒体或离开视口会取消后台解码。
- [x] 未选中视频只挂载静态图片,单选后才创建真实播放器;专项测试、TypeScript 检查、生产构建通过,本地画布刷新后 3 个历史视频首帧仍可显示。
- [ ] 用户在包含本地上传、模型生成和外部无 CORS 视频的真实画布中确认首帧画面、刷新持久化与降级图标;连续平移、缩放和切换视频时确认最多只有一个播放器且没有明显闪烁。
## 自由空白画布与画布外观
- [x] 线网格与点阵改为屏幕坐标下的固定间距背景,移除缩放时的密度、点大小和偏移更新;节点与连线仍按原视口平移缩放,网格颜色和透明度不变。
- [x] 固定背景新增渲染与实时视口回归测试,覆盖缩放范围、原点阵阈值、正负平移及空白模式;相关测试分组运行共 49 项通过,前端生产构建通过(保留既有分包警告)。
- [ ] 在浅色、深色及自定义主题下连续滚轮缩放、触控板捏合与拖动画布,确认背景无密度跳变或闪烁;切换空白/线网格/点阵后复验,确认节点与连线位置正常。
- [x] 新建画布引导新增“自由空白画布”主入口;进入后显示中央空白起始框和加号,不创建占位节点。
- [x] 中央加号复用底部工具栏的添加命令,当前浏览器已确认文本、绘图、分镜、背板、文件夹、图片、视频、导演台、音频、工作流、上传文件和素材库入口完整显示。
- [x] 自由起点按画布持久化,当前浏览器刷新后仍停留在自由空白起始框;浅色、深色两种主题已完成常规桌面尺寸验收。
- [x] 浅色画布固定为 `#EDEEEE`,深色画布固定为中性灰 `#262626`;原项目的节点、起始框、工具浮层、边框和阴影颜色保持不变。
- [x] 画布外观增加“自定义”主题,可调整背景颜色、背景明亮度、网格颜色和网格强度;不开放节点、工具浮层、边框和阴影任意改色。
- [x] 自定义主题增加“浅色界面/深色界面”,复用原项目对应的节点和工具浮层样式;切换界面样式不覆盖自定义画布和网格颜色。
- [x] 原“网格透明度”改名为“网格强度”,保持 `0%` 最淡、`100%` 最明显。
- [x] 颜色选择器与合法的 `#RRGGBB` 输入实时写入当前画布;点击面板外只关闭面板,不撤销刚才的颜色。
- [x] HEX 输入支持三位/六位、可带或不带 `#`;输入编辑不会被父级状态覆盖,选择新背景色时明亮度归零以精确显示输入色。
- [x] 删除背景透明度控件并忽略旧存储字段;背景明亮度改为沿 OKLCH 亮度轴调整,`0%` 精确保留输入色码。
- [x] 自定义主题继承进入前的浅色或深色基础界面;同一基础主题可以恢复上次自定义配置,跨深浅主题则重新继承。
- [x] 第一次进入或重置自定义主题时,明亮度默认为 `0%`、网格颜色默认为 `#B6B3B3`、网格强度默认为 `70%`;已有用户保存值不被覆盖。
- [x] 当前画布外观随画布项目保存;“保存为默认”写入当前浏览器并按账号 scope 隔离,不跨设备同步。
- [x] 深色点阵和线稿网格同步调整为 `rgba(205,205,205,0.28)`,浅色网格与网格图层渲染透明度保持既有值,并有专项回归断言。
- [x] 自由空白画布与外观专项自动化测试通过,前端生产构建通过。
- [ ] 在用户当前登录的 Edge 中验收颜色选择器、十六进制输入、明亮度调节、深浅主题继承和本机账号默认值。
- [ ] 在窄屏和触屏尺寸检查三张起始卡、中央起始框、加号菜单的换行、滚动与点击目标;确认菜单不遮挡底部工具栏。
- [ ] 由产品验收浅色/深色固定底色,以及原节点和工具浮层恢复后的最终视觉观感。
- [ ] 从自由起点分别新建每种内置节点和插件节点,并从上传、素材库各导入一次素材,确认第一个节点创建后起始框消失且刷新后节点数据不丢失。
## 画布拖线创建节点落点
- [x] 从普通节点连接端拖到空白处创建节点时,松手点改为新节点靠近来源一侧的边缘中点;单击快捷创建和批量连接仍保留原布局。位置计算与批量连接专项测试、TypeScript 检查和前端生产构建通过。
- [ ] 分别从节点右侧输出端和左侧输入端拖线创建图片、视频、文本与音频节点,确认新节点向松手点外侧展开,连线落在边缘中点且不会回头遮挡拖线区域。
- [ ] 单击连接加号创建节点,确认仍自动放在相邻位置并保留 96px 间距;使用批量连接创建节点,确认原有落点和连接关系不变。
## 素材库网格密度
- [x] 素材库桌面端缩小卡片并改为每行 6 张;新增素材占首格,默认每页 35 项,可切换 70/105 项,首屏正好组成 6×6 完整网格;中窄屏按 4/3/1 列收敛,前端生产构建通过。
- [ ] 在 1280px、1440px、1920px 与窄屏下检查图片、视频、音频、文本、模型和新增素材卡片,确认标题、徽标、批量选择和操作菜单不拥挤或溢出。
## 短剧长篇项目分页读取
- [x] 短剧工作台已拆分项目核心、制作概览、章节摘要、当前章节生产包、画布分页、资产分页和候选分页接口;章节列表不返回正文,当前章节生产包不返回其他章节镜头和产物。
- [x] 资产库按目录/分类分页,候选角色单独分页;分镜工作台资产栏服务端分页,当前章节响应只携带镜头已绑定资产;项目设置仅在打开主图选择器时读取图片资产。
- [x] 新增章节、镜头、章节产物、画布、项目目录资产、候选资产和项目任务组合索引;后端聚合/隔离/分页专项测试与前端生产构建通过。
- [ ] 导入至少 1000 章、每章 10 个镜头的测试项目,分别打开概览、章节、分镜、画布、资产和设置页,确认首屏请求不再出现整项目详情响应,切章只读取目标章节生产包。
- [ ] 在浏览器网络面板记录上述页面的响应体积、请求耗时和内存占用;连续切换 30 个章节、翻阅 10 页画布和资产,确认 React Query 缓存及 DOM 数量没有持续异常增长。
- [ ] 在资产超过 80 项、角色候选超过 24 项、画布超过 40 张时验证分页、分类、目录、候选确认、镜头资产绑定和主图选择;确认新增、移动、删除、确认后总数与当前页自动刷新。
- [ ] 使用 SQLite 与 PostgreSQL 各执行一次大项目冒烟,确认新增组合索引成功创建,概览聚合、章节隔离和分页顺序一致。
## 多文件技能包库
- [x] 后端新增技能版本与文件索引,支持单个 Markdown、ZIP 和公开 GitHub 仓库安装;ZIP 路径越界、软链接、重复路径、文件数、单文件大小和总解压大小均在写入前校验,后端全量测试通过。
- [x] 技能详情改为约 82vw × 82vh 的弹窗,左侧支持多层文件树,右侧支持 Markdown 预览、源码、代码/文本及媒体文件查看;前端生产构建通过。
- [x] 在线 Agent 只在系统上下文保留技能元数据,并通过入口、文件清单、单文件读取和搜索工具渐进式加载;本机 Agent 只把用户本轮显式提及的完整技能包写入临时目录,321 项 Agent 测试与 TypeScript 构建通过。
- [x] 新增统一 Skill Runtime:画布、创作页和短剧工作台共用同一技能选择、引用解析、版本/文件来源记录与上下文预算;普通生成只加载 `SKILL.md` 和入口直接引用的相关文本,在线 Agent 使用渐进工具,本机 Agent 使用原生完整包,专项测试与前端类型检查通过。
- [ ] 分别安装无 Frontmatter 的单个 Markdown、两个用户提供的示例 ZIP,确认名称/简介推断、文件树层级、中文路径、预览/源码切换和相对 Markdown 链接正确。
- [ ] 使用公开 GitHub 仓库的默认分支、指定分支和子目录安装技能,修改仓库后手动同步并等待一次后台检查,确认 commit、版本、检查时间、同步时间和失败信息准确。
- [ ] 在浅色、深色、常规桌面、窄屏下检查大弹窗尺寸、双栏滚动、文件筛选、长路径、省略文本、键盘焦点和媒体预览;确认弹窗不会触发画布缩放或快捷键。
- [ ] 在线 Agent 使用示例技能完成一次任务,确认先读 `SKILL.md`,仅在入口引用时读取对应 reference;本机 Agent 确认 scripts/assets 保持目录结构、turn 完成后临时目录被清理,且聊天历史不出现完整技能正文。
- [ ] 分别在画布图片/视频/文本生成、创作页文本/图片/视频、短剧分镜图/动作预演/镜头视频中选择示例技能,确认任务只记录本轮技能版本和实际读取文件,不重复注入历史消息,也不加载 `scripts/`、`assets/` 或整个技能包。
- [x] 画布、创作页和 Agent 共用的 `@` 引用菜单改为真实光标定位,输入框或页面滚动、尺寸变化时同步更新;向上弹出按实际内容高度贴边。技能候选改为工作流图标、名称、说明、版本和文件数的统一信息行,专项测试和前端生产构建通过。
- [ ] 登录后分别在高输入框首行、末行、滚动后的中间行输入 `@`,确认菜单与光标保持约 8px 间距;在浅色/深色及窄屏下确认技能说明、版本、文件数和键盘选中态清晰可读。
## 短剧分镜工作流 v2
- [x] 章节角色提取增加候选名称幂等:重复待确认角色、已经确认角色和别名不会再次创建;Agent 来源不能创建角色候选。数据库 schema v3 为候选增加 `name_key` / `source` 并建立待确认唯一索引,后端专项测试通过。
- [x] 资产分类统一为角色、场景、道具、素材、其他;旧服饰/武器/配饰映射为道具,旧画风和通用媒体映射为素材。项目资产页、画布资产菜单、素材选择器和 Agent 合同已同步,前端生产构建与专项测试通过。
- [x] 分镜工作台左栏调整为“章节 → 镜头 → 资产”并默认打开章节;项目资产页和分镜资产栏新增防抖名称搜索;镜头默认编号统一为“镜头01”,仅精确匹配旧 `SC.数字` 的默认标题会转换,自定义标题保持不变。
- [x] 后端新增镜头版本、镜头产物和生产任务上下文;分镜修改与资产版本变更会局部将旧产物标记为 `stale`,专项测试通过。
- [x] 短剧工作流调整为“剧情与章节 → 资产拆分 → 分镜脚本 → 黑白动作预演 → 视频生成 → 交付与打包”,旧 v1 实例保留,新章节使用 v2。
- [x] 项目工作台新增独立分镜工作流路由,支持初始化章节流程、新增镜头、保存分镜版本、绑定资产版本、查看预演/视频版本和交付缺失状态;前端生产构建通过。
- [x] 镜头轨道按当前制作阶段显示待生成、生成中、已生成和生成失败状态,状态标签固定在卡片右下角;横向镜头只在轨道内部滚动,不再撑宽脚本区或挤出产物预览。制作概览六个流程节点改为独立可点击卡片;前端类型检查、生产构建与相关专项测试通过。
- [x] 分镜生成设置接入统一模型选择、能力和计价链路,支持前台模型、系统模型与用户自定义模型;切换模型会归一画幅、分辨率/画质和时长,MiniMax-H3 的旧 `720` 会切换为 `768P`。项目设置可保存默认生图/视频模型;后端全量测试、MiniMax 回归测试和前端生产构建通过。
- [x] 单镜生成改为任务提交后立即返回,不同镜头可并行进入排队/生成状态;角色卡主图、绑定声音样本和场景资产会按 `图片N` / `音频N` 编译进提示词。MiniMax 项目资产使用 `reference_image` / `reference_audio`,仅显式首尾帧节点使用帧角色;产物固定绑定任务提交时的镜头版本。前后端全量测试与生产构建通过。
- [x] 视频图片语义统一为首帧、尾帧和普通参考图三类,并贯穿前端直连、后端任务与声明式协议;Agnes、Seedance `/videos`、火山方舟、NewAPI 媒体任务、xAI 和 MiniMax 不再按图片数量误猜项目角色资产。Gemini Veo、Novita 等仅支持起始图的协议会明确拒绝 `reference_to_video`,不再静默降级成首帧。
- [ ] 在真实项目中初始化一个已有章节,确认不会误用旧 v1 工作流,刷新和切换章节后阶段、镜头和当前版本保持一致。
- [ ] 在同一章节准备待生成、生成中、已生成和生成失败镜头,确认灰、蓝、绿、红标签始终显示在卡片右下角;增加到几十个镜头后确认只有底部轨道横向滚动,中间脚本和右侧产物预览仍完整可见。
- [ ] 在浅色、深色、常规桌面和窄屏下检查制作概览六张流程卡片的边界、间距、完成态、悬停和键盘焦点,确认跳转目标正确。
- [ ] 连续保存同一镜头多个版本并绑定不同资产版本,确认只有该镜头的动作预演和视频转为过期,其他镜头不受影响。
- [ ] 使用画布任务和项目任务分别登记镜头产物,确认 `production_task_links` 正确记录 Project、Canvas、Unit、Shot 和 WorkflowStep,且账号归属校验有效。
- [ ] 在浅色、深色、窄屏和常规桌面验证阶段导航、镜头列表、表单、检查器、媒体预览和长章节内容滚动。
- [ ] 在角色与资产页分别搜索已确认资产和待确认角色,再切换分类、目录和分页;确认关键词重置到第一页、空态明确且没有重复请求抖动。进入分镜工作台确认左栏顺序、默认章节页和资产搜索一致。
- [ ] 打开包含旧 `SC.01` 默认标题和用户自定义标题的项目,确认前者显示为“镜头01”且编号旁不重复,后者原样保留;新增镜头和章节生成镜头都直接使用中文编号。
- [ ] 在项目设置分别选择系统、用户自定义的默认生图/视频模型,刷新后进入分镜图、动作预演和镜头视频,确认项目默认优先、已下架模型回退全局默认;切换 Seedance、MiniMax-H3 等能力不同的模型时,画幅、时长、分辨率和本次预计积分立即更新,并与实际账单一致。
- [ ] 连续选择两个镜头并分别提交视频生成,确认两个镜头独立显示“正在提交/生成中”,第二个任务不会被第一个全局锁阻止;刷新页面后两个任务状态都能恢复,完成产物分别绑定各自提交时的镜头版本。
- [ ] 给镜头绑定带主图和声音样本的角色卡及场景资产,使用 MiniMax-H3 生成并检查请求日志:文本包含 `【资产参考】`、角色声音说明和台词,角色/场景图片为 `reference_image`、声音为 `reference_audio`,请求不再出现误判的 `first_frame`,画幅和 `768P` / `2K` 与界面选择一致。
- [ ] 使用同一镜头资产依次切换 Agnes 2.5、Seedance `/videos`、火山方舟、NewAPI 媒体任务和 xAI,确认单张角色图仍走 reference 字段;再切换 Gemini Veo、Novita,确认提交前给出“不支持 reference_to_video”的明确提示,而不是把角色图当起始帧生成。
- [ ] 当前“资产拆分 AI、多宫格生成提交、批量视频任务、后端交付包”仍是后续阶段,界面不得显示为已完成或可用。
## 角色声音素材绑定
- [x] 角色卡声音绑定移除无效的预设声音下拉框,改为从素材库选择或实时上传声音样本;支持 MP3、WAV、M4A/AAC、FLAC、OGG/Opus 和 WebM 音频。前后端共同校验资源归属、完成状态、资源类型和格式白名单,画布生成引用会保留资源真实 MIME 与文件扩展名。
- [ ] 在角色卡分别选择素材库已有音频并上传 MP3、WAV、M4A/AAC、FLAC、OGG/Opus、WebM 样本,确认选择器格式标签、浏览器试听、绑定、版本历史和刷新后的声音状态一致;再验证不支持格式、伪装扩展名、视频 WebM、未完成资源和其他账号资源均被拒绝。
- [ ] 使用绑定了不同格式声音样本的角色执行画布生成,确认请求中的参考音频使用资源真实 MIME 和对应文件扩展名,不再统一伪装成 MP3;生成成功、失败及刷新恢复后引用关系不丢失。
## 短剧章节后台生成与项目头部
- [x] “提取角色”和“生成到分镜制作”继续使用后端任务中心,确认配置后立即关闭弹窗;章节按钮按任务真实开始时间每秒显示“已运行 X分钟XX秒”,任务完成后恢复可点击并显示“已生成”。刷新页面后会按章节从任务中心恢复运行计时和完成态,并接管尚未写回的角色或分镜结果。
- [x] 项目名称、状态、六个项目导航、章节选择和新建画布操作已注册到全局公用头部,项目内容区不再重复占用一整行头部;相关专项测试、TypeScript 检查与前端生产构建通过。
- [ ] 在真实慢任务中分别启动角色提取和章节分镜,确认弹窗立即关闭、按钮计时连续增长、可编辑正文和切换章节,完成后按钮显示“已生成”且仍可再次运行。
- [ ] 在任务运行中和任务刚完成尚未写回结果时分别刷新项目,确认对应章节继续显示累计计时或“已生成”,成功结果会自动写回;再检查无新角色、生成失败和重新生成替换确认场景的按钮恢复、错误提示和旧分镜保护。
- [ ] 在浅色、深色、常规桌面和窄屏下检查全局头部:项目名、状态、项目导航、右侧全局操作和新建画布/章节选择不重叠,导航可横向滚动,内容区高度确实增加。
## 画布生成副本与结果落点
- [x] 图片、视频节点右键菜单新增“创建生成副本”:副本保留提示词、模型参数、首尾帧设置和原有参考入边,但不加入原节点的参数版本族。
- [x] 图片与视频生成统一使用结构化结果落点;生成副本、复制粘贴节点和参数变体直接回填当前节点,普通已有媒体再次生成继续创建新版本,不再依赖节点标题判断。
- [x] 参考入边复用、图片/视频原地生成策略专项测试、TypeScript 检查与前端生产构建通过。
- [ ] 分别对带一张、多张参考图及首尾帧设置的图片和视频使用“创建生成副本”,确认副本提示词、模型参数、参考缩略图和连线与原节点一致;连续生成多次时只更新副本自身,不新增下一级节点。
- [ ] 对普通已有图片、普通已有视频、参数变体和旧版复制节点分别生成,确认普通媒体创建并行版本,参数变体和复制节点原地更新;刷新画布后结果落点不改变。
## 画布生成结果命名
- [x] 快捷键复制节点生成图片后保留 `_copyN`,参数变体生成图片后保留 `A/B/C/D` 版本标识;批量输出追加结果序号。
- [x] 下载文件名继续使用节点标题,因此复制、参数变体和同批多图结果不会再生成相同文件名。
- [ ] 分别使用快捷键复制和“创建参数变体”生成图片,确认生成中、生成完成和刷新画布后标题标识不丢失。
- [ ] 下载原图、复制结果、多个参数变体和同批多图结果,确认浏览器不会再提示同名文件覆盖。
## 画布生成进度与全屏视频控件
- [x] 移除图片、视频任务进入模型调用时统一写入的假 35%;排队、后端接管和连接上游阶段只显示真实阶段文案,不再显示伪造百分比。
- [x] 后端从图片、视频上游成功的创建与轮询响应中识别 `progress`、`percent`、`percentage`、`completion` 及常见百分比变体,支持数字、百分数字符串和 0~1 小数;进度单调写回任务,前端既有 2 秒轮询会同步到画布节点。
- [x] 画布视频节点保留紧凑控件;进入全屏后恢复完整顶部控制组,底部按钮调整为 52px 操作目标,同时放大图标、时间文字、进度轨道和拖动滑块。
- [ ] 分别使用会返回整数百分比、小数进度、百分数字符串和不返回进度的图片/视频渠道生成,确认前三者按上游实时增长,不返回进度的渠道仅显示阶段文案且不会卡在固定百分比;刷新页面后继续从后端任务恢复最新进度。
- [ ] 在桌面、窄屏和触屏设备全屏播放横版、竖版视频,确认播放/暂停、音量、时间、画中画、设置、全屏退出和进度拖动尺寸清晰且不会遮挡字幕。
## 视频画面与片段提取
- [x] 视频节点“尾帧截取”已合并为“提取画面”,支持首帧、当前帧、尾帧和最多 30 个自选时间点;批量结果保留来源节点与时间点元数据。
- [x] “截取重生成”已调整为“截取片段”,默认只创建片段素材;可选同时创建待生成节点,但不会自动提交生成任务。
- [x] 多张提取图片会保持全部选中,可继续使用画布现有批量连接能力自行创建并连接生成节点。
- [ ] 在真实视频节点提取首帧、多个中间帧和尾帧,确认画面、时间标记、网格布局、来源连线和多选状态正确。
- [ ] 选择接近重复的时间点、超过 30 个时间点及部分帧解码失败场景,确认去重、上限提示和部分成功反馈正确。
- [ ] 分别验证“只创建视频片段”和“同时创建待生成节点”,确认前者不要求模型,后者创建后不会自动扣费或启动任务。
- [ ] 选中多张提取图片后新建视频生成节点,确认批量连线和手动生成流程可用。
## 画布节点搜索
- [x] 搜索结果改为紧凑媒体行,图片、视频、绘图优先显示真实缩略图,文本节点显示内容片段;素材类型、尺寸、时长、文件大小和模型按可用信息摘要展示。
- [x] 节点新增可持久化创建时间与最后编辑时间;旧画布按项目时间建立迁移基线,素材 URL/尺寸后台恢复不会误记为用户编辑。
- [x] 默认按最近编辑排序,支持节点、章节、镜头、模型和标签搜索,以及方向键选择、Enter 定位、Esc 关闭。
- [ ] 在含图片、视频、音频、绘图、文本、分镜和插件节点的真实画布验证缩略图、摘要、时间和排序;确认失效媒体能降级为类型图标。
- [ ] 在窄屏、常规桌面、浅色和深色主题验证行密度、长标题截断、时间列布局、滚动与键盘焦点。
## 画布素材批量插入与右键菜单动效
- [x] 画布素材库复用既有多选能力,一次确认后按三列网格批量创建节点并选中全部新增节点;本地素材与插件来源共用同一 payload 转换路径。
- [x] 时间线素材入口继续保持单选,图片和文本不会被误当作可直接入轨媒体。
- [x] 右键主菜单、添加节点子菜单、菜单项、图标与箭头已移除位移和缩放动画,只保留淡入、颜色变化与 Spotlight 光影跟随;专项测试、TypeScript 检查与生产构建通过。
- [ ] 在画布空白处右键后缓慢移动光标经过各菜单项,确认菜单、文字、图标和箭头位置稳定,光影仍跟随光标,主菜单与子菜单打开时不跳动。
- [ ] 从画布工具栏和右键菜单分别打开素材库,混选图片、视频、音频、文本及插件来源素材,确认一次插入全部节点、顺序稳定、节点不重叠且全部保持选中。
- [ ] 从时间线打开素材库,确认仍只能单选;音视频可直接入轨,图片或文本会保留弹窗并显示明确错误。
## 画布本机 Agent 连接教程
- [x] 未连接、连接中和连接失败时,Agent 对话正文由连接教程替代;连接成功后自动恢复原聊天或历史区域,不清空消息和线程状态。
- [x] 教程按 macOS/Linux 与 Windows 生成安装、构建和启动命令,并将当前网页 Origin 写入 `FRAMEFIELD_TRUSTED_WEB_ORIGINS`;命令生成专项测试、前端类型检查与生产构建通过。
- [x] 页面明确区分网页侧边栏 Codex、外部 Codex/Claude Code MCP 与尚未验证的 Hermes/WorkBuddy,不再把 Codex 插件误写成本机侧边栏前置条件。
- [x] 画布全局 `Cmd/Ctrl+C` 在存在真实文字选区时交还浏览器处理,不再把 Agent 消息、日志或 Markdown 文本复制误判成节点复制;快捷键边界专项测试通过。
- [ ] 在 Windows、macOS 和 Linux 分别复制并执行教程命令,确认 Runtime 能连接当前线上 Origin,平台自动识别和手动切换均正确。
- [ ] 在未连接、自动重试、Origin 未授权、连接成功和运行中断后重连状态下验证教程与对话区域切换;确认原消息、历史会话和待确认工具调用不丢失。
- [ ] 在 360px 窄面板、常规宽度、浅色和深色主题下确认命令块可横向滚动、复制按钮可见、教程不遮挡画布。
- [ ] 在 Agent 回复、运行日志、代码块和普通 Markdown 中分别框选文字后使用右键复制及 `Cmd/Ctrl+C`,确认系统剪贴板内容正确;无文字选区时 `Cmd/Ctrl+C` 仍复制所选画布节点。
## 画布复制粘贴命名
- [x] 节点首次复制粘贴使用“原名称_copy1”,后续按当前画布已有最大序号递增。
- [x] 复制已有 `_copyN` 副本时回到原始名称计算,避免生成 `_copy1_copy1`;旧版空格 `Copy` 后缀已有兼容测试。
- [ ] 在画布中连续粘贴单个节点、多个同名节点和包含子节点的背板,确认名称依次递增且节点关系不变。
## 画布媒体下载文件名
- [x] 图片、视频和音频下载统一使用“画布名_节点名_yyyyMMdd.扩展名”,中文名称和跨平台非法字符已有专项测试覆盖。
- [x] 扩展名优先按媒体 MIME 类型判断,并兼容远程 URL 后缀;JPEG、WebM 和 MOV 已有专项测试覆盖。
- [x] 前端 TypeScript 检查与生产构建通过。
- [ ] 在浏览器中分别下载本地上传、生成结果、LibTV 导入和 TapNow 导入的图片与视频,确认文件名、日期和实际媒体格式一致。
- [ ] 在同一天重复下载同名节点,确认浏览器的重名处理不会覆盖用户已有文件。
## 创作输入区参考内容管理
- [x] 自动化覆盖首个、中间和末尾参考内容按稳定 ID 独立删除,且删除后其余顺序保持不变。
- [x] 折叠态提供明确的“查看全部”入口,展开态提供图片、视频、音频、文件筛选、清空全部和收起入口。
- [x] 在桌面浏览器验证上方“参考内容”打开素材选择、折叠堆叠态中间卡片删除、展开态任意卡片删除、筛选、拖动排序和收起。
- [ ] 在真实登录数据下验证“清空全部素材”同步移除全部附件引用,不影响技能引用和素材库原始文件。
- [ ] 在触屏及窄窗口验证删除按钮无需悬停也可见,素材轨道可横向浏览且不会遮挡提示词和底部控制区。
- [ ] 在创作首页选择图片或视频生成并修改画幅、质量、时长或生成数量后切换到其他工作区再返回,确认上次的创作类型和各自参数仍保留;切换到不支持某个已保存参数的模型时,确认该参数仅回退为当前模型默认值;生成结果点击“添加到画布”后确认仍能按现有交接流程进入画布。
## 首页生成图片预览交互
- [x] 首页图片预览改为与画布共用 `CanvasImagePreview`,移除首页独立的 `scale/offset` 和拖拽边界计算;前端 TypeScript 检查与生产构建通过。
- [ ] 在首页生成结果、参考图片、故事板图片和画布图片节点中分别打开预览,确认遮罩、移动、滚轮缩放、缩放范围、关闭和再次打开后的初始状态一致;本次尚未完成真实浏览器交互验收。
- [ ] 在首页提示词输入框中分别粘贴截图、从网页复制的图片和带文字的剪贴板内容,确认图片自动加入参考内容、普通文字仍能正常粘贴,超出当前模型参考数量上限时提示明确且不会重复添加。
## Agnes Video 2.5 JSON 协议
- [x] 前端专项测试确认 Agnes 创建请求使用 `application/json`,不再发送 `input_reference[]`、`resolution_name`、`preset` 或像素型 `size`。
- [x] 后端专项测试确认内置 `host:agnes-video` 插件直接进入 Agnes JSON 协议执行器,不再回退到 OpenAI 风格 multipart;旧渠道能力读取时会收紧为官方 4–12 秒和 720P/960P/2K 档位。
- [x] Agnes 插件升级到 `1.2.0`:公共层像素画幅(如 `1280x720`)只转换为 `aspect_ratio: "16:9"`,公共层分辨率(如 `720`/`720p`)只转换为 `size: "720P"`,不再把两类字段混用。
- [x] 后端专项测试确认自定义渠道和系统渠道均允许官方 `/agnesapi?video_id=...&model_name=...` 轮询,并将该路径转发到 Agnes 主机根路径。
- [x] Agnes 完成态兼容 2.5 的 `metadata.url` 与 V2.0 的顶层 `url`;前端 provider 和后端协议专项测试均已覆盖。
- [ ] 使用真实 Agnes API Key 分别验证文生视频、单张首帧、三张图片 reference、视频/音频 reference;确认 `metadata.url` 可播放并且失败信息可见。
- [ ] 使用 Agnes Video V2.0 完成一次真实任务,确认顶层 `url` 能进入视频资源保存流程,不再报“没有 metadata.url”。
- [ ] 在系统渠道中验证 4 秒与 12 秒边界、720P/960P/2K、横竖画幅,以及 2.5 Flash 的 720P/最多 5 图/不支持视频限制。
## 画布生成按钮价格
- [x] 系统渠道价格按当前 operation、分辨率、时长、图片数量、质量和画幅匹配价格档,并按图片数量或视频秒数计算本次积分;逻辑前台模型继续使用后端报价。
- [x] 画布生成按钮改为价格与圆形生成操作一体式胶囊,保留完整无障碍标签;价格匹配专项测试与前端生产构建通过。
- [ ] 在画布中分别选择按次图片模型、按秒视频模型和前台逻辑模型,确认修改数量、时长、分辨率和参考素材后价格立即更新且与实际账单一致。
- [ ] 在浅色/深色主题及生成中、禁用状态下确认胶囊价格可读、圆形操作区清晰且不挤压模型与参数控件。
## 系统渠道模型批量删除
- [x] 管理员可勾选最多 100 个渠道模型并一次删除;任一模型仍被活动线路或进行中任务引用时整批拒绝,不产生部分删除。
- [x] 合并补修将兼容 `models_json` 的重建收进删除事务,并由 repository 在取得渠道写锁后读取当前启用模型;模型保存后的目录同步也复用同一锁定入口,避免并发管理员操作用事务外旧快照覆盖较新的模型目录。
- [x] 后端批量删除与引用拒绝专项测试、前端管理页回归测试和格式检查通过。
- [ ] 在 PostgreSQL 测试环境由两个管理员并发执行模型新增、启停和批量删除,确认 `channel_models` 与渠道 `models_json` 最终一致,删除失败时列表不发生部分变化。
## 系统渠道默认积分价格
- [x] 新建渠道模型默认使用“所有规格统一价格”,管理员只需填写一次积分;1K/2K/4K、画幅和生成方式差异定价收进可选的“按规格定价”。
- [x] 系统渠道直连、前台逻辑模型按渠道计价和失败切换线路均按任务实际规格匹配价格档;缺失价格档 ID 不再被误转成 `"<nil>"`。
- [x] 后端全量测试、价格表单专项测试和前端生产构建通过。
- [ ] 在 `/admin/channels` 新建图片和视频模型,仅填写统一价格后分别生成不同质量、尺寸、分辨率和时长,确认都命中默认价格。
- [ ] 在默认价格之外新增一个 2K 或指定分辨率价格,确认精确规格优先、其他规格继续使用默认价格;关闭“可供用户使用”后该档不再参与匹配。
## 系统渠道模型 Logo
- [x] 后端保存系统渠道模型 Logo,并通过脱敏模型目录下发;前端类型检查与生产构建通过。
- [ ] 在 `/admin/channels` 的模型管理中新增和编辑模型,确认 Logo 可选择、清除并在列表中立即更新。
- [ ] 关闭“前台模型”功能后刷新创作端,确认模型选择器显示系统渠道模型配置的 Logo,浅色和深色主题下均清晰可见。
## 提示词位置型资源引用与缩略图
提示词中的画布连接使用 `@图片N`、`@视频N`、`@音频N`、`@文本N` 等位置型槽位,不再把节点 ID 写入提示词;创作页附件对用户仍显示同类编号,但内部使用稳定附件身份,避免删除中间项后引用错位。以下场景仍需要在浏览器中由用户确认:
- [x] 29 项提示词引用专项测试、TypeScript 检查与生产构建通过。
- [x] 旧 `@[node:节点ID]` 仅做读取迁移;新写入、配置组装、故事板物化、Agent 建图和快捷生成均只生成位置型引用。
- [x] 图片、视频、音频、文本和角色分别独立计数;生成时按当前连线顺序解析槽位,删除连线不再删除提示词。
- [x] 只有 `storageKey` 的图片/视频引用会异步解析预览地址;生成中按钮使用节点强调色与可见旋转动画。
- [ ] 在画布中连接图片 A 并写入 `@图片1`,删除 A 的连线后连接图片 B,确认提示词不变、缩略图切换到 B、生成请求使用 B。
- [ ] 混合连接两张图片、一段音频和一段文本,确认标签依次为 `@图片1`、`@音频1`、`@图片2`、`@文本1`,调整不同类型的连线不会串号。
- [ ] 打开包含旧 `@[node:...]` 的画布节点,确认面板自动迁移成可见位置标签,保存和后续编辑不再出现节点 ID。
- [ ] 使用只有 `storageKey`、没有 `content` 的本地图片和服务端资源图片,确认顶部参考栏、行内引用和放大预览均能显示。
- [ ] 点击生成,确认按钮保持节点强调色并显示连续旋转动画,不再出现纯红色空圆。
- [ ] 在 `/create` 添加至少三张参考图,并在提示词中重复引用 `@图片2`;拖动参考内容轨道中的另一张图片覆盖行内缩略图,确认提示词文本保持不变且所有 `@图片2` 缩略图同步刷新。
- [ ] 从本机拖入图片覆盖行内缩略图,确认上传期间不能发送,上传成功后原编号保持,上传失败时旧图和旧提示词不变。
- [ ] 分别测试图片模式、视频模式和文本模式,确认只有图片引用可成为替换目标,视频、音频、文件和技能引用不会误触发。
- [ ] 替换一个已经位于参考轨道中的图片,确认附件不会重复,其他引用仍指向正确素材。
- [ ] 确认浅色/深色主题、窄窗口和同一图片多次出现时,拖入高亮与“替换”遮罩清晰且不遮挡相邻文字。
## 已有图片节点图生图引用
- [x] 已有图片节点显式使用 `@图片1` 时会把节点自身作为参考图提交;未显式引用时仍保持文生图语义。
- [x] 无法解析的 `@图片N`、`@视频N`、`@音频N` 等画布引用会在提交前报错,不再静默丢失素材。
- [x] 后端专项测试确认 OpenAI Images 图生图使用 `POST /v1/images/edits` 和 `multipart/form-data`,并携带图片文件、模型、提示词、尺寸及响应格式。
- [ ] 在线上画布打开一张已有图片,输入“将 `@图片1` 图片变清晰”并生成,确认任务日志包含参考图、请求路径为 `/v1/images/edits`、Content-Type 为 `multipart/form-data`。
- [ ] 在同一图片节点移除 `@图片1` 后再次生成,确认请求恢复为 `/v1/images/generations`,不会隐式携带旧图片。
## 画布图片与音频组合的视频模型选择
- [x] 图片或角色与音频组合时继续按 `image_to_video` 匹配,音频仅作为附加参考;纯音频仍按 `audio_to_video`,包含参考视频时仍按 `reference_to_video`。
- [x] 模型选择专项测试覆盖“支持图生视频且允许参考音频”的模型,不再错误提示“不支持全模态参考”。
- [ ] 在线上画布只连接一张图片和一段音频,确认支持图生视频与参考音频的视频模型可选择,并能正常提交生成任务。
- [ ] 分别验证纯音频、图片加音频、视频加音频三种输入,确认模型筛选和任务 operation 依次为 `audio_to_video`、`image_to_video`、`reference_to_video`。
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
## 工作区、Agent、画布复制、模型配置与创作附件修复
- [x] 前端 TypeScript 检查与生产构建通过;提示词引用、创作附件和侧栏主题专项测试通过。
- [x] 空间工作区与普通页面的左侧菜单统一使用 `--workspace-navigation`,不再随路由切换表面色。
- [x] 本机 Agent 输入框改为 Enter 换行、Cmd/Ctrl+Enter 发送;本轮模型失败会保留原请求快照并提供手动重试,不重复插入用户消息。
- [x] 文本节点展示区支持框选复制,复制文本在 Clipboard API 不可用时使用兼容回退;图片节点右键增加“复制图片”,非 PNG 图片会转为 PNG 后写入系统剪贴板。
- [x] 后台模型配置的章节标题与内容、价格档匹配条件与计费状态均改为上下结构。
- [x] 创作页附件删除按钮隔离 Reorder 拖拽事件;附件引用使用稳定 token,删除第三张不会让第四、第五张引用串位。
- [ ] 在普通列表页、创作页、空间工作区之间切换,确认左侧菜单明暗色调始终一致,折叠与移动端展开状态无闪色。
- [ ] 在本机 Agent 输入多行文本,确认 Enter 只换行、Cmd/Ctrl+Enter 和发送按钮正常提交;模拟模型中途失败后点击“重试本轮”,确认沿用原会话、文本、图片和技能且不重复用户气泡。
- [ ] 在画布文本节点中拖选部分文字并复制;分别右键 PNG、JPEG、服务端 `storageKey` 图片执行“复制图片”,确认可粘贴到系统应用。
- [ ] 在后台打开文本、图片、视频模型配置,确认所有章节为纵向阅读顺序,宽屏和窄屏都没有左右主从栏或价格档竖分隔线。
- [ ] 在创作页上传 5 张参考图,展开后依次删除第 3、5、1 张,确认每张都能就地删除,轨道不触发拖拽,提示词中的其余引用仍指向原附件。
## Agnes AI 官方视频协议
- [x] Agnes 协议已启用,覆盖 `agnes-video-v2.0`、`agnes-video-2.5`、`agnes-video-2.5-flash` 的官方创建字段、状态、失败信息和 `metadata.url` 结果解析。
- [x] 轮询使用同一 Base URL 主机的根路径 `/agnesapi`,专项测试确认 `https://apihub.agnes-ai.com/v1` 不会被拼成错误的 `/v1/agnesapi`。
- [x] Flash 的 720P、最多 5 张图片、禁止参考视频规则已在请求前强校验;协议与 provider service 专项测试通过。
- [ ] 使用真实 Agnes API Key 分别完成 V2.0 文生视频、单图生视频、2.5 关键帧、2.5 reference、2.5 Flash 的创建与轮询冒烟。
- [ ] 验证真实失败任务能显示官方 `error.message`,429/5xx 保持现有上游错误语义,生成成功后视频能进入影策资源保存流程。
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
## 插件分层管理
- [ ] 管理员在 `/admin/plugins` 停用官方应用插件后,普通用户的有效状态和新请求同时被阻止;重新开放后保留原个人启用选择。
- [ ] 两个普通用户分别启用和停用同一官方应用插件,确认状态、Eagle 配置和工作流入口互不串号。
- [ ] 普通用户不能切换系统协议或管理员上传插件;关闭“向普通用户显示系统插件”后,两类插件均不可见。
- [ ] 用户停用 RunningHub / ComfyUI 后不能提交新任务,但已接收任务、Bridge 轮询、心跳和结果回传可以完成。
- [ ] 管理员上传、停用、启用和卸载自定义插件后,插件包、平台状态、用户状态与审计日志一致。
- [ ] 验证 `/plugins` 与 `/admin/plugins` 的浅色/深色主题、窄屏、空态、筛选、上传弹窗和开关失败回滚。
## RunningHub 与 ComfyUI Bridge 工作流
- [x] 后端全量测试、前端类型检查、Canvas Agent 构建和原生 Bridge Go 测试通过。
- [x] 工作流插件停用状态覆盖设置入口、画布创建、配置面板、任务创建、管理 API 和 worker 执行校验。
- [x] 覆盖后端重启后请求领取、结果先落库再恢复、原请求 ID 幂等复用,以及 RunningHub API Key 不进入 URL 的自动化测试。
- [ ] 使用真实 RunningHub Workflow 和 App 分别验证参数发现、图片/视频/音频输入映射、提交、轮询、取消和结果下载。
- [ ] 使用真实 ComfyUI API 工作流验证 Bridge 注册、心跳、领取、完成、取消和大文件结果回传。
- [ ] 在 Bridge 执行中重启后端,确认结果回传成功且任务不重复执行;在请求未领取时重启后端,确认原请求继续投递。
- [ ] 验证浅色/深色主题、窄屏设置页、画布工作流节点和任务中心状态展示。
## AI 提示词优化器
当前代码和生产构建已完成,但以下场景仍需要在真实配置和不同窗口尺寸下由用户确认:
- [x] `web` 前端 TypeScript 检查与生产构建通过。
- [x] 优化面板打开、关闭不再等待 Popover 入场或退出动效。
- [ ] 在 `/create` 中分别测试图片和视频模式的打开、发送、取消、失败重试和关闭。
- [ ] 在图片、视频画布节点中测试优化入口、结果采用和原提示词回填。
- [ ] 逐项测试五种优化方式,确认模式切换不会丢失当前输入。
- [ ] 测试优化模型切换,并确认目标生成模型与优化模型显示和请求职责分离。
- [ ] 测试已连接图片、文本参考,以及“结合参考”没有参考内容时的提示和禁用状态。
- [ ] 测试长提示词、长优化结果、滚动、拖动和四边缩放;确认窗口接近边缘时不会跑出视口。
- [ ] 测试浅色/深色主题和窄窗口布局,确认按钮、输入框和结果文本仍可读且可操作。
- [ ] 使用自定义文本渠道实际发送一次,确认渠道、模型和权限配置正确时不会误报“必须指定系统渠道和模型”。
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
## 肖像可识别性排查画布插件
首版画布节点、本机签名运行时、本地 ONNX 预检、百度候选链路、模型作业协调器和四种报告导出已接入;以下边界仍需要真实环境确认:
- [x] Agent TypeScript 构建、Web TypeScript 检查通过。
- [x] 本机任务持久化、幂等、取消/重试清理、候选 URL 安全校验和报告转义测试通过。
- [x] Markdown、无脚本 HTML、DOCX 共用检测结论、本地预检、六维特征、修改建议和失败候选说明;报告结构回归测试通过。
- [ ] 使用固定真人/虚拟人图片建立 Python 原实现与 TS 实现的检测框、embedding 和风险金标。
- [ ] 在安装 `det_10g.onnx`、`w600k_r50.onnx` 的 Windows 环境完成直接比对和本地仅模式验证。
- [ ] 在系统 Chrome/Edge 可用环境完成百度识图、验证码、页面结构变化和候选下载失败验证。
- [ ] 配置支持双图输入的项目视觉模型,验证 Path A、Path B、模型租约、并发、取消和页面重开恢复。
- [ ] 浏览器确认插件首次关闭、旧节点只读、明暗主题、窄屏、键盘焦点和候选添加到画布。
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
## 画布节点自动整理
自动整理入口和布局提交逻辑已完成,以下场景仍需要在实际画布中手工确认:
- [x] `web` 前端 TypeScript 检查与生产构建通过。
- [x] 画布底部视图控制中显示“自动整理节点”按钮。
- [x] 布局纯函数专项测试覆盖有连线、无连线、选中子集、不同尺寸、锁定节点,以及文本/图片/视频/音频四类泳道。
- [ ] 无选中节点时,确认多个顶层节点横向保持连线层级,纵向按文本、图片、视频、音频分区;无连线时同类节点各自在独立网格中排列。
- [ ] 选中节点时,确认只移动选中的可移动节点,未选中节点保持原位。
- [ ] 确认锁定节点、容器节点和折叠批次隐藏子节点不会被移动。
- [ ] 点击“撤销”确认可以恢复整理前的位置,并确认刷新画布后布局仍能保存。
- [ ] 在浅色/深色主题、窄窗口和节点数量较多的画布中确认底部按钮可见、可操作且不遮挡主要内容。
## 分镜脚本资产关联
1. 在同一画布放入角色、场景图片、参考视频和音频后生成分镜,确认各镜头只关联模型返回的真实画布资产,不出现失效或编造 ID。
2. 分镜卡片按“序号、时长、视频提示词、台词/旁白、关联资产”五列显示;图片、视频和音频缩略图可点击并打开对应预览。
3. 从单个镜头及批量入口创建视频节点,确认脚本行输出和每个关联资产都自动连到视频节点,重复同步不会产生重复连线。
4. 打开视频节点提示词,确认关联资产以标准 `@资产` 缩略图展示,生成请求能解析图片、视频和音频引用。
5. 修改镜头资产关联后再次同步,确认已移除的托管资产连线被清理,而用户手工创建的普通连线仍保留。
## 零价免费模型
1. 管理员设置启用系统渠道模型的按次价格为 `0` 后,普通用户刷新设置即可看到并成功创建任务。
2. 前台逻辑模型使用统一按次价格 `0` 后,普通用户可见并能成功创建任务。
3. 零价任务完成后,账单状态为已结算,用户可用积分和预留积分均不变化。
4. 零价 Token 任务在上游未返回 usage 时仍能以 `0` 结算;正价 Token 任务继续依赖 usage 结算。
5. 管理端提交任一负价格仍会被拒绝。
6. 未勾选价格已配置的默认零价模型仍不会向普通用户公开。
## 用户诊断包导出
当前实现已完成前后端链路、脱敏和设置页 UI,但仍需要真实环境验证下载链路和不同错误场景:
- [x] `web` 前端 TypeScript 检查与生产构建通过。
- [x] 诊断服务已覆盖脱敏、ZIP 结构和跨用户任务拒绝测试。
- [x] 设置页桌面布局和 680px 窄屏布局已完成浏览器预览。
- [ ] 登录后从设置页导出成功,确认 ZIP、诊断编号和文件名均可用。
- [ ] 从失败任务详情进入诊断页,确认 `taskId`、`projectId` 和对应日志范围正确带入。
- [ ] 后端未重启或接口未部署时,确认前端能显示可操作的错误提示,而不是原始 Blob/502 文案。
- [ ] 验证浅色/深色主题、15 分钟到 24 小时范围、长问题描述和导出中的 loading 状态。
## Eagle 素材库
- [x] 增加素材无文件夹、无标签时的空集合归一化单元测试。
- [ ] 使用真实 Eagle 服务验证无文件夹素材、无标签素材、文件夹路径和预览引用。
## Windows 本地开发
- [ ] 在一台依赖已安装和一台全新工作区分别运行 `.\scripts\start-local.ps1`。
- [ ] 验证端口被占用时脚本会安全退出,且不会关闭已有进程或使用正式开发数据目录。
## 画布生成结果资源恢复
- [x] `web` 前端 TypeScript 检查与生产构建通过。
- [ ] 模拟图片生成任务已成功但结果下载失败,确认节点显示“重新加载资源”和“重新生成”两个按钮。
- [ ] 点击“重新加载资源”,确认只重新查询并消费原任务结果,不创建新的生成任务或重复扣费。
- [ ] 模拟视频结果落盘/OSS 上传失败后再次加载,确认恢复成功会清除错误状态并保留原任务信息。
- [ ] 点击“重新生成”,确认仍走原有生成重试流程;普通生成失败仍只显示“重新生成”。
## 数据同步与资源删除重构
- [x] 前端远端基线、登录 hydrated 屏障、上传并发编辑和删除持久化回归测试通过。
- [x] Generation 失败只回滚生成字段,保留同节点并发标题编辑;重复 Generation 仍按明确 effect key 幂等。
- [x] 资源引用识别改为显式字段合同,未登记的字段名和自由文本不会被推断为资源引用。
- [x] 后端素材删除改为数据库事务 + `resource_deletion_jobs` Outbox,数据库失败时物理文件保持不动。
- [x] Outbox Worker 本地文件删除、对象不存在幂等成功和失败退避测试通过。
- [x] 画布上传、媒体工具产物、导演台输出、ZIP 导入和时间线直连媒体统一先写入素材库;远端同步按“素材后端确认后再保存画布”的顺序执行。
- [x] 后端保存画布时校验 `assetId`、资源归属、就绪状态和素材资源一致性;素材更新、替换与删除不能破坏已有画布引用。
- [x] 登录会修复历史画布缺失的素材记录与 `assetId`;后台按状态保留期回收无任何业务引用的资源,并通过删除 Outbox 清理物理对象。
- [x] 账号容量只统计 `ready` 资源并按物理对象去重,上传中、失败记录和重复 Resource 行不会形成虚假容量占用。
- [ ] 在个人画布分别上传图片、视频、音频和时间线媒体,刷新后确认 `/assets` 均可见对应素材、画布 `assetId` 不丢失,账号容量只增长一次。
- [ ] 使用修复前已有“画布存在资源但素材缺失”的账号登录,确认素材自动补建并同步;再准备超过 24 小时且无任何引用的孤儿对象,确认后台最终删除资源记录和物理对象、容量同步下降。
- [ ] 模拟资源上传成功后立即断网,确认画布结构不会以缺失素材的状态写入服务端;恢复网络后自动重试完成素材与画布同步。
- [ ] 使用真实 OSS 配置验证对象删除成功、权限失败后的退避重试和多实例租约接管。
- [ ] 浏览器真实环境验证登录快照慢响应期间工作区保持不可写,以及删除后立即刷新不复活素材。
## S3 兼容存储
- [x] 后端 S3 单次上传、Range 读取、预签名地址、Session Token、幂等删除、配置版本和迁移清单自动化测试通过。
- [x] 前端 S3 预设、关键字段重测判断、默认 `open-ai-canvas` 路径前缀、TypeScript 检查和生产构建通过。
- [x] 平台或用户从未保存 OSS 配置时,后端统一返回标准化默认值(含 `s3Preset: custom`);缺省读取回归测试与后端全量测试通过。
- [x] 腾讯云 COS 连接测试固定通过服务端 Endpoint 执行写入、Range 读取和删除,不再误走可选 CDN;COS 鉴权失败会返回可操作且不泄露上游详情的提示,专项回归测试通过。
- [ ] 使用全新数据库登录管理员并打开 `/admin/settings/storage`,确认页面直接显示服务器本地存储且可切换阿里云 OSS、腾讯云 COS、七牛云 Kodo 和 S3 兼容存储。
- [ ] 使用真实腾讯云 COS 配置测试成功与错误 SecretKey 两种场景;同时填写 CDN 加速域名时确认连接测试仍走 COS Endpoint,错误凭据提示为鉴权失败而非“系统处理失败”。
- [ ] 分别使用 AWS S3、Cloudflare R2、Backblaze B2 和 RustFS 完成写入、Range 读取、删除及历史资源恢复验证。
- [ ] 验证 Path Style 开启时强制路径寻址,关闭时 AWS 使用虚拟主机寻址、其他自定义 Endpoint 自动使用路径寻址。
- [ ] 验证平台切换到本机后只影响新上传,历史 S3 资源仍可读取和删除;个人 S3 停用后正确回退平台存储。
- [ ] 验证同一 S3 修改 Bucket、Endpoint、Region、前缀或 Path Style 时,留空 Secret 和 Session Token 可继续复用,并要求重新连接测试。
- [ ] 使用私网 RustFS 验证浏览器同源代理,以及提交给模型上游时转换为影策公网 HTTPS 短时地址;未配置公网 HTTPS 地址时应明确拒绝。
- [ ] 验证管理员关闭个人 S3 后不再接受个人新上传,但已有个人 S3 资源仍可读取和删除。
## 3D 导演台时间轴关键帧删除与快捷键
关键帧删除入口、全局快捷键和交互控件守卫已接入,以下场景仍需要在浏览器中由用户确认:
- [x] `web` TypeScript 检查、导演台专项测试与全量前端测试通过。
- [x] 关键帧删除覆盖对象 transform、对象骨骼和摄影机三类轨道;未命中时返回同一场景引用,不记历史、不产生修订。
- [x] 时间轴关键帧为可 Tab 聚焦的真实 button;点击或 Enter/Space 只选择并定位播放头,Delete/Backspace 或顶栏删除按钮才删除,避免普通点击误删。
- [x] 所选关键帧可切换保持、线性、平滑缓动;缓动同时作用于对象/摄影机 Transform 与骨骼旋转插值,旧数据默认线性。
- [x] 切换镜头/摄影机或外部删除关键帧后会清除陈旧选择,顶栏缓动和删除控件不会继续修改不可见轨道。
- [x] 全局快捷键在输入框、按钮、链接、role 型控件、可编辑区域及其子元素内一律不解析;仅在动作真正执行时 `preventDefault`。
- [x] 鼠标点选场景对象、dock 工具、模式按钮、快速添加和顶栏图标按钮后会释放焦点,全局快捷键立刻可用;键盘激活(Enter/Space)保留焦点,Tab 序列不断。
- [ ] 在真实画布中记录多个关键帧后逐个删除,确认删除的是目标帧、其余帧顺序不变,且「撤销」能恢复。
- [ ] 折叠对象轨道后仅通过汇总轨删除关键帧,确认收起状态下仍可删除。
- [ ] 用键盘 Tab 走到关键帧上按 Enter/Space,确认只选择并把播放头定位到该帧;再按 Delete,确认删除的是该关键帧而不是整个对象。
- [ ] 对同一段动画依次选择保持、线性、平滑缓动,确认播放结果明显不同,撤销可恢复上一个缓动设置。
- [ ] 选中摄影机关键帧后切换到使用另一台摄影机的镜头,确认旧选择和顶栏缓动/删除控件立即消失。
- [ ] 确认浅色/深色主题下关键帧的悬停环与焦点环可见,命中区易于点中。
- [ ] 逐个验证 W/E/R、Delete/Backspace、H、Escape、Ctrl/Cmd+Z、Ctrl/Cmd+Shift+Z、Ctrl/Cmd+Y 和空格;确认在标题输入框内输入这些字符不会触发快捷键。
- [ ] 在场景列表点选一个对象后直接按 Delete,确认删除的是该对象;再点 dock 的「旋转」后按 W,确认能切回移动。
- [ ] 用键盘 Tab 走到场景对象行按 Enter 选中,确认焦点仍停在该行、可继续 Tab 到下一项。
## 3D 导演台场景模板与四模式骨架
新建场景模板和摆场/姿态/动画/摄影机四个一级模式已接入,以下场景仍需要在浏览器中由用户确认:
- [x] `web` TypeScript 检查、导演台专项测试与全量前端测试通过。
- [x] 导演台 P0 Chrome E2E 全部通过;场景 A 已同步为「默认摆场不显示时间轴与 AutoKey,切到动画模式后 AutoKey 默认关闭」。
- [x] 五个模板结构确定、每次实例 id 独立、对象 XZ 占位两两不相交,判据与 `resolveDirectorPlacement` 一致。
- [x] 空场景不含任何演员;未知模板 id 回落到空场景。
- [x] 模板不改动 `DirectorScene` 结构与 `version`;`mode` 只存在于工作台 store,不写入场景。
- [x] 离开动画模式会停止播放并关闭 Auto Key,并把渲染视图夹回当前模式允许的集合。
- [x] 动画模式会根据 Transform 关键帧绘制可见演员与摄影机的空间轨迹,包含起终点、方向和当前播放进度;隐藏演员及零长度轨迹不显示。
- [x] 播放头按镜头 FPS 而非固定 60 次/秒更新,跨过镜头末尾时保留余量;轨迹长度只在对象/摄影机内容变化时重算。
- [x] 「按运镜生成轨迹」只更新首尾关键帧,保留手工中间帧、关键帧 ID 与 easing,并提示切到动画模式继续编辑。
- [x] 截图/录制绑定开始时的场景快照;上传完成后重新核验节点与镜头,并只把预览引用合入最新场景,不用旧快照覆盖并发编辑。
- [ ] 从工具栏和画布右键菜单分别新建镜头,确认都会先弹出模板选择,且右键位置会作为新节点位置。
- [ ] 逐个使用五个模板新建镜头,确认空场景没有演员,单人/双人/走位演员数量正确,产品镜头含产品主体、背景板和侧面道具且没有演员。
- [ ] 确认双人对话两名演员面对面、走位三名演员互不重叠、产品镜头道具不穿模。
- [ ] 打开一个已保存的镜头,确认不弹模板选择、场景内容未被改写。
- [ ] 在摆场模式确认时间轴、Auto Key、记录关键帧、骨骼与姿势预设、深度/法线视图都不可见。
- [ ] 在姿态模式选中演员,确认骨骼与姿势入口出现;未选中演员时不出现;确认不会自动产生关键帧。
- [ ] 在动画模式开启 Auto Key 并开始播放,再切到其他模式,确认播放停止、Auto Key 关闭,且场景没有被继续写入关键帧。
- [ ] 在动画模式为演员和摄影机分别记录至少两枚位置不同的 Transform 关键帧,确认轨迹、起终点、方向锥和当前进度点可见;隐藏演员后其轨迹同步消失,离开动画模式后全部轨迹消失。
- [ ] 在摄影机模式确认右栏固定显示镜头/摄影机检查器,对齐视图与运镜可用,深度/法线视图可选。
- [ ] 在摄影机已有关键帧且播放头不在 0 秒时执行「摄影机对齐当前视图」,确认当前帧立即保持新机位,旧关键帧仍在且撤销可恢复。
- [ ] 在摄影机已有首尾帧和至少一枚带缓动的手工中间帧时执行「按运镜生成轨迹」,确认只更新首尾位置,中间帧、缓动与撤销历史都保留。
- [ ] 开始截图或白膜录制后切换活动镜头、删除源节点或继续编辑场景,确认旧输出被拒绝或安全合并,不写进另一项目、不复活节点、不覆盖新编辑。
- [ ] 确认模式切换不丢失草稿、撤销历史和保存状态,切换后标题与保存指示器仍正确。
- [ ] 确认浅色/深色主题下模式按钮的选中态、悬停态与焦点环可见,选中态不是主操作色。
- [ ] 在窄窗口(小于 lg 断点)确认模式切换仍可见可点击。
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
## 3D 导演台取景模式(3D/CAM/五个正交视图)
新增 `viewMode`(自由/机位/顶前后左右五个正交轴向)取景切换,独立于摆场/姿态/动画/摄影机四个一级模式;以下场景仍需要在浏览器中由用户确认:
- [x] `web` TypeScript 检查通过;`director-view-modes.test.ts`、`director-modes.test.ts`、`director-template-mode-wiring.test.ts` 专项测试通过。
- [x] 三台相机对象(自由观察、机位、正交)互相独立持有,切换 `viewMode` 只挪动视口的活动相机指针,源码层面确认不共享可变状态。
- [x] 正交轴向使用真正的 `THREE.OrthographicCamera`,取景来自场景内容包围盒,而非把透视相机换个角度伪装;取景解算与视口接线均有专项测试覆盖退化场景(空场景、非法数值)。
- [ ] 逐个切换 3D/CAM/顶视/前视/后视/左视/右视,确认画面确实是对应视角,正交视图没有透视畸变。
- [ ] 放入大比例背景板和旋转后的长道具,逐个切换正交视图,确认对象完整进入画面,不再因只按对象中心构图而裁切。
- [ ] 在自由视角环绕后切到机位或任一正交视图,再切回自由视角,确认之前的环绕位置原样恢复,没有被拉回默认机位。
- [ ] 在机位视图播放/拖动时间轴,确认摄影机运镜正确预览;切到正交视图确认环绕已锁定、拖拽无效。
- [ ] 确认取景切换器(3D/CAM/TOP/FRONT/BACK/LEFT/RIGHT 七个按钮)可键盘 Tab 到达、Enter/Space 激活,`aria-pressed` 状态正确朗读。
- [ ] 确认切换取景模式不产生新的撤销历史记录,也不触发保存/未保存提示。
- [ ] 在机位或正交视图下点击「导出预览图」「录制白膜视频」,确认导出流程仍正常完成(不因当前相机是正交投影而失败)。
- [ ] 确认浅色/深色主题下取景切换器的选中态、悬停态与焦点环可见。
- [ ] 在窄窗口(小于 lg 断点)确认取景切换器仍可见可点击,不与其他浮层重叠遮挡。
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
## 3D 导演台首次引导与窄屏属性面板
首次引导已接入真实登录用户 scope,并按 Issue #305 改为“添加演员 → 移动 → 调姿 → 轨迹 → CAM → 应用”六步;以下场景仍需要浏览器确认:
- [x] 引导进度按认证用户 ID 隔离,不回落 guest;重启入口在加载期间也可用,重置失败会重新读取原进度。
- [x] 已跳过或已结束的引导可从标题栏重新开始;最后一步使用“结束引导”中性文案,不宣称用户已经完成实际任务。
- [x] 小于 `lg` 断点时右侧属性区移动到工作区下方且可滚动,不再直接隐藏姿势与骨骼控制。
- [x] `director-onboarding.test.ts` 专项测试与 `web` TypeScript 检查通过。
- [ ] 使用两个真实账号分别推进、跳过和重启引导,确认进度互不串号;切换账号时旧读取结果不会闪现。
- [ ] 从新账号首次打开导演台,逐步完成添加演员、移动、姿态、两枚 Transform 关键帧、CAM 构图与应用,确认六步文案都指向真实可见入口。
- [ ] 在引导加载期间连续点击“重新开始引导”,再模拟 IndexedDB 写入失败与恢复,确认界面不会永久隐藏或假装推进。
- [ ] 在窄窗口检查摆场、姿态、动画、摄影机四种模式:标题栏可横向到达,底部属性面板可滚动,时间轴与引导不互相遮挡。
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
## 模型请求失败日志完整性
模型请求日志已补齐 HTTP 失败关联、错误搜索与请求前失败兜底;以下场景仍需要在管理后台由用户确认:
- [x] HTTP 非 2xx 日志同时保留节点使用的中文错误归类和上游原始错误详情。
- [x] API 调用日志关键词搜索覆盖 `errorCode` 与 `error`,可按节点中文提示、上游错误或错误码定位。
- [x] 参数校验、协议构造、路由准备等请求尚未发出的最终失败会补记 `request_not_sent`,且不保存任务输入、API Key 或请求正文。
- [x] 已有真实 HTTP 调用日志的任务不会重复补记请求前失败日志。
- [ ] 在画布分别触发一次成功请求、一次上游 400 和一次本地参数校验失败,确认 `/admin/logs` 均能看到对应记录,并可按节点错误文案搜索。
## 渠道视频分辨率枚举兼容
画布已将渠道声明的分辨率视为不透明枚举,不再把带方向或本地化后缀的值静默回退为 `720p`;以下场景仍需浏览器确认:
- [x] 前端分辨率规范化、画布选中态、价格匹配与请求映射专项测试通过。
- [x] AutoDL 插件 `1.0.2` 已改用通用 `lower` 并通过协议包测试;宿主仅保留旧 `1.0.1` 清单所需的兼容 shim。
- [x] Manifest 工作流的视频能力改为按 `parameters` 投影:只声明分辨率时不再补画幅能力,也不会继续提交旧的全局 `size`。
- [x] 同时支持分辨率和画幅的渠道按当前比例与分辨率推导只读宽高,例如 `16:9 + 720P = 1280×720`、`16:9 + 1080P = 1920×1080`、`16:9 + 4K = 3840×2160`。
- [x] `web` TypeScript 检查与生产构建通过。
- [x] 后端允许视频能力明确省略画幅,并通过全量 Go 测试;前端能力投影、尺寸计算和画布模型专项测试通过。
- [ ] 在画布选择 `480p竖`、`768p竖`、`480p横`、`768p横`,确认按钮选中态、底部摘要和重新打开后的状态一致。
- [ ] 分别提交四个枚举值,确认请求中的 `resolution` 与插件声明一致,且其他标准 `720p`、`1080p` 渠道不受影响。
- [ ] 使用仅声明 `resolution` 的 AutoDL 工作流,确认画布和创作页不显示画幅/尺寸,生成请求不包含无意义的 `aspectRatio`。
- [ ] 使用同时声明画幅与分辨率的渠道,依次切换 `16:9` 下的 720P、1080P、4K 及 `9:16`,确认宽高展示随选择即时更新且请求仍按渠道协议发送比例与分辨率。
## 画布生成重复提交保护
画布生成入口已增加节点级同步提交锁,并为手动生成记录“提示词、模型、参数、参考素材”指纹;以下场景仍需浏览器确认:
- [x] 连续三次调用同一节点只执行一次的专项测试通过;提示词、模型、参数或参考素材变化会产生不同指纹。
- [x] `web` TypeScript 检查、21 个相关专项测试与生产构建通过。
- [ ] 在同一节点快速连续点击三次生成,确认任务中心只新增一个任务,且不会重复扣除积分。
- [ ] 首次任务完成后不修改提示词、模型、参数和参考素材,再次点击生成,确认出现“再次生成相同内容”二次确认;取消不创建任务,确认后只创建一个新任务。
- [ ] 分别修改提示词、模型、分辨率/时长和参考素材后生成,确认视为新内容,不弹重复确认。
- [ ] 执行分镜批量生成、Agent 自动生成和显式重试,确认不会被手动重复确认弹窗阻塞。
## 画布快捷键中心
画布搜索已统一为 `Ctrl/Cmd + F`,专注模式调整为 `Shift + Ctrl/Cmd + F`;原快捷键长列表已改为可搜索、可分类的快捷键中心。以下场景仍需浏览器确认:
- [x] 快捷键目录筛选专项测试、`web` TypeScript 检查与生产构建通过。
- [ ] 在 Windows 和 macOS 分别按 `Ctrl/Cmd + F`,确认打开画布节点搜索且不会触发浏览器页内查找。
- [ ] 按 `Shift + Ctrl/Cmd + F`,确认进入或退出专注模式;按 `Ctrl/Cmd + K` 不再打开节点搜索,并保留工作区命令面板入口。
- [ ] 打开快捷键中心,分别搜索“粘贴”“缩放”和“Alt L”,确认结果与分类计数正确,清空搜索后恢复完整列表。
- [ ] 确认浅色/深色主题下标题、分类选中态、搜索焦点环、键帽和滚动区域清晰可见。
- [ ] 在窄窗口确认分类可横向滚动、快捷键列表改为单列,弹窗不超出视口且长内容仅在列表区滚动。
## 管理后台在线更新
管理后台已新增“系统配置 → 系统更新”,并通过宿主机 Host Updater 执行强制备份、迁移、切换、健康验证和失败回退;以下场景需要在真实 Linux Docker Compose 服务器完成最终确认:
- [x] 后端 Host Updater、Unix Socket 客户端、管理员 API、版本比较和状态持久化相关测试通过。
- [x] 前端 TypeScript 检查、生产构建、侧栏入口、更新器未安装空态、更新器连接态、GitHub Release 日志、浅色/深色主题浏览器验收通过。
- [x] Compose 配置校验、systemd 安装脚本语法和 Release 二进制构建命令通过。
- [ ] 在生产更新前生成 PostgreSQL + 数据目录 ZIP,确认 `.partial` 不会被当作有效备份,最终 ZIP 可打开且 SHA-256、元数据、`database.dump`、`backend-data.tar` 均有效。
- [ ] 从首个在线更新版本升级到包含 schema v2 的测试版本,确认旧服务先 drain,迁移服务独占执行,目标 build version 和 schema version 在稳定窗口内一致。
- [ ] 人为让目标版本健康检查失败,确认自动恢复旧 Compose、旧镜像和数据库备份;旧版本因 schema 过高拒绝启动时,必须在数据库恢复完成后才能重新健康。
- [ ] 在拉取镜像、创建备份、迁移、启动和健康检查阶段分别模拟失败,确认停服前失败不会改变运行版本,停服后失败进入回退,回退失败明确显示“需人工介入”。
- [ ] 更新期间刷新页面、关闭浏览器和 Backend 短暂不可用,确认宿主机操作不中断,恢复后日志与最终状态完整。
## 大型画布媒体节点性能
大型画布已修复 LibTV 图片强制并发加载、缩略图反向覆盖原始尺寸、节点操作 Context 失稳和小范围平移频繁卸载媒体节点的问题;以下场景仍需使用真实大型画布确认:
- [x] 前端专项测试覆盖 LibTV 延迟加载、尺寸回写保护、节点渲染滞回、Context 稳定引用,以及缩放/平移期间不得隐藏节点壳;TypeScript 检查与生产构建通过。
- [ ] 导入包含数百个图片、视频节点的 LibTV 画布,确认初次打开不会同时加载全部图片,平移和反向平移时已显示图片不再反复闪烁或重新解码。
- [ ] 在自动、性能、画质三种模式下分别缩放和平移,确认操作期间视口内节点持续可见,远离视口的节点仍会卸载,选中、拖动、连线和节点尺寸保持正确。
- [ ] 使用浏览器 Performance 与 Network 面板记录导入前后数据,确认平移期间主线程长任务、图片并发请求和节点重复渲染明显下降。
## 大型画布进入详情性能
画布列表进入详情已增加详情模块预取、点击即时反馈和可中断的数据恢复渲染;节点引用改为一次建图索引,列表封面结果按节点数组缓存,避免延迟随节点数快速放大。以下场景仍需使用真实大型画布确认:
- [x] 专项测试覆盖详情模块预取、点击反馈时序、批量引用索引语义;TypeScript 检查与生产构建通过。
- [ ] 首次打开应用后悬停并点击包含数百节点的 LibTV 画布,确认卡片立即出现“正在打开”,随后进入详情加载态,不再数秒无反馈。
- [ ] 分别使用空画布、100 节点和数百节点画布记录从点击到详情可见的耗时,确认增长接近线性且列表返回后再次进入更快。
## 画布保存被历史素材阻断
- [x] 素材远端同步会在发送副本中移除超过后端约束的历史 `primaryVersionId`,合法项目资产版本 UUID 原样保留,本地素材对象不被修改。
- [x] 后端 36 字符强校验保持不变;前端专项测试覆盖非法历史值清理、合法 UUID 保留与本地对象不可变。
- [ ] 使用曾出现“素材主版本 ID 不能超过 36 个字符”的账号编辑并保存画布,确认云端同步成功,刷新后画布布局仍然存在。
## 独立素材共享文件删除
- [x] 素材删除不再把另一条素材共用同一资源文件误判为素材实体引用;删除当前素材时保留其他素材仍使用的资源记录与物理文件。
- [x] 项目、镜头等真实业务引用仍会阻止素材删除;后端专项测试覆盖两个独立素材共享同一资源的删除场景。
- [ ] 在素材库删除曾由同一生成结果产生的重复素材,确认当前素材删除成功,其他素材仍可预览和下载;实际仍关联项目或镜头的素材继续显示引用来源。
## 管理后台存储资源
管理后台已新增资源列表、筛选、去重容量统计、预览下载和安全批量删除;以下场景仍需使用真实资源数据确认:
- [x] 后端专项测试覆盖管理员权限、筛选校验、共享对象去重统计、历史本地资源预览、部分删除成功、公告/画布引用阻止、共享物理对象保留、审计失败事务回滚和 100 项上限。
- [x] `web` TypeScript 检查通过;只读阶段与删除阶段均复用同一资源页面和统一 API 客户端。
- [ ] 在 `/admin/resources` 分别按资源 ID、对象路径、用户 ID、类型、状态和存储类型筛选,确认分页与筛选 chip 一致。
- [ ] 预览并下载本地、阿里云 OSS、腾讯云 COS、七牛云 Kodo 和 S3 的图片、视频、音频与普通文件,确认 Range、登录 Cookie 和错误提示正确。
- [ ] 选择一个仍被公告、素材、画布、项目、风格、工作流或镜头产物引用的资源,确认删除结果显示真实引用来源且业务数据和物理对象均保留。
- [ ] 批量选择“可删除、仍被引用、不存在”三类资源,确认只删除安全项,列表和统计刷新,审计事件与 outbox 数量一致。
- [ ] 创建两条共享同一物理对象的资源记录,只删除其中一条,确认另一条仍能预览且物理对象未清理;两条同时删除时确认只产生一个物理删除任务。
- [ ] 模拟对象存储暂时失败,确认资源记录事务仍成功、删除任务保留并重试,恢复后物理对象最终清理。
## 画布素材上传幂等
画布上传、远端用户数据同步与后端资源写入已使用同一逻辑上传身份,避免腾讯云 COS 等对象存储因自动同步、并发请求或响应丢失产生重复对象:
- [x] 前端回归测试补充“内嵌图片上传期间继续编辑”,要求同一 `coverUrl/dataUrl` 跨同步批次只调用一次资源上传。
- [x] 后端专项测试覆盖相同上传身份复用就绪资源,以及失败重试保持原资源 ID 和对象路径。
- [ ] 在腾讯云 COS 测试桶上传图片后连续移动节点、修改标题并刷新页面,确认后台始终只有一条资源记录和一个物理对象。
- [ ] 在 COS 已接收上传后中断浏览器响应,再恢复网络触发自动同步,确认返回原资源 ID,用户存储用量不增加。
- [ ] 使用两个标签页并发提交相同 `X-Idempotency-Key`,确认一个请求完成上传,另一个复用结果或返回可重试冲突,不生成第二个对象路径。
## 短剧分镜工作流工作台
短剧工作流已按镜头生产重构为单层项目工作台,并将资产绑定、镜头编辑、生成预览和整集镜头轨道放入同一视口;以下场景仍需用户在真实项目数据与模型渠道下确认:
- [x] 工作流路由保留系统全局侧栏和顶栏;项目头部压缩为单行,移除额外六阶段横条,项目导航入口改为“分镜制作”。
- [x] 项目详情 API 对旧后端可能缺失的工作流、镜头版本、产物、引用、候选资产和文件夹数组统一规范为空数组;使用缺失这些字段的响应完成浏览器复现,页面正常加载且控制台无错误。
- [x] 未初始化章节不再显示阻断式居中空态;镜头编辑器可直接查看和保存,首次真实生成时按当前章节自动建立工作流记录。
- [x] 分镜脚本、黑白动作预演、视频生成共用资产栏、镜头表单、预览/历史栏和底部镜头轨道;前端生产构建通过。
- [x] 模型、时长、画幅、分辨率和镜头语言合并为默认折叠的“生成设置”,模型提示词与接戏信息合并为默认折叠的“生成补充”;折叠摘要会显示当前关键参数,浏览器展开/收起验证通过。
- [x] 删除项目头部重复且发生重叠的“新增分镜”入口,只保留底部镜头轨道中的新增卡片;1280px 与 1680px 浏览器检查无横向溢出,系统全局侧栏保持可见。
- [x] 右侧产物阶段从标题旁的隐藏下拉框改为常驻三段切换,分镜图、动作预演和镜头视频始终可见;1280px 与 1680px 下切换路由、阶段文案、最新/历史状态和全局侧栏浏览器验证通过。
- [x] 底部镜头卡片取消悬浮上移和向外扩张的选中阴影,改为不改变坐标与尺寸的底色、边框和内描边反馈;右侧移除“复制参数”“入素材库”,仅保留并排的重新生成与下载,1280px 浏览器悬浮和布局验证通过。
- [x] 镜头编辑器改为脚本优先顺序:镜头名称与画面、镜头资产、表演与动作、对白/旁白优先展示,生成规格和模型补充保持折叠;字段统一为画幅、镜头时长、机位角度、运镜方式、排除内容和接戏备注等生产术语。
- [x] 编辑器标题实时反映镜头名称与“已保存/有未保存修改/保存中”状态;无修改时禁止重复保存,切换或新增镜头前会拦截未保存修改。浏览器交互验证通过。
- [x] 镜头保存使用真实版本写接口;资产点击绑定具体版本;生成统一进入后端任务生命周期,成功后登记对应镜头产物;下载使用带登录凭据的资源接口。
- [x] “生成设置”新增技能库多选,分镜图、动作预演和镜头视频统一通过 Skill Runtime 解析,任务与镜头产物记录技能版本和实际引用文件。
- [x] 镜头资产支持再次点击或从已绑定标签取消引用;解绑使用归属校验的独立写接口,并使该镜头旧产物失效。动态提示词复用画布 `@` 引用编辑器,已绑定图片和角色会按实际参考图顺序解析后提交;后端全量测试、前端专项测试和生产构建通过。
- [x] 镜头生成资产解析改为同时保留绑定版本视觉快照与当前角色卡声音配置;角色主图、场景图和声音样本按 `图片N` / `音频N` 写入 `【资产参考】`,并自动补充声音画像与镜头台词。历史角色版本 + 新版声音绑定的后端/前端专项回归通过。
- [x] 镜头编辑器底部在“保存脚本”左侧新增“删除镜头”;二次确认后原子清理该镜头的脚本版本、资产引用、生成产物、候选资产和生产任务关联,压紧剩余镜头顺序并自动切换到相邻镜头。
- [ ] 使用包含角色、场景、道具和画风的真实项目,确认左侧分类、绑定状态、参考素材标签和镜头切换保持一致。
- [ ] 分别删除首个、中间、末尾和唯一镜头,确认二次提示、相邻镜头切换、空态、镜头编号、总镜数以及刷新后的数据一致;有未保存修改时确认提示明确且取消不会丢失内容。
- [ ] 在同一镜头绑定角色和场景后输入 `@`,确认菜单、行内缩略图和生成请求中的“图片 N”顺序一致;分别从左侧资产行和已绑定标签取消引用,确认刷新后状态一致,旧 token 会阻止生成并提示重新选择或删除引用。
- [ ] 使用“分镜绑定角色旧版本、角色卡随后绑定声音”的真实项目生成镜头视频,确认请求包含旧版角色主图、场景图、当前声音样本、声音画像和镜头台词,且媒体角色为参考资产而非首帧。
- [ ] 配置一个图片模型和一个视频模型,分别生成分镜预览、动作预演与视频,确认任务中心、镜头历史、最新预览和阶段状态同步更新。
- [ ] 在浅色/深色主题及 1280px、1050px、760px 三个断点检查项目导航、表单滚动、右侧预览和底部镜头轨道,确认没有遮挡或不可达控件。
- [ ] 验证下载视频、复制生成参数、将任务物化产物加入项目素材库、章节切换与新增分镜;确认失败任务展示真实错误且不会伪造产物成功。
## 章节分镜生成到分镜制作
剧情章节的分镜入口已从“在画布中分镜”纠正为“生成到分镜制作”;生成结果直接写入镜头脚本,并在本章已有分镜时执行显式替换确认。以下场景仍需使用真实项目与已安装技能确认:
- [x] 章节正文、项目画风、当前角色版本和项目资产统一进入 `agent_storyboard_rows` 任务;分镜生成继续经过 `Skill Runtime` 的 `shortDrama` profile,并记录实际技能版本和引用文件。
- [x] 本章待确认角色也会进入分镜上下文;模型在 `characterIds` 中返回角色名称时,已确认角色自动映射到真实资产版本,待确认或未知角色降级为仅名称引用,不再触发结构修复请求或报废整份分镜。后端专项测试、前端映射测试与生产构建通过。
- [x] 分镜任务结果映射到镜头画面、动作、对白、景别、机位、运镜、图片/动态提示词与接戏备注;模型返回的项目资产关联随镜头在同一替换事务中保存。
- [x] 本章无分镜时直接写入“分镜制作”并跳转到分镜图阶段;已有分镜时展示镜头、脚本版本、资产引用、生成产物和候选资产影响数量,生成失败不修改旧数据。
- [x] 技能多选框占满弹窗内容宽度;专项测试、TypeScript 检查、后端服务测试和前端生产构建通过。
- [ ] 选择 1 至 4 个已安装技能生成真实章节,确认任务中心中的技能版本、文件来源和生成结果一致,完成后进入对应章节的“分镜制作 / 分镜图”。
- [ ] 使用已提取但尚未确认资产的“张振天、张天昊”重新生成真实章节,确认镜头正常落库、提示词保留角色名称;确认角色资产后再次生成,确认同名角色自动带上真实资产与版本 ID。
- [ ] 对已有镜头、历史脚本、资产引用和生成产物的章节重新生成,分别验证取消替换、模型生成失败和确认替换:前两者保留旧数据,确认替换后旧关联被移除且新资产引用可用。
- [ ] 在 560px 及更窄视口打开设置弹窗和技能下拉框,确认选择器、选项面板、长技能名称和替换警告没有横向溢出。
## 短剧项目导航与制作概览
项目设置、章节导航、制作概览、镜头轨道和画布新增入口已按长篇短剧工作流重构;以下场景仍需使用登录态真实项目确认:
- [x] 项目新增 `cover_resource_id`,服务端校验资源归属、就绪状态和图片类型;项目主图被资源删除流程识别为直接引用。章节新增持久化 `word_count`,新建、导入、更新和旧数据迁移均维护字数摘要;后端全量测试通过。
- [x] 项目设置可从个人图片素材、项目图片素材或实时上传中设置主图;项目列表优先显示主图,未设置时回退画风示意图。分镜制作头部改为上一章、搜索定位、下一章的虚拟章节导航;前端生产构建通过。
- [x] 修复项目更新仓储遗漏 `cover_resource_id`,避免接口返回“主图已更新”但数据库字段仍为空;回归测试同时校验设置与移除主图后的数据库重读结果,后端全量测试通过。
- [x] 剧情章节列表去除装饰性侧边表达并显示状态、字数、画布数;制作概览新增六阶段标准流程、当前指标、制作缺口和可点击快速入口;底部镜头卡增加画面、加粗时长、镜头参数、产物版本与绿色成功状态。
- [x] 画布空白区域双击改为直接打开已有新增节点面板,并保留双击位置作为节点落点;原“适配内容”能力继续由缩放控制区提供。
- [x] 项目分镜视频页完成首屏请求治理:项目详情与七个子视图按路由加载,命令面板、更新日志、公告正文和画布创建运行时改为交互后加载,视频预览点击后才取流;真实登录项目生产构建实测首屏 75 个请求(59 个静态资源、13 个 API、3 个其他),首屏不请求 MP4,Console 无错误。
- [ ] 在项目设置分别从个人素材、项目素材和上传图片设置主图,刷新项目列表后确认图片一致;替换、移除主图后确认回退逻辑正确,尝试删除当前主图资源时确认显示项目引用来源。
- [ ] 使用 2500 章项目搜索章节序号和标题,确认定位弹窗桌面端为 5 列、默认每页 100 章,搜索区与分页区保持同一表面;连续切换上一章、下一章并刷新页面,确认当前位置、总章数、字数和路由一致。
- [ ] 在制作概览点击剧情、资产、分镜、预演、视频、交付和三个快速入口,确认跳转到正确章节及阶段,真实镜头产物数量与完成状态一致。
- [ ] 在浅色、深色主题和 1280px、1680px 宽度检查镜头卡,确认时长明显、标题与镜头参数不溢出、“已生成”为绿色且选中态仍使用工作台强调色。
- [ ] 在画布不同缩放和平移位置双击空白处,确认新增节点面板直接打开,选择文本、图片、视频和扩展节点后落点接近双击位置;双击节点、弹窗和其他浮层不应触发新增。
## 工作台首页创作仪表盘改造
参考模板 Dashboard 将 `/home` 首页重构为创作仪表盘(欢迎区 + 统计卡 + 活跃度/素材图表 + 最近项目表格),以下场景仍需要浏览器确认:
- [x] `web` 前端 TypeScript 检查通过;旧首页样式类已随页面重写移除。
- [ ] 登录用户确认欢迎区显示用户名、主操作跳转 `/projects?create=1`、打开画布按钮在未登录时引导登录。
- [ ] 确认统计卡数值与项目/画布/素材/任务页面一致:进行中项目、自由画布、素材资产、本周任务。
- [ ] 确认创作活跃度图表随 7/14/30 天切换刷新,生成任务与画布更新两个系列与任务中心/画布列表一致。
- [ ] 确认素材构成环形图按类型统计正确,无素材时显示空态文案。
- [ ] 确认最近项目表格的搜索、状态筛选、排序与分页行为,行点击进入项目概览;无项目时显示创建入口。
- [ ] 确认快捷创建与工作流面板入口可用,工作流提示显示最近项目阶段与章节完成度。
- [ ] 验证浅色/深色主题与窄窗口(表格横向滚动、统计卡换行)下可读可操作。
## 编辑器 Concat 风格打磨第 36 条(5 项 UI)
已实施完成,需要浏览器最终确认:
- [x] 前端 TypeScript 检查通过;`web/test/timeline-view.test.ts` 3 个守护测试通过;git 工作区干净。
- [ ] 时间线面板与监视器的分隔条拖拽方向:向上拖拽时间线面板应变大(已反转,拖拽中无反向)。
- [ ] 顶部工具栏图标(含导出)与时间线轨道徽标、片段未选中态不再使用蓝色填充,风格与 img-10 参考统一;片段选中态仍以 accent 蓝标识。
- [ ] 时间线最后一个片段可向左、向右双向拖拽,右侧不再固定不动;拖动过程中时间刻度不漂移(pxPerMs 仅由缩放决定)。
- [ ] 监视器底部控制条为 Concat img-14 风格:SkipBack/StepBack/Play/StepForward/SkipForward 五键 + 变速菜单(0.5x–2x)+ 进度条行与时间码;图标在恒黑监视器上为白色,无蓝色。
- [ ] 右侧检查器为 Concat img-15 风格:属性行水平排列(标签左、控件右)、Section 分组标题、输入框 h-7 rounded-[7px]、凹嵌式滑块;浅色/深色主题下均无主题不同步。
## 媒体导入失败根治(分片上传 + OSS 降级修复)
已实施,代码/单测/编译验证通过,需要浏览器最终确认:
- [ ] 后端 `go build`/`go vet` 通过;`resource_test.go` 新增 OSS body close 回归测试通过;handler/service 包测试通过。
- [ ] 重新导入 >50MB 视频(如 92MB 样例),确认前端分片上传(POST /uploads → PUT chunks → POST complete)全程无 400,且进度条显示百分比。
- [ ] OSS 配置密钥仍不匹配(历史 403 SignatureDoesNotMatch)时,确认上传自动降级写入本地存储(provider=local)并导入成功,不再报"导入失败"。
- [ ] 在用户设置里修正阿里云 OSS AccessKeySecret(当前配置的密钥从未验证通过,8/16 起所有 OSS 上传均 403)后,确认资源改回写入 OSS。
- [ ] 确认配额默认值已放宽(日 2048MB、总量 20GB,仅当无 runtime_policy 记录时生效);超过日配额时前端提示为中文而非裸 400。
## 上传媒体监视器播放(H.265 播放副本 + 真实播放驱动 + 时长链路)
阶段 C 根治:本地 H.265 原件服务端转 H.264 播放副本(provider=local 专属,无 ffmpeg 则保持原样),
监视器 `<video>` 真实播放驱动(不再纯时间码),时间线 transport 与监视器共享,上传携带真实时长。
代码/单测/编译验证通过(后端 go build/vet/test、前端 tsc 全绿),需浏览器最终确认:
- [ ] 拖入上传的 H.265 视频(92MB 样例,资源 rowid 54/55)到时间线,点播放:画面真实播放、有声音(不再黑屏/静音);首次 onError 后出现"正在生成兼容版本"提示并轮询,转码完成后自动切 H.264 副本继续播放。
- [ ] 监视器播放时时间线播放头同步推进;拖动时间线播放头(scrub)监视器画面即时跳转;暂停/继续/变速(0.5x–2x)后时间线与监视器仍一致。
- [ ] 轨道静音开关生效:视频所在轨道 muted 时监视器无声,取消静音恢复声音;轨道隐藏(可见性关闭)的片段不再参与预览。
- [ ] 拖入时长 >5s 的视频片段,其时间线长度等于视频真实时长(不再固定 5s 截断);时长探测上传的新素材在资源卡片/片段均显示真实时长。
- [ ] 播放副本就绪前(processing)视频黑屏时出现"正在生成兼容版本(H.264)…"浮层 + "下载原片用本地播放器观看"链接;生成失败显示失败文案而非一直转圈。
- [ ] 时间线 scrub/播放/变速往返 10 次以上无卡死、无播放头回跳、无 setState-after-unmount 报错(Console 无告警)。
## MPEG-4 Part 2 播放死循环 + 画布产物素材同步(待浏览器验收)
已实施,代码/单测/编译验证通过(后端 go vet/test、前端 tsc 全绿),需浏览器最终确认:
- [ ] 导入 MPEG-4 Part 2(mp4v)视频(如 07ee…mp4 sprite/header damaged 样例)后拖入时间线:不再出现"正在生成兼容版本"提示闪烁死循环;损坏文件转码失败后显示终止性文案(不再反复回退重试);正常 mp4v 文件自动生成 H.264 副本并可播放。
- [ ] 存量回归(backend 重启生效):重启后端后,旧规则遗留的 none 存量视频被自动重判——H.264 保持可播;损坏 mp4v(如 c326/07ee…)自动尝试转码并以失败终态呈现终止性文案,不再直接抛"视频编码此浏览器暂不支持"。
- [ ] 打开剪辑器进入已含画布产物(selected+ready 的 storyboard/action_board/分镜/导出成片)的项目:素材自动并入"项目素材"组展示(不再单列"画布素材"分组/页签/来源徽章),再次进入/刷新不产生重复素材。
- [ ] 项目素材库页与剪辑器素材面板对本轮新同步的画布素材均可见;下载/删除画布素材不影响对应画布产物资源。
## 管理后台用户彻底删除(硬删,2026-09-06)
已实施,后端 go build/vet/test 与前端改动文件 tsc 通过,需浏览器最终确认:
- [ ] /admin/users 操作列出现「删除用户」(垃圾桶图标、红色、二次确认);当前登录管理员(自己)行内该按钮置灰不可点。
- [ ] 删除 `cdptest`(disabled、无任务/项目/素材、仅 1 条赠送积分流水,本地库唯一无内容用户):确认弹窗点「彻底删除」后行从列表移除、总数减一、若打开着详情抽屉则自动关闭;列表搜索/筛选后不再出现该用户。
- [ ] 对 `yorkchiu`(有任务/项目/素材等业务内容)点删除:提示「该用户仍有任务/项目/素材等业务数据,无法彻底删除,请先清理相关内容或改用停用」,用户未被删除。
- [ ] 对存在 billing_orders/payment_orders 的用户(生产真实付款场景)点删除:提示「该用户存在资金流水/账单数据,无法彻底删除,请改用停用」。
- [ ] 删除后审计事件落库(audit-events 页签可见 user.purge);DB 中 users 行及 auth_sessions/user_identities 等关联行已物理清除。
- [ ] 既有「停用/重新启用」语义未受影响:停用入口仍走 DELETE /admin/users/:id(保留用户主体),重新启用可用。
## 画布默认框选与移动期性能优化
- [x] 默认工具改为“区域选择”;空白处左键拖动框选,抓手工具拖动平移。Space + 左键、中键和触控板双指手势保留为导航路径;专项测试、类型检查和生产构建通过。
- [x] 框选移动期只通过 Leafer 选区与 DOM 差量标记预览命中节点,不再逐帧提交 React `selectedNodeIds`;抬手使用最终指针坐标计算并只提交一次。
- [x] 可选节点空间索引按不可变节点数组引用缓存;折叠画框子节点和未展开批次子节点继续排除。50k 节点空间索引回归测试通过。
- [x] 登录态真实项目浏览器确认:默认区域选择为激活状态,左键框选不移动视口;抓手工具可平移;区域选择激活时滚动手势继续平移画布。
- [ ] 使用真实 MacBook 触控板复测双指横向/纵向滑动、捏合缩放及 Space + 左键临时抓手,并在 500、2000、5000 个可见节点画布记录连续框选帧率和输入延迟。
## BoardUI 吸收落地:AI 助手工作态/发送态动效(2026-09-06)
已实施,改动文件 tsc 零错误 + Vite dev 模块编译 200,需浏览器视觉验收:
- [ ] 打开画布 AI 助手面板(本地 Agent / 云端助手)触发生成:顶部状态区显示 3×3 对角波光点阵指示器 + 阶段文案 + 秒数计时(替代原打字机“正在推演…”);点阵节奏流畅不刺眼,与画布主题明暗模式均协调。
- [ ] 发送消息后输入胶囊出现主题色呼吸光环(1.6s 周期透明/亮起循环),回复到达后消失;光环不遮挡输入与按钮点击(pointer-events 透传)。
- [ ] 系统开启“减弱动态效果(prefers-reduced-motion)”时:点阵静止为静态帧、无计时闪烁感、胶囊无光环;无 console 报错。
- [ ] 快速连续发送/取消多次无 setState-after-unmount、无定时器泄漏(Console 无告警);长时间等待秒数计时平滑(tabular-nums 不跳动)。
- [ ] 后台运营健康卡(/admin 分析页)活跃用户/生成任务/服务质量三卡数值刷新时平滑滚动;系统减弱动效时直接跳变不滚动。
## 首页创作入口收敛:单会话承载分镜(2026-09-06)
决策:删除顶部「连续对话 / 镜头创作」双模式切换与独立分镜工作台;单一对话消息流承载一切创作,视频消息自动按发送顺序编号为镜头(镜头轨道),右上角「镜头时间线」抽屉按镜跳转回看。已实施(tsc 零错误 + Vite 模块编译 200,CSS 死样式已清理),需浏览器验收:
- [ ] 顶栏不再出现「连续对话/镜头创作」切换;只有一个对话入口(新建/历史按钮保留在右侧)。
- [ ] 空会话(无历史)时提示「发送一条视频消息自动成为第 1 镜」,入口自然无模式概念。
- [ ] 连续发送两条视频消息:用户消息依次带「镜 1」「镜 2」徽标;同 mode 的视频生成结果也带对应镜号徽标,且镜头顺序与发送顺序一致。
- [ ] 视频生成中(pending)消息流显示进行中提示;完成后显示视频 + 镜号徽标 +「生成同款」按钮,失败可重试。
- [ ] 点击顶栏「镜头时间线」:下拉列出全部镜头(镜号 + 用户提示 + 完成/生成中/失败/待生成状态),点击任意镜头平滑滚动到该消息锚点;空轨道显示引导文案。
- [ ] 下拉点击镜头后自动关闭;点击外部区域可关闭下拉。
- [ ] 时间线列表镜头状态随消息流刷新(生成中→完成)实时更新;生成失败的镜头状态为「生成失败」红色标记。
- [ ] 新建/历史/重试/生成同款在收敛后行为与原来一致;无 console 报错;切主题/切窗口尺寸(窄屏 rail 下拉不溢出)正常。
(注:上一版「分镜模式计划路线胶囊 + 活动行」验收项已随分镜独立工作台删除而移除——收敛后视频等待提示由消息流内进行中文案承担。)
## 创作页通知中心(2026-09-06,已于当日移除——见文末「移除页面级任务通知按钮」)
决策:铃铛入口 + 通知面板,从当前 `CreationConversation.messages` 状态迁移推导任务完成/失败通知(无新后端、无新类型);空态顶部与多轮会话工具栏两处均可进入同一面板;未读计数徽标 + 全部已读 + 点击通知定位到所属会话消息。已实施(tsc 零错误),需浏览器验收:
- [ ] 空会话顶部与多轮会话右上角工具栏均有铃铛入口;存在未读时铃铛显示红色数字徽标,全部已读后徽标消失。
- [ ] 发送文本/图片/视频任一生成任务,任务完成(或失败)后通知面板出现对应行(状态小点 + 生成类型/文案 + 时间),行序新→旧。
- [ ] 生成进行中的任务不在面板出现“完成”行;失败任务行呈错误态文案与颜色。
- [ ] 「全部已读」后所有行标记已读、铃铛计数清零;单行读状态随点击/已读动作变化。
- [ ] 点击通知行:若该会话当前未打开则切换打开对应会话,并滚动定位到涉及的那条消息;面板随之关闭。
- [ ] 通知来源跨会话:多个历史会话各自完成的任务都能汇总到同一面板;删除会话后其通知不再出现。
- [ ] 无任何通知(从未生成过或全部已读且清空)时面板显示「暂无新通知」空态,无伪造行。
- [ ] 面板开合、点击外部关闭、明暗主题切换均正常;无 console 报错。
## 首页图标撞车与布局统一(2026-09-06)
决策:顶栏全局公告中心保留 Bell(系统公告语义);创作页任务通知图标由 Bell 改为 ClipboardList(任务清单语义),消除同屏「双铃铛」;空态右上操作组中任务按钮与历史按钮统一为同一规格(36px、同底色、同 hover 抬起),多轮态工具栏内任务按钮与相邻工具栏按钮规格本就一致。已实施(tsc 零错误),需浏览器验收:
- [ ] 首页(创作页)任意状态:右上区域不再出现两枚相同铃铛——顶栏公告为 Bell,页面任务通知为 ClipboardList(任务清单图标)。
- [ ] 空态页右上仅一枚「历史」按钮:32px 幽灵透明底、hover 同底色、focus-visible 描边;任务通知入口已移除、无残留。
- [ ] 多轮会话工具栏右侧为「新建/历史」按钮,形态一致(32px 透明、hover 同底色),与顶栏公告铃铛语义可区分。
- [ ] 明暗主题切换后按钮组配色跟随语义 token 变化,无突兀色块。
## hero 主卡去彩色外框 + 用户消息右侧气泡(2026-09-06,对齐 boardui)
决策:①空态 hero 主卡原以 accent34%/62% 混色外框强调,观感像多余描边线——改为中性 `creation-border`(hover `border-strong` + accent 柔阴影上浮),强调由右上光晕承担,消除「外框线」感;②消息区用户消息原与 AI 同为左侧无气泡长块,无对话主客节奏——改为右侧气泡列(整列 flex-end + margin-left auto、正文 fit-content 气泡 `accent10% over surface`、`r-lg` 圆角右下小角),meta/附件/引用随列右置,与左侧 AI 文本流对称。纯 CSS 改造,JSX 未动。tsc + bun run build 通过,需浏览器验收:
- [ ] 空态页:hero 主卡外框为极淡中性细线(明暗主题各验),不再有明显彩色描边;hover 仅轻提 + 柔影,无生硬变色;右上光晕仍在。
- [ ] 会话态发一条消息:用户正文呈右侧圆角气泡(右下小角),时间戳/复制钮/引用随气泡右对齐;AI 回复仍在左侧无气泡文本流,两侧形成对称对话节奏。
- [ ] 长用户消息不破版:气泡 max-width 86% 内换行;附件/引用 chips 右置不溢出。
- [ ] 明暗主题切换:气泡底色(accent 10% over surface)在两种主题下都清晰可辨、不过浓。
## 会话工具栏视觉统一重构(2026-09-06,幽灵按钮)
决策:创作页会话态工具栏与空态右上操作钮统一为一套「全透明幽灵按钮」规范——32px 高、透明底、muted 灰、hover 才显 surface-hover 底色、focus-visible accent 描边、图标与文字同用 caption 字号/space-4 尺寸;镜头计数胶囊仅在有镜头时显示(无镜头不再显示孤零零的 0),计数徽标为 accent 小胶囊(底色 14% mix、tabular-nums)。已实施(tsc 零错误),需浏览器验收:
- [ ] 会话工具栏左侧「镜头时间线」按钮:无边框透明底、hover 出现浅灰底;有分镜时右侧显示 accent 色计数胶囊,无分镜时按钮后不再出现「0」胶囊。
- [ ] 会话工具栏右侧新建/历史两按钮:同为 32px 透明幽灵、hover 同底色,间距均匀。
- [ ] 空态右上「历史」与多轮态工具栏按钮视觉同源(同高、同圆角、同 hover、同 focus 描边)。
- [ ] 空态与工具栏按钮 hover、focus 三态在明暗主题下均可辨识,图标不与文字基线错位。
- [ ] 移动端窄屏时空态按钮组仍等大(40px 触摸目标)。
## 首页空态卡列与输入框对齐、图标瓦片统一(2026-09-06)
决策:空态「推荐区(hero 主卡 + 快捷卡)」由 920px 收窄为 820px,与艺术横幅、输入框两端完全对齐;卡内图标瓦片从 36px/r-sm/纯文字色改为与输入框「参考」按钮同源规格——34px、r-md 圆角、creation-border 边框 + surface-muted 浅底 + muted 图标色、icon 16px/2px 描边,hover 卡片时瓦片亮起,暗色主题有独立适配;输入框参考按钮圆角 9px 同步 token 化为 var(--r-md)。已实施(tsc 零错误),需浏览器验收:
- [ ] 空态页艺术横幅、输入框、「推荐卡」左右边缘完全对齐(同一中轴 820px 列),不再出现卡宽于输入框的情况。
- [ ] hero 主卡图标瓦片与下方三张快捷卡瓦片大小一致(34px/icon16px)、配色一致(同边框同浅底同 muted 灰),与输入框内「参考」按钮视觉同源。
- [ ] 悬停任意卡片时瓦片边框/底色/图标色同步亮起;明暗主题切换后瓦片与卡列配色正常(暗色有 rgba 适配不刺眼)。
- [ ] 主卡与小卡靠主卡 accent 边框与文案层级区分主次,不再靠瓦片尺寸/颜色差异。
- [ ] 窄屏(`<860px`)下推荐卡与输入框同步退化为单列自适应,两端仍对齐。
## 移除页面级任务通知按钮(2026-09-06)
决策:创作页右上「任务通知」按钮(ClipboardList + 未读徽标 + 通知面板)整体移除——任务成败已由会话流内联状态与镜头时间线承担,跨会话查看由「历史对话」抽屉承担,页面级入口冗余。删除范围:CreationNotificationBell 组件、通知推导状态与扫描逻辑、creation-bell-* 全部样式、空态与工具栏两处挂载;顶栏系统公告铃铛(全局)保留。已实施(tsc 零错误),需浏览器验收:
- [ ] 空态页右上仅剩「历史」一枚按钮;多轮会话工具栏右侧仅「新建」「历史」;无 ClipboardList 残留图标。
- [ ] 无任务通知相关 console 报错;生成任务成败仍以消息流内联状态与镜头时间线呈现。
- [ ] 顶栏系统公告铃铛(红点)不受影响,与页面级入口不再混淆。
## 历史对话抽屉:行操作菜单 v2 + 行内重命名 + 时间让位(2026-09-06)
v2(用户反馈首版难看后重做):菜单改用 antd Dropdown(placement=bottomRight 自动翻转防溢出、全局 token 化浮层明暗自适应),菜单项纯文字无图标(重命名 / 删除对话[红]),对齐 boardui agent-chat-history 的「纯文字菜单项」形态;行尾时间改为**共槽让位**:普通态仅显示相对时间(刚刚/n 分钟前/n 小时前/n 天前,>7 天回退「M月D日」),hover/键盘聚焦时时间淡出、同一位置浮现 26px「⋯」按钮(永不共显);模式标签下沉到摘要行前缀(chip→文字微标签);选中态 = 行底色 9% + hover 升 14%(对齐 boardui hover 即预览选中);删除仍走确认弹窗;行内重命名改为无边框透明输入(hover 底色容器),自动聚焦全选、Enter 提交 / Esc 还原 / blur 提交、空标题不提交、120 字上限并持久化。旧版自制浮层 CSS 全部清除。样式全 token 化 + color-mix 明暗自适应 + prefers-reduced-motion 降级 + 触屏常显「⋯」。tsc 零错误,需浏览器验收:
- [ ] 打开历史抽屉:普通态行尾只显示相对时间(简洁);hover 行时时间淡出、「⋯」浮现(26px);键盘 Tab 聚焦「⋯」按钮直接可见;触屏设备「⋯」常显。
- [ ] 点击「⋯」:antd 浮层下拉含「重命名」「删除对话」(删除红字),明暗主题下浮层背景/圆角/阴影与全局一致;点击外部或按 Esc 关闭;底部行开菜单浮层自动向上翻转不溢出抽屉。
- [ ] 行内重命名:标题变透明输入框(自动聚焦全选);Enter 提交生效并持久化(刷新仍为新标题)、Esc 还原、点击别处 blur 提交;空标题不提交。
- [ ] 删除走确认弹窗,确认后该行消失;重命名/删除后排序与分组不变;选中行底色可辨。
- [ ] 明暗主题均无图标错位/文字重叠;无 console 报错。
## AI 消息代码块外壳 B1(2026-09-06)
自研代码块渲染组件 AiMessageCodeBlock(components/ai/ai-message-code-block.tsx,替换 streamdown components.pre 映射,全站消息统一受益):顶部 34px 工具条 = 左侧语言标签(取自 language-*,未知显示 code,小号大写等宽)+ 右侧复制按钮(复制成功反馈「已复制」1.6s);正文滚动容器保留;圆角/边框/底色走 token + color-mix 明暗自适应(容器 r-md、5% 前景底、11% 边框),pre 内透明继承;prefers-reduced-motion 关闭过渡。语法高亮暂缓(调研发现 streamdown@2.5.0 运行时不消费 @streamdown/code 插件,方案待定)。tsc 零错误,需浏览器验收:
- [ ] 让 AI 回复含多行代码(如 markdown 围栏 ```ts```):代码块顶部有语言标签 + 复制按钮,点复制后变「已复制」,粘贴内容正确(不含语言标记行)。
- [ ] 代码块圆角/边框/底色在明暗主题均可辨;长代码横向滚动不破版;流式输出中代码块容器稳定不跳动、复制按钮可用。
- [ ] 消息中的行内代码(如 `const x`)样式不受影响;画布 Agent 消息里的代码块同样获得新外壳。
## 影策品牌首页
- 新增 `/welcome` 独立公开首页、六幕电影卷轴、工作台截图切换和创作入口,保留既有工作台路由。
- 用户已确认品牌名影策,保留 Spring(默认)、Charge、Wing It! 三个素材版本;没有竹影选项或专用素材。
- 首屏影像背景随滚动渐隐为黑底,返回顶部时恢复;故事章节保留九张电影画面和三张叠字镜头。
- 来源、作者署名、CC BY 4.0 许可和改编说明见 `/welcome/credits.html`,不将第三方电影素材宣称为影策生成案例。
- 设计与实现说明:[影策品牌首页](../../../design/story-creation-homepage.md)。
- [x] 上游基线独立分支的完整前端构建(指定 Go 1.25.0 工具链)、素材与启动清理专项测试通过;生产预览通过 1440px、390px 三版本切换、六幕滚动、非空画布与动画、Charge 视频、历史返回、减少动态效果与署名页检查,无页面异常、资源 HTTP 错误或后端 API 请求。
- [ ] iOS Safari 真机地址栏变化、长时间浏览帧率与设备发热。
- [ ] Wing It! 部分低分辨率色彩分镜后续升级为高清成片镜头。
- [ ] 是否将品牌首页设为根路径入口,由项目维护者另行决定。
## 画布生成重试与引用交互修复(2026-09-10)
已修复五处画布契约断点:在线节点重试的任务提交保留重试身份;比例型图片协议切换分辨率时同步实际质量档位;在线 Agent 多图只提交 `resource:<id>` 引用、不再嵌入 Data URL;绘图引用从项目本地绘图仓库恢复缩略图;已连接参考素材支持拖动及左右方向键排序,并同步更新 `@图片N` 等编号。专项测试与前端构建通过,需浏览器验收:
- [ ] 对一个失败的图片、视频或音频节点点「重新生成」,任务中心出现新的排队/运行任务,节点最终随任务进入成功或明确失败状态,不长期停在「正在连接上游」。
- [ ] 在比例型图片模型中直接点 4K 后立即生成,无需二次点击;摘要与实际请求均为 4K,切换 1K/2K 同理。
- [ ] 在线 Agent 同时引用多张已上传图片时,请求可进入上游,不再出现 `http: request body too large`;尚未同步的本地图片会在提交前给出明确提示。
- [ ] 多个绘图节点连接到生成节点后,参考栏显示各自最新缩略图;编辑并保存绘图后重新打开面板,缩略图随 revision 更新。
- [ ] 用拖动手柄或聚焦后按左右方向键调整参考顺序,标签编号和提示词中的 `@图片N` 同步更新;刷新画布后顺序保持,配置节点承接引用时同样有效。
- [ ] 明暗主题下拖动手柄、缩略图预览、删除按钮和横向滚动无错位;拖动引用不触发画布节点拖拽。
## 全景图工具与查看器增强(2026-09-10)
图片节点工具栏「全景图」先打开配置弹窗再创建节点:弹窗含素材管理(参考图多选/图生模式单选、素材选择器搜索)、提示词合成(内置等距柱状投影约束模板,可展开查看最终提示词并复制)、生成方式(AI 生成/图生全景)、投影方式(720° 球体/360° 环绕)、智能比例兜底说明;配置写入节点 `metadata.panoramaConfig`,参考图节点一并连线。全景查看器新增:顶部工具栏(全屏环视、截图当前视角、导出四向视图、重置视角、退出)、方向键旋转、three.js 按需加载 spinner、投影方式标签;截图走 `preserveDrawingBuffer` 同步重渲染,四宫格临时切方形画幅并带方向标注;全屏为 portal 覆盖层(滚轮调视场角),展开时节点体退回静态预览保证同一时刻只有一个 WebGL 上下文。截图经 `addPanoramaCaptureNode` 上传并在源节点右侧按列错开创建派生图片节点。tsc 零错误,需浏览器验收:
- [ ] 图片节点工具栏点「全景图」:弹出配置弹窗,左侧可加/删参考图(图生模式仅单选),中间提示词与「查看最终提示词」联动,右侧模式切换与说明文案正确。
- [ ] 确认后在源图右侧创建全景节点并连线,选中且弹出对话节点;图生模式无连线时节点直接显示 `directImageUrl` 源图。
- [ ] 全景节点点「进入环视」:加载中出现 spinner;拖拽环视、方向键旋转、重置视角正常;节点内滚轮仍归画布缩放。
- [ ] 工具栏「截图当前视角」与「导出四向视图」:源节点右侧出现派生图片节点(四向视图为 2×2 带方向标注),多次导出按列错开不重叠;导出后视角自动还原。
- [ ] 「全屏环视」:覆盖层展开,滚轮缩放视场角生效;退出全屏回到节点内环视且视角保留;展开期间节点体显示静态预览。
- [ ] 分享只读页(未提供导出动作)不显示截图/四宫格按钮,仅保留环视、重置与全屏;明暗主题与性能模式(仅预览)行为不变。
## 方舟可信素材失败重试与素材库方舟素材 ID(2026-09-11)
后端:方舟可信素材同步失败不再永久缓存——素材组未建成(素材组 ID 与素材 ID 均为空)的失败 binding 下次同步直接重试,素材组已建、素材未建时仅重试创建素材阶段的失败;审核拒绝(ArkAssetID 非空)保持终态;重试复用已建素材组;控制面 HTTP 非 2xx 时透传方舟 ResponseMetadata.Error 的原始 Code/Message(如 SubscriptionRequired),不再统一误报为「模型服务鉴权失败」;管理页 Region 输入补充仅 cn-beijing 开放的说明。前端:素材库编辑弹窗新增「方舟素材 ID」与「人像认证」两个字段(卡片封面显示「人像认证」徽章、详情抽屉显示方舟素材 ID);方舟视频渠道(volcengine-ark-video 或 Ark Plan BaseURL)生成时,引用图片节点绑定的素材若已录入方舟素材 ID,任务参考图直接提交 `asset://<ID>` 跳过上传同步(后端任务与浏览器直连路径一致);任务重跑按存储引用还原时会回退到常规上传路径。后端 go test(排除 main 存量失败用例 TestUserAssetsBatchIsBoundedAndScoped 与 protocol 插件清单校验)与前端构建通过,需浏览器验收:
- [ ] 管理页断开网络或把 Region 暂改为 cn-shanghai 后在画布上传方舟素材失败,恢复后再次上传直接发起新请求成功,无需清理数据库 binding 记录。
- [ ] 套餐未开通等上游 403 场景,上传失败提示包含方舟原始错误码(如 SubscriptionRequired),不再是「模型服务鉴权失败」。
- [ ] 素材库编辑图片素材:可填写 asset- 开头的方舟素材 ID、勾选人像认证,保存后刷新页面两字段仍在;卡片封面出现「人像认证」徽章,详情抽屉显示方舟素材 ID 标签;非法 ID(不以 asset- 开头)被表单拦截。
- [ ] 画布图片节点绑定已录入方舟素材 ID 的素材后连接视频节点,用方舟渠道生成:任务参考图为 asset:// 引用、跳过「同步方舟可信素材」;非方舟渠道生成不受影响,仍走原参考图路径。
## 支付订单用户识别(待验收)
已通过支付页与 API 的 ESLint、15 项后台 UI 回归检查,以及后端身份响应隔离测试和相关包编译。全量前端类型检查仍在未修改的动画、Tooltip 和画布模块报错;数据库搜索专项测试因本机 `CGO_ENABLED=0` 无法执行。尚未进行浏览器视觉验收。
- 核对名称、用户名和邮箱与用户管理一致;同名用户可通过用户名和邮箱区分。
- 验收用户身份、订单号、渠道交易号和完整用户 ID 查询,与状态过滤、分页组合使用。
- 验收用户详情、订单详情、订单号复制和用户不存在的历史订单;关闭侧栏保留列表状态。
- 检查同步状态、关单确认、明暗主题、长文本和窄屏固定操作列。
## 视频生成显式 @文本 引用内联(2026-09-11)
修复普通模型视频渠道(非声明式工作流)丢弃显式 @文本N 引用内容的问题:`buildComposerGenerationContext` 此前受 `promptOnly` 门槛限制,提示词里的 @文本N 只被改写成「【文本N】」占位标记,文本节点真实内容不追加,导致发给上游的视频提示词只剩无意义占位符(如「任务要求提示词:【文本1】」)。现在显式 @文本 引用始终内联真实内容并在提示词末尾以「【文本N】\n正文」块追加;`promptOnly` 拦截自动上游连线文本的原有语义(提交 8f20240d)不变——未显式引用的连线文本在视频模式下仍不自动拼接,图片仍走结构化参考图通道。提示词超长时按既有校验明确报错,不静默截断。专项测试(canvas-node-generation-mentions.test.ts,新增 3 例)与前端全量测试通过(与 main 基线相比无新增失败),需浏览器验收:
- [ ] 画布视频节点提示词同时 @图片1 和 @文本1(文本节点含多行正文)后用方舟或普通视频渠道生成:抓上游请求,text 为「原提示词 + 【文本1】标记 + 空行 + 【文本1】\n文本正文」,参考图仍为结构化 image_url(方舟素材绑定时为 asset:// 引用)。
- [ ] 视频节点只连图片和文本节点、提示词不写任何 @ 引用时:text 仍只有输入框原文,连线文本不自动拼入(8f20240d 行为保持)。
- [ ] 图片、文本、音频模式生成行为不变;显式 @文本 引用的图片节点重试同样内联文本内容。
- [ ] 引用超长文本(超过模型提示词上限)时提交被拦截并提示具体字符数,不出现静默截断或直接丢弃。
## 全景图生成弹窗重设计(2026-09-11)
按设计系统重写 `canvas-panorama-config-modal.tsx`:由 1120px 双栏(左步骤表单 + 右侧栏)改为 680px 单栏表单结构,分区依次为生成方式(AntD Segmented)、参考图/源图缩略图行、场景描述(AntD TextArea)、全景类型(双选卡片)、高级选项(智能比例 Switch + 复制完整提示词);底部固定操作栏含状态提示、取消与主操作按钮,支持 ⌘↵。视觉遵循「默认无边、选中才有 stroke」:未选中项用 `bg-foreground/5` 表面、无描边,选中项用 accent 环线加浅色填充;选图器内选中缩略图为 2px accent 环 + 角标对勾。修复部分缩略图停留在骨架态的问题:缓存图可能在 onLoad 挂载前已完成,新增 ref 挂载时 `complete && naturalWidth` 补检。功能行为(提示词合成、单/多选约束、配置字段、事件)保持不变。前端 `bun run build` 通过,需浏览器验收:
- [ ] 画布图片节点工具栏打开「全景图」弹窗:明暗主题下各分区层级清晰,仅选中项显示 accent 描边;生成方式 Segmented 切换后参考图标题、描述区、底部状态同步变化。
- [ ] 有画布图片(含视频封面)时从画布添加/搜索/多选参考图,图生模式强制单选;缩略图加载后不再停留骨架态,失败图显示「加载失败」。
- [ ] 确认生成与图片直出两条路径行为与旧版一致(配置字段、连线、提示词),⌘↵ 快捷提交可用;「复制完整提示词」内容正确。
- [ ] 680px 弹窗在窄屏(`<768px`)无横向溢出,全景类型卡片换为单列;选图器覆盖层可独立关闭,不误关整个弹窗。
## 云端 Agent Skills 选择与 Token 预算(2026-09-13)
文本 Agent 已改为按所选文本模型能力计算上下文预算:渠道模型读取 `contextWindowTokens` / `maxOutputTokens`,逻辑模型按候选线路取安全交集,旧配置回退 128K / 16K;前端发送前检查与后端轮次预算使用同一语义。1M 模型可配置更大输入预算,运行 checkpoint 的 512KB 持久化上限保持独立。后端上下文压缩保留任务、生成、审批、计费、取消和回写事实,只移除可重新读取正文。
- [x] 后端按能力合同计算 Token 预算、输出预留和压缩阈值,移除生产路径固定 96KB/120KB/192KB 上下文窗口。
- [x] provider 文本任务从能力合同读取 `maxOutputTokens`;前端模型能力编辑器支持上下文窗口和最大输出配置。
- [ ] 使用真实 1M 模型 tokenizer 做大上下文压力测试,并验证多线路路由、SSE 断线恢复和费用估算在生产等价环境的一致性。
Skills 选择器已扩大为固定高度面板,增加宽松留白、自定义多选状态、250ms 搜索防抖和服务端分页的滚动续载;Agent 输入恢复画布节点 `@` 候选,`/` 选择技能后保留可读技能名,不再显示内部 skill ID 或残留斜杠。Token 计费模型现可进入 Agent,账单会把预授权报价固化为最终扣费上限。前端生产构建、ESLint、29 项相关测试,以及后端 app/repository/database 测试通过,需浏览器和真实计费渠道验收:
- [ ] 在明暗主题、窄窗口和低高度窗口打开 Skills,确认面板尺寸稳定、列表独立滚动、空态不缩高、选中态与焦点清晰。
- [ ] 在“发现 Skills”连续滚动并搜索,确认每页只请求 20 条、无重复项或并发重复翻页,加入后可立即勾选。
- [ ] 输入 `@` 选择任意画布节点,再输入 `/` 选择技能,确认编辑器显示节点引用和不带 `/` 的 Skill 标签,提交请求同时携带正确节点上下文与 skillId。
- [ ] 使用 Token 计费文本模型运行 Agent,确认不再报“仅支持按次定价”,实际 usage 超过预授权估值时最终扣费不超过本轮报价和总预算。
## 云端 Agent 已完成轮次事件流恢复(2026-09-13)
成功任务会按存储配额策略压缩 `tasks.input_json`,旧读取逻辑却依赖其中的 `cloudAgent` 字段校验运行,导致完成后的 `/api/agent/runs/:id/events`、查询及续聊返回 404。现从同一用户的持久化 `cloud_agent_executions.state_json` 恢复并校验运行身份;新轮次持久化幂等指纹与历史,旧轮次可读取和续聊(旧记录缺少指纹时不接受复用幂等键)。后端专项测试覆盖压缩后的查询、隔离、幂等与续聊。需更新后端进程并验收:
- [ ] 对已完成的 Agent 轮次重新打开会话,`GET /api/agent/runs/:id` 和 `GET /api/agent/runs/:id/events` 不再返回 404,事件流正常结束。
- [ ] 在该轮次后继续发送消息,可接续原对话且不重复创建画布任务;跨账号读取仍被拒绝。
## 云端 Agent Skill 引用展示修复(2026-09-13)
`/` 仅作为 Skill 选择命令,不再渲染到编辑器 Skill 标签;发送后的用户消息将 `@[skill:<id>]` 映射为图标 + Skill 名称标签,历史标题也不会暴露内部 Skill ID。请求体仍保留稳定 token,供后端按 `skillId` 固定版本。需浏览器验收:
- [ ] 输入 `/` 选择 Skill,编辑器和发送后的消息均显示图标 + 名称,不显示 `/`、内部 ID 或乱码;刷新会话后显示保持一致。
## 云端 Agent 工具消息用户化(2026-09-13)
工具事件在聊天中改为结果摘要:`skills_load` 显示「已成功加载 N 个 Skills 技能」,画布读取、Skill 资料读取、画布更新和生成任务分别显示自然语言结果;隐藏内部工具名、蓝色扳手时间线、重复状态文案和 JSON 展开入口。处理中状态改为紧凑的脉冲提示。需浏览器验收:
- [ ] 运行包含 Skill 和画布读取的 Agent,确认只显示用户可理解的成功摘要,不出现 `skills_load`、`canvas_get_state`、`工具调用`、`工具执行成功` 或 JSON 展开内容;工具列表间距紧凑且明暗主题可读。
## 云端 Agent 审批卡片与提交反馈(2026-09-13)
审批卡片改为无左侧竖杠的中性确认面板:根据待审批参数摘要展示新增/修改节点数量和标题,不展示内部工具名或正文;“同意执行”使用蓝色主按钮,拒绝理由默认收起。审批使用独立提交状态,不再被整轮消息的 `busy` 锁住;请求 15 秒超时后读取服务端决定以辨别成功或保留可重试状态,SSE 刷新不再覆盖输入中的拒绝理由。前端构建、摘要测试及后端压缩任务输入后的审批专项测试通过,需浏览器验收:
- [ ] 在真实待审批轮次点击“同意执行”,按钮可立即响应,后端接受后卡片消失、画布修改发生;快速重复点击不重复执行。
- [ ] 拒绝理由输入期间 SSE 刷新不清空文字;拒绝可提交;接口超时或失败时按钮恢复可点击并给出明确错误,不无限转圈。
- [ ] 明暗主题及窄面板下卡片无左侧竖杠,蓝色按钮、节点摘要、焦点与禁用态可辨识。
## 云端 Agent 可靠性第一阶段收尾(待生产等价容量验收)
本轮补齐了 Agent 运行控制字段和后台收尾:取消 / 失败不再依赖大段运行 JSON 才能落库,`cleanupPending` 会由相同的 HTTP 与 Worker 收尾路径恢复;迁移 v14 会按 100 条批量回填旧运行,遇到损坏运行记录会中止并回滚,不静默遗留不可恢复任务。调度改为带游标的公平分页,避免前 50 条长期等待时后续就绪运行完全饥饿。
SSE 现在按 revision 变化发送紧凑快照,无变化只 heartbeat;客户端具备游标去重、确定性 4xx 立即停止、429 `Retry-After`、建连 / 心跳超时、抖动退避和有限失败预算。Agent admission 请求先保存原正文和幂等键,响应不确定时只重放同一请求;收费 provider create 不做盲目 HTTP 重试。聊天续聊会保留失败轮次的用户目标与真实工具事实,并把画布操作记录做成可聚焦节点的消息留痕。
已验证:后端 `internal/app`、`internal/repository`、`internal/database`、`internal/handler` 测试通过;前端 Agent 协议、pending 恢复与相关画布测试通过;前端 build 和 TypeScript 检查通过。新增测试使用临时 SQLite / mock fetch,不调用收费模型,不代表真实容量。
仍待:隔离 PostgreSQL + Redis + mock 上游的 50/100/500 活跃运行压测、多实例断线重连、worker kill/restart、DB/Redis 短暂不可用、接单后响应丢失,以及取消落库后账务 / 上游取消收尾窗口的端到端验收。当前默认 Agent worker 并发和渠道并发仍需按线上资源、模型额度和连接池共同压测,不能据本轮单测承诺 500 用户可接受的 p95 或队列时延。
迁移 v14 发布前备份数据库并先在副本演练;新程序写入的 pending 控制字段不保证旧程序理解,回滚旧程序前必须确认没有待收尾运行。若迁移因损坏运行中止,应先导出并核对该运行及关联任务,再修复或人工处理,禁止跳过校验强行上线。
## 云端 Agent 审批拒绝与节点能力路由(2026-09-15)
已实施,需真实环境验收:
- [x] 审批拒绝改为独立终态 `rejected`,不再把用户决定包装为 `tool_failed`,也不会继续推进模型调用、画布写入、收费生成或扣费;前端展示“已拒绝”并保留可继续对话的上下文。
- [x] 新轮次首个 system prompt 直接注入由服务端 Capability Registry 生成的节点能力速查,说明轻量节点、媒体节点与分镜脚本的适用场景、限制和维护取舍;模型自主决策,不强制调用能力查询或分镜工具。
- [x] 审批预览支持创建/修改分镜脚本的操作标签;后端能力校验仍是最终约束。
- [ ] 真实待审批轮次点击“拒绝”,确认只出现一次“已拒绝本次操作,未写入画布”,没有“更新画布内容失败”或随后“执行失败”,SSE 在 `rejected` 终态正常关闭。
- [ ] 真实多镜头请求确认 Agent 能基于能力速查选择结构化分镜;单画面快速试验不应被强制创建分镜脚本。
## 用户端侧栏与创作首页对齐参考图(2026-09-15)
根据用户提供的本地用户端截图与小云雀参考截图,继续收敛用户端壳层:侧栏宽度调整为 300px,核心导航、资源工具、创作历史分组重新编排;管理员后台、设置和退出登录收进用户资料菜单,保留原有路由与退出写操作;侧栏底部增加真实用户头像/名称、系统公告入口;顶栏增加真实积分超市余额入口。首页 Composer、模式切换、快捷能力卡片和页面最大宽度沿用前一轮结构。前端 typecheck、ESLint 和 build 已通过,仍需登录态浏览器验收:
- [ ] 1440px/大屏下核对侧栏宽度、分组分隔线、选中态、积分余额、资料菜单和公告按钮的位置。
- [ ] 打开用户资料菜单,确认管理员后台(管理员账号)、设置、退出登录仍可用;退出失败时不静默成功。
- [ ] 390px 窄屏检查侧栏抽屉、资料菜单、顶栏积分入口和首页 Composer 无横向溢出。
- [ ] 真实登录态检查 `/`、`/tasks`、`/wallet` 关键路由及登录过期跳转。