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.
# Enemy-platoon release
Prepared 2026-09-23 with soyLI 0.18.2. The campaign remains eight stages,
900–2160 meters per stage, with up to 250 player soldiers.
## More enemy soldiers
Enemy waves now use five columns and six to nine rows (30–45 soldiers), compared
with three columns and three to six rows. Two smaller flanking platoons join the
opening encounter. Narrower individual bodies and closer rows keep the ranks
inside their lanes without extending through later pickup rows.
| Stage | Previous enemies | Release enemies |
| --- | ---: | ---: |
| 1 | 198 | 690 |
| 2 | 252 | 870 |
| 3 | 396 | 1185 |
| 4 | 456 | 1360 |
| 5 | 660 | 1790 |
| 6 | 735 | 1990 |
| 7 | 972 | 2460 |
| 8 | 1080 | 2730 |
The campaign has 13075 regular enemy soldiers, plus eight wardens. Collision
widths match the narrower rendered bodies. The simulation regression now checks
the denser counts, five distinct non-overlapping columns and both opening flanks.
All eight stages remain winnable with steering and automatic fire.
## Verification
- Guidance, strict type-check, build and all sixteen simulation tests pass.
- `soyli check` passes with the final build and selected cover/clip.
- Conformance: five pass, zero fail, five skip. Manifest, wire and lifecycle
evidence remain unmeasured by this local-directory reference invocation.
- Browser checks cover exact 200×160, 240×280, 320×560, 900×600 and 2400×1200
frames in both themes, plus keyboard and focus/undersize pause. Touch drag,
hold, cancellation and pause are checked at 390×844, 360×640 and 844×390.
- Game regressions are now part of `pnpm verify` as well as `pnpm test:game`.
The release capture routine plays normally to 250 soldiers, then captures exact
1200×750 landscape and 390×844 portrait frames. It advances the virtual clock
following each resize and checks for painted canvas pixels. Both images have
been visually inspected, including the full formation, controls and enemy ranks.
All eight stages completed through actual pointer input in the current host.
The run reached 250 soldiers and retained the final unlock after reload, with no
browser runtime errors.
| Stage | Score | Survivors |
| --- | ---: | ---: |
| 1 | 56000 | 250 |
| 2 | 64050 | 250 |
| 3 | 91300 | 250 |
| 4 | 101150 | 250 |
| 5 | 126300 | 250 |
| 6 | 145350 | 250 |
| 7 | 178300 | 250 |
| 8 | 188250 | 230 |
Across 52440 animation callbacks at 200 or more soldiers, JavaScript simulation
and drawing-command submission measured median 2.8 ms and p95 3.8 ms locally.
This does not measure GPU completion or physical-phone frame rates. The full
campaign checked gameplay and live resizing; the separate capture run verified
the corrected post-resize painting before saving the release images.
## Release assets
- `preview-release.png`: selected 1200×750 gameplay cover.
- `preview-release-portrait.png`: 390×844 companion image for sharing locally.
- `preview-release.webm`: the current-build gameplay recording selected by soyLI.
The cover and clip use the normal descriptor media fields.
The portrait companion remains a local export; there is no invented portrait
video option or extra manifest media field. These assets show the actual
geometric game. Earlier preview files are preserved. Reproduce screenshots with
`node tests/capture-preview.mjs <soyli-dev-url>`; output goes to ignored
`.napplet-space/promotion/`.
The 960×600 VP8 clip is 8.96 seconds including the recorder's final frame,
964905 bytes, and shows the opening enemy platoons, recruitment, steering and
multiplier growth from 12 to 36 to 72 soldiers. Its contact sheet was inspected;
full playback reached the end in the host Listing view. The selected cover loaded
there too. The recorder bound it to artifact
`f3038a8471c0744355f8748b332639be6c317dc45856739675b878987a3ba565`.
## Tooling and publication
The release uses the project's saved creator and existing public targets:
relay.napplet.soy, blossom.napplet.soy, git.napplet.soy and napplet.soy, with the
configured descriptor mirrors. The initial dry run reported `CREATOR_MISMATCH`
because a different saved account was active. Selecting this project's existing
creator resolved it; the project identity and destinations were not replaced.
The installed CLI was updated since the previous work. Refreshed its support
guidance and restarted the owned local preview with 0.18.2. The skills updater
preserved the previously edited action guide and updated only the mobile and
workspace support documents. Optional storage/theme/config boundaries are
unchanged; no runtime dependencies or external game assets were introduced.
Physical iOS/Android devices and physical-device audio remain untested.
