score-fit
Score how well the user's master profile fits a specific job — an ATS-style match percentage with matched/missing keywords, strengths, gaps, and a clear apply-or-skip recommendation. Optionally writes a structured sidecar that tailor-resume consumes.
- License 许可
- MIT
- 最近更新
- 2026-06-09
- Stars
- ★ 7
- Forks
- 1
01 前言 Front Matter
- name
- score-fit
- description
- Score how well the user's master profile fits a specific job — an ATS-style match percentage with matched/missing keywords, strengths, gaps, and a clear apply-or-skip recommendation. Optionally writes a structured sidecar that tailor-resume consumes.
- when_to_use
- Use to evaluate a single job (or a few) against the user's profile before they spend effort applying — typically on the top results from find-jobs, or any job description the user pastes.
- allowed-tools
- Read, Write
- user-invocable
- true
02 资源文件 1
- 参考文档reference/score-schema.md3.5 KB
03 SKILL.md 正文
score-fit
Judge a job against the user's profile the way a good recruiter + ATS would, and give a decision — not just a number.
Inputs
- The profile: read
profile/master-profile.md.- Missing → offer a degraded one-shot mode: score against a resume/profile snippet the user
pastes now, and set
profile_missing: truein the sidecar. Suggest/build-profilefor next time. - Stale → if fields the score depends on are marked
[VERIFY], warn in the output and setprofile_stale: true. Never credit[VERIFY]facts toward must-haves.
- Missing → offer a degraded one-shot mode: score against a resume/profile snippet the user
pastes now, and set
- The job: a pasted description, a URL to fetch, or an entry from
jobs/found-<date>.json. Known-info gate (RULES §6): if no job is given inline, readjobs/current.json(the job under work) and use itsjd_text/url— do not re-ask for the JD if it's already captured. After resolving the job, write/refreshjobs/current.json({company, role, url, job_id, jd_text, region, source, captured_at}) sotailor-resume/write-cover-letter/answer-application-questionsreuse it without asking again. Only ask the user for a job if none is supplied andcurrent.jsonis absent.
Method (think like an ATS, then like a hiring manager)
-
Apply work-authorization logic first. Determine the job's country and resolve the applicant's
work_authper../../knowledge/work-authorization.md— it uses the job's region pack, not the applicant's, and returns one ofNON-ISSUE / MINOR-NOTE / MAJOR-FILTER / DISQUALIFIER. Record it aswork_auth_verdict. (E.g. India applicant + India job → NON-ISSUE: do not raise or penalize; weight notice-period/CTC fit instead. The same applicant + a US "no sponsorship" job → MAJOR-FILTER.) -
Extract the job's requirements: hard requirements (must-haves), preferred (nice-to-haves), key skills/keywords, seniority, domain, location/remote, comp if stated.
- AI/ML roles: if the role is AI/ML, detect its archetype per
../../knowledge/ai-roles.md(AI Platform/LLMOps · Agentic · Technical AI PM · Solutions Architect · Forward-Deployed · Transformation). Weight thedomainandmust_havessub-scores toward that archetype's proof points, note it instrengths/gaps, and recordarchetypein the sidecar. Distinguish genuine AI roles from "AI" used only as a buzzword (title filter in ai-roles.md).
- AI/ML roles: if the role is AI/ML, detect its archetype per
-
Grade each requirement as met / partial / missing, citing profile evidence:
- met — clear evidence in the resume; partial — adjacent/transferable experience, or only part of a compound requirement is shown; missing — no evidence. Don't credit skills not shown.
- Match semantically, not literally (the shared engine —
../../knowledge/relevance.md): credit a skill demonstrated under a different name (a "Visual AI agent" shows computer vision; "ran paid campaigns" shows performance marketing; "RAG" ≈ retrieval-augmented). Literal keyword absence is not the same as missing evidence. But never credit[VERIFY]facts — not even as transferable. - "X OR Y" requirements — satisfied if the profile has either. Never penalize for lacking the other half of an OR.
- Ambiguous / underspecified JDs — score conservatively, note the ambiguity in
gaps, and don't inflate must-haves. Lower confidence rather than guessing high. - Mark
is_dealbreaker: truefor must-haves whose absence alone should drive a Skip.
-
Keyword coverage: list keywords present in the profile (
matched_keywords) vs. missing ones an ATS would screen on (missing_keywords). Keepmissing_keywordsto terms the resume could honestly incorporate — this list feedstailor-resume. -
Score 0–100 using this weighting (adjust slightly per role) — these are the
subscores:- Must-have requirements met — 45
- Seniority & scope match — 20
- Domain/industry relevance — 15
- Keyword/skills coverage — 15
- Location / remote / work-auth fit — 5
Then subtract itemized penalties for hard-constraint violations (onsite when remote-only; sponsorship not offered when needed per §0; comp clearly below
min_base_salary). The finalscore= sum(subscores) + sum(penalties), clamped to 0–100. (Subscores still sum to 100 — the factor weights mirror../../knowledge/relevance.md, so thisscorestays directionally consistent with find-jobsfit_rank.) -
Goal alignment (directional — not a subscore). Read
context.career_goalto judge whether this role advances the candidate's stated direction; setgoal_alignment∈strong|neutral|weak. It breaks ties / nudges therecommendation(e.g. a borderline 70 that strongly serves the goal → "apply"; one that pulls away → "apply_if_tailored"). It is never a numeric subscore (preserves the 100-point sum) and is never quoted, paraphrased, or echoed into any output (RULES.md §2) — it directs the verdict, it does not appear in it.
Output
Human-readable (always)
- Score: NN/100 + one-line verdict.
- Recommendation: Apply / Apply if tailored / Skip — with the single biggest reason.
- Strengths (3–5 bullets) — citing profile evidence.
- Gaps / risks (3–5 bullets) — missing must-haves or weak areas; note dealbreakers vs. addressable.
- Missing keywords — comma list the resume should incorporate (feeds
tailor-resume). - If recommending Apply, suggest
/tailor-resumefor this job.
Structured sidecar (gated)
When the job has an id (from jobs/found-<date>.json) or score-fit runs inside a pipeline,
also write scores/<job-id>.score.json per reference/score-schema.md
(subscores must sum to the pre-penalty total). For one-off pasted JDs, skip the file unless asked.
Be honest — a low score is more useful than a flattering one. No emoji.
Next steps
Apply / Apply-if-tailored → /tailor-resume for this job (or /apply-to-job to assemble the whole package). Skip → move to the next job.
04 同仓库更多 Skills
write-outreach
Write a short, profile-grounded cold outreach message to a recruiter, hiring manager, or potential referrer — LinkedIn DM or email — with one clear CTA and no flattery.
write-cover-letter
Produce a job-specific, profile-grounded cover letter in markdown — ≤ 350 words, ≤ 1 page, three paragraphs (hook → two quantified proofs → fit close). Reuses keywords from a prior tailor-resume sidecar when present. Writes a JSON sidecar reserved for a future /render-resume --kind cover-letter (rendercv).
triage-inbox
Classify a recruiting email (or a batch) into one of the 10 canonical email classes, extract structured fields (company / role / dates / links / asks / deadline / sentiment), and suggest the next action. Writes inbox/triage-<YYYY-MM-DD>.json — consumed by infer-status and draft-reply.
tailor-resume
Produce a job-specific, ATS-optimized resume from the user's master profile and a target job — reordering, reframing, and surfacing the most relevant real experience and keywords. Enforces a content rubric (bullet shape, length, parallel grammar, metric coverage), then renders a polished PDF by default (via render-resume) and visually QAs it. Never fabricates.
review-render
Visually QA a rendered resume PDF and auto-fix layout/content defects in a bounded loop: render → screenshot → deterministic gate → vision rubric → apply one fix → re-render, until it passes or hits a pass cap. Catches widows, under-fill, overflow, orphaned headers, and imbalance that text-only logic can't see.
research-company
Build a structured company × role brief — compensation, day-to-day, career growth, recent news, community sentiment (Reddit / Blind / Glassdoor), red flags, and a "fit for this user" view. Heavy reasoning — runs forked. Writes companies/<slug>.{md,json} sidecars consumed by prep-interview and coach-negotiation.