| name | pxb-liepin |
| description | Pixboom 招聘搜人筛人作业流程(猎聘 liepin-cli),为任一岗位搜候选人、筛简历、提报、 维护候选人池/去重台账/JD 记录。当用户说"搜人""下一轮""继续搜""筛简历""提报候选人" "开简历给我看""出 PDF""更新候选人池",或要为某岗找人/筛人时使用;岗位招满或用户说 "这个岗招完了/先暂停"时,走本流程的收官复盘(步骤 7)。岗位标准看该岗 JD,本流程岗位中立。 |
Pixboom 搜人筛人作业流程
⚠️ 改本 Skill 前先想:这里只放所有岗通用、可复用的作业流程。单一案例/某轮/某岗经验 → 进该岗 JD.md,不进这里。
每岗四件:JD.md(对外 JD + 内部备注表,判断只看它)· 去重台账.csv(resume_id,status,仅去重)· 候选人池.md(确认候选人)· 待定/(简历 PDF 中转)。
路径:命令里 <岗位>\… 相对工作区根(本 CLAUDE.md 所在);脚本全在 .claude/skills/pxb-liepin/scripts/,命令都写全路径,原样可跑。机械活全在脚本、跨 Win/mac;判断在本文 + agent。
全流程:两层循环,主 agent 串行自跑
P. 聊全 JD → 0. 体检+抢锁 → 0.5 登录 → 1. 粗筛 → 2. 精筛 → 3. 够一批没(没够回 1)→ 4. 出 PDF 交用户 → 5. 入池 → 6. 迭代回 0;招满/用户喊停 → 7. 结项复盘。
- 不派 subagent:单账号单锁串行,subagent 无并行收益、反而启动慢易卡死;主 agent 从头跑到尾。
- 小循环(1-3,自跑、不打扰用户):搜一页 → 粗筛挑 ~10 → 精筛 → 对口标
待定 → 没攒够回步骤 1,连轮跑到攒够 ~5 个 待定。绝不跑一轮就停等用户。
- 大循环(4-6,用户校准 JD):出一批 PDF → 用户复核 → 入池 → 迭代回写 JD(重点是进化关键词)→ 下一批。JD 越调越准、小循环越搜越准。
- 上下文:脚本只输出窄表。看完做完判断后记住结论即可(
待定 的 id=标签、方向感、哪个词有效),别把整页窄表一直留着;轮数多了丢旧轮明细。
状态机(去重台账只此 5 值,全程走 dedup.mjs,绝不手改 CSV)
未精筛(捞回来没细看的干净库存)→ 粗筛不合适(卡片就否)/精筛不合适(细看后否,含用户毙掉的)/待定(细看够格、出了 PDF 等复核)→ 入选(用户拍板要了)。
心跳 + 输出纪律(治"闷头静默"和"过程废话/散问打断")
- 边跑边报:每跑完一轮先发一行进度再继续,别让用户 10-20 分钟看不到动静。格式:
第N轮(词:X):搜A/精筛B/新增待定C,累计 D/目标 E,继续…。心跳是单向,不算打扰。
- 心跳就那一行:逐人淘汰理由、本轮发现、推理全留你脑子里 + JD 表,别讲给用户。
- 交付干净:出批消息 = 几份可点 PDF + 问为什么,别夹每轮过程、复盘、SKILL 自测。
- 决策别打断、给推荐、能不问就别问:破例/放宽约束/停搜这类才需用户拍的,优先带推荐先做可逆一步(照推荐先提报、复核可撤),决策点在交付里一句话点出;真要问就攒一处、一次问清、每条附推荐,别过程里东一句西一句、也别没问完就干等。照 JD 能自己判的,别问。
全程红线
① 单账号串行,绝不并发调 liepin。② 反爬宁慢勿封:脚本非零退出即停、别密集连刷(脚本内已带抖动)。③ 原始 JSON 不进上下文(脚本只输出窄表)。④ 隐私:简历只存本地、不外发、不传外部服务。⑤ 只 search/resume,不 greet(沟通归 HR)。⑥ 只走脚本(search/fetch/pdf/jd-round,已强制无头),除用户手动 liepin login 外绝不裸敲 liepin(裸调发布版默认有头会弹窗)。全程不该弹任何浏览器窗口;弹了 = 有人裸调或没登录 → 停手排查、别继续刷(可选安全网:装完跑一次 patch-headless.mjs)。
脚本无参运行会打印用法;任一脚本退出码 ≠ 0 = 停手,按报错处置(多半反爬/被踢/未登录)。
P. 开搜前:把 JD + 人员画像聊全(主 agent+用户,不碰 liepin、不抢锁)
搜任何人之前,先把该岗 JD + 人员画像补到能搜的状态——判断全程只看它,补不全 = 瞎搜、多轮返工。在对话里完成。
🟢 怎么聊(最重要):像懂行的猎头跟用人方对齐需求,用人话把"要什么样的人、这种人在哪、什么样的看着像其实不是"聊明白。下面的"三锚/锚一二三"是给你对照的内部清单,不是台词——别把这些词、别"锚一锚二"这样列条目念给客户。自然地问、一次一两点。
⓪ 建档(新岗第一次):node .claude/skills/pxb-liepin/scripts/init-role.mjs "<岗位>" 一键复制模板三件 + 建 待定/、参考简历/(幂等,只补缺不覆盖)。
① 补事实(填 JD 硬约束行):预算/城市/经验/学历/年龄/目标人数。缺的顺嘴问,别追问"预算够不够"——按预算搜,真枯竭(步骤3)再谈。
② 聊画像(内部对照"三锚";别问"最看重什么能力/不要哪类人"这种抽象话,客户答不出也喂不进搜索):
- 这种人在哪、叫什么 — JD 不写目标公司,得你配:读
_共享\公司档案.md × 岗位性质,网络检索+判断出"对标/竞品/上下游/相邻行业藏这类人的公司"分类清单,带职位名变体+锚点词,交用户勾选。落 JD「开搜前三锚」块 + 喂第一轮强词。
- 标杆长什么样 — 用户有样板简历就放
<岗位>\参考简历\,真读(不读=没意义)抽正向画像/出身公司/技能锚点 → 落 JD 正向建议首行。没样板靠上一条兜。
- 什么看着像其实不是 — JD 只说谁合适;自然问"哪些行业/公司/岗位,乍看像这份 JD、其实不对路?"(走量客服像客服、镜头单件像整机结构)→ 落 JD 负向建议首行 + 排除词。
intake 完成判据(逐项勾齐才回写 JD、进步骤0;别用"感觉够了"代替):① 硬约束行填满 ② 目标公司清单已交用户确认 ③ 样板已读或已标"无/欠" ④ 反向锚已问或已标"欠" ⑤ 用户说"就按这个搜"。
- 答不全很正常(真实录取线常要看到拒绝才说清)→ 有样板靠样板三角定位,答不出的标"第一轮校准时确认",照样开搜。
- 快速通道:用户明说"立刻搜、先欠着" → 放行但记一笔欠哪块;第一轮当校准用(出批后按反馈补)。成熟 JD + 画像齐 + 用户直说搜 → 快速过一眼即可。
0. 开工体检 + 排队 + 抢锁(锁的生命周期只此一处,别处只引用)
开工先体检、看现场:
node .claude/skills/pxb-liepin/scripts/doctor.mjs
node .claude/skills/pxb-liepin/scripts/dedup.mjs stats "<岗位>\去重台账.csv"
- doctor 报 liepin-cli 落后最新版 → 一句话告知用户并推荐更新,用户点头才动:
npm i -g @viyzhu/liepin-cli → 再跑一次 doctor 全绿才开工(无头安全网补丁会被覆盖,按 doctor 提示重打)。用户说先不更 → 记一句照旧开工。
待定 > 0 = 上批还挂着:先清算(交付复核/催用户拍板,走步骤 4-5),清完再开新搜。
- 队列里挂着孤儿
进行中(没有会话在跑它)→ 复位成 待办。
搜人先往 _共享/搜索队列.md 追一行 待办;当 worker:抢锁 → 挑最早 待办 → 跑 → 标完成。
node .claude/skills/pxb-liepin/scripts/lock.mjs acquire <岗位>
node .claude/skills/pxb-liepin/scripts/lock.mjs renew <岗位>
node .claude/skills/pxb-liepin/scripts/lock.mjs release <岗位>
- 一把锁 = 一"批":
acquire(本批首轮前)→ 每轮 renew → 步骤4 出 PDF 时 release(复核是纯等待、不碰 liepin,把账号让给别的岗)→ 复核完回来搜下批再 acquire。别从头持到尾(饿死别的岗),也别每轮 acquire/release(和排队打架)。
- renew/release 都带岗位名:锁在别岗手里续不动也放不掉(退出码 1 = 重新排队);liepin 每次成功调用会自动续锁,长回合不会中途过期。
- 多岗同招各自在队列排队;靠"批次边界释放锁"自然交错。
0.5 登录:自己探,别问用户登没登
直接拿第一轮 search 当探针:search.mjs 强制无头、不弹窗,跑得通=已登录,连着往下跑;只有脚本报未登录才登录。
1. 粗筛(脚本自动登 CSV)
node .claude/skills/pxb-liepin/scripts/search.mjs "<岗位>\去重台账.csv" "关键词" --city 深圳 --experience 5-10年 --salary 20-30K --degree 本科 --age 25-35 --limit 40
- 筛选器前置(防漂移要点):每轮开搜前对照 JD 硬约束行,凡是筛选器能表达的(
--city / --experience / --salary / --degree / --age)全部传参,让服务端先滤——别搜宽了再靠人工一张张砍,更别拖到精筛才发现硬约束不合。JD 没约束的维度不传(别自行加码收窄召回)。经验/薪资/年龄跨档就传宽档或不传,宁可卡片上砍、不错杀。
- "在职-暂无跳槽打算"默认拦在召回外:
search.mjs 默认带服务端求职状态过滤(--user-status 1,2,5,6,7,排除"在职,暂无跳槽打算""在校,暂时不找工作"——即通用排除③,零人工、不占召回名额)。用户明确要捞被动候选人时才 --user-status 不限。
一步做完:search(带筛选器)→ 去掉台账已召回的 → 新人登记 未精筛 → 打印窄表(id/姓名/现职/年龄/公司/年限/期望薪资/学历/期望职位)。登 CSV 是查重命根,已强制做。
2. 精筛(批量取、按 JD 下判决)
拉粗筛挑的 ~10 份,一个循环拉完 = 1 回合,别开一份判一份:
node .claude/skills/pxb-liepin/scripts/fetch.mjs <id1> <id2> ...
- 单份打不开(已删/隐藏类)脚本会跳过并在结尾列出 → 这些 id 直接
set 精筛不合适;登录/反爬/连续失败才整批停(非零退出),处置后用它打印的命令续跑剩余。
每份过三关(对照该岗 JD):
- 硬约束&去向:硬约束粗筛卡片已初筛;精筛复核
want_city(期望城市不在本岗城市=想迁走,慎留)。
- 正/负向建议:命中正向画像几条?命中负向排除信号 → 砍。
- 真伪:实做主看
work_history 每段的 duty(时间线下那段实际做了啥,精筛主料)——判成色/方向;self_descr 作补充(自述,空泛堆技能名词的警惕注水);再叠薪资-成色错配(带队多年要地板价=注水)、方向偏离 → 砍。段头时长/公司看稳定性(跳槽/空窗)。
通用排除(岗位中立,叠在 JD 上,命中即砍):① 简历空洞看不出职责产出;② 频繁跳槽(多段 <1 年且无任何 ≥2 年稳定段);③ 在职+暂无跳槽打算(work_status"在职,暂无跳槽打算"——约不动、议价难,统一砍;"离职找工作/在职急寻"保留。搜索已默认在服务端排除这档,精筛这里只兜底:发现漏网的照砍并跑 doctor.mjs 查 CLI 版本);④ 近一年无工作(末段结束超 1 年)。①卡片看不出留精筛,②④卡片能初判的粗筛就先排。
归档:过三关、值得给用户看 → 待定;其余 → 精筛不合适("够得着但不对"直接砍)。
node .claude/skills/pxb-liepin/scripts/dedup.mjs set "<岗位>\去重台账.csv" 待定 <过关id...>
node .claude/skills/pxb-liepin/scripts/dedup.mjs set "<岗位>\去重台账.csv" 精筛不合适 <淘汰id...>
3. 够一批没?
跑 node .claude/skills/pxb-liepin/scripts/dedup.mjs stats "<岗位>\去重台账.csv",以台账为准、别心算:待定 ≥ 5(或到目标人数)没?
- 没够 → 回步骤 1 搜下一页(别停问用户)。
- 够了 → 步骤 4。
- 方向熔断:本次循环已粗筛 ~100 人(≈2 页)却 0 进
待定 → 停、反馈用户:搜了 N 人 0 命中,说清都倒在哪关/哪类,多半方向或标准有偏,等校准。别闷头刷。
- 路径枯竭(召回越来越稀)→ 先挖
未精筛 库存;仍无 → 停,报情况 + 换路径建议。
4. 出 PDF + 交用户(不开网页)
这批 待定 一次性出 PDF 到 待定/。默认不开 Chrome(占 profile 挡搜索)。
node .claude/skills/pxb-liepin/scripts/pdf.mjs --dir "<岗位>\待定" "<id1>=张三-大疆" "<id2>=李四-影石"
node .claude/skills/pxb-liepin/scripts/lock.mjs release <岗位>
- 脚本非零退出 = 有登录页/坏 PDF:FAIL 的别交付;登录页先
liepin login 重登,再用它打印的命令续跑剩余。
交付消息只两样:①把 pdf.mjs 打印的每份路径列成可点链接([姓名·标签](<岗位>/待定/简历_<标签>.pdf),href 用正斜杠,用户点开不必翻文件夹);②问为什么(合适/不合适各带理由——下一轮 JD 收敛的唯一燃料,不能只收"行/不行"):
「这批 N 份出好了,直接点开看:
- [张三 · 大疆](<岗位>/待定/简历_张三-大疆.pdf)
- [李四 · 影石](<岗位>/待定/简历_李四-影石.pdf)
逐个看完跟我说哪些合适、哪些不合适,各自为什么:对的对在哪(背景/公司/作品/某段经历)、不对的差在哪(方向偏/成色虚/硬约束)。说得越细,下一轮越准。」
- 用户只甩"行/不行"没给理由 → 追问为什么(步骤6 全靠它)。
待定/ 留删:入选的 PDF 留下(候选人池直链);落选的拍板后删;下批出新 PDF 前清掉上批未入选的。
5. 入池
用户复核拍板后:
- 合适 →
候选人池.md 加一行(姓名·现职·经验·薪资·学历·一句判断 + [PDF](待定/简历_<标签>.pdf)、[猎聘](https://lpt.liepin.com/cvview/showresumedetail?resIdEncode=<id>)),dedup.mjs set ... 入选,PDF 留下。
- 不合适 →
dedup.mjs set ... 精筛不合适、删 PDF。
6. 迭代:进化下一轮关键词(本流程成败在此)
核心认知:真正改变候选池的只有搜索关键词。 词决定捞来谁(池子),正/负向建议只决定怎么筛。池子捞错,再严的筛也救不回。 别"随便换个词再用更严标准卡一轮"——把上一轮结果当数据、把搜索词当假设来修正。
A. 发动机:扒「入选」简历反推下轮的词(逐个真读,别拍脑袋):
- 职位名变体 ← 他们简历上自称什么?同岗多种叫法都拿来当并列(OR)词。
- 出身公司+当时岗位 ← 来自哪些公司、在那做的什么?某段特别对口往往是那家公司+当时那岗做的事契合 → 开「目标公司」轴,先顺藤摸瓜搜同公司同岗位的人,再扩到其对标/竞品/上下游。
- 技术/工具/项目名词 ← 反复出现的工具/项目/产品词,都是锚点。
B. 诊断本轮每个词、决定怎么调(一次只动一个轴,才看得出哪步起效):
| 本轮表现 | 诊断 | 怎么调 |
|---|
| 召回多但大多不对口 | 太宽/有歧义 | 收紧:加硬约束、换更具体职位变体、加排除词 |
| 召回太少/快枯竭 | 太窄 | 放宽:同义近义词、职位变体,或扩邻近行业 |
| 连 ≥2 轮净入池 0 | 该词判死 | 移进弱搜索词弃用,换锚点 |
关键词轴轮换:① 职位名+变体 ② 目标公司(对标/竞品/上下游)③ 技术/工具名词 ④ 项目/产品名词 ⑤ 邻近行业(本行枯竭时)。公司名别单独当搜索词(召回该公司全职能员工、非本岗位)。
C. 追加一行到 JD 表——用 jd-round.mjs,别手编表格(手编漏个空行就把行甩出表格):
node .claude/skills/pxb-liepin/scripts/jd-round.mjs "<岗位>\JD.md" "R_(日期)·搜A/筛B/提报C" "<强搜索词>" "<弱搜索词>" "<正向建议>" "<负向建议>"
- 强 ← 本轮有效词 + A 步从入选简历新抽的词。弱 ← 本轮无效/太宽/枯竭的词 + 为什么废。正向 ← 用户说的"为什么合适" + 你真读入选的交叉印证。负向 ← 用户毙掉的人归纳成排除信号。每格要点即可,别散文、别重抄硬约束。
D. 回扫错杀(本轮标准/方向有调整时必做,否则越搜越少):先动手 acquire 重新占锁。按新标准复判已召回的库存,别只往前找新词:
dedup.mjs list <csv> 未精筛 → 库存里没细看的,直接精筛(本就是该挖的)。
- 标准明显变向时(某硬约束放宽/新增正向信号)→
dedup.mjs list <csv> 精筛不合适 取近几轮可能受影响的重新 fetch + 复判(要重拉简历、耗调用,只挑相关的、别全表重刷)。
- 翻案的 →
set ... 待定,并入本批。"越搜越少"多半就是只往前搜、不回头捡。
E. 用进化后的关键词回步骤 0 继续,到满额收尾。
收尾自检:召回全登 CSV 了(脚本保证)?待定 都出 PDF 交用户了?未精筛:精筛 ≈ 4:1(dedup.mjs stats)?入选进候选人池了?JD 表用 jd-round.mjs 追加本批行了(强词含入选新抽的词、正向含真读印证)?lock.mjs release <岗位> 了?
7. 结项复盘:收官时给 SKILL 提通用改进(一岗收官只跑一次)
触发:台账 入选 达到 JD 目标人数,或用户明说本岗"招完了/先暂停"。只复盘流程,不返工候选人。
- 收证据,只认事实不凭印象:本岗 JD 内部备注表全部轮次(哪类词反复失效、哪类负向建议反复补)+
dedup.mjs stats 漏斗比例 + 本次全程的返工点(用户纠正过什么、哪步重来过、哪条红线差点破、同一件事问过用户几次)。
- 通用化闸门,逐条过:把每条候选改进改写成不含本岗/本公司/本行业字眼的一句话;改写不出来 = 岗位经验 → 回写该岗
JD.md 备注,到此为止、不进 SKILL。
- 改法只限 SKILL 正文:通过闸门的,落成本文件的具体措辞改动(加一句纪律/改一个提示/挪一个步骤);
scripts/*.mjs 一律不动——各家模型能力不一,脚本问题只写进 issue 留维护者评审。一次最多 5 条,挑影响最大的,别做成大扫除。
- 交用户拍板:提案列成短清单(每条 = 踩的坑 → 建议措辞,标「正文」或「涉脚本,仅记录」);用户点头的当场改 SKILL 正文,没点头的只进 issue。
- 提 issue 存档(发送前正文给用户过目;候选人信息、公司/岗位名一个字不进 issue):
gh issue create --title "[SKILL复盘] <一句话概括>" --body-file <临时md>
正文三段:观察到的问题(通用化描述)→ 建议改法(含已当场改掉的)→ 涉脚本待评审项。没装 gh 或没登录 → 同样内容存 _共享/复盘-<岗位>-<日期>.md,请用户自己去仓库贴 issue。
脚本清单(都在 .claude/skills/pxb-liepin/scripts/,命令写全路径)
| 脚本 | 用法 | 干什么 |
|---|
init-role.mjs | "<岗位>" | 新岗一键建档:复制模板三件 + 建 待定/、参考简历/;幂等只补缺 |
doctor.mjs | [--kill] | 开工体检:cli 版本(下限+是否最新)/无头补丁/锁/残留浏览器;--kill 顺带清残留 |
lock.mjs | acquire|renew|release <岗位> | 单账号搜索锁,30 分钟过期;校验岗位归属,liepin 成功调用自动续;acquire/renew 打印本轮纪律 |
search.mjs | <csv> "<词>" [--city --limit --experience --salary --degree --age --user-status] | 搜(JD 硬约束全传参;默认服务端排除"在职,暂无跳槽打算")+去重+登记 未精筛+打窄表,结尾提示三桶下一步 |
fetch.mjs | <id...> | 批量拉简历窄字段(含逐段 duty),内置抖动;单份打不开跳过列出,账号级问题才整批停 |
dedup.mjs | seen|add|set|list|stats <csv> [状态] [id...] | 台账查重/改状态(5 值)/按状态列 id(回扫)/比例自查;待定 挂账会提醒 |
jd-round.mjs | <JD.md> "<轮次>" "<强>" "<弱>" "<正>" "<负>" | 往内部备注表只追加一行(紧贴上行、转义,免手编甩出表格) |
pdf.mjs | --dir <目录> <id=标签...> | 整页存 PDF;登录页/坏 PDF 非零退出并打印续跑命令 |
patch-headless.mjs | (装完跑一次,可选) | 发布版默认改无头,免疫裸调用弹窗;幂等,npm update 后重跑 |
liepin 命令细节见同目录 liepin-cli skill。环境/安装见仓库根 README.md。