Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions ACCEPTANCE-REPORT.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,3 +177,55 @@
2. `gpt-image-2` 局部改图可对非目标区域产生轻微纹理重绘,并可能等比缩小;本次目标文字和保留文字均通过,无需重试。
3. 当前上游不提供 `/v1/files`,路线图会记录一次 404 warning 并自动回退内联参考图;本次回退成功,不影响最终结果。
4. 无鉴权验收实例没有生成图片数据库 ID,Logo 最终成品层在浏览器完成;鉴权生产实例会通过既有 final-image API 持久化最终版本。

## 0.1.66 收尾与发布记录

记录时间:2026-07-12T08:25:00Z

### 交付内容

- A 组:空 `param` 恢复候选数降级;PNG-8 palette + `tRNS` mask 恢复逐像素合成;编辑结果按源画布到结果画布的宽度比例缩放官方 Logo 检测区域,并补齐分享/历史来源缺失的画布尺寸。
- B 组:结构化错误遍历限制为 8 层,真实深层上游 400 不再触发递归 500;字体子集失败继续尝试候选目录且不清空其它缓存;两个路线图 SVG 渲染入口移到工作线程;重复 `http.disconnect` 维持断连语义;Logo 保留诊断记录匹配率、像素数、阈值、依据和候选关联;Responses 少图时显示请求数与返回数。
- C 组:入口和说明统一为“我的收藏”,可见共享图片支持 per-viewer 收藏;取消收藏筛选同步隐藏说明;行程确认只要求核对真实提交的标题、日期和地点顺序并删除死代码;配置默认 Responses 模型携带 reasoning;团队聊天只在消息变化时重绘,并隔离乱序响应、跨房间发送和旧已读回调;简洁模式壳层使用既有 Arco token;长标题/副标题分档缩小并截断。
- 独立终审追加修复:Pillow 对 TIFF 等预检未识别格式抛出的 `DecompressionBombError` 转成受控 `ValueError`;旧聊天已读完成不再清除新请求错误。
- 版本、Compose、构建脚本、README、页脚和四个静态资源缓存戳统一为 `0.1.66`;没有新增运行时依赖。
- 清单开头描述的 `/tmp/picgen-0.1.65-mode-toggle` 和 `fix/0.1.65-mode-toggle` 在本轮开始时已不存在,因为 0.1.65 已通过 PR #38 发布部署。其绿色模式按钮改动已存在于基线,本轮保留并纳入 C6 验收,没有重复发版或伪造接管记录。

### 自动化与浏览器验证

- 最终提交快照运行 `./scripts/check.sh`:442 passed,Ruff 通过,Mypy 22 个源文件通过;唯一警告为既有 Starlette TestClient 弃用提示。
- 覆盖率快照在终审新增 3 条回归前为 439 passed、源码覆盖率 88%;新增回归随后全部纳入最终 442 项全量测试并通过。
- `node --check` 对 `static/app.js`、`static/logo-placement.mjs`、`static/responses-settings.mjs` 全部通过;`git diff --check` 和 `uv lock --check` 通过;`uvx pip-audit` 未发现已知漏洞。
- Playwright 在 1440、1040、900、821、375px 检查简洁模式顶栏,无重叠或横向溢出;模式按钮默认/hover/active 分别为 primary-8/7/9,白色图文,键盘 focus 为 primary-2 2px ring。
- B6 mock 请求 3 张、Responses 返回 1 张,页面精确显示“本次请求 3 张,上游返回 1 张”。C2 行程确认文案精确为“请核对标题、日期和每天的地点顺序。”
- C5 在等价 7.5 秒的五次轮询后,滚动位置、文字选区和消息 DOM 节点均未变化;延迟私聊发送后切回群聊,响应未串入当前房间且未推进当前房间已读。后续终审补充了旧已读回调与新错误竞态的 Node 行为回归。
- C7 真实 SVG 长标题为 52px、宽 624/1088,副标题为 21px、宽 630/1088,均未越界或重叠;不可达的 `_dense_index_labels` 及其 `width-480` 常量已删除。
- 专业模式差分:隐藏模式按钮后,剩余变化精确落在 C1 强制改名“我的收藏”区域;再掩码该区域后,桌面和移动端 changed pixels 均为 0。C1 与“只有模式按钮可变”的原文字面要求冲突,因此报告把 C1 文案列为第二个明确、不可避免的需求例外。

### A3 真实生成与编辑

- 隔离实例加载真实生产同源上游配置、关闭登录;版权与文字审查请求在浏览器侧 mock,未产生无关付费调用。生成和编辑均通过真实页面操作,尺寸均选择 1088x2240、Logo 开启。
- 真实生成走 Responses、`gpt-5.6-sol`、reasoning `xhigh`,上游流耗时 52.75 秒,无重试;服务端保存 RGB 1088x2240 原图,3,474,728 bytes。
- 首次浏览器证据脚本在生成成功后用 `fetch(data:)` 导出本地 Logo 图时报错;这是测试工具错误,未重发付费生成。随后把同一已付费原图回放到同一 UI 状态,完成 Logo 合成并点击“改这张图”。
- 真实编辑仍走 Responses、`gpt-5.6-sol`、reasoning `xhigh`;同源 `/v1/files` 返回 404 后按既有逻辑回退内联 Base64,上游流耗时 54.72 秒,无重试。上游原始图 874x1799,服务端按现有严格尺寸策略归一化为 RGB 1088x2240,3,480,859 bytes。
- PIL 只读像素验收:生成/编辑成品均为 1088x2240;原始底图三个候选位置的官方 Logo 匹配率全部为 0;最终生成/编辑标准左上位置匹配率分别为 0.9534/0.9507,每张恰好 1 个大于等于 0.9 的高置信 Logo。原图到成品的变化仅位于 `(42,42)` 起的 174x54 官方 Logo 区域,裁剪检查无重影、无第二枚 Logo。

### 发版与部署

- 发布 PR [#39](https://github.com/Minorli/picgen/pull/39) 的 `validate` 检查通过(2 分 22 秒),2026-07-12T08:02:03Z squash 合并;合并提交为 `71e022b0826a97d8c3b5d16d5b57f2dc281e23f5`。
- 合并时仅临时摘除 `enforce_admins`;合并后立即恢复并复核:strict checks=true、必需检查 `validate`、审批数 1、enforce_admins=true。
- 从合并后的 `main` 构建并推送 `minorli/picgen:0.1.66`。OCI 索引 digest 为 `sha256:fed95949d884b62d1120d94360d60b700a57ae1416391fb45777db69e7bd76f2`,amd64 manifest 为 `sha256:df9f2684dd4a04017fa858f6f6c81bf384464cdfa3dd2953e1a669a163e06732`。
- 部署前使用运行中容器内的 SQLite backup API 做在线备份,最终文件为 `/vol1/data1/picgen/backups/auth-20260712-pre-0.1.66.sqlite3`,3,956,736 bytes,`quick_check=ok`,SHA256 `5149ee15ad48250f8321b024a7ea4a47bdd4ab763a925a1d1fb1ede99f1dee68`。
- 原 Compose 备份为 `/vol1/data1/picgen/docker-compose.yml.bak-0.1.65`;只用 `sed` 把镜像标签从 0.1.65 改为 0.1.66。原/新 SHA256 分别为 `d5adae4915825f5da2a7c88e33d6c8bfb7cf84055b58a8ece0a65d0dcfa6991c` / `a6f4c956c2f8ae92a72d6dab4314bfc57812e31d8f5b85ee68d00aa77c7fd4ba`,`diff -u` 仅一行镜像标签变化。
- 生产容器于 2026-07-12T08:13:33Z 启动;`/api/ready` 返回 `ok:true`、版本 0.1.66、存储可写、上游客户端就绪。首页 CSS/App、App 内两个模块和页脚版本均为 0.1.66;容器持续 running/healthy、重启数 0;生产 DB `quick_check=ok`。
- 生产冒烟首次在创建用户前因测试脚本把真实部门 `PD & OPS` 写成 `PD&OPS` 而被组织校验拒绝;没有创建用户、没有上游调用、没有业务数据变化。只读核对启用组织后按清单允许的上限重试一次,第二次通过,未再重试。
- 成功冒烟使用随机临时用户/会话真实请求 1024x1024、单图、无 Logo;`images-generate` / `gpt-image-2` 在 52.16 秒返回 HTTP 200。上游原图 1254x1254,最终 PIL 实测 RGB 1024x1024、911,801 bytes、候选数 1。
- 冒烟后临时用户、会话、job、image 行、输出图、空目录和远端临时脚本全部删除;脚本内复核 users/jobs/images 均为 0,生产复核 `smoke0166%` 用户为 0。
- 从容器启动到 2026-07-12T08:25:00Z 连续观察 687.1 秒:100 条结构化记录中 ERROR=0、Traceback=0、HTTP 5xx=0、warning=0;容器未重启。

### 已知限制

1. 当前上游仍没有同源 `/v1/files`,Responses 参考图/编辑会先记录一次已处理的 404,再回退内联 Base64;A3 实测回退成功,但会增加请求体积。
2. 上游可能返回低于请求尺寸的同比例图片。PicGen 会用 Lanczos 归一化到严格画布,尺寸契约可满足,但放大不能补回原生细节;A3 编辑的真实上游尺寸为 874x1799。
3. A3 使用关闭登录的隔离实例,因无数据库图片 ID,官方 Logo 最终层只在浏览器生成;生产鉴权实例仍通过既有 final-image API 持久化。
4. 专业模式像素不变存在两个需求明确例外:模式切换按钮配色,以及 C1 的“我的收藏”可见文案;其它区域差分为零。
Loading