Repository navigation
Releases: gianlucamazza/flymsg
Release list
v0.8.48
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 ...
- Batch format. Several runs of one network travel as one base fixture and exact per-run patches (
v0.8.47
Result
- Timestep convergence v1: converged (SF2, #148). All ten battery responses converge at the
default 0.1 ms against 0.025 ms: same holds verdicts, seed-median rates within the finest
seed range (giant fiber → TTMn exactly at it). First-spike latencies and recruitment of weak
pathways move with the step (TTMn under giant fiber output 35 → 82 ms, sugar-recruited
neurons 439 → 155) and do not decide. Run from the lock commit7c4d34din one attempt.
Also in this release
- Validation: T4/T5 v4 locked (dark-anchored medulla, lamina → medulla gain scan, Behnia et al. 2014's delays; run in progress); timestep convergence lock.
- Engineering: faster per-neuron membranes, bit-identical.
- Viewer: graded potentials in the 3D replay and the
eye-onscene; an optional, experimental WebXR observer (?xr=1, unqualified on any headset). - Docs: replication package (SF5) with the claims audit; the sensorimotor environment plan; provenance and docs aligned.
Full note: https://github.com/gianlucamazza/flymsg/blob/v0.8.47/CHANGELOG.md
v0.8.46
Result
-
Kenyon cell sparseness v8: within, only with the variant set; v7 replicates (#85, #95,
#155). Under the exact continuous clamp (Taylor action) with seeds 95–97, 8 of 10
lLN2T+lLN1_bc arms are within (2.0–2.3% / 1.4–1.7% of Kenyon cells); the two E arms out miss
the 64.6% overlap bound at 65–66%, where v7 lost one. lLN2T alone is not within (16–23% of
Kenyon cells, 80–96% shared). Every arm is within 19 cells of its v7 count and coupling moves
none by more than 21. Run from the lock commitad7b71ein one attempt (35 min). -
T4/T5 v3: robust: neither (#140, #84). With Mi1, Tm3, Mi4, Mi9 and C3 graded over the in
vivo voltages of Groschner et al. 2022, no T4 neuron spikes in any of 25 configurations. The
edge reaches the medulla at ≤1.4 mV (at most about 5% of the measured swings), with the
measured sign only in Tm3, C3 and Mi9; tonic lamina release holds Mi1 below its release
threshold from an LMC rate of 100 Hz. Run from the lock commit406f622in one attempt. The
archive guard rises to 250 kB for its 202 kB of required tables. -
Kenyon cell sparseness v7: within, only with the variant set (#95, #85). With
lLN2T+lLN1_bc (43 neurons) as eLNs, 9 of 10 arms are sparse and distinct: 2.0–2.2% /
1.5–1.7% of Kenyon cells, 43–65% shared (one arm misses by 0.5 points of overlap). With
lLN2T alone, the set Eckstein et al. 2024 liken to the eLNs, Kenyon cells stay dense
(16–23% / 14–19%, 79–96% shared). Coupled arms match their uncoupled bases within 17
cells: removing the chemical cholinergic contacts onto PNs separates the sets, not the
electrical coupling. Run from the lock commit45c0641; the unread v6 step store was lost
with its worktree. -
Synapse weight rule v1: undecided (#139). On Liu et al. 2022's 57 PN → LHN pairs of
six matched LHN types, density (count over mesh area) ranks the measured amplitudes
barely better than count (Spearman 0.581 against 0.567; Δρ interval −0.011 to +0.054);
count stays the rule. MaleCNS counts rank the female amplitudes at ρ 0.81 on the 13 nonzero
pairs.
Also in this release
- Engine: Taylor solver for the continuous refractory clamp (
Gap(solver="taylor"),flymsg.gap/continuous-clamp-taylor-v1), exact to rounding without a dense map per mask; ADR accepted. - Validation: evidence records for sourced parameters (
validation/evidence.yaml, SF1); lock parser subset 2 (quote-aware comments, quoted list items, no duplicate keys); locks for KC v6–v8, T4/T5 v3 and the synapse weight rule. - Body: neuron-level MANC matches recorded, not used.
- Viewer: a committed baseline of the live scenes with
scripts/bench_check.py. - Docs: a drift audit of every page; the runtime ADR is accepted.
Full note: https://github.com/gianlucamazza/flymsg/blob/v0.8.46/CHANGELOG.md
v0.8.45
Result
-
T4/T5 through the eye v2: robust: neither (#84, #97). With graded photoreceptors and
L1–L3 over 17 configurations of the measured voltage ranges, no T4 or T5 neuron spikes.
Contrast crosses the lamina (L1–L3 hyperpolarize by 14–33 mV under light) and stops in the
medulla: Mi1, Tm3 and Mi4 never fire, the OFF inputs only at LMC release rates of
200–400 Hz. Run from the lock commit17173c2, resumed once from saved configurations. -
Kenyon cell sparseness v5: none (#95, #85). With the measured asymmetric eLN ↔ PN
coupling, sister PNs at 0.013 and eLN spikes crossing as 40 mV spikelets of 0–2 ms, every
coupled arm stays silent (0.22–0.30% of Kenyon cells, floor 1%), as without coupling, and
the spikelet duration does not change it. At the measured coefficients the coupling is not
the missing excitation. Run from the lock commit00aff9c, resumed once from saved arms. -
Kenyon cell sparseness v4: none (#95, #85). With the cholinergic local neuron → PN
contacts as electrical synapses (coupling 0–1, sister PNs at Kazama & Wilson's 0.013), no
arm is sparse: Kenyon cells stay at ≤ 0.3% and fall silent as coupling grows. Coupling
that passes only subthreshold potentials drains active PNs. The fly's lateral excitation
rides on eLN spikes (spikelets). This run carried none: its lock set no spike term, and a
LIF reset draws no waveform.
Also in this release
- Engine: per-neuron membranes (
sim.Membrane), a postsynaptic weight scale (post_scale, density rule), spikelets and asymmetric junctions, graded neurons, native fixture v2, continuous refractory clamps and immutable runs. All optional; the default model is unchanged. - Body: MANC's muscle cited for 406 of 708 MaleCNS motor neurons (
flymsg muscles); closed loop cutting input at takeoff. - Viewer: phones and tablets; a scene caption and a legend that names each group's contents.
- Docs:
docs/approximations.mdanddocs/leads.md. - Engineering: the command line is a package (
flymsg.cli).
Full note: https://github.com/gianlucamazza/flymsg/blob/v0.8.45/CHANGELOG.md
v0.8.44
Result
- NeuroMechFly jump v1: short (#90, #94). LC4 on both sides drives
TTMn_Rbefore
TTMn_L; the body takes off at 28–32 ms but at 0.05 m/s, a range of 0.3–0.5 mm against
Zumstein et al.'s 28.6–37.75 mm. One leg, one twitch and no TLM are not a jump.
Body
- TTM actuator and a NeuroMechFly jump (#90, #94):
flymsg.ttm(measured twitch: 101 µN,
8.2 ms, 0.85 ms delay) andflymsg.jump3d(FlyGym v2.1.0, now a dependency: TTM torque on
the mesothoracic coxa-trochanter hinges, posture held, 0.1 ms steps). Lock
validation/jump3d.yaml: LC4 on both sides → TTMn spikes → jump range against Zumstein et
al.'s wingless 28.6–37.75 mm;flymsg jump3d.
Full note: https://github.com/gianlucamazza/flymsg/blob/v0.8.44/CHANGELOG.md
v0.8.43
Result
-
T4/T5 v1: neither (#84). Photoreceptors fire through the measured eye, but L1–L3 and
everything downstream stay silent: inhibitory photoreceptor synapses cannot move silent
spiking lamina neurons, where the fly's are graded with a resting tone. The concrete case
for graded neurons (#97). -
Kenyon cell sparseness v3: none (#95, #96). With Hige et al. 2015's odors as DoOR
vectors the model is either dense (default 36% / 30% of Kenyon cells, 82–99% shared, against
30–33% measured) or silent (0.2% without the chemical local neuron → PN contacts). The
sparse regime needs the measured electrical coupling the model lacks (#85).
Pre-registration
-
T4/T5 direction selectivity v1 (#84): moving ON/OFF edges in four directions through
the measured eye (eye.edge_coverage), 30°/s, acceptance 8.23°; decides polarity and
preferred direction against Maisak et al. 2013, prior from Lappalainen et al. 2024 stated.
Locked before its run;flymsg t4t5. -
Kenyon cell sparseness diagnostic v3 (#95, #96): Hige et al. 2015's odors (3-octanol,
4-methylcyclohexanol) as DoOR receptor vectors, the same four arms, seeds 80–82, and a
lower bound (1%) next to the upper ones; the shared share is reported against the 30% and
33% measured for these odors. Locked before its run.
Odors
flymsg odor(#96): DoOR consensus responses (fetched at run time, CC BY-SA 4.0, not
redistributed) as one response per MaleCNS ORN type, and per-neuron Poisson input
(odors.kicks). 3-octanol drives 31 ORN types, 4-methylcyclohexanol 22.
Full note: https://github.com/gianlucamazza/flymsg/blob/v0.8.43/CHANGELOG.md
v0.8.42
Result
- Partner follow-up v1 (#76): the left mirror
replicates(DNp02 p 0.001, DNp06 p 0.003),
and the direct drive givessingle_sufficient: DNp06_R: at 200 Hz DNp06_R alone brings
TTMn_Rto the jump bit (3–6 spikes), DNp02_R alone does not (0), the pair gives 8–11
against a matched null mean of 0.013 (p 0.001). Conjunction rejected; figure
partner-followup.svg; outputs with every null draw inresults/partner-followup/v1/. - Kenyon cell sparseness v2: within E, F, by undershoot (#95). Without the cholinergic
local neuron → PN chemical contacts (electrical in the fly) one ORN type drives 4.5% of the
PNs instead of 73%, and the Kenyon cells fall to 0.2% (measured 6 ± 5%): the overlap was an
antennal-lobe artefact, and single-receptor stimuli no longer reach the Kenyon cells. The
lock had no lower bound; stated. Next: odors as receptor vectors (#96). - Kenyon cell sparseness v1: not_recurrence (#95). KC → KC without fast effect lowers
the responding Kenyon cells from 25% to 17.4% (bound 17%), but the two odors still share
95%; APL removal recruits all. The overlap is upstream of the Kenyon cells. - KC → MBON11 depression v1: inconsistent (#85). The measured rule silences MBON11 for
both odors (272–286 → 0 spikes, seeds 50–52): each odor recruits about 1,000 Kenyon cells
and the two share 95%, against 30–33% in the fly. The model's Kenyon cell code is not
sparse, the same limit as the held-out ORN_DM1 failure. Nothing is retuned.
Documentation
- Realism plan in
docs/roadmap.md: five steps (eye, Kenyon cell sparseness, odors as
receptor vectors, body and TTM actuator, non-spiking neurons), each with its evidence and an
independent test; tracked in #84, #95, #96, #90, #94, #97. docs/roadmap.md(on the site as Roadmap): what of the brain the model uses and leaves
out, in numbers fromscripts/brain_coverage.py(signs, the FlyWire cross-check of the
unsigned neurons, somata, photoreceptor columns), and every open item with what blocks it
and what would unblock it. New issues #84 (eye encoder) and #85 (electrical synapses and
neuromodulation, evidence audit).
Eye
- Graded photoreceptor input:
eye.photoreceptor_kicks(gain × light left per column, in
units of the Poisson kick).sim.runalready accepted real-valuedkicks; it is now
documented and tested (integer values as floats reproduce the Poisson run spike for spike).
CpuRuntimeand the native executor still take integer counts only. - Looming per column:
eye.looming_radius_deg(constant-speed approach, von Reyn et al. 2014) andeye.disk_coverage(share of each column's Gaussian acceptance profile covered
by a dark disk, exact in the small-angle limit). The acceptance angle is an argument for
the lock to source, not a default. flymsg eye(#84): every MaleCNS optic-lobe column gets a measured viewing direction
from the Zhao et al. 2025 eye map (fetched at run time, GPL-3.0, not redistributed) through
the published hex convention; nothing is fitted. 843 of 892 right and 835 of 875 left
columns have one. Photoreceptors are assigned to columns by their strongest output; the
dorsal-rim R7d/R8d land at a median elevation of 67.7° against 3.7° for the other R7/R8.
New dependencyrdata(MIT) to read the R files.
3D view
- Whole-CNS layer: every soma in the volume (140,024 of 165,122 neurons) drawn as a point
coloured by region around the scene's neurons, fromsomaLocationin the MaleCNS
annotations (scripts/build_somata.py,docs/live/cns/). Context only;?somata=0hides
it. Sensory neurons, whose somata are in the periphery, are counted, not drawn.
Tooling
- GitHub templates: a pre-registered experiment issue form (question, sources,
protocol and verdicts, what was seen before the lock, compensations), a bug form, and a PR
checklist with the project's rules. Labelspreregistration,result,architecture,
embodiment. scripts/bench_viewer.py(#24): builds the site, opens each scene with?bench=in a
fresh browser profile and appends the summary, the GL backend and the load average to
runs/viewer-bench/. It refuses to start above a 1-minute load of 1.0, so a baseline is
taken only on an idle machine, and a timed-out page no longer leaves its browser running.
Live scenes
- Every scene re-exported from
main(8f2a076): the manifests of the scenes made before
the rule pointed at branch commits that squash merges dropped; now all record a commit on
main. Activity is unchanged byte for byte. - Left eye and both eyes on the site:
looming-left(LC4_L),looming-bilateral
(LC4) and theright-vs-leftcomparison, exported frommain. Seed 0:TTMn_R22
spikes with the right eye,TTMn_L12 with the left, 24 and 12 with both.docs/viz.md
states the side convention.build_live_scenes.py NAME ...rebuilds only those scenes.
Pre-registration
- Kenyon cell sparseness diagnostic v2 (#95): after v1, an antennal-lobe arm. Cholinergic
local neuron → PN contacts are electrical in the fly (Yaksi & Wilson 2010) and fast chemical
in the model; v2 removes them (arm E), alone and with KC → KC (arm F), on fresh seeds 70–72,
same measured bounds. Locked before its run. - Kenyon cell sparseness diagnostic v1 (#95): four weight matrices (default; KC → KC
without fast effect, since these synapses act through the metabotropic mAChR-B, Manoim et
al. 2022; APL → KC removed; both) compared on the share of Kenyon cells responding to an
odor (measured 6 ± 5%, ≤ 17%) and the share shared between two odors (≤ 64.6%). Locked
before any run;flymsg kc-sparseness. - Dopamine-gated depression at KC → MBON11, v1 (#85): the one plasticity measured on an
identified synapse (Hige et al. 2015: −90% charge, forward pairing only, ≥ 40 min) as an
optional rule applied between trials to the weight matrix; the kernel and the defaults are
unchanged. Seven compensations named; the test asks whether the paired odor's MBON11
response drops ≥ 49.8% and the unpaired ≤ 64.6%.flymsg mb-plasticity. - Residual partner follow-up v1 (#76): two model-side tests of the scan v3 naming,
locked before any run on fresh seeds 40–42. Left: the scan arm mirrored (LC4_L→
TTMn_L), testing only DNp02 and DNp06 with the scan's null. Drive:DNp02_R,DNp06_R
and the pair driven directly at 200 Hz without LC4, against matched descending-neuron
pairs, with the verdictssingle_sufficient,conjunction,pair_sufficient,
not_specificandinsufficient. Every null draw is kept.flymsg partner-followup.
Exploratory
- Mirrored scan arms (
scripts/silence_mirror.py, seeds 0–2, disclosed in the lock):
the left side follows the right (DNp02 or DNp06 with DNp01 silenced: 0TTMn_Lspikes),
the effect follows the pair on the side of the stimulus, and the left residual is weak
(2, 1, 3 spikes).
Full note: https://github.com/gianlucamazza/flymsg/blob/v0.8.42/CHANGELOG.md
v0.8.41
Result
- Residual partner scan v3 replicates v2 (#20): names_partner: DNp02, DNp06 again, on
fresh confirm seeds 30–32 (0TTMn_Rspikes on every seed, p 0.001 each against 0.025).
The run started from1bbf60eonmainand took 2 h 23 min. The descriptive output shows
the other pass still firing (DNp06 45–50 spikes with DNp02 silenced, DNp02 58–59 with DNp06
silenced) whileTTMn_Rstays at 0: in this modelTTMn_Rneeds both. Figure
silence-scan-v3.svg; outputs inresults/silence-scan/v3/. Model-side;
gf_required_for_the_jump_bitstaysunverified.
Pre-registration
- Residual partner scan v3, a replication of v2 (#20). Every rule of v2 unchanged,
confirm seeds 30–32 (the runner refuses the spent 10–12 and 20–22), a failure rule fixed
before the run, and one descriptive output: the other screen pass's spikes in each confirm
arm. Committed before the run. - Runs start from
main. A run a doc cites starts from a merged commit in a clean
worktree, since squash merges drop branch commits (architecture).
Reproducibility
results/holds the small outputs the docs cite (123 KB), copied fromruns/with
their manifests byscripts/archive_results.py, which drops local paths and refuses to
overwrite a differing directory.scripts/build_figures.pynow reads from it, so a clone
can redraw every figure; only the Kenyon cell figure still needs the MaleCNS tables.
Its CSV files were caught by the*.csvignore rule when #74 merged; they are now
tracked, and a test fails if git ignores any archived file.looming-jump.svgreplaces the hand-madelooming-jump.png: the same TTMn_R raster of
the behavior v1 run, now drawn by the script fromresults/behavior/replay.npz.
Full note: https://github.com/gianlucamazza/flymsg/blob/v0.8.41/CHANGELOG.md
v0.8.40
Figures and live scenes
- Every result of 2026-10-12 has a figure.
scripts/build_figures.pydraws SVG from the
run outputs withflymsg.figures(standard library only, deterministic): the scan v2
screen and confirmation (silence-scan-v2.svg), M1/M2 embodiment (embodiment.svg), the
Kenyon cell persistence of the held-out ORN_DM1 case (kc-persistence.svg, one
exploratory rerun of the scored corner) and the homology pilot (homology-pilot.svg).
Nothing is recomputed into a result. - Sensitivity figure redrawn with y ticks, the v4 floor (10 Hz) and a legend that no
longer covers a curve. - Two new comparisons on the site: DNp01 silenced against DNp01 + DNp02 and against
DNp01 + DNp06 (seed 0 replays of the scan arms).TTMn_Rgoes from 7 spikes to 0; DNp06
and DNp02 still fire when the other is silenced, so in the modelTTMn_Rneeds both. viz --keep NAMESexports chosen neurons even when silent (groupkept), so a
comparison shows them at zero instead of "not exported". All scenes were re-exported.
Full note: https://github.com/gianlucamazza/flymsg/blob/v0.8.40/CHANGELOG.md
v0.8.39
Results
- Sensitivity grid v1 (#28; a report, not a score). Over
w_syn× 0.8–1.2 andth_jump
0/2, looming, giant fiber, P1 and pIP10 hold in every cell but one corner, and bitter →
MN9 stays at a median of 0 Hz. Sugar → MN9 holds only from the defaultw_synup
(th_jump0) or from × 1.1 (th_jump2): its v4 pass sits at the edge. Persistent activity
appears only at the grid's edges. Nothing is chosen from it;sim.Paramsis unchanged.
Report indocs/validation.md, figuredocs/img/sensitivity-rate.svg.
Fixes
- The
holdstable offlymsg sensitivity --runprinted 1.0/0.0 instead of yes/no; the
v1report.txtreads that way,holds.csvis unaffected.
Full note: https://github.com/gianlucamazza/flymsg/blob/v0.8.39/CHANGELOG.md