jobradar · diff

git:20261104.16d5e74 to git:20261104.d2b1eb9

2 added, 0 removed. Audit A to A.

---
name: jobradar
description: 查询中国公司(含大厂与招聘平台上的公司)当前在招的校招/实习/社招岗位、近期新开/下架变化、岗位要求对比和招聘趋势。用户问"某公司在招什么岗位""这周新开了什么岗""A 和 B 的某类岗位要求有什么差异""某公司招聘是在扩张还是收缩"时使用。数据包含官方招聘页与公开聚合来源,每日调度,本地查询,单源新鲜度以返回时间为准。
---
# jobradar:对话式求职搜索技能
用户通过对话提出求职需求,宿主优先调用已连接的 MCP 工具;未连接时可使用 `jobradar` 的 JSON 输出。
两者共用查询规则。**只能根据工具返回的数据回答,不能用常识或记忆补充岗位信息,也不要要求求职者理解命令行参数。**
## 首次接入
用户要求安装、导入或接入本技能时,先阅读 [首次准备](references/setup.md),检查当前平台能否执行本地工具或连接本地 MCP,再准备工具和数据并实际查询。未调用成功前不要声称已接入;只阅读了技能或仓库不等于已经具备查询能力。
已有可用 MCP 时优先使用其工具,无需要求用户再安装另一套入口。求职者只需说需求,配置细节由助手处理;需要界面操作时给出当前一步即可。
## 安装或升级(首次使用或参数不受支持时)
本指南对应 `2.2.2`;正式渠道核验状态见安装指南:
```bash
pip install --upgrade "jobsearchradar[mcp]==2.2.2"
jobradar --version
jobradar search --help
jobradar calendar --help
```
发行包经过独立安装与命令兼容性检查,实际安装后仍须核对版本和参数。固定源码备用安装及版本说明见 [安装指南](https://github.com/lijiaqi-AI-Product-Manager/job_radar/blob/main/docs/INSTALLATION.md)。已安装旧版也用上述命令升级,
不要仅因本机已有 `jobradar` 命令就跳过版本兼容检查。帮助中应有 `calendar --city`、
`calendar --include-expired` 与 `search --deadline-before`;旧版帮助报错或不支持参数时,
先在 CLI / MCP 实际使用的环境中升级,不能通过删掉筛选参数来改变用户的问题。
## 第一步:检查数据(每次会话第一次使用时)
```bash
jobradar doctor
```
- 没有数据,或 `stale: true` → 先运行 `jobradar update`(同时下载岗位库与 JD 原文库),再继续。
- `source_health.counts.stale > 0` → 部分来源超过 48 小时未成功刷新,整体快照较新也不能证明这些岗位仍在招。用 `jobradar sources --problems` 查看;提及受影响岗位时注明 `last_seen`,建议打开原链接确认。更新快照不能保证来源已恢复。
- 岗位 `source_stale: true` 或 `availability: unconfirmed_stale` → 表述为历史观测岗位,不能断言当前可投;注明 `source_last_ok`。`observed_recently` 也只表示最近采集成功,投递仍以原站为准。
- `source_enabled: false` 或 `availability: unconfirmed_disabled` → 来源当前已停用;即使旧成功观测尚不足48小时,也不能表述为当前已核实可投。停用不等于岗位已关闭。
- 展示 `availability_label` 和 `source_warnings` 对当前可投状态的限制。`source_tenant_peers` 非空表示同一招聘租户还登记在其他来源下,岗位可能重复;不要跨来源相加,也不要据此擅自更改雇主归属。
+ - 明确指定校招/实习时,搜索与对比默认过滤标题明确的一线门店和房产经纪岗位。用户明确寻找此类岗位时传`include_frontline=true`(CLI `--include-frontline`);不限类型与社招不默认过滤。说明`frontline_filter`的模式和计数,全文检索计数为`null`时不能编造。`exclude_categories`是字段排除,未知职类需修正,空字段仍需原文核实。
- 下载使用默认 GitHub 渠道;失败时先检查网络和数据状态,不将当前未核实可用的镜像作为首选。见[渠道状态](https://github.com/lijiaqi-AI-Product-Manager/job_radar/blob/main/docs/DISTRIBUTION.md)。
- `record_kind: recruitment_notice` 是招聘公告,可能包含多个职位,不能将公告条数表述为岗位数;`source_kind: aggregator` 是公开聚合来源,引用时说明来源。`unknown` 不能按名称猜测。详情中的 `source.compliance_checked_on` 是配置的合规核查日期,不代表今天已成功读取。`stats` 的 `by_record_kind` 与 `by_source_kind` 提供分层计数。
- 默认搜索和日历按北京时间自动隐藏明确截止日已过的记录,截止当天仍保留;查历史岗位用 `search --include-closed`,查历史日历用 `calendar --include-expired`(MCP 对应 `include_closed` / `include_expired`)。`calendar --open-on` 以指定日期为准。不要通过补填未知日期来让条目过期。
- 数据目录不是默认的
`~/.cache/jobradar` 时,给 MCP 配置的 `env` 传 `JOBRADAR_HOME`。
## 按个人条件找机会
用户提出多城市、排除公司、学历/经验要求、实习安排或连续修改条件时,参见
[个人求职条件与连续追问](references/candidate-workflow.md)。该流程区分可直接筛选的条件、
需要阅读原文的要求,以及尚未核实的资格;放宽条件后的结果必须单列。
## 按问题类型选命令
| 用户在问 | 命令 |
|---|---|
| 某公司/城市/职类在招什么 | `jobradar search --company 复星医药 --category 医药研发 --city 上海 --type campus --grad-year 2027 --limit 20` |
| 标题关键词 | `jobradar search --keyword 大模型` |
+ | 用户明确希望查门店实习 | `jobradar search --type intern --include-frontline --keyword 门店 --limit 20` |
| 按技能/要求找岗位(JD 原文里出现的词) | `jobradar search --text "PyTorch 多模态" --type campus --limit 20`(空格分隔的词须全部出现;结果的 `match` 是命中处原文片段) |
| 某个岗位详情、要求 | `jobradar show <job_id>` |
| 这周/最近新开、下架、变化 | `jobradar diff --days 7 --company 腾讯 --types open` |
| 最近哪类职位新增最多 | `jobradar diff --days 7 --by category`(返回 `[{category, n}]`,按数量降序;没职类的归「未分类」) |
| 两家或多家公司同类岗位要求对比 | `jobradar compare 药明康德 正大天晴 --keyword 研发 --per-company 5`;按职类用 `--category 医药研发`,按 JD 原文(如「论文」)用 `--text 论文` |
| 招聘规模趋势 | `jobradar trends 腾讯 --step-days 7` |
| 某公司有哪些招聘项目/批次、网申什么时候截止、去哪投(**含目前只有日历、没有岗位数据的大厂**) | `jobradar calendar --group 字节跳动 --grad-year 2027` |
| 现在还能投哪些 | `jobradar calendar --type 秋招正式批 --open-on <今天日期>` |
| 快截止的岗位(按网申截止日) | `jobradar search --deadline-before <本月末> --type campus`;日历同理用 `jobradar calendar --deadline-before <日期>` |
| 某城市有哪些校招 | `jobradar calendar --city 北京` / `jobradar search --city 北京` |
| 哪些公司写了网申起止 / 招哪些方向 | `jobradar calendar --has-window` / `jobradar calendar --has-tracks` |
| 覆盖了哪些公司 | `jobradar stats` |
| 数据什么时候更新、哪些源有问题 | `jobradar sources` |
参数说明:`--type` 取 `campus`(校招) / `intern`(实习) / `social`(社招);`--company` 先按**公司名全等**匹配,再查简称映射表(如 `中核`→中国核工业集团、`国寿`→中国人寿,见 `taxonomy/company_aliases.yaml`),最后只在命中唯一一家时用子串兜底(`阿里`→阿里巴巴)。**没把握就不猜**:`--company 京东` 不会返回「京东方」,而是 0 条 + 提示 `company_match.match = none`;命中多家时 `match = ambiguous` 并给出候选。要看 `company_match` 再回答(见回答规则 4)。`--contains` 才强制子串搜索(如 `--company 中国` 一次看所有含「中国」的公司)。`--category` 同时匹配大类与子类(如 技术、算法、后端、芯片/硬件、产品经理),可选值见 `references/fields.md`。**职类按标题规则归类,部分岗位为空**:`--category` 无结果时,再用 `--keyword` 按标题关键词查一次(如 `--keyword 研发`),仍无结果再用 `--text` 在 JD 原文里查,三者都无结果也只能说当前数据中未找到匹配记录。
## 回答规则(必须遵守)
1. **注明数据时间**:回答开头或结尾写"数据截至 {data_as_of}"。`stale: true` 时明确提醒数据可能过期。
2. **附链接**:列出的每个岗位都附 `url`,引导用户去官网查看和投递。
3. **只用返回的数据**:没查到就说没查到。不编造岗位、薪资、面试难度、往年数据、HC 数量。
4. **查不到时说清楚是哪种情况**:
- 只有公司匹配为 `none`,或 `compare` 的 `missing_companies` 里有它,才说明公司未收录;筛选后 `results` 为空或旧字段 `not_found` 不能证明未收录,更不能说"这家公司没在招"。
- **先看 `company_match`**(`search`/`diff`/`trends` 都带):`match: none` = 这个名字在数据集中不存在(`candidates` 是相近的公司,可以顺势提示"你要找的是不是 X");`match: ambiguous` = 命中多家、故意不返回;`match: contains` = 按子串唯一命中(如 阿里→阿里巴巴);`exact`/`alias` = 确定是这家。**`none`/`ambiguous` 时不能说"该公司没在招"**。
- 岗位 `closed_at` 有值 → "该岗位已于 {closed_at} 下架"。
- 字段为空(如北森门户的 `cities` 为空列表)→ 说明"数据中未提供该信息",不要从标题或常识推断。
- **有结果也可能漏掉字段为空的岗位**:每次阅读 `filter_coverage` 和 `hints`,说明未标注届次或截止日的范围,不能只在空结果时检查。需要保留未知届次候选时使用 `include_unknown_grad_year=true`;这些记录的 `grad_year_match=unknown` 仍待核实。统计中的 `unit=records` 未做展示折叠,不能与分组总数直接比较。正文检索未复算放宽后的数量时如实说明,不编造漏岗数。
- 某公司未收录或只覆盖了部分招聘类型:`jobradar sources` 可看各源;不要因为没查到就说"该公司没有校招",应说"数据里没有"。
**字节跳动、蔚来、小鹏汽车、Momenta 已收录**(同为飞书招聘 ATSX 门户,2026-10-26 起,见 `docs/recon/feishu-atsx.md`),
是否有匹配岗位、城市与 JD 是否完整,都以本次返回为准,不能凭历史样本承诺 100%。
5. **变化类问题用 `diff`/`trends`**,不要拿两次 `search` 结果自己比。说明覆盖的时间跨度;历史不足时如实说(例如"数据从 X 日开始积累")。
6. **对比类问题**:只依据 `compare` 返回的 `requirements`/`description` 原文;区分"JD 原文写的"与"你的归纳",引用关键原句。`requirements` 为 `null` 但 `description` 有内容时仍可读取正文;只有两者均为空才说明缺少 JD 原文。样本有限时(如每家只有 2–3 个岗位)提醒结论的代表性有限。`missing_companies` 才表示公司未收录;`no_matching_jobs` 表示已收录但没有符合本次条件的岗位;`ambiguous_companies` 需先澄清公司名。旧字段 `not_found` 仅汇总空结果,不能当成未收录清单。对比支持统一城市、招聘类型与届次筛选,不得在空结果时偷偷放宽条件。
7. **招聘日历(`calendar`)**:
- 每条都有 `source`(来源名称、链接、发布日期)与 `as_of`(核实日期),回答时注明,例如"据字节跳动校园招聘官网(核实于 2026-10-21)"。
- `origin: manual` 是人工从官方公众号/官网/政府平台整理的;`origin: auto` 是从岗位数据自动汇总的(`apply_end` 取该批尚未过期的最早截止日,全部过期时取最晚截止日;它不代表所有岗位同一天截止。`apply_start` 只在多数职位同一天上架时才给,否则为 `null`——单条上架日是补录日,不是开放日)。
- 高校公告的「过期时间」「已过期」只表示展示期限,不能据此断定企业截止投递。已撤回的日期不能从 `notes` 里的历史链接再补回来。
- `deadline_scope: job_evidence` 的日期来自岗位样本,不能说成整个批次截止;这类条目不会仅因某个岗位截止就整批隐藏,`window_status: unknown` 时仍需到原页确认。
- 字段为 `null` 表示来源没写,**不要补全或推测**(例如不要根据往年推测今年截止日期)。
- `open_on` 的总数包含未知窗口候选,不能直接称为“今天可投N个批次”。读取 `window_counts` 和 `hints`,计数仅代表返回页。只看明确完整批次窗口时使用 `confirmed_open_only=true`,但日期窗口也不保证实时投递成功。
- `jd_status: linked` → 可以接着用 `jobradar search --company <jd_company>` 列出具体岗位与 JD。
- `jd_status: blocked` → 只给日历信息,并**把 `hint` 原样放在回答最后一句**(如"拼多多希望你去他们的招聘页逛一逛哦~"),附 `apply_url`。
- **城市和网申时间不是每条都有**:`--city` / `--deadline-before` 只命中写了该字段的条目(当前覆盖率从 `doctor` / `stats` 查询,不能套用固定百分比)。所以
「`--city 拉萨` 返回 0 条」**不等于**"拉萨没有校招",正确说法是"日历里没有写拉萨的条目,可以去掉城市再看该公司全部批次"。
返回里的 `hint`(或 MCP 返回的 `advice`)已经说明了这一点,**照它说,不要自己改写成"没有岗位"**。
同理 `--deadline-before` 返回空只能说明"没有写了截止日且落在该范围内的条目",不能说"没有快截止的岗位"。
- `--has-window` 的口径是**起止任一有值**:只有截止日、没写开始日的批次也算"有网申时间",回答时说"截止 X 月 X 日"即可,不要说"没有网申时间"。
- `project_type: 社招` 的条目来自社招板(一家几千条),没有届次也没有批次窗口,**不要当校招批次讲**。
- 一条日历 = 一个批次(秋招正式批 / 暑期实习 / 社招…),不是一条 = 一个岗位。想知道具体岗位,用 `search --company`。
8. **资格与待遇需要原文**:先读 `field_warnings` 和 `qualification_evidence`;学历字段与正文冲突时不得只按字段排除。社招渠道也可能接受应届或毕业不久人群,不能把渠道标签当作资格。薪资、出勤天数和实习月数仅引用正文或明确标注;未提供则未知。校招不代表不要求经验,正文提到英语不代表英语是硬性门槛。投递简历、内推和面试评价超出本工具范围。
## 输出建议
- 岗位多时先给数量和分布(按城市/职类),再列最相关的 5–10 个。
- 列表格式:`公司 | 岗位名称 | 城市 | 类型/届别 | 链接`。
更多示例见 `references/examples.md`。