Skip to content

Add mizer 3.3 announcement blog post - #6

Open
gustavdelius wants to merge 2 commits into
masterfrom
add-mizer-3-3-announcement
Open

Add mizer 3.3 announcement blog post#6
gustavdelius wants to merge 2 commits into
masterfrom
add-mizer-3-3-announcement

Conversation

@gustavdelius

Copy link
Copy Markdown
Member

Draft announcement for the mizer 3.3 release, built around four features that can be demonstrated rather than just described. Every number, message and figure in the post was produced by running the code against the current mizer source tree — nothing is invented output.

Structure

  1. Is your model at its steady state? isSteady(), the new biomass drift line in summary() (0.014/year → 4.6/year after matchGrowth()), the message the match…() functions now emit, and plot(getSteadyResidual(params)).
  2. Steady states you cannot reach by projecting. The North Sea model at effort 1.5, past its Hopf bifurcation: steadyNewton() finds the steady state, getStability() returns a complex leading eigenvalue 1.2359+0.847932i predicting a 7.4-year oscillation, and projectToSteady() settles onto a 5.4-year limit cycle. The gap between the linear and nonlinear period is explained rather than glossed over.
  3. Scanning a model. Why measuring a quantity on an attractor requires knowing what the attractor is, then plotYieldVsF(NS_params, species = "Cod") with $F_{MSY}$ marked at 0.9, and the MizerScan summary.
  4. Plots that know what they are showing. Array types, then the length-axis spectrum now carrying the resource and the total line that 3.2 silently dropped.

The final section covers the twelve guides and the skills they are generated from, and makes the point that matters for mizerAgents: setup_mizer_agent() now reads skills from the installed mizer, so upgrading mizer upgrades an agent's guidance with no mizerAgents release needed. The upgrading skill gets particular attention, since vignettes are not installed and that is exactly what an agent needs when a script breaks after an upgrade.

make-figures.R in the post directory regenerates all four figures.

Notes for review

  • Date and version. Dated 2026-08-21, and the post says install.packages("mizer"). DESCRIPTION in the mizer repo is still at a development version, so both want settling before this goes live.
  • Inline code links. filters/inline-code-links.lua resolves inline code against the installed mizer, which is still 3.2.x here, so the new names (scanModel(), isSteady(), getSteadyResidual(), plotYieldVsF()) are currently left unlinked. They will resolve once 3.3 is installed and the site is re-rendered.
  • Only the new post's output is committed. A full quarto render on this machine also deleted docs/CNAME and the *_files/figure-html/ images of several older posts, whose regenerated HTML still references them — the same breakage that commit 7b83761 had to undo. All of that collateral was restored; this PR touches only the new post plus the site-level index.html, index.xml, listings.json, search.json and sitemap.xml, matching the file set of the 3.2 announcement PR (Add mizer 3.2 announcement blog post #5). Worth knowing that the render is not currently reproducible on a clean checkout.
  • The accessor renaming (17 get-prefixed accessors superseded) is only a bullet in "Also in 3.3", since it does not demo well and the upgrading article covers it properly. Happy to give it more room.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BwrX4RLY5Fc7d6cu3fnJAQ

gustavdelius and others added 2 commits August 21, 2026 15:44
Announces the 3.3 release around four features that can be demonstrated,
each with a figure generated from the current mizer source tree:

- Checking whether a model is at its steady state: isSteady(), the biomass
  drift line in summary(), the new message from the match...() functions,
  and plot(getSteadyResidual(params)).
- Steady states that cannot be reached by projecting: steadyNewton() and
  getStability() on the North Sea model past its Hopf bifurcation, and the
  limit cycle that projectToSteady() then detects.
- Scanning a model with scanModel(), shown through plotYieldVsF() with
  F_MSY marked.
- Array types and the length axis, which now carries the resource and the
  total line.

The last section covers the twelve guides, the skills they are generated
from, and the fact that mizerAgents now installs those skills from the
installed mizer, so an agent's guidance tracks the version the project runs.

make-figures.R in the post directory regenerates all four figures.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BwrX4RLY5Fc7d6cu3fnJAQ
getStability()'s continuous eigenvalues are not independent of `dt`, as
its documentation claims, and the default `dt = 1` is far outside the
range where the discrete-to-continuous mapping has converged
(sizespectrum/mizer#556). The post quoted the default-`dt` values, which
overstate the growth rate by a factor of about 17 and put the predicted
period at 7.4 years.

Recomputed at `dt = 0.1`, where both branches of the analysis have
converged: max_real_part 0.072, leading eigenvalue 0.0721+1.2165i,
predicted period 5.16 years.

That also fixes the explanation. The post attributed the gap between the
predicted 7.4 years and the observed 5.4-year limit cycle to
nonlinearity, following the dynamic_stability vignette. Most of that gap
was the discretisation error: the converged prediction of 5.2 years is
close to the cycle the model actually settles on, so the linear analysis
does considerably better than the post gave it credit for.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BwrX4RLY5Fc7d6cu3fnJAQ
@gustavdelius

Copy link
Copy Markdown
Member Author

Pushed a correction to the stability section (923e3c6).

Investigating the dt dependence I mentioned in the description turned out to matter for the post, not just for mizer. getStability() documents its continuous eigenvalues as independent of dt, but they are not, and the default dt = 1 is well outside the range where the discrete-to-continuous mapping has converged — filed as sizespectrum/mizer#556.

The post had been quoting the default-dt numbers, which overstate the growth rate by a factor of ~17 and give a predicted period of 7.4 years. Recomputed at dt = 0.1, where both branches of the analysis have converged:

  • max_real_part 1.235902 → 0.07209386
  • leading eigenvalue 1.235902+0.847932i → 0.07209386+1.216536i
  • predicted period 7.4 → 5.16 years

That also changes the story for the better. The post explained the gap between the predicted 7.4 years and the observed 5.4-year limit cycle as nonlinearity reshaping the cycle, following vignette("dynamic_stability"). Most of that gap was discretisation error: the converged prediction of 5.2 years is close to the cycle the model actually settles on, so the linear analysis performs considerably better than the post claimed. The text now says so.

The code block passes dt = 0.1 explicitly, with a one-line parenthetical pointing at #556. If #556 is resolved by changing the default before 3.3 ships, that argument and the parenthetical should come out of the post. The vignette and the analyse-stability skill carry the same uncorrected numbers and the same nonlinearity explanation, so they need the same treatment.

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