第二阶段岗位择优 (stage-2 shortlist):依据最新硬条件和职业画像复核已有候选,保留可能申请的对象并评级,核实岗位直达入口、截止日期与名额限制,维护或交付飞书求职工作台,记录本人报告的投递状态。用于第二轮精筛、评级、表格维护与交付;不做海量搜索(交给 jobradar),不执行投递。
91%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Profile/ (hard conditions, career profile, self-description) holds only what the user chose to share with the agent: read it directly. Résumés, identity documents and other personal files are read only through the user's own privacy tooling or with their explicit permission for that file. Profile text never goes to Feishu, and career-profile aspirations are never résumé facts.JOB-000001, or LEAD-YYYYMMDD-NNN for direction leads) are the only record identity. Never renumber, delete rows to eliminate, or overwrite 用户决定 / 本人备注 / 父记录.~/.config/jobradar/ and ~/.local/state/jobradar/. Never write to another host's home (~/.codex, ~/.config/opencode, ~/.claude, ~/.deepseek) or read its session logs.npm -g, brew, pip outside a project venv), global proxy/VPN, hooks or schedules without the user's explicit approval in this session._support/ or system/validation/<run>/.closeout command and quote its receipt. Without a passing receipt, report "not complete" and list what failed.preflight; the script enforces it)| Mode | Use when the user asks to… | Allowed | Never |
|---|---|---|---|
review | screen/grade/verify named candidates | hard gate, grade, verify pages, update or create candidate records | search beyond the named candidates |
maintain | adjust columns, fields, names, wording ("只维护表格") | only the record fields (--fields) and view columns (--columns --allow-views) the user named | search, re-grade, add candidates, move other columns |
deliver | push verified results to the workbench | delta writes by JOB ID; column moves only for --columns with --allow-views | overwrite manual fields or the user's column order |
track | record that they applied / got an interview | create or update application_tracking rows (投递状态, 投递时间, 下次安排, 安排事项, 状态依据) with --evidence user_report:<quote> or receipt:<path> | inferring status from rows or prepared materials |
A request that mixes modes is done as separate runs in order, or you ask which comes first.
Stage-1 mass search belongs to jobradar.
Read hosts.md for your host's search, browser and ask-user tools. List what you actually have before verifying pages.
ROOT = the user's JobRadar instance directory (see jobradar's Procedure), P = python3 <this skill's scripts/>/position.py --root $ROOT --run <run>.
The run is the batch folder name under outputs/ (existing batch for updates, new
YYYY-MM-DD_主题 for a new one).
Before review mode: the hard conditions and profile. Read the latest hard-condition and
career-profile documents directly from $ROOT/Profile/ (invariant 2). Write the grading criteria you need into
the run's working notes in your own words; never copy profile text into Feishu or _support/.
$P preflight --mode <mode> --host <codex|opencode|claude-code|deepseek|other> [--fields a,b] [--columns c,d --allow-views] [--evidence …]
While another run holds the lock it queues (--wait, default 90 s) and names the holder.
To wait longer, follow "Waiting for the shared lock" in jobradar references/hosts.md;
do not ask the user to release a lock whose holder is still working. Only the user may
approve $P release --user-approved, and only for an abandoned holder. On the live workbench it also refuses when the lark-cli user
login is not ready; ask the user to run lark-cli auth login themselves (in Claude Code:
! lark-cli auth login), then retry. radar.py doctor
shows the same feishu_auth status earlier.$P snapshot --label start after every preflight (closeout diffs the table against it;
apply and closeout refuse a start snapshot older than the current preflight). A new
session, day or mode is best a new run name, so one run's receipt covers one piece of work. Then
$P validate --snapshot <path>. Existing findings are reported, not silently fixed; fix only
what the mode and request cover.{"update":[{"job_id":"JOB-000191","fields":{…}}], "create":[{"fields":{…}}], "views":[{"view":"vew…","visible_fields":[…]}]}
("table" defaults to candidates; postdoctoral mentors, unit posts and fellowships go in postdoc_mentors, the
merged postdoc table (same fields and rules; the old postdocs table is retired); other tables: institutions, application_tracking,
quotas, group_comparison, addressed by record_id). 机会编号 never changes. A record
that came from stage 1 keeps its stage-1 ID: $P draft --from-run <stage-1 run> --ids JOB-… --out stage2/draft.json (relative paths land in this run's _support/) prefills company, role, city, link and source facts. Fill
its _todo items, resolve any _possible_duplicates, then delete every _ key; apply refuses
unknown keys. Draft refuses records eliminated in stage 1. A
candidate found only in stage 2 gets its ID from $P allocate --url <url> --key <record-key> --company <company> --title <role>. If that returns possible_duplicates, update the
existing ID instead. Formula fields are never written.$P apply --delta delta.json — the only way to write records or view columns. It checks the
delta against the mode, simulates it (refusing new validation errors), writes, confirms the
values stuck, and guards manual fields, IDs, column order, deletions and grades. If it
refuses, change the delta or ask the user; never bypass it with lark-cli write commands:
closeout diffs the final table against the start snapshot and flags unexplained writes. Schema work apply cannot express (new field, field type change,
formula, new view) needs the user's explicit request; take a snapshot before and after and
run validate on both.$P closeout — writes _support/closeout-stage2.json; quote it. A failure keeps the lock
and must be reported to the user as "not complete".Profile/). A
record with clear evidence of violating a strict condition (e.g. region) becomes
候选状态=硬条件淘汰 with 淘汰原因, no grade, and moves to the audit view. Unknown
conditions stay 待核; they neither pass nor eliminate.未评级 in 评级依据状态.quota_note;
a 限额处理 still reading 未核 blocks 可供本人决策 unless the user accepts it. Each 限额组 written on a candidate
also gets one rule row in the quotas table in the same run; validate warns (quota_table)
when a group has no rule row.
Check application status before any deadline or urgency claim.
Before reporting a deadline, urgency or "still open" for any record — in every mode,
including page re-verification — read application_tracking and the record's quotas row.
An applied job is reported as applied, never as urgent. A job whose quota group is full
(by the user's report or a receipt) goes in a separate "名额已满,不再新增" group with its
deadline as information only, never in an urgent list or call to action. A group that may still
have room is reported with the slots used and left, and the user allocates.TODAY() formulas compute urgency; do not re-grade over time. Keep date confidence and the
site's time zone; an unknown date is not urgent. A low-grade job near its deadline never
displaces a higher-grade one, and quota-unresolved jobs are shown separately rather than
slipping in through the urgency view.postdoc_prep_days (instance system/config/preferences.json; radar.py doctor and preflight report it, 0 = no window). Postdoctoral mentors, unit posts and
fellowships live in the merged postdoc_mentors table (类型 says which),
whose deadline formula counts days left before that window: fewer days shows 准备期不足N天,按已过期处理 (code 8) and is
reported like an expired date, never as urgent; its status and grade stay. A recurring one
also goes on the watchlist (rule 7). Move a postdoc found in candidates with a delta
{"move": [{"job_id": "JOB-…", "from": "candidates", "to": "postdoc_mentors"}]} (review or deliver
mode): apply copies it, confirms the copy, then deletes the source row; link fields must be
empty first, and the IDs stay unique across both tables.
Enterprise postdoc stations are ordinary jobs: they belong in
candidates under rules 1–5 (normal urgency, no preparation window, no mentor table); move one found
in postdoc_mentors with "from": "postdoc_mentors", "to": "candidates". See jobradar record-schema.md
for which hosts count as enterprise.
Mentor-centred: the postdoc_mentors table (博士后导师) holds one
row per host supervisor, sorted by 证据层级 (1 posting + homepage, 2 homepage, 3 posting,
4 potential = LEAD); see jobradar record-schema.md. One table holds all of it and every row is graded S–D by fit only
(rule 3; thin evidence = provisional grade, and the evidence tier never sets the grade). For a
unit post without a named PI the 导师|课题组 cell holds the unit or company. 资助途径 lists
only routes the mentor can host by evidence (same institution, programme rule); each 基金项目 row
states 合作导师要求 from the official page (须先联系合作导师 / 学校提名 / 不需要 / 待核).system/state/watchlist.json with radar.py watch --add
(fields in jobradar record-schema.md). Do not eliminate it or change its status or grade;
prepend 已挂起待下轮:见本地长期关注清单 <id>; to its 核查缺口 so the table shows it is held.
preflight lists watch_due entries; report them to the user before the mode's work.possible_duplicates, validate possible_duplicate)
is resolved by updating the older ID and not creating the newer one; never delete a record.硬条件淘汰, 淘汰原因 quotes the text and URL. The label
by itself, an inference from silence, or a repost never counts as confirmation.待本人判断:岗位性质标注为“<原文>”(<URL>) in 核查缺口, with any 劳务派遣 / 外包 / 编制
wording found in the announcement and whether the role is a postdoc, a doctoral or
talent-programme track, or an ordinary graduate hire. In SOEs a contract label often
reflects a special status such as a postdoctoral station contract, and doctoral hires are
rarely denied formal status without reason, so never present the label as a likely
violation. The record cannot be 可供本人决策 until the user resolves it
(本人已接受:…) or eliminates it themselves.For every candidate: this cohort's duties, city, eligibility, deadline, direct application link
and application limits. Statuses: 待核线索 → 公开信息已核,关键条件待确认 → 可供本人决策, or
硬条件淘汰. 可供本人决策 requires no open 核查缺口, a verified direct link and a resolved quota
group, unless the user explicitly accepts a named unknown — write it as 本人已接受:<item> in
核查缺口 or 限额处理. validate enforces this. An empty
decision view is acceptable; never lower the bar to fill it. 本人行动 holds only the user's
choices and preparation; unfinished agent work goes to 核查缺口. For undisclosed items (pay,
contract type, hours) record which official sources were checked and what stays unknown.
Page checks: match employer, role name, location, cohort and deadline on the real page, official or employer-linked ATS first. Never click an apply/submit button to test a link. Record the concrete obstacle when a page only offers a company list, email, login path or conflicting cohort. Network and proxy limits are in network.md.
Read delivery.md before touching the workbench or producing a local
table. Only job and process summaries go to Feishu; no identity data, résumé text or attachments.
Tailored materials start only after the user picks a JOB ID, and stop at ready_for_human.
scripts/presentation.py provides the link-cell, urgency and ordering helpers. Ordering rule: applied jobs (per application_tracking) always sort last in candidate views, whatever their grade; only the table order changes, never the record data.
validate findings you did not fix (and why), closeout receipt path and passed.
A write succeeding does not mean links work; a passing format check does not mean the
grading is right.Ares960826/JobRadar
82b4bdb
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.