Version 1.9.1

RawCull Changelog โ€” v1.8.5 โ†’ 1.9.1

To be updated on Apple App Store.

v1.9.0 โ†’ v1.9.1

๐Ÿท๏ธ Burst Grid โ€” Badge Label Legend

A legend panel now appears at the top of the burst grouping grid, explaining what each badge label means.

  • Labels are shown as coloured badges with a short description alongside each: High confidence, Review recommended, Low confidence, Manual, Applied, Best, Suggested, and Review.
  • The legend is only visible when burst groups are displayed, so it never clutters the regular grid.

โœ… Batch Badge Selection & Rating

The culling grid now supports selecting and rating multiple thumbnails by badge label in a single action.

  • A row of badge buttons (e.g. Best 3, Manual 1, Applied 2) appears in the grid toolbar when batch selection is enabled. Each button shows how many visible thumbnails carry that label.
  • Click a badge button to select all matching thumbnails at once. Hold โŒ˜ Command to add or remove them from the existing selection.
  • A rating picker (X / P / 2โ€“5) and an Apply button let you rate all selected thumbnails in one step.
  • Batch controls are shown in the standard grid view and hidden while burst groups are active.

๐Ÿ”„ Burst State Preserved Across View Modes

Burst mode is now kept alive when you switch between the Loupe, Grid, and Similarity Grid views.

  • Previously, navigating away from the Similarity Grid cleared burst mode. Now burst state is only reset when switching to the Rated Grid.
  • The new showsBurstGroups computed property gates burst-group rendering to the Similarity Grid, so burst grouping is never inadvertently shown in other views.

๐Ÿ› Bug Fixes & Internal Improvements

  • Version metadata: Updated app marketing version to 1.9.1.
  • showsBurstGroups: Extracted as a computed property on RawCullViewModel (mainViewMode == .similarityGrid && burstModeActive) to centralise burst-display logic and replace scattered burstModeActive checks throughout views.
  • Documentation cleanup: Removed stale internal markdown files (filereadandwrite.md, memory-cache-diagnostics-checklist.md, packages.md, swiftuicomponents.md) from the documents/ folder.

๐Ÿงช Tests

  • BurstAnalysisTests: Added test verifying that BurstGroupPresentation.labelDescriptions contains all eight expected labels (confidence levels + Manual, Applied, Best, Suggested, Review) with no duplicates, and that each badge returned for high/medium/low confidence presentations is present in the legend.
  • BurstAnalysisTests: Added test confirming that showsBurstGroups is true only in the Similarity Grid, and that burst state survives switching to Loupe or Grid view.

v1.8.5 โ†’ v1.9.0

โœ‹ Manual Burst Winner Override

You can now override the algorithm’s automatic burst winner and pick the keeper yourself.

  • A “Set Manual Winner” button appears in the Comparison view’s burst evidence panel when reviewing a burst group. Select a frame, then click the button to save it as the winner.
  • The burst group header in the culling grid now shows “Manual winner: โ€ฆ” instead of “Best: โ€ฆ” when a manual choice is active.
  • Candidate badges distinguish the manual choice from the automatic recommendation, so you can see both at a glance.
  • A “Manual winner active” notice appears in the comparison panel when a manual override is in effect.
  • Manual selections are persisted in savedfiles.json alongside ratings, so they survive app restarts and catalog reloads. Stale overrides are pruned automatically.
  • When “Keep Best in Group” is run on a burst that has a manual winner, the manual selection takes precedence over the algorithm.

๐Ÿง  Safer Burst Culling Decisions

Burst culling is now more conservative about when automatic rating actions are allowed.

  • “Keep Best” and “Keep Top 2” are only available when the burst analysis is considered safe for one-click culling and sharpness scores are present.
  • Medium-confidence bursts now use “Review recommended” language and guide you toward “Compare top 2” instead of immediate automatic culling.
  • Low-confidence bursts now ask for review instead of presenting an automatic keeper decision.
  • Keyboard shortcuts for automatic burst actions are ignored when a burst is not safe for one-click culling.
  • The Comparison view hides automatic keep actions when the current burst does not meet the safety threshold.

๐Ÿงพ Clearer Burst Group Presentation

Burst headers in the culling grid have been refined to make recommendations easier to understand.

  • Burst groups now show titles like “Burst of 3 photos”, with capture timing and camera context when available.
  • Recommendation text now uses clearer phrasing such as “Keep frame 2”, “Suggested: frame 3”, “Needs review”, or “Manual winner: frame 3”.
  • Analysis reasons and cautions are translated into concise human-readable explanations such as “Sharpest frame”, “top frames are close”, or “autofocus unavailable”.
  • Badges now reflect the current state more explicitly: High confidence, Review recommended, Low confidence, Manual, and Applied.

๐Ÿ”„ Burst Re-index

A new “Reanalyze Bursts” button appears in the similarity/burst grouping toolbar.

  • Clicking it deletes the saved burst analysis cache for the current catalog and runs a fresh analysis from scratch.
  • The button is disabled while grouping or analysis is already in progress.

๐ŸŽญ Focus Mask โ€” On-demand Generation

The focus mask is now generated only when you actually toggle it on, instead of being computed for every image as it loads.

  • This reduces idle CPU and memory usage when the focus mask overlay is not in use.
  • Mask generation is properly cancelled when you toggle the overlay off mid-compute.
  • The mask state resets cleanly when you navigate to a different file.
  • The focus mask toggle button is now enabled as soon as the image is available.

๐Ÿ” Zoom โ€” Preserve Scale While Navigating

When navigating between images in the zoom view, the zoom level is now preserved across images. Only the pan offset is recentered.


๐Ÿ—‚๏ธ Culling Grid โ€” Burst Analysis State Included in Cache Key

The burst analysis recommendation and review state are now factored into the culling grid’s layout cache key, fixing a subtle stale-display issue.


๐Ÿฉบ RAW Diagnostics โ€” Refactored to ViewModel

The RAW diagnostics sheet trigger (โŒ˜I) has been refactored so presentation state is owned by RawCullViewModel via presentRawDiagnostics().


๐Ÿ› Bug Fixes & Internal Improvements

  • Version metadata: Updated app marketing version to 1.9.1 and build number to 90.
  • Main window layout: The main navigation view now starts in detail-only mode.
  • Logging: Fixed incorrect logger identifiers in RequestThumbnail.
  • Burst cache deletion: BurstAnalysisCache now exposes a delete(catalog:) method used by the re-index flow.
  • Burst review states: Added finer-grained review states for algorithm review and manual winner overrides.
  • Swift 6 cleanup: Burst presentation helpers use nonisolated computed properties and modern Swift expression syntax.

๐Ÿงช Tests

  • BurstAnalysisTests: Expanded coverage for burst grouping, ranking, manual winner overrides, re-index logic, conservative one-click culling, and burst presentation copy.
  • BurstGroupPresentationTests: New tests for high-, medium-, low-confidence, manual winner, applied-state, and thumbnail badge presentation.
  • CullingModelTests: Tests for burst winner override persistence, pruning, and catalog reset behaviour.
  • ReviewQueueTests: Tests for the review queue builder.
Last modified May 27, 2026: update (6b6024b)