Feat/pixel art #119

Merged
kdletters merged 19 commits from feat/pixel_art into master 2026-07-29 21:38:12 +08:00
Owner

1 添加完美像素功能
2 修复自动拆分素材的功能漂移

1 添加完美像素功能 2 修复自动拆分素材的功能漂移
lhk229 added 5 commits 2026-07-29 15:07:12 +08:00
新增确定性像素网格规整模块并保留第三方 MIT 许可证。

为普通图片、角色和图标图集接入像素艺术选项、并发预算和失败降级。

同步前端交互、请求契约、OpenAPI、项目文档与测试。
移除前端从提示词解析素材数量的逻辑,完整提示词作为单个请求元素提交。

删除后端按描述数量截断切片的路径,自动拆分与手动拆分复用全连通域算法。

统一切片命名和尺寸、像素、数量限制,保留手动拆分按钮与接口。

更新既有测试、OpenAPI、编辑器文档和共享决策记录。
将相邻边缘峰间距由中位数改为线性插值 P30。

同步更新像素规整技术方案和共享决策记录。
将生成图标素材的 flat 请求固定切换为 cross_check=on。

同步调整现有结构断言与编辑器、后端和共享决策文档。
合并 web master 最新更新
Project CI / Frontend tests (pull_request) Failing after 52s
Project CI / Repository checks (pull_request) Successful in 1m2s
Project CI / Native shell tests (pull_request) Successful in 2m10s
Project CI / Backend tests (pull_request) Successful in 3m28s
fae6f00c9f
将 web/master 的画布快照、图集标签和 Agent 框架更新合入像素艺术功能分支。

# Conflicts:
#	docs/project-memory/shared-memory/decision-log.md
#	server-rs/crates/api-server/src/external_editor_api.rs
kdletters added this to the 美术画布 project 2026-07-29 15:30:04 +08:00
lhk229 added 3 commits 2026-07-29 17:34:37 +08:00
修正图标生成恢复时空提示词对旧描述的阻断。

删除移动端生成按钮重复的宽度声明。
restore_editor_generated_image_output_dimensions 在本分支把
restore_editor_generated_image_output_dimensions_or_original 改为转发到
_with_filter 之后失去全部生产调用者,仅剩单测在用,非测试构建报 dead_code。

删除该包装函数,改由测试直接调用 _with_filter 并显式传 Lanczos3。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
合并 web master 角色交付尺寸统一
Project CI / Frontend tests (pull_request) Failing after 5m43s
Project CI / Repository checks (pull_request) Successful in 5m48s
Project CI / Native shell tests (pull_request) Successful in 7m49s
Project CI / Backend tests (pull_request) Successful in 8m50s
717b94aad8
接受 master 的角色带背景原图与透明图统一交付尺寸方案,像素模式不再
豁免提前归一:逻辑像素规整改在按业务像素矩阵 resize_to_fill(Lanczos
重采样 + 居中裁切)后的交付尺寸图上进行,snapper 自行还原回输入尺寸,
删除原先后置的 nearest 二次恢复及其 pixel_art_applied 开关。

后处理降级告警合并两侧机制:postprocess 失败路径改用 master 的
_with_dimension 重载并继续经 merge_editor_generation_warnings 汇总;
成功路径补回 master 的 dimension_warning,避免自动合并将其丢弃。

结构断言改为只固定 editor_postprocess_fallback_warning 共同前缀。
decision-log 保留双方新决策条目,并修订像素艺术条目中已过时的
"provider 原尺寸分析网格"表述。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
lhk229 added 1 commit 2026-07-29 17:47:48 +08:00
补齐生成 payload 新增 style 字段的测试断言
Project CI / Repository checks (pull_request) Successful in 3m32s
Project CI / Frontend tests (pull_request) Successful in 5m6s
Project CI / Native shell tests (pull_request) Successful in 6m32s
Project CI / Backend tests (pull_request) Successful in 7m50s
9655324dea
useImageCanvasGenerationWorkflow.test.tsx 用 toHaveBeenCalledWith 精确匹配
普通图片生成 payload,本分支为该 payload 增加 style 字段后未同步该文件,
CI 前端测试报 "+ style: none"。

该文件不在本分支改动清单内,故此前未被发现。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
lhk229 marked the pull request as ready for review 2026-07-29 17:51:34 +08:00
lhk229 added 1 commit 2026-07-29 19:19:15 +08:00
修复像素规整降级绕过交付尺寸守卫
Project CI / Repository checks (pull_request) Successful in 1m4s
Project CI / Frontend tests (pull_request) Successful in 2m1s
Project CI / Native shell tests (pull_request) Successful in 2m26s
Project CI / Backend tests (pull_request) Successful in 3m28s
a7d8bccec9
像素路径的 best-effort 降级分支(预算耗尽、回读 provider 原图失败或超时、
CPU permit 获取失败、worker 内 deadline、join 异常、worker 超时)此前都直接
返回 BgFilter 原始输出并把尺寸错误置为 None,跳过非像素路径已有的尺寸比对
与 alpha 回贴。BgFilter 回图尺寸漂移叠加并发上限 2 的 permit 超时后,角色会
绕过原图安全降级,角色和图标都可能持久化尺寸漂移的低分辨率透明图。

新增 degrade_editor_pixel_art_to_postprocessed_with_dimension_guard 收口所有
降级分支,复用非像素路径的守卫:尺寸一致原样返回且不产生额外 OSS GET,漂移
才回读原图重贴 alpha,修复失败返回尺寸错误交调用方降级。由 provider 原图合成
的 rgba_source fallback 尺寸天然正确,不经守卫。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
lhk229 added 1 commit 2026-07-29 19:27:24 +08:00
修复角色尺寸恢复降级覆盖已累积生成告警
Project CI / Repository checks (pull_request) Successful in 50s
Project CI / Frontend tests (pull_request) Successful in 2m6s
Project CI / Native shell tests (pull_request) Successful in 2m35s
Project CI / Backend tests (pull_request) Successful in 3m35s
49965ddd7e
generate_editor_image_for_owner 的角色透明图尺寸恢复失败分支直接返回
warning: Some(...),没有合并 generation_warning,导致 style 为未知值时
契约承诺的 unsupported-image-style 告警在该降级路径上消失。

改为经 merge_editor_generation_warnings 合并,与该函数另外两个返回点一致。
新增结构断言固定"普通图片与图标生成的所有返回点都不得出现裸 warning: Some(",
并同步角色降级断言到合并后的形状。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
lhk229 added 1 commit 2026-07-29 19:44:48 +08:00
修复队列与 Web 吞掉并存的 sliceWarning
Project CI / Repository checks (pull_request) Successful in 1m3s
Project CI / Frontend tests (pull_request) Successful in 1m59s
Project CI / Native shell tests (pull_request) Successful in 2m25s
Project CI / Backend tests (pull_request) Successful in 3m28s
8ed85e17f4
风格归一化与像素规整新增的通用 warning 可以与 sliceWarning 并存,openapi
已放开该组合,但两个消费端仍是二选一:队列 extract_editor_generation_warning
在 warning 存在时根本不读 sliceWarning,Web inline
resolveEditorGenerationWarningMessage 同样直接返回通用告警。

两侧改为与 inline 响应相同的归一策略:只有一条时原样保留,两条并存时按
"通用在前、拆分在后"拼接,队列侧 code 收敛为 multiple-generation-warnings
并复用既有长度上界收敛。同步修正三处仍声明二者互斥的文档。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
lhk229 added 1 commit 2026-07-29 20:02:03 +08:00
同步剩余文档的双告警并存规则
Project CI / Repository checks (pull_request) Successful in 1m0s
Project CI / Frontend tests (pull_request) Successful in 2m7s
Project CI / Native shell tests (pull_request) Successful in 2m36s
Project CI / Backend tests (pull_request) Successful in 3m42s
414735efde
外部编辑器 API 技能文档、外部生成 Worker 化方案和图片画布编辑器 MVP
接入方案仍写着通用 warning 与 sliceWarning 互斥、并以通用告警优先,与
已放开并存的 openapi 契约和 8ed85e17f 的队列 / inline 归一实现不一致。

四处统一改为:仅 postprocess-failed-source-preserved 与 sliceWarning 互斥
(该失败不进入拆分),风格归一化与像素规整产生的通用 warning 可与
sliceWarning 并存且两条都必须展示;同步补充队列侧的拼接与 code 收敛规则。

UI 设计图素材提取不接受 style 参数也不走像素规整,其文档中的互斥表述
仍然成立,未改动。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
kdletters requested changes 2026-07-29 20:14:09 +08:00
Dismissed
kdletters left a comment
Member

结论:发现 2 个 P1、5 个 P2,暂不建议合并。审查基于最新 head 414735ef,base/merge-base 为 3a64411e

主要问题

  1. [P1] 图标像素模式忽略尺寸安全降级错误
    server-rs/crates/api-server/src/editor_project.rs:4738-4781
    尺寸/比例恢复失败后仅记录日志,随后仍持久化并切分错误尺寸的 BgFilter 输出。角色路径会退回已保存原图,图标路径没有,可能生成错比例图集和切片。

  2. [P1] 64 片上限挡不住连通域算法的平方级计算
    server-rs/crates/platform-image/src/generated_asset_sheets/sheet.rs:345-400
    合并阶段先对全部连通域执行双重遍历,API 到 editor_project.rs:5083 才检查 64 片上限。合法 2048² 图集可构造约 16.8 万个 4×4 独立块,首次遍历即约 282 亿次比较,而且同步运行在 async handler 上,存在 CPU 耗尽风险。

  3. [P2] 同源重绘丢失 pixelArt 选项
    src/components/image-editor/ImageCanvasGenerationDialogModel.ts:746-791
    restoreSharedImageOptions() 只恢复模型、比例和尺寸,没有恢复 sourceDialog.style。普通图、角色和图标再次生成时会静默回到 none。测试第 613-624 行甚至把这一错误行为固定成了预期。

  4. [P2] 像素处理超时后可能再次无 deadline 读取 OSS
    editor_project.rs:3262-3290
    第一次原图读取超时后进入尺寸守卫;若 BgFilter 图尺寸漂移,守卫在 3119-3124 再发起一次无绝对 deadline 的 GET,突破 30 秒预算并重复请求同一对象。

  5. [P2] 像素规整专题文档仍描述旧执行顺序
    docs/【编辑器】画板角色形象生成入口设计-2026-06-15.md:68-71docs/technical/【前端架构】图片画布编辑器MVP接入方案-2026-06-11.md:39-42
    文档仍称在最终尺寸处理前规整、之后 nearest 恢复且不经 Lanczos;当前代码已先用 Lanczos 收口交付尺寸,再去背和规整。

  6. [P2] 外部 API 文档仍称 warning 只有一个稳定 code
    docs/【后端架构】外部OpenAPI与APIKey接入方案-2026-06-19.md:45
    实际 OpenAPI 已公开四个 code,包括 dimension-restore-fallbackunsupported-image-stylemultiple-generation-warnings

  7. [P2] 外部编辑器 skill 漏掉新增 style 参数
    .codex/skills/genarrative-external-editor-api/references/api-selection.md:70,72
    图片、图标生成端点的可选字段和示例都没有 style,按仓库强制 skill 接入的 Agent 无法得知如何启用确定性像素规整。

状态与验证

  • Gitea CI run 445:Repository、Frontend、Backend、Native 四项全部通过。
  • PR 无评论、无 review,当前无冲突。
  • 定向验证通过:前端 263 项、platform-image 全部测试、api-server generation/editor_project 相关测试、Rustfmt、编码检查和 git diff --check
  • 12 个提交标题均为中文且有正文,提交规范没有额外阻塞。
  • 未修改任何文件。
结论:发现 **2 个 P1、5 个 P2,暂不建议合并**。审查基于最新 head `414735ef`,base/merge-base 为 `3a64411e`。 ### 主要问题 1. **[P1] 图标像素模式忽略尺寸安全降级错误** `server-rs/crates/api-server/src/editor_project.rs:4738-4781` 尺寸/比例恢复失败后仅记录日志,随后仍持久化并切分错误尺寸的 BgFilter 输出。角色路径会退回已保存原图,图标路径没有,可能生成错比例图集和切片。 2. **[P1] 64 片上限挡不住连通域算法的平方级计算** `server-rs/crates/platform-image/src/generated_asset_sheets/sheet.rs:345-400` 合并阶段先对全部连通域执行双重遍历,API 到 `editor_project.rs:5083` 才检查 64 片上限。合法 2048² 图集可构造约 16.8 万个 4×4 独立块,首次遍历即约 282 亿次比较,而且同步运行在 async handler 上,存在 CPU 耗尽风险。 3. **[P2] 同源重绘丢失 `pixelArt` 选项** `src/components/image-editor/ImageCanvasGenerationDialogModel.ts:746-791` `restoreSharedImageOptions()` 只恢复模型、比例和尺寸,没有恢复 `sourceDialog.style`。普通图、角色和图标再次生成时会静默回到 `none`。测试第 `613-624` 行甚至把这一错误行为固定成了预期。 4. **[P2] 像素处理超时后可能再次无 deadline 读取 OSS** `editor_project.rs:3262-3290` 第一次原图读取超时后进入尺寸守卫;若 BgFilter 图尺寸漂移,守卫在 `3119-3124` 再发起一次无绝对 deadline 的 GET,突破 30 秒预算并重复请求同一对象。 5. **[P2] 像素规整专题文档仍描述旧执行顺序** `docs/【编辑器】画板角色形象生成入口设计-2026-06-15.md:68-71`、`docs/technical/【前端架构】图片画布编辑器MVP接入方案-2026-06-11.md:39-42` 文档仍称在最终尺寸处理前规整、之后 nearest 恢复且不经 Lanczos;当前代码已先用 Lanczos 收口交付尺寸,再去背和规整。 6. **[P2] 外部 API 文档仍称 warning 只有一个稳定 code** `docs/【后端架构】外部OpenAPI与APIKey接入方案-2026-06-19.md:45` 实际 OpenAPI 已公开四个 code,包括 `dimension-restore-fallback`、`unsupported-image-style` 和 `multiple-generation-warnings`。 7. **[P2] 外部编辑器 skill 漏掉新增 `style` 参数** `.codex/skills/genarrative-external-editor-api/references/api-selection.md:70,72` 图片、图标生成端点的可选字段和示例都没有 `style`,按仓库强制 skill 接入的 Agent 无法得知如何启用确定性像素规整。 ### 状态与验证 - Gitea CI run 445:Repository、Frontend、Backend、Native 四项全部通过。 - PR 无评论、无 review,当前无冲突。 - 定向验证通过:前端 263 项、`platform-image` 全部测试、`api-server` generation/editor_project 相关测试、Rustfmt、编码检查和 `git diff --check`。 - 12 个提交标题均为中文且有正文,提交规范没有额外阻塞。 - 未修改任何文件。
Author
Owner

[P1] 64 片上限挡不住连通域算法的平方级计算
server-rs/crates/platform-image/src/generated_asset_sheets/sheet.rs:345-400
合并阶段先对全部连通域执行双重遍历,API 到 editor_project.rs:5083 才检查 64 片上限。合法 2048² 图集可构造约 16.8 万个 4×4 独立块,首次遍历即约 282 亿次比较,而且同步运行在 async handler 上,存在 CPU 耗尽风险。
[P1] 图标像素模式忽略尺寸安全降级错误
server-rs/crates/api-server/src/editor_project.rs:4738-4781
尺寸/比例恢复失败后仅记录日志,随后仍持久化并切分错误尺寸的 BgFilter 输出。角色路径会退回已保存原图,图标路径没有,可能生成错比例图集和切片。
Master即存在
[P2] 同源重绘丢失 pixelArt 选项
src/components/image-editor/ImageCanvasGenerationDialogModel.ts:746-791
restoreSharedImageOptions() 只恢复模型、比例和尺寸,没有恢复 sourceDialog.style。普通图、角色和图标再次生成时会静默回到 none。测试第 613-624 行甚至把这一错误行为固定成了预期。
非BUG

[P1] 64 片上限挡不住连通域算法的平方级计算 server-rs/crates/platform-image/src/generated_asset_sheets/sheet.rs:345-400 合并阶段先对全部连通域执行双重遍历,API 到 editor_project.rs:5083 才检查 64 片上限。合法 2048² 图集可构造约 16.8 万个 4×4 独立块,首次遍历即约 282 亿次比较,而且同步运行在 async handler 上,存在 CPU 耗尽风险。 [P1] 图标像素模式忽略尺寸安全降级错误 server-rs/crates/api-server/src/editor_project.rs:4738-4781 尺寸/比例恢复失败后仅记录日志,随后仍持久化并切分错误尺寸的 BgFilter 输出。角色路径会退回已保存原图,图标路径没有,可能生成错比例图集和切片。 **_Master即存在_** [P2] 同源重绘丢失 pixelArt 选项 src/components/image-editor/ImageCanvasGenerationDialogModel.ts:746-791 restoreSharedImageOptions() 只恢复模型、比例和尺寸,没有恢复 sourceDialog.style。普通图、角色和图标再次生成时会静默回到 none。测试第 613-624 行甚至把这一错误行为固定成了预期。 **_非BUG_**
lhk229 added 1 commit 2026-07-29 20:29:55 +08:00
消除像素规整降级路径的重复与无界 OSS 回读
Project CI / Repository checks (pull_request) Successful in 1m0s
Project CI / Frontend tests (pull_request) Successful in 2m1s
Project CI / Native shell tests (pull_request) Successful in 2m26s
Project CI / Backend tests (pull_request) Successful in 3m28s
937378ab91
尺寸守卫此前一律走会回读 provider 原图的包装函数,带来两个问题:permit
获取失败、worker 内 deadline、join 异常和 worker 超时这四条分支其实已经
持有原图,却又对同一 object key 发起第二次 GET,把"最多增加一次 OSS GET"
放大成两次;而第一次回读超时后的那次 GET 完全没有绝对 deadline,突破
30 秒像素预算。

拆成两类:已持有原图的四条分支改走纯内存守卫 degrade_editor_pixel_art_
with_provider_source,零额外 GET;尚未取得原图的三条分支仍走回读守卫,
但该次 GET 改以外层请求 deadline 为绝对上界——用已耗尽的像素预算绑会让
修复必然失败,不绑则突破预算。

apply_editor_postprocessed_alpha_from_persisted_provider_source_or_original
新增可选 download_deadline,非像素路径传 None 保持既有语义;尺寸比对抽为
editor_postprocessed_alpha_matches_delivery_dimensions 供两类守卫共用。
计数断言固定"回读守卫 3 处、内存守卫 4 处",该断言在编写时即抓出一处
分支数误判。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
lhk229 added 1 commit 2026-07-29 20:41:15 +08:00
修正文档中的像素规整与外部 API 契约
Project CI / Repository checks (pull_request) Successful in 1m2s
Project CI / Frontend tests (pull_request) Successful in 2m2s
Project CI / Native shell tests (pull_request) Successful in 2m30s
Project CI / Backend tests (pull_request) Successful in 4m2s
bc486aaff5
同步角色与图片画布文档的 Lanczos、去背和像素规整执行顺序
补全外部 OpenAPI 四个稳定 warning code 的语义
为外部编辑器 skill 补充顶层 style 参数、兼容规则和请求示例
lhk229 added 1 commit 2026-07-29 20:43:20 +08:00
修正图标像素规整专题执行顺序
Project CI / Frontend tests (pull_request) Successful in 1m53s
Project CI / Repository checks (pull_request) Successful in 45s
Project CI / Native shell tests (pull_request) Successful in 2m20s
Project CI / Backend tests (pull_request) Successful in 3m32s
fefea643aa
明确图标图集以 provider 原图实际尺寸完成 Alpha 回贴与像素规整
删除规整后仍有独立最终尺寸处理的旧描述
说明 snapper 内部 nearest 与角色前置 Lanczos 的边界
lhk229 added 1 commit 2026-07-29 20:56:51 +08:00
收窄像素规整尺寸守卫的生效范围表述
Project CI / Repository checks (pull_request) Successful in 1m16s
Project CI / Frontend tests (pull_request) Successful in 2m4s
Project CI / Native shell tests (pull_request) Successful in 2m29s
Project CI / Backend tests (pull_request) Successful in 3m31s
9a37deeaf0
决策记录原文写「修复失败返回尺寸错误交由调用方降级」,读起来像是角色和
图标两条链路都会降级。实际上守卫只保证像素路径不再谎报「尺寸无误」,
拿到尺寸错误之后如何处置仍由各调用方既有语义决定,本次未改动任何调用方。

改为显式写明生效范围:角色据此走原图安全降级、链路闭环;图标沿用 master
既有的非致命语义,只记录告警后继续持久化并拆分,因此 BgFilter 尺寸漂移且
回贴修复失败时仍可能持久化尺寸异常的透明图集,该残留属 master 既有行为,
不在本次范围内解决。守卫断言的注释同步收窄。

仅调整表述,不改代码行为,不新增承诺。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
lhk229 added 1 commit 2026-07-29 21:12:36 +08:00
修复 inline 路径修复性回读缺少绝对 deadline
Project CI / Repository checks (pull_request) Successful in 1m6s
Project CI / Native shell tests (pull_request) Successful in 2m28s
Project CI / Backend tests (pull_request) Successful in 3m30s
Project CI / Frontend tests (pull_request) Successful in 1m14s
bc28f00c2d
上一轮把修复性回读绑到外层 request_deadline,但 with_external_call_deadline
只在队列 worker 与 openai_image_generation 两处调用,inline HTTP 请求的
RequestContext 默认 external_call_deadline=None,于是 download_deadline 传下去
仍是 None,走无界 download.await——该修复实际只对队列模式生效。

守卫改为在 request_deadline 缺失时自行以 Instant::now() +
EDITOR_PIXEL_ART_MAX_PROCESSING_DURATION 重新计时派生上界,两种模式下都不再
出现无界 GET。结构断言同时要求出现 unwrap_or_else 兜底与该常量。

同时修正决策记录里「最多增加一次 OSS GET」的措辞:约束是不重复读取已成功
取得的对象,而非整个请求至多一次 GET;第一次回读失败或被像素预算掐断时
允许第二次也是最后一次尝试,不视为违规。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Author
Owner

测试验的是代码形状不是真实 GET 次数,要验真实次数需要可注入的 OSS 测试替身,仓库目前没有这套基建。

测试验的是代码形状不是真实 GET 次数,要验真实次数需要可注入的 OSS 测试替身,仓库目前没有这套基建。
lhk229 added 1 commit 2026-07-29 21:23:22 +08:00
修复画布图层查询在重渲染窗口下的测试竞态
Project CI / Repository checks (pull_request) Successful in 1m0s
Project CI / Frontend tests (pull_request) Successful in 2m1s
Project CI / Native shell tests (pull_request) Successful in 2m31s
Project CI / Backend tests (pull_request) Successful in 3m41s
5ec7182d65
only exposes character animation generation 用例先 await findByAltText 取到
第一个图层,再用同步 getByAltText 取第二个。合并 web master 带入的项目封面
快照改动会在图层落位后触发一次重渲染,同步查询正好落进该窗口就取不到元素,
CI 962 因此失败。

该写法在 master 上逐字相同,属既有竞态,非本分支引入;但它挡住本 PR 的 CI,
故改为异步查询容忍这次重渲染,不改变断言语义与产品代码。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
kdletters approved these changes 2026-07-29 21:38:03 +08:00
kdletters merged commit 2cb40f246a into master 2026-07-29 21:38:12 +08:00
kdletters deleted branch feat/pixel_art 2026-07-29 21:38:12 +08:00
Sign in to join this conversation.