v0.35.0
Autoshop v0.35.0
The largest render-correctness release on this branch: brush masks actually render, the radial feather falloff is a measured 290×11 table, negative texture has its measured shape, every mask samples at pixel centres, parametric masks live in their measured Lightroom frames, and the subject segmenter is a pinned BiRefNet with a named fallback. Seven of these changes are breaking in one direction or another — read the list below before upgrading a shared library.
⚠ Seven hard changes (read before upgrading)
-
LensProfileschema forward break. The recipe'sLensProfileblock gainsmask_warp+mask_warp_src, always serialised, and the block refuses unknown fields — so everyrecipe.jsonwritten by v0.35.0 is refused by name by v0.34.0 and earlier (the whole recipe, not a dropped field). The reverse is lossless: v0.35.0 reads every old recipe, an emptymask_warpis identity, and rendering of old recipes is bit-identical on this axis. -
Parametric masks change frames. Lightroom stores a radial/linear in the post-lens-correction frame and a brush in the pre-correction frame; the engine used to read both in one frame. Radial/linear now map through the exact inverse of this engine's own geometry stage; a brush is identity. Old recipes: on a geometry-active frame, radial/linear masks land 0.09–0.30 px from their stored coordinates instead of 8–24 px out — which means those renders change. No lens profile, or geometry off: bit-identical.
-
Brush masks render. The brush arm was a literal
0.0(carried, disclosed, not rendered). It is now a real rasteriser — a measured dab kernel, screen accumulation, LR-anchored. Every recipe with an LR brush mask renders differently (the mask used to not exist). The disclosure renames with the behaviour:BrushCarried→BrushRendered— the alpha is our measured model, not Adobe's rasteriser. -
Negative texture changes shape. The notch filter is replaced by a measured dual-lowpass elevated step with a hyperbolic depth law, pinned to 45 LR anchors. Everything with
texture < 0(global or per-mask) re-renders;texture ≥ 0is bit-identical. -
Radial feather falloff is now a measured table. After three refuted closed forms, the falloff ships as a measured 290×11 LUT (11 feather columns from a dedicated export ladder);
Feather = 0keeps the analytic hard edge byte-for-byte. Radials withFeather ≥ 10re-render — at Feather 100 the old law painted 2.08× Lightroom's area. -
AI masks all recompute once. The subject backend is a commit-pinned BiRefNet (
e2bf8e44…) with a named U²-Net fallback tier, andAI_BACKEND_GENERATIONmoves 1→2: cached alphas from v0.34 and earlier recompute once on first develop, all three subtypes (sky/object backends did not change; one generation constant covers three fields by design). A machine that fell back re-upgrades itself once the dependencies appear, and says why. -
Half-pixel sampling. The whole mask family (radial, linear, brush, bitmap, AI) now samples at pixel centres (
(x+0.5)/w) — measured against Lightroom on two different frames. Every mask shifts up-left by 0.5 px, independent of feather, geometry, or aspect.
Also in this release
- Adobe
.lcplens-profile reading: profiles are located, parsed and solved into the recipe as a named model of Lightroom's warp with a seven-state provenance tag (in-camera knots, solved.lcp, or an honest named refusal). The solved model is carried provenance — not yet a render-time input; a frame this engine does not itself correct still renders masks at their stored coordinates. --long-edgeexport sizing on the three render commands.- One bounded retry for HTTP 524/529 with per-class billing disclosure; eval checkpoint/resume on by default.
- Segmentation closeout: named backend in every report line, one-shot backend marker migration, digest-pinned model sources, a self-authored ADE20K class table (no third-party licence carry).
- Pre-release: an independent read-only model review was adjudicated finding-by-finding; two confirmed gaps (a cache entry bound, a bounded
.lcpread) landed before this tag. Ledger:docs/ROADMAP.md.
Gates at this tag
- Battery: 816 lib (9 ignored) / 14 CLI / 132 GUI / 2+2 contract — both configs (default &
--features gui), clippy clean. - RAW zoo: 9/9 makes decode and self-agree (
AUTOSHOP_RAW_ZOO). - Real Lightroom sidecars: 7 sidecars / 42 masks imported, 0 refused (
AUTOSHOP_MB_FIXTURES). - LR probe fixtures: measured-ellipse decode green (
AUTOSHOP_LR_PROBE_FIXTURES). check_docs --gates: 22/22. GUI font subset: 803/803. i18n audit: clean.
Downloads
| file | bytes | sha256 |
|---|---|---|
autoshop.exe (CLI) |
31,063,300 | e48f6bbc9a6e9bf4aa98b01240eb6d733136d68320b6e79312d9b239bddfa6c6 |
autoshop-gui.exe (GUI) |
40,706,348 | b58b7be4b5e83b3f70e33b8023aba3bcfb985a1762d6eed7e39ef1deafb9a492 |
Recipes are JSON; v0.35.0 reads every recipe earlier releases wrote. v0.34.0 and earlier refuse v0.35.0 recipes by name (see item 1).