# Score Fit

> >

- **Type:** Skill
- **Install:** `agentstack add skill-jain777-jobclaw-skills-score-fit`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [jain777](https://agentstack.voostack.com/s/jain777)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [jain777](https://github.com/jain777)
- **Source:** https://github.com/jain777/jobclaw-skills/tree/main/skills/score-fit

## Install

```sh
agentstack add skill-jain777-jobclaw-skills-score-fit
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# 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
1. 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: true` in the sidecar. Suggest `/build-profile` for next time.
   - **Stale** → if fields the score depends on are marked `[VERIFY]`, warn in the output and set
     `profile_stale: true`. Never credit `[VERIFY]` facts toward must-haves.
2. The job: a pasted description, a URL to fetch, or an entry from `jobs/found-.json`.
   **Known-info gate (RULES §6):** if no job is given inline, read `jobs/current.json` (the job under
   work) and use its `jd_text`/`url` — do not re-ask for the JD if it's already captured. After
   resolving the job, **write/refresh `jobs/current.json`** (`{company, role, url, job_id, jd_text,
   region, source, captured_at}`) so `tailor-resume` / `write-cover-letter` / `answer-application-questions`
   reuse it without asking again. Only ask the user for a job if none is supplied and `current.json` is absent.

## Method (think like an ATS, then like a hiring manager)

0. **Apply work-authorization logic first.** Determine the **job's** country and resolve the
   applicant's `work_auth` per [`../../knowledge/work-authorization.md`](../../knowledge/work-authorization.md)
   — it uses the **job's** region pack, not the applicant's, and returns one of
   `NON-ISSUE / MINOR-NOTE / MAJOR-FILTER / DISQUALIFIER`. Record it as `work_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.)

1. **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`](../../knowledge/ai-roles.md) (AI Platform/LLMOps · Agentic ·
     Technical AI PM · Solutions Architect · Forward-Deployed · Transformation). Weight the `domain`
     and `must_haves` sub-scores toward that archetype's proof points, note it in `strengths`/`gaps`,
     and **record `archetype` in the sidecar**. Distinguish genuine AI roles from "AI" used only as a
     buzzword (title filter in ai-roles.md).

2. **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`](../../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: true` for must-haves whose absence alone should drive a Skip.

3. **Keyword coverage**: list keywords present in the profile (`matched_keywords`) vs. missing ones an
   ATS would screen on (`missing_keywords`). Keep `missing_keywords` to terms the resume could
   *honestly* incorporate — this list feeds `tailor-resume`.

4. **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 final
   `score` = sum(subscores) + sum(penalties), clamped to 0–100. (Subscores still sum to 100 — the
   factor weights mirror [`../../knowledge/relevance.md`](../../knowledge/relevance.md), so this
   `score` stays directionally consistent with find-jobs `fit_rank`.)

5. **Goal alignment (directional — not a subscore).** Read `context.career_goal` to judge whether
   this role *advances the candidate's stated direction*; set `goal_alignment` ∈ `strong|neutral|weak`.
   It **breaks ties / nudges the `recommendation`** (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-resume` for this job.

### Structured sidecar (gated)
When the job has an `id` (from `jobs/found-.json`) **or** score-fit runs inside a pipeline,
also write `scores/.score.json` per [reference/score-schema.md](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.

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [jain777](https://github.com/jain777)
- **Source:** [jain777/jobclaw-skills](https://github.com/jain777/jobclaw-skills)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-jain777-jobclaw-skills-score-fit
- Seller: https://agentstack.voostack.com/s/jain777
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
