Case study · connectome simulation · measurement
A whole MaleCNS v1.0 connectome — 166,700 neurons, 25.6 million synapses — spiking on a GPU, with a live crypto account on the end of it. This is not a story about profit. It is a story about finding out which part was broken, and the year it took to stop measuring the wrong thing.
01 · The animal
The graph is reconstructed and kept whole — no pruning, no rewiring, no edge added or re-signed. Every experiment below changes parameters the model already declared, never the wiring. A worker asserts the graph byte-identical after each genome it evaluates; a leak would look exactly like evolution working.
Two thirds of the animal is visual, and the chart it was fed turned out to have no operating point at all — across the whole range of inhibitory scaling the image drives either a third of the mushroom body or exactly two cells of it, never anything between. What looked like sensory input was saturation. The olfactory channel exists because of that measurement.
02 · The loop
Nine descriptors of public Binance prices are placed on glomeruli as a population code. They reach the mushroom body in two synapses. A fixed readout turns spikes into a proposal, and a risk guard can reject it but never replace it.
03 · The search
Eighty-four genomes, fourteen declared parameters, a held-out segment scored every generation. The training curve rose 44%. The held-out curve did not move.
trained on held out — the same champion, unseen segment
Generations 1–3, 5–6 and 7–9 repeat a champion and its score repeats to the last digit — the kernel is deterministic, so that is what a working elite looks like. The gap between the two lines is the entire finding: the search was fitting the training segment, and the instrument said so from the second generation instead of after the run.
04 · The control
Ten generations finding nothing has two explanations that want opposite repairs — the fly cannot carry a signal, or it was never given one. Nothing measured so far could separate them. So the forward return was written straight into the olfactory channels, and the same run read at every stage.
signal injected real market, no injection
The signal crosses the antennal lobe and the mushroom body intact and is discarded in the last step. The wider population is read by the shipped rule exactly — mean rate right minus mean rate left, no fitting, no optimiser — so this is what a population the fly already has delivers. Against shuffled returns the same fit reads −0.03, and against returns rolled 37 bars, −0.004.
Turning the signal all the way up — every channel, all 53 glomeruli — moves the shipped decoder by nothing. The bottleneck is not how loudly the market is presented. It is the last two cells.
05 · Why it was missed
The decision is the difference between two firing rates, compared against a threshold declared over 0.5–12 Hz. That difference carries a constant, and the constant is different for every genome — and about three times larger than the entire searched range.
The search moved that constant 26 Hz and never touched the variation. It was selecting the sign of an offset, not market timing — and the one genome sitting near zero, the only one making genuine three-way decisions, ranked last of the survivors. The wild type could not propose BUY at any threshold in the declared range.
06 · The wall
Separately from the fly: what coefficient does a trade need just to cover its own costs? Below, the break-even against what the market descriptors actually carry.
Coinbase · 130 bp round trip Binance · 20 bp
A coefficient of 1.0 is perfect foresight. Hourly trading at the original venue needed 1.08 just to break even — more than perfect foresight, so no brain could have won and the objective was unreachable before anything about the fly mattered. Moving venue drops the bar sixfold. The measured signal, 0.03, still clears only the bottom row.
| whole-bar descriptor | 1 bar | 3 | 6 | 11 | 24 |
|---|---|---|---|---|---|
| taker order flow | −0.023 | −0.034 | −0.019 | −0.010 | −0.014 |
| flow, fast window | −0.017 | −0.014 | −0.001 | +0.005 | −0.009 |
| where the bar closed | −0.041 | −0.041 | −0.021 | −0.015 | −0.012 |
| volume | +0.001 | +0.003 | +0.010 | +0.022 | +0.009 |
| trade size | −0.001 | +0.011 | +0.016 | +0.019 | +0.008 |
| bar range | +0.015 | +0.006 | +0.005 | +0.016 | +0.009 |
10,446 hourly bars. Order flow and the bar's closing position hold the same sign across both timeframes and both segments — real short-horizon reversion, around −0.03 one bar out and gone by six. It is the only effect any descriptor in the project has shown, and it is roughly six times too small to pay for the trade that would capture it.
07 · What it comes to
0.97 in, 0.60 out at the descending population. The tract works end to end. "Connectome simulations cannot learn" is not what any of this measured.
Two cells against 1,304 under the identical rule — tenfold, and flat across every dose. The defect sat at the last step while a year of repairs went upstream.
Without the injection every stage reads zero: input 0.03, Kenyon 0.02, every readout under 0.06. That is the measured cause of ten generations without a result.
An earlier pass read the Kenyon population at −0.21 to −0.27 on real market data, with clean controls, at every penalty, with the same sign on both segments. That is the architecture's own promise — a random nonlinear expansion making separable what a linear reader of the raw descriptors cannot — and it would have been the first real signal in the project.
At twice the sample it reads +0.02 to +0.04. It was noise. Nothing distinguished it from a real finding except running it again with more data, and it is written up for exactly that reason: consistent-across-penalties, consistent-across-segments, clean-control is what a genuine result looks like from the inside.
08 · Machinery
None of the above is reachable at one fly per core. The spiking kernel was ported to CUDA and proven equal to the reference array by array — not approximately, bit-identically, including the places where a device exp differs from the host's by one unit in the last place.
The packing mattered more than the parallelism: a neuron's mutable state was twelve scattered reads and became one 32-byte sector, which alone was 2.8×. The kernel runs at 81% of the card's measured random-gather ceiling, so what is left is memory, not occupancy.