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.
# 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.
