Connection gains — the ring(d)
Synapse counts are never edited. Tuning enters the model in exactly one place: a gain per (pre, post) pair that multiplies the raw count. The whole table is below, generated from the gain table the engine runs on, so it cannot drift out of date with the model that uses it.
The names in this table are classes, not cell types. Unlike every other name on these pages, they will not be found in the Cell Type Explorer, and they are deliberately not linked to it. EPG covers EPG and EPGt; PEN covers PEN_a(PEN1) and PEN_b(PEN2); D7 is Delta7; ER covers ER2_a, ER2_b, ER2_c, ER2_d, ER4d and ER4m; FC2 covers FC2A, FC2B and FC2C. In the colour table below, R16 is R1–R6, L is L1, L2 and L3, Tm5 is Tm5a, Tm5b and Tm5c together, and R7, R8 and Dm8 each cover their pale and yellow subtypes. The class of every type is mirrored from gate_a.json, and the real type strings are in the roster.
The aggregation is a choice and it cuts both ways. It is the level at which the architecture in Hulse et al. 2021 distinguishes pathways, and keying the table by subtype would inflate the count of free parameters with subtypes that were never fitted separately. But it also means a row below is a statement about a group of cell types rather than about one: every ER2 and ER4 cell in the model shares one number, and nothing here measures whether they should.
EPG → PEN
0.002
free (pathway and sign from Hulse et al. 2021 architecture; value fitted to bump FWHM ~90 deg)
PEN → EPG
0.002
free (pathway and sign from Hulse et al. 2021 architecture; value fitted to bump FWHM ~90 deg)
EPG → PEG
0.0003
free; held at the default — the grid search did not distinguish it from the floor.
PEG → EPG
0.0003
free; held at the default — the grid search did not distinguish it from the floor.
EPG → D7
0.009
free (pathway and sign from Hulse et al. 2021 architecture; value fitted to bump FWHM ~90 deg)
D7 → EPG
0.009
free (pathway and sign from Hulse et al. 2021 architecture; value fitted to bump FWHM ~90 deg)
EPG → EPG
0.001
free (pathway and sign from Hulse et al. 2021 architecture; value fitted to bump FWHM ~90 deg)
ER → EPG
0.0003
free; held at the default — the grid search did not distinguish it from the floor.
EPG → PFL3
0.0003
free; held at the default — the grid search did not distinguish it from the floor.
FC2 → PFL3
0.0003
free; held at the default — the grid search did not distinguish it from the floor.
PFL3 → DNa02
0.0003
free; held at the default — the grid search did not distinguish it from the floor.
every other pair
0.0003
A real pathway that nobody fitted still conducts. Setting unfitted pairs to zero would be deleting data to make the model tidier, so they run at one stated background gain, which is itself a free parameter.
11 of the 11 named gains are marked free, plus the background gain.
That count is the ceiling, not the result, and the honest number is smaller. 6 of the 11 named pairs hold exactly the background value: the grid search did not distinguish them from the floor, and their rows above say so rather than repeating the provenance of a fit they were not moved by. 5 pairs differ from the floor, and between them they take 3 distinct values, so the whole ring table is 4 numbers: 0.0003, 0.001, 0.002, 0.009.
Connection gains — the colour column(d)
The colour column has its own gains. They were fitted rather than hand-set, and the objective they were fitted against is printed below so the fit can be judged, not just the result. Provenance, from gate_b.json: all free; structure from Christenson et al. 2024. The rows below are ordered class pairs, and there are more rows than there are numbers; the count is underneath them.
These rows are read from the table the engine multiplies synapse counts by, and a test asserts every one of them against gate_b.json, where they were fitted. That is not a formality: publishing the fitted numbers while the engine ran on different ones would make this page a description of a model nobody is watching.
R7→Dm9
0.01409
free (pathway and sign from the connectome; value fitted to the hue sensitivity indices and preferred colour bands published by Christenson et al. 2024)
R8→Dm9
0.01409
free (pathway and sign from the connectome; value fitted to the hue sensitivity indices and preferred colour bands published by Christenson et al. 2024)
Dm9→R7
0.01985
free (pathway and sign from the connectome; value fitted to the hue sensitivity indices and preferred colour bands published by Christenson et al. 2024)
Dm9→R8
0.01985
free (pathway and sign from the connectome; value fitted to the hue sensitivity indices and preferred colour bands published by Christenson et al. 2024)
R7→Dm8
0.03895
free (pathway and sign from the connectome; value fitted to the hue sensitivity indices and preferred colour bands published by Christenson et al. 2024)
Dm8→Tm5
0.4
free (pathway and sign from the connectome; value fitted to the hue sensitivity indices and preferred colour bands published by Christenson et al. 2024)
R8→Tm20
0.005
free (pathway and sign from the connectome; value fitted to the hue sensitivity indices and preferred colour bands published by Christenson et al. 2024)
R16→L
0.02256
free (pathway and sign from the connectome; value fitted to the hue sensitivity indices and preferred colour bands published by Christenson et al. 2024)
L→Tm5
0.0053
free (pathway and sign from the connectome; value fitted to the hue sensitivity indices and preferred colour bands published by Christenson et al. 2024)
L→Tm20
0.0053
free (pathway and sign from the connectome; value fitted to the hue sensitivity indices and preferred colour bands published by Christenson et al. 2024)
Tm5→Tm5
0.0665
free (pathway and sign from the connectome; value fitted to the hue sensitivity indices and preferred colour bands published by Christenson et al. 2024)
Tm20→Tm20
0.0665
free (pathway and sign from the connectome; value fitted to the hue sensitivity indices and preferred colour bands published by Christenson et al. 2024)
Tm5→Tm20
0.0665
free (pathway and sign from the connectome; value fitted to the hue sensitivity indices and preferred colour bands published by Christenson et al. 2024)
Tm20→Tm5
0.0665
free (pathway and sign from the connectome; value fitted to the hue sensitivity indices and preferred colour bands published by Christenson et al. 2024)
every other pair
0.002
Fitted by log-uniform random search then coordinate polish: 4,000 random draws and 4 polish rounds, seed 20260915, final loss 1.283.
That is 14 rows carrying 8 numbers, or 9 counting the default. The sharing is deliberate and not an accident of the fit: 4 of the 8 were fitted as a single parameter across more than one ordered class pair, because they are the same pathway. 0.0665 is Tm5->Tm5, Tm20->Tm20, Tm5->Tm20, Tm20->Tm5 (4 pairs, one parameter); 0.01409 is R7->Dm9, R8->Dm9 (2 pairs, one parameter); 0.01985 is Dm9->R7, Dm9->R8 (2 pairs, one parameter); 0.0053 is L->Tm5, L->Tm20 (2 pairs, one parameter).
Cross-check: the fit declares 8 search ranges, one per fitted parameter, which is the same 8. The count above is derived from the values the model runs on; this one is derived from what was searched.
This is the class keying above, applied a second time, and it carries the same cost. A shared row is a claim that the pathways sharing it behave alike — that Tm5->Tm5, Tm20->Tm20, Tm5->Tm20, Tm20->Tm5 are one thing, held to one number, and nothing in this gate measures whether they do. What it buys is the honest number: the colour column is tuned by 8 scalars and a default, not by 14.
Squared error against Christenson's published numbers.
L = sum_t (HSI_model - HSI_published)^2
+ sum_t (nm outside the published colour band / 100)^2
Rejected (returns inf) if any output is flat, or floored at 0 or pinned at r_max
on more than `FIT_MAX_FLOORED_FRACTION` of the probe set: a saturated circuit can
score well on HSI by accident and is not a hue detector, and neither is one that
reports nothing at all across most of the spectrum.
Also rejected, when `separation` is supplied, if it is below
`GATE_D_MIN_SEPARATION`. That is Gate D used as a CONSTRAINT and never as a term:
the objective is still Christenson's published numbers and nothing else, so no
gain is ever moved in order to raise a colour range (CLAUDE.md rule 4). What the
constraint does is refuse the trade the roster experiment found by accident -- a
circuit that scores better on narrowband probes by going blind under daylight.
`separation` is None for a bare re-score of an existing table, which is why the
published `final_loss` in gate_b.json stays comparable with every earlier run.Christenson et al. 2024 publish NO absolute firing rates for these cells. Their circuit model (their eq. 8) uses a modified tanh with a_NL = 1 and is fitted by negative summed correlation (their eq. 9), so response amplitude is not identified in their units and there is no rate range to calibrate against. Their fitted weight matrix exists only as Extended Data Fig. 7g and is not published as numbers. What they DO publish as numbers, and what the gains here are therefore calibrated against, is the hue sensitivity index per type (Tm5a 0.65, Tm5b 0.65, Tm20 0.55, Tm5c 'in the same range as the photoreceptor axonal terminals', which they give as 0.25-0.5) and the preferred colour band per type. Those are the two terms in the objective above. The operating point is reported alongside so a reader can see the cells are exercised rather than idling near background — which they were not in the first version of this file, before the gains were calibrated.
Every other free parameter(d)
Constants exported by the engine, with the values the engine holds: 58 of them, counted by iterating the exported tables rather than by anybody keeping a tally. The count is the ceiling: a row whose source says it is a measurement is one, and is not tuning. That is the number the about page quotes, derived the same way from the same tables. A parameter added without a source shows up here saying so.
tauMs
100
Free. Held equal to gate_a.json model.tau_ms so the TypeScript engine and the Python reference solve the same equation. — the rate model
rMax
1
Free. The saturating ceiling of φ in SPEC §3.6’s rate equation. — the rate model
noiseSd
0.02
Free. SPEC §3.6’s ξ term, seeded per piece so replay is bit-exact. — the rate model
bias
0.06
Free. Tonic drive on EPG; held equal to gate_a.json model.bg_epg. — the rate model
erLight
0.1
Free. Baseline drive on the ER ring neurons in daylight; gate_a.json model.bg_er_light. — the rate model
erDark
0
Free. Baseline drive on the ER ring neurons in darkness; gate_a.json model.bg_er_dark. — the rate model
steeringGainScale
16
Free. One scale on the connections into PFL3 and DNa02, the steering pathway. The compass was fitted to a target — the width of the bump — that those three connections do not affect, so the grid search left all three on the floor, and the gain table says so. Measured before it existed: setting goalDrive to zero, and steeringK to 0.5 or to 8, produced the same path to four decimal places, because the turn signal sat at the noise floor. A pathway nobody fitted is not a pathway measured to be weak. — the rate model
landmarkDrive
2
Free. Scales the solar landmark drive onto the ER ring neurons, and it is what the weather reaches the drawing through. This entry used to say that above about 0.35 of effective drive “the fly holds a line”, and that is not what was measured. Over a day of piece-hours, net body yaw is 315°/h under a forced-clear sky against 2,150–3,030°/h under real cloud and in the dark, and stroke straightness — chord over arc — is 0.999 against 0.98. Seven to nine times less turning is the whole of the effect, and 315° in an hour is not a held bearing. Bump concentration at 2.0 measures 0.795 against 0.851 at the old 1.0, so the sun is not being bought with a smeared compass. — the rate model
goalDrive
0.35
Free. How strongly FC2 is held to this piece’s goal direction (SPEC §3.6), and measured, that hold does not outlast it. Over twenty-seven piece-hours the FC2 population vector relaxes within seconds of the hold ending to +123.4°, with a standard deviation of 0.1° across all twenty-seven, whatever direction the piece was started on — and the starting directions span the circle. Its concentration is 0.045: a population barely pointing anywhere. The bump it is compared against sits at −127.5°, with a median within-hour deviation of 0.2° in every dark hour measured, and does not turn with the body under any sky measured. So PFL3 compares two constants about 109° apart. That is a steering error of one sign that never closes, and the body’s answer is a constant turn: 2,800–3,000°/h in the dark, one revolution every seven and a half minutes. The second of the compass’s two settling positions is on the record too — at 16:00 UTC the bump settled 7° from that piece’s goal and the hour’s yaw is +1,053°/h instead. Reported, not fixed: closing this loop means either symmetrising the connection counts, which is editing them, or holding the goal all piece, which was measured and is worse — see goalHoldMs. — the rate model
goalHoldMs
2000
Free. For how long. SPEC §3.6 says the goal is “set at piece start from the current bump”; this is the reading of “set” — the FC2 population is driven to that direction for two seconds and then left to its own connectome input, rather than clamped for the whole piece. The other reading was run rather than argued about. Westeinde et al. 2024 and Mussells Pires et al. 2024 report FC2 carrying a goal as a persistent bump, so the hold was extended to the whole hour over nine piece-hours — three room sizes by clear sky, real cloud and real night. It does make FC2 a real bump: concentration 0.045 → 0.72–0.84, pointing within about 2° of where it was driven. The drawing does not survive it. Because the compass does not turn with the body, the goal-minus-bump error stays fixed at 79–129° instead of closing, so the fly turns one way all hour: 92,000–144,000°/h, 16–18 m walked against 45–61 m, and 1.5–2.4% of the sheet touched against 7.7–8.4%, the path collapsed into a knot of 7 mm loops. Re-selecting the goal from the compass at every landing (Giraldo et al. 2018) recovers the open arcs on the hours that have flights and changes nothing on the hours that do not. Two seconds stands, on that measurement. — the rate model
steeringK
2.4
Free, and named as free by SPEC §3.6: ω = k · (DNa02_R − DNa02_L). Sign convention from Turner-Evans et al. 2017. — the rate model
v0
0.022965879265091863
Not free, and no longer counted as tuning: a measurement, converted. Free forward walking speed in Drosophila melanogaster peaks at 17.5 mm/s (DeAngelis, Zavatone-Veth & Clark 2019, eLife 8:e46409, Fig. 1C, where the distribution is bimodal — standing at 0 and walking at 17.5, with 2.5th–97.5th percentiles of −1.3 to 30.4 mm/s). The sheet is 762 mm across, so the base speed in sheet widths per second is 17.5 / 762. The standing half of that distribution is the stop state of the gait, not a lower base speed. — the rate model
dopamineGain
1.8
Free, and named as free by SPEC §3.1C: v = v0 · (1 + a · DA). The direction of the effect is documented (Kong et al. 2010; Liu et al. 2012); the size of it is not. — the rate model
plasticityRate
0.0004
Free. Depression rate of ER→EPG synapses. The mechanism is Kim et al. 2019 and Fisher et al. 2019; the rate is ours. — the rate model
plasticityRecovery
0.000002
Free. Recovery rate of depressed ER→EPG synapses. — the rate model
jumpDegrees
60
Free. SPEC §3.5 puts the brush-lift condition at a bump jump over 60° inside 200 ms. — the rate model
jumpWindowMs
200
Free. The window of that same condition. — the rate model
brushR
0.0005971128608923884
The mark’s contact radius, in sheet widths: half the width of the mark, 0.455 mm on a 762 mm sheet. A free parameter with a physical size — nothing measured says how wide a trail a fly leaves, but the width chosen is the animal’s own, the lateral semi-axis of the head capsule read off the flybody proportions. So the mark is one fly wide, which is 1/837 of the sheet, and it is one fly wide always: the contact width of a dragged wetted tip is the tip’s, and the compass is not part of the tip. Until this session the compass was in the width twice over, once here and once in the stroke smoother, so the line was 1.456 mm when the heading was certain and 0.127 mm when it was not. 0.127 mm is a third of a texel on the grid the paint is simulated on, and a quarter of the hour is spent below a tenth of full certainty — the compass is either locked or collapsed, with almost nothing in between — so a quarter of every piece was drawn as a row of disconnected dots: 247 of them along one 71-second stretch, 2,315 over the hour. The width is now the tip’s and what the compass scales instead is the pigment, so that same stretch is one unbroken line carrying 0.08% of the colour a certain heading carries. A fly that has lost its bearing draws in water. — the rate model
floorSpan
1.05
Free, and the one number here that is a composition decision. The floor the fly walks on, as a multiple of the sheet’s width, with the sheet centred on it. At 1 the floor is the sheet and the fly turns at the paper’s own edge, so every corner of every reflection is drawn on the sheet and the sheet is a billiard table. It was 1.6, chosen against the lattice a reflected bearing would leave — a bearing reflected in square walls takes only four headings — and that choice was measured on a sheet recorded as 30 mm across. Re-measured at the sheet’s real size, one hour per cell, three skies by four room sizes: the lattice does not form at any of them. Folded four-fold, the circular variance of stroke headings runs 0.48–0.97 wherever there are enough strokes to compute it, where a lattice would read near 0. What 1.6 does cost is measured too — the fly is off the sheet for 57–64% of an hour in absences of up to four and a half minutes, and 2.8–3.5% of the paper is touched. The number is now 1.05, chosen against a criterion stated before the table was read: the smallest floor above 1 at which every wall reflection happens off the paper, and the fly is off the sheet for under 15% of the hour with no single absence over 40 seconds, under all three skies. 1.05 passes at 7.8–9.6% off and a longest absence of 15.0 seconds; 1.1 fails both halves, 17.3% off and absences of 88 and 99 seconds. Nought of 249 reflections at 1.05 were drawn on the paper, against every one of them at 1.0. Coverage goes to 7.3–7.7% and strokes to 71–119 an hour, against 30–38. The calibration is the reflection test and the off-sheet measurements; the taste is the 15% and the 40 seconds, and the judgement behind them is that a work should not show nothing happening for minutes at a time. It is an embodiment choice about a finite room, not a claim about what flies do at walls. The published alternative — wall-following, the thigmotaxis of Besson and Martin 2005 and the wall attraction of Soibam 2012 — was run in the same harness rather than argued away: at a wall the body takes the wall’s tangent by the smaller turn and stays on it until the circuit or a saccade turns it inward. At floor 1 every contact is drawn and 41% of the clear hour’s marks lie within one mark width of the sheet’s edge; at 1.05 the wall is off the paper and the sheet loses the fly for 34–69% of the hour in absences up to 170 seconds. In every sky the outer 5 mm of the sheet carries 2.6–7.5 times the interior’s marks, and the four-fold lattice that reflection never produced, following does, by construction, at 0.05–0.40. The picture is a racetrack round an empty sheet, and reflection stays. — the rate model
colBg
0.5
Free. Tonic drive on every non-photoreceptor cell of the colour column; held equal to gate_b.json params.bg, the value circuit B’s hue selectivity was measured at. It is the parameter that stopped the colour column outputting identically zero. Every photoreceptor in MaleCNS is histaminergic, so its sign is −1 and light can only ever subtract; a cell sitting at zero has nothing for the light to subtract from. Without this term L1–L3, Dm8, Dm9, Tm5a/b/c and Tm20 are all identically zero at every wavelength, the ink is identically zero, and the fly paints with clear water. — the rate model
colTauMs
20
Free. Membrane time constant of the colour column, ms; held equal to gate_b.json params.tau_ms. Separate from the ring’s tauMs because medulla interneurons follow flicker at 100 Hz (Juusola & Hardie 2001) and the compass does not. — the rate model
walkBoutMeanMs
4200
Free. Mean duration of a walking bout. Drosophila locomotion alternates activity and immobility (Martin 2004, Behavioural Processes 67:207) and the durations are broadly exponential, so that is the distribution used; the mean is ours. With the stop mean below it, 75% of a piece is spent walking. This is the one part of the gait that is a rule rather than the connectome’s: measured on these weights, every signal in the circuit is a small perturbation about one fixed point whose autocorrelation is 0.37 at 100 ms and 0.00 at 500 ms, so there is no second timescale to read bouts out of, and tuning a trigger until it flickered at a convincing rate would be exactly the fake liveliness the project forbids. — walking, stopping and flight
stopBoutMeanMs
1400
Free. Mean duration of a stop, in the same two-state process. — walking, stopping and flight
minBoutMs
350
Free. Floor on either bout, so the exponential’s tail cannot produce a stop the paint layer renders as a hiccup rather than as a pause. — walking, stopping and flight
saccadeReleaseDeg
3
Free, and the number that decides how the path looks. Walking Drosophila turn in discrete saccades rather than yawing continuously (Geurten, Jähde, Corthals & Göpfert 2014, Front. Behav. Neurosci. 8:365). No turn is invented for this: the steering command ω = k(DNa02_R − DNa02_L) is banked in an accumulator and spent whole when it passes this threshold, so total yaw over a piece is unchanged and the compass loop still closes. Measured, |ω| averages 0.26°/s on these weights, so 3° fires about every 12 s. — walking, stopping and flight
saccadeMs
120
Free. Duration of one saccade. Walking body saccades are brief; 120 ms is twelve samples at the 100 Hz stroke rate, so the corner is drawn rather than jumped. — walking, stopping and flight
saccadeSpeedScale
0.35
Free. Forward speed through a saccade, relative to walking. Rotation and translation are largely separated in walking Drosophila (Geurten et al. 2014), so the fly slows into the corner; it does not stop, because at zero the ribbon pinches to a point. — walking, stopping and flight
flightMs
900
Free. How long a flight lasts. The trigger is not free and is not new: it is SPEC §3.5’s bump jump, over 60° inside 200 ms, which used to lift the brush for a single 10 ms sample — a stroke that closed and reopened a tenth of a millimetre further on, and was invisible in every rendered piece. The same trigger now launches the fly. — walking, stopping and flight
flightSpeedScale
12
Free. Flight speed relative to walking. Drosophila fly at a few hundred mm/s against a walking pace of about ten (Tammero & Dickinson 2002, J. Exp. Biol. 205:327), so 12× is the conservative end of that ratio; on this sheet it carries the fly about half a paper width. — walking, stopping and flight
flightRefractoryMs
20000
Free. The shortest interval between two flights, so a bump that stays jumpy does not turn a piece into a series of hops. — walking, stopping and flight
cloudExponent
1.6
Free. The exponent by which cloud cover attenuates the solar landmark. SPEC §3.3: overcast means a weak or absent landmark. — the solar landmark
horizonCct
2000
Free, within the range the CIE daylight series covers. Correlated colour temperature at the horizon. — the light the fly sees by
zenithCct
6500
Free. Correlated colour temperature approached at the zenith; 6500 K is D65. — the light the fly sees by
overcastCct
1500
Free. Extra coolness attributed to a fully overcast sky. — the light the fly sees by
cct
2700
Free. Colour temperature of the practical lamp in the studio, in kelvin. 2700 K is a warm tungsten or an LED sold as one. The lamp exists because below the horizon Open-Meteo reports 0 W/m², so the illuminant reaching the fly was identically zero and the four colour outputs sat on their tonic background: measured, a night piece moved 0.0052 rms ΔE against 1.13 for a noon piece. It is a physical object in the room, stated, and it is in the fly’s illuminant and in the scene at once — being in only one of the two is the class of divergence this page keeps reporting. — the light the fly sees by
irradianceWm2
6
Free, and invisible to the fly. Irradiance the lamp puts on the paper, about 800 lux. The opsin activations are normalised by the illuminant they are integrated against (von Kries), so this number changes nothing about what the fly sees — only the lamp’s spectral shape reaches it. It is stated so the quantity has a real physical size: noon in London measures 643 W/m², so the lamp is about 1% of it. — the light the fly sees by
onBelowWm2
120
Free. The lamp lights when the measured shortwave irradiance falls below this. 120 W/m² is roughly civil twilight and also a genuinely black overcast afternoon, which means bad enough weather turns the lamp on in daylight. Deterministic from the cached weather, like everything else a piece depends on. — the light the fly sees by
sceneIntensity
0.9
Free, and the one number in the studio’s lighting that is about the viewer’s screen rather than about London. A real desk lamp at 6 W/m² against a 643 W/m² noon renders as a direct intensity of 0.016 against 1.505 — the true ratio, and a still-black rectangle. This is chosen for legibility and is not a measurement. Everything else in the lighting stays causal: the sun’s direction, colour and strength come from the sky, and the lamp is off whenever there is enough of it. — the studio lighting
meterTarget
1.6
Free, and about the viewer’s screen rather than about London. Light on the paper that renders at an exposure of exactly 1, in the studio’s own units, and the level the studio is now held at outright. Set to a clear London midday, so the brightest hours look as they did before the studio had an exposure at all. The exposure used to correct only partially, so that the weather still changed how bright the room looked; that went with the circadian gate, because the rule the piece now runs under is that weather is an input to the art and never a gate on the studio — not on whether the fly is working, and not on how brightly its room is lit. A gallery lights the work to a standard level and leaves it there. What the sky still decides is everything except the level: the bearing and elevation of the key light, the angle of every shadow, the reddening of the beam with air mass, the shadow going soft and then absent under cloud, and the lamp turning a black afternoon warm. — the studio lighting
minExposure
0.5
Free. Floor on the correction. Wide enough that the metered range never reaches it — the lamp puts a floor under the darkest hour — and here so a weather feed returning nonsense cannot push the studio to white. — the studio lighting
maxExposure
8
Free. Ceiling on the correction, for the same reason in the other direction: nonsense in the feed opens the room up rather than into noise. — the studio lighting
tauSeconds
2.5
Free. How fast the exposure follows the light, as the time constant of the same first-order approach the camera rig and the body’s yaw use. The room opens the way an eye does rather than cutting, and it is seeded on the first frame so the studio does not fade up on every load. — the studio lighting
fixedReferenceScale
0.398302
Free, and the one number that decides whether the colour circuit is being asked a question it can answer. Circuit B’s gains were fitted against sixty-one narrowband probes whose total drive across the five photoreceptors averages 1.451. The old closed loop ran the same circuit at 2.7 to 3.6 and the sky at 3.7 to 5.0 — above the top of the range it was ever measured in, where every interneuron between the photoreceptors and the four outputs is pushed to silence and doubling one channel’s catch moves the ink by nothing at all. Bare paper under the real sky of 13:00 UTC on 17 September 2026 gives five catches summing to 3.640455, and 1.45 / 3.640455 = 0.398302 puts the fly back where the circuit was measured. Under the sky it delivers a mean total drive of 1.038. Measured across it on three pieces: at 0.7× the colour moves ΔE 1.36 to 1.54 over a piece, at 1.0× it moves 2.01 to 2.24, and at 1.4× it moves 2.32 to 2.37 — but only because 1.4× puts the circuit back on the cliff it was taken off. — the light the fly sees by
turbidity
3
Free. The atmospheric turbidity of Hosek & Wilkie 2012 — 1 is a pure Rayleigh atmosphere, 10 is thick haze — and what it sets is how large the whitish aureole around the sun is, which is the whole of the heading-to-hue signal. Measured across it, as the largest difference between any two headings in the deposited ink at 13:00 UTC on 17 September 2026 under that hour’s real cloud of 0.42: ΔE 4.69 at turbidity 2, 5.09 at 3, 5.65 at 5, against 2.3 for a difference you could see. It is left at 3, a clear-ish city sky. Turning it up would make the painting work better, which is exactly why it is not turned up. — the sky the fly looks at
groundAlbedo
0.3
Free. The second input Hosek & Wilkie 2012 takes: how much light the ground throws back into the sky. 0.3 is the usual figure for mixed ground and the value the authors’ own sample code ships with. — the sky the fly looks at
viewElevationDeg
45
Free. How far above the horizon the colour column looks. Nothing published fixes it, so it is stated. Measured at 30, 45 and 60 degrees at 13:00 under that hour’s real cloud, the largest difference between headings is ΔE 3.42, 5.09 and 4.13 — not a small effect, and not monotone, so this is a stated choice the work is partly balanced on. What decides it is that a dorsal column points up rather than at the horizon. — the sky the fly looks at
sheetXAzimuthDeg
90
Free, and it is the orientation of a table in a room — no measurement decides it. 90 means the sheet’s +x axis points east and its +y points north, so a body heading of 0 faces east. It is what turns the fly’s heading into a compass bearing, and therefore into an angle from the sun. — the sky the fly looks at
flowGain
1
Free. Pigment and water laid down per unit of stroke length, before the speed term below. SPEC §3.5. — the brush
dryOutSpeed
14
Free, and until this session the wrong size by two orders of magnitude. SPEC §3.5 says speed changes how much ink reaches the paper rather than how wide the mark is — a fast brush runs drier — and the flow is flowGain / (1 + dryOutSpeed · speed). Sample.speed is in paper widths per second, which for a walking fly is about 0.05, so at the old value of 0.35 the divisor was 1.0175 and the rule changed the ink by 1.7% between a stopped brush and a walking one. It was inert, exactly as the steering pathway was before it got its own scale. Two things made it worth fixing: the gait now has a real range of speeds for it to act on — stops, saccades at a third of walking pace, flight at twelve times it — and the walk is five times longer than it was, which at the old flow buried the sheet, because four watercolours at high concentration mix to mud. At 14 a corner lays down about 1.35× the ink of the run into it and a piece takes roughly 40% less paint. — the brush
dwellTauMs
1000
Free. How fast a brush held still stops unloading, in milliseconds. The fly is stopped for about a quarter of every piece, and a brush resting on wet paper does not pause — it unloads, water wicking out into the sheet and carrying pigment with it, until the paper under it is saturated. So the dwell flow decays, flowGain · exp(−dwellMs / dwellTauMs), the pool grows as the square root of the water delivered, and the total a stop can leave is bounded however long the fly stands there. The value was 45 ms, and at 45 ms the pool reached full size in 207 ms: a three-second stop and a half-second stop left the same 2.275 mm dot, so the length of a stop — which the gait decides, and which the drawing ought to carry — was not in the piece at all. It is now 1000 ms, chosen against three stated criteria rather than against two rendered sheets: that a 0.5 s stop and a 3 s stop differ in diameter by at least one mark width; that the median stop, measured at 1.9 s, reads as a dot clearly wider than the line; and that the middle of the dot does not reach the opaque limit of the ink. A grid of five time constants by three spreads was measured at the sheet’s real size through the real renderer and is printed in full in the source. At 1000 ms, with the pool spread at 4, the dot is 2.283 mm at half a second, 3.159 mm at the median stop and 3.548 mm at three seconds, and its centre dries to L* 36 against bare paper at 91, a line centre at 74 and this ink’s opaque limit at 30. The third criterion is what bound the choice, and it could not be used as it was written: as written it caps the dot’s darkness below the line’s own, which no dot darker than the line can satisfy, so what was applied is the measurable half of it — darker than the line, and off the opaque limit. Said here rather than quietly reinterpreted. Every figure in this entry was taken on synthetic stops, one at a time on bare paper, and the sheets the studio then printed disagreed with them. The diameters still hold, because they are geometry. The L* 36 does not: on seven real hours the centre of every pool sat at L* 30.4, a quarter of one unit above the opaque limit, at every stop length from a third of a second to nine seconds. That is what the dwell pigment fraction below was added for, and that entry carries the numbers. What the change costs is stated too, because the pigment a stop leaves is proportional to this number: with the fraction below, a stop deposits 16.4 times what a walking pass lays into one mark width of paper, against 46.9 without it and 2.77 at the old time constant. Over a real hour that puts 16.1% of the paint on the sheet into the stops, against 35.4% without the fraction and 5.4% before this session. The area the brush wets does not move, because the water did not change. A stop is a heavier mark than it was; the piece is not a heavier piece. That is the decision — a dot cannot record how long it lasted without the water that makes it — and not an accident. — the brush
dwellPoolGrowth
4
Free. How much wider the pool a held tip leaves is than the tip itself, as a multiple of the contact radius, so the largest pool a stop can leave is 3.64 mm across on a 762 mm sheet — the same largest dot as before this session, reached over seconds now instead of over a fifth of one. What sets it is wicking: a wetted tip resting on a Rough cotton rag sheet spreads laterally, here by 1.37 mm from a 0.455 mm contact radius, before the paper under it is saturated and the flow stops. There is no published figure for that, so it is named as free. It does not change how much pigment a stop deposits — the unloading time constant below bounds that, and the rate is divided by the area — only how far it is spread, which is what keeps the middle of a dot off the opaque limit of the ink. — the brush
dwellPigmentFraction
0.35
Free, and the one number on this page chosen against the sheets the studio printed rather than against a synthetic stop. On a wet sheet the water travels and the pigment lags — the paper is a filter — so what wicks sideways out of a tip standing still is thinner than what a dragged tip leaves behind it. There is no published figure for how much thinner, so it is named as free. It multiplies the pigment of a dwell mark and nothing else: not the water, which is what the wet paint spreads and therefore what decides how wide the dot ends up, and not the geometry. Why it exists: without it — which is what shipped — the middle of every dot on seven real hours of sheets came out at L* 30.4 against this ink’s opaque limit of 30.2, and it came out there whether the fly had stood still for a third of a second or for nine. The drawing recorded that the fly had stopped and not for how long, and the length of a stop is the thing a dot is there to carry. The dots are also the piece seen from any distance: of the ink more than twenty L* below bare paper, 95 to 98% of it lies within two and a half millimetres of a stop. Taking the water away instead of the pigment was measured and rejected — it shrinks the dot as fast as it lightens it, and a half-second and a three-second stop stop differing by a mark width at every value tried. At 0.35, on the day’s concentration, a half-second dot is 2.15 mm across and a three-second one 3.11 mm, a difference of 0.96 mm against the 0.91 mm the criterion asks; the median stop reads L* 54 against a line at 75, twenty-one units darker and six times wider; and the centre sits twenty-four units clear of the opaque limit. The same three hold at the clear hour’s lower concentration, which is what rejects 0.25 and 0.18: those pass on a strong compass and fail on a weak one. Measured afterwards on two real hours: the centre of the dot does not record the length of the stop at all — 0.99 and 0.65 units between a half-second and a three-second stop, against a spread of five between stops of the same length, with the sign reversed on the second hour — and the diameter does, at nine times what the eye resolves on a print, five on a full-size screen, 1.18 on a phone and not at all in a thumbnail, where the pixel averages the whole dot and reads its total pigment instead. — the brush
ribbonSize
0.0011942257217847768
The warm-up distance of the stroke smoother, in sheet widths, and not a shape control: it is one mark width, 0.91 mm, so the smoother has settled within the mark’s own width of the start of a stroke. Derived from the mark rather than chosen against it. It is the only thing the smoother’s size does now — the drawn width is the mark’s and does not pass through the smoother’s pressure curve at all. — the brush
paperFrequency
280
Free. Grain cycles across the full width of the sheet. It sets the tooth above; see that entry for why it is where it is. The same two-cell limit is a bar the piece misses in the other direction, and it is worth stating next to the one it meets: the paint is simulated on 2048 cells on a desktop and on 1024 on a phone, and the mark is 0.91 mm — 2.45 cells on the desktop grid and 1.22 on the phone’s. Under two cells a mark has no inside, and everything the wet phase does needs one, so on a phone the water is not simulated, it is aliased, and a phone is looking at a slightly different piece from the one the archive prints. The fix is not free: the finer grid is the one already measured at 1.25 times the frame budget for the simulation, on a machine with no GPU in it, and there is no measurement of this on a real phone to argue from. So the phone keeps the coarse grid and the number is published: 1.22 cells. — the sheet
paperFibre
1.6
Free. How far the grain is stretched along the sheet, in sheet coordinates. The sheet is 4:3, so the stretch in millimetres is three quarters of this: 1.2:1 at 1.6, which is a grain direction you can find if you look for it. It was 3.0, which is 2.25:1 in millimetres — a woven or laid texture rather than a mould-made watercolour sheet, which has a slight direction and not a strong one. There is no published figure for the anisotropy of a rag sheet, so this is named as free rather than cited. The stretch also used to be applied to the other axis in the second octave, so the sheet’s grain ran one way at one scale and at right angles to it at the next. Paper fibres do not do that; they are aligned by the way the sheet is formed, at every scale at once. — the sheet
paperOctave2
0.45
Free. Weight of the second octave of grain against the first. — the sheet
paperGrainContrast
0.055
Free. How much lighter the peaks of the tooth read than its troughs, as a peak-to-peak variation in reflectance. — the sheet
paperToothMm
1.7008928571428572
The pitch of the sheet’s tooth, in millimetres, across the sheet. Derived from the grain frequency and the fibre stretch below rather than set, and printed because it is the number that names the surface: 1.70 mm is a Rough sheet. It is Rough because nothing finer can be drawn here, and that is arithmetic rather than taste. The grain is a function of position on the sheet, sampled at whatever grid is rendering, so a feature under two texels aliases — and it aliases differently on the 2048 grid the wet paint is simulated on and the 4096 grid the picture is drawn at, which would mean the two were looking at different paper. Two texels at 2048 over a 762 mm sheet is 0.744 mm, and the grain has a second octave at 2.17 times the first, so the base tooth cannot be finer than 1.614 mm without putting that octave under the floor. A cold-press tooth is about half a millimetre and a hot-pressed sheet has effectively none; both are under the floor by half again or more. The file used to say cold press and was never cold press. Worse, the check behind that claim was run on the first octave only: the second octave’s fine pitch was 0.399 mm, which is 1.07 texels at 2048 and 2.15 at 4096, so the simulated sheet and the drawn sheet were not the same sheet on any piece rendered until now. Both are 2.107 texels and 4.213 texels now, and a test asserts the finest length in the model rather than the first one. — the sheet
The canvas side of the colour loop has 3 more, from colour_loop.json:
Every rung of both shuffle ladders(a) + (d)
Four rungs in increasing strength — a random graph at matched density, the real topology with unit weights, a degree-preserving shuffle with cell types kept, and the real matrix. Gains, signs, type labels, inputs and probes are held fixed across the rungs, so the only thing that changes is the wiring. What the ladders found is on the proof page; the per-rung numbers are here.
Ring
fraction of a 60 s run with EPG bump concentration > 0.5; drift = |least-squares slope of unwrapped heading|, deg/s
random matched density
0 held · drift 0.130 °/s · 100 seeds — at the operating-point gains0.438 held · drift 0.005 °/s · 100 seeds — with gains rescaled to λ_max
Erdos-Renyi over the same 348 bodies at the real edge count; weights redealt without replacement from the real weight multiset; types and signs unchanged. Ring edges rewired: 0.789.
real topology unit weights
0 held · drift 34.811 °/s · 100 seeds — at the operating-point gains0 held · drift 0.055 °/s · 100 seeds — with gains rescaled to λ_max
the real graph with every synapse count replaced by 1. Ring edges rewired: 0.
maslov sneppen types kept
0 held · drift 0.495 °/s · 100 seeds — at the operating-point gains0.190 held · drift 0.092 °/s · 100 seeds — with gains rescaled to λ_max
degree-preserving double-edge swaps, 20 per edge, restricted to pairs whose postsynaptic cells share a cell type; weight travels with its presynaptic cell so out-strength is exact. the ring blocks are dense, so exact degree- and type-preserving swaps saturate below full randomisation; the rewired fractions above say how far it actually got. Ring edges rewired: 0.392.
real
1 held · drift 0.001 °/s · 100 seeds — at the operating-point gains
MaleCNS v1.0 as downloaded.
The ladder as designed: 100 seeds per rung, 60 s each, seed 4242. Real network leading eigenvalue: 1.7358.
Colour column
hue-selectivity index (lifetime sparseness) per output type
random matched density
0.217
Tm20 0.215 ± 0.073 · Tm5a 0.228 ± 0.126 · Tm5b 0.214 ± 0.114 · Tm5c 0.211 ± 0.096
unit weights
0.575
Tm20 0.278 · Tm5a 0.658 · Tm5b 0.758 · Tm5c 0.605
degree preserving
0.500
Tm20 0.321 ± 0.036 · Tm5a 0.585 ± 0.099 · Tm5b 0.721 ± 0.023 · Tm5c 0.374 ± 0.014
real
0.529
Tm20 0.393 · Tm5a 0.608 · Tm5b 0.765 · Tm5c 0.348
degree preserving types free
0.272
Tm20 0.283 ± 0.067 · Tm5a 0.259 ± 0.098 · Tm5b 0.286 ± 0.157 · Tm5c 0.262 ± 0.077
Degree-preserving over real, per output
Tm20 0.815 · Tm5a 0.962 · Tm5b 0.941 · Tm5c 1.072
A ratio at or above 1 means the shuffle matched or beat the real matrix on that output. Printed because it is the result.
The extra rung
degree_preserving_types_free is NOT one of the four SPEC §10 rungs. It was added because the rung that is in the spec does not collapse anything, and the reason had to be measured rather than asserted.
100 seeds, 10 swaps per edge, seed 20260915. Held fixed: gains, signs, type labels, inputs, integrator, probe set.