diff --git a/ACCEPTANCE-REPORT.md b/ACCEPTANCE-REPORT.md index 444c0e8..b857cd2 100644 --- a/ACCEPTANCE-REPORT.md +++ b/ACCEPTANCE-REPORT.md @@ -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 的“我的收藏”可见文案;其它区域差分为零。