Job Fit Scoring
Score and rank open roles against the user's profile with an explicit, weighted rubric, so effort goes to the roles most likely to convert, and stretch/missing requirements stay honest and visible.
When to use
- Right after a
job-sourcingsweep addsstatus=foundrows - "Which of these should I actually apply to?", "rank my pipeline", "score this one job I found"
- Re-scoring after the profile changes (new comp floor, new target titles) or a JD is updated
Inputs
- Reads:
workspace/profile/profile.md(achievements, skills, hard constraints),workspace/profile/target-roles.md(titles, must-haves, deal-breakers, comp floor, location),workspace/profile/target-companies.md(company-ICP + tiers),workspace/pipeline/tracker.csv(rows to score, defaulting to everything atstatus=found), and each role'sapplications/<id>-*.md(the raw JD) - Needs from user: nothing if profile/ + found rows exist. Optionally a subset to score, or a manual override on a deal-breaker. If profile/ is empty, route to
job-search-setup.
Workflow
Select rows. Default to all
status=found. Accept a user-specified subset or a single role.Read the real JD. Score against the raw JD text in
applications/<id>-*.md, not the tracker summary line. If the JD wasn't captured, fetch/paste it first.Check deal-breakers FIRST. If the role trips any deal-breaker in
target-roles.md(wrong location/remote, below comp floor when comp is listed, missing work authorization, on-site-only, industry the user excluded, IC-vs-management mismatch), capfit_scoreat 39 (priority C) and write the disqualifying reason as the rationale. Do not let strong scores elsewhere paper over a hard no. If comp isn't listed, it can't trip the comp deal-breaker. Note the unknown instead.Score the 8 dimensions (0–100 total). Award each dimension's points on a 0-to-max scale, then sum:
# Dimension Max What earns full points 1 Role / title match 20 Title (or a known variant) matches the target, and the core function is the job the user wants 2 Seniority match 10 Level lines up with the user's band, not a step down and not two steps up 3 Must-haves met 20 The JD's required qualifications are things the user genuinely has (evidence in profile/master-resume) 4 Company-ICP fit 15 Company matches the ICP rubric (stage, size, industry, model) and/or sits in Tier A/B 5 Comp fit 10 Listed band clears the comp floor with room. Full points only if comp is disclosed and comfortably above floor. Unlisted comp = award 5 (unknown), note it 6 Location / remote fit 10 Matches the user's location/remote rule cleanly 7 Trigger / timing signals 10 Fresh funding, new exec building a team, product launch, hiring surge, backfill of a role the user is perfect for, all reasons this is a good moment to be their candidate 8 Stretch / growth 5 The role stretches the user in a direction they want (upside), not a reach that will read as unqualified Score to real evidence. If the JP demands 8 years and the user has 4, dimension 3 is not full marks. Say so. Missing requirements lower the score, and they never get rounded up because the role is exciting.
Set priority.
A ≥ 80·B 60–79·C < 60. Deal-breaker caps land in C by construction.Advance status. Move A and B rows from
found→researching(they're worth the research/tailoring investment). Leave C atfound(or the user can withdraw). Set a sensiblenext_action(e.g. "company-research + find referral") andnext_action_datefor A/B rows.Write the rationale. In each role's
applications/<id>-*.md, fill the Fit assessment section with a one-to-three-line honest rationale: the score, what matched, what's a stretch, what's missing. Gaps stay visible. This is what the human reads before deciding to apply.Update tracker + print shortlist. Write
fit_score,priority,status,next_action,next_action_dateback totracker.csv. Print a ranked table to chat, highest first.
Output
- Writes to:
workspace/pipeline/tracker.csv–fit_score,priority, updatedstatus,next_action,next_action_dateper rowworkspace/pipeline/applications/<id>-*.md– one-line-plus rationale in the Fit assessment section
- Format: a ranked chat table of
rank | id | company | role | fit | priority | one-line rationale (incl. the biggest gap). Deal-breaker disqualifications are shown with the reason, not silently buried at the bottom.
Rules & quality bar
- Transparent weights, shown on request. The rubric above is the whole scoring model, with no hidden judgment. If the user asks "why 74?", show the per-dimension breakdown.
- Never inflate. A stretch role scores like a stretch role. Missing must-haves cost points every time. Optimistic scoring wastes the user's applications on roles that won't call back.
- Deal-breakers are hard caps, not deductions. They cap at 39 regardless of other strengths. A role that fails work authorization is not a "78 with an asterisk".
- Comp unknown ≠ comp good. Do not award full comp points for an undisclosed band. Award the midpoint and flag it.
- No fabrication of qualifications. Score against what's actually in profile/master-resume. Don't credit a skill the user doesn't have because the JD wants it.
- Re-score, don't accumulate. Re-running overwrites prior scores for the selected rows so the tracker reflects current profile + JD, not a stale pass.
Related skills
- Reads from:
job-sourcing(thefoundrows) andjob-search-setup(the profile it scores against). - Hands off to:
company-researchandnetworking-and-referrals(for A/B roles now atresearching), thenresume-tailorandcover-letterwhen the user commits to applying.application-trackerowns the shared tracker schema this skill writes to.