Skip to content

Release v1.4 - #241

Merged
alanvardy merged 5 commits into
mainfrom
release-v1.4
Oct 17, 2026
Merged

alanvardy merged 5 commits into
mainfrom
release-v1.4

Conversation

@alanvardy

Copy link
Copy Markdown
Owner

Version 1.4 puts every action under your thumb: swipe a reminder right to complete it, left to skip it, or up to open the action menu. A directional arrow guide now rides along with the card as you drag, so you can see which action you are about to trigger before you let go. Pulling down anywhere on the list refreshes it with a branded blue panel and a spinner that stays up just long enough to read as feedback, on the main list as well as the empty and all-done screens. The action-menu button on the phone, Mac, and Apple Watch now shows an ellipsis so it is easier to find, and this release fixes swipes that used to drift the card diagonally or start a refresh while you were only moving sideways.

Internal

  • Marketing version 1.3 → 1.4, build CURRENT_PROJECT_VERSION 4 → 5, all 14 occurrences in SingleThread.xcodeproj/project.pbxproj (iOS app, watch app, widget, macOS, test targets) kept in lockstep. No xcconfig/Info.plist/VERSION sources.
  • Gesture remap: right → complete, left → skip, up → more (alanvardy-var-1123, alanvardy-var-1129); SwipeGesture axis railing, down → refresh moved off the card onto the pull surface (a99a9468, 136dfd4d, e2a8c439).
  • Branded PullToRefreshModifier across the list, empty and all-done screens, with a minimum 0.6 s hold (1d829e30, 1dfb6583, a6936c33); refresh state read directly (9f9864ed); horizontal swipes no longer drift the card (fe9c7543).
  • Action-menu ellipsis glyph on phone/Mac (00af1093) and watch (f7f261d7); macOS left-swipe opens the menu and the iOS skip a11y label is conditional (9953e202, 3bebf2a8, 0a693d5f), alanvardy-var-1131.
  • Tooling/docs: App Store screenshot harness + wallpapers, CI on the xcode-27 image, run-gate/AGENTS updates, QRSPI artifacts.
  • make format + make lint pass (0 violations). No heavy gate: version strings feed no compiled or test-asserted path.

Version 1.4 puts every action under your thumb: swipe a reminder right to complete it, left to skip it, or up to open the action menu. A directional arrow guide now rides along with the card as you drag, so you can see which action you are about to trigger before you let go. Pulling down anywhere on the list refreshes it with a branded blue panel and a spinner that stays up just long enough to read as feedback, on the main list as well as the empty and all-done screens. The action-menu button on the phone, Mac, and Apple Watch now shows an ellipsis so it is easier to find, and this release fixes swipes that used to drift the card diagonally or start a refresh while you were only moving sideways.
- Write captures under <lang>/<class>/ (was <class>/<lang>), with numbered
  language folders in App Store order: 1-en, 2-zh-Hans, 3-fr, 4-de, 5-ja,
  6-es
- Capture the iPhone class on iPhone 17 (6.3", 1206 x 2622) instead of
  iPhone 18 Pro Max (6.9", 1320 x 2868); rename the class to iphone-6.3 and
  rewrite the committed wallpaper slot fixtures to match
- Clear build/appstore-screenshots at the start of every run so a stale
  device-major tree cannot linger beside the new layout
- Accept 1206x2622 / 1179x2556 in the size check, and fix the --help sed
  range that was truncating the header
iOS stems gain numeric prefixes (1-main-dark ... 6-no-reminders-dark) so the listing's drag-over order is the file-name sort order, and a new 4-options-reminder-dark shot captures the Settings Reminder subscreen.

Output device folders are numbered in App Store order: 1-iphone, 2-ipad, 3-watch. class_folder() maps them; the internal class labels stay unchanged because they key the committed wallpaper slots.

The watch class joins the default CLASSES. It was opt-in, so a bare ./scripts/appstore-screenshots.sh only ever captured iOS and capture_watch was never reached. Watch stems renumbered to 1-main / 2-more / 3-all-done / 4-no-reminders.

Adds the --ui-testing-open-settings-reminder launch seam (LaunchArgument.openSettingsReminder, SettingsRoute, navigationDestination) so the harness can reach the Reminder subscreen simctl cannot tap. LaunchArgumentTests cover flag detection, flag distinctness, and opensSettings().
Periphery under Xcode 27 misses $-projection-only @State and reported the navigation path as unused, failing the stage-fatal Periphery stage of ./scripts/test.sh before any test ran. ci.yml also pins xcode-version 27.0, so this reproduces in CI too.

The property is used, so a periphery:ignore would be wrong (and is itself a finding on 3.5+). Instead give it a direct read: clearing the seeded route on disappear, matching the ContentView.isShowingSettings precedent. Also means a re-presented Settings opens at its root rather than a stale subscreen.
The reRanksAfterSilentFallbackClearsTheDigest poll expired at the 20 s bound and then failed its 'emitted.count == 3' expectation, even though 'ranker.callCount == 2' passed — the coordinator re-ranked correctly, only the third onRankingUpdated emission missed the horizon. The test passes at ~20.7 s on a quiet host, so 20 s had no headroom.

Pre-existing timing marginality: the file is unchanged on main and the release branch touches no SingleThreadCore code. Widening the poll bound is the same remedy the suite has applied before (79c6346, 5d27438).
@alanvardy
alanvardy merged commit 1de874d into main Oct 17, 2026
@alanvardy
alanvardy deleted the release-v1.4 branch October 17, 2026 13:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant