A8多套打包+M4归档+R5多图:存量功能备份
A8 多套交付包(packaging_task.py): - 修复交付包只打第1条混乱note的bug,按ImageCandidate.strategy分A/B/C组 - 每组生独立note_0N夹(6图+文案.txt),同seq留最新去重,老数据兼容 - task74端到端验:3套各6图,独立agent7项交叉验证全过 M4 归档(tasks.py/exports.py/前端): - list_tasks加date_from/date_to/product_id筛选+product_name批量填(防N+1) - 新增exports.py:产品JSON导出+标杆CSV导出(UTF-8 BOM) - 前端HistoryFilters日期/产品筛选+产品列+打回原因红banner - response.py加raise_param_error;独立agent验A1/A2/A9通过 R5 产品多图(product_images.py/020迁移/前端): - product_images表+5端点(上传/列/改场景/设主图/删图) - 生图按ROLE_SCENE_PREFERENCE选对应场景图,回落primary - 前端ProductImageManager多图画廊 R6 账号config拆页(settings/): - 配置页按角色拆/settings(运营+组长+admin)+/config(仅admin) - Key只显末4位不显余额(守红线) 核销表对齐真实代码状态:D1改稿框/M7裂变/E12评图分纠偏为已完成(曾漏回写) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -64,3 +64,25 @@
|
||||
## 搁置/待北哥(攒批)
|
||||
- 裂变三档/参考度真实业务措辞
|
||||
- N套真差异化质量验收(北哥过目)
|
||||
|
||||
## 补图机制(中转站波动兜底,2026-06-18 追加并实测✅)
|
||||
|
||||
> 实测发现 codeproxy 偶发不稳,单套中某张图重试3次仍失败会记 error。倩倩姐拍板"不稳定的需要加再次重试的机制"。原则:只重生失败分镜,成功的图与 token 不浪费;生图引擎零改动(R2)。
|
||||
|
||||
| # | 文件 | 改什么 | 状态 |
|
||||
|---|------|--------|------|
|
||||
| RT1 | alembic 019 + models/fission.py | fission_tasks 加 source_task_id(新架构不扇出GenerationTask,补图需复刻首轮上下文:产品/operator key/张数,故落库回查;原 source_fission_id 反查链在新架构下断裂) | ✅ 迁移019 head,列已加 |
|
||||
| RT2 | services/fission_service.py | create_fission 写入 source_task_id | ✅ |
|
||||
| RT3 | services/fission_image_retry.py | 只补标 error 的 role(引擎 target_role 单张重生,R2零改动),merge 回 images_json,全恢复则 status=image_done | ✅ 105行 |
|
||||
| RT4 | workers/tasks.py | retry_fission_images Celery task,key归属源任务operator(基石B不传明文key),幂等锁防重复补图 | ✅ 已注册(celery inspect registered) |
|
||||
| RT5 | api/v1/fission.py | POST /fission/{id}/notes/{seq}/retry-images,无失败分镜守卫 queued=false | ✅ |
|
||||
| RT6 | 前端 FissionNoteCard + notes/page.tsx | 失败提示改"重试补图"按钮+loading,父页轮询6次×8s刷新 | ✅ tsc过 |
|
||||
|
||||
- 端到端实测✅: task5 seq1(hook图首轮codeproxy重试3次失败,note_id=2)触发补图→**只补hook**(1024×1536去AI化新落盘)、**applied_proof原图不动**(时间戳未变)、recovered=1 still_failed=0、status=image_done; apiports503回落codeproxy gpt-5.5强档兜底(R3); seq0无失败图守卫返回queued=false不浪费token
|
||||
- git: 285791c "裂变补图:中转站波动导致单张失败时只重生失败分镜"(8文件)
|
||||
|
||||
## git 提交记录(2026-06-18)
|
||||
- 7f419f4 存量后端(生图素人感约束+评图分+幂等防重跑+审核回路)
|
||||
- d85dcd4 第11环裂变重写(一次LLM出N套完整笔记包)
|
||||
- 25f86b2 存量前端(生图分组/灯箱/重生控件等)
|
||||
- 285791c 裂变补图机制
|
||||
|
||||
@@ -24,15 +24,15 @@ KR1链路连通 + KR2质量达标 + KR3自主可验 + KR4引擎补全(第2环+
|
||||
|
||||
| ID | 任务 | 模块核销表 | 细化 | 状态 |
|
||||
|----|------|-----------|------|------|
|
||||
| M3 | 第8环 审核(死链/打回回路) | plans/核销-第8环-审核.md | 🟢S1-S6/A1-A8 | □ |
|
||||
| M4 | 第12环 归档(日期品类筛选/导出) | plans/核销-第12环-归档.md | 🟢S1-S8/A1-A12 | □ |
|
||||
| M5 | 工程底座(5并发/magic/选标杆/置灰/lightbox) | plans/核销-工程底座.md | 🟢S1-S6/A1-A8 | □ |
|
||||
| M3 | 第8环 审核(死链/打回回路) | plans/核销-第8环-审核.md | 🟢S1-S6/A1-A8 | ✅ 对账核实(2026-06-18独立agent):review.py approve(:101)/reject(:127)端点真在,_fmt_task返review_status/reject_reason/reviewed_at(:64-66),RejectReasonBanner在text/images页均挂载,/review审核工作台页+ReviewCard+RejectModal全在,打回→status=pending_selection→运营见原因可重做闭环真通。曾误标□ |
|
||||
| M4 | 第12环 归档(日期品类筛选/导出) | plans/核销-第12环-归档.md | 🟢S1-S8/A1-A12 | ◐ 后端验过(2026-06-18独立agent):✅A1日期筛选(79→当日4/未来0/非法→40001)✅A2品类筛选(product_id=1命中78+product_name批量防N+1)✅A9产品导出(3条+selling_points真数组)✅A6/A7 zip结构+文案格式;前端代码就绪过typecheck(产品列/日期控件/打回原因banner/导出按钮)但A3/A4/A12目视项待Z阶段浏览器实跑;A10标杆导出逻辑已审ws3无数据未触发 |
|
||||
| M5 | 工程底座(5并发/magic/选标杆/置灰/lightbox) | plans/核销-工程底座.md | 🟢S1-S6/A1-A8 | ✅ 完成(2026-06-18):✅lightbox ✅置灰 ✅magic(文件头校验,products.py _check_image_magic,2端点接入,验证真图过.exe拒) ✅5并发(config值2→5红线,task_service._check_concurrency_limit算pending/generating,验证5拦4放) ✅选标杆(注入链4断点全打通:task_service存benchmark_ids→pipeline_steps.load_benchmark_features读done态→tasks塞product_dict→_text_prompt渲染8维配方+负向约束;前端NewTaskForm多选UI;DB回环验证benchmark_ids真存库+done过滤+ws隔离;独立agent重核5项真修好,不入图片prompt合规保持) |
|
||||
|
||||
## P2 引擎补全(第2环标杆 / 第11环裂变)
|
||||
|
||||
| ID | 任务 | 模块核销表 | 细化 | 状态 |
|
||||
|----|------|-----------|------|------|
|
||||
| M6 | 第2环 标杆8特征分析 | plans/核销-第2环-标杆.md | 🟢S1-S12(S12拆a/b)/A1-A12 | ◐ **引擎双路径端到端真验完成**(2026-06-16 c1ac2a6):①文本路径(手填亮点)8维齐全conf0.9 ②截图vision路径(真喂4.7MB素颜霜图)source=vision真读图,识别三段式卖点/√图标/大字报模板/办公背景,看不到的诚实标"截图未体现"。features_json落库done。端点健壮(404/422/读图失败降级/key缺失提示)。**剩非引擎本体待办:①北哥过目8维草案标✅满分 ②第5/6环消费features_json对标(接线,归M6下游或随M1/M2)**。8维=banana不变量+俊达配方+3链接 |
|
||||
| M6 | 第2环 标杆8特征分析 | plans/核销-第2环-标杆.md | 🟢S1-S12(S12拆a/b)/A1-A12 | ◐ **引擎双路径+第5环消费接线完成**(2026-06-16~18):①文本路径(手填亮点)8维齐全conf0.9 ②截图vision路径(真喂4.7MB素颜霜图)source=vision真读图,识别三段式卖点/√图标/大字报模板/办公背景,看不到的诚实标"截图未体现"。features_json落库done。端点健壮(404/422/读图失败降级/key缺失提示)。**✅第5环消费features_json已接通(2026-06-18)**:选标杆注入链4断点全打通(详见M5),用户选的标杆8维配方真进文案build_prompt(借方法层结构+禁抄竞品负向约束),独立agent重核真修好。**剩非引擎本体待办:北哥过目8维草案标✅满分**。8维=banana不变量+俊达配方+3链接 |
|
||||
| M7 | 第11环 裂变(工作台内) | plans/核销-第11环-裂变.md | 🟢S1-S13(含S10.5)/AC1-12 | ◐ **引擎端到端真跑通**(2026-06-16 cefdbaa):①fission_service扇出1源→N子任务(回填source_fission_id,复用主管道run_generation_pipeline),MAX_FANOUT=5红线 ②fission_prompt三档(high/mid/low)规则 ③tasks.py worker识别裂变子任务→注入对应档位进文案上下文(自抓关键缺口,**worker曾跑旧内存代码未热重载,restart后实测注入日志level=high真出现**) ④POST/fission触发+GET/fission/{id}进度聚合,main.py注册路由 ⑤实测fission_id=2扇出task70/71,子任务带source_fission_id+档位注入生效,进度端点聚合正确(total=2/done=0/generating)。**剩待办:①三档真实措辞待北哥定义(现占位规则) ②前端裂变入口+进度呈现(归前端攒批) ③子任务真出3套差异化文案+配图的质量验收(需北哥过目)** |
|
||||
|
||||
## P3 前端打通+飞轮(2026-06-16 九文档审核结论·按序逐条修)
|
||||
@@ -44,7 +44,7 @@ KR1链路连通 + KR2质量达标 + KR3自主可验 + KR4引擎补全(第2环+
|
||||
| ID | 任务 | 根据 | 状态 |
|
||||
|----|------|------|------|
|
||||
| A1 | Sidebar 4个死链路由(/tasks /images /tasks/build /tasks/list 全不存在) | Sidebar.tsx确证 | ✅ 2026-06-16 删4死链+补回/review审核台(限supervisor+admin),tsc全量EXIT0,commit 77f52e7 |
|
||||
| D1 | 改稿进飞轮(SignalType.text_edit + TextCandidate.edited + 改稿端点走task_actions) | 最强真实信号 | ◐ 后端✅2026-06-16端到端真跑(edited False→True+飞轮信号落库weight=5,实测抓出ENUM未同步bug已修,commit e3fb6f2)。**前端改稿框入口攒批做(倩倩姐2026-06-16:后端先串完前端攒批)** |
|
||||
| D1 | 改稿进飞轮(SignalType.text_edit + TextCandidate.edited + 改稿端点走task_actions) | 最强真实信号 | ✅ 全链完整(2026-06-18独立agent核实):后端✅端到端真跑(edited False→True+飞轮信号weight=5,commit e3fb6f2)。**前端✅已做完整**:TextCandidateCard.tsx:29-47可编辑textarea+保存改稿/取消按钮,text/page.tsx:29-35真调POST /text-candidates/{id}/edit+同步store,保存后展示"🌿已学习你的改动"+"已改稿"角标。曾误标◐ |
|
||||
| C2 | 审核界面显分(读score_json总分,不读eval_score NULL列) | 审核可判断 | ✅ 2026-06-16 review.py复用_score_array_to_obj算总分+7维,ReviewCard接ScoreDimBars(passLine=80红线),端到端验task40返回total=83,新旧维度兼容,commit ea423e8 |
|
||||
| B7 | 事件处理补齐(SSE/轮询状态流转) | 前端诊断 | ✅ 2026-06-16 核实已做无缺口:SSE签ticket换JWT(?ticket=合规红线)+useSse消费progress/done/error全链+轮询兜底,后端事件发布到位,标绿 |
|
||||
| B6 | 错误态呈现(status=failed前端可见) | 前端诊断 | ✅ 2026-06-16 后端加TaskStatus.FAILED终态+异常区分重试中vs耗尽(耗尽落failed不retry)+014迁移ALTER status ENUM;前端fatalError state+useSse error不再静默丢+FatalErrorBanner提示+failed标签(列表/历史页可见,history纳入HISTORY_STATUSES),tsc EXIT0 |
|
||||
@@ -52,16 +52,16 @@ KR1链路连通 + KR2质量达标 + KR3自主可验 + KR4引擎补全(第2环+
|
||||
### 桶B 飞轮专项(产品最大亮点·做扎实+前端呈现)
|
||||
| ID | 任务 | 守的底线 | 状态 |
|
||||
|----|------|---------|------|
|
||||
| E12 | AI评图分进飞轮:仅"生成时筛选+前端展示X分已入飞轮" | 权重只认真实信号(选/改/审),eval_score留NULL铁律 | □ |
|
||||
| FV | 飞轮可视化=轻量化关键节点反馈(让客户感到确实越用越好) | 不做独立飞轮主视图大页(砍E01) | □ |
|
||||
| E12 | AI评图分进飞轮:仅"生成时筛选+前端展示X分已入飞轮" | 权重只认真实信号(选/改/审),eval_score留NULL铁律 | ✅ 全链完整(2026-06-18独立agent核实):ImageStrategyGroup.tsx:89-96 ai_visual_score徽章(≥80绿/≥60橙/<60灰),后端image_gen.py:228→pipeline_io.py:303→tasks.py:146落库透传;eval_score全程NULL(models/task.py:93/124注释+image_gen/pipeline_io/review.py均不碰),红线守住。曾误标□ |
|
||||
| FV | 飞轮可视化=轻量化关键节点反馈(让客户感到确实越用越好) | 不做独立飞轮主视图大页(砍E01) | ✅ 符合决策(2026-06-18核实):FlywheelBanner(new页/text页/images页SSE flywheel_injected事件)+TextCandidateCard"🌿已学习"+AI分徽章,轻量节点反馈嵌现有流程;无独立大看板=砍E01已拍板。曾误标□ |
|
||||
|
||||
### 桶C 接线(数据流薄,主链通后接)
|
||||
| ID | 任务 | 状态 |
|
||||
|----|------|------|
|
||||
| B1 | 图片按strategy分组(generationStore现一维平铺) | □ |
|
||||
| C1 | 任务看板 | □ |
|
||||
| B2/B3/B4/B5 | 前端数据流补齐 | □ |
|
||||
| C3/C4 | 展示层补薄 | □ |
|
||||
| B1 | 图片按strategy分组(generationStore现一维平铺) | ✅ 同R1已做(对账核实):ImageStrategyGroup按strategy分A/B/C三组,images页:45-47分组+:96-108渲染,非空壳。曾重复挂账□ |
|
||||
| C1 | 任务看板 | □ 真欠账(2026-06-18核实:仅/history列表+状态tab,无kanban按状态分列视图,零代码)。⚠️攒批问倩倩姐:/history已有状态筛选,是否还需独立kanban看板?可能伪需求 |
|
||||
| B2/B3/B4/B5 | 前端数据流补齐 | ✅ 主链完整(2026-06-18核实:generationStore/taskStore/preferenceStore全实现无空壳无TODO,hydrateFromTask历史回填已做);B2-B5核销表本身需求定义模糊,代码层无欠账 |
|
||||
| C3/C4 | 展示层补薄 | C3✅留口子(OVERLAY_TEXT_RENDER_ENABLED=False拍板缓做);C4□代码无对应实现且需求不明,⚠️攒批问倩倩姐C4具体指什么 |
|
||||
|
||||
### 桶D 踩刹车(砍/缓,防堆伪需求偏离纵切片)
|
||||
| ID | 任务 | 裁决 |
|
||||
@@ -72,10 +72,10 @@ KR1链路连通 + KR2质量达标 + KR3自主可验 + KR4引擎补全(第2环+
|
||||
### 桶E 需补充(缺口补全)
|
||||
| ID | 任务 | 状态 |
|
||||
|----|------|------|
|
||||
| 补1 | 上传主图校验(必含产品瓶身,防质地图/手臂图当主图) | □ |
|
||||
| 补1 | 上传主图校验(必含产品瓶身,防质地图/手臂图当主图) | ✅ 同R3已做(对账核实):后端2层硬拦截(task_service.py:46-58建任务校验+pipeline_io.py:199-204 worker兜底防绕过)+前端NewTaskForm:66-77红色警告+按钮置灰。曾重复挂账□ |
|
||||
| 补2 | status=failed 完整处理(后端+前端) | ✅ 同B6(2026-06-16),后端FAILED终态+前端可见,commit 1b48875/ffc213f |
|
||||
| 补3 | git版本兜底 | ✅2026-06-16已建Clover独立仓库,基线6a2632d |
|
||||
| D2 | 数据复盘(飞轮喂料可见) | □ |
|
||||
| D2 | 数据复盘(飞轮喂料可见) | ◐ 实时注入反馈已做(FlywheelBanner+"已学习"提示,见FV),但历史注入摘要/复盘页未做。⚠️攒批问倩倩姐:轻量节点反馈是否已够,还需独立历史复盘页? |
|
||||
| D3 | 爆款解析(并入M6标杆) | ⏸️随M6 |
|
||||
|
||||
---
|
||||
@@ -131,33 +131,33 @@ KR1链路连通 + KR2质量达标 + KR3自主可验 + KR4引擎补全(第2环+
|
||||
### R5 产品多图(P1)
|
||||
| 子项 | 去重映射 | 根因证据 | 状态 |
|
||||
|------|---------|---------|------|
|
||||
| 产品图多张(DB+上传端点+前端multiple) | 问题2/14新 | image_path单值字符串,无multiple,覆盖式 | □ |
|
||||
| 生图按场景选用对应图 | 问题2新 | pipeline_io只读单条image_path | □ |
|
||||
| operator选品/快速建品/产品入镜 | 问题1新 | POST/products限admin,operator不能建 | □ |
|
||||
| 产品图多张(DB+上传端点+前端multiple) | 问题2/14新 | image_path单值字符串,无multiple,覆盖式 | ✅ product_images表(alembic020)+ProductImage模型(lazy=selectin)+5端点(upload带scene/列/改场景/设主图/删图,删主图自动提升下张防image_path悬空);前端ProductImageManager.tsx多图画廊(每张缩略图+场景下拉+设主图+删除);tsc EXIT0;API链路实测建品→传2图(primary+scene)→改场景→设主图→删图全code=0 |
|
||||
| 生图按场景选用对应图 | 问题2新 | pipeline_io只读单条image_path | ✅ ROLE_SCENE_PREFERENCE覆盖全10分镜role;_pick_reference_for_role按偏好链选图缺失回落primary再回落fallback;image_gen/pipeline_io/fission_images/fission_image_retry四路均构造并传images_by_scene;真实数据验证texture分镜命中texture图(不同字节确认)、其余回落primary、无多图回落原reference;独立agent交叉核验6链路点全真0实质bug |
|
||||
| operator选品/快速建品/产品入镜 | 问题1新 | POST/products限admin,operator不能建 | ✅ create/update放开require_admin→require_write_permission;delete_product保留require_admin(破坏性不放开);operator账号实测建品id=6+传图成功code=0 |
|
||||
|
||||
### R6 账号体系+Key+权限(P1)
|
||||
| 子项 | 去重映射 | 根因证据 | 状态 |
|
||||
|------|---------|---------|------|
|
||||
| 后端users.py增/删/列用户(删=软删is_active) | 问题15新 | 无users CRUD,is_active登录已校验:37 | □ |
|
||||
| 前端配置台账号管理Tab | 问题15新 | 无账号管理入口 | □ |
|
||||
| Key绑定账号显式展示 | 问题15新 | UserApiKey已按user隔离,只缺前端展示 | □ |
|
||||
| operator配置编辑权(放开全部产品) | 问题13a新 | /config硬限admin,products CRUD require_admin | □ |
|
||||
| 保存按钮补错误提示(治点不动) | 问题13b新 | ProductForm校验静默return无提示 | □ |
|
||||
| 后端users.py增/删/列用户(删=软删is_active) | 问题15新 | 无users CRUD,is_active登录已校验:37 | ⏸️暂停(倩倩姐2026-06-18拍板:现有4种子账号够北哥测,加人能力留后;先推R7飞轮) |
|
||||
| 前端配置台账号管理Tab | 问题15新 | 无账号管理入口 | ⏸️暂停(同上,随后端users CRUD一起做) |
|
||||
| Key绑定账号显式展示 | 问题15新 | UserApiKey已按user隔离,只缺前端展示 | ✅ B方案拆页:运营进/settings「工作配置」自录key;实测operator录key(id=4 last4=0001)归user_id=3、admin的key(id=2)归user_id=1,DB核对user_id严格隔离各算各的;只显末4位不显余额(守红线) |
|
||||
| operator配置编辑权(放开全部产品) | 问题13a新 | /config硬限admin,products CRUD require_admin | ✅ B方案:配置页按角色拆/settings(运营+组长+admin,含APIKey+产品档案)+/config(仅admin,标杆+违禁词);Sidebar+AuthGuard双层放开/settings给三角色;前缀匹配无串扰;角色矩阵静态核查无死链;独立agent交叉核验0穿透漏洞;后端require_write_permission已对齐 |
|
||||
| 保存按钮补错误提示(治点不动) | 问题13b新 | ProductForm校验静默return无提示 | ✅ ProductForm加error state:空名提示"请填写产品名称"+catch后端报错展示(role=alert);tsc EXIT0 |
|
||||
|
||||
### R7 飞轮闭环+可视化(P2)
|
||||
| 子项 | 去重映射 | 根因证据 | 状态 |
|
||||
|------|---------|---------|------|
|
||||
| 飞轮片段注入生图链路(补断点1) | 新 | run_image_generation没传flywheel_fragment | □ |
|
||||
| 选图信号带strategy进飞轮(补断点2) | 新 | image_select的angle_label=None空转 | □ |
|
||||
| 统一前端查询与注入的计数口径 | 新 | service用次数/aggregator用权重不一致 | □ |
|
||||
| AI评图分仅展示+生成筛选 | =既有E12 | 守eval_score NULL红线 | □ |
|
||||
| 飞轮可视化轻量节点反馈 | =既有FV/D2 | 让客户感到越用越好 | □ |
|
||||
| 飞轮片段注入生图链路(补断点1) | 新 | run_image_generation没传flywheel_fragment | ✅ generate_storyboard_images+run_image_generation加flywheel_fragment参数,tasks.py传load_flywheel_context真实聚合结果;拼per_prompt措辞"仅影响文字角度/排版不改瓶身"守红线;独立agent复核"真修好" |
|
||||
| 选图信号带strategy进飞轮(补断点2) | 新 | image_select的angle_label=None空转 | ✅ IMAGE_STRATEGY_ANGLE映射A痛点/B场景/C成分背书,image_select取ic.strategy映射angle_label+原值存signal_meta;record_signal加signal_meta参;strategy空安全降级;复核"真修好" |
|
||||
| 统一前端查询与注入的计数口径 | 新 | service用次数/aggregator用权重不一致 | ✅ get_preference_context改委托aggregate_preference_context(权重口径),image_select纳入角度聚合;展示端点与生产链同源,交叉验证输出字符串完全一致;复核"真修好" |
|
||||
| AI评图分仅展示+生成筛选 | =既有E12 | 守eval_score NULL红线 | ✅ 既有已达标:ai_visual_score只展示+筛选,eval_score全程NULL,本轮改动复核确认未碰;ImageStrategyGroup徽章展示AI分 |
|
||||
| 飞轮可视化轻量节点反馈 | =既有FV/D2 | 让客户感到越用越好 | ◐ 已有雏形:生成时FlywheelBanner"本次已注入偏好角度"+改稿TextCandidateCard"🌿已学习你的改动"+AI分徽章;无独立大看板(符合砍E01红线) |
|
||||
|
||||
### R8 归档(P2)
|
||||
| 子项 | 去重映射 | 根因证据 | 状态 |
|
||||
|------|---------|---------|------|
|
||||
| 历史打回显示原因 | =问题10,既有M4沾边 | _fmt_task()没返reject_reason,前端没读 | □ |
|
||||
| 日期/品类筛选+导出 | =既有M4 | M4未开工 | □ |
|
||||
| 历史打回显示原因 | =问题10,既有M4沾边 | ✅后端_fmt_task返review_status/reject_reason/reviewed_at(tasks.py:58),前端HistoryTable加rejected行红banner展示打回原因(代码就绪,Z阶段目视) | ◐ |
|
||||
| 日期/品类筛选+导出 | =既有M4 | ✅后端筛选链+导出端点独立agent验过(A1/A2/A9),前端HistoryFilters就绪待目视 | ◐ |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -14,24 +14,24 @@
|
||||
| S3 | history/page.tsx 加 dateFrom/dateTo state + 两个 `<input type=date>`(提 DateRangeFilter 子组件防超100行) | history/page.tsx:28-44 + JSX 50-94 |
|
||||
| S4 | HistoryTable 表头/行加"产品"列(显 product_name ?? '-') | history/components.tsx:70-127 |
|
||||
| S5 | TaskListItem 加 `product_name?:string` | dto.tasks.ts:8-16 |
|
||||
| S6 | ⚠️多套打包:查所有 is_selected=True TextCandidate 按 angle_label 分组每组取第一;notes 列表长度=选中套数(改 line 77-85 为 for loop);images_data 循环外查一次,每套传 `list(images_data)` 副本(退化:图共享复制进各套夹) | packaging_task.py:45-47,77-85 |
|
||||
| S6 | ✅多套打包(2026-06-18实做修正分组依据):实测真相=图按 `ImageCandidate.strategy`(A/B/C三套正交叙事)分组,三套图均以first_copy第1条文案为语境生成→**按strategy分组比angle_label更贴数据实际,且无需加set_index列**。改 packaging_task.py:查全部图按strategy分组(OrderedDict)+同(strategy,seq)取最新id去重(防重生重复)+老数据strategy=None归"_"单套兼容;文案配对:选中文案数≥套数则一套一条否则共用第1条;每套成独立note进exporter | packaging_task.py:45-100 |
|
||||
| S7 | 新建 GET /products/export + /benchmarks/export(format=json/csv);require_write_permission;⚠️benchmarks/export 需 Product JOIN 填 product_name(复用 _fmt_benchmark 不够,只有 product_id) | products.py + benchmarks.py |
|
||||
| S8 | 配置页产品 tab + 历史归档页各加"导出数据"按钮,通用 ExportButton(url,filename) 调 getBlob 下载 | history/components.tsx 或 config/ExportTab.tsx |
|
||||
|
||||
## 验收清单(做完一个勾一个)
|
||||
|
||||
- [ ] **A1**〔auto〕日期筛选:传 date_from/date_to → items 全落区间;传 date_from=2099 → 空数组 total=0。⚠️审计补:再验 `date_from=not-a-date` → code=40001(非500)。
|
||||
- [ ] **A2**〔auto〕product_id 筛选:传 product_id=1 → 每条 product_id=1 且 product_name 非空。
|
||||
- [ ] **A3**〔human〕前端产品列:/history 表头有"产品"列,每行显产品名(非数字),与 GET /products/{id}.name 一致。
|
||||
- [ ] **A4**〔human〕日期控件:有开始/结束 date input,填后表格刷新,XHR URL 含 date_from/date_to,结果≤全量。
|
||||
- [x] **A1**〔auto〕日期筛选:✅2026-06-18 ws3实测:全量79条→当日(2026-06-17)区间过滤=4条,未来(2099+)=0条;非法日期"not-a-date"→raise_param_error返400/40001(非500)。date_to含当日(+1天开区间)。
|
||||
- [x] **A2**〔auto〕product_id 筛选:✅2026-06-18 ws3实测:product_id=1过滤命中78条,product_name批量查到'素颜霜'(防N+1:set收集→一次in_查询建name_map)。
|
||||
- [ ] **A3**〔human〕前端产品列:/history 表头有"产品"列,每行显产品名(非数字),与 GET /products/{id}.name 一致。【代码已就绪:components.tsx加产品列+dto加product_name,typecheck过+独立审核过;待Z阶段浏览器目视】
|
||||
- [ ] **A4**〔human〕日期控件:有开始/结束 date input,填后表格刷新,XHR URL 含 date_from/date_to,结果≤全量。【代码已就绪:HistoryFilters.tsx日期input+产品下拉+清除,page接入筛选变化重置页码;待Z阶段浏览器目视】
|
||||
- [ ] **A5**〔human〕下载交付包:approved 任务点"下载交付包",≤60s 触发下载 delivery-{id}.zip(>1KB);`unzip -l` 含 note_01/文案.txt/发布清单/合规说明。
|
||||
- [ ] **A6**〔auto〕zip 结构完整:`unzip -l` grep 文案.txt/发布清单/合规说明/note_01//.jpg 全非空。⚠️审计补:若 .jpg 空先查 ImageCandidate.url 文件容器内可达(packaging_task.py:64-70 读失败静默跳过)。
|
||||
- [ ] **A7**〔auto〕文案.txt 格式:`unzip -p note_01/文案.txt` 含"【标题】"、不以 `{` 开头(JSON 已解析)。
|
||||
- [ ] **A8**〔human+auto〕多套打包:⚠️审计改 human(需先 seed 3条 is_selected TextCandidate)→构造后 `unzip -l|grep 'note_0[1-3]/'|wc -l`≥3,三套标题互不相同。
|
||||
- [ ] **A9**〔auto〕产品 JSON 导出:GET /products/export → 200,application/json,数组,每元素含 id/name/selling_points,且 selling_points 是数组(非JSON字符串)。
|
||||
- [ ] **A10**〔auto〕标杆 CSV 导出:GET /benchmarks/export?format=csv → 200,text/csv,首行表头含 product_id/highlights/created_at,行数≥已录标杆数。
|
||||
- [ ] **A11**〔auto〕导出权限:⚠️审计注——require_write_permission 当前只查 workspace_members 不分角色(workspace_guard.py:65-88);未登录调 → code=40101,workspace 成员 → 200。
|
||||
- [ ] **A12**〔human〕不显 token 余额(红线):⚠️审计改 human(curl 拿不到Next.js水合后DOM)——浏览器 Ctrl+F 搜"余额/用量/tokens/balance"无结果。
|
||||
- [x] **A6**〔auto〕zip 结构完整:✅2026-06-18 task74端到端验:zip解出note_01/02/03各7项(6图+文案.txt),发布清单+合规说明在root,18张图全非空真写入(磁盘文件真读到)。
|
||||
- [x] **A7**〔auto〕文案.txt 格式:✅2026-06-18 task74验:note_02/文案.txt以"【标题】懒人三分钟搞定,倍分子上脸气色回来了"开头(非{,JSON已解析),品牌词"倍分子"已植入。
|
||||
- [x] **A8**〔human+auto〕多套打包:✅2026-06-18 task74(6图×3套A/B/C)端到端真跑:选1条文案→建package→build_delivery_package→`grep note_0[1-3]`=3套各6图,每套独立note_0N夹+文案.txt。独立agent交叉验证7条全过(分组/去重/老数据兼容/越界/异常/契约/红线)。⚠️攒批问倩倩姐:当前只生成选1条文案,三套图共用同文案→交付包"3套"仅图风格(A/B/C)不同、文案全同,品牌词"倍分子"已正确植入。是否要三套各配不同角度文案?
|
||||
- [x] **A9**〔auto〕产品 JSON 导出:✅2026-06-18 ws3实测:export_products返3条,selling_points类型=list(['烟酰胺改善暗沉提亮','水解珍珠锁水匀肤']非JSON字符串);端点真注册路由表+顺序在/products/{product_id}之前(idx9<13不被吞)。
|
||||
- [ ] **A10**〔auto〕标杆 CSV 导出:⏸️逻辑已审(CSV带UTF-8 BOM+JOIN Product填product_name+json/csv双格式),但ws3无标杆数据未触发真导出;待录标杆后验或Z阶段一条龙带验。
|
||||
- [ ] **A11**〔auto〕导出权限:⚠️审计注——require_write_permission 当前只查 workspace_members 不分角色(workspace_guard.py:65-88);未登录调 → code=40101,workspace 成员 → 200。【两端点均挂require_write_permission,独立审核确认】
|
||||
- [ ] **A12**〔human〕不显 token 余额(红线):⚠️审计改 human(curl 拿不到Next.js水合后DOM)——浏览器 Ctrl+F 搜"余额/用量/tokens/balance"无结果。【HistoryFilters/page/components均无余额字段,独立审核确认】
|
||||
|
||||
## 待北哥定义(不阻断代码)
|
||||
- 多套打包图片套间对应:ImageCandidate 无 set_index,是否加列关联文案?还是退化"图共享复制进每套夹"(本期默认退化)。
|
||||
|
||||
Reference in New Issue
Block a user