Repository navigation
Result
-
Simple baselines v1 (#148, SF2): every positive response of the battery is specific. Against 199 degree-preserving shuffles, no shuffle reaches the measured rate in any of the seven positive responses (p = 0.005, Holm 0.04), and the shuffles' 95th percentile is 0 Hz everywhere. The bitter negative stays silent in both, as named in the lock. The measured wiring also recruits several times more neurons.
results/baselines/v1.executions/f89ed1c3…/output/. -
Pulse vs sine song v1 (#36): uninformative, the no-go.
- The no-go. At 100 Hz only 14 of 32 neuropils resolve a sign over the seeds (0.44, below 0.5), so the run stopped before the Pacheco et al. 2021 data were opened.
- The model. It barely tells the songs apart: the median |index| is 0.046, and the resolved neuropils split 7 and 7. This is consistent with the no-go's stated reason (LIF neurons without a band-pass may smooth the 27.8 Hz envelope), which the run does not test.
- The run. 1,045 simulations, including 99 shuffles.
results/song/v1. - Archive guard.
results/now allows 450 kB for its per-cell table.
-
Exact float32 on the console GPU, and a dashboard (#40, #203).
- The divergence. A 20,000-step full-connectome run differed from the CPU oracle in
galone, in 4,329 subnormal conductances that the console flushed to zero, even with-denorm preserve. - The fix. The shader now does every float32 operation on state through double and rounds once, which is correct since 53 ≥ 2·24 + 2. It handles subnormals as bits. 600,000 random operations, subnormals included, match numpy float32 bit for bit offline.
- Qualification. The run is bit for bit at about 2,320 steps/s, and parity, cancel, suspension and resume pass.
- The dashboard. The worker shows a TV dashboard: job state, progress, steps per second, ETA, memory, recent jobs, and the last job's spikes per bin. The gamepad's B cancels through the cancel file.
- The divergence. A 20,000-step full-connectome run differed from the CPU oracle in
-
Full connectome on the Series S (#40, #202): the MaleCNS default model (165,122 neurons,
24.5 million synapses) runs on the console bit for bit with the CPU oracle
(docs/evidence/series-s-full-connectome-2026-10-15.json,scripts/console_bench.py).- Event-driven delivery raises its throughput from 28 to about 1,630 steps/s. Inputs move to
a default heap, spiking neurons set delivery bits, and targets sum their set bits in the
pull loop's order. - The 2,048-neuron fixture rises from about 44,000 to about 70,000 steps/s.
- Parity holds on the 12 version-1 fixtures, and cancel, suspension and resume pass.
native_acceptance.checknow compares only the traced neurons, not the runtime's
placeholder column.
- Event-driven delivery raises its throughput from 28 to about 1,630 steps/s. Inputs move to
-
APL claw contrast v1 (#85): uninformative, the no-go.
- APL intact. The KCs' mean potential sits below rest for both odors (−0.69 and −0.97
mV), with 30–37% of KCs spiking, so the claws have no positive depolarization to contrast. - APL output removed. Every KC spikes, and the contrast is clipped to about zero.
- Outside the verdict. The relations hold in 5/5 seeds. They mean little, because
c_on contrasts two potentials below rest
(results/apl-claws/v1.executions/b914035a…/output/).
- APL intact. The KCs' mean potential sits below rest for both odors (−0.69 and −0.97
-
Series S worker lifecycle (#40): on a 2,048-neuron synthetic version-1 fixture of
1,000,000 steps, the worker's lifecycle behaves on the console
(docs/evidence/series-s-lifecycle-2026-10-15.json,scripts/console_lifecycle.py):- it advances about 44,000 steps/s, timed by the worker, at about 133 MB of app memory;
- a cancel ends the job in
cancelled; - a Device Portal stop suspends the app with a checkpoint, and after a restart and a resume
the job completes bit for bit with the CPU oracle.
Two worker races were found and fixed on the way:
- a Device Portal read of
status.jsonmade the atomic status replacement fail, so the
worker now retries for up to a second and writes progress at most four times a second; - a control file still uploading was parsed empty, so it is now read on a later pass.
result.jsonnow records the advance's wall time and steps. -
Series S GPU parity (#39, #40): on a Series S in Dev Mode the DX12 lane matches the CPU
oracle bit for bit on all 12 version-1 acceptance fixtures (adapterSraKmd_arden,
docs/evidence/series-s-gpu-parity-2026-10-15.json,scripts/console_gpu_parity.py). The
worker had refused to launch (0x80070002): it is now a minimal XAML application whose
declaredFlymsg.AppshipsFlymsg.winmd. Version-2 fixtures on the GPU, the console
lifecycle, memory and throughput remain. -
T4/T5 v4 (#140): robust neither. The dark anchor settles, and a 16-fold lamina → medulla
gain at an LMC rate of 200 Hz brings the graded medulla to about ±10 mV, the order of the
measured swings, but where T4 fires in thousands it lacks the preferred polarity and
direction (indices −0.15 to 0.18) and T5 is neither
in all 12 configurations (results/t4t5/v4.executions/7a550844…/output/). -
Looming → giant fiber timing v1 (#34, G3): uninformative, the no-go. In all 15 gain cells
and 300 runs the model's giant fiber fires, so no cell stays graded like the recordings and
none is scored; the recordings were not opened. One disc through LC4 or LPLC2 at the lowest
gains fires it, early in the expansion (results/gf_looming/v1). -
Looming → giant fiber timing v2 (#34, G3): uninformative.
- Model. With passive giant fibers, all 15 cells respond, stay graded and are scored. α
is 1.39 to 2.13; ten cells lie inside the stimulus-follower band (1.73 to 2.01), so the
passive giant fiber peaks as its drive does. - Data. The ten control flies give a median α of 3.32. Three flies sit at the onset slope,
so the flies' interval (2.95 to 12.58) holds the onset slope 11.43, and the timing cannot
separate the circuit from a stimulus-locked peak. - Outside the verdict. The model's α lies below the flies' interval in every cell
(results/gf_looming/v2).
- Model. With passive giant fibers, all 15 cells respond, stay graded and are scored. α
Validation
-
APL claw contrast lock (#85):
validation/apl_claws.yamlv1,flymsg apl-claws [--run],
evidence recordapl_claw_odor_contrast.- Design. Arms
on(default) andoff(every APL synapse removed), driven by the KC
sparseness locks' DoOR odors, seeds 420–424. Per seed, the OCT/MCH contrast of the KCs'
mean depolarization in each arm against the ALPNs' spike contrast in arm on; scored on the
seed medians: pass if blocking APL raises the claw contrast and brings it nearer the
boutons', partial if it only raises it, fail if it does not raise it, uninformative if
the PNs carry no positive contrast. - Status. Scored, locked before any run. No run yet.
- Design. Arms
-
Simple baselines lock (#148, SF2):
validation/baselines.yamlv1,flymsg baselines [--run].- Design. The battery's eight responses run on the measured connectome and on 199
degree-preserving shuffles (seeds 4000–4198), seeds 0–4. Per response, an empirical p in
the locked tail, Holm-corrected, decides whether the response needs the measured
partners. - Status. A report, not a score. No run yet.
- Fix. The timestep convergence entry of 0.8.47 and
docs/validation.mdcounted ten
battery responses; the battery has eight.
- Design. The battery's eight responses run on the measured connectome and on 199
-
Looming → giant fiber timing v2 lock (#34, G3):
validation/gf_looming.yamlv2. Version
1's model fired the giant fiber in every cell, and a model-only probe found it firing at gains
4 to 32 times lower; v2 makes the two giant fibers passive (threshold out of reach) so their
potential integrates the drive as a graded recording. Everything else is v1's; seeds 350–354.
No run. -
Pulse vs sine song lock (#36, first held-out benchmark of M4):
validation/song.yamlv1,
flymsg song [--run].- Johnston's organ JO-A, JO-B and JO-D get the same number of kicks in a pulse train
(16/20 ms, Pacheco et al. 2021), a sine and an aperiodic train. Per neuropil, the
synapse-weighted activity gives a pulse/sine preference sign. - Scored against the paper's per-fly response magnitudes in 16 male flies, with balanced
accuracy against permuted signs and 99 degree-preserving shuffles. A model-only no-go runs
before the data are read. - Secondary weighting by Yamakoshi et al. 2025's JO-A/JO-B ratio, reported only.
- Four evidence records. Locked before any response value was read. No run.
- Johnston's organ JO-A, JO-B and JO-D get the same number of kicks in a pulse train
-
Looming → giant fiber timing lock (#34, G3):
validation/gf_looming.yamlv1,
flymsg gf-looming [--run].- LC4 driven by the disc's angular velocity and LPLC2 by its size (engineered forms, gains
scanned on a 4 × 4 grid). The model's DNp01 peak time before collision is fitted as
α · r/v − δ, against the same fit of Dombrovski et al. 2025's giant-fiber recordings
(Zenodo, CC BY 4.0) at r/v 10–80 ms. - Timing only, never amplitude; only cells where both model giant fibers stay graded are
scored, and a fly interval overlapping the slopes of stimulus followers makes the run uninformative. A
model-only no-go runs first. Two evidence records. Locked before the files are downloaded,
except what an agent had opened during the search (recorded). No run.
- LC4 driven by the disc's angular velocity and LPLC2 by its size (engineered forms, gains
Engineering
-
Batch jobs and the console as a backend (#40).
- Batch format. Several runs of one network travel as one base fixture and exact per-run patches (
native.export_batch), so the network is uploaded once. - Worker. It runs them in order, keeps each run's output and resumes after the last completed one.
- Library.
flymsg.consoleturnssim.runcalls into such a batch on the Series S, and the decoded results aresim.run's, bit for bit. - Baselines.
flymsg baselines --backend consoleruns each graph's battery that way, and--backend hybridadds the console to the CPU workers on one queue (parallel.imap_shared).sensitivity.measureaccepts results from any backend. - Export cost. The network's edge order is computed once per batch.
- Memory. Batches export one run at a time, and outputs are decoded on demand.
- Qualification. One graph's battery on the whole connectome, 30 runs, matches
sim.runon the console in every run. - Cost. The console's advance (70 s) is about one host core's (46–62 s). End to end, returning whole states makes a batch take 243 s, so the SF2 run stayed on the CPU (
docs/evidence/series-s-battery-2026-10-15.json).
- Batch format. Several runs of one network travel as one base fixture and exact per-run patches (
-
The 3D viewer on an Xbox.
- TV layout. It is on by default in a console's browser, or with
?tv=1: larger text in the title-safe area, the panel closed, and controller hints. - Controller. A game controller drives the view (
gamepad.js, standard mapping): the sticks and triggers rotate and zoom, A plays or pauses, LB and RB step a bin, Y resets the view, X clears the selection, and View opens or closes the panel. - From the worker. The worker opens the viewer with Y, or when the host uploads
open_viewer.json, at the address inLocalState/viewer.json. - Not on a Series S. Edge there has no WebGL, so the page loads but draws nothing. The TV layout also starts leaner (1 M triangles), because the console's tab was stopped for memory at the desktop defaults.
- Native replays.
flymsg viz --nativenow takes the stimulus from the fixture's own input.
- TV layout. It is on by default in a console's browser, or with
-
Viewer replays native and console runs:
flymsg viz --native OUTPUT FIXTUREturns a
nativeoutput.bininto the viewer's replay (native.as_result,native.stimulated), so a
run computed on the Series S can be watched in the browser. -
B6 v2 pose contract (G1, #178):
flymsg.pose(flymsg.embodiment/v2) types world,
body, eye and eye-map frames in SI units with (w, x, y, z) quaternions, a body state with
velocities, eye mounts read from FlyGym 2.1.0, a no-future-pose clock lookup, actuators by
compiled MuJoCo id that still refuse through the motor map, and a canonical JSON trace. No
body is wired; M0 v1 is unchanged. FlyGym's defaultfusestaticcompile moves both eye
cameras of a simulated fly 0.44 mm to the thorax origin; the mounts are read without it. -
Geometric optics onto measured columns (G2, #179):
flymsg.opticsturns dark spheres and
a B6 v2 pose into per-column angle, angular radius and its rate, angular velocity relative
to the eye, acceptance coverage and the first sphere on each axis; no photoreceptor gain, no
viewer. The micro-CT → NeuroMechFly head registration is unmeasured, so the real eye needs a
sourcedRegistrationfirst. The planar Rice coverage is within 0.0076 of the spherical
integral at 8.23° acceptance. -
Body-wiring ADR and G5 groundwork (#178, #180):
docs/adr-body-wiring.md(accepted)
fixes one clock and one causal order for a 3D body through B6 v2.flymsg.closedloopimplements it without a body: the schedule, a per-component evidence
gate, intact/disconnected/shuffled/replay/silenced arms, replay parity and a
flymsg.closedloop/v1record.- A biological run refuses unless registration, transducer, motor map and body are all
measured; none is today. Tested on a toy circuit and body only.
-
G5 adapters and checkpoints (#180):
closedloop.opticalturnsoptics.sampleinto the
per-column stimulus;flymsg.flygym_bodyputs NeuroMechFly behind the closed-loop body
adapter (SI units at the boundary, contacts per fly body); runs checkpoint and resume, and
a resumed run equals the uninterrupted one, also on NeuroMechFly. Synthetic only.
optics.config_sha256is public. Architecture note aligned (modules, solved pain points,
B6).
Documentation
- Leads for the sensorimotor gates (#179, #34, #19, #35): no published head-to-thorax
registration for the micro-CT eye map; no deposited LC4/LPLC2 firing rates, but the giant
fiber's looming responses at four r/v values are on Zenodo (CC BY 4.0, Dombrovski et al.
2025), so a giant-fiber-scored transducer no longer waits for a data request (disc sizes and sex still to be read; not an LC4/LPLC2 rate); no source names a
motor neuron or muscle with a FlyBody actuator, and FlyGym 2.1.0 ships a front-leg muscle
model.