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
career-fit-cn
China-aware candidate ↔ role fit scoring — for agents.
中国职场适配度评估:把中国职场特有的制度性因素(35 岁门槛、996/大小周、竞业协议、城市/落户、薪资现实度)量化进「候选人 ↔ 岗位」的适配度评分,并明确标注红线。

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 candidateprofileagainst arole, 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 reportHIGH_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
- Load
profileandrole(YAML subset or JSON). skill— coverage of required skills by the candidate's skills.experience— years vs required, linear penalty below the bar.location— city equality vs mismatch.compensation— expected salary vs the role's range (over-asking penalized).redflag— subtract China-specific penalties for each triggered flag.- Total = weighted sum;
HIGH_RISKif any red flag fires, elseLOW_FITif skill/experience < 40, elseOK. - 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