# Features 1.39.0 → 1.50.2

Release-by-release changelog of the 2026-10-16 → 2026-10-21 run, continuing
[`FEATURES_1.16_TO_1.36.md`](FEATURES_1.16_TO_1.36.md). Fleet rolls in this span: #18 (1.39.4),
#19 (1.44.0), #20 (1.45.1), #21 (1.46.0), #22 (1.47.0), #23 (1.50.2, 2026-10-21 15:48Z, the
fleet baseline as this file is written). Every feature has its full description in the
commit message on master; chapter references point at the detailed text.

## 1.39.x — backers: outlined private data and AI-layer fixes (2026-10-16)

- **1.39.0** compile-engine derivatives carry *outlined* Illustrator private data instead of
  live text, so a derivative reopens in Illustrator with its shapes intact (ch. 12).
- **1.39.1–1.39.4** `--backers` AI graft: offset subtracts the trim-box origin, zero-length
  segments dropped, every subpath closed on an explicit start point, offset bands stroke a
  clean pen path (ch. 11). Rolled as roll #18.

## 1.40.0 — `--usage` sidecar and `--strict-fonts` (2026-10-20)

Global flags for the metered API service (ch. 19): `--usage=FILE` writes the usage sidecar
on every exit path, success or failure (fields in §19.5); `--strict-fonts` makes a font that
is neither embedded nor in `--fonts-dir` an error (exit 1, `missing fonts: ...`) instead of a
silent substitute (ch. 3 global rows, §19.3).

## 1.41.0 — `--trap=N[:MODE]` (2026-10-20)

Plate trapping on `--separate` output (ch. 18). Morphological square dilation; the border
ring artefact of the first cut was fixed in the same release.

## 1.42.0 — `--match-colors` (2026-10-20)

Nearest colour-book entry per spot (or per dominant colour of a raster) with ΔE, for
quoting and plate naming (ch. 18).

## 1.43.0 — `--tac-check[=N]` (2026-10-20)

Total area coverage per page against a shop limit, report mode (ch. 17).

## 1.44.0 — `--distort` (2026-10-20)

Cone warp with shrink compensation for tapered substrates (ch. 17). Rolled as roll #19; this
completed the six API-service items of ch. 19.

## 1.45.0 / 1.45.1 — thin-line per plate (2026-10-20)

`--thin-line` measures positives per plate and negatives on the colour union, whole-shape
minimum-Feret rule, statistics block (ch. 4). **1.45.0 was withdrawn before roll**: it dropped
thin-line plates on default-colour pages (232 pages in the 80-file sweep). 1.45.1 always
renders the process mass and links against the Java 8 API (maven `release` 8, see ch. 16).
Rolled as roll #20.

## 1.46.0 — exit funnel for input faults (2026-10-20)

Shared modes exit **2** with one plain stderr line and an empty stdout on a damaged, non-PDF
or password-protected source; before 1.46.0 they printed a stack trace and exited 0 (ch. 2
exit-code table, ch. 15 object-vs-array mode table). Rolled as roll #21.

## 1.47.0 — native envelope-mesh forging (2026-10-20)

Design-lab Mesh warps under `ai_private` are forged as real Illustrator envelope meshes,
not anchors-only approximations (ch. 7). Rolled as roll #22.

## 1.48.0 — `--swap-spot-colors` fails loud (2026-10-20)

An unparseable spec or a missing separation exits 2 with the file untouched; a spot name may
contain any character except `=`, `:` and `;`. Through 1.47.0 the same inputs were a silent
exit-0 no-op that still re-saved the file (ch. 5.3, ch. 15).

## 1.49.0 — derivatives rebuild Illustrator private data (2026-10-21)

The `ai` derivative engine rebuilds the master's private data for every bound story (ATE
text, point-text cache, envelope result art refit with Deform width/height keys, hidden
values as empty text objects, production-only layer hidden in the working save) and emits
replacement blocks at each change's first drop site so clip-based distress still applies to
the new text (ch. 12). Unsupported cases fall back to the old strip with a reason in
`warnings[]`.

## 1.50.0 — `--list-text` and `--bind-variables` (2026-10-21)

Two standalone modes that make a plain Illustrator save derivable without the Variables
panel: `--list-text FILE.pdf` lists the live text objects (id, text, font, size, envelope or
frame bbox, point anchor, alignment, bound variable); `--bind-variables=SPEC.json FILE.pdf`
writes the bindings into the private data in place (ch. 12). An older jar answers
`Unknown option: --list-text`, which consumers use as the version probe.

## 1.50.1 — Type0 glyphs in the ink box (2026-10-21)

The ink bounding-box finder gained its composite-font branch: Type0 glyphs are measured and
the `Unknown font class` diagnostic no longer prints on stdout (ch. 15 landmine). Preview
PNGs are byte-identical to 1.50.0 where the file had no Type0 text.

## 1.50.2 — envelope box for lattice-mesh stories (2026-10-21)

`--list-text` reports the envelope box, not a pre-warp anchor, for a story inside a
multi-row envelope mesh (an unwarped mesh used as the fit region substituted text conforms
to). Rolled as roll #23.

## Exit codes

Unchanged set 0/1/2/3/4. New reach of code 2: 1.46.0 input faults (all shared modes),
1.48.0 swap spec faults, 1.50.0 bind refusals.

## Help topics added or changed

`--help=text-variables` (also `list-text`, `bind-variables`), `--help=prepress` rows for
`--tac-check`/`--distort`, `--help=separate` rows for `--trap`/`--match-colors`, the general
help's "TEXT VARIABLE MODES" section. `--help=compile` was md5-checked unchanged across the
1.50.x releases and devops' roll canaries saw help changes as additive only (php-datahandler
parses `--help=compile`, so it is never edited without a notice to datahandler-dev).
