Files
ttstd-infinite-canvas/docs/content/docs/progress/pending-test.mdx
2026-10-13 22:45:58 +08:00

3086 lines
416 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: 当前项目已实现功能的手工验证清单与未确认边界
---
# 待测试
## 图片与视频电商出品工作室
- 已实现:`/toolbox/image` 与 `/toolbox/video` 保留紧凑的工作区入口,移除顶部品牌介绍区,增加轻量创作流程提示、基于真实工作台工具的快捷出品目标卡、页面内可见的创作工具面板、语义彩色图标、分组提示词区域和更大的作品预览区;保留原有模型、上传、生成、任务、重试和详情逻辑。
- 已实现:结果区、工具说明、进行中任务和历史任务按作品优先的视觉层级重新组织;增加明暗主题可继承的组件色彩变量、hover/focus 状态和移动端适配。
- 已验证:`cd web && bun run typecheck`、`bun run lint`、`bun run build` 通过;`git diff --check` 通过。
- [ ] 用户验收:真实登录态访问 `/toolbox/image` 和 `/toolbox/video`,确认快捷目标卡使用真实工具、图片/视频切换、工具弹层、素材上传和生成提交均正常。
- [ ] 用户验收:明暗主题、窄屏滚动、不同工具数量、工具封面缺失、生成中/成功/失败结果状态下,确认布局和色彩层级符合预期。
## 灵感库中文提示词
- 已实现:内置目录与首页画廊的提示词统一为中文;复用来源中文正文,补齐外文翻译;导入时校验原文摘要,缺译或旧译文阻止覆盖。
- [ ] 用户验收:抽查图片、长视频分镜和模板参数,确认中文表达、时长、镜头要求和参考素材语义符合预期。
- [ ] 用户验收:本地及线上刷新后,详情、复制、编辑和一键创作均使用中文,收藏与自定义修改保持正常。
## 创作页提交闸门只覆盖提交阶段
- 已修复:`submit()` 的提交闸门原来一直持有到整条生成结束(只在 `finally` 释放,而 `finally` 要等任务出结果才执行),因此上一条还在生成时点发送会被 `tryAcquire()` **静默拒绝**——没有提示也没有反应,表现为「按钮在转、点不动」。重试走同一条 submit 路径,一并被挡住。
- 已实现:闸门改为令牌制(`tryAcquire()` 返回令牌,`release(token)` 只对持有者生效,避免并发提交互相解锁);任务一旦建成(`bindTask`)立刻放闸,与已有的 `busy` 释放时机对齐,因此上一条生成中也能继续提交下一条;被拒绝时改为给出提示,不再静默丢弃。
- 说明:该闸门在 `4f18367`(v1.6.5)就已存在,不是本次改动引入;它只需要防住同一次创建任务被重复触发(连点、回车连击),不该跨越整个生成过程。
- 实现位置:`web/src/pages/create/creation-submit-gate.ts`、`web/src/pages/create/index.tsx`,单测 `web/test/creation-submit-gate.test.ts`。
- [x] 验证:`tsc --noEmit`、ESLint、`bun run build` 通过;`bun test` 2204 通过(唯一失败项 `agent-api-reliability` 在纯净上游基线上同样失败,与本改动无关);闸门单测含「持有者令牌」并发用例。
- [ ] 用户验收:真实登录态下先提交一条慢任务(视频),在它「生成中」时输入新提示词再提交一条,确认**第二条能正常创建**、两条并行推进、按钮在输入后恢复为「发送」;确认快速连点仍只会创建一条。
- [ ] 未验证:`busy` 仍是布尔量,两条并发时按钮可能提前约 100ms 变可点(闸门仍会拦住并提示);提交阶段本身卡住时闸门会一直被占,此时只给提示。
## 用户登录日志
- 已实现:管理员菜单 `/admin/login-logs`、筛选分页详情、后端认证事件记录、schema v53、失败脱敏和会话/日志原子提交。
- 已验证:Go 1.25.0 `go test ./...` 全量通过;认证、权限、脱敏、事务回滚、并发退出、UTC/北京时间边界和旧库迁移专项通过。Bun 1.3.9 前端 build、lint 通过,设备识别和后台密度相关专项 6 项通过。OpenAPI 新路径和模型解析通过。
- 代码审查已修正渠道模型导入按钮的过期断言,以及启动和助手浮窗测试在中文目录中的路径解码;Bun 1.3.9 完整前端测试 2245 项通过,构建与 lint 通过。HTTP/认证测试使用隔离数据库和模拟 OAuth,不代表外部服务联调已完成。
- 提交前完整检查:Go 1.25.0 全量测试通过,独立 PostgreSQL 与 Redis 的 5 项依赖测试全部执行并通过;Node 22.19.0 Agent 运行时参与测试。macOS 跳过 1 项仅适用 Linux errno 的支付程序启动分类测试。Chrome 预演 E2E 65 项断言通过,Go 格式检查通过。
- 已按用户要求重启本地后端,保留原运行配置与开发数据目录;健康接口 200,新日志接口对匿名请求返回 401,schema 53 和 `login_logs` 表已确认。以上仅确认启动、迁移和鉴权入口,真实登录态页面与外部服务联调仍待验收。
- 筛选布局已优化并通过真实登录态页面验证:1280px 视口两行、1600px 单行、390px 无页面横向溢出;IP 筛选与重置恢复正常。筛选区使用页面私有容器查询,不影响其他后台页面。
- [ ] 真实管理员页面:明暗主题、窄屏横向滚动、时间筛选、分页/刷新、详情和读取失败重试;浏览器返回后 URL 筛选保留。
- [ ] 真实 SMTP/短信/Linux.do:各方式成功及失败登录、注册自动登录、主动退出事件和设备/IP 展示。
- [ ] PostgreSQL:旧库升级、并发登录/退出和 SQLite → PostgreSQL 数据迁移;部署反向代理须核对可信代理配置及日志 IP。
## 个人信息
- 已实现:“更换头像”弹窗内切换上传图片和 8 款系统头像;图片经 1:1 裁剪后回到弹窗预览,上传或系统头像都在弹窗内保存,确认后全局同步。
- 已验证:裁剪几何(含极宽和极高图片)、像素边界、PNG 导出失败、系统头像标识校验和事务回滚、v51→v52 数据保持的专项测试;真实个人信息路由的弹窗切换、图片裁剪预览、取消不写入。
- 已实现:账户与设置的个人信息、PNG/JPEG 头像预览和系统默认、密码修改/设置、邮箱更换及 Linux.do 重新核验;沿用现有页面样式、表单交互与反馈。继续创作入口仍定位渠道或模型配置。
- 已验证:认证、头像、会话撤销/并发签发、验证码归属与过期、迁移的专项测试;前端验证规则与共享头像测试、TypeScript 和 Vite 构建。运行验证记录以交付结果为准。
- 代码审查已修正资料刷新未同步全局头像,以及 Linux.do 重新验证在会话时区变化时未保存验证状态的问题;覆盖取消请求、账户切换、错误响应归属、头像保存后迟到响应,以及 UTC−12/UTC+14 会话的回归测试通过。
- [ ] 用户验收:真实页面明暗主题和窄屏,头像全局刷新与失败保留、原密码错误、新邮箱发送及通知失败状态。
- [ ] 外部联调:真实 SMTP 发送新邮箱验证码/旧邮箱通知,真实 Linux.do 授权回调与不同账号拒绝,实际 PostgreSQL 并发事务。本地测试使用隔离数据与模拟上游,不等同于这些外部联调已完成。
## 系统模型「拉取模型」弹窗搜索
- 已实现:后台「模型与资源 → 系统模型」点「拉取模型」后的选择弹窗新增搜索框(按模型标识做大小写不敏感的子串匹配,自动聚焦、可一键清空),因为部分上游端点会返回几百个模型。
- 已实现:搜索时「全选 / 取消选中」只作用于**当前匹配**的集合,按钮文案同步显示匹配数量(如「全选匹配的 12 个」);关键字之外的勾选状态保留。无关键字时行为与改动前完全一致。
- 已实现:搜索无命中时列表区显示「没有匹配「关键字」的模型」空态;汇总行额外显示匹配数与其中已勾选数。
- 实现位置:筛选与批量勾选规则抽到 `web/src/pages/admin/components/channel-model-import-selection.ts`,弹窗接线在 `channel-model-manager.tsx`,配套 `web/test/channel-model-import-selection.test.ts`。
- [x] 验证:`bun test test/channel-model-import-selection.test.ts` 9 项通过(空关键字返回全部、大小写不敏感、首尾空白、无命中返回空、全选并入去重、关键字外勾选保留、无关键字时与旧行为一致);`tsc --noEmit`、ESLint、`bun run build` 均通过。
- [ ] 用户验收:需要管理员登录且上游能返回大量模型才能打开该弹窗,因此**未做真实界面验收**。请在真实后台点「拉取模型」确认:搜索框位置与自动聚焦、输入关键字后列表实时收窄、全选/取消选中只影响匹配项、清空后恢复全部、以及几百个模型时的滚动与性能。
## 灵感页路由与导航
- 已修复:Nginx 对 `/inspirations` 与 `/inspirations/` 精确返回 SPA 入口,避免同名静态目录触发带容器端口的 301;目录下的 JSON 仍按静态文件提供。
- 已修复:顶部面包屑补齐灵感路由标题,显示「站点名称 / 灵感」,与侧栏一致,不再回退到站点名称。
- [x] 使用生产同版本 Nginx 容器复现旧配置的 301;修改后配置检查通过,两个页面路径及查询参数返回入口文件且无重定向,五个真实 JSON 文件返回原内容和正确类型。该验证只覆盖网关,不替代真实页面验收。
- [ ] 更新前端镜像后,通过实际域名直接打开和刷新两个路径,确认不跳转到 `:3000`、不返回 403,且灵感目录正常加载。
- [ ] 通过侧栏进入、直接打开及刷新灵感页,确认面包屑显示「灵感」。
## 画布素材缺失时的本地强制覆盖
## 画布 operations 自动恢复验收
- 已实现:云端画布写入统一使用字段/对象 operations;本地 journal 保存未确认请求,响应丢失、断网、刷新和重试都复用原 `mutationId` 与 payload。服务端 receipt 与画布变更同事务提交,相同请求安全重放,摘要不同返回冲突。
- [x] 专项测试覆盖字段合并、同字段冲突、显式创建、对象不存在、幂等重放以及删除后迟到更新不重新创建节点;前端类型检查、生产构建和后端全量测试通过。
- [ ] 使用已登录浏览器打开同一画布的两个标签页:分别修改不同字段应自动合并;修改同一字段应显示同步错误并保留本地输入,恢复后自动重放。
- [ ] 在浏览器开发者工具中模拟断网、刷新和响应丢失,确认本地 journal 保留原请求并在恢复连接后完成;检查同步状态图标的 pending/error/done 颜色。
- [ ] 让 Agent 或媒体任务在节点删除后返回迟到更新,确认任务回执保留但不会重新创建幽灵节点。
- 已实现:云端画布写入统一使用字段/对象 operations;本地 journal 保存未确认请求,响应丢失、断网、刷新和重试都复用原 `mutationId` 与 payload。服务端 receipt 与画布变更同事务提交,相同请求安全重放,摘要不同返回冲突。
- [x] 专项测试覆盖字段合并、同字段冲突、显式创建、对象不存在、幂等重放以及删除后迟到更新不重新创建节点;前端类型检查、生产构建和后端全量测试通过。
- [ ] 使用已登录浏览器打开同一画布的两个标签页:分别修改不同字段应自动合并;修改同一字段应显示同步错误并保留本地输入,恢复后自动重放。
- [ ] 在浏览器开发者工具中模拟断网、刷新和响应丢失,确认本地 journal 保留原请求并在恢复连接后完成;检查同步状态图标的 pending/error/done 颜色。
- [ ] 让 Agent 或媒体任务在节点删除后返回迟到更新,确认任务回执保留但不会重新创建幽灵节点。
## Agent 只读循环软收敛
- 已实现:缓存只读结果重复回放、图片同版本重复识别或本轮只读快照达到累计上限时,记录 `read_loop_guard` 并在下一次模型请求暂时收起只读工具;运行保持 `running`,仍可回复、提问或执行获准写操作,不再由该护栏写入 `run_failed`。
- 已调整:能力错误提示优先复用本回合 `model_list`,只有素材、模式或模型选择变化后才重新查询,避免纠偏消息诱发重复读取。
- [x] `internal/app` 专项测试覆盖缓存回放、跨参数读取上限、图片重复识别、Pi 请求工具过滤、批量读取回执和运行状态;完整 `go test ./internal/app` 通过。
- [ ] 在真实 Agent 会话中复现长时间重复读取,确认模型使用已有结果收束、写操作和 `ask_user` 仍可用,并观察护栏事件与费用变化。
## Agent 画布权限与大事件审批
- 已修复:权限查询使用 `canvas_projects`;大画布增量超过事件上限时改为完整快照刷新通知,避免审批执行事务回滚。
- [x] PostgreSQL 独立临时 schema 验证独立和项目关联画布、跨账号、缺失画布、项目 ID 误用以及数据库读取失败。
- [x] 专项测试复现修改前大节点审批失败;修改后覆盖完整批准、执行、回执保存、正文保留、重复批准不再写入、小事件保留增量及超大摘要刷新。
- [x] 本地用户确认原审批失败场景可以继续执行;前端画布事件与版本同步专项测试通过。
- [ ] 验证跨浏览器、多实例及刷新失败时的恢复;本次不改既有审批恢复和模型调度流程。
## Pi 模型输出超限
- 已修复:工具调用数量或正文超限时,在写入待执行调用之前整批拒绝,沿用有限重试传入具体纠正上下文,不执行前几个调用、不提高上限。
- [x] PostgreSQL 临时 schema 在修改前复现“工具调用游标无效”;修改后验证 8 个调用允许、9/31 个调用纠正后恢复、持续超限最多 3 次重试及超长正文纠正。策略文档专项测试通过;未调用真实供应商。
- [ ] 部署后在新会话验证大型任务按批执行;观察文本模型纠正次数及费用,失败时不声称已执行。
- 本项独立于画布大事件修复,不改变审批和画布写入流程。
## Agent 分镜绑定参数引导
- 已优化:工具说明区分素材输入和镜头输出的两个 JSON 示例;handle 错误明确字段、正确方向和真实 rowId 要求,并在回执附上对应连线模板。不放宽校验、不自动改线。
- [x] 专项测试覆盖来源/目标 handle 放错节点、镜头编号误用、缺少 row 前缀、错误回执模板方向、普通连线与行绑定并存,以及重复行绑定仍拒绝;工具 schema 体积检查通过。
- [x] 用户已在本地验证镜头绑定可用;自动化测试不调用外部模型,不修改实际创作画布。
- [ ] 上游合并后验证新会话沿用正确绑定方向,错误调用不会被误报为成功。
## SMTP 邮件故障日志
- 已实现:所有邮件投递入口统一记录详细后端错误,标记 SMTP 失败步骤,并隐藏错误回显中的账号、密码、邮箱、正文和验证码;不改变公开 API 响应。
- [x] 专项测试通过:本地 SMTP 服务模拟欢迎响应、STARTTLS、认证和收件人拒绝;验证日志上下文、错误链保留、敏感值脱敏、成功时不记录失败日志,并回归密码找回流程。
- [ ] 使用实际 SMTP 配置分别触发连接、TLS、认证和收件人失败,确认 `backend` 日志保留具体错误且无敏感信息;覆盖注册、登录、绑定邮箱和密码找回。
## 可美 KM Seedream 图片
- 已实现:Pro / Flash 声明式协议、参考图与扩展参数、结果保存,以及前后端一致的 1K / 1.5K / 2K 尺寸预设。
- [ ] 用户验收协议选择后的默认能力、1.5K 档位与宽高比切换、真实图片生成及刷新后的素材显示。
- [ ] 在供应商环境验证多参考图、Base64 响应、透明输出、全部尺寸和扩展参数;协议测试不替代真实供应商验收。
## 复制生图节点后节点消失
- 已修复:副本不再继承原节点的 `generationEffectKeys`,避免普通保存把它误判为未确认的生成结果。图片内容、提示词和参考字段仍保留,原节点不受影响。
- [x] 回归测试在修改前复现副本无法保存;修改后覆盖复制、普通保存、新生成结果提交及重新读取。
- [ ] 在真实画布中通过复制粘贴和“创建副本”分别验证,生成完成并刷新后副本仍保留。已丢失的副本不会自动恢复,也不会自动重试生图。
## Agent 视频首尾帧选择
- 已实现:生成工具支持明确指定首尾帧,视频节点编辑支持设置和取消已连接的图片;画布读取和生成审批展示当前选择。
- [x] 专项测试覆盖工具字段、视频模式和图片引用校验、编辑与取消、禁止其他节点类型修改帧字段。
- [x] PostgreSQL 独立测试区验证帧选择进入任务输入和持久化草稿,协议按明确字段识别首尾帧,不依赖参考数组顺序;未调用外部模型,测试区已删除。
- [ ] 开启新的 Agent 对话,确认 Agent 能设置下方首尾帧选项,刷新后仍保留;用户确认后再批准真实视频生成。
## 上传内容与附件交付
- [ ] 运行 `TestUploadContentImportSocket` 验证 URL 导入与重试;在可解析外部存储域名的环境复测 `TestResolveAccessPolicyMatrix`。
- [ ] PostgreSQL 上传重试、真实 OSS 附件代理与浏览器附件下载验收。
## 排队后的自定义渠道检查
- [ ] PostgreSQL 环境验证排队期间关闭自定义渠道:首次与重试任务均停止调用,未发出订单退款,已提交或待核对订单保持待核对。
## Agent 失败消息合并与展示
- 已修复:同一运行的 `run_failed` / `error` 与失败状态快照共用一条错误消息;以公开失败原因补全内容,重放、乱序和空原因不覆盖已有详细说明。不同运行即使错误文本相同也分别保留,工具失败与连接错误不合并。
- 已调整:错误提示使用紧凑中性表面和状态图标,不重复渲染相同的标题与正文;诊断号放入默认折叠、支持键盘展开的「诊断信息」。旧对话中带相同运行 ID 的事件错误与终态提示只展示一次。
- [x] 自动专项测试通过:8 个 Agent 错误/对话相关测试文件共 77 项通过、0 失败(304 个断言);前端 `tsc --noEmit` 与本次文件 Prettier 检查通过。
- [x] 已在本地真实登录画布的历史失败对话中核对:同一失败只显示一张错误卡,模型调用失败原因仍可见;展开「诊断信息」可看到诊断号,未触发新的模型生成或写入操作。
- [ ] 明暗画布、窄面板与长错误文本的可读性,以及诊断展开、键盘焦点和历史滚动体验。
## 画布 Midjourney 四图堆叠
- 已修复:画布按一次任务的真实输出数组保留全部图片,以现有图片批次机制默认堆叠,每张图保留资源和素材绑定;单图仍为单节点。
- 已实现:稳定子节点 ID 和整批持久化,任务重放保留用户移动、改名及其他画布内容;成功的旧 Midjourney 首图节点可从原任务补齐。
- [ ] 用户验收四图默认堆叠、展开、切换主图、保存和刷新后的完整结果。
## 卡藏 Midjourney
- 已实现:三个声明式生图协议、公开模型与参考图限制校验、稳定版参数默认映射、受理和任务查询、顶层/data 信封解析、所有单图及可选四宫格保存。
- 已实现:选择协议自动填入默认能力;特惠 16:9、稳定/高速 9:16;参考图分别 1/5 张,固定一次提交,无蒙版或未声明的分辨率参数。
- [ ] 用户验收默认参数、真实特惠与稳定版任务、图片保存和刷新后的完整显示。
- [ ] 多参考图、Raw/数值画质与风格扩展参数的供应商实测,以及全部版本的真实生成;不以两条文生图验收替代这些边界。
## 沧元 Midjourney V7 与 V8.2
- 已实现:独立声明式插件及 V7、1K/2K Provider,固定一次提交、URL 响应、全部结果提取;参考图、编辑、蒙版、速度及模型名按各线路合同校验。
- [x] 协议专项与完整 `internal/protocol` 测试通过,覆盖多图响应、查询端点、错误、非法模型与媒体输入,以及包内文档合同一致性。
- [x] V7 实际任务完成,四张 1456×816 PNG 均已写入 OSS。一次请求返回多图不增加生成次数;积分价格由部署者配置,不代表供应商费用。
- 已修复:创作页按完整任务消费多图结果,保持真实 outputIndex,避免逐图投影为 outputIndex=0 后被素材及消息幂等去重合并。
- 已实现:选择 V7/V8.2 协议自动载入专属能力默认值;V8.2 空模型名暂用 1K,上游模型改为 `midjourney-2k` 自动切换预设档位并保留其他参数和价格。
- [ ] 用户验收协议选择、1K/2K 档位联动、保存并重新打开的能力参数,以及重新提交后的创作页四图显示。
- [ ] 用户验收原提示词的 V7 生成效果、全部图片显示和刷新后的保存结果。
- [ ] 1K/2K 实际生成与保存:官网 CDN HTTP 403 已确认,需供应商提供可下载地址或解决访问限制后验证;协议测试不替代该线路实际保存验收。
- [ ] 参考图、蒙版、style/moodboard 及 fast 档的上游执行验收;专项测试仅验证请求合同。
## 自定义更新公告
- 已实现:站点及外观新增更新公告页签,开关控制原日志/自定义公告;多版本文字、图片和视频可排序并选择整行/半行布局,保存同步公共外观状态。
- [ ] 用户验收实际发布内容、版本排序、图片比例和视频播放效果;关闭并重新启用确认保存的自定义内容仍保留。
## 画布助手身份与名称同步
- 已实现:后台助手名称与内置身份共用外观配置,新对话及已有对话的后续回合采用最新名称;历史消息和运行快照保留,工具权限不变。
- 专项覆盖:保存名称进入规范提示词、续聊改名、品牌独立、名称 JSON 编码、缓存键变化、历史保留、配置读取失败及前端刷新失败保留旧值。
- [ ] 用户验收在「站点及外观 → 画布配置」改名保存,切回画布后新开或继续对话询问身份,与界面名称一致。
## AutoDL 画面规格简化
- 已实现:去除画面规格开关与额外说明,保留原标题、副标题和字段样式;完整分辨率多选与默认值始终可编辑、生效,仅允许当前插件工作流预设,删除旧草稿和开关分支。
- 专项覆盖:所选列表与默认值保存恢复、画布过期选择、真实组件渲染;后端插件预设校验、保存与目录、价格范围、任务校验和声明式请求传参。
- [ ] 用户验收真实页面多选增删、默认值联动、保存与重新打开,确认仅显示六种插件预设及所选值生效。
- [ ] 用户验收实际 AutoDL GPU 生成,确认选定完整标签对应横、竖和方形输出;专项测试不替代付费上游执行。
## 素材彻底删除恢复不拦截、CI 提速与大文件拆分
- 已恢复:`DELETE /assets/:id`、批量删除、清空回收站、回收站素材删除与过期自动清理不再被画布、任务、项目或画布历史快照引用拦截(9 月 21 日 dc1ad680 的契约,9 月 24 日 5b382726 曾误收紧)。事务移除对应历史资源索引,物理对象经 Outbox 异步删除;其他素材复用的资源继续保留。与 `http-api.mdx`、`openapi.yaml` 及删除确认弹窗文案一致。
- 已修复:审批后的媒体等待在服务停机被取消时,不再继续回写与恢复运行时;`MediaTaskID` 保留,重启后重新挂上等待。
- CI 提速:每次构造 Service 都会完整解压 85MB 官方插件包(每次约 4 秒,1000 余个用例累计 7 分钟以上)。现启动只读清单、进程内缓存官方包读取结果、支付运行目录只解压本机平台的可执行文件;`internal/app` 本地由约 488 秒降到约 144 秒。发布流程的镜像构建与质量检查并行(可变标签推广仍等待检查通过),PR 连续推送取消旧检查。
- 拆分:`cloud_agent_runtime.go`、`cloud_agent_tools.go`、`cloud_agent_pi_coordinator.go`、`workflow_provider.go`、`repository.go`、Agent 面板与输入区按职责拆成多个文件,逐声明校验为纯移动;新文件带职责说明。
- [x] 后端 `go vet ./...`、`go test ./...` 全部通过(依赖 Postgres/Redis 的 7 个用例本地跳过,CI 会执行);新增取消等待、插件包按需解压与本机平台产物回归用例。
- [x] 前端 `tsc`、lint、改动文件格式检查与 2103 项测试通过。
- [ ] 真实页面:删除被画布引用的素材应直接成功;画布再次打开时断链由修复流程处理;共享给其他素材的文件仍可访问。
- [ ] 推送后确认 GitHub Actions 后端检查耗时下降,镜像构建与检查并行、检查失败时不会推广 latest / 版本标签。
## 后端统一日志与降噪
- 已实现:新增 `backend/internal/logging`,统一接管 slog、标准库 `log`、GORM 与 Gin 访问日志,级别与格式由 `CANVAS_LOG_LEVEL` / `CANVAS_LOG_FORMAT` 控制。`info` 下不再输出成功的查询类请求、成功 SQL、`[Agent] message_end` 等流式事件及常规画布自动保存;4xx/5xx、慢请求、慢 SQL、SQL 失败和 panic 仍会记录,SQL 不带参数值。
- [x] `go build ./...`、`go test ./...` 与 `internal/logging` 单元测试通过。
- [ ] 部署到服务器后观察一段时间的日志量,确认没有遗漏的高频输出;临时切换 `CANVAS_LOG_LEVEL=debug` 验证 Agent 事件与查询请求可以重新看到,再切回 `info`。
- [ ] 若接入日志采集,验证 `CANVAS_LOG_FORMAT=json` 的字段(`request_id`、`status`、`latency_ms`)可被正确解析。
## 模型选择弹窗长描述与视口边界
- 已调整:共用 `ModelPicker` 的宽度由共享样式统一控制,移除按内容撑宽及触发器最小宽度约束;渠道描述支持换行,字号统一使用说明文字 token(12px),行高为 1.5,移除旧 9px / 10px 覆盖;模型名称与价格在空间不足时分行显示,长价格文本可换行。
- 调用方排查:画布与创作、短剧新建/章节提取/分镜制作/项目默认模型、Agent 对话与设置、提示词优化、批量生成、图片编辑/蒙版/图层拆解及视频分段等入口复用同一组件,均继承修复。
- [x] 现有模型分组、价格展示、共享样式、Agent 和分镜选择器共 20 项专项测试通过;不代表浏览器布局验收通过。
- [ ] 真实页面验证 500 字中英文描述、连续无空格文本、长价格、禁用原因与无描述选项;检查 1440px / 768px / 390px 视口、明暗主题、靠近浏览器左右边缘的弹窗、键盘切换和关闭。本次未完成浏览器验收。
## 分镜视频预览画幅
- 已调整:分镜制作右侧的视频播放器使用媒体原始比例和完整画面适配,避免共享预览样式的固定 16:9 与 `object-fit: cover` 裁剪竖屏视频。
- [ ] 真实分镜页面播放已有 9:16、16:9 视频,确认画面完整、控制条可用;切换镜头与历史版本,检查明暗主题和窄屏下的预览区滚动。本次仅核对组件与样式,未完成浏览器验收。
## 角色卡引用与本地参考图交付
- 已修复:Agent 任务保留模型侧图片槽位,画布编辑器单独使用角色/图片编号;仅有角色卡输入时可解析图片别名,混合输入时不猜测、不交换素材。引用仍由真实角色节点和资源归属校验决定。
- 已修复:OpenAI Images 插件允许 JSON 图片编辑请求携带 Base64 data URL,本地资源经后端授权读取后在内存中交付,不再错误要求公网存储地址;其他仅支持公网 URL 的协议要求不变。
- [x] 用户已在本地真实画布测试,扶颦参考图生成完成并上传;未额外发起收费生成。此结果不代表最新主分支集成后的完整 Agent 流程或生产环境已验收。
## 导演台 3D-BOX 核心 MVP
- 已实现:默认快速镜头工作流、演员快速添加与落位、语义姿态/景别/运镜、当前视图设机位、真实 Three.js 白模预演视频及画布视频回写。
- 已实现:画布 Agent 的 `director_scene_read` 安全摘要与 `director_preview` 请求桥;当前预演由已打开的浏览器导演台执行,不在后端伪造 Three.js 渲染。
- [ ] 登录真实画布验收:快速/高级模式切换、添加演员、地面落位、姿态、景别、运镜、白模预演、视频节点回写。
- [ ] Agent 场景验收:先读取导演场景,再请求指定镜头预演;确认只对当前画布/场景生效,确认模型 URL、storage key 等敏感字段不出现在工具结果。
- [ ] 验收明暗主题、窄屏滚动、录制期间修改场景的快照保护、WebGL context loss 恢复;当前未启动开发服务器做真实浏览器验收。
## 技能库个人分类与画布 Agent 筛选
- 已实现:结构迁移 v39 增加用户技能库分类,v40 增加内置技能删除记录;个人分类与平台共享技能广场分类分离。管理员可创建平台分类,用户可为已加入或自建技能归类;删除分类只解除归类,删除内置技能后启动同步不会重新创建。技能库个人视图和画布 Agent 的“我的技能 / 已启用”列表均可按分类筛选。
- [ ] 使用真实登录页面验收技能库左侧分类及数量、创建/分配/删除、未分类筛选;确认删除分类后技能仍存在,管理员平台分类对其他账号可见、可选,技能广场共享分类不变。
- [ ] 在画布 Agent 技能选择弹窗分别验证“我的技能”和“已启用”的个人/平台分类筛选;市场页仍按共享分类筛选。
- [ ] 在隔离 SQLite 与 PostgreSQL 数据库备份后执行 schema v39 / v40 `up` / `verify`,确认 `user_skill_states.library_category_id`、分类表和 `builtin_skill_tombstones` 迁移正确;未在生产数据库执行迁移或改写数据。
## 发布回归与资源引用保护
- 已修复:素材表现只在 `metadata_json` 引用资源时,批量删除和管理员资源检查仍识别该引用,不误删共享资源。已有回归覆盖共享对象、跨用户别名、事务回滚和删除队列。
- 已更新:启动并行外观加载、主题联动、统一下拉框、画布首帧与 Agent 插话的回归断言;资源消费竞态测试通过模拟 HTTP 传输验证真实持久化链路,不依赖外部网络。
- [ ] 升级到 schema 40 前备份数据库,执行正式迁移及 verify;验证已有渠道和逻辑模型继续生成唯一可读 ID,并确认内置技能删除记录不会在启动同步时被重新创建。
- [ ] 登录真实页面验收素材删除、生成结果转画布、Agent 插话、SSE 断线续传及资源访问。健康检查不能代替这些路径。
## 注册服务协议后台配置
- 已实现:协议名称与条款正文由后台「登录与注册」第 3 区块配置,经 `PATCH /admin/settings/registration` 保存,公开下发在 `GET /auth/settings` 的 `agreementTitle` / `agreementContent`。标题未配置时跟随外观品牌名生成;正文按空行分段渲染,留空时注册页提示待补充。注册开关单独切换不会覆盖协议(后端按可选指针字段合并)。
- [ ] 在真实后台改品牌名与协议正文后,用未登录浏览器打开注册页,确认勾选框与弹窗标题、正文段落在明暗主题下正确显示;再确认协议留空时的占位提示与开关关闭时的注册拦截文案。
- [ ] 用管理员账号验证「注册开关」与「服务协议」两次保存互不覆盖,撤销与离开页面提醒不丢内容;未确认服务端并发写入与多管理员同时编辑的冲突表现。
## 工作区 100% 缩放下的界面密度
- 已收紧用户工作区侧栏、顶栏和导航行、画布桌面端 Dock、Agent 内边距及默认浮窗尺寸;Agent 旧的手动调整尺寸仍保留,可点标题栏「恢复 Agent 紧凑窗口」自行重置。技能组合标签维持透明底和彩色描边。
- 画布编辑器左侧图标菜单与展开内容改用一块低圆角、半透明磨砂表面;删除双重标题、硬分隔线和搜索框边框。侧栏现在浮在真实画布上方,打开/折叠不再改变画布视口宽度;顶栏和左下缩放控件避开侧栏。工作区下拉菜单及共享单选下拉去掉高亮描边,用背景和阴影建立层次,键盘焦点保留低对比提示。仍待登录态真实页面验收明暗主题、画布节点透视、窄屏抽屉、菜单键盘导航和弹层层级。
- [ ] 在已登录的真实画布和用户工作区以浏览器 100% 缩放验收明暗主题、侧栏展开/折叠、顶部/底部工具栏、Agent 历史与设置、输入区和标签横向滚动;再检查窄屏与触屏下是否截断或遮挡。当前本地独立浏览器会跳转登录页,未将静态检查视为视觉验收。
## 画布资源校验、前端发布兼容与画布热点
- 已实现:统一递归识别持久资源字段(含嵌套 `videoPreview`);operations 提交前校验资源归属和 ready 状态,资源缺失返回带路径和 ID 的结构化 409。未确认请求保留在 journal,不能通过覆盖或历史恢复绕过资源合同;主媒体问题继续报告为 unresolved。
- 已实现:哈希 chunk 采用长缓存,缺失资源不缓存;HTML 显式 `no-cache, must-revalidate`。静态容器发布保留当前与上一发布 chunk,并在保留窗口内清理更旧资源;Vite preload 失败只自动恢复一次,之后交由路由错误页。已有数据卷不会凭空恢复首次部署前已删的 chunk。
- 已实现:媒体元数据请求按账号 scope/generation 隔离迟到响应;画布内容 hash 对 viewport-only 副本复用;视口更新走轻量路径;loading 节点共享画布级 ticker,页面隐藏时暂停该 ticker。
- [ ] 先备份隔离/测试数据库,验证资源缺失返回结构化冲突、同一 mutationId 重放幂等、字段基线冲突和删除后迟到更新拒绝;确认事务失败不会留下半条 receipt。未扫描或改写生产数据库。
- [ ] 使用发布测试卷连续发布三版以上:旧 tab 延迟触发旧 chunk 后仍可加载;验证 HTML 与哈希资源 Cache-Control、旧 chunk 404 不被 SPA fallback 改写,以及浏览器一次性恢复不循环。当前没有 CDN/Ingress 线上响应证据,Firefox MIME 具体响应类型未确认。
- [ ] Firefox/Chrome/Safari 实际页面走关键 lazy route;检查离线 journal、登录切换和自动重放行为。尚未做真实浏览器/CDN 验收。
- [ ] 使用 React Profiler 与长时间运行的大画布记录任务更新、节点数/可见数、主线程长任务和页面隐藏行为。当前只做结构性降热点,不推断整画布必然全量重渲染或已达到某个帧率。
## 完整 AI 拆图
- 已实现:视觉规划、专用拆图与普通图片模型重建、可选去背景、图层组显隐与合成、独立素材保存及任务恢复。
- [ ] 用户验收不同画幅的背景与透明前景、图层排序和显隐、复制/删除、保存素材与刷新恢复。
- [ ] 在供应商环境验证专用拆图、去背景、部分失败重试,以及不同模型的比例与透明输出限制。
- [ ] 核对规划与各生成任务的费用提示和失败结算;普通生图重建不承诺无损还原。
## 画布媒体产出模型
- 产出模型与选用模型分开保存。生成成功才冻结产出模型;生成中、失败和只改模型下拉不改已有产出模型。
- [ ] 打开画布外观「媒体信息」后,新生成的图片、视频、音频左下角显示模型展示名或模型 ID。图片右下角仍显示尺寸和体积。关闭开关后这两处都不显示。视频标题旁的宽高保持可见;视频播放时角标不盖住控制条。
- [ ] 生成成功后把下拉改成另一个模型且不重新生成,角标仍是原来的产出模型。重新生成成功后角标换成新模型。
- [ ] 上传、粘贴、宫格切分、截取、合并、提取音频不显示产出模型。节点详情和版本对比在没有产出模型时留空,不显示「默认模型」。搜索能按产出模型名称和选用模型找到节点。
- [ ] 分享页和版本预览画布不显示产出模型。旧画布节点在重新生成成功之前不出现角标。
- [ ] 真实浏览器验收尚未执行。
## 原任务 ID 媒体保存恢复
- [x] 故障注入:下载 503 后服务实例重建继续原任务、OSS 上传失败保留暂存文件及资源 ID、素材登记异常使任务成功事务回滚,登记恢复无需再次下载。
- [x] 防重复与权限:不触发模型路由切换、不新增账单、重复点击幂等、跨用户/已取消/已退款/项目删除拒绝恢复、过期租约写入拒绝、自动/手动重试预算与暂存容量校验。
- [x] 后端 `app`、`repository`、`database`、`handler` 四包回归通过;最后补验媒体恢复、路由与请求日志专项测试,以及 schema 34 幂等迁移和恢复接口鉴权/归属冒烟。测试使用隔离数据库。
- [x] 前端类型检查与 31 项生成显示、画布结果同步、生成提交及重新生成相关测试通过。
- [ ] 在真实画布和任务中心触发下载失败、OSS 上传失败、登记失败,确认各阶段提示、刷新后“重试保存”、结果回写及资产库仅一条;真实浏览器验收尚未执行。
- [ ] 使用真实 OSS 配置进行网络中断/凭证修复后的恢复验收;当前上传故障测试使用不可达端点,不代表真实 OSS 成功链路已验证。
- [ ] PostgreSQL 部署执行 schema 34 升级及多实例租约/共享暂存卷验收。未修改当前本地业务数据库、历史失败任务或账单。
- [ ] 无恢复记录的历史失败任务单独核实源地址有效期与计费状态;本功能不从旧日志自动回填,不承诺恢复已过期的源文件。
## 画布默认黑色主题与点网格
- 前端类型检查与 17 项外观、主题隔离测试通过;尚未完成真实浏览器验收。
- [ ] 未保存自定义默认外观时,新建画布使用黑色主题:背景 `#000000`、明亮度 `0%`、网格颜色 `#000000`、网格强度 `100%`、空间网格为点。黑底黑点视觉上为纯黑。
- [ ] 切换「黑色」或「浅色」预设时使用点网格;黑色首次转自定义及重置时使用上述预设数值,已有自定义配置仍保留,浅色颜色与强度保持原值。仍可手动选择线或空白网格。
- [ ] 已保存的画布外观及用户自定义默认外观不被覆盖;画布主题变更不影响工作台主题。实际浏览器明暗主题与保存恢复待验收。
## Live2D 运行库随部署交付
- Cubism Core 已纳入版本控制,保留原始版权声明并附第三方许可说明;前端构建和静态镜像直接包含运行文件,不再要求部署者手工安装。
- [x] 5 项 Live2D 专项测试及前端生产构建通过;Core 可初始化并读取版本,构建产物中的 Core 和许可说明与源文件逐字节一致。未执行 Docker 镜像构建或服务器部署。
- [ ] 服务器更新至包含本次修复的新镜像,确认 `/live2d/live2dcubismcore.min.js` 返回 JavaScript 而非 SPA 页面;使用有授权的真实模型完成后台预览、保存及画布形象验收。
## Agent 图片字节交付
- [x] 本地模拟上游验证:公网地址为空或错误时,worker 仍发送原始 PNG 字节;任务只持久化资源占位,多图工具配对保持连续,Chat Completions / Responses / Claude / Gemini 协议保留图片。
- [x] 28 项专项回归通过;同一图片资源、模型配置和模拟上游下,Chat Completions 的普通文本节点与 Agent 经真实 worker 发出相同图片字节,附带的内嵌数据不能替换账号资源文件。
- [ ] 对照排查另发现:普通文本任务的默认声明式 Responses / Claude 请求仍使用 Chat Completions 的 `image_url` 内容块,需单独修复并验收;这不是本次 Chat Completions 渠道 Agent 取图失败的原因。Agent 的多协议图片展开测试不代表普通文本的这两条路径通过。
- [x] 专项回归覆盖资源归属、未就绪、非图片、文件大小、模型图片数量限制;附图不直接标记识别成功,不跨轮继承旧的未确认观察。
- [ ] 更新并重启后端后,使用已声明图片能力的实际渠道模型,重新询问已上传图片节点的主体和背景;确认不再因 `unknown` 标记拒绝看图。真实模型调用会消耗额度,尚未执行。
- [ ] 实际部署验证 OSS 图片、同轮多图比较、跨轮换图与读取失败提示;检查其他依赖公网 URL 的生成协议配置,不能将本次看图修复视为存储公网地址已修正。
## 画布创作入口主次调整
- 前端类型检查和 4 项画布起点状态测试通过。
- [x] 真实画布路由使用隔离的身份与空画布测试数据完成局部浏览器验收:1440 × 900 明暗主题、390 × 844 窄屏、390 × 320 低高度。入口不横向溢出,点击目标至少 44px;Tab 顺序与焦点样式正常,入口滚轮不改变画布缩放,减少动态效果设置生效。
- [x] 入口改为左对齐分层标题、主题适配的金属质感片头符号和细分隔线,无卡片或实底大按钮。Agent 使用文字与小箭头入口、悬停下划线反馈;次级入口和素材操作分层展示。点击「交给 Agent」可展开原有 Agent 工作台。
- [ ] 用户确认视觉效果;使用真实登录账号验收全部入口、上传和 Agent 对话。本轮浏览器验收拦截了写请求,未修改真实项目;未模拟的辅助接口返回错误,因此局部视觉与面板展开检查不代表后端联调、保存或 Agent 执行通过。
## 技能文件包迁移元数据长度
- [x] 启动迁移对旧技能名称、简介的回填元数据按字符数限制长度,省略号计入上限;不改写原始名称、简介和正文,不放宽非迁移入口的校验。
- [x] 新增回归先复现旧回填路径的长度错误,修复后技能域全量测试通过;覆盖内置与用户旧技能、重复初始化不重复建版本、原始正文和字段保留,以及 `16000000000049` 内置技能包。
- [ ] 在报错用户的实际部署核对后端镜像与构建提交,并用包含修复的新产物验证启动迁移。本地通过不代表用户环境已修复;本轮未发布镜像、未操作生产数据库。
## 模型失败原因在画布卡片展示
- [x] 后端 Provider、错误分类和请求日志专项回归通过;本地模拟上游验证 HTTP 400 与 HTTP 200 业务失败均保留安全原因,覆盖图片响应和通用 JSON 响应。前端 4 项专项测试通过,覆盖具体原因、HTTP 状态提示、审核元数据及 URL 隐藏。
- [ ] 使用内容安全拒绝、参数错误、业务失败和 HTTP 4xx/5xx 的真实模型任务,确认卡片保留上游具体原因;检查长中文消息换行及明暗主题。
- [ ] 确认 URL 被隐藏,余额、密钥、Cookie 和内部诊断不出现在卡片;后台响应拦截规则仍能替换最终消息。历史任务不会自动补回已丢弃的原因。
## 管理后台轻边界与高密度改造(第一轮)
- [x] 公共后台外壳统一浅深色表面、弱化重复外框,保留表格行分隔、输入边界和键盘焦点;导航按监控排查、模型资源、用户运营、平台配置组织。表格默认紧凑模式,支持舒适模式,偏好按账号保存。
- [x] 请求明细增加排障、计费、全部字段三种视图,保留详情抽屉、媒体、完整计费与导出入口;总览压缩为六项指标及紧凑趋势区,系统性能压缩装饰留白。统计和请求加载失败明确提示,性能刷新失败标记旧快照,首次采集失败不展示假健康指标。
- [x] 36 项专项测试通过(330 个断言),覆盖密度偏好、请求状态、账务状态、后台样式合同、渠道工作区、统计财务及主题;前端生产构建通过,仍有部分 chunk 超过 500 kB 的提示。
- [x] 独立浏览器在真实应用路由使用明确的测试夹具验证,未写入真实业务数据:1440 × 900 下请求紧凑行高 36 px、首屏 18 条完整记录,舒适行高 44 px,切换后刷新保留偏好;排障及计费视图无需横向滚动,全部字段保留横向滚动;375 / 768 px 下页面不横向溢出,表格内部可滚动。浅深主题、键盘进入详情、总览筛选展开收起与 98.6% 精度显示已检查。
- [x] 测试夹具覆盖统计读取失败、请求读取失败、性能刷新失败及首次采集失败;缓存清理仅检查确认弹窗与取消,未执行清理。
- [ ] 使用真实管理员账号验收实际筛选与分页、CSV 导出、媒体预览下载、请求详情及真实数据权限。浏览器夹具检查不等于后端联调通过。
- [ ] 复核渠道、模型、用户、运营及其他设置页在公共样式变化后的长内容、固定列、浮层、滚动及不同站点皮肤;本轮并未逐页重做或完成全后台验收。
## 批量生图、刷新恢复与画布节点一致性
- [x] 专项回归 127 项通过,覆盖同步编辑命令、按节点结果提交、批次汇总、资源槽位、空间索引、相邻媒体逻辑、revision 合并与存储清理;前端类型检查通过。
- [x] 真实生成消费及持久化模块集成测试:两张成功、三张失败,在结果保存期间新增节点、改名和移动;重新读取模拟浏览器存储后,结果与用户编辑均保留。该测试曾复现“内存有节点、存储缺节点”,修复后通过。
- [ ] 使用真实登录账号连接两张已有参考图,提示词包含 `@图片1` 和 `@图片2`,批量生成五张并重试失败子图;验证生成、提示词标签和参考图顺序一致,分组父图不冒充输入。
- [ ] 真实任务两成三败后刷新,检查两张成功图、三个失败节点、父图失败数量和素材 ID;在生成中拖动、改名、新增、删除其他节点,保存后刷新复核。
- [ ] 模拟预览尚未恢复但已有 storageKey,取消或重新生成批次,确认不会删除成功图片;删除后重新分组的子图不受旧批次清理影响。
- [ ] 真实大画布在明暗主题下反复平移缩放,覆盖 280/420/720 原预算边界、批次折叠/展开和多选拖拽;确认可见节点不缺失,并记录极端缩小的帧率和内存。纯函数可见性测试不代替渲染性能验收。
- [ ] 任务发现接口断网、最近任务超过 100 条、切换画布和账号时验证:不能把未知状态标成失败,旧任务不能覆盖新任务,任务中心仍可核对结果。
- [ ] 验证浏览器真实存储故障、服务端同步失败、跨设备并发编辑及生成后立即关闭页面;本轮没有启动开发服务、访问真实用户数据或调用付费模型。
- [ ] 历史已丢节点需单独恢复;本次修复不自动重建原位置、连线和提示词。架构与已知限制见 `docs/design/canvas-consistency-repair.mdx`。
## 回收站彻底删除与画布工具引用
- [ ] 素材卡片选择框恢复左上角,徽章为选择框和更多菜单让位;批量操作条取消吸顶覆盖,并与卡片网格保留间距。需在真实登录页面检查多选边框、长列表滚动、窄屏换行和明暗主题;自动浏览器访问被登录页拦截,样式约束测试不代替视觉验收。
- [x] 新增 `POST /api/assets/batch-delete`,顶层 JSON 数组传入素材 ID;素材页及选择器的批量删除、清空回收站只发一次请求,后端批量事务处理,不按 ID 逐次提交。整批归属检查、事务失败回滚、同批共享资源回收与未选共享资源保留有专项覆盖。
- [x] `DELETE /api/assets/:id` 明确表示彻底删除,不再依赖服务端素材状态判断是否位于回收站;即使本地已归档但服务端仍暂存为 `confirmed`,也不会受画布、任务或历史快照引用阻塞。事务会移除对应历史资源索引并通过删除 Outbox 释放未被其他素材复用的物理文件;内部普通删除仍保留引用保护。
- [x] 画布提示词中的工具引用按“工具类型 + 工具 ID”区分,并使用最新提示词原子追加;相同数字 ID 的不同工具不会互相覆盖或把前一个标签回退成编码令牌。后端专项测试、前端工具集成测试和前端类型检查通过。
- [x] 删除完成后退出用户数据同步队列,再异步刷新素材库与素材选择器分页缓存,避免删除与列表查询互相等待而无法关闭确认弹窗。去掉选择器删除后的重复刷新;刷新失败保留查询错误并记录告警,不误报删除失败。8 项批量删除与工具栏专项测试通过,包含真实 QueryObserver、分页加载与同步队列链路,以及刷新延迟、刷新失败场景(仅模拟 HTTP 响应)。
- [ ] 在真实素材页及素材选择器中分别确认单条删除、批量删除和清空回收站:删除成功后确认弹窗关闭,列表刷新;限速或模拟列表请求失败时确认弹窗不被卡住,素材选择器外层窗口保持打开。
- [ ] 在真实素材页分别验证单个彻底删除、选择 100 条后批量删除、清空回收站及过期自动清理;网络面板应显示单个批量 POST,body 为数组。确认后台清理完成后空间释放、原画布或任务中的旧媒体引用按预期失效、其他素材复用的文件仍可访问;失败时不出现部分删除。
- [ ] 在真实画布快速连续选择两个不同工具,并覆盖相同数字 ID、中文标签、同类型替换和多个运镜工具,确认两个标签均正常显示、保存刷新后不乱码。
## 系统模型自定义排序
- 模型管理入口明确为“自定义排序”,支持搜索选择模型并输入目标位置,保留拖动和上下移动;位置从 1 开始,保存整份顺序,取消放弃草稿。复用已有管理员排序接口、事务与并发冲突检查,前台系统模型选择器沿用保存后的顺序。
- [x] 前端 8 项排序 / 管理页面专项、类型检查、生产构建与 UI lint 通过;后端现有排序事务、权限、过期快照和跨渠道检查专项通过。前端已部署,入口与排序脚本同构建一致,API 就绪;构建仍提示部分 chunk 大于 500 kB。静态资源核验不替代浏览器交互验收。
- [ ] 真实浏览器验证跨分页移动、停用模型排序、取消不保存、刷新恢复、前台模型顺序,以及其他管理员同时修改时的冲突提示。
## 画布 Agent 配置与 Live2D
- [ ] 使用约 50 MiB 的真实模型 ZIP 验收上传和预览;ZIP 上限 128 MiB,解压累计 384 MiB、单文件 128 MiB,超限须拒绝。
- [ ] 站点仍叫“影策”,助手改为“小鱼”;保存、刷新、撤销和恢复默认后入口、面板、欢迎及输入文案正确,历史对话不改写。
- [ ] 使用授权 Core 和真实 Cubism 3/4 模型完成预览、保存、画布播放验收。没有 Core、模型不兼容、网络超时或 WebGL 丢失时显示错误/默认球,不阻止打开对话。
- [ ] 导入不自动启用;上传期间不可保存/刷新/恢复默认;离开未保存配置不影响线上形象;其他管理员不能预览或启用未发布草稿。
- [ ] 未启用包不能匿名访问;启用后模型资源正常读取,切回默认球停止公开服务;引用中包无法删除,清除引用并保存后可清理。
- [ ] 验收大模型、多次切换/打开/关闭、后台标签页、隐藏后台标签、减少动态效果、跨域 API Cookie、明暗主题、窄屏拖动和键盘移动;观察 GPU/内存释放。
- 已用用户提供的 Shizuku 运行包和 Cubism SDK for Web 5-r.5 Core,在现有开发服务的真实 `Live2DAvatar` 组件中复现并修复绘制顺序接口异常,浏览器首帧渲染就绪。模型请求由测试拦截提供本地文件,不代表后台上传、权限、保存和画布全链路已验收;首期不含口型、语音联动、点击表情或 AI 自我介绍同步。
## 系统渠道模型展示标签
- [ ] 在系统渠道的模型编辑中添加多个标签(如“限时特价”“官方1折”),选择不同颜色,保存并重新打开后文字、颜色及顺序保持一致;删除全部标签后前台不再显示。
- [ ] 最多 5 个标签,每个去除首尾空白后为 1–12 字;空白、重复、超长标签或无效颜色被拒绝,失败不覆盖原数据。
- [ ] 用户模型选择器的二级渠道行常驻显示对应标签;同名模型的不同渠道标签互不串用,长内容可换行,明暗主题可读,积分、报价和请求路由不受影响。
- [ ] 已有数据库升级至 schema 32 后,旧模型默认无标签,原模型标识、价格和能力配置不变。
- [ ] 后端启动迁移完成后正常通过版本检查,不再出现“数据库结构版本 32 高于程序支持的 31”;程序支持版本已同步为 32,并添加迁移计划版本一致性回归测试。
## 模型一级菜单选中状态
- [ ] 明暗主题下打开模型菜单,当前模型所属一级项保持高亮;进入二级菜单并切换左侧一级项,确认仅当前展开项及已选渠道高亮。悬浮其他行只显示手形鼠标,不变色、不位移;键盘导航仍保留焦点轮廓。
- [ ] 积分使用紧凑金黄色、浅底细边框的小圆角标签及 11px 金币图标,适配明暗主题;所有行价格右对齐,选中勾选不挤动价格,金额精度和计费单位保持不变。
- [ ] 每次打开模型菜单默认展开当前选中项所属二级目录;无有效选中项时显示一级目录。桌面双栏总宽度为 800px,一级栏宽度不变,增加的空间留给二级目录;窄屏不超出视口。
- [ ] 选择渠道后菜单保持打开,选中高亮及勾选立即更新,可连续切换;点击外部、再次点击触发器或按 Escape 仍可关闭,悬浮其他行不高亮。
## 社区技能文件包初始化
- 修复从 Markdown 正文推断技能元数据时,截断后额外追加 `...` 导致简介超过 500 字、后端启动中止的问题。名称、简介和版本的省略标记均计入长度上限,原始 `SKILL.md` 正文保持完整;不放宽文件包长度校验、不跳过失败技能。
- 补充完整种子启动链回归:原有 33 条 JSON 技能、新增 72 条社区技能、3 条 Go 内置技能,共 108 条,依次同步入库并生成文件包;重复初始化不产生重复版本、不丢失加入/收藏状态;技能广场可搜索 `freestyle-template-match`。
- [ ] 更新后端并重新启动,确认不再出现 `迁移技能 16000000000003 文件包失败`;在「技能库 → 技能广场」清空分类筛选后搜索 `freestyle-template-match`,查看详情并加入「我的技能」。本地临时数据库回归不代表实际部署已更新或浏览器验收通过。
## PR #554–#571 批量整合
- 合入除 #557 外的 17 个 PR;注册协议正文未确认,暂不引入空协议勾选、相关 API 或数据库版本变更。
- 修正社区技能的 72 组空作者 ID 和秒级时间戳;使用独立外部作者标识 `community-itswyatt-k`(不是登录账号或权限兜底),保留原作者署名与来源。增加完整种子落库及重复同步保留收藏/加入状态的回归。
- 保留 Agent 操作 Schema 的按类型条件必填规则,并保持体积预算;续租独立于任务执行时限,但真实租约失效仍拒绝写终态。资源删除即时 outbox 处理纳入 worker 生命周期,测试先等待 worker,再关闭数据库和删除目录。
- CI 从 Go JSON 事件验证五个 PostgreSQL/Redis 指定测试确实运行且通过,缺失、改名、跳过均失败,不再只搜索 SKIP 文本。
- Tooltip 触发事件与 `aria-describedby` 直接绑定实际可聚焦控件,修正外层 span 不会接收内层按钮焦点的行为;现有真实导演台 E2E 增加悬停、Escape 和 Tab 焦点断言。
- [ ] 本批仍需真实页面验收:设置页导航后的浮层、Tooltip 鼠标与键盘焦点、移动端 dock、模型价格与选择、站点图标;真实上游 SSE、视频音频参数、视频资源转存和公网素材访问不由单元测试代替。既有各 PR 的部署记录不代表本批整合已经部署。
## Agent 工具自动纠错与折叠展示
- [x] 对尚未产生副作用的参数、画布操作及快照错误增加按工具计数的有限自动纠错:首次调用加两次修正机会,中途读取画布不重置计数;第三次仍失败才以 `tool_retry_exhausted` 终止。权限、安全、存储错误和已提交收费任务保持不可自动重试。
- [x] `tool_failed` / `tool_completed` 增加稳定的 retry group、次数、上限及 retrying/recovered/exhausted 状态;前端按 group 折叠中间失败,使用中性折叠记录,恢复后保留成功结果,耗尽后仅最终运行错误报红。
- [ ] 待真实 Agent 页面验收:空白画布连续提交缺少 `type`、非法文档连线和过期快照时,中间重试不出现红色错误;成功纠正后只看到折叠记录与真实画布结果;三次失败后才显示最终错误。覆盖自动执行/逐次审批、明暗主题、SSE 断线重放和刷新恢复;确认不会重复创建节点或收费任务。
## 设置页退出后的工作台浮层样式
- [x] 移除设置页对 `app-user-overlays` 的重复添加和清理,由 UserLayout 统一管理。此前离开设置页会清掉父布局仍需使用的样式标记,使画布菜单等 body 浮层失去表面颜色变量。
- [x] 修复已在部署预览版验证:从设置页返回画布列表后,菜单背景和圆角保持正常;深浅主题的卡片操作菜单及浅色排序菜单验证通过。
- [ ] 上游集成后复核设置页与其他工作台页面之间的导航。
## 万有引力视频结果地址
- 已修复:万有引力视频套件更新为 `1.0.1`,8 个协议优先读取 `metadata.direct_url` / `data.metadata.direct_url`,避免完成响应中的相对 `metadata.url` 遮蔽完整视频地址。保留已有完整 URL 回退,宿主下载与 SSRF 校验不变;源码、内嵌接口文档和插件归档同步更新。
- [x] 真实插件归档的 24 组响应回归通过,覆盖创建 / 轮询完成、顶层 / data 内直链优先以及完整 URL 回退;官方插件归档完整性检查通过。
- [x] 修复插件已部署并验证运行时注册版本与归档一致,后端就绪及 API 代理检查通过。从失败任务已记录的完整地址取回 MP4,未发起新的上游生成,也未修改原失败任务与账务状态。
- [ ] 真实创作台新视频任务验证下载、资源转存与结果展示。原失败任务取回的视频保存在受限本地缓存,未自动回填到会话。
## 创作台视频同步音频参数
- 已修复:创作台视频报价、提交和重试共用按所选模型能力整理的配置。不支持同步音频或水印时使用 `false`,支持时遵循模型默认值,不再把全局 `videoGenerateAudio=true` 当成用户请求;模型筛选只使用创作台实际可选的参数。
- [x] 创作台请求配置、模型能力与报价相关的 32 项专项测试通过,前端类型检查通过;覆盖无声视频的报价 / 任务参数、重试元数据以及支持音频时的模型默认值。
- [x] 前端生产构建通过,修复镜像已部署;首页、创作台路由、入口资源和创作台脚本与本次构建逐字节一致,容器健康与 API 就绪检查通过。构建仍提示部分 chunk 超过 500 kB。
- [ ] 在真实创作台使用万有引力渠道的 `minimax-h3-a`,输入“小猫在流泪”,选择 `16:9`、`480P`,检查报价、首次生成和失败后重试;同时确认支持同步音频的模型遵循各自默认值。本次不调用真实上游,生成结果仍待验收。
## 模型候选价目与同渠道独立选择
- [x] 候选模型列表展示自身配置的价格或多规格价格范围,不再使用当前模型的分辨率、时长等参数判定其他候选模型「无报价」。选中模型的触发器、请求估价仍按当前参数精确匹配;未配置价格不显示为免费。
- [x] 平台直连模型以渠道 ID 和模型 Key 保持独立,同渠道同展示名不再合并成自动选价模型族。选择、生成请求和报价保留用户选中的模型,不再借用同名模型的参考输入上限;个人渠道原有细分模型兼容路由保持不变。
- [x] 58 项专项及相邻测试通过,覆盖同渠道同名不同价模型的选择、实际生成配置、报价目标、能力隔离,以及真实价格组件的明暗主题静态渲染;前端类型检查和生产构建通过。构建仍提示部分 chunk 超过 500 kB。
- [ ] 云端部署前端后,在真实 MiniMax H3 列表逐项切换高速版、多图一致性、音画融合及满血等选项,确认选中项不跳回、价目与后台一致;调整参数后检查精确报价和实际任务使用的渠道与模型。本轮未读取云端配置或日志、未调用真实付费生成、未部署,静态渲染不代表云端端到端验收完成。
## 声明式文本任务流式输出
- 已修复:创作台 / 画布文本开启流式且模型支持时,声明式 Chat Completions、Responses、Claude 协议发送 `stream=true` 并实时发布文本增量;保留插件映射、普通 JSON 响应处理和宿主网络安全校验。Chat Completions 请求 usage 终态块,524 和取消不会触发自动重发。
- [x] 三种协议的 15 组场景通过,覆盖响应结束前发布增量、普通 JSON 回退、关闭流式、524 单次调用和取消;声明式执行、Agent 流解析及计费核对相关回归通过。正式后端编译、部署后版本与 API 就绪检查通过。
- [ ] 真实渠道核对首个文本增量、长回复、取消与最终用量;历史 524 任务没有上游任务 ID,仍需供应商核对执行和费用,不自动重新生成或改写账务。
## 注册服务协议
- [ ] 维护者手动填写 `web/src/pages/auth/register.tsx` 中的 `SERVICE_AGREEMENT` 正文并审核后再发布;当前仅显示“服务协议内容待补充。”,不包含正式条款。
- [ ] 真实浏览器确认《影策服务协议》弹窗、默认未勾选、取消勾选、普通注册限流和窄屏显示。
- [ ] 在真实 Linux.do 环境验证新用户未同意被拒绝、同意后注册,以及注册关闭时已有用户仍可登录。
- [ ] 升级前备份,在 PostgreSQL 上验证版本 32→33;前后端一起发布。当前同意标志不提供长期版本化签署留痕。
## 多模态列表与分镜表合并回归
- [x] 合入 PR #549 的图片 / 视频列表分析、动态表格、视频脚本转换和批量生成设置;参考图上限前后端统一为 10。保留本地主分支表格布局、参考图提及、删除列、结果定位、手工行增量同步及单行重新生成。
- [x] 不采用按模型名称猜测多模态能力或自动切换模型的逻辑;保持能力强校验。数据库迁移仍为主分支版本 31,未重编号历史迁移,也未操作实际数据库。
- [x] 修复完成结果的批量跳过 / 显式重生成边界、设置弹窗提交前状态复核、分镜行身份和编辑内容保留、抽帧排序 / 去重 / 部分失败时按来源与时间绑定。
- [x] 77 项前端专项测试通过,包含真实表格组件明暗主题静态渲染、只读边界、列表解析、分镜转换、参考图同步和生成筛选;类型检查及生产构建通过。后端数据库、协议以及批量表 / 模型能力相关专项测试通过;插件归档与源清单一致。构建仍有大于 500 kB 的 chunk 警告。
- [ ] 真实浏览器检查列表模式切换、动态列编辑、参考图拖拽 / 提及、设置弹窗和结果定位;使用明确配置多模态能力的真实模型验证图片 / 视频分析、分镜关键帧抽取与后续图片 / 视频生成,覆盖跨域视频和部分抽帧失败。本轮未启动开发服务、调用真实上游或部署,静态渲染和构建不代表端到端验收完成。
## Agent 任务诊断与模型选择强校验
- 已修复:成功任务不再由空错误文本生成“任务未完成”;执行失败与回写失败独立保留。模型选择缺失、不完整、混用、`null` 和空白值在读画布及产生草稿 / 审批 / 收费任务前拒绝,返回字段级修正信息;未知字段继续拒绝,不自动选择模型或重放收费任务。
- 已修复:出站 DNS 失败使用 `502 / upstream_dns_failed`,保留内部原因链且不公开请求地址;Agent 按持久诊断展示 DNS 原因,不修改代理、解析器、私网放行或自动重试策略。
- [x] 本地专项回归:Agent 参数与执行流程、任务诊断、出站 DNS / 取消 / SSRF、HTTP 错误脱敏通过;缺失模型选择不会新增任务、账单、审批或画布草稿。
- [ ] 全量回归发现 `TestDeleteGeneratedAssetTaskReferences/failed_output` 查询 `resource_deletion_jobs` 时遇到 SQLite 表锁;该用例单独复跑通过,未修改资源删除逻辑或增加重试,仍需排查并发稳定性。
- [ ] 部署后检查真实模型渠道域名及后端 DNS;在真实 Agent 会话中验证失败提示、纠正参数后重新审批,以及成功任务与回写失败的分离展示。本地回归不等于部署 DNS 已恢复,也不替代真实供应商与浏览器验收。
## 画布 Agent 入口拖动
- [x] 右下角 Agent 图标支持鼠标和触屏拖动,使用指针捕获与 6px 阈值区分点击和拖动;拖动结束不打开面板,中断或失去捕获时结束手势,不传播到画布。
- [x] 位置作为独立本机 UI 偏好保存,重新打开画布或收起面板后恢复;限制在可视范围,窗口缩小时自动回位。方向键移动 10px,Shift + 方向键移动 40px,保留键盘点击打开。
- [x] 前端类型检查与 20 项专项/相邻测试通过,覆盖真实生产 hook 的点击、拖动、取消、丢失捕获、多指隔离、持久化和键盘/缩屏行为。
- [ ] 本地浏览器访问跳转登录,未完成登录后真实画布验收;需验证鼠标/触屏拖动不带动画布、不误开面板、刷新恢复,以及明暗主题和窄屏边缘显示。专项测试不替代浏览器验收。
## DashScope Wan 3.0 视频协议插件
- [x] 管理端模型测试:`wan3.0-video` / `dashscope-wan3-video` 真实上游通过。
- [ ] 画布文生视频与首尾帧完成并落盘。
## 系统模型同页渠道与模型管理
- [x] 规格列更新为成本价 / 销售价 / 利润率,按次、按秒、文本输入/输出/缓存和视频 Token 分别展示;缺失配置、零售价利润率显示 `—`,亏损显示负利润率。
- [x] 支持跨页多选最多 100 个模型统一调价。弹窗打开即展示模型,一行一个模型,列为模型展示名、渠道展示名(上游模型 ID)、规格、成本及售价输入框;多规格在模型行内纵向对齐,不拆成多个模型行,规格上游覆盖单独标注。
- [x] 调价弹窗模型价格列表进一步压缩行高:上下留白 6px、行内文字间距 2px,常规尺寸售价输入框与利润率同排,扩大售价列并保持规格对齐。弹窗居中固定高度 900px(不超过视窗高度减 48px),列表填充剩余空间并内部滚动,短屏允许内容区滚动;紧凑效果与滚动仍待真实页面视觉验收。
- [x] 目标利润率和 0–6 位小数(默认 2 位)实时重算,旁边增加「重新计算」按钮,按当前参数对所有规格精确四舍五入。重算覆盖手动值并明确提示;之后可逐项修改,提交最终输入售价。服务端强校验归属、成本、价格和模型/规格版本,事务保存,冲突整批回滚,不改成本或启停状态。
- [x] 前端类型检查、69 项专项及相邻回归测试通过,包含真实表格组件渲染、多规格单模型行、输入框最终值、精度和手动价重算。后端调价与相邻成本/删除测试通过,覆盖真实 HTTP 登录/管理员权限、整数/null/零售价、最终手工售价保存、过期版本拒绝及并发冲突事务回滚。验证使用内存 SQLite,未进行 PostgreSQL 或浏览器验收。
- [ ] 待登录后的真实页面验收:多选/跨页/切换渠道,修改比例/精度后实时计算,手动编辑后点击「重新计算」恢复所有规格价格,逐项编辑保存、成功刷新与错误保留;覆盖未配置成本、零成本、Token 多计费项、长名称、明暗主题、窄屏、表头与规格对齐及滚动。不操作现有环境真实价格数据。
- [x] 样式细化:渠道列表改为留白分组与中性选中描边,数量与启停状态分别呈现;模型头部说明成本口径,规格与成本分行,操作列固定在右侧,超过三个规格可展开查看。
- [x] 规格成本读取管理员接口已有的 `priceTiers[].costPricing`,与销售价分开呈现;未配置成本明确提示,显式零成本正常显示,异常或缺失数值显示 `—`。
- [x] 本轮 49 项专项与相邻回归测试、前端类型检查通过;新增成本摘要真实组件渲染测试,覆盖成本/售价隔离、零成本、缺失/异常值、Token 单位、规格选择器与展开内容。样式细化仍需在登录后的真实页面检查明暗主题、长名称、多规格行高、横向滚动与固定操作列。
- [x] 系统渠道入口改为同页工作区:桌面左侧约 20% 展示渠道搜索、状态筛选、新增和排序,右侧约 80% 展示当前渠道信息与模型管理;移除模型管理的二级页面和返回入口,窄屏改为上下布局。
- [x] 保留渠道编辑、复制、启停、删除及模型拉取、选择导入、编辑、排序和批量删除。新增或复制后自动选中渠道;切换渠道时隔离模型列表、筛选、勾选和编辑状态,渠道与模型加载失败显示重试入口。服务端仍使用原分页接口,左栏分批读取全部渠道,避免默认仅展示前 20 个。
- [x] 40 项专项及相邻回归测试通过,覆盖渠道筛选与选择回退、更新后选中数据、真实模型管理组件静态渲染、同页结构,以及既有模型导入、批量删除、排序和编辑规则;前端类型检查通过。
- [ ] 本地真实 `/admin/channels` 路由跳转登录页,未完成登录后的浏览器验收。需检查明暗主题、桌面 20/80 比例、窄屏上下布局、左右滚动、搜索及切换、新增/编辑弹窗;确认新增/复制后选中、删除当前渠道后的回退、多页渠道完整加载和快速切换不串模型。静态渲染不等同于浏览器或真实写入链路通过。
## 工作台菜单表面与素材显示密度
- [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 的消息内边距、待办间距、输入区和工具栏,覆盖冷启动直达、站内导航、明暗主题。本次浏览器验证为暗色空对话面板,未覆盖原截图的历史审批会话;线上尚未部署修复。
## PR #544–#546 合并后回归
- 上传弹窗的调用方保留安装 Promise,上传期间防止重复提交和关闭;复制配置复用开发规范中的有效示例,并展示剪贴板失败。减弱动画保留动画完成事件,不以禁用动画名称阻断弹窗退场。
- 易支付插件更新至 `1.0.9`:必须配置可信网关;查单和通知强校验订单、金额与流水,保留长数字交易号精度;只允许明确的支付跳转协议。非成功通知在入队前拒绝,避免占用到账事件的幂等键。源码、跨平台可执行文件和插件包保持一致。
- V2 查单协议尚未核实,不新增猜测接口。V2 只实现下单与通知验签,查单、收银台刷新和安全关单不支持,需网关人工核对;V1 本地关单不等于上游链接失效。
- [ ] 真实管理页面检查上传成功、失败、重复点击、关闭后重开,以及浅色/深色和减弱动画下的弹窗退场;确认剪贴板不可用时有明确提示。
- [ ] 使用可信测试商户验证 V1 下单、查询、重复/篡改通知、到账幂等及本地关单后的迟到通知;V2 另行验证 RSA 回调,并确认不支持的操作不会显示成功。
- [ ] 核对数据概览与订单列表、CSV 的财务口径及跨渠道模型分组,详见下一节。
PR #543 本次未合入:其已发布迁移校验和改写、管理员显式图片输入限制被覆盖,以及无关插件定制需要先拆分。主分支的迁移谱系、模型能力强校验和画布实现保持不变。
本轮验证:前端全量 `bun test` 1832 项通过,生产构建(含类型检查)、项目 lint 和 CI 涉及文件的格式检查通过;后端财务统计(含 SQLite 集成)、模型分组、易支付插件与真实插件 RPC 专项通过,六个平台产物及插件包校验通过。后端 `go test ./...` 有一项素材删除测试 `TestDeleteAdminResourcesSupportsPartialSuccessAndBatchedReferences` 遇到 SQLite 表锁,其测试和对应删除逻辑本轮未改动,单独连续复跑 3 次通过;全量结果仍记为未通过,不能用专项复跑替代。尚未做浏览器、真实商户或部署后验收。
## 数据概览财务统计与模型一级分组
已实现:移除数据概览的独立价格编辑入口;按系统模型订单快照汇总已结算收入、成本、利润与利润率,并同步 CSV。“模型展示名(一级目录)”支持搜索、选择跨系统渠道已有分组及输入新分组。
自动化验证:后台 UI 回归测试 17 项通过,前端类型检查与生产构建通过;财务汇总、实际用量成本和无效成本价格专项测试通过。本轮合并复测已完成 SQLite 集成测试,此前本机 GCC/CGO 阻断不再存在;以下真实页面与数据链路仍待验收。
缺失字段修复验证:新增 4 项测试直接执行模型表格财务列的渲染函数,覆盖未返回或空财务对象、零金额、部分成本和亏损;与后台 UI 回归测试共 21 项通过,前端类型检查及生产构建通过。
- [ ] 在真实数据概览切换时间、模型、渠道和用户,核对订单去重、部分成本提示及 CSV 金额;确认退款、未结算订单不计收入。
- [ ] 工作流上传、结构查询、轮询、下载和取消相关日志不承载订单金额;核对 CSV 与概览一致。
- [ ] 后端响应缺少财务统计时,页面应保留其他统计并显示提示,金额为 `--`,不误报零费用或暂无订单;后端更新并重启后刷新,确认财务数据恢复。模型分组列表未返回时编辑器仍可输入名称。
- [ ] 检查浅色、深色与窄屏下的费用区域、模型表格横向滚动及长金额换行。
- [ ] 新建或编辑模型,在“模型展示名(一级目录)”选择其他渠道已有分组;输入新分组保存后再次编辑,确认下拉更新且创作端归组正确。
## CI 检查修复与镜像构建提速
- [x] 修复导演台 DEV 复现入口在 React 初始化前请求 `/api/public/appearance` 导致的 E2E 502:入口和 Provider 共用精确路径隔离,普通页面与生产环境仍执行外观初始化,未放宽浏览器错误断言。
- [x] 外观启动与导演台专项测试 54 项通过,包含执行真实 `main.tsx` 分支的 9 项新增回归;生产构建(含 TypeScript 检查)通过,仍有 chunk 大小告警。
- [ ] 在 GitHub 重跑 Director P0 Chrome E2E,确认六个场景不再出现外观接口 502;本轮未启动本地开发服务器或执行 Chrome E2E,不以入口回归测试替代浏览器验收。
- [x] 修复画布连线可见性文件的 Prettier 格式;增量格式检查改用 Prettier API,移除会触发 EPIPE 的管道比较,覆盖新文件、历史格式、无父提交、全零基线和错误传播。
- [x] 本地前端类型检查、Lint、1844 项测试通过,其中包含 20 项 CI 格式检查与镜像复用/晋级回归;两个 Dockerfile 的 BuildKit 检查无警告,Actions 工作流通过 actionlint。
- [x] 使用原失败运行的提交区间重跑实际增量格式脚本,检查通过且未再出现 EPIPE;原生 ARM64 前端 Docker 镜像构建通过。
- [ ] 后端本地 Docker 完整构建在 Go 依赖下载阶段被 `proxy.golang.org` 的 EOF 阻断,两次同类失败后停止原路径重试;尚不能据此确认后端镜像完整构建通过,未改用不可信依赖或吞掉错误。
- [ ] 在 GitHub 验证质量检查失败时不构建、不更新镜像标签;确认必要检查规则匹配可复用工作流的实际名称。
- [ ] 验证 AMD64/ARM64 原生后端构建及支付插件 smoke、前端静态资源单次编译;检查最终镜像的两个架构和实际容器运行。
- [ ] 连续推送同一 SHA 的 main/tag,确认复用已构建摘要;模拟旧 main 晚完成、镜像不存在、GHCR 鉴权/网络失败,确认不会错误降级或回退 `latest`。
- [ ] 比较冷/热缓存耗时,使用 `go-test-timings` 分析 `internal/app` 的慢测试。本次未删除测试、未调用真实收费模型、未推送镜像或发布线上版本;不能宣称云端耗时已经降到固定分钟数。
## 画布素材链路与工作条改造(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 事件校准与 operations journal 恢复
旧会话的画布增量可能缺少版本号或发生断流。现在增量缺口只触发完整画布校准;客户端保留已确认基线和未确认 operations,请求恢复时复用原 `mutationId` 与原始 payload。不同字段可合并,同字段或已删除对象不会被静默覆盖或重建。
- [x] 画布 operations、Agent 增量合并、事件调度与刷新测试通过,覆盖版本缺口、响应丢失、未确认请求重放、删除后迟到更新和幂等回执。
- [x] 前端类型检查与生产构建通过;隔离浏览器使用实际同步模块与 IndexedDB 模拟刷新恢复,未产生重复提交。
- [ ] 登录真实账号验证断网、刷新和 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` 行为不变。
## 画布 operations 持久化与恢复验收
画布写入已统一为字段级、对象级 operations。客户端先把未确认请求写入账号隔离 journal,服务端在同一事务中提交画布 mutation 与 `canvas_mutation_receipts`;响应丢失、断网、刷新和后台重试都复用原 `mutationId` 与原始 payload。内部维护快照只用于资源保护和审计,不作为用户可见的历史树、预览或恢复入口。
- [x] 后端覆盖显式创建、字段合并、对象基线、幂等回执、原子事务以及删除后迟到更新不重建节点。
- [x] 前端覆盖未确认请求 journal、刷新恢复、自动重放、远端完整快照与本地未确认 mutation 合并。
- [ ] 双标签页、断网、响应丢失、刷新和 Agent 媒体回写的真实浏览器验收:状态自动恢复,同字段冲突不覆盖远端修改,删除节点后迟到结果不复活节点。
## 首页常驻滚动通知(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`。
本轮继续收敛后台的信息密度与运维扫描路径:用户管理操作区收敛为「详情 / 停用 / 更多」,注册时间改为紧凑展示并保留完整时间 title;用户列表读取失败会清空旧数据,在表格内显示错误与「重试」,避免把过期列表当成最新数据。系统渠道页压缩渠道列表、模型管理和重定价区域的间距,让首屏能看到更多模型配置;功能开放页去除功能域外层重边框,改用层级背景和行级必要分隔。真实管理员权限、用户 CRUD、渠道保存/模型编辑仍待验收:本轮只用隔离 fixture 验证真实路由渲染与失败态,不代表真实后端写入已通过。
- [x] 后台专项测试 5 个文件共 36 项通过,覆盖密度偏好、请求明细、分析计费、主题隔离、用户/渠道回归;前端 TypeScript 检查与生产构建通过(仍有既有大分包提示)。
- [ ] 使用真实管理员账号复验用户筛选、分页、详情、停用/删除权限与失败重试;验证真实渠道保存、模型编辑/重定价和功能开关写入,不用 fixture 结果替代服务端验收。
## 模型选择器、画布摘要与首页视频入库
- 全站 `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,尚未验证通过。
- 待部署验收:未绑定画布的生成图片可单个及批量彻底删除;被画布或其他任务输入引用时仍提示来源。删除后任务历史中的原文件不再可用,共享素材仍保留其资源。
## 画布统一 operations 写入与媒体保护
- 画布手工编辑、Agent、媒体终态回写、预演台、创作提交和导入均通过统一 operations 服务提交;不存在整批快照覆盖入口。
- 素材和画布按“资源先确认、画布后提交”顺序同步。资源缺失或绑定不一致时保留本地内容并进入自动恢复队列,不通过用户选择云端覆盖本地,也不重建来源不明的媒体或插件节点。
- 已通过 operations、资源引用、幂等重放和删除顺序专项测试;真实浏览器仍需验证断网恢复、媒体回写和刷新后的状态投影。
## 欢迎页开放开关
- 管理员在 `/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 渠道各跑一次文本生成,确认系统指令生效且没有重复出现在正文里。
## AI 生成章节的同名项目处理
- 已实现:创建项目遇到同一用户下的重名时返回 HTTP/code 409、`reason=project_name_conflict`;前端只对该原因有限更换名称重试,其他冲突和服务错误直接显示,不调用模型。
- [x] 隔离 PostgreSQL 的仓储和服务测试、HTTP 响应及前端重试边界测试通过:同用户重名返回结构化冲突、不同用户可同名、项目 ID 冲突不被误判、原项目和工作流不被覆盖;更换名称后可正常创建。
- [ ] SQLite 同组用例待在启用 CGO 的环境运行。
- [ ] 登录真实页面,用已存在项目的同一故事再次执行「AI 生成章节」,确认自动创建带后缀项目、章节正常导入,且只有一次模型生成请求;确认其他 HTTP 409 不触发重试。
## 画布智能引用
- [ ] 在简洁、专业模式及展开提示词面板中打开智能引用,检查明暗主题、弹层宽度和开关状态。
- [ ] 输入素材名称、`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] 画布压缩包导入先校验媒体完整性,资源上传和画布写入统一进入 operations journal;失败时保留未确认请求并自动重放,不把浏览器本地 storage key 标记为云端事实。
- [x] 素材回收站使用独立归档状态;彻底删除复用服务端引用校验与资源删除 Outbox,自动过期清理不会旁路业务引用。
- [x] 画布删除后迟到的媒体或编辑更新不会重新创建画布或节点;只有显式 create operation 可以创建实体。
- [ ] 使用两个账号、两个标签页和断网恢复验收导入、删除、刷新与同步状态;确认来源未知的插件包和媒体修改不被清理。
## 邮箱找回密码
- [ ] 后端专项测试验证验证码用途隔离、错误和过期验证码拒绝、单次消费、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] 视频创作按同名模型组汇总图片、视频和音频参考能力;文生视频路由本身不接收参考素材时,仍可先添加参考内容,再由现有兼容路由选择图生视频或全模态参考模型。素材库和提交前按媒体类型分别执行上限校验。
- [x] 创作参考、素材库入口和模型路由 47 项专项测试、前端 TypeScript 检查与生产构建通过。前端已部署为 `1.5.7-creation-video-references`,容器健康,HTTPS 创作页与 API 健康入口返回 200,线上创作页脚本与本次构建哈希一致;未调用真实视频上游。
- [x] 自动化覆盖首个、中间和末尾参考内容按稳定 ID 独立删除,且删除后其余顺序保持不变。
- [ ] 在真实创作台分别选择图片、视频和音频参考,确认素材库只允许当前模型组支持的类型,达到各类型上限时提示明确,并检查任务详情中的 `referenceImages`、`referenceVideos`、`referenceAudios` 与所选素材一致。
- [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` 关键路由及登录过期跳转。
## PR #547 本地选择性整合验收
以主分支 UI 为准移植功能,不整包合并 PR 页面。尚需真实浏览器和真实模型验收:
- 左侧常驻主页、节点、资产、任务、历史菜单,已移除工具菜单,工作区面板默认折叠;菜单采用小字细线图标、加大纵向间距,展开/收起按钮置底。验证点击分类展开、再次点击收起、短窗口滚动、键盘焦点和明暗主题;与原有项目章节栏互斥,小屏抽屉、专注模式、历史版本预览无误,不能通过历史预览编辑当前画布。
- 节点边框、主题和提示词面板原尺寸不变;图片节点直接展示风格 / 预设,移除提示词模板入口(包含放大编辑器和斜杠触发),其他节点模板入口保留;明暗主题、窄屏、浮层滚轮、键盘和点击外部关闭。
- 风格选取/替换/清除、保存重载;节点风格优先于项目画风,清除后恢复继承。运镜可多个但不能重复;特效没有内置预设,可创建自定义工具。
- 九宫格从已有图片创建独立子节点和引用连线,原图不变,不自动扣费或生成;用户明确点击生成后确认模型收到展开的提示词。
- 节点内工具选取、收藏幂等、跨账号隔离、搜索分页、请求失败提示;自定义删除验证 API 权限。公开工具预览暂不接受私人上传资源;相对路径种子预览不显示,不在启动时下载。
- 资产面板直接展示分类、名称/标签搜索、媒体类型、刷新及分页;使用现有素材服务与插入合同。验证文本、图片、视频、音频插入,entity/model 不应出现虚假的插入成功;管理素材 / 项目素材仍打开原有入口。
- 任务列表明确展示最近 30 条,不是完整历史;进行中过滤普通生成任务,历史包含 Agent;刷新、取消、切换项目/账号后不串数据。
- 工具被删除、停用、不可见、类型错误或标签损坏时,生成必须报错,不能静默忽略;排队后删除工具也应失败。
- 使用备份的本地测试数据库验证 schema 29 → 31 和第二次启动幂等;PostgreSQL 序列、迁移工具实库验证待补。不要用生产数据库直接试。
自动检查不能替代以上真实页面/生成验收;本次不自动启动服务,不调用付费模型。左侧菜单补齐后尝试访问已有本地服务,内置浏览器停在登录页,未代填凭据,登录态视觉验收仍待进行。
本地自动验证记录:前端 8 个专项测试文件共 59 项通过,生产构建通过(仍有大分块提示);后端 tools、database、repository、迁移命令、handler 测试及工具权限、项目封面引用专项通过。初次后端全量测试未全绿:项目封面测试夹具缺少 tools 表,补齐后专项通过;资源删除 cancelled_output 用例出现 SQLite 锁表,单独复跑通过。修复后未重跑整套后端测试,不将其记录为全量通过。PostgreSQL 实库、真实浏览器和模型调用仍待验收。
侧栏补齐复测:前端生产构建通过,9 个专项文件共 63 项通过(含 4 项侧栏结构守护测试);源码守护不代表浏览器视觉验收通过。
侧栏配色对齐:左侧菜单直接复用画布工具条的 `canvasDockStyle` 和画布主题,统一背景、图标文字、悬停和选中态,保留默认折叠与纵向间距。侧栏与主题隔离专项共 10 项通过,生产构建通过(仍有大分块提示);明暗主题下与工具条的实际视觉一致性仍待登录态页面验收。
移除画布底部独立的「素材 + 数量」悬浮入口,保留左侧资产面板及原有缩放控件;待确认刷新后不再显示该按钮,左侧资产浏览与插入正常。
提示词模板清空回填修复:统一提示词写入器显式同步 `generationSpec.prompt`,避免旧合同覆盖清空或连续编辑后的草稿;已有媒体的原始生成提示词保持不变。新增回归测试先复现失败,修复后提示词、引用、生成引用及工具整合 4 个文件共 48 项通过,TypeScript 类型检查通过。待真实页面确认:图片节点选择模板 → 清空 → 点击画布取消聚焦 → 重新选择节点仍为空;再次修改及保存重载后内容正确。
入口精简与工具草稿复测:移除左侧工具菜单及图片节点提示词模板入口,保留图片风格 / 预设和其他节点模板入口。工具引用列表读取草稿改用空值判断,明确清空时不再从原始生成提示词回读旧标签。风格和预设的选择、替换、连续编辑、标签移除、全文清空及保存重载覆盖有图/空节点两种情况;5 个专项文件共 58 项通过,TypeScript 类型检查通过。实际页面仍需确认普通/放大编辑器均无图片提示词模板入口,以及风格和预设清空后重新聚焦不回填。
主分支提交前复测:前端 `bun run test` 全量 1925 项通过,生产构建、类型检查、UI 退场 lint 通过;构建仍有大分块提示。同步了技能/工具标签结构与多行连接菜单的源码守护断言。后端 `go test ./...` 全量通过,工具、迁移、资源引用、handler 及工具预览权限/项目封面专项通过。本轮未执行真实模型调用、PostgreSQL 实库迁移或登录态浏览器验收,这些项目继续保留待验收。
## 画布媒体交互与 Agent 循环止损复测(2026-09-23)
本轮针对画布媒体节点、生成任务状态及云端 Agent 重复读取问题完成实现和复测。代码仍未提交,以下结论基于当前工作区的专项测试与隔离本地浏览器环境,不代表已部署生产。
- [x] 第三方 API 已提交后,前后端均拒绝取消:任务存在 `providerRequestId`、取消状态、媒体阶段、未知运行阶段或已进入媒体保存阶段时不再显示取消按钮,也不接受取消请求。
- [x] 图片、视频、音频下载改为浏览器直接导航 OSS/CDN 签名地址;不再 `fetch → Blob`,平台只签发短时地址,不中转媒体正文。隔离浏览器下载的 Host 为 `cn-nb1.rains3.com`。
- [x] 生成节点初始状态统一显示“作品创作中”;“正在准备参考素材”和“正在连接上游”等技术阶段也统一映射为该文案。没有上游真实进度时不显示 `0%` 或素材准备假进度,只有上游返回真实进度才显示百分比。
- [x] 图片预览弹窗增加非纯黑加载占位、边框、虚线内框、Spinner、错误态和加载完成淡入;已用 2.5 秒图片响应延迟在浏览器中验证加载态可见。
- [x] 视频节点无持久化 poster 时主动从 OSS/CDN 视频取首帧;已验证首帧静态预览真实显示,视频资源请求返回 Range `206`,持久化 poster 仍优先使用对象存储地址。
- [x] 视频播放器不再因未知音轨默认静音;已验证视频解码音频字节持续增加,`muted=false`,播放期间 `paused=false`,音量滑块可操作并从 100% 调至 85%。
- [x] Agent 只读工具增加同参数缓存、同结果重复回放护栏、跨参数累计 32 次安全上限;识图按画布版本和资源限制重复调用,并受本轮总识图预算约束,超过上限直接结束本轮,避免继续消耗模型调用和 Token。附件事件序列已解析确认事故主要是只读工具循环(`canvas_get_state` 6 次、`canvas_read_storyboard` 2 次、`agent_profile_read` 4 次),不是单一图片识别失败。
- [x] Agent 媒体审批快照忽略节点位置和展示性变化;仅移动节点不会使已审批生成失效,提示词、资源、连接、锁定状态和任务状态等真实生成输入变化仍会使审批失效。
自动验证记录:
- 前端 `bun run test:canvas`:37 项通过;媒体与生成显示专项:36 项通过。
- 前端 `bun run typecheck`、`bun run lint`、`bun run build`:通过;构建仍有既有大 chunk 提示。
- 后端 Agent 读取、识图、审批、媒体依赖专项:通过;资源/OSS、取消、上游进度专项:通过。
- 后端全量 `go test ./...`:未通过,阻断点为既有 `TestPluginViewIncludesDocumentationForEveryOfficialProtocol` 插件视图数量断言(实际 99,对断言期望 97),与本轮媒体和 Agent 修复无直接关系;因此不能记录为后端全量通过。
仍待真实环境验收:
- [ ] 使用真实生产渠道重新执行 Agent 图片识别和“识别多张图片后命名节点”流程;本轮未再次调用付费生产模型。生产渠道仍建议将“最大参考图片数”设为 `0`,不需要识图的渠道不要暴露图片识别能力。
- [ ] 使用真实 Agent 会话完成审批后仅移动节点、再提交生成的端到端验收;后端回归已覆盖该语义,真实模型会话尚未执行。
- [ ] 对含音轨视频做人工听觉验收;当前隔离视频已由浏览器运行时确认音频解码和音量控制可用。
- [ ] 修复或单独核对插件视图数量断言后,再执行后端全量测试;本轮不修改与媒体/Agent 无关的插件注册逻辑。
## Pi Agent runtime 与存储边界预发布验证(2026-09-29)
- 已实现:在线画布 Agent 切换到 Pi 原生会话 runtime;Go 保留权限、工具审批、模型桥和控制检查点,Pi JSONL 会话按运行 ID 持久化;画布能力工具、错误映射、技能渐进读取、运行时镜像依赖和存储运行策略已有回归覆盖。
- 已修正验证门禁:旧的 2026-09-23 记录称 `TestPluginViewIncludesDocumentationForEveryOfficialProtocol` 固定期望 97、实际 99;当前断言已改为根据官方包和内置插件动态计算数量,该专项现已通过。不要把该历史记录当作当前未解决的失败。
- 本地自动验证:后端 `go test ./... -count=1 -timeout=15m` 全量通过;PostgreSQL 资产迁移、资源字节修复及画布版本历史依赖用例通过。前端类型检查、退场 lint、全量测试(2096 项)和生产构建通过;文档站 `bun run types:check` 通过。
- 本机没有 `redis-server`,因此 Redis 租约及缓存白名单两个真实 Redis 用例在全量本地运行中会跳过;质量工作流已安装 Redis、连接 PostgreSQL,并强制检查 5 个依赖型用例均真实执行并通过。需以 GitHub Actions 的结果作为合并/发布门禁。
仍待真实环境验收:
- [ ] GitHub Actions 确认 PostgreSQL / Redis 依赖测试、前后端检查、支付插件双架构 smoke 和 amd64/arm64 镜像构建全部通过后再部署。
- [ ] 部署后使用真实登录态验证 Agent 多轮会话、Skill 按需读取、工具审批/继续、进程重启后的会话恢复,以及用户/画布之间的会话隔离;不以健康检查替代该链路。
- [ ] 在隔离数据库备份上验收 schema v42 的 `cloud_agent_pi_sessions` 迁移与回滚方案;不得在生产服务器手工改数据库或代码。
## Agent 角色卡读取与图文参考待验收
画布角色卡仍为 `text` 节点,但角色设定由项目角色资产按当前版或固定版读取;Agent 的节点目录标注 `kind: character`,精读返回角色设定、形象/声音状态及图片参考就绪情况,不再把空 `content` 当作空角色卡。选择角色卡作为媒体参考时,后端从同一角色版本解析三视图图片,并把角色设定加入本次生成提示词;只选 `sourceNodeId` 则使用文字设定。审批期间角色版本变化会阻止旧输入提交。生成仍需用户确认或符合 auto 准入,不在读取时发起付费任务。
待登录态页面验收:对「扶颦」精读应返回实际外貌和服装;选择该卡生成时,审批/任务输入应同时包含该版设定与已绑定三视图;故意改动角色版本后旧审批不能提交。声音档案可精读,音频任务在未显式选择音色时采用角色绑定的 voiceKey 与声音指令;跨模型适配及真实音色效果仍需单独验收。此轮不代表生产已部署。
## 存储满额生成拦截与 Live2D 开关稳定性(2026-09-30)
- 已修复:图片、视频、音频生成任务在创建、积分预留和上游调用之前检查账号文件容量;容量已满时返回配额错误并提示先清理素材,文本任务不受文件容量限制。普通画布与 Agent 媒体生成共用该 admission 边界。
- 已修复:Agent 面板开合时保留 Live2D 入口组件和已加载模型,仅隐藏入口并暂停不可见渲染,不再因反复卸载、重建 PIXI/Live2D 上下文而短暂回退默认动态球。
- 自动验证:后端纯 admission 专项测试通过(CGO 关闭,3 项);前端 Live2D 生命周期专项测试通过;前端生产构建通过。既有 Agent 位置测试在当前 Windows 环境因 Bun 将磁盘路径解析为 `/E:/...` 而未进入测试逻辑。
仍待真实环境验收:
- [ ] 将测试账号文件容量填满后,从普通画布和 Agent 分别提交图片、视频、音频生成,确认立即显示容量提示、没有创建计费订单、没有调用上游;清理出容量后可恢复生成。
- [ ] 使用自定义 Live2D 模型连续开合 Agent 面板,确认不出现默认动态球闪回,拖动、窗口缩放和重新进入画布仍正常。
## 后台存储资源用户筛选(2026-09-30)
- 已修复:后台存储资源列表的用户筛选不再只接受完整用户 ID;现在支持按用户 ID、用户名、昵称和邮箱进行不区分大小写的模糊匹配,并可与资源类型、状态、存储位置、资源关键词组合使用。
- API 新增可读性更高的 `user` 查询参数,后端继续兼容旧 `userId` 参数;前端请求同时发送两者,避免滚动升级期间旧后端忽略新参数并错误返回全量资源。
- 自动验证:后台 UI 回归 17 项通过;前端生产构建通过;后端参数规范化专项通过。SQLite 集成用例已补充四种用户字段匹配,但当前 Windows 本机 CGO/GCC 无法解析生成的对象文件,未在本机实际执行该数据库用例。
仍待真实环境验收:
- [ ] 在管理员后台存储资源页分别输入完整/部分用户名、昵称、邮箱和用户 ID,确认返回同一用户资源;再叠加类型、状态和存储位置筛选,确认分页与清空筛选正常。
## 平台技能策展
SQLite 与 HTTP recorder 已验证;PostgreSQL 16/17、前端构建及浏览器中的开关、分类维护、市场/技能库筛选、分页与明暗主题待验证。
一级分类还需 PostgreSQL 验证 46→47 与并发改归/删除,以及浏览器图示、根停用默认桶与空根表回落。handler 全套涉及 socket,受限环境中未完成。
## 画布角色与媒体引用顺序一致性
- 已实现:普通图片、角色主图、绘图共享图片编号,编辑器保留 `@图片N`、`@角色N`、`@绘图N` 类型前缀,提交模型时统一映射为实际图片数组的 `@图片N`。引用先后按连接槽位确定,逆序提及不会重排资源;拖动引用后按节点身份同步编号,中文紧邻及连续引用可正常解析,多位数字不会被部分替换。
- 已实现:角色主图占据原槽位,素材库图片保留自身资源身份,去重后的补充视角追加到主图之后。关闭角色设定注入时仍保留角色与参考图、声音样本的对应关系;多角色共用声音样本只发送一份。
- 已实现:前端解析到的角色版本与固定版本不一致、图片/视频角色缺少主参考图、模型参考容量不足、角色授权或资源读取失败时阻止提交。文本/音频允许没有主图的角色,并将其提及改为角色名、重新对应后续图片编号。
- 自动验证:前端 `bun run test` 全量 2203 项通过,类型检查、lint、冻结锁文件安装检查通过;`bun --bun run build` 通过,仍有大分块提示。普通构建命令首次因本机 Node 子进程缺少 TypeScript Darwin x64 包失败,显式使用 Bun 运行时后通过,未修改依赖版本或构建脚本。后端 `go test ./internal/app -run 'TestCloudAgent(Media|Character)' -count=1` 通过,修改的 Go 文件符合 gofmt。
- Web checks 回归:更新时间轴容器、小屏抽屉、生命周期依赖及访客创作路由的过期源码断言,相关 45 项测试通过;真实 Chrome 预演台 E2E 65 项断言通过,覆盖模式时间轴切换、模型加载/重试/加载中删除、WebGL 恢复和保存失败关闭保护。
仍待真实环境验收:
- [ ] 在登录态画布混合连接两张角色卡、普通图片、绘图及素材库图片,调整顺序、编辑提示词、保存重载并重试任务,核对编辑器标签与任务参考数组一一对应。
- [ ] 在支持声音参考的视频模型上核对多角色共用样本、已有音频与角色声音样本的编号;通过真实模型验证外观与音色效果。本轮未调用付费模型,未执行整套后端及 PostgreSQL/Redis 集成测试。
## 创作首页纵深画廊与灵感库
- 已实现:创作首页纵深画廊、灵感页 `/inspirations`、外部提示词导入脚本与本地缩略图。
- [x] 浏览器验收画廊 23 项:层次递减且左右对称、三段提示词信息、玻璃描边与圆角、滚轮/左右按钮切换、按钮悬停不下移、按创作类型过滤、点击卡片把提示词填进编辑器。
- [x] 浏览器验收灵感页 24 项:侧栏入口位于「创作」下方、分类与来源筛选、搜索、详情正文、收藏、新建与删除、跳转创作页带回提示词、JSON 导入导出。
- [x] `bunx tsc --noEmit` 通过。
- [ ] 在低带宽的真实链路上确认首屏画廊出图时间,以及弱网下画廊池 JSON 拉取失败时退回打包原创条目的表现。
- [ ] 窄屏(≤1100px、≤640px)下确认画廊卡片不被裁切、灵感页分页与筛选可用,并检查明暗主题。
- [ ] 文本创作类型目前只有 9 条原创条目,画廊池暂无文本条目,仍会重复出现,待补数据。
- [ ] 外部来源(awesome-seedance、好好学 AI、YouMind)的署名与许可声明尚未在页面展示,待定。
## 节点补丁字段基线
- 已修复:节点可选字段的 undefined 在 JSON 操作请求中转换为 null,避免基线或删除值被丢弃;缺省与 undefined 的变化不提交。旧队列只使用原始快照恢复无效补丁,保留 mutationId,不使用当前云端值替代基线。
- [x] 专项测试覆盖新增/删除可选字段的真实 JSON 序列化、旧空补丁恢复、有效请求不变、缺少原快照不猜测以及无效变化不发送。
- [x] 用户确认原先 Agent 发消息前“节点补丁缺少字段基线”的场景恢复正常。
- [ ] 在多标签页同时修改字段并重试旧队列,确认服务端仍拒绝同字段冲突;本次未修改服务端并发校验。