Skip to content

Muscle-resolved VNC readout, and the rhythm question answered - #4

Merged
abgnydn merged 1 commit into
mainfrom
feat/muscle-resolved-vnc
Aug 3, 2026
Merged

Muscle-resolved VNC readout, and the rhythm question answered#4
abgnydn merged 1 commit into
mainfrom
feat/muscle-resolved-vnc

Conversation

@abgnydn

@abgnydn abgnydn commented Aug 3, 2026

Copy link
Copy Markdown
Owner

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.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 × 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.

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.

Glutamate sign

build_vnc.py signed 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.py deliberately 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/manc is not in the checkout, so vnc.bin was not regenerated. Re-run download_manc.shbuild_vnc.pywrite_manifest.pyupload_to_r2.sh, and re-verify walking afterwards — the drive constants in main.ts were tuned against the current blob.

Can this connectome walk? No — and now with a proof

tools/vnc_rhythm.py, reproducible against the shipped bin:

  • It does oscillate — 5–12 Hz, spectral prominence 58× to 1.8e5× 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 unreachable 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 (100× weight, 20× drive, 16× 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 anatomy (segment distance and ipsi/contra); residual after removing it is identically zero. The connectome is organised by proximity, not by gait. Pool-level averaging is the wrong lens; any future attempt needs per-neuron structure.

Verification

tsc clean · unit 5/5 · full e2e 34/34 on an idle machine.

🤖 Generated with Claude Code

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>
@abgnydn
abgnydn merged commit a872c26 into main Aug 3, 2026
1 check passed
@abgnydn
abgnydn deleted the feat/muscle-resolved-vnc branch August 3, 2026 06:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant