# CHANGELOG
## 0.6.0 — 2026-11-04
本轮主线:**工作台从四块界面长到六块**,并且把「测试全绿、真机不通」这类问题变成结构性检查。
- **两个新的参考库组件**:姿势库(288 组 / 1439 个角度)、衣装库(1407 套,每条带英文关键词)。
都是"元数据随包、图经服务端代理按需取",共用一套取图实现(磁盘缓存 / 单飞 / 失败冷却 / 字节头校验)。
- **标签库扩到四类 99372 条**,带语义大类筛选、滚到底自动加载、「更新标签」按钮。
- **工作流面板支持上传 / 粘贴导入**(同名不静默覆盖,旧模板留 `.bak`)。
- **写了三条结构性检查**:写接口必须有走真实入口的用例、页签与组件诊断表必须对齐、
样式不许写成 TS 字符串。它们各自都当场抓到过真问题。
- **几个只在真机上现形的 bug**:中间产物混进资产库、固定 seed 的图被列表去重吞掉、
外壳样式在 SSR 里整段丢失(React 19 只接受单个字符串 child)。
- **工具描述补上关键行为**:提交任务会自动拉起 ComfyUI,不需要先手动启动、也不该 kill 它。
- 「提示词参考」子页签**已停用**(代码保留,理由见下),参考面板换成 Danbooru posts 后又整体关掉。
### 修复:固定 seed 跑出来的图被列表去重吞掉
用户报告某个会话里最新跑的两张图没进资产库。
查下来:两张图在磁盘上、在 `assets.jsonl` 索引里(`status: present`)、也在 `runs.json` 的
artifacts 里 —— 但 `/api/items` 的 244 条里没有它们,而同目录更早的一张却在。
`?dedupe=0` 时是 **451 条**、那两张排在最前两位:**去重把它们吃掉了**。
根因:`duplicateKey` 只用 `seed|宽x高|提示词` 做签名。用户这几张的 seed 都是固定值、
尺寸相同、提示词模板相同(只换了服装),于是**不同运行产出的不同图**被判成"同一张图的副本"。
一次固定 seed 的系列跑几乎全被吞掉(451 → 244)。
修法:签名里加 `promptId`(sidecar 的 `comfy.promptId`,那次运行的唯一标识)。
**只有同一次运行的多份副本才合并**;拿不到 `promptId` 就不合并 —— 宁多勿错。
代价要说清:这会让"ComfyUI 自己存一份 + 插件另存一份"那种跨来源副本不再自动合并
(ComfyUI 那份是 PNG 内嵌块,没有 `comfy.promptId`)。资产库里可能看到更多重复条目,
但不会再吞掉真正不同的图 —— 用户报的就是被吞,这个方向的错更贵。
`npm test` **503/503**(新增 7 条:`tests/dedupe.test.mjs`)。
### 修复:中间产物不再混进资产库
用户测动作控制工作流时发现:depth 中间图和成品一起进了资产库。
根因:那个工作流(`moss_dual_pose_api`)有两个 SaveImage ——
node 17 存 `VAEDecode` 的结果(成品),node 18 存 `ImageScaleToTotalPixels` 的结果
(depth)。而 depth 那个节点的输出**同时**喂给 `ControlNet` 和这个 SaveImage。
原来的过滤只排 preview 节点与 `type=temp`,两个都是 `SaveImage` + `type=output`,
于是两个都当产物下载、都进了资产库。
修法:`intermediateSaves(workflow)` —— 一个 SaveImage 的**图片来源如果还被别的计算节点
消费**,它存的就是流程中间结果,标成 `kind='intermediate'`。判据取自数据流,不猜文件名。
审查用本机 40 个工作流模板做了改前/改后差异对比,抓出 3 条必修,都修了:
1. **兜底链缺一档**:只有「正式产物 → 含 temp 的正式产物 → 全都要」三档时,一个"唯一
保存节点被判成中间产物"的工作流会掉到最后一档,把 `PreviewImage` 的临时预览一起收进来
(某个模板实测 1 张变 8 张)。补上「仅中间产物」这一档,抽成纯函数 `pickArtifacts` 并
用四条断言钉住(这一层原来埋在 `collectArtifacts` 里,零覆盖)。
2. **文案把中间产物说成预览图**:跳过计数里混着两种东西,笼统写成"已跳过 N 张预览图"
是在撒谎。拆成 `skippedPreview` 与 `dropped` 两个数,分两句话说。
3. **误伤是静默的**:两段式放大/精修工作流的"前一段 SaveImage"也会被这个判据排掉
(本机 `civitai-wai-nsfw-v13` 少了 `223:SaveImage←118`、`civitai_img2img-facedetailer`
少了 `284:SaveImage←50`),而那张往往正是用户想看的。现在把被跳过的中间产物写进
`notes`,并给出出路(去 ComfyUI 自己的输出目录取,或加进 `assetRoots`)。
顺带:`PreviewBridge` 不再算保存节点 —— 它是"把预览图传给下游继续算"的中转节点、不落盘。
**只治未来不治过去**:这次改动不影响已经下载到 outputDir 的中间产物,目录里既有的
`*_depth_*.png` 仍在,资产库照旧显示,需要手动删(或删掉重跑)。
`npm test` **496/496**(新增 9 条:`tests/artifact-kind.test.mjs`)。
### 修复:外壳的四份样式在 SSR 里整段丢失(既存缺陷)
`Workbench.tsx` 一直写的是 ``
(四个相邻 child)。React 19 的 SSR 对 ``。
**根因不是"`