@@ -4,6 +4,63 @@ All notable changes to this project are documented here. The format is based on
44[ Keep a Changelog] ( https://keepachangelog.com/en/1.1.0/ ) and this project follows
55[ Semantic Versioning] ( https://semver.org/spec/v2.0.0.html ) .
66
7+ ## [ 0.6.0] - 2026-07-11
8+
9+ ### Added
10+
11+ - Anonymous crash reports: an unhandled exception sends the exception * type* and its code location
12+ inside photo-tagger (` module:function:line ` ), never the error message (messages can embed paths).
13+ Same opt-outs as the usage telemetry; capped per process. The one-time telemetry notice re-shows
14+ once for existing installs so the expanded disclosure is seen.
15+ - Telemetry now reports coarse hardware facts (CPU/GPU model, logical cores, RAM in whole GB; probed
16+ once and cached), per-run outcome counters (successes, failures, cache hits, retry recoveries,
17+ workers, token totals, model time, dry-run flag), and failure buckets (fixed labels like ` timeout `
18+ or ` metadata-write ` ) so breakage is measurable, not anecdotal.
19+ - The telemetry dashboard grew sections for adoption, usage, hardware & performance, and reliability
20+ & crashes, plus a global interface filter (all/CLI/GUI).
21+ - The inference cache prunes entries older than 180 days when it opens, so ` cache.sqlite ` stops
22+ growing forever (every settings change orphans its old namespace).
23+ - A short pause before the retry pass, so an overloaded model server is not immediately re-hit.
24+
25+ ### Changed
26+
27+ - ` --append-to-skip-file ` records full paths instead of bare filenames, so duplicate camera names
28+ across folders (` A/IMG_0001.CR3 ` , ` B/IMG_0001.CR3 ` ) can no longer make a resumed run silently skip
29+ unprocessed photos. Old name-only skip files keep working.
30+ - Config-file values now pass through the same conversion and validation as CLI flags, so a mistyped
31+ value fails with a clean error at startup instead of a traceback mid-run.
32+ - Photos with identical pixel content in one concurrent run share a single model call instead of
33+ each paying their own.
34+ - CSV reports are written as ` utf-8-sig ` so Excel renders accented titles and keywords correctly.
35+
36+ ### Fixed
37+
38+ - Passing any CLI flag from an option group no longer silently resets the group's other config-file
39+ values to built-in defaults (e.g. ` --temperature ` used to revert a configured ` max_tokens ` ).
40+ - ` --dry-run ` no longer appends previewed photos to ` --append-to-skip-file ` , which made later real
41+ runs skip photos that never got metadata.
42+ - The description mirror is written to ` XMP-tiff:ImageDescription ` ; the previous ` XMP-exif ` tag was
43+ silently rejected by ExifTool, so the mirror never reached the file.
44+ - Keyword capitalization no longer corrupts acronyms and apostrophes (` NYC ` stays ` NYC ` instead of
45+ becoming ` Nyc ` ; ` bird's nest ` no longer becomes ` Bird'S Nest ` ).
46+ - One corrupt or zero-byte photo no longer makes the whole folder read as untagged (and get
47+ re-tagged): the batched ExifTool reads salvage the healthy files, and ` --skip-tagged ` and the
48+ GUI's Tagged column now distinguish "could not read" from "no metadata".
49+ - Windows: file locking works again (the PID note into the held lock file raised on every
50+ acquisition), and the batched metadata reads no longer miss every file over path-separator
51+ differences.
52+ - Ctrl-C during concurrent batch start-up is honored instead of grinding through every queued photo;
53+ never-submitted photos are reported as pending.
54+ - A single over-long or blank keyword from the model no longer burns the whole validation retry
55+ budget (full vision calls); items are cleaned instead.
56+ - GUI: streamed-in thumbnails no longer swallow the next grid click; a non-domain error during
57+ generation no longer leaves the window stuck in the running state; removing photos prunes the
58+ visible grid and thumbnail cache; bulk actions no longer kick you out of the photo or folder being
59+ reviewed.
60+ - The ` gui ` command only suggests installing the ` [gui] ` extra when PySide6/shiboken6 is actually
61+ missing; other import errors surface as themselves.
62+ - A failed cache initialization no longer leaks its SQLite connection.
63+
764## [ 0.5.0] - 2026-07-09
865
966### Added
0 commit comments