StackFire colabora con laboratorios de investigación: equipos que trabajan con datos clínicos y genómicos, donde el software tiene poco margen para la improvisación. Este artículo cuenta uno de esos trabajos.
Participamos en el Track 1 de Rare Disease, Real Kid: MVA Hackathon 2026, organizado por Sage Bionetworks, y nuestra propuesta obtuvo la puntuación más alta del track. Pero lo que vale la pena contar no es el marcador: es cómo se llegó al resultado y, sobre todo, qué quedó sin demostrar.
El nombre del reto no es decorativo. Detrás de los datos hay un niño real con aneuploidía variegada en mosaico (MVA), un trastorno raro de la segregación cromosómica que combina predisposición a cáncer infantil con restricción severa del crecimiento. La pregunta del Track 1 era concreta: dado el genoma del paciente, ¿cuáles son las variantes que explican su enfermedad?
El resultado
Nuestra hipótesis mejor clasificada es un par heterocigoto compuesto en BUB1B, el gen que codifica BubR1, pieza central del punto de control del huso mitótico:
c.2210T>G→ p.Leu737Ter: un alelo truncante ya descrito como patogénico y asociado en ClinVar a síndrome MVA tipo 1.c.3006T>G→ p.Asn1002Lys: un alelo missense ultra-raro, observado una sola vez entre ~1.46 millones de alelos de gnomAD v4.1, sin homocigotos, y situado dentro del dominio catalítico de la cinasa BubR1.
Un alelo que rompe la proteína y otro que la altera en su dominio funcional: un modelo biológicamente coherente con la literatura previa de BUB1B y MVA.
Qué ocurre dentro de la célula
BubR1 es parte del freno que impide que una célula se divida antes de que todos los cromosomas estén bien sujetos. Con ese freno debilitado, la división ocurre igual: un cromosoma se queda atrás y las células hijas heredan un número distinto. Repetido a lo largo del desarrollo, eso produce un cuerpo en mosaico, con poblaciones celulares de dotación cromosómica distinta.
Lo que también dijimos: los límites
El VCF entregado no contenía información de fase, y no había datos de segregación parental. Eso significa que no pudimos demostrar de forma independiente que ambos alelos están en trans, es decir, uno heredado de cada progenitor. Lo dejamos escrito como limitación abierta en el reporte, junto con la vía de validación que la resolvería.
Decirlo no debilitó la propuesta. La sostiene. Un resultado genómico que no declara lo que no probó no es un resultado, es una afirmación.
Cómo se llegó ahí
El callset tenía más de cinco millones de variantes. El trabajo fue reducirlo con criterio y no con fuerza bruta: partir del mecanismo de la enfermedad para priorizar el gen, extraer y controlar la calidad del locus, mapear al transcrito MANE de referencia, y exigir que cada candidato sobreviviera a evidencia convergente — consecuencia sobre el transcrito, bases de datos clínicas, frecuencia poblacional y dominio proteico.
De siete variantes heterocigotas con PASS en el locus, dos eran exónicas. Esas dos son la respuesta.
Los comandos
Todo el flujo vive en un Makefile, y cada objetivo corre dentro del contenedor.
No hay pasos manuales que recordar ni notas sueltas: quien clone el repositorio ejecuta lo
mismo que ejecutamos nosotros.
make build # construye la imagen: Ubuntu 24.04 ARM64 + bcftools, samtools, bedtools
make check # verifica que cada herramienta responda antes de tocar datos
make qc # control de calidad del VCF completo
make bub1b # extracción dirigida del locus
make bub1b-phase # revisión de fase de los candidatos
1. Control de calidad: qué hay realmente en el archivo
Antes de buscar nada, saber qué se recibió. Las cifras salen de contar, no de confiar:
bcftools stats "${VCF}" > /results/qc/bcftools_stats.txt
bcftools view -H "${VCF}" | wc -l # total
bcftools view -H -f PASS "${VCF}" | wc -l # pasan el filtro
bcftools view -H -f PASS -i 'GT="het"' "${VCF}" | wc -l # PASS y heterocigotas
Total variants: 5012204
PASS variants: 4740790
Heterozygous calls: 3113937
PASS heterozygous: 2913813
2. Extracción dirigida del locus
BUB1B ocupa chr15:40161069-40221123 en GRCh38. Tres filtros encadenados, cada uno
indexado, y una tabla final que conserva genotipo, profundidad de lectura y calidad — los datos
que permiten decidir si un candidato es real o ruido del secuenciador:
bcftools view -r 15:40161069-40221123 -Oz -o bub1b.all.vcf.gz "${VCF}"
bcftools index -f bub1b.all.vcf.gz
bcftools view -f PASS -Oz -o bub1b.pass.vcf.gz bub1b.all.vcf.gz
bcftools view -i 'GT="het"' -Oz -o bub1b.pass.het.vcf.gz bub1b.pass.vcf.gz
bcftools query \
-f '%CHROM\t%POS\t%ID\t%REF\t%ALT\t%QUAL\t%FILTER[\t%GT\t%AD\t%DP\t%GQ]\n' \
bub1b.pass.het.vcf.gz > bub1b.pass.het.tsv
All region variants: 14
PASS variants: 13
PASS heterozygous variants: 7
Catorce variantes. Siete candidatas. Dos exónicas. Ahí termina el filtrado automático y empieza la interpretación.
3. Anotación funcional
VEP corre sin red, contra una caché local, con las banderas que producen exactamente la evidencia que el reporte cita — consecuencia sobre el transcrito MANE, predicciones SIFT y PolyPhen, y frecuencias poblacionales:
vep --cache --offline --dir_cache /vep_data \
--species homo_sapiens --assembly GRCh38 \
--symbol --canonical --mane --biotype --numbers \
--sift b --polyphen b \
--af --af_gnomade --af_gnomadg --max_af \
--clin_sig --fork 8 --no_stats
--offline no es una optimización: es la garantía de que ninguna coordenada del
paciente sale de la máquina para resolverse contra un servicio externo.
4. La auditoría antes de publicar
El último comando del flujo no analiza nada. Revisa que el repositorio no contenga aquello que nunca debió entrar:
bash scripts/prepublish_audit.sh
Revisar a mano no es un control. Un script que falla es un control.
Privacidad por diseño, no como trámite
Todo el análisis corrió localmente, en un contenedor reproducible. El repositorio público contiene el método completo —Dockerfile, scripts, pipeline, documentación— y ningún dato genómico del paciente: ni VCF crudos, ni tablas derivadas a escala de genotipo, ni referencias descargadas. Hay incluso un script de auditoría que se corre antes de hacer público el repositorio, porque revisar a mano no es un control.
Cualquiera puede reproducir el método. Nadie obtiene los datos del niño. Esa separación era un requisito del reto, y también es exactamente como creemos que debe construirse software sobre datos clínicos.
Qué tiene que ver esto con nuestro trabajo
Colaborar con un laboratorio de investigación casi siempre plantea el mismo conjunto de exigencias: datos sensibles que no pueden circular, resultados de los que alguien va a depender, y la obligación de poder rastrear cómo se llegó a cada conclusión. La trazabilidad, el manejo de datos y las integraciones que no se caen no son requisitos que se añaden al final; son el trabajo.
Ese es el músculo que llevamos al hackathon. No improvisamos una incursión en genómica: es la misma disciplina que ejercemos a diario, aplicada a un problema más duro y con reloj.
Si trabajas en un laboratorio de investigación y esto te suena —análisis que tiene que ser reproducible meses después, datos que no pueden salir de casa, resultados que hay que poder defender ante quien los revise— es exactamente la conversación que nos interesa tener.
Gracias a Sage Bionetworks por organizarlo y por sostener el estándar de manejo de datos que el reto exigía.
Nota. Este trabajo es una hipótesis de investigación presentada a un hackathon y no es un informe diagnóstico clínico. La interpretación de variantes y la confirmación de fase heterocigota compuesta requieren validación clínica apropiada antes de cualquier uso médico. El método está disponible en github.com/ivillafuerte/mva-hackathon-2026.
