Back to GRAV / RIFT
SOURCE / PINNED RELEASE

Made of little things.

GRAV / RIFT

Release
288aa261ce07…
Author-recorded commit
c549b5a4e17e…
License
LICENSE
Author’s source reference
nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-8a7361981e8

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

docs/verification.md
# Prototype verification

## Build and sandbox

- `pnpm verify`: 6 guidance checks, 42 physics/combat regressions, TypeScript and production build pass.
- `pnpm test:conformance`: 5 pass, 0 fail, 5 skip. The unsigned local build supplies no manifest event (3 skipped checks), startup emits no envelopes in the reference harness (wire skipped), and lifecycle measurement is unavailable (1 skip). These are unverified coverage, not passes.
- `soyli check`: passes in the soyLI space-playback-4 host with cached Chromium 153.
- Actual artifact: self-contained `dist/index.html`, approximately 94 KiB. No external script/stylesheet references or forbidden browser authority surfaces in authored code or the artifact.
- Host requirements: none. Optional `storage` is used only through SDK helpers; absence, timeout or rejection leaves gameplay and session records usable. No relay escape hatches. App-owned palette with no theme subscription.

## Real hosted interaction

`tests/hosted.mjs` runs in the real soyLI `allow-scripts` iframe, using the printed `soyli dev` URL. It verifies:

- Exact iframe dimensions 200×160 (useful paused resize notice), 320×560, 900×600 and 1440×900. No horizontal overflow or clipped primary controls.
- Keyboard flight, orbit capture, release-to-throw, rip tether detachment, exposed core, spending salvage on an upgrade, pause/resume, and an entire fight ending in victory through player inputs alone.
- A user-triggered SDK storage write with visible host success feedback.
- App palette stability with light/dark host appearance and browser color scheme. Reference conformance verifies boot with all optional domains absent.
- Touch emulation at actual 390×844, 360×640 and 844×390 viewports. Two simultaneous browser touch contacts steer and collect; release throws; tapping changes modes. Essential touch controls measure at least 44×44 CSS pixels.
- No page errors.

The test temporarily positions the manager's stage at the viewport origin and removes its 300px iframe minimum so the iframe has exactly the claimed size. Those are test-only host styles, not application changes. Chromium touch emulation is not physical iOS/Android verification. Audio is implemented using gesture-activated synthesis; sound quality and activation still deserve checks on real phones. No gamepad or screen-reader playthrough was claimed.

## Mechanic regression coverage

Alpha hull extraction; separating-axis rejection and momentum transfer; off-center angular response; all three capture/release modes; breakable armor and protected/exposed core; explosive chains and salvage drops; upgrade costs/caps; pause/reset/practice states; finite sustained simulation without a body-count cap; and destroying the boss through physical impacts without direct test damage calls.

The victory regression caught a kinematic-body cooldown bug and prevents its return. A compressed volley retains a shared collision group during flight, so initially overlapping cargo does not destroy itself before reaching the target. Ordinary debris still collides. The carry cap and 110-body scene cap are removed. Uncapped acquisition includes detached armor. Collision groups skip held/held and same-volley enumeration; dense swarms use shared field glow rather than per-part glow.

## Capture recipe

The selected landscape still is a real 960×600 hosted frame showing a loaded vortex firing a stream of debris through the Foundry. Extra portrait and landscape screenshots are in ignored `.napplet-space/promotion/`.

Reproduce the Foundry still using `pnpm test:foundry -- <preview URL>`: at 1200×750, start practice, gather floor scrap and a cell, aim at the first gantry and release. The test captures the first contact explosion and the falling wreckage.

The selected silent landscape WebM uses soyLI's supported 960×600 recorder and the timed input recipe in `napplet.json`. It shows simultaneous gathering and continuous aimed fire while flying through the Foundry, followed by cluster bursts and a cargo drop. Portrait stills use actual phone viewports. The soyLI recorder has no portrait recording preset; no portrait clip is supplied.

All artwork and synthesized sounds are original procedural content. Sprite source is `src/game/sprites.ts`; inspect its grid and collision outlines in the pause menu. No generated promotional illustration is presented as gameplay.

## Scope limits

Two selectable industrial salvage sites with one boss encounter each; rigid-body fracture and detachable armor, not deformable metal simulation. Flat corridor collision bounds, no terrain excavation. No multi-stage campaign, imported art pipeline UI, multiplayer or hardware-controller integration. These remain design work beyond this first proof.

## Vortex revision evidence

- Mouse movement steers the field right, left and upward; the focus remains 165 world units ahead of the tug. Ship orientation uses that same aim. A stationary cursor remains aligned while the camera scrolls.
- Physics regression measures over 11 radians of actual debris rotation per second, with mean orbit speed above 700 units/second and a stable orbit radius. The base field speed is 14 radians/second, up from 2.2.
- Each mode captures and launches 256 pieces without truncation. Every released part remains inside the aimed cone; spread does not grow with payload count.
- Optimized collision candidates match the former pairwise eligibility rules. Captured swarms and single volleys skip self-pair enumeration entirely.
- The revised hosted runs held more than 20 pieces, stripped all six plates and completed the boss fight. Keyboard/touch, all required sizes, host storage, and palette checks pass.


## Expanded-stage revision evidence

- Stage: 4800×1000, formerly 2380×600. Usable vertical travel increases from
  370 to about 686 world units. Desktop camera zoom is 60% of its former value;
  the tug itself is scaled to 85%, producing roughly half its former screen size.
- Initial debris: 224 versus 28, with over 200 parts at scale 0.56 or smaller.
  Eleven enemies occupy several heights along the longer route. The walker and
  debris collision bounds share the rendered ceiling/floor coordinates.
- Regression coverage includes distributed spawn bounds, smaller fragments,
  altitude-relative replacement salvage, full vertical flight and camera bounds.
  All prior aimed-vortex, high-speed orbit and 256-part payload checks remain.
- Hosted verification includes the full longer flight and boss victory, vertical
  touch movement in the short landscape view, pointer alignment after vertical
  camera movement, and resizing to portrait without resetting the run.
- Historical media: `preview-expanse.png` and `preview-expanse.webm` preserve
  the expanded-stage revision; the current Foundry captures are listed below.


## Foundry and explosive demolition

- Foundry is the default site, with gravity of 640 world units/s², floor scrap and
  four bolted assemblies (28 detachable pieces). Orbital graveyard now uses zero
  gravity rather than the earlier slight downward drift. The tug auto-hovers.
- Connectivity keeps intact structures standing. Tether extraction or blast
  damage releases disconnected sections into the normal collision simulation.
  Rotated convex hull bounds meet the floor; ground friction settles loose parts.
- Cell drops use a tested 35% chance, replacing the previous guaranteed drop.
  Collection stabilizes cells; release arms them for first-contact detonation.
  Unheld cells also respond to hard impacts and nearby explosions. Same-volley
  cargo remains exempt from self-collision.
- Explosions have a 260-unit damage/impulse radius, structural damage, chain
  reactions, a local fireball, pressure ring, smoke, sparks and bass/noise sound.
  Reduced effects remove the flash, rings/streaks and camera shake. Cosmetic
  effects are bounded; physical cargo remains uncapped.
- `pnpm test:foundry -- <printed soyli dev URL>` checks stable floor salvage,
  collecting a cell, first-contact detonation, actual gantry demolition, deliberate
  tether ripping in a fresh run, the Foundry boss fight, retry/site selection and
  touch collection/release at 390×844, 360×640 and 844×390. Sound is enabled through
  a real button gesture; physical-device sound quality remains unverified.
- `tests/hosted.mjs` retains the orbital victory, optional host storage, theme,
  responsive and camera checks. No added NAP domains, network or storage surfaces.
- Historical Foundry media: `preview-foundry.png` and `preview-foundry.webm`.
  Previous captures remain on disk; portrait stills are under the ignored promotion
  directory. The recorder still has no supported portrait clip mode.

## Medium artillery Striders

- Three 115-HP medium walkers per site, with four articulated legs, feet that
  displace ground scrap, and a cannon with a 0.7-second firing telegraph. The
  legs are a procedural rig with contact impulses; they are not independent
  constraint-driven rigid bodies. Destroyed walkers drop six salvage pieces
  (including leg beams), grant 75 salvage, and retain the 35% cell-drop chance.
- Shells use sprite-derived convex hulls and the shared explosion system. All
  three modes capture them; capture disarms them and suspends their six-second
  fuse. Release arms the same body and lets it strike its original shooter.
  Hostile shells hit the pilot, terrain and other bodies, but ignore their own
  launcher until returned. Existing cell impact rules are unchanged.
- The shell ring changes from orange to mint; the HUD shows SHELL SECURED.
  Touch aim prioritizes an incoming shell, then its sender after capture.
  A returned shell's direct blast or immediate cell chain earns RETURN TO SENDER.
- Six added simulation regressions cover gait/foot contact, firing windup,
  all-mode interception and suspended fuse, physical return-shot kills, owner
  collision rules, pilot impacts, fuse expiry, auto-aim and chain attribution.
  The existing cell-contact and structural-fall fixtures now isolate their
  contacts from random orbital phase and unrelated artillery encounters.
- `pnpm test:walkers -- <printed soyli dev URL>` passed a pointer-driven catch
  and return that destroyed the original shooter, with no game-state mutation.
  Real Chromium multi-touch emulation caught and returned shells at 390×844
  and 844×390. Existing orbital and Foundry hosted suites passed through victory,
  with the full responsive, touch, storage and app-owned palette coverage above.
- Historical Strider media: `preview-walkers.png` and `preview-walkers.webm`. The 8-second
  960×600 recipe in `napplet.json` repeats a catch, return and explosive demolition.
  Previous captures remain available; new portrait/landscape stills are in the
  ignored promotion directory. No portrait recording mode is available.

The previous Strider cover was reviewed in Listing. The recorded clip was inspected across
its full sequence and played to its 9-second end without a decoder error (the
recipe supplies 8 seconds of input plus recorder lead-in). `soyli check` passed
with artifact hash `ea09bf01dc26bfb8a094daeb74a20f7ff4eab1e3a2a0c7ce2c97741aa8f016e9`.
This revision is verified locally; it has not been published.

## Surgical gravity and shared rigs

- Four field modes and three independent release patterns. Volley launches all
  carried bodies, Stream launches one every 75 ms, and Clusters launches up to
  five every 380 ms. Holding right mouse fires while left continues gathering;
  left release drains in the chosen pattern. No carry cap.
- Surgical locks one convex body under the cursor. Left holds/pulls, the wheel
  rotates, right launches, and left release drops gently. Violet shield cells
  protect living rig roots from capture. Extracting one unlocks the Strider or
  Warden without removing its other limbs or armor.
- Parent-ordered joint graphs handle stress, subtree release, inherited velocity,
  shield state and remaining-leg mobility. Both blueprints use the same module.
  Driven attached poses become ordinary convex bodies on detachment; this is
  not a constraint-ragdoll or deformable-metal solver.
- Hold Tab for a radial selector at 5% simulation speed; hover/release chooses,
  clicks can set both field and release, Escape cancels. The on-screen selector
  and FIRE button support touch. No trajectory or ricochet prediction yet.
- Ten added simulation regressions cover release cadence/body conservation,
  simultaneous gathering/firing, one-object selection and drop/shot latching,
  subtree detachment, live grabs and limb loss on both blueprints, rig collision
  exclusions, surgical structure extraction, launcher immunity across mounted
  parts, returned-shell chain credit and retaining a hurled boss within reach.
- `tests/surgical.mjs` passes actual combined mouse-button firing, Tab timing
  and input isolation, shield extraction, live Strider lift/rotation/throw, leg
  extraction, all seven radial targets at 320×560, 900×600, 1440×900 and 844×390,
  and simultaneous touch gather/stream fire at 390×844 and 844×390. The existing
  hosted, Foundry and Strider suites pass too, including both boss victories,
  storage, theme independence, responsive sizing and shell catch/return.
- Browser test clocks are paused between explicit simulation advances so slow
  screenshots and inspection do not let combat run ahead of the pilot. Boss
  tests follow its actual position after losing legs or being knocked backward.
  No hosted test changes game state directly.
- Historical Surgical media: `preview-surgical.png` and `preview-surgical.webm`. Earlier
  media is preserved. The clip uses a selector-button click because the recorder
  does not accept Tab in its timed-key schema; the browser test exercises Tab.

The previous Surgical cover and full nine-second clip were reviewed in Listing.
The clip decodes at 960×600, reaches its end and reports no playback error; it
shows the real extraction, projectile and selector. `soyli check` passed with
artifact hash `a039c09344ae2aef856eaf80d4753cc5de5cfe7a5a1bd5bed514c7d8df72b614`.
This revision is verified locally and has not been published.

## Independent mouse controls

- RMB/Space gathers and holds; releasing it drops remaining cargo with damped
  momentum. LMB/F explicitly fires. Streams and clusters continue only while
  fire is held, including when fire is pressed before gather or before ammunition
  arrives. Holding both buttons feeds new debris into sustained aimed fire.
- Releasing fire keeps collection active; releasing gather never starts an
  automatic discharge. Surgical uses RMB for grab/drop and LMB for hurl.
  Touch FIELD/FIRE and the canvas drag follow the same separation. Compatibility
  mouse events from a touch drag are suppressed to avoid accidental shots.
- The two new simulation checks cover initially empty sustained fire fed by new
  debris, aimed projectile velocity, stop-fire behavior, unarmed dropped cells
  and resumed dropped-shell fuses without return-shot credit. The existing
  cadence/conservation and drop checks now use explicit firing.
- The hosted Surgical suite passes both physical mouse-button press orders,
  release/drop without automatic fire, continued collection after stopping fire,
  the new Surgical mapping and touch stream fire. Orbital and Foundry victories,
  host storage, all required frame sizes, app-owned themes and touch interception/
  return still pass. Touch artillery tests approach above floor-cell chains before
  turning on the field. No game-state injection is used.
- `pnpm verify`: 6 guidance checks and 42 simulation tests pass, plus TypeScript
  and production build. Conformance: 5 pass, 0 fail, 5 skips as explained above.
  `soyli check` passes for artifact
  `898a9ffefcf9c818c12911cff83dd057a5c501839f3ce06c3ab7bccafa7bde2b`.
- Selected media is now `preview-controls.png` and `preview-controls.webm`. The
  960×600 clip shows constant intake while streaming, then cluster fire and a
  drop; its full 8.96 seconds play in Listing without decoder errors. Earlier
  media remains available. This revision remains local and unpublished.

## Updated skills and manifest review — 2026-10-15

- Reviewed the refreshed skills and authoring guides with soyLI 0.29.0. The game
  already uses SDK storage, catches synchronous and asynchronous operation failures,
  and remains playable without optional domains. It uses no OUTBOX, shared public
  data, WASM or external asset pipeline, so those new guides require no gameplay
  changes.
- `napplet.json` now advertises `optionalDomains: ["storage"]` for personal bests
  and sound preferences. There are still no hard requirements or implemented
  intents. The build comment and sandbox brief now point to soyLI's standalone
  manifest metadata rather than the build plugin's legacy event format.
- `pnpm verify`: 6 guidance checks, 42 game regressions, TypeScript and build pass.
  Conformance: 5 passed, 0 failed, 5 skipped (manifest, wire and lifecycle evidence
  remains unavailable as described above). `soyli check` passes with Chromium 153
  in the `space-playback-6` host.
- `pnpm test:hosted` passes in the real `soyli dev` iframe: orbital victory,
  user-triggered SDK storage success, the four exact frame sizes, app-owned palette
  checks, three mobile viewports and live portrait resize. The generated layout
  and portrait/landscape gameplay screenshots were inspected. Physical-device
  coverage remains unchanged.
- Separate test-only storage faults in the hosted iframe covered a synchronous
  throw, rejected promise and stalled request. Each displayed the save-failure
  message and retry control, resumed gameplay and produced no page errors.
- The artifact is still the single 95,931-byte HTML file with SHA-256
  `898a9ffefcf9c818c12911cff83dd057a5c501839f3ce06c3ab7bccafa7bde2b`.
  No forbidden browser-authority or external script/stylesheet references were
  found. The unchanged bytes match the selected reviewed cover/clip; no media
  recapture was needed. This update is local and unpublished.