# Pxb Liepin

> Pixboom 招聘搜人筛人作业流程(猎聘 liepin-cli),为任一岗位搜候选人、筛简历、提报、 维护候选人池/去重台账/JD 记录。当用户说"搜人""下一轮""继续搜""筛简历""提报候选人" "开简历给我看""出 PDF""更新候选人池",或要为某岗找人/筛人时使用;岗位招满或用户说 "这个岗招完了/先暂停"时,走本流程的收官复盘(步骤 7)。岗位标准看该岗 JD,本流程岗位中立。

- Skill: `dizhouid-lgtm/pxb-liepin` (Agent Skill, multi-file: 12 files)
- Install (CLI): `npx skillmds@latest add dizhouid-lgtm/pxb-liepin`
- Raw SKILL.md: https://api.skillmd.com/api/skills/dizhouid-lgtm/pxb-liepin/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: dizhouid-lgtm (https://skillmd.com/u/dizhouid-lgtm)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/dizhouid-lgtm/pxb-liepin

---


# 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. 开工体检 + 排队 + 抢锁(锁的生命周期只此一处,别处只引用)
开工先体检、看现场:
```bash
node .claude/skills/pxb-liepin/scripts/doctor.mjs                            # 环境预检;有 ✗ 先修再开工(--kill 清残留浏览器)
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:抢锁 → 挑最早 `待办` → 跑 → 标完成。
```bash
node .claude/skills/pxb-liepin/scripts/lock.mjs acquire <岗位>   # 本批第一轮前。退出码 1=别处在搜,排队;0=占到
node .claude/skills/pxb-liepin/scripts/lock.mjs renew   <岗位>   # 每轮回搜前续命(顺带打印本轮纪律)
node .claude/skills/pxb-liepin/scripts/lock.mjs release <岗位>   # 步骤4 出 PDF 交用户复核时释放(不是流程最后)
```
- **一把锁 = 一"批"**:`acquire`(本批首轮前)→ 每轮 `renew` → **步骤4 出 PDF 时 `release`**(复核是纯等待、不碰 liepin,把账号让给别的岗)→ 复核完回来搜下批再 `acquire`。别从头持到尾(饿死别的岗),也别每轮 acquire/release(和排队打架)。
- renew/release 都带岗位名:锁在别岗手里续不动也放不掉(退出码 1 = 重新排队);liepin 每次成功调用会自动续锁,长回合不会中途过期。
- 多岗同招各自在队列排队;靠"批次边界释放锁"自然交错。

## 0.5 登录:自己探,别问用户登没登
**直接拿第一轮 search 当探针**:`search.mjs` 强制无头、不弹窗,跑得通=已登录,连着往下跑;只有脚本报未登录才登录。
- 脚本报未登录/被踢 → 运行(唯一允许有头的命令),让用户扫码:
  ```bash
  LIEPIN_HEADLESS=false liepin login    # PowerShell: $env:LIEPIN_HEADLESS='false'; liepin login
  ```
  跟用户说「我打开登录页了,扫一下二维码就行」;扫完 → **重跑刚才那条 search**。
- **开搜前一次性告诉预期**:「开始搜了,每轮约 10–20 分钟(慢是为了别被封),我每轮报你一句,凑够一批叫你看。」

## 1. 粗筛(脚本自动登 CSV)
```bash
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 是查重命根,已强制做**。
- **卡住保护**:search 6 分钟硬超时(resume 2.5 分钟),卡死会强杀报错并**自动清掉残留浏览器进程**、不静默挂死。报超时 → 告诉用户"搜索卡住已中断",**确认已登录、过几分钟再试或临时 `--limit` 调小**,别立刻重刷。
- 卡片判不了能力(实做/真伪/方向细节要精筛),粗筛只分三桶:
  1. **卡面就能判死** → `粗筛不合适`:硬约束出局(城市/期望薪资/年限/学历/年龄)、期望职位明显转行、卡面可见的通用排除(见步骤2)。
  2. **~10 个最对口** → 拉进精筛(别只挑 5、也别宽到 20+)。
  3. **其余卡面过得去/拿不准** → 留 `未精筛`(**干净库存**:召回变稀时直接挑它再精筛,不重搜)。**拿不准就留未精筛,别误标粗筛不合适**。
  ```bash
  node .claude/skills/pxb-liepin/scripts/dedup.mjs set "<岗位>\去重台账.csv" 粗筛不合适 <卡面否的id...>
  ```
- `--limit 40` 起步(自动翻页,别 `--page`):漏斗要宽,~40-50 里挑 ~10。**别为快降到 20**。健康比 `未精筛:精筛 ≈ 4:1`,`dedup.mjs stats` 随时自查。

## 2. 精筛(批量取、按 JD 下判决)
拉粗筛挑的 ~10 份,**一个循环拉完 = 1 回合,别开一份判一份**:
```bash
node .claude/skills/pxb-liepin/scripts/fetch.mjs <id1> <id2> ...   # 逐份打窄字段,内置抖动
```
- 单份打不开(已删/隐藏类)脚本会跳过并在结尾列出 → 这些 id 直接 `set 精筛不合适`;登录/反爬/连续失败才整批停(非零退出),处置后用它打印的命令续跑剩余。

每份过三关(对照该岗 JD):
1. **硬约束&去向**:硬约束粗筛卡片已初筛;精筛复核 `want_city`(期望城市不在本岗城市=想迁走,慎留)。
2. **正/负向建议**:命中正向画像几条?命中负向排除信号 → 砍。
3. **真伪**:**实做主看 `work_history` 每段的 `duty`**(时间线下那段实际做了啥,精筛主料)——判成色/方向;`self_descr` 作补充(自述,空泛堆技能名词的警惕注水);再叠薪资-成色错配(带队多年要地板价=注水)、方向偏离 → 砍。段头时长/公司看稳定性(跳槽/空窗)。

**通用排除(岗位中立,叠在 JD 上,命中即砍)**:① 简历空洞看不出职责产出;② 频繁跳槽(多段 <1 年且无任何 ≥2 年稳定段);③ **在职+暂无跳槽打算**(`work_status`"在职,暂无跳槽打算"——约不动、议价难,统一砍;"离职找工作/在职急寻"保留。搜索已默认在服务端排除这档,精筛这里只兜底:发现漏网的照砍并跑 `doctor.mjs` 查 CLI 版本);④ **近一年无工作**(末段结束超 1 年)。①卡片看不出留精筛,②④卡片能初判的粗筛就先排。

**归档**:过三关、值得给用户看 → `待定`;其余 → `精筛不合适`("够得着但不对"直接砍)。
```bash
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 挡搜索)。
```bash
node .claude/skills/pxb-liepin/scripts/pdf.mjs --dir "<岗位>\待定" "<id1>=张三-大疆" "<id2>=李四-影石"
node .claude/skills/pxb-liepin/scripts/lock.mjs release <岗位>    # 出完即释放,复核不碰 liepin,让账号给别的岗
```
- 脚本非零退出 = 有登录页/坏 PDF:**FAIL 的别交付**;登录页先 `liepin login` 重登,再用它打印的命令续跑剩余。

交付消息**只两样**:①把 `pdf.mjs` 打印的每份路径列成**可点链接**(`[姓名·标签](<岗位>/待定/简历_<标签>.pdf)`,href 用正斜杠,用户点开不必翻文件夹);②**问为什么**(合适/不合适各带理由——下一轮 JD 收敛的唯一燃料,不能只收"行/不行"):
> 「这批 N 份出好了,直接点开看:
> 1. [张三 · 大疆](<岗位>/待定/简历_张三-大疆.pdf)
> 2. [李四 · 影石](<岗位>/待定/简历_李四-影石.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`,别手编表格**(手编漏个空行就把行甩出表格):
```bash
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 目标人数,或用户明说本岗"招完了/先暂停"。只复盘流程,不返工候选人。
1. **收证据,只认事实不凭印象**:本岗 JD 内部备注表全部轮次(哪类词反复失效、哪类负向建议反复补)+ `dedup.mjs stats` 漏斗比例 + 本次全程的返工点(用户纠正过什么、哪步重来过、哪条红线差点破、同一件事问过用户几次)。
2. **通用化闸门,逐条过**:把每条候选改进改写成**不含本岗/本公司/本行业字眼**的一句话;改写不出来 = 岗位经验 → 回写该岗 `JD.md` 备注,到此为止、不进 SKILL。
3. **改法只限 SKILL 正文**:通过闸门的,落成本文件的具体措辞改动(加一句纪律/改一个提示/挪一个步骤);**`scripts/*.mjs` 一律不动**——各家模型能力不一,脚本问题只写进 issue 留维护者评审。**一次最多 5 条,挑影响最大的**,别做成大扫除。
4. **交用户拍板**:提案列成短清单(每条 = 踩的坑 → 建议措辞,标「正文」或「涉脚本,仅记录」);用户点头的当场改 SKILL 正文,没点头的只进 issue。
5. **提 issue 存档**(发送前正文给用户过目;**候选人信息、公司/岗位名一个字不进 issue**):
   ```bash
   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`。

