Integrate live phone and watch remote prototype with guarded motion control
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
> Historical agent handoff. The integrated composition and current test status are documented in `docs/FIRST-DEVICE-PROTOTYPE.md` and `docs/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`:
|
||||
|
||||
```swift
|
||||
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.
|
||||
|
||||
1. 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.
|
||||
2. `.permissionDenied`: enter an address and continue. Verify the recoverable
|
||||
local-network error and Try again action. No setup transition should occur.
|
||||
3. `.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.
|
||||
4. `.authorizationDenied` and `.timedOut`: verify pairing remains recoverable,
|
||||
explains the failure, and does not show a selected TV.
|
||||
5. On the remote screen, choose Forget this TV, cancel, then confirm. Verify
|
||||
cancel preserves the selected TV and confirmation returns to setup.
|
||||
6. 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 test` in `Packages/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.
|
||||
Reference in New Issue
Block a user