Fixed game lifecycle evidence
Pre-releaseFixed game lifecycle: native, WASM and hosted rendering evidence
Draft #172 adds optional fixed simulation ticks, bounded catch-up, variable updates, interpolated drawing and one-time cleanup through runGameLifecycle. The original runGame entry remains supported. The starter uses the lifecycle with previous/current interpolation.
Source: eca01e39e476e191ce8cd29bf130ec194d09fa02, stacked on #171. Tests run 34569572883 passes all 22 jobs. Its checkout 703eb4fa762eab3411e6cfc38a45931eaf4cf8af has the same Git tree as the PR head. This is not full named-hardware quality acceptance.
Verified behavior
- The actual Perry 0.5.1220 native and WASM executions agree on uniform/varied partitions (50 ticks), 6,000 frames at 144 Hz (2,500 simulation ticks at 60 Hz), catch-up/drop/resume, interpolation, invalid inputs, overflowing accumulation, tiny steps, optional hooks, hook order, early stop and idempotent cleanup. Hosted and exact committed local results pass. Earlier failed observations remain in the archive.
- Hosted fresh installed native scene, direct-2D and lifecycle modes each match all 16,384 expected pixels and clean up once. The lifecycle mode records one init, nine updates/draws and ten fixed ticks. Scene/direct-2D exercise Jolt; lifecycle mode does not. The hosted adapter is software DX12, separate from physical Radeon measurements.
- The real compiled lifecycle game in hosted Chrome renders the exact 128x128 image, completes eight updates/draws and 26 fixed ticks, and cleans up once in 3.033 seconds. The explicit FFI startup-fault control reports the expected failure without entering the game loop. Physics is intentionally omitted from this minimal browser fixture. This control does not qualify general Perry exception propagation.
- Local fresh installed lifecycle rendering passes on Radeon 760M DX12 and Vulkan, each with one init, nine updates/draws, two fixed ticks and one cleanup. Both native captures have SHA-256
8a509d87d3aa3fab96e0a9e2c67228e187f1bc0853cb4726aa5844799440f30e. Fixed-tick counts depend on elapsed frame time; cross-host equality is not required for this live-render fixture. - The revised default starter builds unmodified natively in 266.563 seconds. A bounded
npm startcopy renders its 800x450 greeting and interpolated square, reads the asset and cleans up once; the restored unmodified source completes its web build. These candidate observations retain their source snapshots and seven matching runtime/template hashes. Hosted default creation and missing-compiler/unsupported-target controls pass. All 20 native examples compile and link.
Source and scope limits
The hosted native package report records source_dirty: true; that observation is preserved. All seven reported installed renderer/core hashes match the exact PR Git contents with Windows newline conversion. The six hosted starter source hashes also match, allowing npm's LF shebang normalization. These receipts establish the checked files, not a wholly clean native build checkout. The pure lifecycle contract and installed starter creation report clean checkouts.
This source fixes the finite-number and stored-hook dispatch failures found by actual WASM execution. It does not fix every compiler compatibility gap. Subsequent execution of the full starter found a named-void-callback return conversion error; draft #173 addresses that issue and adds complete starter browser asset/text/render acceptance. Successful web compilation in #172 must not be read as successful full starter browser execution.
Canonical example runtime coverage, pause/focus policy, device-loss recovery, components, visible native presentation, clean-machine packaging, broader graphics/performance acceptance and named hardware qualification remain open. No PR is merged or npm package released by this publication.
The archive retains command logs, successful and failed observations, images, source receipts and the exact patch. Executables, WASM/HTML build products and installed dependency trees are excluded; their recorded hashes remain. Every included payload and the ZIP CRC are verified before upload, followed by GitHub asset size and digest verification.