Ir al contenido

Rendimiento

Rendimiento centraliza la carga interna técnico-táctica del plantel: catálogo de competiciones y rivales, registro de partidos, importador PDF con IA (Wyscout / SIX) y radar de ejes por jugador. Lo consumen el HoP, el Director Deportivo y el RTP para evaluar perfil ofensivo, técnico, duelos y defensivo a partir de los informes que ya recibe el club, sin recargar a nadie.

  • Problema que resuelve: los clubes reciben PDFs de Wyscout o SIX después de cada partido, pero nadie tiene tiempo de transcribir las stats a una planilla. CÉNIT toma el PDF, lo parsea con IA y deja un perfil radar por jugador comparable entre partidos.
  • Casos de uso típicos [NEEDS_USER: CASE_STUDY caso real de Nacional]:
    • Post-partido: cargar el PDF de Wyscout y dejar las stats por jugador sin tipear nada.
    • Análisis pre-rival: ver el perfil de jugadores del rival en el módulo Scouting (mismo parser).
    • Evaluación mensual: comparar perfil radar del jugador entre meses para detectar evolución técnica o caída.
  • Planes que lo incluyen: esencial, pro y enterprise. El parser IA está disponible para todos los planes — no está gated. Lo único gated por plan en otros módulos es la recomendación IA del Risk Advisor.
  • Diferenciador: parser por IA específico para Wyscout y SIX (formatos de informe usados en LATAM), con prompt que distingue columnas en español/inglés, leyendas y leaderboards. No requiere configuración por cliente.

Roles con acceso a /dashboard/rendimiento (shell nav): hop, dir, sc, ss, rtp, coord_form, entrenador. Las mutaciones (crear competición, rival, partido) requieren requireRole(['hop','dir','sc','ss','rtp']) server-side, por lo que coord_form y entrenador quedan en lectura.

Tabs del módulo:

  1. Partidos — listado de partidos cargados con score, rival, competición y links a vista detallada.
  2. Jugador — perfil radar individual con promedio de ejes (axes) sobre todos los partidos importados.
  3. Importar — carga de PDFs de Wyscout / SIX. El archivo se convierte a texto vía pdfjs-dist y se manda al parser.
  4. Gestión — alta/baja de competiciones (competitions) y rivales (rival_teams).

[NEEDS_USER: SCREENSHOT del importador PDF con preview de jugadores extraídos]

Flujo principal — importar partido:

  1. Arrastrar PDF al importador.
  2. El cliente extrae texto (sin enviar el binario al server).
  3. parseTextAction(pdfText, squadNames) manda el texto a Claude Haiku con un prompt específico para Wyscout/SIX, restringido a los nombres del plantel propio.
  4. La respuesta JSON pasa por sanitizeMatch y devuelve un objeto ExtractedMatch con players[] validados (minutes > 0, números redondeados, xg/xa nullable).
  5. El staff revisa la grilla y confirma — los stats se persisten en tactical_uploads con axes normalizados (toAxes).

Flujo secundario — partido manual: en Gestión se puede crear un performance_match sin PDF (solo metadata: fecha, rival, score).

  • Catálogo de competiciones (competitions): nombre, tipo (liga / copa / internacional / amistoso), temporada, país. Soft-delete con active = false.
  • Catálogo de rivales (rival_teams): nombre + país, compartidos con Scouting.
  • ANTHROPIC_API_KEY en Workers Secrets — sin esta key el importador devuelve “ANTHROPIC_API_KEY no configurada”.
  • “El PDF no extrae texto”pdfjs-dist no lee escaneos. Si el PDF es una imagen, el parser devuelve “Texto insuficiente. El PDF puede ser una imagen escaneada”.
  • “El parser inventó un jugador” — el prompt incluye squadNames para forzar fuzzy match contra el plantel propio. Si igual aparece un nombre raro, se descarta manualmente en la grilla de preview.
  • “No detecta defensivos/ofensivos por separado” — el prompt tiene fallback: si SIX no reporta el split, estima defensive_duels ≈ 60% y offensive_duels ≈ 40% del total. Documentado y auditable.

Player surface: N/A. El jugador no ve stats técnico-tácticas en /player. El radar de ejes es solo para staff. Si en el futuro se expone, requerirá decisión de producto + SPEC.

  • Ejes (axes) — el parser entrega ~30 stats crudas (goals, xg, accurate_passes / total_passes, duels_won / total_duels, interceptions, etc.). toAxes (_lib/to-axes.ts) las normaliza a 4-6 ejes comparables (Ofensivo / Técnico / Duelos / Defensivo / Aéreo / Físico). El radar promedia los ejes entre partidos.
  • Estimaciones de fallback: cuando el PDF no separa duelos defensivos/ofensivos/aéreos, el prompt aplica ratios fijos (60/40/20). Documentado en SYSTEM_PROMPT para auditoría.
  • PDF Wyscout — columnas en español. El prompt mapea explícitamente Goles / xG, Asistencias / xA, Tiros / a la portería, Pases / precisos, Regates / logrados, Duelos / ganados, etc.
  • PDF SIX — formato distinto (leaderboards + tablas). El prompt mapea MIN, GOL, ASI, xG/xGoT, PASES CLAVE, RECUPERACIONES DEL BALÓN, INTERCEPTACIONES.
  • Modelo IA: claude-haiku-4-5-20251001, max_tokens: 8192. Slice del texto a 60K chars para mantener costos acotados.
  • Validación: sanitizeMatch descarta cualquier jugador con minutes ≤ 0, redondea negativos a 0 y nulla xg/xa/xg_conceded cuando faltan.
  • Tablas: performance_matches (partidos), tactical_uploads (uploads PDF con axes JSONB y raw_stats), competitions, rival_teams.
  • Sin RPCs propias — todo cómputo de ejes ocurre en TS al momento de importar.
  • Scouting consume el mismo parser (parseRivalPdfAction llama a parseTextAction(text, []) sin filtro de plantel).
  • Plantel aporta players.full_name para fuzzy match en el prompt y el linkeo de tactical_uploads.player_id.
  • Calendario aporta calendar_events con event_type=match para cruzar fechas (planificado, no obligatorio).
  • Anthropic — único módulo que usa IA además de Risk Advisor y predicción de carga (esta última no es IA).
  • OCR no implementado: PDFs escaneados sin texto no se procesan.
  • No hay export Excelexcel_export está prometido en pro / enterprise pero no existe en este módulo ni en ningún otro (PROJECT_STATE.md, gap comercial).
  • Comparativa multi-partido: hoy solo se ve promedio de ejes. No hay tab que compare jugador contra plantel o jugador entre dos partidos específicos. Roadmap.
  • Otros proveedores de informes (StatsBomb, Opta, InStat): el prompt está optimizado a Wyscout/SIX. Otros formatos pueden funcionar parcialmente pero no están validados.