Just a Tuesday · Technical architecture
The logic that powers every match. How candidate profiles and employer role requirements get translated into ranked, explainable results.
JAT matching isn't keyword filtering. It's semantic analysis across four weighted dimensions — reading both sides of the equation holistically and finding where they genuinely intersect.
The AI receives a structured candidate profile (from their intake) and a structured job requirement (from the employer intake) and produces a ranked, scored, explained match result. Every score comes with a reasoning explanation — not just a number.
Core design principle: The match should surface candidates a hiring manager would find compelling after a real conversation — not candidates who scored highest on keyword density. Explainability is not a feature; it's the product.
Every match is scored across four dimensions. Each contributes to the overall match score with a different weight reflecting what actually predicts a successful hire.
Technical fit
35%
Skills, experience depth, domain knowledge, clearance alignment, program environment match.
Goals alignment
30%
Where the candidate wants to go vs. where this role leads. The most underweighted factor in traditional matching.
Work style
20%
How the candidate works vs. how this team operates. Predicts day-to-day friction or flow.
Logistics
15%
The practical stuff. Lowest weight — but a hard mismatch here eliminates the candidate regardless of other scores.
Hard disqualifiers: A logistics score of 0 on clearance (required but not held), location (no relocation, wrong city), or compensation (more than 20% above employer range) eliminates the candidate from results entirely — regardless of other scores. The AI notes this in the explanation.
This is the instruction set sent to Claude before every matching request. It defines the AI's role, scoring methodology, output format, and quality standards.
# JAT — Matching Engine System Prompt You are the matching engine for JAT. Your job is to analyze a candidate profile and a job requirement and produce a scored, ranked, and explained match result. ## Your role You are not a keyword matcher. You are a seasoned aerospace and defense talent evaluator who understands that the best hires happen when skills, goals, work style, and logistics all align — not just when job titles match. Read both the candidate profile and job requirement holistically. Look for alignment signals that go beyond surface-level keywords. Pay special attention to what candidates say they want next and what employers describe as the real job (not just the posting). ## Scoring Score each candidate across four dimensions on a 0–100 scale: - technical_fit (35% weight): Skills, experience, clearance, domain match - goals_alignment (30% weight): Career trajectory, priorities, red flags - work_style (20% weight): How they work vs. how this team operates - logistics (15% weight): Location, comp, timing, remote/on-site Calculate overall_score as the weighted average of all four dimensions. Hard disqualifiers (set logistics score to 0 and exclude from results): - Clearance required but not held and not clearable - Compensation target more than 20% above employer max - Location mismatch with no relocation flexibility stated ## Output format Respond ONLY with valid JSON. No preamble. No markdown. No explanation outside the JSON structure. Follow this schema exactly: { "matches": [ { "candidate_id": string, "overall_score": number (0-100), "scores": { "technical_fit": number, "goals_alignment": number, "work_style": number, "logistics": number }, "why_this_candidate": string (2-3 sentences, plain language), "what_to_lead_with": string (1 sentence — how to open the conversation), "one_flag": string (1 sentence — the most important thing to verify), "disqualified": boolean, "disqualification_reason": string or null } ], "ranking_notes": string (1-2 sentences about the overall pool quality) } ## Quality standards - why_this_candidate must reference specific signals from both profiles - Never use generic phrases like "strong fit" or "good match" without specifics - what_to_lead_with must be actionable — something the employer can say - Flag the most important gap or risk, not the most obvious one - If two candidates score within 3 points, explain what differentiates them in ranking_notes
The user prompt is constructed dynamically for each match request, inserting the structured candidate and employer data from the database into a consistent template.
# Match request JOB REQUIREMENT: role_title: {{job.title}} location: {{job.location}} clearance_required: {{job.clearance}} comp_range: {{job.comp_min}} – {{job.comp_max}} program_environment: {{job.program_env}} program_phase: {{job.program_phase}} contract_type: {{job.contract_type}} work_environment: {{job.work_env}} what_the_job_actually_is: {{job.actual_job}} success_at_30_days: {{job.success_30}} success_at_90_days: {{job.success_90}} what_actually_matters: {{job.must_haves}} whats_negotiable: {{job.flexible}} honest_hard_part: {{job.honest_hard}} who_struggles_here: {{job.failure_profile}} what_failure_looks_like: {{job.failure_signal}} management_style: {{job.mgmt_style}} growth_path: {{job.growth}} --- CANDIDATES TO EVALUATE ({{candidate_count}} total): # Candidate 1 candidate_id: {{candidate.id}} experience_years: {{candidate.years}} current_title: {{candidate.title}} clearance: {{candidate.clearance}} location: {{candidate.location}} relocation: {{candidate.relocation}} comp_target: {{candidate.comp}} timeline: {{candidate.timeline}} program_backgrounds: {{candidate.programs}} what_they_actually_do: {{candidate.actual_work}} hidden_strength: {{candidate.hidden_strength}} energized_by: {{candidate.energized}} drained_by: {{candidate.drained}} work_environment_preference: {{candidate.work_env}} leadership_style: {{candidate.leadership}} invisible_contribution: {{candidate.kpi_invisible}} what_they_want_next: {{candidate.next_role}} would_never_do_again: {{candidate.never_again}} priorities_ranked: {{candidate.priorities}} # Repeat for each candidate... --- Evaluate all candidates against this role and return ranked JSON results.
This is what the AI returns for a single candidate match. The employer dashboard and match report are both built from this JSON output.
Overall score
94
Dimension scores
Technical fit: 96 · Goals alignment: 91 · Work style: 94 · Logistics: 100
Why this candidate
"Sarah's 11 years of ILS experience on fixed-price prime programs maps directly to your environment, and her active Secret clearance eliminates a common hiring delay. Her stated priority of technical depth over advancement aligns with your IC role, and her interest in mentoring a junior engineer matches the team-building need you described."
What to lead with
"Open with the technical challenge of the sustainment program and mention that you're looking for someone who can informally mentor a junior ILS engineer."
One flag
"She's been at her current company for 7 years — verify that the technical challenge and mentorship opportunity genuinely exist before the first call, since that's her primary motivation to move."
When building the matching engine, a few things worth noting for the actual implementation:
# API call structure const response = await fetch('https://api.anthropic.com/v1/messages', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'claude-sonnet-4-20250514', max_tokens: 2000, system: SYSTEM_PROMPT, // constant — defined above messages: [{ role: 'user', content: buildUserPrompt(job, candidates) // dynamic }] }) }); # Key implementation decisions # 1. Batch candidates per request (up to 10) rather than one at a time # — more efficient and allows comparative ranking in one pass # 2. Store raw JSON match results in database alongside scores # — allows re-displaying explanations without re-running the API # 3. Re-run matches when candidate updates their profile # — flag employer if a previously low match improves significantly # 4. pgvector for semantic pre-filtering # — embed candidate profiles and job requirements as vectors # — use cosine similarity to select top 20 candidates before Claude # — Claude then evaluates those 20 deeply rather than the full pool # — keeps API costs low as the candidate pool scales # 5. Hard disqualifier check before API call # — filter out candidates with clearance or comp hard mismatches # — saves API tokens on obvious non-matches
Before launch, build a fictional sandbox environment with pre-loaded fake candidate profiles and fake employer roles. Recruit family and friends to test both sides — some posing as candidates filling out the intake, some posing as employers reviewing matches.
The goal is to see how random, realistic inputs interact with the matching logic before a real employer ever sees the product. Capture what feels wrong, what scores seem off, and what the AI explanation gets right or misses. That feedback shapes the system prompt refinements before launch.