Back to Pursuit PIT
SOURCE / PINNED RELEASE

Made of little things.

Pursuit PIT

Release
565f4981bdc3…
Author-recorded commit
197afdbed44b…
License
LICENSE
Author’s source reference
nostr://npub12lm3rxsva8kfempyjkxupt09e02n3fezurkyadyqfejdc5e0r2kscqty6r/wss%3A%2F%2Fgit.napplet.soy%2F/n-951414e7fd7

Archive hash verified: 3b0485589942fd5c…. The source-to-build association is the author’s claim; it has not been independently rebuilt.

docs/gamepad-verification.md
# Gamepad verification — 2026-10-22

Feature: optional native Gamepad API input for standard-mapped controllers.
No added NAP requirements, relay access, persistence or protocol messages.
The existing optional storage domain still owns garage preferences and best times.

## Local evidence

- `pnpm verify`: six guidance checks and ten controller regression tests pass;
  TypeScript and production build pass. `verify` now includes `test:input`.
- `pnpm test:conformance`: five passed, zero failed, five skipped. The skipped
  checks are three manifest checks (no signed manifest supplied), wire envelopes
  (none emitted during the harness run), and lifecycle (not measured).
- `soyli check`: passed using Chromium 153.0.8010.12 / space-playback-6.
- Final artifact is a single `dist/index.html` with scripts/styles/assets folded
  inline. Vite's existing large-chunk warning is expected for bundled three.js
  and radio samples; no runtime code splitting was introduced.
- Boundary review of changed application modules found no direct network,
  browser storage, signer or host-DOM access.

## Hosted synthetic controller test

Run `soyli dev --port 0 --no-open`, then
`pnpm test:hosted <printed-preview-url>`. Stop that preview when finished.

The test uses the real soyLI `allow-scripts` iframe and injected domains. It
replaces only the iframe's native controller sample reader with synthetic samples;
there are no production debug hooks. Button transitions wait for animation frames.

Covered: explicit join without confirming a menu, all three modes, time selection
and back, analog accelerator input, wipers, pause/resume, disconnect/rejoin without
automatic resume, return to title, garage row changes and car selection, controls
help open/back, and missing controller API feedback. Garage edits exercise the
existing SDK storage operation in the real shell.

The deterministic input suite separately covers proportional axes/triggers, drift,
mixed keyboard/controller signals, button edges, transition reset, neutral-before-
resume, navigation repeat, inactive focus, disconnected/replaced devices, sparse
slots, a second controller, nonstandard mapping, and unavailable/blocked input.

The hosted test explicitly overrides iframe width, height and the shell's minimum
height to inspect **actual inner sizes** 200×160, 320×560, 900×600 and 1400×900.
Screenshots are saved under ignored `.napplet-space/gamepad-tests/`. The title and
time-picker screenshots were visually inspected. The tiny frame scrolls; controller
focus scrolls its selected button into view. No new minimum size was declared.
The largest case is a large embedded frame, not a native Fullscreen API transition.

The app-owned amber palette was checked while switching host light/dark attributes.
Removing optional theme and storage after startup did not prevent garage edits or
return to the title. Conformance also checks absent-domain boot degradation.

## Touch emulation

Chromium mobile/touch emulation entered Free drive by tapping mode/time controls,
toggled wipers with touch, and retained visible driving pads through viewport
changes. Screenshots were inspected at these outer viewport / actual iframe sizes:

| Outer viewport | Actual iframe |
| --- | --- |
| 390×844 | 390×709 |
| 360×640 | 360×505 |
| 844×390 | 844×300 |

The shell retains its normal minimum height in these mobile cases. These checks
establish touch navigation and control visibility, not simultaneous multi-touch
steering/acceleration or real-phone performance. No page errors were observed.

## Remaining manual coverage

Physical USB/Bluetooth controllers, controller-only audio activation, Safari,
Firefox, real iOS/Android devices, native fullscreen transition and the deployed
public shell were not tested. Replay skip after an actual PIT and result-screen
retry were implemented through the existing game flow but were not reached in the
hosted smoke run. Test those paths during hands-on controller acceptance.

Custom remapping, saved profiles, haptics and wheel/pedal layouts are deferred.
No publication or merge is part of these checks.