job-listing-filter · v0.2.0 · 2026-10-08 · sha256 d1f9e6d7713b437c
job-listing-filter v0.2.0A
Immutable. This exact content never changes and is served at /api/v1/blob/d1f9e6d7713b437c.
---
name: job-listing-filter
version: 0.2.0
description: >-
Triage a batch of job descriptions against the user's profile. Scores each 0–100 for
whether the role is a good use of their time, with a short summary, ranked best-first.
Use this whenever the user pastes two or more job descriptions, a block of listings, or a
job-board dump and wants to know which are worth pursuing. Triggers on "filter these
jobs," "which of these should I apply to," "rank these listings," "score these JDs,"
or any pile of roles pasted with intent to sort or prioritize. This is triage only: it
does NOT write resumes or cover letters (that's job-application-tailor).
---
# Job Listing Filter
A fast triage pass over a batch of job descriptions. The goal is to tell the user, at a glance, which listings deserve a closer look. Not to tailor anything.
Optimize for speed and ranking. Don't rewrite resumes, write cover letters, or do deep gap analysis. If the user wants tailoring, hand off to `job-application-tailor`.
## The profile (this skill never edits it)
Facts about the user live in **`~/Documents/job-search/profile.md`**, inside their working folder `~/Documents/job-search/`. It sits outside the plugin on purpose: plugin updates replace the plugin folder, and the profile has to survive them.
- **Read it fresh** before using any fact about the user.
- **Never overwrite, rewrite, reformat, or delete anything in `profile.md`.**
- **If the file doesn't exist:** say so, and offer to create it by copying `${CLAUDE_PLUGIN_ROOT}/profile/profile.TEMPLATE.md` to that path. Do it only after the user agrees, and only if no file is there.
- **If a section this task needs is missing or still `[placeholder]`:** ask for that one section in chat, one at a time, most important first. When the user answers, show the exact text and, only with their OK, append it to the end of `profile.md` as a new top-level section: a `## ` heading with the template's name for it followed by `(added YYYY-MM-DD)`. Append only. If an older placeholder copy of that heading is still in the file, the newest dated copy wins; tell the user they can delete the old one themselves. If they'd rather skip it, carry on without it and say what's missing.
## Inputs
**Read the first two from disk; don't ask for them.** Only the listings come from the user.
1. **Profile.** Read `~/Documents/job-search/profile.md`. *Search targets* drives scoring; *Work history*, *Tools & skills*, *Honest gaps*, and *Positioning* tell you what the user actually has. If *Search targets* is still placeholders, ask for it before scoring, one section at a time (see *The profile*). If the user attaches a specific resume, score against that and say so.
2. **Overrides.** If the user says anything this session that changes their targets ("open to remote this week," "ignore comp for now"), apply it and name it at the top of the report.
3. **The listings.** Plain text, often a messy job-board dump.
Open the report with one line naming what was read and any override.
## What the score means
The score answers one question: **"How likely is this role to be a good use of the user's time?"**
It is not a keyword-overlap count. Weigh level alignment, scope, compensation potential, domain fit, probability of getting through the screen, and long-term career value.
A role with lower keyword overlap can score **high** when title, level, responsibilities, and likely comp line up. A role with high keyword overlap can score **low** when it's a downlevel, the wrong role shape, or trips a dealbreaker.
## Read the high-signal fields first
Many job descriptions are templated or generated and never proofread. Weight the fields that are hard to fake:
1. **Title,** and the level it implies.
2. **Posted comp range.** Real and checkable, and often a better read on level than the title. No range: score on the title's level and say comp is unknown; don't guess upward.
3. **Location, work model, hours, and travel,** checked against the profile.
4. **Responsibilities:** what the person actually does day to day. Read for the shape of the work.
**Requirement lists are lower signal, with exceptions.** Long "must have" lists, years-of-experience numbers, and named tools are often padding. If a JD is visibly unproofread (a bullet pasted twice, mismatched titles, contradictory location lines), say so in one line and weight its requirement text lower; a repeated bullet is usually a copy-paste artifact, not emphasis. **But licenses, certifications, clearances, and legally required credentials are real gates** in most fields (see *Gating requirements*).
**New function or backfill?** Say which in the summary line. A **new** function (first hire for it, "build the team," "define the roadmap") rewards range and judgment. A **backfill** of an established seat rewards matching the predecessor's exact profile. Both can be worth applying to; label it rather than scoring it down. If the profile's *Positioning* says which shape suits the user, score that shape up.
## Scoring bands
- **90–100:** Excellent. Squarely on target.
- **80–89:** Strong. Worth pursuing.
- **70–79:** Good, with some gaps.
- **60–69:** Mixed. Only if the company is a draw or it's useful practice.
- **50–59:** Weak or downlevel. Usually skip.
- **Below 50:** Skip.
Don't flatter. Don't inflate a score because a title sounds senior.
## Hard filters (apply first)
Read these from the profile's *Search targets*: **Location** (including travel), **Engagement types** (full-time, part-time, contract), **Compensation floor**, **Other dealbreakers**, and the **Do not pursue** list under *Target roles*.
- A role that clearly breaks a location or travel dealbreaker is a **Skip**. If it's borderline, cap at **Maybe**, cut 15–20 points, and say why.
- If location, on-site expectation, hours, or travel is unclear, flag it with ❓. That's a question to answer before applying.
- A role whose engagement type the profile rules out is a **Skip**.
- A role on the *Do not pursue* list is a Skip unless the JD clearly shows the scope the user actually wants.
- Name any tripped filter in the Risk line.
## Disguised roles
If the profile lists *Disguised-role tells*, read the **responsibilities** (not just the requirements) for them. **Any two tells and the role is the disguised shape:** score it at most 55, recommend Skip, and name the tells that fired in one line. Don't let a single strong match pull it back up; disguised roles usually carry one bullet that looks exactly right.
## Warm-channel-only
If the company or sector is on the profile's *Warm-channel-only* list, score the role normally on fit, then cap the action at **Referral** or **Skip**: recommend the warm route (a referral, an intro, a direct note to someone there), never a cold application. Say so in the Risk line.
## Company-size gradient (how much the title matters)
Titles are inconsistent across company sizes. Scale how much the title counts:
- **Startup (under ~200 people):** title barely matters. Score on real scope, ownership, and growth path. An unusual or junior-sounding title isn't a down-rank if the work shows real leverage.
- **Mid-size:** balance title, scope, comp, and level.
- **Large / public:** title, level, and comp carry more weight. But big-company JDs often undersell scope, so read the responsibilities before skipping on title alone.
## Gating requirements
The "Requirements" / "What you bring" / "Minimum qualifications" block is what an ATS keyword-screens against and what a recruiter checks first. Check each stated requirement against the profile: *Education & certifications* for credential gates, *Domain experience* for domain gates, *Tools & skills* for skill gates, and *Honest gaps* for all three. Three kinds of gate:
- **Credential gates:** a required license, certification, clearance, or degree. These are usually real; treat them as gates.
- **Domain gates:** specialized industry experience stated as required.
- **Skill or tool gates:** a specific technology, system, or method stated as required or "deep experience." These are the most often padded; weigh them against the unproofread-JD rule above.
How to weight them:
- **Soft framing** ("nice to have," "preferred," "a plus," "familiarity with") → small penalty, note in Risk.
- **One hard requirement** ("required," "must have," "strongly preferred," under a Minimum Qualifications heading) that the user clearly lacks → cut 10–18 points and set Action no higher than **Maybe**; default to **Skip** unless there's a referral path.
- **Two or more hard gates** → **Skip**. A referral is the only reason to reconsider.
- A requirement counts only if the JD actually states it. Don't invent gates.
- A closely related skill or system in the same family is a transferable stretch, not a gate. Say so in Risk.
When a gate fires, say it plainly: e.g. "Requires an active certification in X; profile shows none. Likely screened out before the rest is read."
## Other adjustments
**Scope signals (raise modestly):** ownership of a product, program, system, or team; hiring; roadmap influence; cross-functional leadership; visible impact. These matter even when the exact tools don't match.
**Negative signals (lower modestly):** staff augmentation, maintenance-only, ticket-driven execution, vague responsibilities, obvious downlevel, unrealistic requirement lists.
**Company quality (±5 max):** up for a strong product, healthy growth, good reputation; down for obvious chaos or role confusion. Don't let company quality dominate role fit.
**Compensation:** use the profile's target and floor.
- Posted comp at or above target: up to +5.
- Posted comp clearly below the floor: up to −10, but don't skip a strong-fit role on comp alone.
- Comp not listed: no adjustment.
If a role scores 85+ on fundamentals but pays below target, score it honestly and say "strong fit, likely not a comp step up."
**Remote roles:** note in Signals (not as a penalty) that remote postings draw far more applicants, so a warm channel matters more there than anywhere else.
## Triage signals
Report these alongside the score, not folded into it. One value each, no explanation.
- **Data Confidence** (High / Med / Low): how complete the *listing* is. Full JD with comp and reporting line → High. Missing comp or reporting line → Med. Teaser or fragment → Low.
- **Comp Step-Up** (High / Med / Low): would this move the user's comp forward? Unknown → Med.
- **Referral Worthy** (Yes / No): worth spending social capital on?
- **Interview Practice** (High / Med / Low): useful reps even if not ideal?
## Output format
Rank best-first. Number each role.
```
### N. Company — Role · XX/100
**Signals:** Data Confidence ... · Comp Step-Up ... · Referral Worthy ... · Interview Practice ...
**Fit:** 1–2 sentences on why it scored where it did (and new function vs. backfill).
**Strength:** One sentence.
**Risk:** One sentence.
**Salary:** Posted range, or "Not listed."
**Action:** Apply / Referral / Maybe / Skip
```
- Salary always sits just before Action.
- Keep each block under 120 words.
- For large batches, rank everything but show the top 15 blocks unless asked for all.
End with:
```
Top Targets:
- ...
Probably Not Worth Time:
- ...
```
No further analysis after that.
## Messy listings
Job-board dumps run together. Split on title lines, company/location lines, salary lines, and headers like "About the role," "Responsibilities," "Qualifications."
**Cards only (title, company, location, maybe a salary; no description):** run it as a pre-triage. Every block is Data Confidence Low, and the purpose is choosing which descriptions to open, not a verdict. Say so in the opening line. Drop cards that are plainly off-target (on the *Do not pursue* list, wrong field, wrong engagement type) without a block, and name them in one line under Probably Not Worth Time.
## Guardrails
- Score on time-value and fit, not keywords. Never credit the user with a skill that isn't in the profile.
- Never write a resume or cover letter here; point to `job-application-tailor`.
- Direct, concise, skimmable in under a minute.
## Version stamp
End every report with: `<!-- job-listing-filter v0.2.0 -->`
## Changelog
- **0.2.0**: Reads everything from the profile without asking. Added high-signal-field reading, new-function vs. backfill labels, disguised-role tells, warm-channel-only, engagement-type and travel filters, a remote-volume note, and a cards-only pre-triage mode. Credentials and licenses stay real gates. The profile lives at `~/Documents/job-search/profile.md`, outside the plugin; this skill never edits it and asks for missing sections one at a time.
- **0.1.0**: Initial community release.