Skip to content

v0.35.0

Choose a tag to compare

@skymanbp skymanbp released this 22 Aug 01:03
· 78 commits to main since this release

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)

  1. LensProfile schema forward break. The recipe's LensProfile block gains mask_warp + mask_warp_src, always serialised, and the block refuses unknown fields — so every recipe.json written 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 empty mask_warp is identity, and rendering of old recipes is bit-identical on this axis.

  2. 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.

  3. 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: BrushCarriedBrushRendered — the alpha is our measured model, not Adobe's rasteriser.

  4. 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 ≥ 0 is bit-identical.

  5. 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 = 0 keeps the analytic hard edge byte-for-byte. Radials with Feather ≥ 10 re-render — at Feather 100 the old law painted 2.08× Lightroom's area.

  6. AI masks all recompute once. The subject backend is a commit-pinned BiRefNet (e2bf8e44…) with a named U²-Net fallback tier, and AI_BACKEND_GENERATION moves 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.

  7. 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 .lcp lens-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-edge export 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 .lcp read) 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).