Fix standalone award eligibility to send rich project data matching filtering pass
All checks were successful
Build and Push Docker Image / build (push) Successful in 8m39s

The Re-evaluate button was producing fewer eligible results because
the standalone job sent minimal project data (title, description, tags)
while the integrated filtering pass sent full data (files, team, institution).

- Fetch rich project data in award-eligibility-job (files, team, institution, etc.)
- Relax AI prompt to be inclusive like the integrated pass — strong primary
  criterion fit is sufficient, don't require all dimensions above 0.5

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-17 21:34:30 +01:00
parent 70d24036f9
commit 8a7da0fd93
2 changed files with 32 additions and 22 deletions

View File

@@ -63,7 +63,9 @@ quality_score is a 0-100 integer measuring how well the project fits the award c
## Guidelines ## Guidelines
- Base evaluation only on provided data — do not infer missing information - Base evaluation only on provided data — do not infer missing information
- eligible=true only when ALL required dimensions score above 0.5 - Be inclusive: if the project reasonably fits the criteria, mark eligible=true
- eligible=true when the project's location, category, or topic aligns with the award criteria
- Do not require perfection across all dimensions — strong fit in the primary criterion (e.g. geographic) is sufficient
- confidence reflects how clearly the data supports the determination - confidence reflects how clearly the data supports the determination
- No personal identifiers in reasoning` - No personal identifiers in reasoning`
@@ -90,7 +92,7 @@ interface ProjectForEligibility {
institution?: string | null institution?: string | null
foundedAt?: Date | null foundedAt?: Date | null
wantsMentorship?: boolean wantsMentorship?: boolean
submissionSource?: SubmissionSource submissionSource?: SubmissionSource | string
submittedAt?: Date | null submittedAt?: Date | null
_count?: { _count?: {
teamMembers?: number teamMembers?: number

View File

@@ -20,6 +20,25 @@ export async function processEligibilityJob(
include: { program: true }, include: { program: true },
}) })
// Rich select matching the data the integrated filtering pass sends
const projectSelect = {
id: true,
title: true,
description: true,
competitionCategory: true,
country: true,
geographicZone: true,
tags: true,
oceanIssue: true,
institution: true,
foundedAt: true,
wantsMentorship: true,
submissionSource: true,
submittedAt: true,
_count: { select: { teamMembers: true, files: true } },
files: { select: { fileType: true, size: true, pageCount: true } },
} as const
// Get projects — scoped to filtering round PASSED projects if provided // Get projects — scoped to filtering round PASSED projects if provided
let projects: Array<{ let projects: Array<{
id: string id: string
@@ -30,6 +49,13 @@ export async function processEligibilityJob(
geographicZone: string | null geographicZone: string | null
tags: string[] tags: string[]
oceanIssue: string | null oceanIssue: string | null
institution: string | null
foundedAt: Date | null
wantsMentorship: boolean
submissionSource: string
submittedAt: Date | null
_count: { teamMembers: number; files: number }
files: Array<{ fileType: string | null; size: number; pageCount: number | null }>
}> }>
if (filteringRoundId) { if (filteringRoundId) {
@@ -57,16 +83,7 @@ export async function processEligibilityJob(
id: { in: passedIds }, id: { in: passedIds },
programId: award.programId, programId: award.programId,
}, },
select: { select: projectSelect,
id: true,
title: true,
description: true,
competitionCategory: true,
country: true,
geographicZone: true,
tags: true,
oceanIssue: true,
},
}) })
} else { } else {
const statusFilter = includeSubmitted const statusFilter = includeSubmitted
@@ -78,16 +95,7 @@ export async function processEligibilityJob(
programId: award.programId, programId: award.programId,
status: { in: [...statusFilter] }, status: { in: [...statusFilter] },
}, },
select: { select: projectSelect,
id: true,
title: true,
description: true,
competitionCategory: true,
country: true,
geographicZone: true,
tags: true,
oceanIssue: true,
},
}) })
} }