- CLI batch: recursive inputs keep the engine's tree order for {serial};
--format picks the encoder whatever extension --naming writes; the
summary prints before --error-log is written.
- Batch: a jobs.cancel during a write keeps that file in `files`;
Opened Files refuses a default-named result that replaces another open
document's file; a recorded Save leaves a document changed when Batch
writes nothing for it.
- Recording: folded Move-tool nudges add whole-pixel steps; a null
Check Spelling `action` is recorded as Check Spelling.
- Linked files: a document without links lists none missing; a look
whose links changed while it ran is dropped.
- Save for Web: a null or empty destination opens the picker; a rename
while the picker is open writes the picked file.
- Actions: a Check Spelling step fails instead of replacing a dialog
opened by hand.
- Docs: desktop Batch cancel flow, Check Spelling step shape, filter row
history count.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#4466 landed `{name}` / `{serial}` / `{date}` file naming templates and
`startingSerial` on main while this branch was open. The merge keeps that
contract on top of the branch's `batch::Naming`: `{serial}` pads to three
digits (`{serial:1..4}` explicit), `{date}` is the UTC `YYYY-MM-DD`, a
template without `{ext}` gets the output extension appended, `naming` must
be a string of at most 255 bytes, `startingSerial` is 1..4294967295 and the
serials of a run must stay within that, and the whole plan is checked before
anything is written (`plan_outputs`): no output may replace another input
before it is read. `file_cmds/batch_naming.rs` and `process_outputs` are
superseded; #4466's tests stay and pass. The Batch dialog starts with a blank
template (hint `{name}.{ext}`), `startingSerial` replaces `startSerial`
everywhere (engine, lens batch, CLI validation), docs/batch-naming.md
describes the merged tokens.