Just a Tuesday  ·  Technical architecture

AI matching prompt architecture

The logic that powers every match. How candidate profiles and employer role requirements get translated into ranked, explainable results.

ModelClaude (Anthropic)
VersionArchitecture v1.0
StatusDesign phase
Last updatedJune 2026
01How matching works

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.

02The four match dimensions

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.

Years of relevant experience
Clearance level match
Program type alignment
Functional discipline overlap

Goals alignment

30%

Where the candidate wants to go vs. where this role leads. The most underweighted factor in traditional matching.

IC vs. leadership trajectory
Priority ranking alignment
"Never again" red flags
Growth path match

Work style

20%

How the candidate works vs. how this team operates. Predicts day-to-day friction or flow.

Autonomy vs. direction preference
Collaboration style
Management style compatibility
Environment preferences

Logistics

15%

The practical stuff. Lowest weight — but a hard mismatch here eliminates the candidate regardless of other scores.

Location and relocation
Compensation alignment
Remote / hybrid / on-site
Timeline match

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.

03System prompt

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.

SYSTEM PROMPT
# 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
04User prompt structure

The user prompt is constructed dynamically for each match request, inserting the structured candidate and employer data from the database into a consistent template.

USER PROMPT 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.
05Example match output

This is what the AI returns for a single candidate match. The employer dashboard and match report are both built from this JSON output.

Match result — Sarah K. (candidate_id: cand_001)

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."

06Implementation notes for Kevin

When building the matching engine, a few things worth noting for the actual implementation:

IMPLEMENTATION NOTES
# 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

🧪 Beta testing reminder — build this at the end of the prototype phase

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.