MVP DATA CONTRACT RC1 · v0.8.15.4.2
El HTML y sus fuentes
El frontend consume la API de producto del handoff, que consulta SQLite en modo de solo lectura. No consulta FCF durante el render ni modifica el modelo del backend. Las rutas están verificadas en src/lib/routes.ts y en el handler Python del paquete.
Correspondencia de bloques y rutas
| Bloque | Ruta exacta RC1 · GET | Campos utilizados |
|---|---|---|
| Próximo partido y rival | /api/v1/scouting/next?team_key={team_key}&last_n=5 | current_team, next_match.fixture, opponent.summary |
| Clasificación y evolución | Incluidas en scouting/next; también /api/v1/teams/{team_key}/standings | opponent.league · RC1 devuelve not_available. No se reconstruye. |
| Insights / jugador a vigilar | Incluidos en scouting/next | insights, featured_player · RC1 devuelve not_available. Los ejemplos solo existen en modo demo. |
| Últimos partidos del rival por contexto | Incluidos en scouting/next | recent_matches.by_context · Se muestra un contexto cada vez: competición, amistosos/pretemporada, fuera del grupo u otro contexto. Si no hay resultados de competición, se abre el contexto con partidos disponibles. Las métricas y las tarjetas corresponden a la selección. |
| Cuándo marca / encaja | Incluido en scouting/next; también /api/v1/teams/{team_key}/goal-timing | goal_timing.last5_by_context.by_context.{contexto_seleccionado} · rows, coverage, acta_ids, temporal_contract |
| Plantilla del rival | Incluida en scouting/next; también /api/v1/teams/{team_key}/roster | current_roster.players · Apariciones, titularidades y goles observados del corpus. |
| Calendario de un equipo | /api/v1/teams/{team_key}/schedule/api/v1/teams/{team_key}/matches | Fixtures oficiales + resultados observados. Unión por acta_id, preservando partidos adicionales y contexto. |
| Detalle de partido | /api/v1/matches/{acta_id}?team_key={perspective_team_key} | match, appearances, goals, team_perspective, quality |
| Detalle de jugador | /api/v1/players/{player_id} | current_contexts, historical_contexts, availability · Histórico sin sumar contextos. |
| Partidos relacionados de un jugador | /api/v1/teams/{context_team_key}/matches + detalle de cada acta | Solo se incluye participación explícita en appearances con jugador y evidence_team_pk exactos. No se usa el índice histórico como aparición. |
Mi equipo y navegación por entidades
La navegación global contiene Próximo partido, Mi equipo y Liga. Mi equipo se elige de forma explícita y se conserva mediante un adaptador de preferencias del navegador. La primera visita pide esta elección. Las estrellas de Liga → Equipos guardan accesos adicionales; abrir una ficha no cambia Mi equipo.
Cada ficha identifica su equipo en la URL y ofrece Resumen, Calendario, Partidos, Plantilla y Goal Timing. Liga tiene su propio grupo y ofrece Resumen, Clasificación, Jornadas y Equipos. Jornadas compone y deduplica los calendarios oficiales de los participantes por acta_id; los partidos fuera de esos calendarios permanecen en su contexto de equipo. La clasificación continúa no disponible.
Conexión de producción
El servicio web sirve estos HTML y delega las cinco rutas de consulta utilizadas por la aplicación a la API privada. config.json usa mode: "live" y baseUrl: ".". La dirección del backend se configura únicamente en el servidor mediante FCF_API_BASE_URL.
Para conectar otra instancia del mismo backend, configura mode: "live" y baseUrl en config.json. No introduzcas secretos en archivos del navegador. Una página servida por HTTPS necesita una API accesible por HTTPS o un proxy en el mismo origen; una API local HTTP no se conecta automáticamente desde la versión publicada.
Reglas que conserva la interfaz
- El marcador se presenta siempre LOCAL–VISITANTE. Victoria, empate y derrota se calculan por separado desde la perspectiva del equipo analizado.
nully ausencia de observación no se convierten en cero. Un cero explícito permanece cero.- El calendario oficial del grupo define la selección de Liga en las fichas de equipo. Los partidos observados adicionales conservan su contexto. En la Home,
competitionse presenta como “Competición”;preseason_additionalcomo “Amistoso”. No se reclasifican partidos por fecha o nombre.non_group, conflictos y unresolved se conservan. - Goal Tracking v0.8.16 calcula los porcentajes sobre el marcador oficial de los partidos del mismo contexto y ventana. En partidos de cuatro cuartos, los minutos posteriores a la duración nominal se incluyen en Q4. Los goles sin detalle suficiente conservan un residual explícito.
- La ausencia de una serie completa se muestra como “No disponible”. La cobertura explícita de cero goles permite mostrar cero.
- Un partido programado sin acta canónica solo muestra lo disponible en el calendario: no se inventan resultado, alineación ni goles.
- Las horas sin zona del RC1 se interpretan como hora local de Europe/Madrid; se respetan los cambios de horario.
- No se presentan
fcf_sanciones_rawcomo tarjetas o sanciones disciplinarias. - Los agregados de la plantilla son los entregados por RC1 para su corpus; no se atribuyen a últimos cinco partidos ni se fuerzan a coincidir con el total del equipo.
- La API no expone descansos/byes en las rutas usadas. No se crean partidos de descanso artificiales.
Alcance de la copia publicada
Se conserva también la copia de entrega con respuestas de los 15 equipos, 176 actas y 2.041 fichas de jugadores referenciados por las actas o la plantilla. El modo de producción consulta la API y no cambia automáticamente a esa copia si falla una petición. Los payloads de goles se generan con el servicio v0.8.16 sobre la base RC1 sin modificar; api.js crea un modelo de presentación sin alterar datos de origen. Índice de fuentes y huella de SQLite.
Referencias FCF de ingestión
Estas rutas pertenecen a los extractores, no a las peticiones del HTML. Referencia: 02_FCF_DATA_SOURCES.md del freeze v0.7.99.
| Fuente | Ruta FCF observada |
|---|---|
| Acta pública | /ca/competicio/acta/{CODACTA} |
| Equipo | /api/clubs/{club_id}/team/{category_id} |
| Histórico de jugador | /api/competition/jugador-detail?jugadorId={player_id}&codgrupo={group_id}&temporada={season} |
| Competiciones | /api/competition/competicions?disciplinaId={id}&temporada={season} |
| Grupos | /api/competition/grupos?competicioId={competition_id} |
| Sanciones | /api/competition/sanciones?grupId={group_id}&temporada={season} · Semántica separada del contador bruto de jugador. |