← 目录
otter-coordinator · 语义迁移与身份翻转 · 线上核实 · 2026-07-25

Engagement 不再是「一个活动里的一个达人」,
而是「这个达人本身」。

这是这轮讨论里最大的一处结构变化——它把整个层级倒过来了。 我去线上算了翻转之后的实际形态:好消息是身份 100% 可解析,零孤儿; 坏消息是有一类记录会直接把模型撑爆,必须在设计里处理掉。

01
按你的定义

词汇表:把语义搬过来

Scheduler Campaign(旧) 455 条。按月/平台/国家/重试裂开,88% 不是第一次尝试
Scouting(新名) 一次招募尝试。运营在 Scheduler 侧看到的就是这个。随便开,那是它应有的行为。建成后必须先关联到一个 Campaign 才允许创建
(不存在) 上游三层都没有这个概念,它只存在于运营脑子里
Campaign(新语义) 客户 × 产品线。稳定,季度级。Coordinator 本地拥有,运营直接建,不碰 Java
Engagement(旧) = 活动 × 达人 × 轮次。51,402 条。同一个人参加第二个活动就是一条全新记录
Engagement(新语义) = 这个达人。像 Salesforce 的 Account。名下挂多次协同——可跨活动,也可同活动复购
Deliverable 今天 4,740 条,52% 的交付合作一条都没有
Deliverable = 泳道 实际记录与推进的单位。创建即播种至少一条

Campaign 边界的判定标准

你给的定义,我认为这是全场最好的一条

能不能单独出一张提报表 / 进度表来审核 —— 实质上就是「对接人是不是同一批」。

这个定义的好处是它不是分类学,是组织边界:一个 Campaign = 一个审核面 = 一批客户侧对接人。 分类学会永远争论「Temu 日本 IG 算不算独立的」,而「谁来审这张表」是个有确定答案的事实问题。

落到今天的数据上:112 个 product 里,像 Temu-东南亚 / Temu-中欧 / Temu日本IG 这种按地区裂开的, 很可能是同一批对接人 → 合并;而 Temu-科技 / Temu-玩具 / Temu-IG女装 这种按品类裂开的,大概率是不同对接人 → 保持独立。

所以最终 Campaign 数会落在 49(纯品牌)和 112(现有 product)之间, 我估 60–80。而且这个判断只有运营能做——正因为如此,归类必须是一次人工动作, 不能指望规则自动切。112 行,半天。

02
线上核实

翻转成 creator 级之后,数据长什么样

51,402今天的 engagement
34,348有邮箱身份
(66.8%)
17,054无邮箱但有 handle
0两者都没有
零孤儿
迁移可行性:通过

100% 的存量 engagement 都能被「邮箱 or handle」识别到一个达人身份。 不存在无法归属的记录。这比我上一版估计的(33% 需要兜底)乐观得多—— 因为兜底键 creator_handle 的覆盖是完整的。

但有一类记录会把模型撑爆

按邮箱聚合后,单个「达人」名下的会话数分布:

p50p90p99最大说明
2161058,725平均 9.2 —— 但尾部完全失控

去查那个 8,725 是谁,结果非常明确——全是 MCN / 经纪公司的公共邮箱:

域名该域邮箱数关联 engagement单个最大会话数
slogansocial.com632338,725
influint.co221517,604
dolfincontent.com4652,133
tiddle.io251621,904
stride-social.com / influencernexus.com / purecreative.cz各 1–514–29684–867
这不是脏数据,是一个缺失的渠道属性

一个经纪公司的邮箱代表的是很多个达人,不是一个。 如果按邮箱无差别合并,slogansocial.com 会变成一条名下有 233 次合作、 8,725 条会话的「超级达人」——这条记录在界面上打不开,在业务上也没有意义。

但要害不在于「需要一种新的 Engagement」,而在于——这个邮箱不该被当作身份合并键。 问题出在渠道那一层,不在合作主体那一层。

好在这类记录数量很少,可以精确圈出来:

23,673只有 1 次合作
直接建档
5,3302–5 次合作
自动合并,这是复购主体
1836–20 次
需人工确认
14>20 次
几乎必然是经纪公司

正确的位置:把标记打在渠道上,不是打在 Engagement 上

Agency 是一种沟通渠道类型,不是一种合作主体。 我们只是给某个邮箱打一个标注,说「这是经纪渠道」——它和 Engagement 没有结构关系。

contact_channel(id, kind, address, label,
                channel_type,   -- 'personal' | 'agency' | 'shared_inbox'
                mergeable)       -- ← agency / shared_inbox 默认 false

-- 身份合并只吃 mergeable = true 的渠道。
-- slogansocial.com 打上 agency 之后,它就不再是合并键,
-- 它名下那 233 条合作各自按 creator_handle 归属到真正的达人。
这样做的三个好处

① Engagement 不需要类型字段,永远只有一种:达人。
② 泳道模型不用开特例——泳道始终基于交付物,只是「联系方式」那一栏可能指向一个经纪邮箱。
③ 标注是渐进的。今天打 14 个,明天发现新的再打,不需要一次性把身份图算对。

于是合并规则变得很简单

≤5 次合作的邮箱自动合并(29,003 条,占邮箱身份 99.3%); >5 次的 197 条进队列,人只做一个判断:这是不是经纪渠道? 是就打标记退出合并,不是就正常合并。

一两个小时的活,而且判断内容非常轻——只看一眼域名就够了, 不需要理解业务上下文。

03
新层级

倒过来之后

今天   Campaign(455,乱) ──▶ Engagement(活动×达人,51,402) ──▶ Deliverable(4,740, 52% 缺失)
                              同一个人在 8 个活动里 = 8 条互不相干的记录

之后   Engagement(达人本身)
         ├── identity[]        email / phone / handle,可 merge / unmerge
         ├── kind              individual | agency
         └── Collaboration[]   一次协同 = 一个 Campaign × 一轮
                ├── campaign_id      ← 稳定的归属(客户×产品线)
                ├── scouting_id      ← 来源:哪一批找来的,只用于溯源
                ├── reference_id     ← Java 的 campaign×creator 键,挂在这一层
                └── Deliverable[]  泳道。创建即至少一条
一个必须注意的技术细节

reference_id 是 Java 侧的「campaign × creator」键,今天它挂在 engagement 上, 还有一条唯一索引 coord_eng_active_ref_uq(活跃 engagement 内唯一)。 翻转后它必须下沉到 Collaboration 层——因为一个达人名下会有多个 reference_id。 这条索引的迁移是整个改造里最容易出事的地方,因为入站路由正依赖它

04
你的两阶段

先当 CRM 用,再把 Agent 装回去

阶段Engagement 是什么Tab 1 泳道Tab 2 CRMAgent
阶段一
Inbox 关
已经是达人级,名下多条会话 灰掉 / 只读 主力界面,纯人工沟通
suppress_received_channel_agent_runs
阶段二
切回开启
同上,加 Collaboration + Deliverable 主力界面,实时推进 继续可用,人随时插手 新版本,从消息重建状态
为什么这个顺序是对的

身份翻转只做一次,在阶段一就做完。 阶段一不需要 agent,所以翻转出问题时 影响面只有「界面上这个人的记录对不对」,而不会变成「把错的价格发给错的人」。 等身份稳定了、运营用顺了,再把 agent 装回来——这时它读的是一个已经被人工验证过的身份图。

05
界面

两个 Tab

@laura_makes 3 次协同 · 2 个 Campaign
laura@…(主) · +65 9xxx4471 · mgmt@tiddle.io 经纪渠道 累计已付 $4,200 首次接触 2026-04-11 按时交付 3/3 · 返工 0
Campaign · Temu 科技 交付中 scouting: Temu-科技 #7 · 谈成 $1,000 · 已付 $1,000
视频 1 · TT已付 发布证明已收 ↳ 7/21 达人消息 $1,000
视频 2 · TT球在我们 脚本 v2 等我们审 · 达人 7/23 已交 超时 2 天
视频 3 · TT球在达人 30 秒开场钩子改写 ↳ 我们 7/12 的原话 13 天
Campaign · CapCut 剪辑工具 谈判中 scouting: CapCut YT 2026-07 #12 · 对方 $1,800 / 我方 $1,200
交付物 1待定价 创建时即播种的预置泳道,谈成后按价格条目展开成 N 条 6 天
Campaign · Pippit 已结 2026-04 · 2 条已交付 · 已付 $3,200
历史按时 · 0 返工 这一行就是复购依据 —— 翻转之前它在另一条 engagement 上,看不见 $3,200
06
还需要你定的

三件事

  1. 经纪渠道标注谁来维护、维护到什么粒度? 按域名整体标(*@tiddle.io 一律是经纪渠道),还是按具体邮箱标?
    我倾向按域名标 + 允许单个邮箱覆盖——因为经纪公司往往一个域名下几十个邮箱 (slogansocial.com 就有 63 个),逐个标不现实。
  2. 阶段一要不要就把 Campaign 归类做完? 泳道要按 Campaign 分组,所以阶段二一定需要。但阶段一只用 CRM 的话可以先不归类。
    我建议阶段一就做——112 行半天的活,而且它决定了 Scheduler 侧「必须先关联 Campaign 才能创建」这条约束什么时候能上。
  3. reference_id 下沉到 Collaboration 时,入站路由怎么灰度? 这是整个改造里唯一会直接影响「消息进错地方」的改动。建议双读一段时间: 新路径解析后与旧路径比对,不一致就落队列人工看,连续 N 天零差异再切。

数据取自生产库直查(2026-07-25):coordinator_engagements · engagement_channel_identities · coordinator_engagement_chat_threads · campaigns / products
相关:Research/coordinator-vnext/04-vnext-architecture.md