Release checks
Some behavior cannot be proved by the test suite: a rename performed by Finder itself, the menu bar item, the native window, and how any of it behaves on the oldest supported system. This page records what is checked automatically, what was last checked by hand, and what is still open.
Checked automatically
| Command | Covers |
|---|---|
python3 tools/check-macos-runtime.py | Vision startup, a cold framework cache, allowed input, and denial of an unrelated file inside the native helper sandbox. |
swift test | Every converter, the watcher, decisions, originals, Undo, history, and backups. |
swift test --filter 'AppSettingsTests|AutomaticActionTests|BackupRetentionTests|ConversionModelTests|FormatDetectionTests|HistoryTests|KeepOriginalTests|MonitoredPathsTests|MultipleOutputTests|SourcePackageTests|WatchedFolderTests|testAutomaticConversionAfterExternalRename' | The automatic-conversion surface on its own. |
python3 tools/check-app.py | The packaged command outside the repository, with no development paths. |
tools/check-app.py drives Contents/MacOS/allomer, the command-line converter. It never
launches the app itself, so the watcher, decisions, Undo, history, and the menu bar are outside it.
Last clean oldest-system run: 2026-09-22 on macOS 14.8.7, arm64, in a Tart clone, against the
packaged app from commit 9dbe478.
The packaged-app suite and the cold-cache Vision sandbox probe both passed. Earlier runs found and
fixed three system differences: AVIF encoding availability, VideoToolbox quality handling, and EPUB
ZIP metadata. The checks now exercise those paths on macOS 14.
WatchedFolderTests covers the saved watched and excluded folders, which are the only preference
stored as bookmarks. If they do not come back after a restart, every automatic behavior stops at
once, and nothing else in the suite reads that write path.
GitHub Actions runs these source checks on Apple Silicon hosts with macOS 14, 15, 26, and 27. The labels are pinned to exact system generations. A change must pass every job. The macOS 27 job is a preview runner while that image is new. It warns and continues when Vision is unavailable outside the sandbox on the hosted image. A sandbox-only Vision failure still fails the job.
The native runtime check exists because macOS 27 changed Vision. Vision began compiling recognition models under the helper's user cache. The old sandbox denied that write even though the code still built. The check removes its private probe cache first, runs accurate English OCR through the same sandbox source, and confirms that an unrelated file stays unreadable. A fixed language keeps the hosted check independent of automatic language-detection assets.
OrbStack runs Linux guests. It cannot test AppKit, Finder, Vision, macOS permissions, or the app's helpers on an older macOS release. Use it for Linux documentation work only.
GitHub plans to remove its macOS 14 runner on November 2, 2026. After that date, run the same checks in a clean Tart Sonoma VM on an Apple Silicon Mac. Tart uses Apple's virtualization framework and publishes macOS 14, 15, and 26 images. Its base image download is about 25 GB. Run the exact built app in each release VM with:
python3 tools/check-app.py /path/to/Allomer.app
Use a fresh VM clone or remove ~/Library/Caches/nativeconvert before the OCR check. Test macOS 27
on its GitHub preview runner and on the current development Mac until a stable Tart image exists.
Checked by hand on the packaged app
Run these against the built .app, not a development binary. Use throwaway folders. The app's
preferences live in com.ashbench.allomer; back them up first if the machine holds real ones.
- Folder selection. Choose Add Watched Folder…, pick a folder. It appears in the list and automatic conversion turns itself on.
- Recursive watch. Rename a file's extension in Finder inside a subfolder of the watched folder. It converts.
- Immediate conversion and source preservation. With Convert immediately, rename
photo.pngtophoto.jpgin Finder. The file becomes a JPEG and the original bytes are in the.allomer-…folder beside it. - Ask first. Switch After an extension change to Ask first and rename another file. It appears under Waiting for your decision, and the menu bar offers to review it. Skip keeps the new name and the original contents.
- Exact Undo. On the History tab choose Undo. The old name and the original bytes come back.
- Keep the original. Turn on Keep the original file after conversion and rename again. Both the converted file and an untouched original are there.
- Collision refusal. Turn on Convert to multiple formats at once, put a file named
x.webpbesidex.png, and renamex.pngtox.jpg,webp. The JPEG is created,x.webpis left exactly as it was, and the window explains which output was skipped. - Relaunch. Quit and reopen. The watched folder, the chosen action, and the history rows are still there, and a further Finder rename still converts.
- Menu bar. Its commands open the window on the tab they name, and Pause stops conversion.
- Availability messages. Rename a helper out of
Contents/Helpersand start the app. It refuses with a reinstall message instead of quietly offering fewer formats.
Last run 2026-09-20 on macOS 27.0, arm64, against the packaged app in a temporary folder. All ten passed. Two defects found and fixed in the same change: the menu bar item was announced by its symbol's name rather than the app's, and monitoring a folder that the skip list covers reported success and then converted nothing.
Last oldest-system GUI run: 2026-09-22 on macOS 14.8.7, arm64, against the same packaged app. Every menu bar command reopened the window in front and selected its named tab. The waiting-decision list, status-menu count, active/waiting count, and running History step row updated while conversions ran. The image picker offered AVIF, HEIC, ICNS, and ICO. With Full Keyboard Access enabled, Tab reached the main controls and the keyboard activated all four tabs. A VoiceOver navigation smoke test also announced the focused tab and content area without an app failure.
Signed-build checks
After Developer ID signing and notarization are configured, run these checks on a clean account:
- Quarantined first launch and translocation. Download the disk image in a browser. Launch the app once from the mounted image, then drag it to Applications and launch it again. Confirm both launches find every bundled helper and resource. Repeat the Applications launch with networking disabled to prove the stapled app ticket works on its own.
- Launch at login. Enable Settings → General → Launch at login, log out, and log back in. Confirm Allomer opens and resumes the saved monitoring state. Disable the setting and confirm it does not open after the next login.
- Notifications. Enable conversion notifications, answer the real macOS permission prompt, and complete a conversion while the window is closed. Confirm the banner names the converted file and opens Allomer when selected. Repeat after revoking permission in System Settings.
What a build already settles
Building for the deployment target rejects any API newer than macOS 14, so a clean
swift build -c release --arch arm64 is the availability check for the app's own code. Two things
it does not check, both verified separately:
- Every bundled helper's own minimum version.
vtool -show-buildover the Mach-O files in the bundle reportsminos 14.0for all of them. - Symbol names given as strings. The app uses seven SF Symbols, all available since macOS 12, and two System Settings URLs, both handled since macOS 13.