Muscle-resolved VNC readout, and the rhythm question answered - #4
Merged
Conversation
Three things: an instrumentation change, a builder fix that is inert until the blob is rebuilt, and the analysis that answers whether this connectome can walk. MUSCLE-RESOLVED READOUT. main.ts averaged each leg's ~60 motor neurons into one scalar, which cancels every flexor against its extensor by construction. vnc.meta.json already partitions the 369 leg motor neurons into 6 legs x up to 20 named muscle targets, and motor_by_target was loaded and never read. The readout now resolves per muscle and computes antagonist ratios for the three joints with a true pair in all six legs — tibia, femur/trochanter, coxa_twist — pooled per side and normalised, since the pools are lopsided (14-15 flexor MNs against 2 extensor at the tibia). tergotrochanter is excluded: it is the escape-jump muscle and does not belong in a walking drive. This is instrumentation only; driveLegs is untouched and nothing consumes the numbers yet. Measured live under a DNa01 stim: per-muscle values vary over time and differ between legs, so the signal is alive. GLUTAMATE SIGN. build_vnc.py signed glutamate -1 for every neuron. That is right centrally, where fly glutamate is inhibitory via GluCl, and wrong at the neuromuscular junction, where it is the excitatory transmitter. Motor neurons are now gated to +1. build_csr.py is deliberately unchanged — the brain has no NMJ. Scope, measured rather than assumed: of 709 motor neurons in the shipped bin, 580 (81.8%) carry sign -1. But that sign is read in exactly one place in src/ — a boot log line — and the weights motor neurons RECEIVE, which is what drives the readout, come from their presynaptic partners and are untouched. Motor neurons emit 0.126% of total synaptic mass. The maximal counterfactual moves the structural result 0.67% and the rhythm sweep not at all. This is a labelling and biophysics correction, not a dynamics fix. INERT UNTIL REBUILT: data/manc is not in the checkout, so vnc.bin was not regenerated. Re-run download_manc.sh, build_vnc.py, write_manifest.py and upload_to_r2.sh to land it, and re-verify walking afterwards — the drive constants in main.ts were tuned against the current blob. tools/vnc_rhythm.py answers the question the readout was built to ask, and the answer is no. Findings, all reproducible from that script against the shipped bin: - The network DOES oscillate — 5-12 Hz, spectral prominence 58x to 1.8e5x over background. An earlier claim that it never oscillates was wrong. - But it is global synchrony, not gait: all six legs peak at one frequency in phase, Kuramoto R_sync 0.475-0.910 against R_tripod 0.049-0.331, and across every probed setting the best-fitting 3/3 split of the legs was never the true tripod. - Tripod alternation is not reachable by tuning, and this is a proof rather than a failed search: the excitatory fraction is 0.517-0.632 in all 36 leg-pair couplings, so nulling across-tripod coupling needs an inhibition multiplier above 1.716 while keeping within-tripod positive needs it below 1.326. The interval is empty. - 600-setting sweep (100x weight, 20x drive, 16x E/I): 0/600 whole-leg rhythm, 0/600 muscle-resolved under the strict criterion. Resolving antagonists does not reveal a hidden rhythm — that hypothesis is dead. - The tripod signal in the wiring is fully explained by segment distance and ipsi/contra; residual after removing anatomy is identically zero. The connectome is organised by proximity, not by gait. Pool-level averaging is the wrong lens, and any future attempt needs per-neuron structure. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three things: instrumentation, a builder fix that is inert until the blob is rebuilt, and the analysis that answers whether this connectome can walk.
Muscle-resolved motor readout
main.tsaveraged each leg's ~60 motor neurons into one scalar, which cancels every flexor against its extensor by construction.vnc.meta.jsonalready partitions the 369 leg motor neurons into 6 legs × up to 20 named muscle targets, andmotor_by_targetwas loaded and never read.The readout now resolves per muscle and computes antagonist ratios for the three joints with a true pair in all six legs — tibia, femur/trochanter, coxa_twist — pooled per side and normalised, since the pools are lopsided (14–15 flexor MNs against 2 extensor at the tibia).
tergotrochanteris excluded: it is the escape-jump muscle and does not belong in a walking drive.Instrumentation only.
driveLegsis untouched and nothing consumes the numbers yet. Measured live under a DNa01 stim: per-muscle values vary over time and differ between legs.Glutamate sign
build_vnc.pysigned glutamate −1 for every neuron. Correct centrally (fly glutamate is inhibitory via GluCl), wrong at the neuromuscular junction where it is excitatory. Motor neurons are now gated to +1.build_csr.pydeliberately unchanged — the brain has no NMJ.Scope, measured rather than assumed. Of 709 motor neurons, 580 (81.8%) carry sign −1 — but that sign is read in exactly one place in
src/, a boot log line, and the weights motor neurons receive come from their presynaptic partners and are untouched. Motor neurons emit 0.126% of total synaptic mass. The maximal counterfactual moves the structural result 0.67% and the rhythm sweep not at all. This is a labelling and biophysics correction, not a dynamics fix.Inert until rebuilt:
data/mancis not in the checkout, sovnc.binwas not regenerated. Re-rundownload_manc.sh→build_vnc.py→write_manifest.py→upload_to_r2.sh, and re-verify walking afterwards — the drive constants inmain.tswere tuned against the current blob.Can this connectome walk? No — and now with a proof
tools/vnc_rhythm.py, reproducible against the shipped bin:Verification
tscclean · unit 5/5 · full e2e 34/34 on an idle machine.🤖 Generated with Claude Code