# Job Fit Scoring

> Use after job-sourcing, or when the user says "score these roles", "which jobs should I go after", "rank my pipeline", "is this one worth applying to". Scores each found role 0–100 against profile/ with a transparent weighted rubric, sets fit_score + priority (A/B/C), moves A/B roles to status=researching, and writes a ranked shortlist. Deal-breakers auto-disqualify. Never inflates fit.

- Skill: `guerrilla2799/job-fit-scoring` (Agent Skill)
- Install (CLI): `npx skillmds@latest add guerrilla2799/job-fit-scoring`
- Raw SKILL.md: https://api.skillmd.com/api/skills/guerrilla2799/job-fit-scoring/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: guerrilla2799 (https://skillmd.com/u/guerrilla2799)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/guerrilla2799/job-fit-scoring

---


# 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-sourcing` sweep adds `status=found` rows
- "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 at `status=found`), and each role's `applications/<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
1. **Select rows.** Default to all `status=found`. Accept a user-specified subset or a single role.
2. **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.
3. **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), **cap `fit_score` at 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.
4. **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.
5. **Set priority.** `A ≥ 80` · `B 60–79` · `C < 60`. Deal-breaker caps land in C by construction.
6. **Advance status.** Move **A and B** rows from `found` → `researching` (they're worth the research/tailoring investment). Leave **C** at `found` (or the user can withdraw). Set a sensible `next_action` (e.g. "company-research + find referral") and `next_action_date` for A/B rows.
7. **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.
8. **Update tracker + print shortlist.** Write `fit_score`, `priority`, `status`, `next_action`, `next_action_date` back to `tracker.csv`. Print a ranked table to chat, highest first.

## Output
- Writes to:
  - `workspace/pipeline/tracker.csv` – `fit_score`, `priority`, updated `status`, `next_action`, `next_action_date` per row
  - `workspace/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` (the `found` rows) and `job-search-setup` (the profile it scores against).
- Hands off to: `company-research` and `networking-and-referrals` (for A/B roles now at `researching`), then `resume-tailor` and `cover-letter` when the user commits to applying. `application-tracker` owns the shared tracker schema this skill writes to.

