Back to Outbreak: Soycoon City
SOURCE / PINNED RELEASE

Made of little things.

Outbreak: Soycoon City

Release
db7750b1d009…
Author-recorded commit
3ee3f5fd27a6…
License
LICENSE
Author’s source reference
nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-b87c04571a9

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

docs/verification.md
# Renamed build and preview video — 2026-10-06

[Preview-video evidence](preview-video.md) records the current renamed HTML hash,
selected exact-build WebM, complete native playback and final soyLI check.
The asset-refresh and earlier sections below retain their phase-specific hashes
and measurements. Gameplay and asset bytes were unchanged by the title update.

# Asset refresh verification — 2026-10-06

All 32 current camera views now use individually regenerated backgrounds from
exact editor-exported schemas: 12 replacement views, 14 door approaches and six
frame recovery shots. The PS1 art direction and olive/brass HUD are retained.
Schema images, complete generation/correction prompts and hashes are checked in
under `docs/schema-shots/` and `docs/room-render-manifest.json`. The two superseded
art directories' images were removed. Final 640×480 JPEGs total 1,741,207 bytes
(1.66 MiB), compared with 20,465,446 bytes for the two earlier image sets.

Audio retains 33 existing runtime MP3s byte-for-byte: 936,435 bytes (0.89 MiB).
Original downloads, review WAVs and superseded takes were deleted at the user's
request; no WAV remains under `sounds/` or `src/`. Manifests retain provider
prompts/settings/result numbers and clearly labeled historical hashes. Runtime
checks verify the surviving files and their provenance. Future catalogue output
is MP3. Pending recordings remain planned; cleanup does not approve trial audio.
Obsolete WAV preparation scripts were removed. The audition-preview script uses
only temporary conversion files and still produces MP3.

`pnpm verify` passed: six guidance, eight game, five polish/model, seven audio,
four controller and three sharing tests, level/asset/catalogue validation,
TypeScript and production build. The level check requires a linked image for
all demo cameras and verifies JPEG dimensions, bytes/hashes, geometry signatures,
schema dimensions/hashes and prompt links. Sharing tests now derive counts from
the current asset inventory and verify exact stale-image removal. No runtime
limits, host boundaries or authority requirements were weakened.

`pnpm test:conformance`: 5 passed, 0 failed, 5 skipped. Manifest evidence, emitted
wire envelopes and lifecycle measurement remain unverified by the pinned suite.
Final single-file HTML: 6,095,313 bytes (5.81 MiB), SHA-256
`e2a2bbf14958029b9317e9867b440f10b3392e534f30817790c56373f6d6ba13`.
The previous build was 12,221,643 bytes (11.66 MiB). `soyli check` now passes,
including the source archive budget that was previously blocked.
The current versioned source tree is about 8.23 MiB, down from 48.21 MiB
(82.9% smaller). The checked source archive, including the built artifact, is
about 14.04 MiB and fits the 40 MiB limit.

Hosted `test:hosted` passed gameplay/cuts/shooting/reload/pause, paired doors,
actual SDK storage and 640×480 schema export, background/map roundtrip, frames
200×160, 320×560, 900×600 and 1600×900, touch 390×844, 360×640 and 844×390,
both theme schemes and missing optional-domain fallbacks. `test:features` passed
synthetic two-identity sharing with all 32 linked images, deny/retry/update/remix/
unpublish, verified remote art playback, SDK draft restoration, controller samples
and phone/missing-domain library behavior. No public records were sent.

A separate native-browser review visited every camera in the editor's rendered
mode, verified the exact bundled JPEG bytes and decoded all 32 at 640×480.
The captured contact sheet was visually inspected for door readability and
invented obstacles. A hidden door and extra briefing-room benches were corrected
before packing. Generation can still drift; future replacements need visual
review against geometry rather than merely a matching signature.

`test:audio:hosted` passed native MP3 decoding of all 33 clips, gesture activation,
nonzero output (0.21228 measured peak), shot/pump scheduling 250 ms apart,
reload/steps, music continuity, room ambience, mute/pause/help/editor/blur, teardown
and touch activation. This verifies signal output, not a new listening approval.

New `preview-rerender.png` and `preview-rerender-phone.png` were inspected;
earlier previews remain. The main image is selected in `napplet.json` and was
inspected in the local soyLI Listing at 1200×865 before the local checkpoint. The owned
interaction preview at `http://127.0.0.1:64434/` was stopped with Ctrl+C and its
listener confirmed closed. The final Listing preview at
`http://127.0.0.1:64689/` was also stopped and its listener confirmed closed.
No publish or push was performed. Physical controller hardware and live public
services retain the unverified coverage recorded below.

Everything below is historical evidence from before this asset cleanup; its old
image/audio counts, retained-source claims and SOURCE_LIMIT do not describe the
current tree.

---

# Earlier camera/model verification — historical (2026-10-06)

Camera/character polish adds 20 shots (32 total), concave polygon authoring,
priority doorway areas, framing recovery, two native Blender sources and skinned
GLBs with 12 Soybert / 5 zombie clips, upward head bursts and six green herbs.
The `models/README.md` documents artist edits and the separate export command.
Both saved .blend files were opened/re-exported in Blender 5.1.1 and their runtime
clips, bones, dimensions and SHA-256 checked. No Blender MCP was connected; native
Blender Python was used. All 14 arrivals and inward approaches were checked with
the actual Three.js projection and door-wall/prop visibility; a 0.5 m clear-floor
grid is framed. The twelve original generated backgrounds are preserved. Fourteen
door shots and six recovery views currently use detailed procedural bakes; their
schemas/prompts can be exported for the next prerender art pass.

`pnpm verify` passed: six guidance, eight game, five polish/model, seven audio,
four controller and three sharing tests, level/asset/catalogue checks, TypeScript
and production build. Polygon/headshot/healing guards and actual bone animation
were exercised. Shared-package tests carry herb placements and polygon areas.
The final conformance run reports 5 passed, 0 failed, 5 skipped. The final HTML is
12,221,643 bytes (11.66 MiB), SHA-256
`b6f8735380d0707a3c168dd599222264986e1d81d34f1a9e8694473febb7c10f`.
`soyli check` retains the existing SOURCE_LIMIT (>40 MiB source archive); originals
were preserved and no check was weakened. Linked images allow 96 entries with
the existing 30 MB aggregate cap, accommodating later art for all demo shots.


Hosted `test:polish:hosted` passed polygon drawing/vertex drag/cancellation,
field preservation, herb editing, SDK storage roundtrip, close upward keyboard
headshot, a real bite followed by herb healing, paused canvas stability,
320×560/844×390 touch control bounds and two-finger Aim-up plus fire. The existing
`test:hosted` passed movement/cuts/shoot/reload/pause, paired-door transitions,
640×480 schema export, background/map import/export, SDK saves, all four required
frame sizes, touch portrait/landscape and missing optional-domain fallbacks.
`test:editor` passed camera/target and room/door dragging, frog presets, paired
links/deletion and touch cancellation. Recovery heights above 6 m survive name
edits. `test:features` passed synthetic two-identity sharing/retry/remix/update,
verified linked-art playback/draft restoration, native controller samples and
missing-domain/touch library fallbacks. No public records were sent.

Fresh primary-touch interaction crossed the Evidence/Records door once per tap
in each direction. Gameplay, polygon-editor and phone PNGs were inspected and
saved as new preview files, preserving the older captures. `preview-polish.png`
was selected in `napplet.json` and inspected in the local soyLI Listing (loaded
at 1400×865). The owned final preview at `http://127.0.0.1:55348/` was stopped
with Ctrl+C; `lsof` confirmed its listener closed.

Polygon handles now repaint immediately on selecting Zone and draw above
furniture. The final handle drawing fix was type-checked, built and passed
conformance; its visual capture was inspected. The initial preview build raced
with conformance output, and a later documentation edit triggered a host reload
during a test. Those runs were discarded; isolated builds/stable files passed.
No user-owned preview was stopped. Physical hardware and public services retain
the unverified coverage described below.

The preceding audio verification is retained below as historical evidence.

The audio playback fix was verified in the existing soyLI workspace. Previous
level, sharing and controller coverage is retained below. The final hosted preview used the built
single-file napplet in its sandboxed iframe. No public release or real player-level
publication was made.

## Automated results

- `pnpm verify`: passed six guidance checks, eight game tests, three controller
  tests, three sharing tests, six audio tests, repository level/asset checks, the
  sound-catalogue/runtime hash checks, TypeScript and the production build.
- `pnpm test:conformance`: 5 passed, 0 failed, 5 skipped. Boot, injected global,
  forbidden-global scan and absent-domain degradation passed. Three manifest
  checks had no signed manifest evidence; wire validation had no emitted
  envelopes; lifecycle measurement was not supplied. Skips remain unverified.
- `soyli check`: **blocked by `SOURCE_LIMIT`** with soyLI 0.24.0. The existing
  recording archive already put tracked source above the 40 MiB limit before this
  fix. Original downloads and review WAVs were preserved. This does not block
  local play, but needs archive restructuring before publication.
- `pnpm test:hosted` and `pnpm test:audio:hosted`: passed using printed soyLI
  preview URLs. No page errors were recorded. The preceding feature pass also
  ran `pnpm test:editor` and `pnpm test:features`, including linked-art draft
  restoration and phone authoring.

`levels/demo.json` supplies the actual six-room game geometry, seven paired
connections, twelve cameras and eight enemies. Every linked image was checked
against its byte size, SHA-256 and original camera geometry signature. Additional
repository JSON levels are included in the Levels picker at build. The sound
check validates 49 cue IDs, prompts, variant paths and planned statuses: 146 output
full production files remain planned. The separate runtime inventory records
30 playable audition clips with source/runtime hashes; it does not promote trial
candidates to approved production outputs.

Game tests cover reciprocal arrivals, collision/sliding, camera cuts/facing and
hysteresis, several same-wall links, atomic rejection/deletion, art invalidation,
shot direction/cover, reload reserves, pause/bites and malformed imports. New
rules are validated and carried through the shared package. Imported spawn
metadata cannot override configured health or player facing.

## Audio scenarios

The available 10 cue groups now play: shotgun, reload start/insertion/finish,
stone/concrete footsteps, zombie groans/attacks, corridor ambience and patrol music.
Thirty embedded MP3s total 923,142 bytes. Quiet source clips have normalized
runtime copies; loop joins use a 400 ms crossfade. Downloads and review WAVs are
unchanged. Content selection, clipping repair and a full listening/mix pass remain.

The hosted test wraps native AudioContext nodes to observe decoded buffers and an
analyser on the actual output path. It retains browser activation rules and real
MP3 decoding: all 30 clips decoded, the context ran after Begin patrol, and output
had a nonzero 0.01251 peak in the recorded shot scenario. This proves a browser
signal, not physical speaker output. Shots, all three reload cues and travel-based
footsteps were observed. Camera cuts and room transitions preserve the existing
music source; corridor ambience starts/stops with the room. Mute/unmute, pause,
help, editor, blur and pagehide stop sources; teardown closes the context. Removing
optional media/theme does not block embedded audio. Real touch events enable audio
and toggle mute on a 390×844 browser viewport.

Unit tests additionally cover rejected actions, frozen reload/bite timers, no
footsteps from turning or wall pushing, room-tagged living zombie sounds, loading
queues, bounded overlapping voices, resume-before-decode, decoding failure/retry,
win handling and late decode completion after disposal. The current reload emits
one insertion cue; per-shell loading and unsupported planned cues remain future work.

## Sharing and controller scenarios

The sharing browser test uses **two independent browser contexts with synthetic
viewer identities and isolated OUTBOX/upload/resource fixtures**. It does not sign
or publish real events. It exercises the application's SDK adapter and documented
app-data helper in the actual hosted iframe:

- A publishes custom image bytes plus the full JSON package. Publication denial
  retains a prepared retry; retry does not upload the same files again.
- B discovers A's level and plays it. A custom image absent from the built asset
  set is downloaded through the fixture resource domain, decoded and hash-checked.
- A reopens the record, edits reserve ammo and updates its existing revision.
- B creates a separate attributed remix under B's identity.
- A's denied removal can be retried; its tombstone is hidden from both libraries.
- Unsaved editor changes block loading another level. A reopened SDK storage
  draft requests its custom linked artwork while geometry remains playable.
- Missing sharing capabilities preserve checked-in level play and clear feedback.

Unit scenarios additionally cover anonymous discovery, signed-out publication,
foreign ownership rejection, stale writes, identity changes, malformed latest
revisions hiding older records, upload failure without draft mutation, unchanged
package deduplication, changed bytes/MIME and invalid listing/rule bounds.

Controller tests inject native Gamepad API samples in the hosted iframe and
exercise RT firing, face-button reload, stick movement/camera cuts, Start
pause/resume and disconnect pause. Unit tests cover dead zones, analog scale,
held-at-connect suppression, single press edges, disabled/editor input, focus
changes, reset, sparse slots/replacement, unknown layouts and combined
keyboard/touch/controller controls. These are synthetic input tests, not physical
USB/Bluetooth hardware validation.

## Frame, touch and visual checks

| Actual napplet frame | Result |
| --- | --- |
| 200×160 | Useful expansion notice, no horizontal overflow |
| 320×560 | Gameplay, scrolling editor and level workspace remain reachable |
| 900×600 | Gameplay, graphical editor and level workspace fit |
| 1600×900 | Large-screen composition and useful editing/library space |

Gameplay retains a 4:3 viewport. Room-plan/graph editor checks cover dragging
rooms, camera/look-target handles, frog presets, height controls, dressing,
multiple paired connections, endpoint movement and deletion. Native touch events
cover room drag/cancellation, wall taps and camera placement.

Gameplay touch tests pass at outer browser sizes 390×844, 360×640 and 844×390
(actual host frames 390×709, 360×505 and 844×300): fire/reload, simultaneous
movement plus aim and cancellation. New touch checks cover library scrolling,
repository level selection and rule editing. Reload/movement scenarios wait for
visible game state; fixed wall-clock delays were unreliable under concurrent
software-rendered browser load.

App-owned olive/brass colors remain in light/dark schemes and without theme
support. Missing optional storage/fs/config support preserves local controls or
copy/export fallbacks. Gameplay/editor/phone covers were refreshed in the preceding expansion;
this audio pass inspected updated 320×560 and 900×600 gameplay captures. The
selected cover and metadata were reviewed in Listing during the earlier pass. All twelve demo cameras, including three frog views, were inspected in
the preceding expansion pass. Generated art may still need an alignment pass.

## Artifact, authority and remaining coverage

`dist/index.html` is the only build file: **11,404,021 bytes** (10.88 MiB), with
inline scripts/styles and assets. SHA-256:
`04ac952058d1d58168f102928b1fba153256b9841e28722cf8be32d44ca49ab4`.
It is within the 25 MiB HTML budget; the Vite size warning is expected for this
single-file build. Tracked source exceeds the host's 40 MiB budget after the preceding audio archive
commit; the archive includes roughly 22 MiB of original/review recordings. The
compact playback subset adds less than 1 MiB. Source-limit validation was not
weakened, and recordings were not removed to bypass it.

`requires: []` is unchanged. Optional storage/config/fs support local authoring;
identity/outbox/upload/resource enable sharing. The documented helper observes
the existing shell initialization policy, for which SDK 0.28.0 has no wrapper.
Public records use `soy.app-data/1`, collection `levels`, schema `soyindent.level`,
version 1; geometry and art are immutable Blossom references. Images are raster
only, size/MIME/hash checked and decoded before use. Successful uploads and
prepared record changes are retained for retry. There is no app-owned direct
network, browser persistence, signer, relay escape hatch, backend or host DOM
access. Subscriptions, input handlers, animation and object URLs have teardown.

Physical controllers, physical phone/GPU performance, actual signer consent,
public Blossom/relay visibility with distinct real identities, provider outages,
a signed public manifest and measured protocol teardown remain unverified.
Preview scopes differ from public-release scopes. The remaining production sound set,
stacked floors, animated door sequences and inventory remain future work.

The owned preview and browser sessions are stopped after testing. Restart with
`soyli dev --no-open` and use its printed URL for `SOYINDENT_PREVIEW_URL=...` with
`pnpm test:hosted`, `pnpm test:audio:hosted`, `pnpm test:editor` or `pnpm test:features`.

An incremental stylesheet rebuild stopped the pinned Vite plugin watcher during
the first regression attempt. Its owned listener closed; a fresh full-build preview
passed the regression run. Both owned preview listeners (52092 and 52392) were
confirmed closed after testing. No running user preview was terminated.