Fishery-Induced Evolution on Baltic Cod (Plumbing Demo)

Implementation status (2026-05-21). The genetics plumbing — bioen integration, trait expression, per-step output, paired-scenario demo script, regression test — is shipped and tested. The baltic_ev/ fixture sustains a cod population but exhibits boom-bust dynamics that currently prevent a measurable FIE signal from emerging in 50 model-years. The Task 11 regression test stands as a guard for future calibration sprints. Read this tutorial as a guide to the mechanism and how to run the demo; the result shown by the chart should be interpreted as a working plumbing test with deferred calibration, not as a peer- ready scientific finding.

Time: ~30 minutes (15 min reading + 15 min compute)

What is FIE?

Fisheries-Induced Evolution (FIE) is the heritable response of fish populations to selective harvesting. When large, fast-growing fish are removed preferentially, the surviving population skews toward slower-growing phenotypes — and because growth has a heritable component, that skew propagates to offspring.

Classic evidence for maturation-trait FIE: Northern cod (Olsen et al. 2004). Direct evidence for growth-rate FIE is rarer — Heino, Pauli & Dieckmann (2015) note that in the wild, most reported growth changes in cod are confounded with concurrent maturation evolution; growth-FIE has only been cleanly isolated in lab common-garden experiments on silversides (Conover & Munch 2002; Walsh et al. 2006). This demo isolates the growth-rate pathway because the dominant maturation pathway is held constant (see Caveat #3).

What the demo does

Two paired scenarios on the baltic_ev/ fixture (a clone of the calibrated Baltic config with bioenergetics + Ev-OSMOSE genetics enabled for cod):

Scenario

Cod fishing mortality

baltic_ev_high_f

F = 0.6/yr (modern Baltic level)

baltic_ev_low_f

F = 0.1/yr (low-but-not-unfished reference)

Each scenario runs 200 model-years × 3 seeds. The demo collects the mean cod imax trait per timestep, then plots both trajectories with a ±1 SD ribbon.

An optional third arm at F=0 is available via --with-zero-f-control for a true drift-only baseline (doubles wall-clock).

Running

.venv/bin/python scripts/run_fie_demo.py

Takes ~15–25 min on commodity hardware. Outputs:

  • outputs/fie_demo/fie_imax_trajectory.png — the chart

  • outputs/fie_demo/<scenario>/seed<n>/osm_genetic_trait_means_Simu0.csv — raw per-step trait stats

The script also prints an “imax-binding fraction” diagnostic per scenario. If the binding fraction is < 30%, the trait is not the limiting constraint on cod growth and the FIE signal will be drift-dominated.

CLI options

Flag

Default

Purpose

--n-years

200

Simulation length in model-years

--seeds

3

Number of replicate seeds per scenario

--output-dir

outputs/fie_demo

Root directory for outputs

--with-zero-f-control

off

Add F=0 drift-only arm (doubles run time)

Interpretation

When you regenerate the chart, you should expect (under the current fixture) that the high-F and low-F trajectories are essentially indistinguishable — both stay close to the initial mean of imax=3.0. This is not a scientific result; it is a known limitation of the present baltic_ev fixture (see Caveats #7 and #8 below). The plumbing — trait expression, inheritance, per-step output, selective fishing — is exercised end-to-end and produces correct CSV outputs.

For comparison, the literature expects:

  • Olsen et al. (2004): Northern cod showed measurable maturation trait shifts over ~3 cod generations under intense fishing (age + size at maturation declined; this is a different trait surface than imax growth-rate evolution).

  • Conover & Munch (2002): silverside lab experiments measured a ~25% reduction in length-at-age (and ~40% reduction in weight-at-age, per Audzijonyte et al. 2013) over 4 generations under intense (90%/generation) size-selective removal. That is an experimental upper bound; Audzijonyte et al. (2013, https://doi.org/10.1111/eva.12044) puts modelled FIE growth-rate responses at moderate F (≈0.5–1.0/yr) at 0.02–0.93% per year.

Exercise

Edit data/baltic_ev/baltic_ev_param-genetics.csv and try:

  • evolution.trait.imax.var.sp0=0.072 (h² ≈ 0.57, near the upper end of Otterå et al. 2018’s cod body-weight range) — how much faster does the trait respond?

  • evolution.trait.imax.nlocus.sp0=5 (halve the loci count from Marty et al. 2015’s 10) — does reduced polygenicity speed up or slow down the response? (Compare to Diaz Pauli & Heino 2014 on architecture sensitivity.)

You can also add a true unfished baseline:

.venv/bin/python scripts/run_fie_demo.py --with-zero-f-control

This adds a third F=0 arm (drift-only) at the cost of doubling wall-clock.

Caveats

This demo emphasizes direction of response, not absolute biomass. The bioenergetics parameters in baltic_ev_param-bioen.csv are literature-default placeholders — the fixture is not calibrated against ICES assessments. See data/baltic_ev/README.md for parameter provenance.

Eight modelling choices to be explicit about:

Caveat 1: Size-selective fishing is the selection knob. Baltic’s default baltic_param-fishing.csv uses age-knife-edge selectivity for the cod fishery; this demo overrides it to length-sigmoidal (l50 = 35 cm, matching the EU minimum landing size). Without size-selectivity, imax-FIE cannot emerge: cod of any growth rate at a given age are equally vulnerable.

Caveat 2: No thermal forcing. simulation.bioen.phit.enabled is explicitly set to false — bioen runs thermally neutral. Adding temperature forcing (e.g., a Copernicus SST time-series) is a future extension.

Caveat 3: Ingestion-cap pathway only. This demo evolves only imax (intake-rate cap) targeting bioen_i_max. Maturation is set to a flat threshold (m0 = 30 cm for cod, between the Radtke & Grygiel 2013 + Svedäng 2024 estimates; see data/baltic_ev/README.md), so FIE does not operate through age/size-at-maturation evolution — only through the indirect “fast growers cross the gear’s size threshold sooner” pathway. The dominant FIE pathway documented in real cod stocks IS maturation evolution (Olsen et al. 2004; Heino, Pauli & Dieckmann 2015) — this demo intentionally isolates the secondary (growth-rate) pathway. The multi-trait extension targeting bioen_m0 is listed in the spec’s out-of-scope follow-ups.

Caveat 4: h² ≈ 0.25 is borrowed from cod body-weight studies. Nielsen et al. (2014) is the source. No published h² estimate exists for fish ingestion-rate as a standalone trait. A referee will fairly ask whether body-weight h² (which integrates intake + assimilation + metabolic efficiency

  • activity) overstates ingestion-rate h². The demo’s deliverable is the direction of trait response, not the magnitude — a future sensitivity sweep over h² ∈ {0.05, 0.15, 0.25, 0.40} would bracket this uncertainty.

Caveat 5: Selection window is ~8 generations across 50 y, not 10. evolution.seeding.year=10 configures the first 10 years as a “seed phase” where offspring genotypes are randomly redrawn from population donors (per inheritance.py:61–68), erasing any selection signature. Real allele-frequency response only starts at year 10, leaving ~40 y / ~5 y-per-generation ≈ 8 selecting generations for the FIE-direction test, and ~38 generations for the 200 y demo.

Caveat 6: F=0.1 “low-F” arm still applies meaningful selection. Per Audzijonyte et al. (2013, https://doi.org/10.1111/eva.12044) and Andersen & Brander (2009, https://doi.org/10.1073/pnas.0901690106), modelled growth-rate FIE response at moderate F (0.5–1.0/yr) clusters at 0.02–0.93% per year (mean 0.25%/yr). Over ~8 selecting generations the cumulative response is 1–4% in the high-F arm, ~one-third of that in the low-F arm, so the paired contrast is ~0.7–2.7%. The cleanest reference would be F=0.0; add it via --with-zero-f-control (doubles wall-clock). This demo’s 2-arm default trades the cleanest contrast for keeping low-F closer to a real management target.

Caveat 7: Population dynamics are boom-bust under the current calibration. Cod biomass over 50 y under no fishing oscillates substantially (observed year 41: 16 M t, year 44: 40 k t, year 49: 39 M t). At any given evaluation year, the population may be in a peak or a trough phase. With fishing applied, the cycle phase shifts and the year-50 evaluation can land on a low-adult-biomass trough — producing a structurally-null FIE selection differential regardless of trait variance. The current test_fie_demo_direction.py reports drop_pct 0.06% at year 50 (well below the 2% threshold). This is a calibration limitation, not a plumbing failure — every genetics-pipeline component (expression → inheritance → bioen override → fishing → output) is verified independently by the unit tests added in Tasks 1–9. Producing a measurable FIE signal will require a separate calibration sprint, likely involving one or more of:

  • Damping the boom-bust cycle by tuning seeding_biomass, population.seeding.year.max, and the predation-accessibility matrix together for trophic balance

  • Sourcing real Brander (1995) / Mehner & Wieser (1994) bioen parameter values for Baltic cod to replace the current placeholders

  • Evaluating FIE on a windowed average (years 40–50) rather than a single year, to reduce cycle-phase sensitivity

Caveat 8: Four engine bugs were found and fixed during this work. Bioen seeding fallback, egg-starvation guard, inheritance allele-pool fallback for empty seed-phase populations, and is_egg recomputation in _bioen_reproduction. All 99/99 pre-existing bioen + Java-parity tests still pass with these fixes. See the commit history for details.

Further reading

  • Olsen, E. M. et al. (2004). Maturation trends indicative of rapid evolution preceded the collapse of northern cod. Nature, 428, 932–935. https://doi.org/10.1038/nature02430

  • Heino, M., Pauli, B. D., & Dieckmann, U. (2015). Fisheries-induced evolution. Annual Review of Ecology, Evolution, and Systematics, 46, 461–480. https://doi.org/10.1146/annurev-ecolsys-112414-054339

  • Conover, D. O., & Munch, S. B. (2002). Sustaining fisheries yields over evolutionary time scales. Science, 297, 94–96. https://doi.org/10.1126/science.1074085

  • Walsh, M. R. et al. (2006). Maladaptive changes in multiple traits caused by fishing: impediments to population recovery. Ecology Letters, 9, 142–148. https://doi.org/10.1111/j.1461-0248.2005.00858.x

  • Andersen, K. H., & Brander, K. (2009). Expected rate of fisheries-induced evolution is slow. PNAS, 106, 11657–11660. https://doi.org/10.1073/pnas.0901690106

  • Audzijonyte, A. et al. (2013). Ecological consequences of body size decline in harvested fish species: positive feedback loops in trophic interactions amplify human impact. Evolutionary Applications, 6, 585–595. https://doi.org/10.1111/eva.12044

  • Marty, L., Dieckmann, U., & Ernande, B. (2015). Fisheries-induced neutral and adaptive evolution in exploited fish populations and consequences for their adaptive potential. Evolutionary Applications, 8, 47–63. https://doi.org/10.1111/eva.12220

  • Brander, K. M. (1995). The effect of temperature on growth of Atlantic cod (Gadus morhua L.). ICES Journal of Marine Science, 52, 1–10. https://doi.org/10.1016/1054-3139(95)80010-7