# ⑤ 组装 payload + 校验（纯代码，不用 LLM）

把 ②③ 标完的 `framework.json` 的 **每一颗 `knowledges[]`**，机械组装成一个 ingest payload。没有判断，全是拼接 + 校验。一帖 N 颗 → N 个 payload（共享 source.id）。

## 1. 每颗 → 一个 payload（按类型分拼）

| payload 字段 | How | What | Why |
|---|---|---|---|
| `source` | 照抄 framework.json 的 `source`（三类一样） | | |
| `title` | 该颗 `title` | | |
| `dim_creations` | `["创作"]` 写死 | | |
| `dim_attributes` | `["how工序"]` | `["what构成"]` | `["why原理"]` |
| `content` | 目标+步骤(目的/怎么做/产出)拍平（str） | **结构化对象** `{name,kind,维度拆分规则,body[]}`（概要入 custom_ext） | `阐述` 一段（str：是什么+为什么，忠实整合） |
| `scopes` | **各步 `作用域` value 去重并集** | **颗级 `作用域`** value | 颗级 value |
| `custom_ext` | 业务阶段 + 创作阶段(各步去重) + 动作(各步) | **业务阶段 + 概要** | **仅业务阶段** |

### content 拼法
- **How**：`目标：<purpose>\n步骤1（目的：<intent>）\n  指引：<directive>\n  产出：<output>\n步骤2…`
- **What**：`content` 是**对象**（非字符串）：`{"name":<title>, "kind":<子集/多维关系/序列>, "维度拆分规则":<仅子集，否则 null>, "body":[{"item_name","item_desc","作用域":[]}]}`；`概要` 不进 content，作为 `custom_ext` 一条（key=概要）。
- **Why**：`content` = `阐述` 一段字符串（这条原理是什么+为什么，忠实整合原帖；**不含"怎么用"**）。无小节、无形式。
- （What 已无小节/形式、Why 已无主张/支撑/取舍——就一段阐述。）

### 组件颗的溯源
若 `role=="组件"`（parent 非空），在 `custom_ext` 加一条标明出处：
`{"key":"出自","type":"str","value":"<parent how 的 title> 第 <step> 步"}`。
（让下游知道这颗 what/why 是某 how 的零件，但它仍是独立可检索的一条知识。）

## 2. 校验
```bash
python 创作知识提取-skill/tools/lint-payload.py outputs/<帖>/payload.json
```
有 ERROR 必修；WARN 逐条看。

## 3. 备注
- `作用域` 里的 `link/score/top` **不进 payload**（只供前端 drawer 溯源）；payload 只要 scope_type+value。
- 组装与定位都是确定性代码（`scripts/decompose.py` 的 ⑤ 段 + `tools/`），模型不参与这步。
