Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Photoreceptor operating-point sweep

Goal

The lamina-drive accounting found the OFF-path medulla silent because of an operating point, not a sign. L2 excites Tm1, Tm2 and Tm4 through 96–131 synapses per cell. It would put the median cell at threshold at 42.4, 38.9 and 53.0 Hz. Under the probe grating it runs at 20.46 Hz. The lamina bias rule, \(b = v_\infty(\mathrm{target}) - v_{\mathrm{rest}} - r_{\mathrm{base}} \cdot \tau_s \cdot W_{\mathrm{in}}\), assumes the photoreceptors sit at r_base (10 Hz). The encoder rectifies the dark half of the grating, so they average about 31 Hz, and the extra histaminergic inhibition drags L2 from its 50 Hz target. This entry tests that by sweeping the existing --r-base flag at 10, 50 and 100 Hz on the real imago and at 50 and 100 Hz on the shuffled control. --r-base moves the encoder baseline and the bias rule together, so a higher value brings the rate the bias assumes closer to the rate the grating produces. No code changes.

Prediction, written before the runs. The encoder alone, stepped over the grating outside the network (360 phases, 2 s after a 0.5 s warm-up), gives a photoreceptor mean of 31.5 Hz at r_base 10 (measured 30.9 Hz on 2026-09-16), 58.1 Hz at 50, and 98.7 Hz at 100. The rectification does not vanish at 100. The log compression takes the dark half of the grating to a contrast near −1.4, so 41%, 27% and 10% of samples clip at zero. The excess of the stimulus mean over r_base, which is the term the bias rule misses, is +21.5, +8.1 and −1.4 Hz. The bias rule then gives L1 30.63, L2 29.20, L3 16.69 mV at r_base 50 and L1 49.38, L2 46.53, L3 21.50 mV at 100. At r_base 50 L2 should land nearer its 50 Hz target, somewhere in 35–50 Hz. At 100 it should be at or above target. The range is wide because the static mean field does not reproduce the 2026-09-16 lamina split: it gives L1 and L2 the same rate, and the measurement has L1 at 38 Hz and L2 at 20 Hz. Tm1, Tm2 and Tm4 should cross into the hertz range on the real imago. Tm2 should go first and Tm4 last, in the order of their crossing rates; at r_base 50 Tm4 may still be under 1 Hz. Mi1 and Tm3 should stay silent at every r_base: their dominant lamina input is L1, which is inhibitory, and L1 rises with the rest. Mi9 needs L3 at 94 Hz and should stay silent; Mi4 has no direct lamina drive and should stay silent. T4 should stay at zero, since its inputs are the ON cells. T5 is then the first verdict set that gets a fair test. Its inputs include Tm9, which is not in the stage overlay, so the entry can show whether T5 fires, but not every input it needs. No prediction on T5 direction selectivity. On the shuffled control the lamina and medulla rates should rise with r_base, and T4/T5/HS/VS should stay flat across direction, with selectivity near 1.

Setup

  • how the prediction was computed: the photoreceptor means, the clipping fractions and the excess over r_base came from a scratch computation, not a committed tool. It steps the repo’s PhotoreceptorEncoder alone, with no network, over 360 grating phases at 1 ms for 0.5 s warm-up plus 2 s, using the probe’s luminance \(0.5 + 0.4 \sin(\phi - 2\pi t)\) and default VisionParams apart from r_base_hz. The lamina biases in the prediction are the bias rule evaluated with the median \(W_{\mathrm{in}}\) implied by the 2026-09-16 bias_mv values. The script, saved as encoder_prediction.py and re-run after the probes from the repo root with uv run python encoder_prediction.py:

    import math
    
    import torch
    
    from flatline.senses.vision import PhotoreceptorEncoder, VisionParams
    
    n = 360  # grating phases, one per simulated column
    phase = torch.linspace(0.0, 2.0 * math.pi, n + 1)[:-1]
    for r_base in (10.0, 50.0, 100.0):
        vp = VisionParams(r_base_hz=r_base)
        enc = PhotoreceptorEncoder(n, vp, 1, 1.0)
        rates, contrast = [], []
        for t in range(2500):  # 1 ms steps: 0.5 s warm-up, then 2 s
            enc.push_luminance(0.5 + 0.4 * torch.sin(phase - 2.0 * math.pi * t / 1000.0))
            r = enc.step()[0]
            if t >= 500:  # the encoder's own contrast, before the clamp
                rates.append(r)
                c = (enc.held - enc.lowpass) + vp.dc_fraction * (enc.held - enc.l_mid)
                contrast.append(c[0])
        rate, c = torch.stack(rates), torch.stack(contrast)
        print(
            f"r_base {r_base:5.1f}: mean {rate.mean():6.2f} Hz, excess {rate.mean() - r_base:+6.2f} Hz,"
            f" clipped {(rate == 0).float().mean():.1%}, contrast {c.min():+.2f} to {c.max():+.2f}"
        )
    

    Output:

    r_base  10.0: mean  31.51 Hz, excess +21.51 Hz, clipped 40.9%, contrast -1.15 to +0.73
    r_base  50.0: mean  58.05 Hz, excess  +8.05 Hz, clipped 26.8%, contrast -1.15 to +0.73
    r_base 100.0: mean  98.65 Hz, excess  -1.35 Hz, clipped 10.2%, contrast -1.15 to +0.73
    

    The prediction’s 31.5, 58.1 and 98.7 Hz, 41%, 27% and 10%, and +21.5, +8.1 and −1.4 Hz are these values rounded. The prediction’s “contrast near −1.4” is not from this script. It was a hand estimate of the log compression, and it is wrong. The encoder’s contrast minimum is −1.15, which is still below −1, so the dark half still clips at r_base 100.

  • prediction integrity: before the runs, the prediction paragraph hashed to sha256 aff464c27e79363063e7298da546a7e27b7786ba12609628de789b752476c62e with awk '/^Prediction, written before the runs/,/^## Setup/' book/src/notebook/2026-10-30-operating-point-sweep.md | sha256sum. The span runs from the paragraph’s first line through the ## Setup heading. The hash cannot show that the paragraph came before the runs: the prediction and the results landed in the same commit, 083fad7, so it shows only that the paragraph is unchanged since then.

  • git describe: 3ad9b97. The shuffled r_base 10 run was added later, at 5364baf, on the same machine and imagos. Between the two only stage_drive.py and the CLI’s stage-drive handling changed under src/; the probe, encoder and engine did not.

  • machine: straylight (AMD Ryzen AI Max+ 395, Radeon 8060S, Linux), device cpu. The venv’s torch is 2.14.0+cu130 with no ROCm, so torch.cuda.is_available() is False here. The 2026-09-16 baseline reports were run on the Mac with mps, so comparing the cpu r_base 10 runs with them is cpu against mps, and differences at the noise level are expected.

  • imago: data/imagos/male-cns-v1.0.imago, built_at 2026-09-16T02:29:04+00:00, git_describe 4428500-dirty; control data/imagos/male-cns-v1.0-shuffled-1.imago, built_at 2026-09-16T02:30:12+00:00, git_describe 4428500-dirty, shuffle_seed 1

  • probe flags, all defaults except --r-base and --device: grating period 30°, 1 Hz, contrast 0.8; 0.5 s warm-up, 2 s per direction; frame interval 1 ms (continuous); ratio 1.5; lamina target 50 Hz; encoder gain 100 Hz per log unit; seed 0; undriven lamina cells unbiased

  • stage overlay: photoreceptors, L1–L5, C2, C3, Mi1, Tm3, Mi4, Mi9, Tm1, Tm2, Tm4. L4, L5, C2 and C3 were added in 3ad9b97, so the 2026-09-16 baseline reports do not carry them.

  • lamina bias (mV) from bias_mv, target 50 Hz. It changes with r_base and is the same on the real and shuffled imagos at each value:

    r_base (Hz)L1L2L3
    1015.627615.342612.8401
    5030.627629.202616.6901
    10049.377646.527621.5026
  • commands:

    for R in 10 50 100; do
      uv run flatline probe --imago data/imagos/male-cns-v1.0.imago --device cpu --r-base $R \
        --out data/runs/probe/2026-10-30-rbase$R.json
    done
    for R in 50 100; do
      uv run flatline probe --imago data/imagos/male-cns-v1.0-shuffled-1.imago --device cpu --r-base $R \
        --out data/runs/probe/2026-10-30-rbase$R-shuffled.json
    done
    uv run python scripts/figures/stages.py data/runs/probe/2026-10-30-rbase10.json book/src/figures/probe-stages-rbase10.svg
    uv run python scripts/figures/stages.py data/runs/probe/2026-10-30-rbase50.json book/src/figures/probe-stages-rbase50.svg
    uv run python scripts/figures/stages.py data/runs/probe/2026-10-30-rbase100.json book/src/figures/probe-stages-rbase100.svg
    uv run python scripts/figures/stages.py data/runs/probe/2026-10-30-rbase50-shuffled.json book/src/figures/probe-stages-rbase50-shuffled.svg
    uv run python scripts/figures/stages.py data/runs/probe/2026-10-30-rbase100-shuffled.json book/src/figures/probe-stages-rbase100-shuffled.svg
    

    Added later, at 5364baf:

    uv run flatline probe --imago data/imagos/male-cns-v1.0-shuffled-1.imago --device cpu --r-base 10 \
      --out data/runs/probe/2026-10-30-rbase10-shuffled.json
    uv run python scripts/figures/stages.py data/runs/probe/2026-10-30-rbase10-shuffled.json book/src/figures/probe-stages-rbase10-shuffled.svg
    

    The shuffled r_base 10 baseline was at first the existing data/runs/probe/2026-09-16-stages-shuffled.json (mps, without L4, L5, C2, C3). The cpu run replaces it, so that all six runs share a device and the full stage overlay.

What happened

All five probes completed with no exceptions and returned exit code 2 (verdict failed), as every probe so far has. Wall time, including uv run start-up and loading the imago, was 37 s (r_base 10), 37 s (50), 38 s (100), 26 s (shuffled, 50) and 28 s (shuffled, 100). The five figures took 0.3–0.5 s each. The shuffled r_base 10 probe, run later, also exited 2, in 27 s; its figure took 0.4 s.

The r_base 10 run on cpu reproduces the 2026-09-16 mps run. In the progressive, regressive and up directions every stage rate and every verdict rate is identical, except the progressive photoreceptor rate, which is 6.8 × 10⁻⁵ Hz lower: one photoreceptor spike. The down direction differs by up to 0.098 Hz (L2 20.5253 against 20.4269 Hz), and by 0.029 Hz or less on every other set. That is the noise level the device change was expected to bring.

The shuffled r_base 10 run on cpu matches the 2026-09-16 mps shuffled run the same way, except that here the progressive direction carries the whole difference. Regressive, up and down are identical in every stage and verdict rate. In the progressive direction the photoreceptor rate is again 6.8 × 10⁻⁵ Hz lower (one spike), the other stage sets differ by up to 0.049 Hz (Tm2 11.4236 against 11.3743 Hz), T4a–d and T5a–d by up to 0.010 Hz, and HS and VS by 0.56 and 0.34 Hz (9 and 23 spikes over 8 and 34 cells in 2 s). Four-direction means move by at most 0.012 Hz (Tm2). The verdict sets are flat, so this is enough to flip T4a’s winning direction (regressive to progressive) and to move selectivities by up to 0.010 (HS 1.000 to 1.010); all ten stay within 1.000–1.012.

Results

Summary, mean of the four directions (Hz); the T4a–d and T5a–d rows are the range over subtypes and directions. Shuffled at r_base 10 is the later cpu run, which replaces the 2026-09-16 mps report.

setreal 10real 50real 100shuffled 10shuffled 50shuffled 100
photoreceptors30.9057.7898.6430.9057.7898.64
L137.7857.7065.1737.1258.9267.04
L220.4939.8649.2636.1457.7665.83
L321.8027.0233.3733.4341.0546.81
Mi10.0008006.767.677.80
Tm30001.892.502.85
Mi900.00410.254.245.055.33
Tm10.365.218.9211.2413.3414.05
Tm20.162.927.7511.4313.4214.16
Tm40.00873.087.472.032.622.96
T4a–d0000.55–0.900.79–1.180.97–1.37
T5a–d0000.44–0.780.63–1.070.77–1.24

Per run, every set in every direction. Stage rows first, then the verdict sets with the winning direction of the literature axis and the selectivity (preferred + floor over null + floor; pass is 1.5).

Real imago, r_base 10:

setcellsprogressiveregressiveupdownwinner, selectivity
photoreceptors734130.923530.873030.947730.8438—
L1177637.791937.768937.742437.7998—
L2177920.427220.483120.516620.5253—
L3177221.808121.987921.708021.7003—
L417700.00000.00000.00000.0000—
L517870.00000.00000.00000.0000—
C217450.00000.00000.00000.0000—
C317790.07340.07590.07030.0675—
Mi117730.00080.00060.00110.0006—
Tm320540.00000.00000.00000.0000—
Mi417720.00000.00000.00000.0000—
Mi917750.00000.00000.00000.0000—
Tm117770.35880.36550.35170.3455—
Tm217660.16620.15570.15200.1673—
Tm416700.01020.00990.00720.0075—
T4a16840.00000.00000.00000.0000progressive, 1.000
T4b16900.00000.00000.00000.0000progressive, 1.000
T4c17780.00000.00000.00000.0000up, 1.000
T4d17090.00000.00000.00000.0000up, 1.000
T5a16640.00000.00000.00000.0000progressive, 1.000
T5b17150.00000.00000.00000.0000progressive, 1.000
T5c17200.00000.00000.00000.0000up, 1.000
T5d16200.00000.00000.00000.0000up, 1.000
HS80.00000.00000.00000.0000progressive, 1.000
VS340.00000.00000.00000.0000up, 1.000

Real imago, r_base 50:

setcellsprogressiveregressiveupdownwinner, selectivity
photoreceptors734157.846157.644957.850857.7778—
L1177657.718857.844657.577757.6543—
L2177939.967440.022539.716739.7352—
L3177226.889727.262726.874727.0440—
L417700.00000.00000.00000.0000—
L517870.00620.00670.00780.0056—
C217450.00000.00000.00000.0000—
C317790.03340.04080.03630.0377—
Mi117730.00000.00000.00000.0000—
Tm320540.00000.00000.00000.0000—
Mi417720.00000.00000.00000.0000—
Mi917750.00450.00420.00310.0045—
Tm117775.22485.22575.19475.2043—
Tm217662.95362.92332.90372.9060—
Tm416703.14613.13113.03802.9997—
T4a16840.00000.00000.00000.0000progressive, 1.000
T4b16900.00000.00000.00000.0000progressive, 1.000
T4c17780.00000.00000.00000.0000up, 1.000
T4d17090.00000.00000.00000.0000up, 1.000
T5a16640.00000.00000.00000.0000progressive, 1.000
T5b17150.00000.00000.00000.0000progressive, 1.000
T5c17200.00000.00000.00000.0000up, 1.000
T5d16200.00000.00000.00000.0000up, 1.000
HS80.00000.00000.00000.0000progressive, 1.000
VS340.00000.00000.00000.0000up, 1.000

Real imago, r_base 100:

setcellsprogressiveregressiveupdownwinner, selectivity
photoreceptors734198.721198.547998.621898.6629—
L1177665.088165.251165.210365.1244—
L2177949.319049.467749.203549.0669—
L3177233.502333.416833.246033.3273—
L417700.00250.00280.00110.0020—
L517870.01820.02320.02660.0238—
C217450.00000.00000.00000.0000—
C317790.06860.05930.05650.0582—
Mi117730.00000.00000.00000.0000—
Tm320540.00000.00000.00000.0000—
Mi417720.00000.00000.00000.0000—
Mi917750.28030.26870.22390.2285—
Tm117778.93428.94328.90778.8981—
Tm217667.79597.74807.72377.7290—
Tm416707.62197.65187.33687.2883—
T4a16840.00000.00000.00000.0000progressive, 1.000
T4b16900.00000.00000.00000.0000progressive, 1.000
T4c17780.00000.00000.00000.0000up, 1.000
T4d17090.00000.00000.00000.0000up, 1.000
T5a16640.00000.00000.00000.0000progressive, 1.000
T5b17150.00000.00000.00000.0000progressive, 1.000
T5c17200.00000.00000.00000.0000up, 1.000
T5d16200.00000.00000.00000.0000up, 1.000
HS80.00000.00000.00000.0000progressive, 1.000
VS340.00000.00000.00000.0000up, 1.000

Shuffled control, r_base 10:

setcellsprogressiveregressiveupdownwinner, selectivity
photoreceptors734130.923530.873030.947730.8438—
L1177637.124737.114937.102537.1357—
L2177936.106236.135236.122036.2018—
L3177233.440533.437433.380933.4763—
L417700.00000.00000.00000.0000—
L517877.35427.27537.40107.3744—
C217450.43500.42780.43670.4315—
C317792.64592.60932.64902.6498—
Mi117736.79136.71606.74486.7735—
Tm320541.89631.86441.90681.8941—
Mi417720.81290.79630.80530.7963—
Mi917754.25074.19724.26064.2617—
Tm1177711.213611.195011.285611.2648—
Tm2176611.423611.364111.471111.4754—
Tm416702.03502.00302.04882.0302—
T4a16840.88210.87740.87980.8955progressive, 1.003
T4b16900.55770.55800.54590.5541regressive, 1.000
T4c17780.82310.82450.83660.8211up, 1.012
T4d17090.64070.64510.64540.6337up, 1.010
T5a16640.52400.51440.52400.5261progressive, 1.009
T5b17150.75710.74780.76620.7755progressive, 1.007
T5c17200.43550.43920.44160.4352up, 1.007
T5d16200.50620.50770.50930.5049up, 1.004
HS857.937557.375055.562556.1875progressive, 1.010
VS3431.250030.014730.941230.6324up, 1.010

Shuffled control, r_base 50:

setcellsprogressiveregressiveupdownwinner, selectivity
photoreceptors734157.846157.644957.850857.7778—
L1177658.927959.062558.796558.8812—
L2177957.730557.830257.713357.7825—
L3177241.037041.127341.014141.0375—
L417700.00000.00000.00000.0000—
L517878.59408.56668.54818.6489—
C217450.56160.56480.56100.5633—
C317793.23413.24823.16473.2442—
Mi117737.67517.72027.56017.7250—
Tm320542.48522.51682.47692.5331—
Mi417721.02091.05811.00621.0305—
Mi917755.04085.08035.00595.0913—
Tm1177713.349213.371113.261113.3942—
Tm2176613.376813.351413.438013.5102—
Tm416702.61442.63802.58682.6365—
T4a16841.16571.17551.14251.1621regressive, 1.006
T4b16900.81510.82070.79440.8263regressive, 1.004
T4c17781.15161.16231.12681.1561down, 1.018
T4d17090.88390.89790.85110.8947down, 1.032
T5a16640.73440.74880.73830.7335regressive, 1.012
T5b17151.05921.06941.02541.0676regressive, 1.007
T5c17200.64680.65610.62760.6535down, 1.023
T5d16200.73270.73860.71640.7364down, 1.016
HS866.375067.625063.562562.1250regressive, 1.019
VS3435.264735.941235.985335.6029up, 1.011

Shuffled control, r_base 100:

setcellsprogressiveregressiveupdownwinner, selectivity
photoreceptors734198.721198.547998.621898.6629—
L1177666.920967.102267.121967.0025—
L2177965.660565.935165.899765.8162—
L3177246.805946.843146.823646.7621—
L417700.00000.00000.00000.0000—
L517879.04929.05999.27179.2043—
C217450.62920.62320.63810.6404—
C317793.51323.50733.54023.5129—
Mi117737.71697.75307.87547.8370—
Tm320542.80742.79942.90122.8856—
Mi417721.02141.02771.07511.0545—
Mi917755.26005.26625.39495.3862—
Tm1177713.970213.999414.108614.1207—
Tm2176614.003714.041914.306114.3001—
Tm416702.92282.93353.00363.0000—
T4a16841.34061.36071.36881.3596regressive, 1.011
T4b16900.98700.97430.98760.9899progressive, 1.009
T4c17781.30261.30761.36841.3459up, 1.012
T4d17091.01871.01991.06701.0421up, 1.016
T5a16640.86690.86060.89780.8753progressive, 1.005
T5b17151.18131.20231.24291.2370regressive, 1.012
T5c17200.77560.77300.79300.8049down, 1.009
T5d16200.83210.84170.86940.8651up, 1.003
HS868.937569.937573.187569.1250regressive, 1.014
VS3437.676537.397137.867637.5441up, 1.009

Conclusions

The operating point was the OFF-path blocker at the medulla, and moving it wakes Tm1, Tm2 and Tm4. The photoreceptor means landed where the encoder calculation put them: 57.78 Hz at r_base 50 (predicted 58.1) and 98.64 Hz at 100 (predicted 98.7). L2 rose from 20.49 to 39.86 to 49.26 Hz. That is inside the predicted 35–50 Hz at 50, and 0.7 Hz under the 50 Hz target at 100, so “at or above target” held only as “at”. L2 is the only lamina type that lands on target: at r_base 100, where the photoreceptors average 98.64 Hz and the bias rule’s assumption holds, L1 runs at 65.17 Hz and L3 at 33.37 Hz, 15.17 Hz over and 16.63 Hz under the 50 Hz target.

With L2 at 39.86 Hz (r_base 50), Tm1 fires 5.21 Hz, Tm2 2.92 Hz and Tm4 3.08 Hz; with L2 at 49.26 Hz (r_base 100), they fire 8.92, 7.75 and 7.47 Hz. The lamina-drive entry put the median cell at threshold, from L2 alone, at 38.9 Hz for Tm2, 42.4 Hz for Tm1 and 53.0 Hz for Tm4. The sweep took L2 past the first at r_base 50 and past the first two at 100, never to 53.0 Hz, and all three types are in the hertz range at both settings, Tm4 included.

The predicted order was wrong. The prediction had Tm2 first and Tm4 last, and Tm4 possibly under 1 Hz at r_base 50. Tm1 led at both settings. Tm4 was above Tm2 at 50 (3.08 against 2.92 Hz), even though the median Tm4 cell needs L2 14 Hz higher than the median Tm2 cell. The static mean-field crossing rate does not rank these cells. The grating modulates L2 at 1 Hz, so L2 spends part of each cycle well above its mean; the per-cell spread of \(W_{\mathrm{in}}\) (Tm4’s interquartile range is the widest of the three) and the other inputs onto each type also enter. None of these was measured here.

The ON path stayed silent, as predicted. Mi1 went from 0.0008 Hz at r_base 10 to exactly 0 at 50 and 100; Tm3 and Mi4 are exactly 0 at all three. L1 rose with the rest (37.78, 57.70, 65.17 Hz), and L1 is the inhibitory dominant input onto Mi1, Tm3, L5, C2 and C3. L4, L5 and C2 are at or under 0.03 Hz on every real run; C3 is 0.03–0.08 Hz in every direction. Mi9 leaked slightly at 100 (0.25 Hz) with L3 at 33.37 Hz, against the 94.3 Hz the accounting gives for L3 alone. The prediction said silent; 0.25 Hz is near silent, but not zero.

Nothing reached T5. T4a–d, T5a–d, HS and VS are exactly 0.0 Hz in every direction at every r_base on the real imago. T4 was predicted to stay at zero. T5 was the set the sweep was meant to give a fair test, and with Tm1, Tm2 and Tm4 at 7.5–8.9 Hz it produced no spike in 2 s across 6719 cells and four directions. This is the surprising result. The probe cannot say why: Tm9, the fourth major T5 input, is not in the stage overlay, and nothing here accounts for the weight from Tm1/Tm2/Tm4 onto T5 or for inhibition onto T5.

The shuffled control fires T5, flat. At the same settings the control’s lamina runs hotter than the real one (L2 57.76 and 65.83 Hz), its medulla rises with r_base (Tm1 11.24 → 13.34 → 14.05 Hz, Mi1 6.76 → 7.67 → 7.80 Hz), and T4a–d and T5a–d fire 0.63–1.37 Hz in every direction. Selectivity is 1.003–1.032 on every verdict set. HS runs 62–73 Hz and VS 35–38 Hz, both flat. This is the same picture as at r_base 10 (T4a–d and T5a–d 0.44–0.90 Hz, selectivity at most 1.012), scaled up.

That the control’s medulla activity comes from recurrent excitation is carried over from the stage-drive accounting in the lamina-drive entry, not measured here: at the control’s r_base 10 lamina rates its net lamina \(g\) median is 0.00 mV for six of the seven medulla types and +0.05 mV for Tm4, so the lamina is not what drives them. The accounting was not repeated at r_base 50 or 100. On that reading the control’s T5 rates say a randomized brain can push T5 over threshold; they do not say the real lamina-to-T5 route is broken. Type by type at r_base 100, the real Tm1 and Tm2 (8.92 and 7.75 Hz) run at 0.63 and 0.55 times the control’s (14.05 and 14.16 Hz), and the real Tm4 (7.47 Hz) at 2.5 times the control’s 2.96 Hz. The real T5 is still at zero; the control’s T5a–d fire 0.77–1.24 Hz.

Next steps

Left to Kyle. Options, not ranked:

  • Account for the step from the OFF medulla to T5 with the existing stage-drive command: --from Tm1 Tm2 Tm4 Tm9 --to T5a T5b T5c T5d, with --rates-from data/runs/probe/2026-10-30-rbase100.json on the real and shuffled imagos. The report has no Tm9 rate, so Tm9 needs --rate Tm9=HZ or has to be dropped from --from. This is the same accounting that explained the lamina-to-medulla drop.
  • Add Tm9 (and any other large T5 input the accounting names) to the probe’s stage overlay, then repeat the r_base 100 run.
  • Keep r_base near the stimulus-mean photoreceptor rate as the probe default, or make the lamina bias rule use the measured stimulus mean instead of r_base. That removes the encoder term only. At r_base 100, where that term is gone, L2 sits on its target but L1 (65.17 Hz) and L3 (33.37 Hz) do not, so the rule also misses per type for a reason not measured here; find that before relying on it.
  • Option (a) from the lamina-drive entry, the tonic operating-point policy for the inhibition-dominated graded types, for the ON path, which this sweep does not touch.