Files
Tarnax/docs/VALIDATION.md
T
2026-11-04 15:01:22 +00:00

8.4 KiB
Raw Blame History

Validation — 4 November 2026

Passed

  • Xcode 27.2 (27B52), unsigned generic iOS device Debug build: BUILD SUCCEEDED.
  • Final unsigned generic iOS device Release build, including app icon: BUILD SUCCEEDED.
  • 37 executable transport/model contract checks: passed. Includes unsafe URL and redirect rejection, same-origin redirect acceptance, cookie jar isolation, proxy subpaths, Origin/Referer, Basic proxy auth, form encoding, HTTP/login failures, multipart file uploads, query construction, decoding and Home state filtering.
  • Info.plist and project.pbxproj validated with plutil.
  • Shared scheme, source references, asset catalog, icon and README present; ZIP integrity and required file checks passed.

Xcode's only build warning was “Metadata extraction skipped, no AppIntents.framework dependency found.” This app does not define App Intents.

Not verified here

  • Live authentication or operations against torrent.absdev.net: no production credentials supplied or embedded.
  • Runtime UI on iPhone/iPad, accessibility layout, Face ID, passcode fallback or a physical device.
  • Signed installation, App Store validation or deployment. Select your development team and provisioning in Xcode.
  • Every preference on every qBittorrent version. Preferences are discovered at runtime; unsupported/read-only or normalized values are reported using server response and read-back.

Simulator services were unavailable in the initial environment. Compilation used the real iOS device SDK; the executable contract harness ran on macOS with mocked network responses, not a simulator or live server.

Suggested device acceptance checks

  1. Connect with the Web UI credentials, and separate proxy Basic credentials if needed. Confirm the server/API version.
  2. Compare the Library with qBittorrent Web UI. Verify Home excludes completed, paused, queued, checking and stalled entries.
  3. Add a lawful test magnet and a small .torrent file. Verify progress, speed, ETA and server save path.
  4. Pause/resume it; inspect files, skip a file, change a priority, and inspect peers/trackers. Test tracker editing only on a disposable torrent.
  5. Change a harmless preference, confirm read-back in the app and Web UI, then restore the original value.
  6. Test alternative limits and per-torrent limits. Queue-order controls require queueing enabled on the server.
  7. Remove the disposable torrent without files, then test permanent deletion only with expendable server data.
  8. Enable app protection; background and reopen the app. Test successful authentication, cancellation and passcode fallback.
  9. Rotate iPhone and iPad; check sidebar navigation, text sizes, dark/light modes and Files import.
  10. Test offline refresh, incorrect proxy credentials, expired session and reconnect. Confirm no operation is duplicated by an automatic mutation retry.

Settings cancellation fix — 4 November 2026

  • Moved preference request ownership from the SwiftUI view task to AppModel. Concurrent initial/reload callers await one session-owned task; cancelling a transient view does not cancel that request. Failed reloads retain the current preferences.
  • Disconnect/reconnect cancels the preference task and clears its cache. Identity checks prevent retired sessions from publishing preferences, dashboard snapshots, or global network errors.
  • Added cancellation checks around transport work, prevented overlapping dashboard refreshes, and commit dashboard responses together. Polling remains owned by RootView and does not invalidate the session or preference requests.
  • Settings, Server, preference save, torrent actions, and detail loading ignore explicit CancellationError / URLError.cancelled signals. Active-session HTTP, decoding, timeout, and other network failures remain visible. No automatic login or mutation retries were added.
  • Existing interface preserved.
  • Unsigned generic iOS device Debug build: BUILD SUCCEEDED. Restricted compiler execution initially prevented SwiftUI macro expansion; rerunning with access to Xcode compiler services succeeded. Only App Intents metadata warning remained.
  • 48 mocked macOS contract checks passed, including view cancellation, concurrent preference loads, failed reload retention, visible timeouts, explicit task cancellation, retired-session errors, and disconnect during loading.
  • Intermittent navigation behavior on a physical device and live-server authentication were not exercised.

Changed files: Tarnax/Core.swift, Tarnax/Settings.swift, Tarnax/Details.swift, Tests/ContractTests.swift, VALIDATION.md.

Tarnax rename — 4 November 2026

Renamed the Home Screen display name, bundle name, in-app headings and alerts, unlock prompt, Xcode target/product and shared scheme to Tarnax. Updated README instructions. The initial branding pass retained the old project paths and installation identity; the complete rename below supersedes that choice.

Unsigned generic iOS device Debug build with scheme Tarnax: BUILD SUCCEEDED. Verified built app display name Tarnax and bundle identifier net.absdev.Tarnax. Info.plist and project.pbxproj pass plutil validation.

Launch branding and automatic sign-in — 4 November 2026

Added TarnaxIcon.png, TarnaxBrand.imageset, LaunchScreen.storyboard and a matching SwiftUI connecting view. Updated Info.plist and Xcode resources. Icon verified as opaque RGB, 1024×1024. Compiled storyboard rendered in a temporary iPhone simulator preview; icon also inspected on Home Screen.

Saved server credentials trigger one automatic sign-in per launch after unlocking. Fresh installs remain on the connection form; failures allow manual retry. Disconnect suppresses automatic reconnection for the launch and invalidates pending connection results. Credentials continue to use the existing Keychain identity.

54 executable contract checks passed, including new automatic sign-in eligibility, app lock, failed connection cleanup, no repeated retry, and explicit disconnect checks. Unsigned device and simulator Debug builds succeeded. Successful live-server authentication and physical-device launch timing were not tested.

Complete project rename — 4 November 2026

Renamed the enclosing folder to Tarnax, the project to Tarnax.xcodeproj and the source directory to Tarnax. Updated shared scheme container references, build paths, test runner, project labels, multipart boundary and documentation. Bundle identifier and Keychain service are now net.absdev.Tarnax. This supersedes the earlier decision to retain installation identifiers: iOS treats this as a new app and saved credentials must be entered once. Automatic sign-in then uses the new Keychain entry.

Complete rename verification: unsigned generic iOS Debug build succeeded; all 54 contract checks passed; built app identifier verified as net.absdev.Tarnax; no old app-name references remain in project files. Stale Xcode window state was backed up outside the project so Xcode can regenerate paths.

Build scripts and Apple UI guidance — 4 November 2026

Added scripts/build.sh, scripts/test.sh, scripts/release.sh and scripts/README.md. Verified unsigned Release build, script help/syntax, and all 54 contract checks. The release script creates timestamped archives/exports, retains logs, verifies signatures and embedded registered-device provisioning, and writes a SHA-256 checksum. Existing local assets successfully created a signed Release archive, but Ad Hoc export failed because no matching profile for net.absdev.Tarnax was installed. Account provisioning updates require explicit user approval after automatic review rejected that step.

UI changes: compact tab navigation with individual stacks, regular-width sidebar, scene-persisted selection, appearance-adaptive system launch screen, semantic colors and Dynamic Type in the connecting view, large-text transfer layouts, spoken metric labels, larger action targets, native cancellation placement and upload dismissal protection. The branded static launch design is superseded by Apple's recommended minimal launch treatment; branding remains in the icon and connecting view. No network or credential fixture was added to production code.

Final UI verification: production Release build succeeded; 54 contract checks passed. A separate sample-data simulator preview was inspected in light appearance and dark appearance at the largest accessibility text size. Full VoiceOver and physical-device testing remain outstanding. Ad Hoc IPA export remains blocked on the missing profile pending approval for account provisioning updates.