package engine import ( "context" "testing" ) // TestGoldenScoringSnapshot is the behavior preservation harness for the three tool separation. It // scores a fixed set of candidates against one fixed requirement through the shared engine and asserts // the EXACT sub scores, total, and band for each. The three tools (screenMATCH, slateMATCH, // missionMATCH) all call this one engine, so these golden values are the contract: re run this after // every workstream and prove the numbers are byte identical. A drift here means a refactor changed a // score, which the acceptance criteria forbid. The candidates span all three bands (Green, Yellow, // Red) so a band cut change is caught too. // // The requirement is perfectRequirement(): Secret, no poly, mandatory AWS and Go, Security+, DISA // customer, 5 years, Fort Meade with no remote. func TestGoldenScoringSnapshot(t *testing.T) { req := perfectRequirement() type want struct { clearance, skills, certs, customer, experience, location string total string band Band gaps int } cases := []struct { name string cand Candidate want want }{ { // Every dimension perfect. Total 100.00, Green, no gaps. name: "green perfect", cand: perfectCandidate(), want: want{ clearance: "100", skills: "100", certs: "100", customer: "100", experience: "100", location: "100", total: "100.00", band: BandGreen, gaps: 0, }, }, { // Clearance, customer, certs, experience, location perfect; one of two mandatory skills met. // Skills 50. Total 25+12.5+15+15+10+10 = 87.50, Yellow, one mandatory skill gap (Go). name: "yellow one skill short", cand: Candidate{ ID: "cand-yellow", Clearance: Clearance{Level: ClearanceSecret, Poly: PolyNone, Status: StatusActive}, Skills: []CandidateSkill{{SkillID: "sk-aws", Name: "AWS"}}, Certifications: []string{"Security+"}, CustomerExperience: []string{"DISA"}, YearsExperience: 5, Location: "Fort Meade, MD", Available: true, }, want: want{ clearance: "100", skills: "50", certs: "100", customer: "100", experience: "100", location: "100", total: "87.50", band: BandYellow, gaps: 1, }, }, { // Confidential cannot satisfy Secret so clearance is 0; one skill of two; no certs; no DISA; // 3 of 5 years (60); wrong location but relocatable (50) and available (100) so location 75. // Total 0+12.5+0+0+6+7.5 = 26.00, Red. Gaps: clearance, mandatory Go, Security+. name: "red underqualified", cand: Candidate{ ID: "cand-red", Clearance: Clearance{Level: ClearanceConfidential, Poly: PolyNone, Status: StatusActive}, Skills: []CandidateSkill{{SkillID: "sk-aws", Name: "AWS"}}, Certifications: nil, CustomerExperience: nil, YearsExperience: 3, Location: "Denver, CO", Relocatable: true, Available: true, }, want: want{ clearance: "0", skills: "50", certs: "0", customer: "0", experience: "60", location: "75", total: "26.00", band: BandRed, gaps: 3, }, }, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { res := ScoreCandidate(context.Background(), tc.cand, req, nil) eq(t, res.Clearance, tc.want.clearance) eq(t, res.Skills, tc.want.skills) eq(t, res.Certifications, tc.want.certs) eq(t, res.CustomerExperience, tc.want.customer) eq(t, res.Experience, tc.want.experience) eq(t, res.Location, tc.want.location) if res.Total.StringFixed(2) != tc.want.total { t.Fatalf("total %s, want %s", res.Total.StringFixed(2), tc.want.total) } if res.Band != tc.want.band { t.Fatalf("band %s, want %s", res.Band, tc.want.band) } if len(res.GapSummary) != tc.want.gaps { t.Fatalf("gap count %d, want %d: %v", len(res.GapSummary), tc.want.gaps, res.GapSummary) } // The weighted trace must always re sum to the total: the AEDT explainability invariant. sum := zero for _, comp := range res.Trace { sum = sum.Add(comp.Weighted) } if !sum.Round(2).Equal(res.Total) { t.Fatalf("trace sum %s != total %s", sum.Round(2), res.Total) } }) } }