简历 × JD 双向核对(设计权威)
定位:把「这人配不配这枚岗位」拆成两件事——JD 每条要求能不能指回简历里的一句原话,以及简历里哪些内容 JD 根本不在意。稀缺的不是评价,是可回查的对应关系。 不是筛简历工具,不是人评打分器,不排先后,不会自己上传或发布任何东西。
0. 是什么 / 不是什么
| 是 | 不是 |
|---|---|
双向核对:要求→证据(每条挂 [S#],两句都要原文逐字) |
不是匹配率:算一个百分比丢给你,那数没人能核对 |
| 缺口分两栏点名:JD 要而简历没证据的/简历有而 JD 不关心的 | 不是把空白填圆:对不上的要么点名要么不写 |
一句话结论只说匹配到哪一层,判断位 [待人工] |
不是人评:录不录、排第几、给几分,机检当场发红 |
来源行必须带 文件:行号 或 URL + 解析日 |
不是「我看过那份 PDF 了」:没有定位与日期就是没核 |
| 两侧都读文档,不读任何人事系统 | 不是批量管道:一次一份简历对一枚 JD,不代人跑招聘会 |
1. 输入
- 一份简历:本地文件,或经解析通道取回的正文(PDF/网页/截图那侧也能读,落成
parsed-doc)。 - 一枚 JD:同上;要求段按节标题含「要求/资格」抽,标题不同就带
--require-keyword指定。 - 两者都要落到本地文件才进机检:本件不抓链接、不执行任何一侧附带的代码、不发请求。
2. 工作流(四步,每步都可停)
- 取两份正文:远端走解析通道取回,本地直读;两侧各自登记一行来源(定位+解析日)。
- 排骨架:
python3 -B scripts/collect_fit.py --jd JD.md --resume 简历.md --out 核对.md——它只把 JD 的要求逐条搬到第二节并留证据待填位,不代人做匹配。 - 逐条对齐:每条要求一行,证据必须是简历里的逐字原话(行末挂
[S1],要求挂[S2]);对不上的写「无证据」并去第三节点名。 - 过机检:
python3 -B scripts/check_fit.py 核对.md --jd JD.md --resume 简历.md,按详行E-*码逐条改。机检过完仍只是一份核对材料:用不用、怎么用,由人定。
3. 输出契约(四节,机检按此判)
## 1、一句话结论:只一行、≤80 字符,只说匹配到哪一层;这一行要有两件结构在场——报到哪几条(计数+条)与缺口点名(未取到/无证据/只有部分证据)。这一格里若要引原话,必须同行写明是谁的话(简历自述/JD 原文),不写归属机检发红——被引者的话只能当证据,搬进结论位就成了报告自己的名次。## 2、逐条对齐:3–15 行;每行两个锚(要求一枚、证据一枚)+两段「」逐字引文,要求那句必须能在 JD 里找到、证据那句必须能在简历里找到。## 3、缺口与未取到:两栏都要在位——JD 有要求而简历无证据的、简历有内容而 JD 不关心的;一条没有也明写「本栏无」。第二节判为无证据的要求必须在这一栏留名。## 4、来源:一行一源,- [S#] 名字(文件:行号 或 URL |解析日 YYYY-MM-DD)。 头部另有四件自标:AI 整理初稿/请回原文核对/不构成录用或排序建议/判断位 [待人工],逐字在位。
4. 通道与降级(两条路各自缺什么,写在同一句里)
- 主路=解析通道:简历或 JD 在远端(招聘页、云盘 PDF、截图)时,正文走解析通道取回——本机没有那份文件也能读。连上判据按路分写:宿主列工具走 MCP 的
tools/list握手——连上之后那份返回里应当能看到这些名字:remote-only 那一面是parse、get_parse_status、cancel_parse三枚,带 Bridge 的那一面再加read_result、read_outline、discard_result、save_result共七枚;两路枚数不同,拿一个固定数判两路必错一边。名字在场只证它们被暴露,不证解析跑得通——URL 那一腿要拿一枚真实 URL 跑一次 parse 才证该路,本地文件那一腿要拿一枚真实本地文件跑一次 parse 才证该路(remote-only 不读本地件);本件不自证也不代跑。三层各自能证到什么,互不等价:装好 skill ≠ 已配凭据 ≠ 通道已连。配置指路:解析腿官方配置页 https://cuecue.cn/hub/omni-reader(本件只依赖这一条腿,数据腿那页不在本面上引)。命令与三层自查见README.md的「装上机 → 连通道 → 出结果」那一节。 - 降级=只读本地:本件仍能跑
scripts/collect_fit.py,把已在本地的那两份排成骨架;代价同句写清——远端那侧的正文读不进来,第四节只能登记本地那两枚文件。版本同一性这一格两条路都不判:解析只按你指定的对象取正文,本件不读版本标记也不对发布链,「JD 与简历是不是对方现在用的那一版」由你指定基准版并对齐。 - 骨架不是核对报告:采集器给每条要求留一个证据待填位,机检按设计在这一行发
E-QUOTE——匹配那一步没做就红着,别把它当交付。
5. 红线(机检守,不由人守)
- 不做人评:推荐录用/建议录用/优先录用/淘汰/排名/排序/打分 一类断言零命中;换了说法的名次(最高级/比较级+本岗位/候选人一类对象词同句同现)同样拦,带逐字锚也不放行;要提及就同行挂
[待人工]。第一节那一格另有一条:引原话不写归属就发红——那是把被引者的话搬成报告的结论。 - 加引号必须逐字:要求那句回 JD 原文、证据那句回简历原文;转述冒称原文发
E-QUOTE,造证据在这一道被抓。 - 没有锚的对齐行不进第二节;锚在第四节没有对应行、来源行缺定位或缺解析日,发
E-ANCHOR。 - 判了「无证据」却不在第三节点名,发
E-COVERAGE;第四节零来源行同样发红。 - 数据边界:本件不发请求、不上传、不落盘到本包之外,也不读任何人事系统;报告里会带着两侧原文(含个人信息),存放与转发由用户自己负责并先告知当事人。
6. 最小可复跑链(零网络、零计费、不执行两侧附带的代码)
python3 -B scripts/collect_fit.py --jd scripts/fixtures/target-jd.md --resume scripts/fixtures/target-resume.md --out 我的核对.md
python3 -B scripts/check_fit.py 我的核对.md --jd scripts/fixtures/target-jd.md --resume scripts/fixtures/target-resume.md # 期望发 E-QUOTE:证据仍是待填位
python3 -B scripts/check_fit.py scripts/fixtures/good-fit.md --jd scripts/fixtures/target-jd.md --resume scripts/fixtures/target-resume.md # 期望 PASS
python3 -B scripts/check_fit.py --selftest # 好样须过、七枚坏样须各发它该发的那一道
bash scripts/fixtures/run_fixtures.sh # 离线三档一次跑完,末行自报档数与不合枚数
7. 边界(含与自家件的分工)
- 本件只对「这两份文档当下载着什么、能不能互相指回去」负责,且只对形制负责:判断由人做,且必须带着这份材料做。
- 与
skill-review-cn的分工:那一件审的是一枚 skill 自己的面文(声明层、前置层、承诺、样例、许可),对象是软件包;本件核对的是一个人的一份简历对一枚岗位说明,两份输入互相对表,检查面完全不同。 - 与
cn-research-brief的分工:那一件把一批来源横向排成多源速览(一次铺一个问题,跨源不一致两条都留);本件是两个输入纵向逐条对齐(每条要求必须有证据或进缺口栏),没有跨源互校这一层。 - 与
cn-link-to-note的分工:那一件单源成条(一份正文→一条能入库的笔记,至多一枚原话);本件双输入成表(要求与证据一一配对,每行两句逐字),产物不是笔记而是一份可回查的核对材料。 - 一次一份:批量排序、跨候选人比较、给分数或名次,都是另一件事,本件不做也不辅助——那条路上的数据与偏差问题不在本件的形制里。
