# 标签层级迁移一键包
## Before
用户连续提出:把图片移动到图片下面、上团购链接移动到如何上架、两个旧类合并为商品修改、未命中目标范围改名为其他、人工领域也按同一套层级重构。
执行方式依赖临时脚本和人工记忆,容易出现文件名是新版本但源数据仍取旧版本的问题,例如 v27/v28 产物里残留 v26 旧标签。
## After
先写规则:
```yaml
migration_id: 商品域_v26_to_v28
source_version: v26
target_version: v28
invariants:
row_count: 9335
session_count: 9335
rules:
- type: merge
from_path:
- 价格/库存/购买规则调整
- 商品信息与素材维护
to_path: 商品修改
child_label_source: 目标对象表
old_bucket_expected_remaining: 0
- type: rename
from_path: 未命中目标范围
to_path: 其他
- type: move
from_path: 定邀/报白/白名单准入
to_path: 商品类目/定邀/报白/白名单准入
expected_count: 101
```
再跑一键包:
```bash
python data-analysis-workspace/scripts/taxonomy_migration_audit_pack.py \
--input output/v26/session_detail.csv \
--rules data-analysis-workspace/config/taxonomy_migrations/商品域_v26_to_v28.yaml \
--out output/taxonomy_migration/商品域_v28
```
产物必须包含:
| 产物 | 用途 |
|---|---|
| `detail_v28.csv` | 迁移后逐行明细 |
| `summary_v28.xlsx` | 一级/二级/子类汇总 |
| `review_v28.html` | 可人工复核页面 |
| `migration_audit_v28.xlsx` | 每条规则命中数、旧类剩余、新类增量 |
| `manifest.json` | 输入、规则、输出、断言结果 |
成功信号:`row_count=9335`、`session_count=9335`、旧类剩余为 `0`、所有规则都有命中统计、HTML/CSV/XLSX/manifest 版本一致。
失败信号:源文件版本与规则版本不一致、旧类未清零、规则未命中、迁移后总行数变化、未命中项超过阈值。失败时脚本不写最终版文件,只写 `failed_audit/` 供复查。