scout-vet
Scout Vet
Evaluates a job listing against your profile, producing a weighted score and recommendation. Updates the job file with the results.
Prerequisites
Requires ~/.scout/profile/master-profile.md and ~/.scout/profile/preferences.md. If either is missing, direct the user:
"No profile found. Run
/scout-profilefirst to set up your skills, experience, and preferences."
Input Mode Detection
- User specifies a job ID → vet that specific job
- User says "vet all" or "batch" → batch mode
- No specific job mentioned → present list of unvetted jobs (status:
"discovered") for selection
Single Job Vetting
- Read the job file from
~/.scout/jobs/<job-id>.md. - Read
~/.scout/profile/master-profile.mdand~/.scout/profile/preferences.md. - Evaluate against all criteria (see Evaluation Criteria below).
- Present the full scorecard to the user.
- Update the job file's frontmatter: set
status: "vetted",score: <number>,recommendation: "<recommendation>". - Append to
~/.scout/history.md.
Batch Mode
- Scan
~/.scout/jobs/*.mdfor files withstatus: "discovered". - If none found, inform the user.
- Process each job sequentially. After each, present the scorecard and pause for user review before proceeding.
- If evaluation partially fails for a job (e.g., WebSearch unavailable for reputation check), log the failure, score from available categories (recalculating weights proportionally from remaining categories), and continue to the next job.
- At the end, present a summary: N vetted, scores, recommendations.
Resumable — re-invoking picks up jobs still in "discovered" status.
Evaluation Criteria
Deal-Breaker Check (Pass/Fail)
Check the job against every item in preferences.md → dealbreakers. ANY match = automatic Skip regardless of score. Common deal-breakers:
- Location violates
location.dealbreaker_if - Salary below
salary.minimum(if salary is disclosed) - Company size violates
company_size.dealbreaker_if - Any custom dealbreaker string matched against the job description
If a deal-breaker triggers, still calculate the score for informational purposes but set recommendation to Skip with the deal-breaker reason.
Weighted Scoring (100 points)
| Category | Weight | How to Score |
|---|---|---|
| Skills match | 30% | Compare job's Requirements and Nice-to-haves against master-profile.md skills list. Score higher for required skill matches, partial credit for nice-to-have matches. Penalize for required skills the user lacks. |
| Experience match | 15% | Compare job's seniority level and implied years of experience against user's years_experience and title. Exact match = full score. One level off = partial. Two+ levels off = low. |
| Compensation fit | 15% | Compare job's salary.min/salary.max against preferences.md → salary.minimum and salary.preferred. Normalize currencies if different. Full score if job range overlaps preferred. Partial if above minimum. Zero if below minimum. Null salary = 50% (neutral). |
| Preferences match | 15% | Check location, remote policy, company size, industry against preferences. Each match = proportional credit. |
| Red flags | 15% | Start at full score, deduct for each red flag found (see Red Flag Checklist). |
| Opportunity signal | 10% | Use WebSearch to check company reputation, recent news, growth signals. Score based on findings. If WebSearch is unavailable, score 50% (neutral) and note "insufficient data." |
Red Flag Checklist
Deduct points for each flag found:
- Vague job description with no concrete responsibilities (-3)
- Unrealistic requirements / "unicorn" listing requiring 10+ technologies for mid-level (-4)
- Excessive requirements for stated seniority (e.g., "5 years" for junior) (-3)
- No salary information disclosed (-2)
- Listing age > 30 days based on
date_posted(-3) - Reposted listing (same job appearing frequently — check via WebSearch if possible) (-4)
- "Confidential" company or no company name (-4)
- "Urgently hiring" + below-market compensation (-3)
- "Other duties as assigned" dominating description (-2)
- Equity-heavy compensation with no salary floor (-3)
- Company currently undergoing layoffs (check via WebSearch) (-3)
Output Format
Present to the user:
## Vetting: [Job Title] at [Company]
**Overall: [SCORE]/100 ([LETTER GRADE]) — [RECOMMENDATION]**
| Category | Score | Notes |
|----------|-------|-------|
| Skills match | X/30 | [brief reasoning] |
| Experience match | X/15 | [brief reasoning] |
| Compensation fit | X/15 | [brief reasoning] |
| Preferences match | X/15 | [brief reasoning] |
| Red flags | X/15 | [flags found, or "none"] |
| Opportunity signal | X/10 | [brief reasoning] |
**Deal-breakers:** [None, or list violations]
**Recommendation:** Strong match / Worth applying / Stretch / Skip
**Talking Points for Application:**
- [Skill/experience that aligns strongly]
- [Skill/experience that aligns strongly]
- [Skill/experience that aligns strongly]
Letter Grades
- A: 85-100
- B: 70-84
- C: 55-69
- D: 40-54
- F: 0-39
Recommendations
- Strong match (A): Skills, experience, and preferences align well
- Worth applying (B): Good fit with minor gaps
- Stretch (C-D): Significant gaps but still potentially viable
- Skip (F, or any deal-breaker): Poor fit or deal-breaker violation
Append to History
After vetting each job:
- YYYY-MM-DD HH:MM | scout-vet | vetted | <job-id> | "Score: <score>/<grade>, <recommendation>"
Completion
After vetting, inform the user:
"[Job Title] at [Company]: [SCORE]/100 ([RECOMMENDATION]). Run
/scout-apply <job-id>to generate tailored application materials."