3.4 KiB
Historical agent handoff. The integrated composition and current test status are documented in
docs/FIRST-DEVICE-PROTOTYPE.mdanddocs/VALIDATION.md. Proposed wiring below has been incorporated or superseded.
iPhone experience handoff
RemoteDemoView owns the iPhone setup and touch-remote shell for workstream D.
It is intentionally wired to DemoPhoneService from WristivoApp and visibly
labels the entire flow as Demo mode. The fake does not open a socket, request a
real permission, persist a token, or claim that a TV changed state.
Production wiring
The integrator should keep PhoneExperienceService as the UI boundary and
inject a @MainActor production composition from WristivoApp:
WindowGroup {
RemoteDemoView(service: productionPhoneExperienceService,
isDemo: false)
}
The production service should own the transport actor, token/trust repository, and local-network permission request. Views should not gain protocol strings, envelopes, tokens, addresses beyond the user-entered display value, or network state. A successful command must remain a transport receipt, not TV confirmation.
The current initializer defaults isDemo to true for safe review. When live
composition is integrated, pass isDemo: false; the view model will then use
truthful live-service copy for pairing and command receipts.
Fake-state UI checks
Run these checks in Preview or by constructing DemoPhoneService with the
listed scenario. These are UI/state checks, not hardware evidence.
- Default
.success: begin setup, enter any redacted local address, continue, start pairing, verify the selected TV and touch remote appear. Press a directional button and verify the notice says the action was recorded in Demo mode and that no TV was contacted. .permissionDenied: enter an address and continue. Verify the recoverable local-network error and Try again action. No setup transition should occur..networkUnavailable: continue, start pairing, and verify the network error. On the remote screen the same scenario returns an unavailable error; verify no command is queued..authorizationDeniedand.timedOut: verify pairing remains recoverable, explains the failure, and does not show a selected TV.- On the remote screen, choose Forget this TV, cancel, then confirm. Verify cancel preserves the selected TV and confirmation returns to setup.
- With Larger Text and VoiceOver enabled, verify each remote action has a distinct spoken label, the Demo banner is announced once, and all controls remain at least 44 points tall. Check iPhone 13 Pro Max, the smallest supported phone, and an iPad width; the content uses a bounded readable column and adaptive action grid.
Validation status
git diff --check: passed.swift testinPackages/WristivoKit: blocked before test execution by the sandbox's codesign error (resource fork ... not allowed) in generated test bundles.- iPhone
xcodebuild: blocked before app compilation by unavailable CoreSimulator and restricted host Swift/Clang cache paths. The integrator should run the normal app build on the combined commit. - Hardware/TV: untested. No physical TV or motion-recognition claim is made.
- Permissions/privacy: this UI adds no manifest entries and requests no camera, location, tracking, or account access. The production service must add the local-network usage description only when it is introduced.