-- name: UpsertCandidateEvaluation :exec -- Upsert the latest screenMATCH qualification for one (candidate, requirement) pair. A fresh screen -- overwrites the prior row so there is exactly one current evaluation per pair, which missionMATCH -- reads instead of recomputing. evaluated_at is preserved as the first time the pair was screened; -- updated_at moves to now() on every rescreen. INSERT INTO candidate_evaluations ( organization_id, candidate_id, requirement_id, total_score, band, clearance_score, skills_score, certs_score, customer_score, experience_score, location_score, explanation, matched_skills, gap_summary, model_version, evaluated_by ) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16) ON CONFLICT (organization_id, candidate_id, requirement_id) DO UPDATE SET total_score = EXCLUDED.total_score, band = EXCLUDED.band, clearance_score = EXCLUDED.clearance_score, skills_score = EXCLUDED.skills_score, certs_score = EXCLUDED.certs_score, customer_score = EXCLUDED.customer_score, experience_score = EXCLUDED.experience_score, location_score = EXCLUDED.location_score, explanation = EXCLUDED.explanation, matched_skills = EXCLUDED.matched_skills, gap_summary = EXCLUDED.gap_summary, model_version = EXCLUDED.model_version, evaluated_by = EXCLUDED.evaluated_by, updated_at = now(); -- name: GetCandidateEvaluation :one SELECT * FROM candidate_evaluations WHERE candidate_id = $1 AND requirement_id = $2; -- name: ListEvaluationsForRequirement :many -- The persisted screenMATCH qualifications for one requirement, joined to the candidate name and -- availability, best first. missionMATCH "who can support this mission today" reads this STORED -- artifact rather than rescore the pool. Both tables are RLS scoped, so the join cannot cross tenants. SELECT ce.candidate_id, ce.total_score, ce.band, ce.evaluated_at, c.full_name, c.available FROM candidate_evaluations ce JOIN candidates c ON c.organization_id = ce.organization_id AND c.id = ce.candidate_id WHERE ce.requirement_id = $1 ORDER BY ce.total_score DESC, ce.candidate_id;