SOURCE / PINNED RELEASE
Made of little things.
Rail Game
- Release
- ccdd5b913413…
- Author-recorded commit
- ddf0122b6acc…
- License
- LICENSE
- Author’s source reference
- nostr://npub1n8ga89w8h6tvwamxusfyzexw8gjy84yxu9rxgnmk955cxtml4ujswzxydd/wss%3A%2F%2Fgit.napplet.soy%2F/n-91ec90c6fdf
Archive hash verified: dad7b678e25f96a3…. The source-to-build association is the author’s claim; it has not been independently rebuilt.
# Geometric prototype verification
This records the original prototype at `fc8ad71`. For the subsequent larger
battles and offset camera, see [scale update verification](scale-update-verification.md).
Verified 2026-09-22 with soyLI 0.18.1 on macOS ARM64.
## Automated and host checks
- `pnpm verify`: six guidance checks, strict TypeScript and single-file build pass.
- `pnpm test:game`: twelve tests pass, including independent soldier fire,
recruitment, multiplication limits, upgrades, shields, projectile collisions,
barrier occlusion, boss victory, loss, retry, progress validation and completing
all three stage sequences with steering.
- `pnpm test:conformance`: five checks pass, zero fail. The three manifest checks,
wire-envelope check and lifecycle check skip because the local-directory run
supplies no signed manifest, emitted reference-shell envelopes or teardown
measurement. This is not evidence for those skipped checks.
- `soyli check`: passes against `space-playback-4`, Chromium 153.0.8010.12.
- Boundary scan: no direct network, browser persistence, signing or external asset
loading in authored code or the built HTML. The source-only module entry is
inlined by the build. `requires` is empty; no relay use.
- A partial optional storage implementation initially threw synchronously in the
reference shell. Startup now catches that case and preserves session-only play.
## Real host interaction
The built app runs in the soyLI injected `allow-scripts` iframe. The browser smoke
suite confirms `storage`, `theme`, and `config` injection, and checks exact
200×160, 240×280, 320×560, 900×600 and 2400×1200 frames in both light and dark.
The smaller-than-minimum frame shows the resize notice; resizing back preserves a
paused run. Whole-page colors match, controls remain inside the frame, and no
horizontal overflow or runtime errors were observed.
Touch emulation at 390×844, 360×640 and 844×390 passed drag steering, held arrow
controls, touch cancellation, release and pause. Keyboard movement and explicit
resume after focus loss also passed. Tests resize the real host's existing iframe
and apply standard `theme.changed` events; the native host chrome is temporarily
hidden for exact viewport measurements.
A separate stage-one browser playthrough collected 28 soldiers, finished with
2600 points, emitted `storage.set` for `rail-progress-v1`, unlocked stage two and
retained that unlock after reload. The complete three-stage campaign is covered
by simulation; stage-one completion was also exercised through the actual UI.
The host Settings form applies sound and reduced-effects changes live; the sound
toggle retained its configured value after reload. Listing decoded the selected
cover and played the complete nine-second preview clip through its end event.
## Preview media
The selected `preview.png` is a real 1200×750 gameplay frame after recruiting and
multiplying to fourteen soldiers. Its dark palette uses the runtime theme path.
The selected `preview.webm` is a silent VP8 recording at 960×600, approximately
1 MB. The eight-second recording recipe produces a nine-second file because the
recorder appends a final frame. Frames throughout the clip were inspected.
Reproduce the clip using `soyli record` with `preview.recording` in `napplet.json`:
start stage one at (480, 407) at 80 ms; hold ArrowRight from 4400 to 4820 ms.
It shows recruitment from 3 to 7 soldiers, automatic combat, a lane change and
multiplication to 14. The recorder stores the real build hash with the selection.
Recapture after changing executable code; do not edit the stored hash manually.
The portrait still is `.napplet-space/qa/portrait.png` at a true 390×844 viewport.
It shows the same fourteen-soldier run after live resize. To reproduce: start stage
one, stay centered through the first gate, move right after 4.3 seconds and capture
after the multiplier at about 7.8 seconds. No portrait clip was produced; the soyLI
recorder currently has a fixed landscape viewport. Preview binaries and QA files
are kept outside Git source; the selected cover and clip remain available locally
for the publisher's separate asset upload.
Caption: “Recruit. Multiply. Keep moving. Three stages of geometric squad combat.”
## Remaining coverage
Actual iOS/Android hardware performance, device audio activation and physical
controllers have not been tested. No controller support is claimed. Slow-device
performance and assistive navigation of the canvas gameplay need further testing.
No publication, external message or shared-score backend was created.
