🔒 Security
- Locked dependencies updated beyond all reported vulnerable ranges: raises the minimum supported versions of Pillow, Requests, PyTorch, Transformers, and urllib3, refreshes affected transitive dependencies, and removes the now-unused cryptography dependency from the lock. This addresses 35 Dependabot findings: 19 high, 12 medium, and 4 low. (#655)
🐛 Bug Fixes
--instructionexclusivity is declared, and visible tomflux-capabilities: in-context-edit's prompt/instruction mutual exclusion was hand-checked after parsing, so the capabilities dump published--instructionas an independent flag and--prompt-file --instructionslipped through entirely.--instructionnow joins the--prompt/--prompt-fileargparse group; the "at least one" requirement stays post-parse. Also fixes--width's help interpolating the HEIGHT default, and documents why fibo-edit's matte writes no sidecar. (#578, #669)- Baking a LoRA into a sub-8-bit quantized model silently dropped the adapter: the fold requantized the merged weight at the base layer's own precision, and below 8 bits the quantization step is coarser than a typical LoRA delta (on Krea 2 at q4 the group step measures ~12x the delta rms), so
-q 4 --lora Xwith baking on, which is the default, generated the base image while the logs reported success. Sub-8-bit layers now requantize at q8 when a delta is folded in, the same escape the fp8 path takes, with a console line reporting how many layers moved; the per-layer loader already reconstructs such mixed saves from stored shapes. Applies to runtime baking and tomflux-saveof a quantized model with--lora. (#665, #668) - Foreign
--modelvalues are rejected on the boogu, z-image, flux2 and ideogram4 CLIs: all of them silently ignored a builtin name from another family and ran their own model instead (mflux-generate-boogu --model devran Boogu;mflux-generate-ideogram4 --model qwen-imageran Ideogram). They now resolve through the same restriction as the krea2/lens/ernie/z-image-turbo CLIs: aliases of the command's own model (or, for flux2, any registryflux2-entry, and for z-image, its distilled sibling) are accepted, anything else errors during CLI startup before any weights move, and paths or repo ids keep loading throughmodel_pathas before. flux2-edit additionally enforces the same distilled-checkpoint--guidance 1.0rule as flux2-generate. (#578, #650) - Shell completions cover every installed command: the generator's hand-maintained list had drifted six commands behind pyproject (
mflux-generate-boogu,mflux-generate-lens, bothmflux-generate-ernie-imagecommands,mflux-generate-ideogram4,mflux-capabilitiesnever completed). Commands are now discovered from the installed console scripts and, where a CLI exposesbuild_parser(), completions are generated from the CLI's real parser instead of a hand-copied recipe of it. (#578, #651) mflux-capabilitiespublishes wire types, not Python converter names: options validated by a named converter leaked the function name as their type (--vae-tile-sizeclaimed typevae_tile_size,--mlx-cache-limit-gbclaimedpositive_float, every Path option claimedPosixPath). Named converters now map to what they yield:int,float,path, andint-or-scalefor values that accept a pixel count, a2xfactor orauto. The dump's type field is pinned to that closed vocabulary by a test. (#578, #652)- The metadata sidecar of an in-context result can reproduce the run:
get_right_half()droppednegative_prompt,image_pathsand the redux fields when cloning metadata onto the cropped half, and the--save-full-imagecomposite was saved without a sidecar even under--metadata.redux_image_pathswas also serialized as a Python repr ("['a.png', 'b.png']") instead of a list, so--config-from-metadatacould never read it back. The unreachable restore branches forcontrolnet_save_cannyandimage_outpaint_padding, keys no released writer has ever emitted, are removed along with a stray debugprint()in the outpaint parse block. (#578, #649) mflux-generate-redux --config-from-metadatacan replay a sidecar: #649 maderedux_image_pathsa JSON list, but the redux CLI still declared the flag argparse-required andsupports_metadata_config=False, so a sidecar-only rerun exited 2 before restore ran.-Cnow restores the paths and strengths,--redux-image-pathsis required after restore rather than during parsing, and a missing sidecar path errors at parse time naming the sidecar. Old repr-string sidecars are not treated as path lists. (#578, #663)
📝 Documentation
- Lens and Boogu Image documented: both models join the README's supported-models table, each with a per-model README covering usage and options. (#659)
🧰 DX & Maintenance
- Machine-readable model registry extract: a new
scripts/ci_extract_models.py(with aci-extractworkflow andjustrecipe) dumps the supported-model registry as JSON, needed by CI to auto-build MFlux models for Hugging Face. (#658) - PyPI publish gated behind a protected
pypienvironment: the release workflow now runs under thepypideployment environment, so its reviewer-approval and branch-protection rules apply before anything reaches PyPI, and the trusted publisher is pinned to that environment name. A fast-fail step also rejects dispatches from any ref other thanmain. (#646) - Lens DiT loads through the shared
WeightDefinitionseam: replaces its bespoke weight-loading path with the mechanism the other models use. (#654) - Flaky Gemma 2 causality test fixed: the test could pick an out-of-vocab token and fail spuriously. (#653)