--- orphan: false --- # What's new in v0.4.2 ```{versionadded} v0.4.2 ``` ## Summary MADDENING is now licensed under the Apache License, Version 2.0. ## What changes for existing code - **The licence is Apache-2.0** (it was LGPL). Nothing in the library's behaviour changes. Apache-2.0 is permissive, with no copyleft: a product that uses MADDENING keeps the copyright and licence notices, ships the attributions in the new `NOTICE` file, and marks any of MADDENING's files it changed. The licence includes an explicit patent grant from each contributor. The LGPL replaceability statement in the regulatory guides is replaced by a licence statement. Releases up to and including 0.4.1 were distributed under the LGPL, and copies obtained under those terms keep them. ## Known anomalies - `MADD-ANO-297`: At the default `atol=0` a coupling group can report `converged=True` after one pass far from its fixed point when one field holds entries of very different magnitude (order 1 beside order 1e-8) and a change passes through the small one. Keep such quantities in separate fields; a tighter `rtol` does not help. A fix is planned for a later patch. - `MADD-ANO-298`: `python -m maddening.compliance check-anomalies` prints OK and exits 0 on a registry with no entries, and on one whose references could not be checked because a package they import is missing. Do not rely on its exit status alone: call `validate_anomaly_registry` with `notes=[]` and treat any note as unverified, and refuse an empty registry in your own gate. A fix is planned for a later patch. - `MADD-ANO-299`: `collect_node_metadata()` and `collect_hazard_hints()` see only direct subclasses of `SimulationNode`: `WaveletAdaptiveNode`, and any downstream node that derives from a base class of its own, are left out. Walk `SimulationNode`'s subclasses recursively and read each class's `meta` instead. A fix is planned for a later patch. - `MADD-ANO-300`: A served node whose `initial_state()` cannot be evaluated abstractly (`WaveletAdaptiveNode` is one) keeps about 0.5 MB of JAX trace alive for every accepted `PUT /graph/params` and checkpoint load, until the process exits. Restart a server that takes many such writes. A fix is planned for a later patch. - `MADD-ANO-301`: After `verify_node` returns a FAIL verdict, Hypothesis's line-tracing events stay on in the process (Python 3.12 and 3.13), and pure-Python code runs several times slower until it exits. Turn them off after a failing verification (the registry entry gives the three `sys.monitoring` calls), or verify in a separate process. A fix is planned for a later patch. ## For contributors - **A change is recorded in fragments.** A pull request no longer edits `CHANGELOG.md`, the release notes or the anomaly registry. It adds `docs/fragments/changes/.yaml` and, for a new anomaly, `docs/fragments/anomalies/.yaml`, where the entry carries a provisional label until `scripts/fragments.py assemble` numbers it. The assembler also writes the changelog and the release notes before each release, and `scripts/check_fragments.py` checks the fragments on every push. "Recording a change" in the documentation standards has the procedure. - **Lookup tools in `scripts/`**: `anom.py` (`list`, `show`, `next` and `refs`, fragments included), `claim.py` and `outline.py`. - **The anomaly gate is about five times faster**: one run parses each test file it cites once. - **The 3D frame renderer's tests run in CI.** `tests/api/test_frame_renderer_3d.py` needs PyVista (the `viz3d` extra) and a display, so the sharded lanes skipped all 14 of its tests and no job ran them. A `viz3d` job in `ci.yml` now installs the extra and runs the file under `xvfb-run` with Mesa's software OpenGL. It sets `MADDENING_REQUIRE_VIZ3D_TESTS=1`, so a missing PyVista fails the job instead of skipping the file. The anomaly gate's record of what CI never runs (`PATHS_CI_NEVER_RUNS`) no longer lists the file and still lists `tests/viz`, which no job runs.