# 裂变重写核销表（对齐上线版 split.js：一次出N套完整包）

> 倩倩姐 2026-06 拍板：①架构=一次LLM出N套完整笔记包 ②N套存FissionNote表+独立展示页 ③参考度保留三档枚举,内部映射数值(low=35/mid=60/high=82)。
> 断点可续；做完一项物理勾一项；报✅必附真实证据。

## 🔴 规则清单（开工前每人逐条确认，违反即返工）

| # | 红线/约束 | 后果 |
|---|---|---|
| R1 | QUALITY_PASS_SCORE=80 任何地方不得改 | 返工 |
| R2 | 生图引擎零改动：不碰 image_gen.py/storyboard.py/pipeline_io.run_image_generation | 返工 |
| R3 | 模型最强档：文字 claude-opus-4-8，回落 gpt-5.5(codeproxy)，绝不降 sonnet | 返工 |
| R4 | 新建文件目标≤100行上限200行；单次编辑≤100行（超先建框架再Edit） | — |
| R5 | 裂变三档真实措辞待北哥定义，本次用占位但接口按"内部数值"做对 | — |
| R6 | 差异化质量验收（北哥过目N套真差异）搁置，不在本次范围 | — |
| R7 | LLM 走 chat_complete(OpenAI兼容 messages[system,user])，不是上线版/v1/messages原生端点 | 风险1 |
| R8 | FISSION_SYSTEM 作 messages[0].role=system 传，不是顶级system字段 | 风险1 |
| R9 | llm_score_copy 是 async，Celery同步环境用 asyncio.run 不能直接await | 风险 |
| R10 | 参考度入参保留 low/mid/high，内部 _LEVEL_TO_INT 映射，DB列不动不加迁移 | 已拍板 |

## 数据结构（已拍板）
- **新建 FissionNote 表**（018迁移）：每套笔记一行，存 文案JSON+score+passed+imagePlan+images+status。
- reference_level DB列保持 String(low/mid/high)，**不改**。
- FissionTask 状态机：pending→generating_text→text_done→generating_images→done/failed
- FissionNote 状态：pending→scored→image_done→failed

## 文件改动清单与核销

### 后端
| # | 文件 | 改什么 | 编辑轮次 | 状态 |
|---|------|--------|---------|------|
| B1 | models/fission.py | 追加 FissionNote class(~50行) | 1次 | ✅ 已加(103行,含idx) |
| B2 | alembic/versions/018_fission_notes_table.py | 新建迁移 create_table+index(~40行) | 新建 | ✅ 已建(rev018←017) |
| B3 | ai_engine/fission_prompt.py | 全量重写:_LEVEL_TO_INT+reference_strategy_from_level+FISSION_SYSTEM+build_fission_prompt+sanitize_image_plan_text+normalize_tags+notes_array_from_parsed | 4次 | ✅ 183行;品类兜底超200行拆至 fission_fallback.py(145行) |
| B4 | services/fission_service.py | 重写:create_fission改丢Celery+编排(一次LLM出N套→评分→排序→落FissionNote→喂生图) | 4次 | ✅ 超200行拆3文件:service入口76行/fission_pipeline.py编排179行/fission_images.py生图81行 |
| B5 | workers/tasks.py | 追加 run_fission_pipeline Celery task(~35行);删旧裂变扇出注入(build_fission_context已删) | 1次 | ✅ 已注册(celery inspect registered见run_fission_pipeline);实测task5 worker日志"run_fission_pipeline start: fission_id=5 src=76"真触发 |
| B6 | api/v1/fission.py | 进度改读FissionNote聚合+新增 GET /fission/{id}/notes | 2次 | ✅ 117行,py_compile过,清掉GenerationTask import,进度按FissionNote.status聚合,notes端点剥_score/_passed内部字段+workspace隔离 |

### 前端
| # | 文件 | 改什么 | 状态 |
|---|------|--------|------|
| F1 | components/fission/FissionProgress.tsx | 进度数据源改读FissionNote结构 | ✅ status对齐generating/completed/failed,去掉子任务入口,完成跳/fission/{id}/notes展示页 |
| F2 | app/fission/[id]/notes 展示页(或组件) | 新建N套笔记展示页(标题/正文/标签/封面/imagePlan/图) | ✅ page.tsx(116行框架+类型)+FissionNoteCard.tsx(分数徽章/文案/标签/图网格/imagePlan),tsc全过 |
| F3 | FissionLauncher.tsx | 三档保留,零改动(确认即可) | ✅ low/mid/high三档+POST契约(reference_level/fanout_count/回调fission_id)与新后端一致,零改动 |

## 生图触发方案（已定）
方案一：裂变Celery任务内对每套FissionNote串行调 generate_storyboard_images(现有接口零改动)，结果存 FissionNote.images_json。评分用 asyncio 并发限2(参考image并发模式)。

## 验证方案
- TDD: tests/test_fission_engine.py — reference_strategy_from_level/sanitize/normalize_tags/build_fallback_notes/infer_category/评分每套独立@80 | ✅ 19 passed(197行)
- 集成: mock LLM固定JSON → parse N套→各评分→合格套排序→不合格降草稿不丢弃 | ✅ test_fission_engine(parse 4例:全套/imagePlan校正/markdown包裹/兜底不崩) + test_fission_pipeline.py(_score_notes 5例:合格线/违禁词硬拦/异常记0/多套) 全过
- 端到端: POST /fission→状态done; 一次LLM拿N套完整字段; imagePlan数=image_count; score<80标needs_optimization非丢弃; 兜底不报500; 生图走现有接口 | ✅ **真实容器实测task5(fanout=2,mid,src=76)2026-06-18跑通**: POST返回fission_id=5→worker一次apiports/chat拿2套完整(title/content/tags/imagePlan)→seq0=85分passed/seq1=79分needs_optimization=1非丢弃(R1守住)→生图走codeproxy/v1/images/edits(R2现有接口零改动)→落FissionNote→task=completed→GET/fission/5/notes返2套完整数据内部字段(_score/_passed)零泄漏;图1024×1536(对齐大卫去AI化未强缩);apiports503→回落codeproxy gpt-5.5(R3铁律真生效,日志"强档兜底非降级");seq1 hook图codeproxy重试3次失败被捕获记error不阻塞不崩任务(健壮性正确)
- 交叉审: 另起独立agent重核, 不信第一遍 | ⏳ 进行中
- 全量回归: tests/ 104 passed(顺手补 test_integration_seams mock product 缺 brand_keyword/target_audience 字段,非裂变引入的预存在失败)

## 风险点
1. FISSION_SYSTEM端点格式(chat_complete非/v1/messages) — 最易踩
2. max_tokens按note_count缩放,实测超时加FISSION_MAX_TOKENS env
3. FissionNote前端展示(已定独立展示页F2)
4. build_fallback_notes品类映射表完整移植(~80行,单独一次编辑)
5. 评分并发vs串行(asyncio.gather限2)
6. FissionProgress进度数据源同步改(F1)

## 搁置/待北哥（攒批）
- 裂变三档/参考度真实业务措辞
- N套真差异化质量验收(北哥过目)
