Back to Napplet Machines V8
SOURCE / PINNED RELEASE

Made of little things.

Napplet Machines V8

Release
b3f614e739f0…
Author-recorded commit
534f19acb4ba…
License
LICENSE
Author’s source reference
nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-b5572362d4a

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

docs/verification.md
# Verification — 24 September 2026

## Wider roads and violet UI

Artifact: `dd885254f9ebf79c482edd7fa650d35fb62729df87952f4beab7571d4e8c2607`
(1,047,880 bytes, self-contained HTML). Tested with soyLI 0.22.0 and Chromium
153.0.8010.12. No new NAP requirements or dependencies.

- Every authored point in all seven presets was compared with the previous Git
  revision: width increases exactly 30%; coordinates, elevation and wall settings
  remain unchanged. Width limit is 20.8 m; version 1/2 drafts widen once into version
  3 and subsequent loads retain their widths. Protocol v5 separates older clients.
- `pnpm verify`: guidance 6/6, gameplay 36/36, TypeScript and single-file build pass.
  Includes maximum-width corner closure, 2 m thick walls, deck support, migration,
  malformed drafts and three-lap AI finishes on all seven courses.
- `pnpm test:conformance`: 5 passed, 0 failed, 5 skipped (signed-manifest evidence,
  emitted wire envelopes and lifecycle measurement unavailable in that harness).
- Hosted UI scenario plus maximum-width workshop capture: 83 assertions pass.
  Checked 200×160, 320×560, 900×600 and 2400×1200 in both host themes, plus touch
  portrait/landscape driving. Inspected the screenshots, including the 20.8 m Skyline
  workshop, desktop/mobile garage and two-thumb race controls. The violet background
  and cream text stay app-owned through host theme changes. Conformance also boots
  with optional domains absent; UI no longer calls NAP-THEME.
- User-triggered SDK save/load preserves a 20.8 m point, elevation and wall settings.
  Other points keep their own dimensions. The live preview at
  `http://127.0.0.1:56646/` was stopped and its listener verified closed.
- Six independent clients, local TURN, 50 ms ±15 ms: 23 assertions pass, including
  maximum-width track transfer, input prediction/acknowledgement and reconnect.
  An initial run timed out waiting for every race countdown; a diagnostic rerun of
  the same artifact passed. Public-network and physical-device behavior remain
  unverified; this local result does not establish that startup is free of timing issues.

- `soyli check`: passed, `space-playback-4`, on the final artifact with fresh media.
  Cover: the 1200×750 workshop at 20.8 m widths. Clip: `preview-wider-violet.webm`,
  960×600, 9 seconds, 1,073,214 bytes. Inspected the cover and a full-duration
  one-frame-per-second filmstrip: real race start, steering/drift and moving AI pack.

Release media update: `preview-race-action.webm` selects the actual racing portion
of the verified `preview-wider-violet.webm` capture (3.2–8.7 seconds), removing the
countdown. Re-encoded as silent VP8, 960×600, 5.52 seconds, 206,597 bytes. The
artifact hash remains unchanged. Inspected the full clip at two frames per second,
then played it end-to-end in the hosted Listing: all three playback/selection checks
pass. Six cars accelerate together, make contact and spread out while the player
drifts. The workshop cover is retained. A fresh `soyli check` passes on this media.

The evidence below belongs to earlier revisions and is retained as history.

## Previous expanded-course revision — 24 September 2026

Expanded-course and closed-corner revision tested with soyLI 0.22.0 and Chromium
153.0.8010.12. No additional NAP requirements or dependencies.
Final artifact: `d0df1f257d3a25392f935f15e75ffe58d02a5fd6c60c5845cbddf3ef1493d1e7`.

| Check                                                                    | Result                                                               |
| ------------------------------------------------------------------------ | -------------------------------------------------------------------- |
| `pnpm verify`                                                            | Passed: guidance 6, gameplay 35, TypeScript and build                |
| `pnpm type-check` after final decorative-support fix                     | Passed                                                               |
| `pnpm test:conformance`                                                  | 5 passed, 0 failed, 5 skipped                                        |
| `soyli check`                                                            | Passed, `space-playback-4`, final artifact and fresh media           |
| Artifact                                                                 | One self-contained HTML, 1,048,646 bytes, no external script sources |
| `tests/circuits.mjs` + `tests/ui.mjs` at the actual `soyli dev` URL      | 95 passed                                                            |
| Six clients on Switchback Summit, local TURN, 50 ms ±15 ms               | 23 passed                                                            |
| Six-car race on the larger course, one active browser + one idle preview | Frame p95 26.7 ms; 50 ms budget                                      |

The real hosted preview was `http://127.0.0.1:56002/`; its owned process was stopped
and the listener verified closed. Browser UI/network checks ran before the final
render-only fix that lowers decorative support posts beneath the actual filled
surface. Road geometry, simulation and networking are identical; the final workshop
capture verifies that visual fix. Full controller browser coverage and the separate
slide/pose browser scenario belong to the previous revision; controller, drift,
contact and suspension regressions also pass in the current deterministic suite.

The conformance skips are three signed-manifest checks, emitted wire-envelope
validation and lifecycle measurement. The pinned reference harness supplies no
signed manifest and does not measure teardown. Skipped coverage is not verified.

## Multiplayer evidence

Six independent browser contexts joined one named room. The creator remained host
regardless of lexically sorted member keys. Guests readied; all received the same
course and three-lap race on the 974 m Switchback Summit. All six clients
received starting positions beyond the old 100 m network-state limit. The host
changed one point to 14 m wide and its
wall section to 1.7 m thick; all six clients received both values. The host
connected to five guests in a star.

Each outgoing hop had 50 ms artificial latency and ±15 ms seeded jitter. All six
players met a 50 ms budget from synthetic throttle input to increased speed in the
rendered state. These are headless, local test timings, not phone or public-network
latency claims. The scenario also checked host input acknowledgements, bounded
prediction history, remote interpolation between snapshots, an in-race guest
transport reconnect, guest departure and host departure. All peers receive steering
and handbrake state, including release; slope poses remain finite. Scenery placement
is deterministic for the shared track; every guest regenerates the same buildings.
Protocol v4 prevents older physics clients from entering these rooms. A guest also
uses a synthetic analog controller: its fractional steering/throttle enter local
prediction and are acknowledged by the host over the existing input channel.

Earlier direct local ICE tests failed even for two clients on this machine. This
revision explicitly uses an isolated coturn 4.18.0 relay, which connected all six
players successfully. Coturn was extracted
from official Homebrew bottles into a temporary directory; no global service was
installed. This test does not qualify the deployed TURN service or arbitrary
internet networks. The selected public Soy provider was resolved successfully.
No public room/race was used for testing, and no game release was published.

## Interface and editor evidence

The test harness explicitly sizes the sandbox iframe and asserts its actual
`innerWidth`/`innerHeight`, overriding the preview manager's normal minimum height:

- 200×160, 320×560, 900×600 and 2400×1200, light and dark.
- Below 280×240 the readable minimum-size notice appears. Expanding restores the
  scene without corrupting the camera or discarding game/editor state.
- The preview host uses a fixed light palette. The dark/light subscription checks
  send the documented `theme.changed` envelope from the actual parent into its
  injected SDK, rather than merely changing CSS variables or claiming an OS toggle.
- 390×844, 360×640 and 844×390 with Chrome touch emulation and simultaneous steering
  and acceleration contacts. The steering bar is proportional and springs to centre.
  One right thumb slides from gas into powered drift while the left keeps steering.
  Target dimensions, separate thumb zones, top action placement, motion, release
  and pointer cancellation are checked. Pause/recover/exit/camera stay at the top.
- Add-point mode waits for a placement click and inserts at that location in the
  nearest section. Escape returns to point editing. Chrome touch emulation also
  places a point with no keyboard or hover.
- Per-point widths remain independent; selecting a section exposes its own wall
  toggle and thickness. Open sections disable their thickness control without
  affecting neighboring walls. Save/load preserves all point and section settings.
- Newly drawn closed loops, host storage save/load and reload persistence pass.
- Workshop layouts are also checked at all four frame sizes in both themes; the
  scrollable settings panel keeps section controls reachable.
- Pure geometry/physics regressions cover legacy draft migration, interpolation
  and seam continuity, off-curve point placement, varying road support, narrow
  starting grids, wall inner/outer faces, section end caps and open gaps.
- Visual screenshots cover the new garage, rooms, workshop and race HUD. Pinefall,
  Little Lagoon and Skyline have distinct art palettes; trackside props, car liveries
  and the checkerboard start gantry are rendered geometry. Ocean shelves, offshore
  islets, small sailboats, shoreline rocks, faceted hills and reed-lined pools enrich
  the backdrop. The scene keeps its own course palette through host theme changes.
- Both embedded fonts load inside the sandbox. The artifact has no remote font
  requests. Font sources and OFL licenses are included under `src/fonts/`.
- The new toolbar initially overflowed at 320px. The compact layout now drops
  decorative icons below 360px; labels and every action remain available. Garage
  spacing keeps the race button fully visible in the 900×600 frame.
- Reduced-motion styling removes decorative interface entrance animations and
  button transitions; racing remains functional.

An upstream missing-domain test passed. Local racing/editor require no domain;
optional storage failures surface inline and online controls degrade independently.
The host owns CVM, WebRTC, transport identity, permissions and persistent storage.
Application code and built output contain no direct-network or browser-storage
calls, signer access, custom bridge or relay escape hatch.

## Controller evidence

The preceding controller revision passed 19 hosted-browser assertions in
`tests/controllers.mjs`; its controller behavior is retained. The native Gamepad API
is callable inside the real opaque iframe. Synthetic standard controllers exercise
explicit slot claim, garage car/course selection, race start, proportional stick and
trigger input, dead zones, handbrake, edge-triggered pause/resume, disconnect clearing,
held-button reconnect suppression, deliberate rejoin and exit to garage. A second
slot cannot steal the car. Unknown mappings and a blocked API leave fallback input
usable. Deterministic tests also cover focus suppression and controller replacement.

Controls: left stick / D-pad steers; RT/R2 accelerates, LT/L2 brakes/reverses, B/○
drifts, Y/△ recovers, Menu pauses local races. The bottom face button claims the pad,
then confirms/starts; B/○ exits while paused. Shoulder buttons select cars and D-pad
up/down selects a track in the garage. Keyboard and two-thumb touch remain available.
No physical USB/Bluetooth controller was connected for this verification; OS/device
compatibility, actual controller feel and deployed-shell access remain unverified.

## Driving and scenery evidence

- Rear bumper offsets previously produced an unintended lateral shove; the new
  oriented chassis contact normal pushes forward. A near-zero closing graze no
  longer generates a fixed spin. Contact torque uses the impact lever arm and yaw
  inertia, with friction limited by the normal impulse.
- Four hundred deterministic rotated-contact samples preserve planar momentum and
  do not increase kinetic energy. Wall response also uses an actual lever arm.
- Steering builds yaw through tire forces rather than changing the heading directly.
  Steering a stationary car does not rotate it. Handbrake release and countersteering
  recover a momentum-carrying drift for all four car setups.
- Parked, reversing and cross-slope poses follow the surface in chassis coordinates.
  Fast uphill motion remains grounded using road-relative suspension damping; crest
  launches retain upward velocity. Acceleration squats the rear and braking dips the nose.
- All five AI opponents complete three laps on all seven presets. Their slowest
  finish is about 181 seconds on Switchback Summit; the test time budget scales
  with course length. Skyline retains recoverable falls. Repeated tick inputs
  remain deterministic.
- Pit garages, grandstands and timing towers have geometry-derived seeded placement.
  Full footprint clearance is checked against every road segment and other buildings.
  Scenery is decorative. Trees and pools avoid building footprints.
- Static previews stop submitting GPU draws once the camera settles; camera, theme,
  size, track and car changes invalidate the cached view.
- Skid marks are sampled by distance and capped at 800 segments. Tire steering and
  chassis pitch/roll render for local and remote cars; remote poses interpolate.
- The current browser scenario measures 150 render frames on a six-car Summit race
  after startup. Frame p95 is 26.7 ms. This is headless desktop evidence with one
  active race and one idle preview, not a mobile GPU benchmark.

## Track geometry evidence

- The control-point area is 260 × 260 m; plan framing, validation, fall recovery,
  scenery extent, camera framing and network state bounds support the larger world.
  A point placed at (122, −105) survives an SDK save/load roundtrip.
- Seven presets: Pinefall Circuit, Little Lagoon, Skyline Sprint, Coastal Comet,
  Switchback Summit, Petal Park and Skybridge Eight. Every course varies width,
  open/walled sections and wall thickness. New courses span beyond the old bounds
  in both axes; the figure eight has genuinely separate elevated crossing decks.
- The original fault was a self-intersecting inside offset curve. Regression tests
  exercised the folded road/wall mesh before the fix. Local offset loops now close
  into rounded, filled pockets. Changing-width near-cusps and thick wall faces are
  included. The earlier narrowing approach was replaced in response to visual review.
- Road and wall triangles remain consistently oriented on every preset and the
  16 m wide / 2 m wall Skyline stress case. Wall thickness remains the authored
  physical thickness. Exact shared road triangles provide height and support;
  the filled pocket supports cars and the outer edge still permits a fall.
- Adaptive samples follow length and bend angle, staying below 1,300 samples per
  default course. Spatial buckets bound wall and deck queries. Road and rail heights
  agree at joins; decorative supports end below the actual deck, not the old spline.
- The two figure-eight decks are distinguishable both through nearest-course
  selection and exact deck-height queries. Older version 1/2 drafts still load.

## Deliberate limits

Vehicle dynamics remain a lightweight simulation: oriented planar chassis contacts,
front/rear tire slip forces, yaw inertia, spring/damping, gravity and vertical separation. Realistic
wheel-by-wheel suspension, swept collision for extreme custom slopes, and arbitrary
self-intersecting-track drivability are not certified. The workshop deliberately
allows challenging and even impractical geometry; test-drive before hosting.

Real iOS/Android hardware, packet loss, bandwidth throttling, internet peer sessions,
long-running TURN renewal and malicious-host anti-cheat remain untested. Room hosts
are trusted game authorities; this is casual competition. Power-ups/boost pickups,
public track catalogues and host migration are not implemented.

## Promotion and reproduction

`tests/circuits.mjs` captures all seven courses and exercises expanded placement,
SDK save/load and a larger six-car race. Run it with
`soyli multiplayer tests/circuits.mjs --players 2 --timeout 120`.
`tests/ui.mjs` checks the specified frame/theme/touch combinations. Network regression:
`soyli multiplayer tests/multiplayer.mjs --players 6 --latency 50 --jitter 15 --timeout 150`
(with a working local TURN binary when direct ICE is unavailable).

The cover is an inspected 1200×750 workshop capture of Skyline with every point
set to 16 m and all walls enabled, showing filled corners in plan and 3D.
Reproduce it with `soyli multiplayer tests/capture-corners.mjs --players 2 --timeout 60`.
`napplet.json` retains the reproducible 960×600 driving recipe for the refreshed
VP8 WebM. The capture is actual gameplay: 960×600, 9 seconds including the recorder tail,
1,093,478 bytes. Static and one-frame-per-second samples across the full clip were
inspected; the video metadata matches the final artifact hash.

Portrait gameplay PNGs are saved by `tests/ui.mjs` under
`.napplet-space/promotion/touch-390x844.png` and `touch-360x640.png`. Portrait video
was not produced; the supported recorder has no portrait preset. To reproduce one
on a phone, start a six-car AI race, accelerate through the first bend, and retain
both touch-control groups in the screen recording.

Preview servers are stopped after verification. Start a fresh hosted session with
`soyli dev`; use its printed URL and stop it with Ctrl+C when finished.