A genome as a ranking problem
Part one of a series on the 2026 MVA hackathon: what the disease is, the biology you need to read a VCF, and what the task asks for.
I don’t work in biology. I build AI and ML platforms: feature pipelines, training and evaluation loops, and the unglamorous machinery between a notebook and something running in production. My fluency is in mathematics, data, and abstractions, and in asking of every result: what would make this number wrong?
In August 2026 Sage Bionetworks and the MVA Society opened a hackathon built on the real whole-genome sequence and clinical history of one child living with Mosaic Variegated Aneuploidy (MVA). The family consented to sharing it with the research community. There is no established treatment for MVA; care today means managing symptoms and watching for cancer. The challenge asks participants to identify the genetic changes responsible for the condition and, in a second track, to propose approved drugs worth investigating against those changes.
I entered because of one half of that task. I will never be the person who reads mechanism off a karyotype. But I do know how to take five million unlabeled candidates, decide what a good ordering of them looks like, and build the pipeline that produces one. That is the job, and it’s the one I have.
This post is the first in a series that runs from the biology I half-remember from school to whatever I submit on 24 October, and it is written for data scientists and ML engineers with no bioinformatics background. The most interesting thing I’ve found so far is this: the problem is a ranking problem.
Four constraints before anything else:
- I only write about what the organisers already published. No phenotype details, no variants I find, no genotype-level output in a public post. When the leaderboard freezes in October I’ll be more specific.
- The data is controlled. It sits under IRB #20252010 and a data-use agreement. No re-identification attempts, not even as an idle thought experiment.
- Outputs are CC BY 4.0, and the hackathon is explicitly not medical advice or diagnosis. Neither is this post.
- My repository stays private until the hackathon closes, as required; it’s also why there are no code links in this post.
The biology you need
Before the task makes sense you need the biology that produces those five million rows: not to do it, but to know what each row means. My baseline was school biology (central dogma, mitosis, a karyotype diagram), long decayed into recognising the words. Here is the part I needed, in the order the problem needed it.
A genome is roughly 3.1 billion positions, each one of A, C, G, or T. Sequencers do not read a genome in one pass; they read 150-base fragments called reads, and the full picture is assembled computationally. You carry two copies of every chromosome, one per parent, so a position is a pair of characters, not a single letter.
Everything downstream is expressed as coordinates against a reference genome: a canonical string that serves as the address space (currently GRCh38). Treat it like a schema version. If your reference version and your annotation version disagree, or one file says chr1 where another says 1, joins fail silently. Nothing errors. Your results are just wrong.
Most of the genome is archive; the working parts are genes, stretches of DNA that code for something, with regulatory regions around them. A gene is read in two steps. Transcription copies the gene from DNA to messenger RNA (mRNA), the same alphabet with T swapped for U. Translation then reads the mRNA three bases at a time; each triplet, a codon, specifies one of twenty amino acids, and the chain folds into a protein that does the work.
Two consequences come up constantly. First, context: the same three letters mean different things depending on the gene they sit in, so annotation always joins against a gene model, never against the raw string. Second, the cell cuts introns out of the mRNA between transcription and translation and sews the protein-coding exons together; changes that break those cut points are their own class of catastrophe.
A variant is a difference from the reference, and most are harmless: they sit between genes, change a base without changing the amino acid, or are simply common in healthy populations. The ones medicine cares about do one of a small set of things to a protein:
The word you see everywhere is consequence: a derived label, a feature rather than raw data, computed from the base change and the gene model. Two more terms follow from carrying two copies. A change on both copies is 1/1, homozygous; a change on one is 0/1, heterozygous. Some recessive conditions need two different damaged variants, one per copy: compound heterozygous. That case gets special treatment in the scoring rules below.
What MVA is
With that grounding, MVA is where the assumption that a genome is a fixed pair of strings stops holding. The failure is not at the level of one base pair but at the level of whole chromosomes, and it does not affect every cell.
The count first. A healthy human karyotype holds 46 chromosomes in 23 pairs. Aneuploidy is a wrong count; the familiar case is trisomy 21 (47 chromosomes instead of 46). MVA is aneuploidy with two modifiers. It is mosaic because only some cells carry the wrong count, and variegated because the wrong count is not the same everywhere: two cells can be missing different chromosomes.
The count is a distribution, not a number. That is what the name says: mosaic variegated aneuploidy, aneuploidy scattered across the body in patterns that vary.
The cause is a weakened spindle assembly checkpoint, the machinery inside mitosis that holds a dividing cell still until every chromosome is properly attached before the copies are pulled apart. BUB1B was the first gene tied to MVA; CEP57, TRIP13, BUB3 and others followed. Lose both working copies of one of these and cells begin to mis-segregate chromosomes. Which one, in which cell, on which division: that is where the variegation comes from.
The published picture of the condition is growth delay, developmental differences, and a predisposition to cancer. There is no established treatment; care means managing symptoms and surveillance.
The number of known cases matters here: fewer than 50 worldwide. No cohort to learn from, no training set, no benchmark. Everything downstream runs on priors, published knowledge, and one genome.
What the task asks
So the question the hackathon puts is direct: given 5,012,204 variants and a clinical description, rank the variant or variants that cause this child’s disease. There are two tracks, and I’m spending this series on Track 1.
Track 1 asks for a ranked list of variants with confidence scores, a methods write-up, and a repository. Six submissions, a live leaderboard, and a held-out answer confirmed clinically by the organisers. Two metrics matter.
Rank Points is a step function of rank:
- 100 points if your top-ranked variant is the true cause.
- Partial credit if the true variant sits anywhere in your top 10.
- Half credit if the cause is a compound heterozygous pair and you correctly identify one of the two.
The last clause is the case from the biology section: the answer is a set of two rows, and getting one of them right is worth half.
F-max is the best F1 score achievable at any confidence threshold applied to your scores. It is not an ordering metric. The numbers you attach to your variants have to work as a decision threshold across the whole list; confidence scores that are just sorted ranks wearing a probability costume are penalised.
Incidental and secondary findings are explicitly welcome and do not hurt the automated score.
Track 2 asks you to characterise the mechanism and propose already approved drugs as follow-up hypotheses, judged by an expert panel on rigour, impact, innovation, and scalability, with one submission and a three-minute video. I may write about that track later in the series.
Consider the far end of that axis. If your ranking puts the true variant at position 11, you have correctly outranked 5,012,193 other candidates (99.9998% of everything you were given), and you score zero. Not poorly. Zero. The same as submitting nothing.
A model that is good in the sense you’re used to, with decent average precision across five million rows and a well-behaved PR-AUC, can still score zero here. The metric only reads the first ten rows of your list.
The data you get
Three kinds of input come with Track 1: the raw reads (FASTQ), the called variant set (VCF), and the phenotype. In the order you meet them:
FASTQ is the sequencer output: for each read, the base string plus a per-base quality value. Quality is in Phred units, where Q30 means a 1-in-1000 chance that base is wrong; it is a log confidence score attached to every character. The format behaves like an unstructured event stream, billions of rows. In this dataset it is eight gzipped files (four lanes, two mates), tens of gigabytes each. This is the raw-data half of the task.
VCF (Variant Call Format) is the other half: a table of differences from the reference. This dataset ships one with 5,012,204 rows. One row looks conceptually like:
chr1 13273 G C 98.2 PASS ... GT:AD:DP 0/1:...
CHROM, POS, REF, ALT means “at chromosome 1, position 13273, the reference has G and this genome has C”. The genotype field tells you the two copies: 0/1 is heterozygous, 1/1 homozygous for the alternate. As a DS analogy it is a diff against a canonical record, or an anomaly table. Anomaly is the wrong word, and that is the problem in one line: five million differences from the reference is normal. Every genome has millions of them; almost all are meaningless. The VCF carries its own quality metadata (QUAL, FILTER, and INFO fields like QD and MQ), the diagnostics of the caller that produced it.
Note what the dataset hands you: the raw reads and a precomputed call set. You receive a feature table and the raw events behind it, and you have to decide whether to trust the precomputed one. That decision is familiar.
The third artifact is the phenotype. Alongside the genome is a clinical description of the child, mapped by the organisers into HPO, the Human Phenotype Ontology: a controlled vocabulary of clinical findings, each with an ID. I am not going to list this child’s terms in public, but the shape matters: instead of free text you get standardised tags. That is what turns “could this variant plausibly explain this presentation?” into a join rather than a vibe, and it is the closest thing to supervision you get.
The dataset itself is about 85 GB compressed, and the guidance is to budget 100–150 GB for caches and intermediates. My working directory is at 158 GB: reads, the reference, the call set, and a 20 GB annotation cache. This is not a laptop project. Post three is partly about the engineering that fact forces on you.
What comes next
Four more posts, roughly in this order, published as the work reaches each stage rather than on a schedule:
- Post 2: the standard pipeline for this problem (QC, align, call, annotate, prioritize), told as a data pipeline, with the DS analogues where they are exact and where they are only suggestive.
- Post 3: the same pipeline as a DAG: the engineering, the caching, the failure modes, and what the platform work I do for a living turns out to be worth here.
- Post 4: the design space for the ranker and how I’m choosing within it: what I optimised for, and what I deliberately gave up.
- Post 5: after 24 October, when the leaderboard freezes and the repository goes public: what I submitted, what happened, and what I would do differently.
If you are a data scientist and you read this thinking you couldn’t do that, the next four posts are the argument that you could. You already have the ranking, calibration, and pipeline skills; the remaining work is reading.
If you want the material that made this legible to me before post two arrives: learngenomics.dev is the place to start, and the hackathon space has the official rules, which beat my summary of them every time.