docs(tasks): harden direct suite release semantics

This commit is contained in:
chengma
2026-07-20 17:35:54 +08:00
parent 34c7a2e148
commit 61db0f4ed6
5 changed files with 20 additions and 11 deletions
+10 -7
View File
@@ -13,7 +13,7 @@ created: 2026-07-20
**本任务组有意放宽 T-677 的既定边界。** T-677 明确写了「不给商品套图和图片理解新增自定义网关路径,本任务只做入口拦截与提示」。放宽的理由是:来源切换后,商品套图是唯一完全断链的模块——②生文生图在自定义网关下可用,只有⑥不可用,用户切走后套图功能整体消失。图片理解(AI 帮写)不在放宽范围内,继续保持默认网关独占。记录这一点是为了避免后续回看时误判 T-677 与本任务组互相矛盾。
**发布门禁:T-679a、T-679b、T-679c 未全部完成前不得发布。** 三者拆分只为控制单次改动面,不构成可独立发布的中间态。重复计费的二次确认提示定义在 T-679c,若 T-679a/T-679b 先上线,用户已能创建并失败 direct 任务,却会在没有"可能重复收费"提示的情况下重试——这是资金口径缺口,不是体验缺陷。
**发布门禁:T-679a、T-679b、T-679c 与集成验收 T-679 未全部完成前不得发布。** 拆分只为控制单次改动面,不构成可独立发布的中间态。重复计费的二次确认提示定义在 T-679c,而两来源混合回归定义在 T-679;任一缺失都会形成资金或恢复语义缺口。
`app/image_studio_generation.py` 当前把运行时、提交、轮询和 job 来源硬编码为 cmhub。自定义网关是无 task ID 的同步图片编辑请求,不能复用 cmhub 的异步恢复模型;若只在现有分支上打补丁,停止、超时或程序中断时会出现已扣费图片丢失、误轮询或重复生成。
@@ -36,13 +36,16 @@ created: 2026-07-20
- 停止只取消尚未发起的 job。已发出的同步请求不可强杀;如果已收到图片字节,必须先保存资产并标成功,停止只阻止后续 job。
- 直连请求提交后发生读超时、连接中断或进程退出时,客户端无法确认服务商是否已受理或计费:不自动重试,不自动恢复,不把该 job 放入“继续查询”。标失败并提供后续手动“重新生成”入口。
- 程序启动或进入项目时,遗留 `running` 的 direct job 统一标为失败,中文原因说明“程序中断,无法确认生成结果,请手动重新生成”;不得自动补发。
- 只在**程序启动后的单次陈旧任务恢复流程**处理遗留 `running` 的 direct job,绝不能在“进入项目”、切换任务或刷新结果时清理;用户可在生成中切换任务,误清理会把仍在运行的 worker 标为失败。
- direct job 进入 `running` 时持久化本次运行会话标识;恢复流程只能处理不属于当前活动会话的 job。若应用未建立可靠的单实例锁或本地运行租约,恢复流程必须跳过状态修改并记录诊断,不能猜测另一实例是否仍在运行。
- 被确认陈旧的 direct job 标为失败,中文原因说明“程序中断,无法确认生成结果,请手动重新生成”;不得自动补发。
- 直连超时取冻结模型的 `connect_timeout_seconds` 和 `timeout_seconds`;若后者未设置,使用项目已有的受限默认值。不得使用 cmhub submit/poll/read timeout 常量。
### 4. 比例与参考图
- 套图比例固定映射:`1:1 -> 1024x1024`;`3:4`、`9:16 -> 1024x1536`;`4:3`、`16:9 -> 1536x1024`。映射覆盖 `product_suite.RATIOS` 的全部五个取值;后四种为近似映射。
- **资产必须同时记录用户选择的比例与实际输出尺寸。** 只保存原始比例会让 DB 记着 `9:16` 而文件实际是 1024×1536(2:3)。当前 `image_studio.add_asset()` 的 `aspect_ratio` 只写入、无下游消费者(`app/image_studio.py:707-731`),所以暂不产生可见故障;但一旦历史展示、导出或后续上传开始信任该字段就会出错。补充实际尺寸字段属于本任务范围,不留给以后修。
- `image_studio_assets.aspect_ratio` 继续表示用户选择的比例,禁止改变其历史语义。新增可空的 `requested_output_size TEXT`、`rendered_width INTEGER`、`rendered_height INTEGER`:前者记录比例映射出的请求尺寸,后两者在文件保存后从真实图片读取。
- 新生成资产无论来源均写入这三项字段;存量资产保持 `NULL`,不回填、不阻塞预览、历史、导出或上传。迁移必须附加式、幂等,并同步更新 `ImageStudioAsset`、`add_asset()` 与读取映射。
- 任务层向调用方返回“是否近似比例”的结构化结果,T-679b 负责在确认框中告知用户;不得静默伪造精确比例。
- 首图主体与其余参考图的规则必须使用已冻结、已持久化的 job prompt;不能在 HTTP 调用层临时拼接,避免确认预览、历史 prompt 与实际请求不一致。
@@ -51,15 +54,15 @@ created: 2026-07-20
- [ ] 可创建并执行 direct job,字段值精确为 `direct` / `openai_images_edits` / 空 `task_id`。
- [ ] direct 请求不调用 cmhub 提交、轮询、余额、价格或下载路径;cmhub job 行为不变。
- [ ] 已返回字节的 direct job 即使用户点击停止也会保存成功;未开始 job 才会取消。
- [ ] direct 不发生自动重试;遗留 `running` direct job 不会自动重发或进入继续查询。
- [ ] direct 不发生自动重试;仅启动期确认陈旧的 `running` direct job 会失败,当前活动 worker、切换项目和刷新结果均不会被误清理,也不会进入继续查询。
- [ ] 比例映射、近似标记、`n=1`、多图顺序和 prompt 一致性有纯逻辑测试。
- [ ] 生成资产同时记录用户选择的比例与实际输出尺寸;新增字段的迁移为附加式且幂等,存量资产缺该字段时不报错、不阻塞历史展示。
- [ ] 生成资产保留用户比例,并分别记录请求尺寸和文件真实像素尺寸;新增字段的迁移为附加式且幂等,存量资产缺该字段时不报错、不阻塞历史展示。
- [ ] 直连模型 URL、密钥与原始响应不进入 SQLite、事件日志或异常面向用户的文案。
## 测试与文档
- `tests/test_image_studio_generation.py`:来源分派、状态转移、停止边界、超时、遗留运行任务、比例映射、混合 job 防串路与无自动重试。
- `tests/test_image_studio.py`:来源字段和中断恢复的数据访问。
- `tests/test_image_studio_generation.py`:来源分派、状态转移、停止边界、超时、启动期陈旧任务恢复、生成中切换/刷新不误清理、比例映射、混合 job 防串路与无自动重试。
- `tests/test_image_studio.py`:来源字段、运行会话标识、请求/真实尺寸字段迁移与中断恢复的数据访问。
- 更新 `docs/04-architecture.md`、`docs/api.md`:记录两种来源 job 生命周期。
## 验证