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.
Para comercial
Sección titulada «Para comercial»- 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,proyenterprise. 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.
Cómo lo usa el staff
Sección titulada «Cómo lo usa el staff»Acceso y permisos
Sección titulada «Acceso y permisos»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.
Flujos paso a paso
Sección titulada «Flujos paso a paso»Tabs del módulo:
- Partidos — listado de partidos cargados con score, rival, competición y links a vista detallada.
- Jugador — perfil radar individual con promedio de ejes
(
axes) sobre todos los partidos importados. - Importar — carga de PDFs de Wyscout / SIX. El archivo se
convierte a texto vía
pdfjs-disty se manda al parser. - 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:
- Arrastrar PDF al importador.
- El cliente extrae texto (sin enviar el binario al server).
parseTextAction(pdfText, squadNames)manda el texto a Claude Haiku con un prompt específico para Wyscout/SIX, restringido a los nombres del plantel propio.- La respuesta JSON pasa por
sanitizeMatchy devuelve un objetoExtractedMatchconplayers[]validados (minutes > 0, números redondeados,xg/xanullable). - El staff revisa la grilla y confirma — los stats se persisten en
tactical_uploadsconaxesnormalizados (toAxes).
Flujo secundario — partido manual: en Gestión se puede crear un
performance_match sin PDF (solo metadata: fecha, rival, score).
Configuración relacionada
Sección titulada «Configuración relacionada»- Catálogo de competiciones (
competitions): nombre, tipo (liga / copa / internacional / amistoso), temporada, país. Soft-delete conactive = false. - Catálogo de rivales (
rival_teams): nombre + país, compartidos con Scouting. ANTHROPIC_API_KEYen Workers Secrets — sin esta key el importador devuelve “ANTHROPIC_API_KEY no configurada”.
FAQ / casos límite
Sección titulada «FAQ / casos límite»- “El PDF no extrae texto” —
pdfjs-distno 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
squadNamespara 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%yoffensive_duels ≈ 40%del total. Documentado y auditable.
Cómo lo ve el jugador
Sección titulada «Cómo lo ve el jugador»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.
Datos y métricas
Sección titulada «Datos y métricas»Fórmulas y cálculos
Sección titulada «Fórmulas y cálculos»- 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_PROMPTpara auditoría.
Importadores y fuentes
Sección titulada «Importadores y fuentes»- 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:
sanitizeMatchdescarta cualquier jugador conminutes ≤ 0, redondea negativos a 0 y nullaxg/xa/xg_concededcuando faltan.
Tablas DB / RPCs / vistas materializadas
Sección titulada «Tablas DB / RPCs / vistas materializadas»- Tablas:
performance_matches(partidos),tactical_uploads(uploads PDF conaxesJSONB yraw_stats),competitions,rival_teams. - Sin RPCs propias — todo cómputo de ejes ocurre en TS al momento de importar.
Integraciones
Sección titulada «Integraciones»- Scouting consume el mismo parser (
parseRivalPdfActionllama aparseTextAction(text, [])sin filtro de plantel). - Plantel aporta
players.full_namepara fuzzy match en el prompt y el linkeo detactical_uploads.player_id. - Calendario aporta
calendar_eventsconevent_type=matchpara 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).
Limitaciones / roadmap
Sección titulada «Limitaciones / roadmap»- OCR no implementado: PDFs escaneados sin texto no se procesan.
- No hay export Excel —
excel_exportestá prometido enpro/enterprisepero 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.