Files
beige/plans/核销-第6环-配图.md
yangqianqian df1856d793 上线版: 产品表单统一+form嵌套修复+用户管理+部署+三套叙事
- 产品编辑入口统一走 ProductFormFull(卖点/风格/人群/品牌词全字段);
  修复开任务页 <form> 套 <form> 致"编辑产品"报错、改不了、跳回首个产品
- dashboard 入口卡片对齐实际路由: 系统管理(/config) 与 工作配置(/settings) 分开;
  settings ?tab=products 直达改用挂载后读 URL, 消除 hydration mismatch
- 新增用户管理(users API/admin service/改密页) + alembic 022/023/024
- 上线部署: Dockerfile / docker-compose.prod+https / nginx https / .env.example
- A8 三套正交叙事(痛点/场景/成分背书) + beige 调色去AI化 + 飞轮 text_import 高权重信号

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 18:08:13 +08:00

9.7 KiB
Raw Blame History

核销表 · 第6环 配图

90分级验收清单孙总方法论·硬门禁。已吸收独立交叉验证修正⚠️标注处含1处严重落点错误已修。 规则做完一个勾一个每勾必附证据。auto=机器判定human=目视。

🔴 2026-06-15 倩倩姐拍板重大调整

  1. 本轮目标收缩=先打通单套配图含去AI化+尺寸可选3套正交A/B/C扩展挪到下一轮。
  2. 去AI化对齐大卫xhs实测版大卫/小红书系统图片定制/xhs-tool/backend/infrastructure/imagePostProcess.js 只读素材源运营实测去AI化能力强
  3. 尺寸按大卫=3:4默认1024×1536gpt原生免拉伸,原 S4/A5 写的"强缩1080×1440"作废——大卫±2%容差内不resize零失真。
  4. 三套叙事措辞由倩倩姐起草,不临时占位。

🔴 2026-06-15 端到端验证发现task58 codeproxy主通道实测

  • 根因修复.env 图片主通道曾误配 IMAGE_PROVIDER_PRIMARY=apiports,但 apiports 无 gpt-image-2 的 edits 端点返回SPA首页HTML→Expecting value报错),违反红线「生图主=codeproxy」。已改回 codeproxyworker重建task58 六图全出provider=codeproxy/success=1。详见记忆 clover-apiports-no-image-edits-endpoint。
  • ⚠️ 产品名占位污染产出(待北哥真数据)product_id=1 name="素颜霜(预置样本)""(预置样本)"被画进图02特写标题。同"Clover"类是测试数据污染非链路bug换真实产品名即正常。
  • ⚠️ status enum 无 'failed':任务失败只能无限重试或硬改 rejected设计缺口待补。

🟢 本轮施工图(单套配图打通·先列后做)

# 改什么 落点 对应大卫
P1 image_postprocessor 重写:加 RATIO_MAP(1:1/3:4/4:3/9:16/16:9)、±2%容差跳过、SynthID破除(缩2px裁1px边+modulate亮度1.005/饱和0.998env SYNTHID_HARD_MODE开关)、quality 88→100/chroma4:4:4 image_postprocessor.py imagePostProcess.js逐项
P2 process_image 加 aspect_ratio='3:4' 参数pipeline_io 调用处传尺寸 image_postprocessor.py + pipeline_io.py:204 RATIO_MAP默认3:4
P3 生图请求尺寸对齐 1024×1536(gpt原生3:4),确认 image_gen size 正确 constants.py + image_gen.py 1024×1536
P4 配图段写 ai_call_logs(call_type='image',provider,success,latency,error_code) pipeline_io.py:244前 Clover自有

🔴 2026-06-15 倩倩姐纠偏:标绿门槛=真实数据端到端跑通 task58 是占位产品("素颜霜(预置样本)")跑的,不算端到端成功。下方 B1-B8 的""降级为"🟡链路自测通过(占位数据)"必须用北哥真实数据(产品名=素颜霜/品牌词=倍分子)重跑通才能标真绿。倩倩姐原话"标绿不能随便标,得端到端测试成功之后才能标"。

  • apiports 确实有生图接口(后台image key已启用/有余额/历史54万tokens),只是接法与 /images/edits 不同在大卫xhs里是可用备用通道待coder查正确接法后修成真备用。本轮主线先codeproxy。

🟡 验收清单(本轮·单套)— 占位数据自测通过,待真实数据复验

下列=占位产品task58链路自测通过🔴 = 待倍分子素颜霜真实数据重跑确认。

  • B1auto单套6图入库task58 image_candidates COUNT=6(id171-176)role齐(hook/product_closeup/ingredient/texture/applied_proof/closer)url非空/app/uploads/3/58/ 6个jpg真落盘(1.1-1.35MB)。
  • B2auto尺寸3:4=1024×1536task58 PIL独立读6张全部(1024,1536),容差内未拉伸。
  • B3auto去元数据task58 6张 exif全NONE。(SYNTHID缩边验证归B8 coder交叉)
  • B4auto尺寸可选真生效单测 process_image('1:1')→(1024,1024)、('3:4')→(1024,1536)、传1080×1440→resize到(1024,1536)。
  • B5auto生图写日志task58 ai_call_logs call_type='image'/provider='codeproxy'/success=1/latency_ms=345907/error_code=NULL。
  • B6auto禁降级硬失败保持task57 need_product_image=True无参考图→拒绝降级(日志"拒绝降级纯文生图")image_candidates COUNT=0无"降级"成功字眼。
  • B7human浏览器真验倩倩姐+我目视task58封面(01_hook"早八来不及"大字清晰/三卖点勾选/产品与参考图一致/场景去AI化真实/瓶身无虚假品牌词合规)+02特写(产品居中/卖点+气泡框清晰)3:4比例画质佳。⚠️仅"(预置样本)"占位字样待真数据。
  • B8auto交叉验证coder独立起脚本重核task58结论与team-lead一致B1(COUNT=6/role齐)、B2(6张全1024×1536/exif=None/icc=None/xmp=None)、B4=B5(provider=codeproxy/success/无Expecting value报错)真绿B3 N/A(SYNTHID_HARD_MODE未开)。无谎报无放水。

📦 下一轮3套正交扩展本轮不做归档备查

单套打通后再做。叙事措辞等倩倩姐起草。原 S1/S2/S3/S7/S8 + A1/A2/A3/A4/A7/A8 归此。

Ralph 修改步骤(下一轮)

# 改什么 落点
S1 generate_storyboard_images 循环3次strategy A/B/C每次传不同 strategy_hint 影响叙事维度;返回 list[dict]→list[list[dict]] image_gen.py:121-173
S2 plan_image_set 接收 strategy 参数,按 strategy 切换叙事描述新增A痛点先行/B场景先行/C成分背书先行3条写进 base_prompt 叙事链路段 storyboard.py:119-193 + constants.py:66-70
S3 run_image_generation 对 A/B/C 各调一次,存 ImageCandidate 时 strategy 分别写 A/B/C修掉:207硬编码'A'SSE strategy 随之正确 pipeline_io.py:156-213
S4 ⚠️强制 resize(落点已修正,见下):Image.open(...).convert('RGB')立即插入 img=img.resize((1080,1440),Image.LANCZOS)并把第47-49行 resize(original_size) 改为 resize((1080,1440)) image_postprocessor.py:41 之后
S5 run_image_generation 仿 run_text_generation:77-93三套全完后写 AiCallLogcall_type='image'provider取实际路由success/latency覆盖整批单套失败不阻断success=False写error_code pipeline_io.py:215 db.commit() 前
S6 ALLOW_TEXT_ONLY_IMAGE 默认 'true'→'false',与 pipeline_io:150 硬失败对齐 image_gen.py:70
S7 前端 generationStore 新增 imageSets:Record<'A'|'B'|'C',ImageCandidate[]>addImageCandidate 按 strategy 分流reset/hydrate 同步 generationStore.ts:15-122
S8 图片选择页加 A/B/C 切换 Tab默认套A每套内单张可选DTO strategy 字段已存在无需改类型 新建 ImageSetTabs.tsx 或 page 内联

⚠️ 交叉验证补强(执行前必看)

  • 🔴S4 严重修正:原清单写"在 buf.save 之前插入 resize"是错的——那个位置已经过了基于 original_size 的缩放,拿到的还是 gpt-image-2 返回的 1024×1536。正确落点Image.open().convert('RGB') 之后立即锁死 1080×1440且第47-49行原 resize(original_size) 同步改成 resize((1080,1440))
  • S1+S3 必须同步S1 改返回值 list→list[list]pipeline_io.py:165 的 enumerate(image_results) 解包会变。不能只做 S1 不做 S3,中间是崩溃态。
  • S6 两层说清pipeline_io:150 是第一层(按产品 need_product_image 字段拦image_gen:70 是第二层(直调 generate_one_image 的兜底)。两层同时维护,别只改一处。

验收清单(做完一个勾一个)

  • A1auto3套各6张SELECT strategy,COUNT(*) FROM image_candidates WHERE task_id=<id> GROUP BY strategy → 3行每行 count=6或=image_countstrategy=A/B/C。
  • A2autoSSE strategy 三值DevTools Network 找 SSE 流grep image_candidatestrategy 出现 A/B/C 各>0次非全'A')。
  • A3human⚠️前置S1+S2 已完成。三套 base_prompt 叙事段不同:在 plan_image_set 加 logger.info("strategy=%s base_prompt前100字=%s", strategy, base_prompt[:100])确认套A含'痛点先行'/套B含'场景先行'/套C含'成分背书先行'。
  • A4〔拆两层〕⚠️品牌词进特写图:
    • auto代码层storyboard.py 中 strategy=A 的第2/6张 item 包含 brand_keyword 与 brand_keyword_rule 字段DEBUG日志或单测断言这是 pass/fail 判据
    • human效果层下载第2/6张目视有'Clover'best-effort模型概率性不作代码验收判据——gpt-image-2瓶身小字会糊已记录在案
  • A5auto尺寸严格 1080×1440⚠️先确认实际写盘路径worker 日志,默认 UPLOAD_BASE_PATH='uploads/packages' 不是 /app/uploadspython3 -c "from PIL import Image;print(Image.open('<实际路径>/01_hook.jpg').size)" 必须 (1080,1440)。
  • A6auto生图写日志SELECT provider,success,latency_ms FROM ai_call_logs WHERE task_id=<id> AND call_type='image' → ≥1行provider非空、latency_ms>0、success IN(0,1)。
  • A6bauto⚠️日志内容正确性S5核心差错逻辑三套全成功时 success=1至少一套失败时 success=0 且 error_code 非空。
  • A7auto无参考图硬失败建 need_product_image=True 但产品无参考图的任务 → task status='failed'image_candidates 无该 task 记录worker 日志不含'降级为纯文生图'。
  • A8human前端 A/B/C Tab图片选择页有 A/B/C 可点 Tab点击切换图片网格内容三套 URL 不同(非平铺混在一起)。

待北哥定义不阻断本环代码骨架prompt 占位先留)

  • 三套叙事维度的具体文案措辞(先用 痛点/场景/成分背书 占位,北哥方案到位再填)。