Does the fly do better when it remembers what it learned in a previous run?
Not yet. It is pre-registered, built and reviewed (one bug found and fixed); it runs when the cores are free.
In the log: does the fly do better when it remembers a previous run? (pre-registered 2026-09-25 16:43)
recordedDate 2026-09-25 16:43, as written in the logrung 0 · energy model3 predictions · 0 result paragraphsEXPERIMENTS.md lines 17109–17167, lines 17169–17183, lines 17185–17205
Pre-registration
(1)
M beats F on rounds 1–50.
no verdict written against it
(2)
Over 200 rounds the gap narrows as the fresh fly
catches up; M vs F on the full AUC_Q does not clear its bar.
no verdict written against it
(3)
S sits between F and M.
Cost and order. About 45 min per fly run on MPS, one search at a time: 2 donors plus 15 fly runs
plus 5 elitist runs, about 14 h. Runs after E245c's sampling frees the cores. The code gets an
adversarial review before any M run is scored.
no verdict written against it
The pre-registration, as written
E246 — does the fly do better when it remembers a previous run? (pre-registered 2026-09-25 16:43)
The operator's question (2026-09-24): the fly learns from scratch every run. Once the search is in
the HEA regime it should keep what it learned, "build out its own map". Every run already saves its
readout (runs/readout_*.json, 100 files), but nothing has ever loaded one. This tests the smallest
version of memory before building more.
Memory, defined. Everything the fly learned in a run:
the readout's weights and its reward-normalisation trace;
every connectome synapse the run moved: core.w wherever it differs from the anatomy's value, which
covers the fb, oa and 5ht sites (they rewrite core.w directly and keep no weights of their own)
and any other plastic edges;
each plastic site's reward/score trace.
Not carried: the walkers' positions, the niche archive, and the modulator's running activity
statistics (a normaliser, not knowledge). The archive, a persistent map, is the next step if this one
earns it.
Implementation, before any run.
FORAGER_MEMORY_OUT=<file> saves the snapshot at the end of a run.
FORAGER_MEMORY_IN=<file> loads it before the first round, matched by neuron and edge id, never by
position.
FORAGER_MEMORY_SHUFFLE=1 loads it permuted: the readout's weights across the read neurons, and
each site's moved values across that site's edges of the same anatomical sign. The same magnitudes
and signs, with the assignment destroyed.
Tests before any run: a save followed by a load reproduces the learned state exactly; saving changes
nothing about the run; a shuffled load keeps every sign and every magnitude.
Protocol.E244's search exactly (the HEA space, pure rung-0 reward on e6, E244's brain flags,
200 rounds × 4 proposals). Donors: fresh fly runs on seeds 0 and 1 with FORAGER_MEMORY_OUT. Then
seeds 2–6 for each arm:
M's memory shuffled (the control: warm weights with the content destroyed)
E
elitist, for reference
Measures. AUC_Q over the 200 rounds (primary), AUC_Q over rounds 1–50 (where memory should
matter most), distinct finds, best rung-0 energy. If the per-round series is not already stored, the
implementation stores it before any run.
Bars (Welch, 5 seeds per arm).
Memory helps: mean AUC_Q(M) − mean AUC_Q(F) > 2 s.e. of the difference.
It is the content, not the weights' size: mean AUC_Q(M) − mean AUC_Q(S) > 2 s.e. as well.
M > F with M ≈ S reads "warm weights help, what they learned does not". M ≤ F means memory as
defined does not help, and the next step is the map (the archive), not more of this.
What 5 seeds can see.E244's fly had a seed sd of 38.5 on an AUC_Q of 115, so the smallest
difference these bars can detect is about 2 × 38.5 × √(2/5) ≈ 49, roughly 40 % of the fly's AUC_Q.
A smaller real effect will read as no effect; that is stated now, not discovered afterwards.
Predictions. (1) M beats F on rounds 1–50. (2) Over 200 rounds the gap narrows as the fresh fly
catches up; M vs F on the full AUC_Q does not clear its bar. (3) S sits between F and M.
Cost and order. About 45 min per fly run on MPS, one search at a time: 2 donors plus 15 fly runs
plus 5 elitist runs, about 14 h. Runs after E245c's sampling frees the cores. The code gets an
adversarial review before any M run is scored.
E246 amendment and smoke test (2026-09-25 17:01, before any E246 run).
The control's wording, corrected. "The same magnitudes and signs" is not quite what a shuffle
can give. A change moved onto a synapse too weak to take it is stopped at zero by the anatomy's
sign, and one moved onto a strong site edge is capped at ±rho, exactly as learning would stop it.
memory.load counts these (clamped) and reports them with every S run. A faithful load
clamps nothing.
Code.forager/brain/memory.py and the stage_b hooks (FORAGER_MEMORY_IN, _OUT,
_SHUFFLE); tests/test_fly_memory.py, 4 tests: exact round trip, saving changes nothing,
landing on another seed's start, the shuffle keeps the values within each group except the
counted clamps, and a foreign circuit is refused.
Smoke test on the full brain (E244's flags, 3 rounds, one seed, outputs kept out of runs/):
3 rounds moved 37,901 synapses (a 1.25 MB file); a faithful load clamped 0; a shuffled load clamped
226 (0.6 %). The loaded memory reaches the forward pass: on the same seed, fresh / memory / shuffled
ended at best +13.5 / −67.7 / +14.4 meV/atom with 0 / 5 / 0 finds. Three rounds on one seed prove
the plumbing, not the effect; that is E246's job.
E246 adversarial review (2026-09-25 17:20, before any E246 run). An independent reviewer read the memory code
against the pre-registration. Verdict: not runnable as written, for one reason, now fixed.
Fixed, would have invalidated M vs S. A shuffled load held only the plastic sites' synapses
within ±rho, not the mushroom body's own KC→MBON synapses. Under E244's flags the three sites (fb, oa,
5ht) sit elsewhere, so that ungated group is the core's whole plastic pathway (61,210 synapses on the
full brain). A shuffle could park them beyond any value learning reaches, which is exactly what the S
control must not do. Every plastic group is now clipped, as both learning rules clip. The test suite
missed it because its one site sat on the KC→MBON edges; a new test puts the site elsewhere and failed
on the old code (0.196 against rho 0.05) before passing on the new.
Fixed. A memory whose readout neurons differ from the fly's is refused, not partly applied; a
multi-seed run's save path must contain {seed}.
Kept, with the reason written in the code. A warm run's saved memory is measured from the anatomy,
so it holds what it loaded plus what it learned. Loading that one file reproduces it; it is not added
to its donor's.
Named, not carried. The mushroom body's per-Kenyon-cell exposure counter, which drives
novelty(). Nothing on E246's path reads it (stage_b → FlyGenerator → forage); only campaign.py and
qualify.py do.
Cleared by the reviewer: edge and neuron identity, the sign rule, the stale-operator reset, the
shuffle's RNG (its own Generator, never the search's; loading draws nothing from the search), the
hook's order, and non-fly arms.
Full-brain smoke loads after the fix: faithful 0 clamped, shuffled 226 of 37,901 moved synapses.
Results
No result paragraph for this entry was found in the log.
The full record
This entry is written in 3 separate places in the log, shown here in log order.
EXPERIMENTS.md · lines 17109–17167
E246 — does the fly do better when it remembers a previous run? (pre-registered 2026-09-25 16:43)
The operator's question (2026-09-24): the fly learns from scratch every run. Once the search is in
the HEA regime it should keep what it learned, "build out its own map". Every run already saves its
readout (runs/readout_*.json, 100 files), but nothing has ever loaded one. This tests the smallest
version of memory before building more.
Memory, defined. Everything the fly learned in a run:
the readout's weights and its reward-normalisation trace;
every connectome synapse the run moved: core.w wherever it differs from the anatomy's value, which
covers the fb, oa and 5ht sites (they rewrite core.w directly and keep no weights of their own)
and any other plastic edges;
each plastic site's reward/score trace.
Not carried: the walkers' positions, the niche archive, and the modulator's running activity
statistics (a normaliser, not knowledge). The archive, a persistent map, is the next step if this one
earns it.
Implementation, before any run.
FORAGER_MEMORY_OUT=<file> saves the snapshot at the end of a run.
FORAGER_MEMORY_IN=<file> loads it before the first round, matched by neuron and edge id, never by
position.
FORAGER_MEMORY_SHUFFLE=1 loads it permuted: the readout's weights across the read neurons, and
each site's moved values across that site's edges of the same anatomical sign. The same magnitudes
and signs, with the assignment destroyed.
Tests before any run: a save followed by a load reproduces the learned state exactly; saving changes
nothing about the run; a shuffled load keeps every sign and every magnitude.
Protocol.E244's search exactly (the HEA space, pure rung-0 reward on e6, E244's brain flags,
200 rounds × 4 proposals). Donors: fresh fly runs on seeds 0 and 1 with FORAGER_MEMORY_OUT. Then
seeds 2–6 for each arm:
M's memory shuffled (the control: warm weights with the content destroyed)
E
elitist, for reference
Measures. AUC_Q over the 200 rounds (primary), AUC_Q over rounds 1–50 (where memory should
matter most), distinct finds, best rung-0 energy. If the per-round series is not already stored, the
implementation stores it before any run.
Bars (Welch, 5 seeds per arm).
Memory helps: mean AUC_Q(M) − mean AUC_Q(F) > 2 s.e. of the difference.
It is the content, not the weights' size: mean AUC_Q(M) − mean AUC_Q(S) > 2 s.e. as well.
M > F with M ≈ S reads "warm weights help, what they learned does not". M ≤ F means memory as
defined does not help, and the next step is the map (the archive), not more of this.
What 5 seeds can see.E244's fly had a seed sd of 38.5 on an AUC_Q of 115, so the smallest
difference these bars can detect is about 2 × 38.5 × √(2/5) ≈ 49, roughly 40 % of the fly's AUC_Q.
A smaller real effect will read as no effect; that is stated now, not discovered afterwards.
Predictions. (1) M beats F on rounds 1–50. (2) Over 200 rounds the gap narrows as the fresh fly
catches up; M vs F on the full AUC_Q does not clear its bar. (3) S sits between F and M.
Cost and order. About 45 min per fly run on MPS, one search at a time: 2 donors plus 15 fly runs
plus 5 elitist runs, about 14 h. Runs after E245c's sampling frees the cores. The code gets an
adversarial review before any M run is scored.
EXPERIMENTS.md · lines 17169–17183
E246 amendment and smoke test (2026-09-25 17:01, before any E246 run).
The control's wording, corrected. "The same magnitudes and signs" is not quite what a shuffle
can give. A change moved onto a synapse too weak to take it is stopped at zero by the anatomy's
sign, and one moved onto a strong site edge is capped at ±rho, exactly as learning would stop it.
memory.load counts these (clamped) and reports them with every S run. A faithful load
clamps nothing.
Code.forager/brain/memory.py and the stage_b hooks (FORAGER_MEMORY_IN, _OUT,
_SHUFFLE); tests/test_fly_memory.py, 4 tests: exact round trip, saving changes nothing,
landing on another seed's start, the shuffle keeps the values within each group except the
counted clamps, and a foreign circuit is refused.
Smoke test on the full brain (E244's flags, 3 rounds, one seed, outputs kept out of runs/):
3 rounds moved 37,901 synapses (a 1.25 MB file); a faithful load clamped 0; a shuffled load clamped
226 (0.6 %). The loaded memory reaches the forward pass: on the same seed, fresh / memory / shuffled
ended at best +13.5 / −67.7 / +14.4 meV/atom with 0 / 5 / 0 finds. Three rounds on one seed prove
the plumbing, not the effect; that is E246's job.
EXPERIMENTS.md · lines 17185–17205
E246 adversarial review (2026-09-25 17:20, before any E246 run). An independent reviewer read the memory code
against the pre-registration. Verdict: not runnable as written, for one reason, now fixed.
Fixed, would have invalidated M vs S. A shuffled load held only the plastic sites' synapses
within ±rho, not the mushroom body's own KC→MBON synapses. Under E244's flags the three sites (fb, oa,
5ht) sit elsewhere, so that ungated group is the core's whole plastic pathway (61,210 synapses on the
full brain). A shuffle could park them beyond any value learning reaches, which is exactly what the S
control must not do. Every plastic group is now clipped, as both learning rules clip. The test suite
missed it because its one site sat on the KC→MBON edges; a new test puts the site elsewhere and failed
on the old code (0.196 against rho 0.05) before passing on the new.
Fixed. A memory whose readout neurons differ from the fly's is refused, not partly applied; a
multi-seed run's save path must contain {seed}.
Kept, with the reason written in the code. A warm run's saved memory is measured from the anatomy,
so it holds what it loaded plus what it learned. Loading that one file reproduces it; it is not added
to its donor's.
Named, not carried. The mushroom body's per-Kenyon-cell exposure counter, which drives
novelty(). Nothing on E246's path reads it (stage_b → FlyGenerator → forage); only campaign.py and
qualify.py do.
Cleared by the reviewer: edge and neuron identity, the sign rule, the stale-operator reset, the
shuffle's RNG (its own Generator, never the search's; loading draws nothing from the search), the
hook's order, and non-fly arms.
Full-brain smoke loads after the fix: faithful 0 clamped, shuffled 226 of 37,901 moved synapses.
Related entries
E244 — the HEA regime, walked all the way up (pre-registered 2026-09-24 03:42)
E245c — more sampling: 300 + 1000 sweeps per temperature (pre-registered 2026-09-24 10:54)