# V1 verification — 9 September 2026

A Map of Quiet Places is implemented as a separate native iPhone game. Local implementation and the checks listed below are complete. It is a release candidate, **not submission-ready**: App Store distribution signing, account-side products, public support/privacy hosting and physical-device checks remain external gates.

## Environment and evidence

Xcode 26.6 (17F113), Swift 6.3.2 compiler in Swift 5 language mode, iOS 26.5 simulators. Minimum supported OS is iOS 17; iOS 17 was not available for a runtime pass. Tested iPhone SE (3rd generation, 375×667 points), iPhone 17 Pro Max (440×956 points), and iPhone 17 for Release. Original .xcresult bundles remain in the local ignored `build` directory; readable logs are included under `Release/QA`. Failed development runs are retained rather than presented as passes.

## Completed checks

| Area | Actual result | Evidence |
| --- | --- | --- |
| Deterministic economy and saves | 11 tests passed | `QA/core-tests.txt`; `Tests/CoreTests/EconomyTests.swift` |
| App model and actual audio/assets | 7 tests passed | `QA/final-large.txt`, `build/Final-Large.xcresult` |
| StoreKit transaction behaviour | 9 tests passed with the local StoreKitTest environment | `QA/purchase-small-final.txt`, `build/Purchase-Small-Final.xcresult` |
| Main Debug UI journeys | All 10 distinct UI scenarios passed across the final/focused runs | `Final-Large`, `Final-Small`, `Trace-Large`, `Store-Trace-Small`, `Small-Accessibility-Final` result bundles and corresponding QA logs |
| Accessibility audit | Passed on both large and compact phones after final layout fixes | `QA/accessibility-final.txt`, `QA/small-accessibility-final.txt` |
| Release launch, continued voyage, atlas/ship/settings | Passed using the actual Release app, without fixtures | `QA/release-confirmed.txt`, `build/Release-Confirmed.xcresult` |
| Release music-enabled CPU/memory sample | Passed, three 5-second measurement iterations | Same Release result bundle |
| Device-following appearance | Dusk → Night → Dusk changes immediately without relaunch | `QA/device-appearance.json` and three unedited captures |
| Release archive and packaged resources | Archive succeeded; signature, identifier, platform, assets and fixture exclusion checks passed | `QA/archive-final.txt`, `QA/release-package-checks.txt`, `BUILD_RECORD.json` |
| Website source | Production build, typecheck, route/link checks passed; lint has 0 errors and 6 existing React refresh warnings | `QA/website-*` records |
| Website browser | Desktop and 390-point mobile layouts inspected; no horizontal overflow or broken images; four actual audio previews played without media errors | `QA/website-game-*` captures, `QA/website-audio.txt` |

The core suite verifies upgrade costs/rewards, route choice and queues, first visits, exceptional rewards, bulk offline calculations against stepwise simulation, offline caps and time rollback, both prestige resets, purchased benefits, save validation/corruption and recovery. Three no-purchase progression simulations use the production economy. The active policy completed all twelve places in 209 minutes; decisions every five minutes completed in 385 minutes; eight-hour revisits completed in ten days. These are deterministic model results, not real-player retention or promises about everyone's pace. See BALANCE.md for policies and limitations.

The model suite verifies atomic rollback when saving fails, recovery, preserved paid balances/colours during a fresh voyage, offline settlement and settings persistence. AVAudioPlayer loads all 25 real stereo WAV assets, checks aligned 180-second regional stems within 40 ms, and exercises background/foreground, interruption with/without resume, and muted music. The twelve atlas art tiles are distinct and load correctly.

The nine purchase tests cover both packs with exact-once persisted delivery, all three permanent products through both prestige layers and restoration, Ask to Buy, launch recovery, failed-save retry before finishing a transaction, verified refund revocation, cached ownership during a failed product lookup, cancellation and unavailable purchases. No live payment was made. Xcode's UI runner could not independently configure SKTestSession (SKInternalErrorDomain Code 3); the app-host suite configures the local catalogue successfully. Run PurchaseTests before UI-only shop captures. The final small-screen shop test passed with all five real local products enabled. This is separate from sandbox/TestFlight and live configuration.

UI checks include the first arrival, buying equipment, queueing a route, atlas observations, prestige review and confirmation, saved motion settings, largest Accessibility XXXL text, deferred arrival while a panel is open, welcoming offline summary, Postmark supplies/colour spending, both current inputs and screenshot capture. Horizontal tracing and the tap control each added exactly 28 charge in the same rank-two fixture on both phone sizes. Vertical swipes continue to scroll on compact screens.

The accessibility audit examines all built-in audit types on visible Voyage, Atlas, Ship and Settings content. Its only filter is for contrast findings tied to verified scroll descendants outside or clipped by the viewport; fully visible contrast failures and all other types remain failures. Earlier transient sheet audits and a simulator audit timeout were investigated; the final focused runs passed on both phones. This does not replace a person using VoiceOver or Switch Control.

Release measurements averaged 0.407 CPU seconds per five-second interval and 56,735 kB peak physical memory (highest sampled peak 56,757 kB). These short simulator samples detect gross regressions; they do not establish device frame pacing, thermal behaviour, battery life or hours-long memory stability. SpriteKit requests 30 fps, or 15 with reduced motion, and pauses in the background.

Audio signal measurements found no clipping; complete arrangements peak below 0.136 full scale and loop seam deltas are at most 0.00104. Real headphone/speaker listening and hardware route changes remain unverified. The website's AAC previews also loaded and advanced playback normally.

## Corrected issues and limits

Final fixes include gesture arbitration for compact-screen scrolling, accessible expanding appearance controls, opaque text panels, custom scalable sheet headers, deferred automatic arrival panels, exact arrival-boundary rounding, bulk offline first-visit handling, durable purchase delivery and offline entitlement preservation. A repeated Release smoke test initially met the legitimate welcome-back panel; the test now dismisses it before checking navigation. The production return flow is unchanged and the repeated Release run passed.

No real developer-account sandbox or TestFlight checks were possible. A development-signed archive exists; App Store export with provisioning updates returned **No Accounts** and **No profiles for com.gallaxgames.quietplaces**. No distribution IPA, App Store app/product record, agreement acceptance or Apple approval is claimed. The paired physical iPhone was unavailable.

The public domain currently returns 403 at its root and 404 for the intended new game/support/privacy paths on the old Apache/Plesk host. The connected Vercel account exposed no teams. Source publication and private Lovable synchronisation are recorded separately in WEBSITE_DELIVERY.md. Public policy URLs must work before submission. The legal publisher identity and support-message retention also need the owner's confirmation.

## Reproducing the local checks

1. Open `QuietPlaces.xcodeproj`; run `swift test` and `swift run Balance` from the project folder.
2. Run the Debug `QuietPlaces` test plan serially on an iPhone simulator. Keep app-host PurchaseTests before UI shop tests. Use `QuietPlacesReleaseQA` for Release smoke/performance; it has no test catalogue or fixture behaviour.
3. Archive the Release configuration. Run `python3 Tools/verify_release.py /path/to/QuietPlaces.xcarchive` to check the built app and update its fingerprint.
4. Use `Tools/export_screenshots.py` to export genuine XCTest attachments. Use `Tools/sync_website.py /path/to/the/existing/gallaxgames.com` to stage only public documents and intended media; run the website checks before its normal main-branch publication.

See RELEASE_CHECKLIST.md for the remaining owner, Apple, hosting and hardware steps.
