Fruit Fly
Commits
Every published commit of this world, on every branch, newest first.
83f1b94a8113759 reviewer: remove the publish check note553389388313759 reviewer: confirm the world publishesf128e8cf0413759: remove the publish check noted0ebb5548813759: confirm publishing from the refusing state684e2b578a13759: remove the publish check noted5c04e860b13759: confirm the world publishesb7758702b4plan: Fruit Fly, the instrument pass
---
FoodPatch: re-stage the composite so its manifest row is a composite
---
vcs: re-stage every composite root so its manifest row is a composite and the world publishes again
---
plan: Fruit Fly, the instrument pass: the first-experiment card watches MN9 by name
---
fly: an arena the fly cannot leave, per-eye looming, a turn, no floating, and the fly's own sound
The fly meets the arena wall through its own circuits: each compound eye reads
the wall off its own optical axis, so the wall is a looming stimulus on the
side it is on, and the body is clamped at arenaRadius as well. Looming is
split into independent LPLC2 and LC4 drives per side, so silencing one leaves
the other driven and the guide's ablation has an answer.
The fly turns. MaleCNS v1.0 labels a side on the leg motor neurons (189 left,
185 right) and on DNa01/DNa02, so the turn is the descending pair's difference
plus the legs on one side carrying the body further than the other's. It
labels the tarsal and labellar taste neurons side unknown, so taste stays one
unsided drive and the per-foot sugar readings are reported as what they are: a
fact about the body, not about the connectome.
Beating wings lift the fly only once it is off the ground, so a loom no longer
floats it with its legs frozen. onFeed fires once per meal. Every drive the
fly sets is filed under the source fly and quantised, so it stops rewriting
the network every frame. Each sense is resolved to its neurons once.
The body reads as a fly: banded abdomen with the bands on the surface,
laid-back translucent wings on a new wing material, eyes on a smooth eye
material, antennae reaching forward and down. Body:destroy takes down only
what it built.
Sound: a seamless 220 Hz wingbeat bed following the wing motor neurons, a wet
tick for a mouthful, a dry thump for a hop, all synthesised as pcm.
FoodPatch drops the inert bitter field. MaleCNS labels no bitter gustatory
neuron, so there was no honest cell type behind it.
---
lab: a floor that takes a shadow, the specimen on a plinth, a 12 m arena ring, haze and a vignette
The world becomes a place. The ground carries fruitFly.labFloor, a matte mid
grey at roughness 0.6, and is 400 across so its far edge sits within a degree
of the horizon. The sun is warm at 2.6 and about 44 degrees of elevation, the
ambient fill is sky blue at 0.22, and the directional shadows run at softness
0.55 with a 60 unit range, so every body in the arena is grounded by its own
shadow for the first time.
Brain moves to (0, 4.2, 16.3): in front of the spawn camera, high enough that
the lowest neuron of the ventral nerve cord sits at y 1.27 and the optic lobes
clear the horizon. Plinth is a 4.8 by 1.8 drum under it in the floor's own
material, clear of the ring. BrainLabel captions it with the dataset, the
counts and the scale the cloud is drawn at. ArenaRing is a new flat annulus
mesh at radius 12, the arenaRadius the fly keeps to, lying on the floor.
Look carries the new FruitFlyLook component: the lighting intent, the shadow
config, a depth haze registered as fruitFlyHaze and a vignette as
fruitFlyVignette, both on the scene layer, all as Fields. The two passes cost
0.020 and 0.016 ms of GPU.
Bitter becomes Food3 at sweetness 0.25. Experiments and FirstRun are added per
slice D's handoff. The scene README says what the scene holds and which entity
is which, build.luau states the room without the scaffold's lamps and crate,
entrypoint.luau keeps no commented scaffold, and the no-op Brain override is
gone.
Science unchanged: gain 0.6, minSynapses 5, every Shiu constant, dropped 0.
Taste oracle after the move: claw_tpGRN at 100 Hz gives MN9 125.0 Hz and
Kenyon cells 0.054 Hz; the JO- control gives MN9 0.0 and Kenyon cells 34.1 Hz.
---
lab: render the labFloor material preview
The material type requires a preview.png and assets.generatePreviews reports
three enqueued, then zero pending, zero done and zero failed, and writes no
file. This one is a 256 px isolated capture of a sphere carrying the material,
saved to the asset folder.
---
lab bench: laid out from the live screen, readable, reachable from every input family
The bench reads its size from ui.screenSize() and caps its body, so eleven
groups leave it 639 px tall instead of 930. Group colours come from a hash of
the group's own name, so adding one never recolours the rest. Every readout
draws to its own full scale with that scale printed, the trace carries a zero
line, gridlines named in Hz and a time axis on a square root scale so a group
at 4 Hz stays visible beside one at 130, a group of 32 neurons or fewer gets a
raster, every row carries an x that stops watching it, and groups at zero
collapse into one line.
New blocks: the ten hottest cell classes, the drives that are live and who set
them, a neuron panel for whatever the pointer picks in the cloud, eight chips
for the cell types this bench is used on most, and a legend for the cloud's
superclass colours. The state line says when activity is recurrence with
nothing driven.
The selection grammar moves to selection.module, where repeated keys merge and
class, super and side take comma lists the way type already did, so
'type:MN9 type:DNa01' names four neurons and 'class:Kenyon_Cell,MBON' names the
union.
lab.inputMap carries the bench's own controls on keyboard, gamepad and touch:
toggle, focus next and previous, activate, nudge a slider, identify a neuron.
The focused control draws a 2 px outline, so the whole bench is reachable with
a pad alone or a keyboard alone, and a Lab button sits bottom left for a
finger.
---
fly: a component that survives its neighbour's reload, wing veins, material previews
The readouts and the sense index cache are keyed on the network's own
identity, so a brain that reloads is re-armed rather than talked at through a
dead handle, and the brain component is looked up again every half second
instead of held for the session. Drives are re-asserted five times a second,
so a clear from the bench or a protocol no longer leaves a fly standing on
sugar tasting nothing.
Each wing gets its costal vein. A membrane that clear has no silhouette
against a bright sky, and the vein is what the eye reads a wing by. Rendered
previews for the wing and eye materials, which the publish gate requires.
A body and a sound rig each reclaim their own parts by name when they are
built, so a script reload stops leaving a second thorax and a fourth wing
standing, and each teardown checks an entity still exists before destroying
it.
---
brain: the cloud is registered only while it can be seen, and it is cheap
The neuron cloud is split into buildCloud and setCloudDrawn, so the draw can
be dropped and put back without touching the buffers, and FruitFlyBrain tests
the cloud's bounding sphere against the on-screen camera every three frames
with thirty frames of hysteresis. Measured on this world: mesh_transform_compose
4.74 ms a frame registered, 0.67 ms with the draw down, and the frame average
goes 20.99 to 16.73 ms.
Only the 139,741 neurons that have a soma get a slot now, down from 164,587,
which needs the new cloud_gather kernel to copy each slot's activity out of
the neuron it draws. The fill is spread over frames from a task, so building
the cloud costs about a millisecond a frame for a second rather than one
frame of 318 ms, and the cloud re-origins from the records when the entity
moves instead of rebuilding.
A selection is answered from index buckets built once at load and memoized:
the six timed terms go from 6.0 to 8.8 ms down to 0.42 ms cold and 0.007 ms
warm, with the same counts (50 / 595 / 4064 / 1314 / 185 / 126).
Drives carry the name of whoever set them and a neuron sees the largest rate
any source asked for, so the fly cannot clobber the bench. A watch that would
need a fourth readout group on any neuron is refused with a message naming
the groups it holds, instead of silently evicting one; unwatch frees the
slots and the group id. New: drives(), classRates(), groupActivity(),
neuronAt(), setCloudOrigin(), keepCloudDrawn(), setMaxStepsPerFrame().
timeScale and maxStepsPerFrame join Params, load rejects an unknown key the
way setParams does, and the component's Field defaults are the calibrated
regime (gain 0.6, minSynapses 5, timeScale 1, maxStepsPerFrame 32).
The component registers the builtin bloom while the cloud is drawn, the
neuron material lifts rest to 0.12 and a spike to 9.0 with the rim term now a
property, and a crackle synthesised with audio.encodePcm plays from the Brain
entity at a level following the network rate, 0 at rest and 0.32 at 4.5 Hz.
Science unchanged: claw_tpGRN at 100 Hz puts MN9 at 125.0 Hz with Kenyon
cells at 0.06 Hz, prefix JO- leaves MN9 at 0 with Kenyon cells at 32.6 Hz,
dropped 0 throughout.
---
fly: the arena wall reads at full rate in whichever eye faces it
A wall the fly is right up against fills the eye that faces it, whatever angle
that eye's axis makes with the radius, so the stronger eye reads the full rate
and the weaker one reads its share of that. The asymmetry between the eyes is
what steers, and keeping it while the magnitude reaches the circuits that act
on it is what turns the fly away instead of leaving it walking the boundary.
Measured from a reset with the fly placed at radius 11.6: it sees the wall
(wall 0.63, 94 Hz in the left eye, DNp01 at 194 Hz), turns, and walks back in,
radius 11.63 to 10.90 to 10.17 to 9.48 to 8.90 to 8.40 to 8.00 to 7.73 over
seventy seconds, with a maximum of 11.67 and never reaching the clamp.
---
fly: each clip says what it is and how it was made
The three soundClips carried the scaffold README and empty metadata. Each now
names its own waveform, its length, why it loops or does not, and which moment
of the fly plays it.
---
experiments: no local shadows the color namespace, and the screen name says what it is
The readout-colour helpers held their swatch in a local named color, which
shadows the engine's color namespace for the rest of the scope. Renamed, and
the screen constant carries a line saying what it registers.
Diagnostics on the file: 0 errors, 0 warnings, 0 hints.
---
firstRun: the card's completion names who finished it, so a published scene cannot ship it pre-ticked
The completion was stored on the FirstRun entity as the bare string 'done'.
An entity attribute is authored state: it serializes into scene.json and is
published with the world, and the entity is shared by everyone in it. So the
scene this run committed carried 'done' and every visitor would have arrived
to a card with all four steps already ticked, which is the opposite of what
the card is for.
The value now names who finished, from multiplayer.getPeerId(), and a value
naming anybody else leaves the card standing. Verified by planting the bare
'done' on the entity and reloading the component: progress() reads all four
steps false and the card draws fresh, while finishing it stores 'done:peer2'
and puts it away.
---
fix: the bench you can reach, a fly that stays an animal, and a world that arrives with its brain in it
The bench's scroll body is virtual, so every control below the fold keeps a
real position instead of stacking on the last row the engine could place: the
whole Selection block, the neuron panel, the fly block and the legend were
painting on top of each other and could not be pressed. Selection now leads
the body, because it is the only block a person acts through. The hot-class
column is wide enough to tell four names beginning "mechanosensory" apart.
The trace draws at the resolution the plot can show and the window redraws six
times a second, which takes the bench's cost back to where it cannot be
measured against a closed one.
The scene shipped with the neuron cloud switched off, so the world opened on
an empty plinth. It is on. The experiments panel opens shut, so the first
thing a visitor meets is the brain rather than two panels over the whole
screen, and the stale completion attribute that would have handed everyone a
finished first-run card is gone. The brain's caption is legible.
The fly reads its giant fibre as a burst over the rate it has been holding.
The network's own recurrence holds DNp01 at a standing rate with nothing
looming, and a threshold on the level read that as a permanent emergency: the
fly hopped for ever and never came down. The arena wall is a stimulus only
while the fly is carrying itself into it, and the detectors adapt to it, so a
fly resting at the edge stops driving 165 neurons at full rate into the
network every reading in this world is taken from. A slow heading drift,
reported apart from the turn the connectome asks for, leaves a fly that
explores its arena instead of walking one straight line to the edge. Looming
finds a walker whether or not the player registry has readied.
The guide says which detector class the ablation actually answers.
---
docs: say why the bench's identify press checks the pointer before it picks
---
fix: the bench's reference blocks are asked for, and the card's closing line holds still
The five blocks under the trace are reference rather than instrument, and the
whole tree is rebuilt on every redraw, so they sit behind a 'more' toggle and
the bench builds 123 widget nodes instead of 242 until someone asks for them.
The first-run card reported the rate MN9 was firing at as the line was drawn,
so a person who read it after clearing the drive was told 'MN9 is firing at
0 Hz and the proboscis is out'. It reports the rate MN9 reached when the
fourth step ticked.
---
Refresh the world's shots: the specimen, the bench, a protocol running, the fly, naming a neuron, the arena8b7139f68bconnectome: the asset type lives at the world root so the package's instance resolves its type and installsa2a6602ba8Fruit Fly: the MaleCNS connectome as a GPU spiking network, an embodied fly, and the lab bench, all in the fruitFly package
---
Fruit Fly: the MaleCNS connectome as a GPU spiking network, an embodied fly, and the lab bench, all in the fruitFly package
---
connectome: the edge table travels as two parts under the blob upload cap