Skip to content

Use cached V8 by default on Linux ARM64 - #508

Merged
jonit-dev merged 38 commits into
developfrom
feat/prd615-linux-arm64-v8
Oct 16, 2026
Merged

jonit-dev merged 38 commits into
developfrom
feat/prd615-linux-arm64-v8

Conversation

@jonit-dev

@jonit-dev jonit-dev commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Linux ARM64 now selects cached V8 13.1.201.22 by default, replacing QuickJS on this supported desktop target. The source producer builds once per pinned recipe, publishes an immutable verified payload, and the downloader enforces its receipt hash on fresh and warm acquisition.

The paired qualification also needs honest inputs and startup state: preserve the verified starter executable's bytes/mode across the performance cook on success or failure; compile compute pipelines without mutating solver buffers; admit fixed compute alongside physics and scene ticks from the existing prime; and align the authored render-chain scenario at tick 600, failing closed on overshoot.

  • Earlier local qualification: 814 focused tests, typecheck, lint, budgets and documentation checks pass; the full suite on frozen 33f753c230cc90a741ed2b062d278cdef04e696f passed 779 files (three skipped), 10,662 tests (20 skipped), in 590.02 seconds, with temporary-directory counts unchanged. Browser/native row-75 proofs preserve seven solver buffers during compile-only warmup and subsequently change four; the deadline proof uses a controlled clock. These results predate the later CI repair batch and do not qualify its final head.
  • Terrain Node editor repair: a real supported atomic external save immediately after POST reproduced lost revision delivery with a ready watcher and raw filesystem events. The existing watcher now refreshes only the configured document from public raw events, validates raw-path types, deduplicates through existing revision logic and removes the listener on close. The actual built server passes all 8 document tests, including the queued real heartbeat, atomic save, malformed/unrelated raw paths and cleanup; 13 consumer tests, package build/publint and typecheck pass. Lint exits zero with three existing server complexity warnings and one new test-reader warning; documentation checks pass 3,097 links and 248 fixtures. No watcher, polling, delay or threshold was added.
  • QuickJS fallback CI repair explicitly selects the engine in the existing CMake/cook paths while preserving native features; 2 executed checks pass. The decal verifier migrates its stale default expectation; 25 asset/decal checks pass, with strict V8 assertions retained. The local QuickJS runtime remains UNVERIFIED: two attempts exited 127 because their selected mystral-tools executables were missing; no third GPU attempt or runtime PASS is claimed. These Node editor/test and CI selection/fixture changes are verified separately; the C++ host, V8 producer, core runtime and measured starter workload source are unchanged by this repair batch. Fresh ARM CI remains pending.
  • Historical accepted ARM source c312cee5a9ad5bdf60da347bfd89423af0022c38, run 38784079933: strict six-run QuickJS JS-frame p50s 30.42/31.05/30.70 ms (median 30.70) versus V8 6.08/6.17/6.06 ms (median 6.08). Twelve steady windows report compiling=false, the same bundle/features and ARM llvmpipe LLVM 20.1.2 Vulkan adapter; AA is dropped and Image undefined in both arms. Four actual captures pass seven assertions each and 660 frames; the separate raw pose audit agrees at aligned ticks 600/660/1261 (prealignment ticks 80/81/79/78; residual UUID, CPU/GPU-cost and asynchronous-readback differences retained). A fresh read-only judge returns NEUTRAL / PASS for both QuickJS/V8 pairs, both within-engine repeat comparisons and overall, scoped to ARM software Vulkan. The current-source starter artifact in that run passes 300 non-blank V8 frames.
  • PRD 100%; implementation and acceptance complete. Archived at docs/PRDs/done/PRD-615-v8-on-linux-arm64.md. The new repair head requires fresh full CI and required joins; merge-queue admission is held pending that proof. No all-executable identity or final-head green claim is made. Whole manual run 38784079933 remains FAILED: Windows receipt transport hit a 30-second GitHub API timeout, leaving authoritative Windows receipt coverage and its required join unproven; all other selected jobs, including Android, succeeded. Earlier UI/SDK failures remain historical in PRD-615. No threshold or strict receipt-verifier relaxation is included.

Actual aligned ARM poses, retained at immutable image commit 736c78915fb7c3eadd52c39c7bbf5c1d16a198ac (image publication passed normal hooks):

QuickJS repeat 1, aligned ARM pose
QuickJS repeat 2, aligned ARM pose
V8 repeat 1, aligned ARM pose
V8 repeat 2, aligned ARM pose

Planning document extracted from 8167695fd2528bdb7fe99eb259b73e43501d93b6; source commit preserved.
@jonit-dev jonit-dev added the prd:0% PRD implementation has no verified phase yet label Oct 15, 2026
@jonit-dev jonit-dev removed the prd:0% PRD implementation has no verified phase yet label Oct 15, 2026
@jonit-dev jonit-dev changed the title PRD-615: Use V8 on Linux arm64 feat(native): use cached V8 on Linux ARM64 Oct 15, 2026
@jonit-dev jonit-dev added prd:25% PRD phase 1 verified prd:50% PRD half the phases verified and removed prd:25% PRD phase 1 verified labels Oct 15, 2026
@jonit-dev jonit-dev added prd:75% PRD phases in, acceptance open and removed prd:50% PRD half the phases verified labels Oct 15, 2026
@jonit-dev jonit-dev changed the title feat(native): use cached V8 on Linux ARM64 Use cached V8 by default on Linux ARM64 Oct 15, 2026
@jonit-dev jonit-dev removed the prd:75% PRD phases in, acceptance open label Oct 15, 2026
@jonit-dev
jonit-dev marked this pull request as ready for review October 15, 2026 19:00
@jonit-dev jonit-dev added the prd:100% PRD phases and acceptance complete label Oct 15, 2026
jonit-dev and others added 6 commits October 15, 2026 12:39
The packaged-quickjs spec read split("\n      - ")[0] as a string. With
noUncheckedIndexedAccess that index is string | undefined, so `pnpm typecheck`
failed with TS18048 at ci-structure.spec.ts lines 3042 and 3044.

Throw a named error when the step is missing instead of relying on the index.
No runtime behaviour changes: split always returns at least one element.

Verified: pnpm typecheck exits 0; pnpm exec vitest run
scripts/__tests__/ci-structure.spec.ts passes 162/162.
…ing as ground

Stride sync (footPlantSpeed) restored the rig root with quaternion.copy, which
rewrote a (0, PI, 0) Euler as (PI, 0, PI); every later rotation.y increment then
turned the figure the mirrored way, so the starter jogged backwards.
Restore the exact Euler instead.

Trimesh colliders now set FIX_INTERNAL_EDGES on web and native Rapier: a capsule
pressed into a platform's side read grounded on triangle edges and sank at
0.16 m/s instead of falling.

Red-green: animation.spec.ts (mirrored Euler) and character.spec.ts (grounded at
tick 42 on a trimesh wall); native cargo tests pass. Native wall-fall runtime
behaviour is unverified beyond the Rust unit tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… movement proof

- Player pushes dynamic bodies (pushesDynamicBodies), so the crate moves.
- HUD progress is published by Play (spawn -> island edge, 0..100) instead of
  |playerX| * 10, which started at 20 and fell while walking forward.
- Player.debug() reports facingAxis, clip and strideSynced; the crate is an
  entity with debug().
- playtests/movement.playtest.json proves the figure faces each of the four
  travel directions, jogs while moving, idles when stopped, plays Jump_Start,
  keeps stride sync, and shoves the crate.

Local: 25/25 existing starter scenarios plus movement 3/3 under Xvfb WebGPU.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eading as ground

animation: footPlantSpeed restored every object's rotation Euler, which round-
trips each bone quaternion through Euler and moved vq-locomotion poses (failed
test-unit 3/4 and integration/animation on the last push). Only the game-owned
root needs its Euler kept; bones restore their quaternion as before.

physics: Rapier's computedGrounded counts any positive up component, so a
character pressed into a rounded-box wall stayed grounded and sank at 0.16 m/s.
Grounded now needs a walkable contact (normal.y >= 0.5) when the step recorded
contacts; a snap-to-ground step records none and keeps Rapier's answer. Native
Rust mirrors it. New red-then-green test uses the starter's rounded island.
Native runtime behaviour is covered by cargo tests only, not a native playtest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The player moved at 2 m/s with a clip whose natural speed is 5.9 m/s, so the
jog played at 0.34x. Walk is now 1.5 m/s, Shift runs at 5 m/s, speed eases with
a 0.15 s exponential, and Walk_Loop and Jog_Fwd_Loop blend through BlendSpace1D
and AnimationPlayer.playWeighted so stride sync keeps both feet matched.
debug() gains gait and speed. Every starter scenario was retimed for the new
speed; respawn waits 240 ticks because the player now slides past the island
wall instead of sticking. movement.playtest.json checks walk and run gaits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jonit-dev
jonit-dev enabled auto-merge October 15, 2026 22:19
@jonit-dev
jonit-dev added this pull request to the merge queue Oct 15, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to no response for status checks Oct 16, 2026
@jonit-dev
jonit-dev merged commit 8e7c964 into develop Oct 16, 2026
221 of 227 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

prd:100% PRD phases and acceptance complete

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant