<aside>
🔎
结论:推荐在最新 dev 上重做的 Search Person V2,而不是继续 PR #89。 新版本只增加一个只读工作流工具,移除了 PR #89 混入的 WebSocket JWT、通用输出约束和无关测试;身份确认与 Contact 写入严格分离。
</aside>
文档状态与关联
- 状态:In Review;代码分支
codex/ail-546-search-person-v2,基于 dev@fdbf2ad
- Linear:AIL-546【优化】LinkedIn 工具优化
- 旧实现:PR #89 已关闭、未合并;Before 基线固定为其 head
2530f171...
- 新实现:PR #90(Draft)
- 隐私:内部案例只保留失败机制并已伪名化;没有生产 user id、task id、联系方式或登录态链接
为什么不用 PR #89 原样
PR #89 的核心方向正确,但 49 个文件、约 3968 行新增把人物搜索与 WebSocket JWT、输出约束、Calendar/WS 测试等绑在一起。它还存在两处会让“报告通过但生产错误”的缺陷:
- 陈旧顶层
position 会覆盖更新的结构化 currentPosition,导致平铺 current company/title 错误。
- 不可靠的精确字符串命中会提前遮住可靠的部分命中,降低证据质量。
- Before/After Eval 直接重放 scorer 候选,绕开 normalizer,因此没有发现第 1 个生产路径缺陷。
- 日志与评估材料里包含的内部标识不适合进入新 PR。
本版本保留任务需要的只读搜索边界,并为 normalizer/scorer 分别加回归测试。
最小系统边界
- Agent 只调用
search_person,输入规范姓名、来源已验证 alias、公司/职位/地区,以及 current | historical | any 时间语义。
- 工作流最多并发 3 条有界召回路径:canonical name、首个 verified alias、structured context;共享 90 秒 deadline,每路最多 20 条。
- 本地客户端封装 Actor run → poll → Dataset lifecycle;工具不会向模型暴露 run id、dataset id 或 Provider mechanics。
- 归一化只允许姓名、LinkedIn URL、headline、公司/职位/地区、current/historical position;按规范化 LinkedIn URL 去重,以 RRF 仅作同分排序。
irs-v2 以规范姓名/已验证 alias、时间化公司/职位、地区打分;缺失是 unknown,不是 conflict。