← 目录
otter-coordinator · 迁移计划 · v1 · 2026-07-27

从现状到 vNext:
新旧并行,按批切换,CRM 先行。

本计划的每一个数字都来自生产库直查(2026-07-25/26/27 快照)。 总策略三句话:CRM 先上、不碰旧系统;只迁 delivery 存量, 谈判上游继续跑、向新系统投递 pick;每一批都可回退, 回退开关(suppress_received_channel_agent_runs)今天已存在。

01
现状盘点

迁移对象到底有多大、什么形状

51,455旧 engagement 总量
(活动×达人×轮)
33,169negotiation 活跃
不迁,留旧系统跑完
8,586delivery 活跃
迁移主体
291,196会话线程
原地不动,只加绑定
4,740deliverable 行
52% 的 delivery 合作为零

结构性事实(决定打法的那几条)

事实数据对迁移的含义
身份层已存在且填满contacts 247 万(person/agency)· creator_profiles 445 万(带粉丝/中位播放)· 经纪关系 15 万条 · 合并机制在用(complete 6.9 万)不建新身份体系,只接线
coordinator 与身份层零外键旧表用 kol_id / creator_handle 文本;39,064 个 kol_id 中 39,053 个只有 1 条记录回填是核心工程(见 §04)
身份可解析性邮箱身份覆盖 34,348 条,其余 17,054 条全部有 handle,孤儿 0存量 100% 有键可回填
handle+platform 撞 creator_profiles唯一命中 contact 39,409(76.6%) · 命中 profile 但未挂人 11,184 · 双命中 373 · 未命中 48976.6% 全自动;1.1 万条脚本挂人;仅 862 条需人工
deliverable 状态无信息量实测单合作 15 条全部 in_progress,日期 0、金额 0;实付有记录的全库仅 16 条阶段要靠映射+运营快速补录,不指望旧数据
会话重复投影实测单达人 20 条记录 × 各挂 30 条同样会话 = 608 行投影新模型 thread 只存一份 + 绑定,迁移时去重
Campaign 容器碎裂Java 侧 455 条(88% 重开)→ 87 组 → 112 product归类在 product 层做:112 行 → 60–80 个 Campaign,运营半天
切换开关已存在suppress_received_channel_agent_runs,逐 engagement 粒度按批暂停→迁移→比对→切回,不停机
范围裁定(来自决定 6)

33,169 条谈判中的合作不迁。谈判上游(现系统 + 外呼)继续运行, 议价成功的由运营 pick 进新系统。旧系统随谈判存量自然收敛,不需要「大迁移日」。

02
总策略

三条原则,五个阶段

P0 止血(可立即,与重构无依赖)
P1 身份接线 + CRM 上线(L0)
P2 Campaign 归类 + 建档管线 + delivery 存量迁入
P3 Studio 手动看板(泳道/引用/快捷操作)
P4 L1 只读理解 + 付款采集确认
P5 Campaign 变更发布 → L2 起草待审 → L3 全自动
03
阶段计划

P0 – P5,每阶段带验收和回退

P0 · 止血(3 个独立 PR,不等重构)

内容验收
催办停摆 bug旧提醒唯一索引加 deliverable_id;isMilestoneActive() 补交付物谓词多交付物合作各自催办互不掐断
沙箱隔离沙箱停用生产 referenceId 与出站;为 P2 起的 env='sim' 打底拔掉沙箱代码,生产零变化
旧系统消息清洗入库剥追踪链接/UI 状态 + 群发/自动回复分类(纯规则)legacy 谈判侧 prompt 尺寸显著下降;新 CRM 直接受益

P1 · 身份接线 + CRM 上线(L0)

P2 · Campaign 归类 + 建档管线 + 存量迁入

P3 · Studio 手动看板

P4 · L1 只读理解 + 付款采集

P5 · 变更发布 → L2 → L3

04
数据迁移细则

三张映射

① 身份回填阶梯(存量 51,455 → contacts)

覆盖(实测)处置
1scouting 来源 / platform_user_id确定性自动
2唯一 handle+platform → 唯一 contact39,409(76.6%)自动
3命中 profile 但 creator_id 为空11,184脚本先挂 profile→contact(机械),再回填
4双命中 373 + 未命中 489862人工队列,绝不猜;邮箱/手机只出候选

铁律:允许「身份未解析」长期存在;错误合并会把一个达人的记录暴露给另一个,比留白严重得多。 写入前先解 merged_into;contacts 合并事务同步收敛新表(先于任何新表写入上线)。

② 旧里程碑 → 新阶段

旧(deliverable 级)新阶段备注
S1 选品product_pickB3 合同签署 → collaboration.agreed_at;
A/B/F/G/N 系(engagement 级)不迁,
谈判语义留在旧系统
L1 寄样 / L2 签收sampling / logistics
C1 脚本 / C2 脚本改script / script_rev
D1 样片 / D2 样片改cut / cut_rev
E1 发布 / P1 打款publish / payment

映射只定「当前阶段」初值;历史轮次(哪一版脚本改了几次)旧数据没有,不伪造 —— 从 P3 起真实累积。 distribute 初值从旧 crossPosts 带入。

③ 会话归组回填

05
护栏

安全与可观测

依赖关系一句话

P1 依赖 P0 的消息清洗;P2 依赖 P1 的身份接线与运营归类;P3 依赖 P2 的建档; P4 依赖 P3 的人工基线;P5 依赖 P4 的采纳率数据。P0 和 P1 今天就能开工。


数据快照:2026-07-25/26/27 生产库直查;方法与明细存 Research/coordinator-vnext/evidence/。
设计定稿:《设计文档》 · 周会版:presentation