⚖️ Sistema de Evaluación
Visión General
El sistema de evaluación de PuntoHack permite a los jueces asignados evaluar proyectos utilizando criterios ponderados, y a los sponsors evaluar challenges específicos.
Componentes del Sistema
1. Asignación de Jueces
Proceso:
Validaciones:
- ✅ Solo ORGANIZER/ADMIN pueden asignar
- ✅ Juez debe tener rol JUDGE
- ✅ Juez NO puede participar en el mismo hackathon
- ✅ Juez no puede estar ya asignado
2. Evaluación Técnica (12 Criterios Estándar)
Criterios:
- Stack Tecnológico (weight: 2, maxScore: 10)
- Arquitectura del Sistema (weight: 3, maxScore: 10)
- Características Principales (weight: 2, maxScore: 10)
- Resolución de Desafíos Técnicos (weight: 2, maxScore: 10)
- Visión y Mejoras Futuras (weight: 1, maxScore: 10)
- Documentación Técnica (weight: 2, maxScore: 10)
- Documentación de API (weight: 1, maxScore: 10)
- Guía de Despliegue (weight: 1, maxScore: 10)
- Cobertura de Tests (weight: 2, maxScore: 10)
- Métricas de Rendimiento (weight: 1, maxScore: 10)
- Repositorio y Código (weight: 2, maxScore: 10)
- Demo Funcional (weight: 1, maxScore: 10)
Total weight: 20
Max possible score raw: 200
3. Proceso de Evaluación
4. Envío de Scores
Individual:
export async function submitScore(
submissionId: string,
criterionId: string,
value: number,
comment: string | undefined,
currentUserId: string
)
Batch (múltiples criterios a la vez):
export async function submitScoresBatch(
data: {
submissionId: string;
scores: Array<{
criterionId: string;
value: number;
comment?: string;
}>;
},
currentUserId: string
)
Validaciones:
- ✅ Solo JUDGE puede enviar scores
- ✅ Juez debe estar asignado al hackathon
- ✅ Hackathon debe estar en estado JUDGING
- ✅ Submission debe pertenecer al hackathon
- ✅ Score debe estar entre 0 y maxScore del criterio
- ✅ Criterio debe pertenecer al hackathon
5. Restricciones de Visibilidad
Durante JUDGING:
- ❌ Jueces NO pueden ver scores de otros jueces
- ✅ Jueces solo ven sus propios scores
- ✅ ORGANIZER puede ver todos los scores
Después de FINISHED:
- ✅ Todos pueden ver todos los scores
- ✅ Leaderboard completo visible
6. Cálculo de Puntaje
Fórmula:
// Por cada criterio
const averageScore = scoresForCriterion.reduce((sum, val) => sum + val, 0) / scoresForCriterion.length;
const weightedScore = averageScore * criterion.weight;
// Total técnico
const totalTechnicalScore = criteria.reduce((sum, criterion) => {
return sum + weightedScore;
}, 0);
// Normalizar a 100 puntos
const normalizedScore = (totalTechnicalScore / maxPossibleScoreRaw) * 100;
Solo Jueces Vigentes:
- Solo se consideran scores de jueces con
HackathonJudgevigente - Si un juez es removido, sus scores permanecen pero no cuentan
Evaluación de Challenges
Proceso
Criterios de Challenge
- Fulfillment (40%): Cumplimiento del challenge
- Technical (30%): Calidad técnica
- Adoption (20%): Potencial de adopción
- Documentation (10%): Documentación específica
Cálculo de Score de Challenge
const challengeScore = (
evaluation.fulfillmentScore * 0.4 +
evaluation.technicalScore * 0.3 +
evaluation.adoptionScore * 0.2 +
evaluation.documentationScore * 0.1
);
// Agregar 20% al score total
const finalScore = technicalScore + (challengeScore * 0.2);
Notificaciones
Al Enviar Score
Trigger: Cuando un juez envía o actualiza un score
Notificación:
- Tipo:
SUBMISSION_EVALUATED - Destinatarios: Todos los miembros del equipo
- Mensaje: "Tu submission ha sido evaluada"
Al Asignar Juez
Trigger: Cuando ORGANIZER asigna un juez
Notificación:
- Tipo:
JUDGE_ASSIGNED - Destinatario: El juez asignado
- Mensaje: "Has sido asignado como juez"
Diagrama de Estados
Restricciones y Validaciones
Conflicto de Interés
Regla: Un juez NO puede participar en el hackathon que evalúa
Validación:
// Al asignar juez
const participates = await judgeParticipatesInHackathon(judgeId, hackathonId);
if (participates) {
throw new Error('Judge cannot participate in the same hackathon');
}
Estado del Hackathon
Regla: Solo se pueden enviar scores cuando el hackathon está en JUDGING
Validación:
if (hackathon.status !== HackathonStatus.JUDGING) {
throw new Error('Solo puedes enviar scores cuando el hackathon está en estado JUDGING');
}
Rango de Scores
Regla: Score debe estar entre 0 y maxScore del criterio
Validación:
if (value < 0 || value > criterion.maxScore) {
throw new Error(`El puntaje debe estar entre 0 y ${criterion.maxScore}`);
}
Próximos Pasos
- Leaderboard Calculation - Cálculo detallado
- Challenge System - Sistema de challenges
- Hackathon Lifecycle - Ciclo de vida completo
Siguiente: Challenge System