Case study · connectome simulation · measurement

A fly wired to a market

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.

166,700neurons retained · nothing pruned
25,582,938synaptic connections
9.7 / sfly-observations on one RTX 5080
2cells the decision was read from

01 · The animal

Everything retained, nothing selected

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.

What the graph is made of

visual 105,267 · 63.1% Kenyon 4,064 · 2.4% olfactory 2,635 receptor neurons · 53 glomeruli descending 1,314 motor 815 the decoder 2 — one DNp20 a side · far below the scale 0 105,267 neurons

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

Market in, order out

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.

9 descriptors — five from the closing price, three from the whole bar, one efference copy
Trend, volatility, position in range, acceleration; taker order flow and where the bar closed; and the fly's own last filled trade, delivered one observation late because nothing can be smelled before it happens.
2,635 receptor neurons across 53 glomeruli
One Gaussian peak per channel, bands assigned alphabetically before any price is read. About 3.6 glomeruli light per channel.
4,064 Kenyon cells — two synapses away
Held at 1.6–2.4% activity by one measured parameter: excitation and inhibition were both set from contact count, so 94% of the first layer fired for every market state. Scaling inhibition by 1.9 was the only thing that produced a graded regime.
Dopamine — 15 PAM11 cells for profit, 2 PPL101 for loss
A 200 ms pulse above a deadband, binary and not proportional. Without it, zero plastic edges move over sixty observations.
2 DNp20 cells → buy, sell or hold
Mean rate on the right minus mean rate on the left, against a threshold. This is the step that turned out to be the problem.

03 · The search

Ten generations of finding nothing

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.

Information coefficient per generation

trained on held out — the same champion, unseen segment

0.20 0.15 0.10 0.05 0 -0.05 +0.105 +0.152 -0.024 gen 0 gen 4 gen 9

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

So a signal was put in on purpose

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.

What survives each stage

signal injected real market, no injection

0 0.25 0.50 0.75 1.00 0.97 0.89 0.60 0.06 the channel what was fed in Kenyon cells 4,064 · out of fold descending 1,304 · same rule the decoder 2 cells · what ships information coefficient against the return six bars ahead · validation segment · ten starts

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.

And it is not a question of volume

0 0.60 what 1,304 cells deliver — 0.60 0.098 0.049 0.023 0.028 no injection 1 channel 3 channels 9 of 9 read at the two-cell decoder · every channel carrying the same perfect signal changes nothing

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

A constant, mistaken for a decision

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.

Where each genome's readout sits

where the threshold can still decide 0.5 to 12 Hz, either way wild type fittest 2nd least fit −17.15 Hz → 0 buys in 80 +9.05 → 64 buys, 0 sells +8.60 → 76 buys, 1 sell +4.42 → 50 / 12 / 18 −17 0 +10 bars span one standard deviation · the spread never changed: 4.76 to 6.34 for all four

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

And none of it would have paid

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.

Needed to break even, against what is there

0.01 0.1 1.0 10 what the data carries · 0.03 1 minute · 6 bars 15 minutes · 6 1 hour · 6 — the run 1 hour · 24 6 hours · 24 12.201.88 2.710.42 1.080.17 0.540.08 0.21 0.03 — they meet

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.

Every descriptor, every horizon

whole-bar descriptor1 bar361124
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

Three answers, none of them the one wanted

Established

The fly carries a signal

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.

Established

The readout discards it

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.

Established

There is nothing to carry

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.

The one that did not survive

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

What it took to ask the question at all

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.

4.7×fly-observations per second vs an eight-worker pool
84flies per wave, one CUDA launch
61.7%of the time still in the kernel itself
0arrays differing from the reference

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.