Back to home@whaojie797-design

career-fit-cn

China-aware candidate<->role fit scoring for agents. (assess a profile against a role; five weighted dimensions + China-specific red flags like age_35 / 996 / non_compete.)

Stars
0
Language
Python
Created
Jul 30, 2026
Updated
Jul 30, 2026

Introduction

MIT Python Zero deps CI

career-fit-cn

China-aware candidate ↔ role fit scoring — for agents.

中国职场适配度评估:把中国职场特有的制度性因素(35 岁门槛、996/大小周、竞业协议、城市/落户、薪资现实度)量化进「候选人 ↔ 岗位」的适配度评分,并明确标注红线。

demo


Before / After

Before — An agent judging a JD only looks at skill overlap, ignores institutional risk, and gives over-optimistic advice that falls apart on the ground (age ceilings, 996, non-compete).

After — A fit report with China-specific landmines flagged: total score + five dimension breakdowns + red-flag warnings + next-step suggestions for the agent.


What it does

  • assess — score a candidate profile against a role, output a structured fit report (FIT_REPORT.md + fit-state.json, machine-readable for agents).
  • report — re-render the last report from the store.
  • Five weighted dimensions: skill (0.35) · experience (0.20) · location (0.15) · compensation (0.15) · redflag (0.15).
  • China-specific red flags: age_35 (candidate age ≥ 35 → heavy penalty), 996 / size_week (candidate declines → penalty), non_compete (candidate declines → caution penalty). Any triggered flag marks the report HIGH_RISK.
  • Zero third-party dependencies — pure standard library; a tiny YAML-subset parser (or JSON) is included. No pip install.

Install

Clone into your agent's skills directory. No pip install required.

Codex

git clone https://github.com/whaojie797-design/career-fit-cn ~/.codex/skills/career-fit-cn

Claude Code

git clone https://github.com/whaojie797-design/career-fit-cn ~/.claude/skills/career-fit-cn

Cursor

git clone https://github.com/whaojie797-design/career-fit-cn ~/.cursor/skills/career-fit-cn

Quick start

python scripts/fit.py assess --profile profile.yml --role role.yml --store .fitstore
python scripts/fit.py report --store .fitstore

profile.yml / role.yml accept either a small YAML subset or JSON.

# profile.yml
skills: [Python, Kubernetes, PostgreSQL]
years: 7
age: 32
city: 上海
expect_salary: 55
accept_996: true
accept_noncompete: true
# role.yml
required_skills: [Python, Kubernetes, PostgreSQL]
min_years: 5
city: 上海
salary_range: [50, 70]
redflags: ["996"]

Sample report (real)

$ python scripts/fit.py assess --profile profile.yml --role role.yml --store .fs
Total fit: 91/100   Risk: HIGH_RISK
  skill        100   (missing: none)
  experience   100   (10 yrs vs 8 required)
  location     100   (上海 vs 上海)
  compensation 100   (expect 60 vs [50.0, 80.0])
  redflag      40   (1 triggered)

Suggestions:
  - 重点确认年龄门槛:该岗位存在 35 岁风险,建议优先核实 JD 与实际用人偏好

A clean match (all dimensions 100, no red flags triggered) reports Total fit: 100/100 Risk: OK.


How it works

  1. Load profile and role (YAML subset or JSON).
  2. skill — coverage of required skills by the candidate's skills.
  3. experience — years vs required, linear penalty below the bar.
  4. location — city equality vs mismatch.
  5. compensation — expected salary vs the role's range (over-asking penalized).
  6. redflag — subtract China-specific penalties for each triggered flag.
  7. Total = weighted sum; HIGH_RISK if any red flag fires, else LOW_FIT if skill/experience < 40, else OK.
  8. Write FIT_REPORT.md + fit-state.json.

Everything is deterministic; the test suite runs entirely against local fixtures (tests/fixtures/).


Limitations

  • Scoring is heuristic and explainable, not a hiring decision. It surfaces risk factors; a human still decides.
  • City matching is exact-string only (no 同城圈 / 落户 equivalence logic).
  • Only the documented red-flag tags are recognized; unknown tags are recorded but not auto-penalized. Extend score.py (_REDFLAG_PENALTY) to add more.
  • Salary comparison treats the range as annual, in the same unit as expect_salary; it does not adjust for 13薪 / 股票 / 补贴.

License

MIT © 2026 whaojie797-design