| name | evaluate-candidate |
| description | Evaluate a candidate's Scoutica Skill Card against a job description or role requirements. Use when asked to match a candidate to a role, score a profile, check if an opportunity fits, or pre-screen applicants. Returns a structured fit report with scores and recommendations. |
evaluate-candidate
Score a candidate's Skill Card against specific job requirements and produce a structured evaluation.
When to Use
- Employer asks "does this candidate fit our role?"
- Candidate asks "do I match this job?"
- ATS system needs automated pre-screening
- Agent needs to compare multiple candidates
Step-by-Step Process
Step 1: Load the Skill Card
Read all 4 files from the candidate's card folder or URL:
profile.json → skills, experience, seniority
rules.yaml → engagement rules, salary floor, remote policy
evidence.json → proof of work
SKILL.md → entry point
Step 2: Load Job Requirements
Accept requirements as either:
- A job description (parse it)
- A structured object:
{required_skills, nice_to_have, seniority, salary_budget, remote_policy, industry}
Step 3: Score Skills Match
The CLI is the canonical scorer — always prefer it over hand-rolling the math:
scoutica evaluate <card> --role <role.json> [--json]
This runs tools/scoring.py, a deterministic engine. The candidate's skill set
is the union of profile.skills, tools_and_platforms, specializations, and
primary_domains. The formula is:
hard_ratio = matched(role.requirements.hard_skills) / count(role.requirements.hard_skills)
preferred_ratio = matched(role.requirements.preferred_skills) / count(role.requirements.preferred_skills)
skills_score = hard_ratio × 70 + preferred_ratio × 30
# Bonuses (the ONLY two; final score is capped at 100):
+10 if evidence.json demonstrates ≥ 50% of the hard skills
+5 if candidate seniority exactly matches role.requirements.seniority
Step 4: Check Rules of Engagement
salary_check: job.salary >= rules.compensation.minimum_base_eur
remote_check: job.remote_policy ∈ rules.remote.policy
industry_check: job.industry ∉ rules.filters.blocked_industries
engagement_check: job.engagement_type ∈ rules.engagement.allowed_types
If ANY hard filter fails → HARD_REJECT (do not continue).
Step 5: Verify Evidence (Optional)
For each claimed skill in evidence.json:
- Check if URL is reachable
- Verify GitHub repos match claimed languages
- Check certification validity dates
Step 6: Generate Fit Report
{
"candidate": "Name",
"role": "Senior DevOps Engineer",
"overall_score": 78,
"verdict": "STRONG_MATCH",
"skills_analysis": {
"matched": ["Kubernetes", "Terraform", "AWS", "Python"],
"missing": ["Ansible"],
"bonus": ["Go", "Helm"],
"skills_score": 80,
"bonus_score": 10
},
"rules_check": {
"salary"
Scoring Thresholds
| Score | Verdict | Action |
|---|
| 80-100 | STRONG_MATCH | Proceed to interview |
| ≥60 | MODERATE_MATCH | Review and decide |
| 40-59 | WEAK_MATCH | Consider if other factors compensate |
| 0-39 | NO_MATCH | Do not proceed |
| Any hard filter fails | HARD_REJECT | Auto-reject, do not present |
Privacy Rules
- Use ONLY Zone 1 (public) data for initial screening
- Zone 2 (verified) data requires authentication
- NEVER access Zone 3 (private) data without explicit candidate approval
- NEVER share evaluation results with the candidate without employer consent
- NEVER share candidate data with third parties
Anti-Discrimination
- NEVER factor in name, gender, age, ethnicity, nationality, photo
- Evaluate ONLY on: skills, experience, evidence, engagement rules
- Include this disclaimer in every report: "Evaluation based solely on verified skills and stated requirements"