Saltar al contenido principal

⚖️ 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:

  1. Stack Tecnológico (weight: 2, maxScore: 10)
  2. Arquitectura del Sistema (weight: 3, maxScore: 10)
  3. Características Principales (weight: 2, maxScore: 10)
  4. Resolución de Desafíos Técnicos (weight: 2, maxScore: 10)
  5. Visión y Mejoras Futuras (weight: 1, maxScore: 10)
  6. Documentación Técnica (weight: 2, maxScore: 10)
  7. Documentación de API (weight: 1, maxScore: 10)
  8. Guía de Despliegue (weight: 1, maxScore: 10)
  9. Cobertura de Tests (weight: 2, maxScore: 10)
  10. Métricas de Rendimiento (weight: 1, maxScore: 10)
  11. Repositorio y Código (weight: 2, maxScore: 10)
  12. 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 HackathonJudge vigente
  • Si un juez es removido, sus scores permanecen pero no cuentan

Evaluación de Challenges

Proceso

Criterios de Challenge

  1. Fulfillment (40%): Cumplimiento del challenge
  2. Technical (30%): Calidad técnica
  3. Adoption (20%): Potencial de adopción
  4. 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


Siguiente: Challenge System