Autor

Resultados electorales ONPE 2026 — explorador interactivo de datos públicos

OZ

Oscar Zamora

Ingeniero de software · Exploración de datos con IA + Copilot

⏱️ Primera iteración funcional: ~2 horas

Este explorador nació como un experimento práctico: tomar datos electorales públicos de ONPE, construir una base de datos relacional sobre ellos, y crear vistas interactivas desde cero — usando VS Code, GitHub Copilot (modo agente) y Copilot CLI como herramientas principales. El resultado inicial tardó aproximadamente 2 horas en pasar de datos crudos a una aplicación funcional con filtros, rankings y drill-down geográfico.

"Lo que antes requería días de configuración manual, Copilot CLI lo convirtió en una sesión de iteración rápida: leer datos, construir vistas, optimizar queries, todo en conversación continua."

🗳️ La motivación: datos contra la duda

Este proyecto se enfoca en la primera vuelta presidencial 2026, con la meta de hacer verificables los resultados oficiales mesa por mesa, acta por acta y territorio por territorio. En un contexto donde la conversación pública suele acelerarse más rápido que la evidencia, poner los datos al alcance de todos reduce el ruido y fortalece la confianza.

"El fraude no se puede esconder en 88,000 mesas de votación repartidas en todo el país — y en el exterior. La transparencia está en los datos."

La idea original del scraper oscarzamora/onpeescraper nació precisamente de esa inquietud: si los datos de ONPE son públicos, ¿por qué no construir una herramienta que permita a cualquier ciudadano — incluso a los más suspicaces — explorarlos, filtrarlos y verificarlos por sí mismos?

Además, este enfoque se extiende con el contexto de 2021 como punto de comparación: en ese proceso también circularon narrativas de fraude sin sustento estadístico, mientras que los datos publicados por ONPE se mantuvieron consistentes y reproducibles. Integrar 2021 permite contrastar patrones, niveles de participación y distribución del voto con una base trazable y transparente.

Este explorador lleva esa idea un paso más allá: no solo extrae los datos, sino que los organiza con drill-down geográfico (continente → país → departamento → provincia), rankings de candidatos, filtros por estado de acta y exportación CSV para que cualquiera pueda hacer su propio análisis. La mejor respuesta a la desconfianza es la accesibilidad de los hechos.

🎯 Lo que este proyecto demuestra

  1. Construir sobre una solución existente

    El punto de partida fue oscarzamora/onpeescraper, un scraper PHP que extrae los resultados de ONPE en tiempo real. En lugar de reinventar la recolección de datos, este proyecto toma esa base y construye encima: importa los archivos SQL generados, los carga en MySQL y los expone a través de una capa de repositorios y vistas web.
    ReutilizaciónPHPMySQL

  2. VS Code: de cero a producción

    Usando VS Code se definió la arquitectura desde cero: esquema de base de datos, autoloader PSR-4, capa de repositorios, vistas PHP y CSS con variables. Copilot sirvió como co-piloto para acelerar decisiones de plataforma (¿PHP puro o framework?), hosting (servidor estático + MySQL), y estructura de carpetas. Cada decisión quedó documentada en el historial de chat y como código ejecutable.
    VS CodeArquitecturaPSR-4

  3. Agent mode para iterar ideas en diseño

    Copilot en modo agente permitió explorar múltiples ideas de diseño de forma interactiva: "¿cómo mostramos el ranking?", "¿qué pasa si agregamos filtros en cascada?", "¿cómo hacemos drill-down geográfico sin recargar la página?". Cada idea se convirtió en un prototipo en minutos. El modo agente también identificó el problema de collation en los JOINs entre tablas antes de que se convirtiera en un bug en producción.
    Agent modeDiseño iterativoPrototipado

  4. Copilot CLI: iteración de construcción hasta el gol

    Copilot CLI fue la herramienta clave para llevar el proyecto de "funciona" a "funciona rápido y bien". A través de conversación iterativa en terminal, se identificaron las 11 oportunidades de optimización de base de datos, se diseñaron las Materialized Views, se planificaron los índices compuestos, se encontró el bug de collation silencioso y se crearon las vistas B para pruebas A/B — todo sin salir del terminal. El CLI también recomendó paginar resultados grandes y crear este panel de "Sobre" para documentar el proceso.
    Copilot CLIOptimización DBA/B testingMV

📈 Impacto medido: optimizaciones de base de datos

Copilot CLI analizó las queries lentas y recomendó crear Materialized Views para pre-calcular los agregados más costosos. Los resultados:

Ranking Nacional
3,800 ms
< 5 ms
SUM sobre 3.8M filas → mv_candidate_totals
Reportes por Distrito
62,000 ms
300 ms
79K filas + COLLATE fix → mv_votes_by_dist
Resumen Geográfico
lento
< 10 ms
GROUP BY + JOIN → mv_geo_summary (2,102 filas)
Total interior
3,900 ms
< 5 ms
Filtro código mesa → mv_votes_interior_totals

Las MVs son tablas pre-calculadas que el sistema actualiza después de cada importación de datos. El código PHP detecta automáticamente si la MV está disponible y cae al query lento como fallback.

🔧 Stack técnico

📂 Fuente de datos

Los datos provienen de la web oficial de la ONPE (Oficina Nacional de Procesos Electorales) del Perú, extraídos con el scraper open-source oscarzamora/onpeescraper. Esta aplicación no está afiliada ni patrocinada por ONPE. Los datos son de dominio público conforme a la legislación peruana de transparencia.

🔒 Auditoría de seguridad — Proyecto cerrado

Una vez finalizada la importación de datos y antes del cierre definitivo del proyecto, se realizó una auditoría de seguridad completa sobre el código fuente para garantizar que ningún agente externo pueda modificar los datos electorales. A continuación se documenta lo encontrado, lo corregido y las protecciones vigentes.

⚠️ Vulnerabilidades encontradas y corregidas

✅ Protecciones vigentes al cierre

Endpoints de escritura
Cero
Ningún PHP acepta POST/PUT/DELETE. Solo GET de lectura.
SQL Injection
Imposible
100% PDO prepared statements. Inputs validados con regex whitelist.
XSS
Mitigado
Todo output HTML usa htmlspecialchars(ENT_QUOTES).
Archivos sensibles
Bloqueados
.env, src/, config/, database/ denegados por .htaccess.
Ejecución dinámica
Ninguna
Sin eval, exec, shell_exec, base64_decode ni includes dinámicos.
API actions
Whitelist cerrada
match() con acciones fijas. Cualquier acción desconocida retorna error 400.

La auditoría fue realizada el 22 de mayo de 2026 usando GitHub Copilot CLI en modo seguridad + revisión manual del código fuente completo. El repositorio público es read-only en producción: los datos se importaron una única vez desde el scraper y la base de datos no tiene ningún endpoint de modificación activo.