Skip to content

Dash: endless-runner full-stack sample - #6146

Open
shai-almog wants to merge 31 commits into
masterfrom
dash-runner-sample
Open

shai-almog wants to merge 31 commits into
masterfrom
dash-runner-sample

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

Adds scripts/dash, an original endless-runner sample: deterministic shared rules, an authoritative backend that re-simulates every score, live same-seed races with voice, the Forge level editor with moderation, city runs built from real map routes, an admin console, the developer-guide chapter and the Initializr template.

🤖 Generated with Claude Code

shai-almog and others added 17 commits October 30, 2026 17:55
Phase 1 of the endless-runner sample (scripts/dash): an int-only 60 Hz
simulation shared by app, server, editor and replay viewer. One abstract
lane/height/distance world, so 2D and 3D are renderings and a level can
swing from side-on to chase camera mid-run without changing how it plays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Server-run races with parties, quick races filled with bots, input
stamping and flood limits, WebRTC signaling relay, replay-verified level
boards (all/week/day, friends, crew), crews, and the Forge reworked for
level packs. Migrations for SQLite, PostgreSQL and MySQL.

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

The client renders one deterministic Run in 3D and swings the camera
between the side view and the chase view on a level's cues. Solo runs
submit their input log for the server to re-simulate; races run in
lockstep with seat inputs from the server, with WebRTC voice signalled
over the game socket. The track editor paints obstacles, pickups and
camera cues on a timeline and playtests the draft. The admin console
lists and spectates live races.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Initializr renames every Dash in the template, so MATERIAL_DASHBOARD
and "dashes" were renamed too and the generated app did not compile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A rendered city backdrop, animated stars, count-ups and reward bursts; a
lobby with currency pills, side rails and a bottom nav; result cards, level
cards and shop rows rebuilt; runners and tracks from the new Rig/Theme; the
side camera frames the runner; e2e screenshots copied into the guide images.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…at the end

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

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…admin, promo video

- City runs put the street name overhead and boards for real places along
  the route (Overpass, replaceable through Landmarks.setSource).
- Causeway chunks carry more coins, power-ups and traps, spaced so a sharp
  bot finishes every weekly seed (new fairness test); goldens regenerated.
- Race bot leads by the input delay; party lobby chat is bubbles on one
  scrollable page; demo boards spread so the scores screen is not a tie.
- PromoVideoTest films a captioned tour with the simulator recorder
  (run-e2e.sh --video); the JavaSE recorder now captures the presented
  frame, so a recording no longer tears mid-paint.
- Guide and website: engagement and live-ops section, desktop admin shots,
  street/landmark shots, gallery and the promo video.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ames in race chat

- Emotes carry the sender's display name, never the account email.
- A development server seeds four weeks of history (DemoHistory): staggered
  sign-ups, bot races with replays, gem sales, wins and trophies, so the
  console's charts have a shape; the field's skills spread so runs end
  along the track instead of tying at the finish.
- The desktop pass shoots a 1440x900 window.
- Party lobby: the code and invite stay put while runners and chat scroll;
  the share icon takes the button's colour.
- Run and race shots wait for a stretch of track with something on it.
- ScoresTest's ghost check asserts the day's seed, not which runner.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nd scores shots

- The console's pipeline conditions name "races" as the backend does; a
  seeded "races at least 10" no longer reads (and saves) as days away.
- The demo history seeds once per database, not once per fresh field.
- The race shot is taken while the race runs; the scores shot is the day's
  endless board, where every run ends somewhere different.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Promote and Pipelines screen picker offered "deck" and "battle", which
the server refuses; it now lists the server's own Promotion.SCREENS. The
query table and the invite card say races, not battles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

Blog prose gate

✅ No net-new prose findings introduced by this PR.

@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

@shai-almog

shai-almog commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 12 screenshots: 12 matched.
✅ JavaSE simulator integration screenshots matched stored baselines.

…plate synced

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ✅ ByteCodeTranslator: 0 findings (no issues)
    • ✅ android: 0 findings (no issues)
    • ✅ android-compat: 0 findings (no issues)
    • ✅ android-res-compiler: 0 findings (no issues)
    • ✅ backend: 0 findings (no issues)
    • ✅ backend-test: 0 findings (no issues)
    • ✅ build-engine: 0 findings (no issues)
    • ✅ build-hint-catalog: 0 findings (no issues)
    • ✅ build-hint-tools: 0 findings (no issues)
    • ✅ codenameone-gradle-plugin: 0 findings (no issues)
    • ✅ codenameone-maven-plugin: 0 findings (no issues)
    • ✅ compose-compat: 0 findings (no issues)
    • ✅ core-unittests: 0 findings (no issues)
    • ✅ desktop-compat-runtime: 0 findings (no issues)
    • ✅ fxml-compiler: 0 findings (no issues)
    • ✅ ios: 0 findings (no issues)
    • ✅ javac: 0 findings (no issues)
    • ✅ javafx-compat: 0 findings (no issues)
    • ✅ project-model: 0 findings (no issues)
    • ✅ swing-compat: 0 findings (no issues)
  • ✅ PMD: 0 findings (no issues) [Report archive]
  • ✅ Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

shai-almog and others added 3 commits November 1, 2026 10:36
…ned lobby, editor and admin side bar

VirtualButton and VirtualJoystick setAnchor are public, so two controls can share a corner.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lofted octagonal segments with flat normals replace the capsules and
spheres; the menu portraits draw the same body as shaded panels.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e warm-up in the party test

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 231 screenshots: 231 matched.
✅ JavaScript-port screenshot tests passed.

@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 195 screenshots: 195 matched.

Native Android coverage

  • 📊 Line coverage: 19.19% (56036/292047 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 18.14% (269995/1488151), branch 12.40% (19632/158314), complexity 10.36% (15809/152567), method 15.72% (11378/72383), class 27.88% (2235/8017)
    • Lowest covered classes
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2396 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • androidx.compose.runtime.androidx.compose.runtime.LinkComposer – 0.00% (0/1430 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlinx.coroutines.channels.kotlinx.coroutines.channels.BufferedChannel – 0.00% (0/863 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/744 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/630 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 19.19% (56036/292047 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 18.14% (269995/1488151), branch 12.40% (19632/158314), complexity 10.36% (15809/152567), method 15.72% (11378/72383), class 27.88% (2235/8017)
    • Lowest covered classes
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2396 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • androidx.compose.runtime.androidx.compose.runtime.LinkComposer – 0.00% (0/1430 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlinx.coroutines.channels.kotlinx.coroutines.channels.BufferedChannel – 0.00% (0/863 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/744 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/630 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 220ms / native 266ms = 0.8x speedup
SIMD float-mul (64K x300) java 95ms / native 106ms = 0.8x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 75.000 ms
Base64 CN1 decode 83.000 ms
Base64 native encode 452.000 ms
Base64 encode ratio (CN1/native) 0.166x (83.4% faster)
Base64 native decode 297.000 ms
Base64 decode ratio (CN1/native) 0.279x (72.1% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Windows port (x64 / Intel-AMD): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, SSE2 SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 44ms / native 3ms = 14.6x speedup
SIMD float-mul (64K x300) java 44ms / native 3ms = 14.6x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 60.000 ms
Base64 CN1 decode 73.000 ms
Base64 SIMD encode 92.000 ms
Base64 encode ratio (SIMD/CN1) 1.533x (53.3% slower)
Base64 SIMD decode 82.000 ms
Base64 decode ratio (SIMD/CN1) 1.123x (12.3% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 12.000 ms
Image createMask (SIMD on) 4.000 ms
Image createMask ratio (SIMD on/off) 0.333x (66.7% faster)
Image applyMask (SIMD off) 28.000 ms
Image applyMask (SIMD on) 37.000 ms
Image applyMask ratio (SIMD on/off) 1.321x (32.1% slower)
Image modifyAlpha (SIMD off) 32.000 ms
Image modifyAlpha (SIMD on) 16.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.500x (50.0% faster)
Image modifyAlpha removeColor (SIMD off) 29.000 ms
Image modifyAlpha removeColor (SIMD on) 12.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.414x (58.6% faster)

ParparVM vs HotSpot (JDK 25): Windows x64

Runner CPU: AMD64 Family 25 Model 17 Stepping 1, AuthenticAMD (baseline windows-x64@amd64-family-25-model-17-authenticamd)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.42x (base 1.38x, +3.0%) 0.68x (base 0.82x, -16.3%) ok
translator (self) 4 0.79x (base 0.89x, -10.9%) 0.52x (base 0.55x, -5.2%) ok
intArithmetic 4 1.10x (base 1.10x, +0.4%) 0.06x (base 0.06x, -0.6%) ok
longArithmetic 4 1.08x (base 1.08x, +0.0%) 0.06x (base 0.06x, +1.3%) ok
mathTranscendental 4 0.85x (base 0.85x, +0.4%) 0.06x (base 0.06x, +4.3%) ok
arraySequential 4 1.82x (base 1.72x, +5.8%) 0.38x (base 0.38x, +0.3%) ok
arrayRandom 4 1.02x (base 1.01x, +0.1%) 0.23x (base 0.23x, +0.6%) ok
objectAllocation 4 1.26x (base 1.25x, +0.3%) 0.29x (base 0.29x, -3.3%) ok
valueEscape 4 0.10x (base 0.10x, -1.4%) 0.05x (base 0.04x, +4.1%) ok
hashMapChurn 4 1.33x (base 1.39x, -4.3%) 0.10x (base 0.10x, +6.3%) ok
stringBuilding 4 1.39x (base 1.36x, +2.3%) 0.32x (base 0.28x, +15.9%) ok
recursion 4 1.38x (base 1.43x, -3.4%) 0.06x (base 0.06x, +3.4%) ok
quicksort 4 1.10x (base 1.11x, -0.8%) 0.12x (base 0.12x, +0.7%) ok

Result: no regression

shai-almog and others added 2 commits November 1, 2026 19:45
# Conflicts:
#	.github/workflows/initializr-e2e.yml
#	docs/website/layouts/partials/cn1-flagship-samples.html
#	scripts/check-copyright-headers.sh
#	scripts/initializr/common/src/main/java/com/codename1/initializr/Initializr.java
#	scripts/initializr/common/src/test/java/com/codename1/initializr/model/GeneratorModelMatrixTest.java
#	scripts/initializr/e2e-shipped.sh
#	scripts/sync-initializr-template.py
#	scripts/tests/GenerateInitializr.java
…rs every tick

The bot polled once per frame, so a loaded machine stepped several ticks
between decisions and the runner hit the first obstacle. RunView.setBeforeTick
runs it before every tick instead. The promo tour records at full size with
game audio and taps, and a second clip films one run in the phone skin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Windows port (arm64 / Apple Silicon - Arm): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, NEON SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 53ms / native 3ms = 17.6x speedup
SIMD float-mul (64K x300) java 54ms / native 3ms = 18.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 60.000 ms
Base64 CN1 decode 69.000 ms
Base64 SIMD encode 78.000 ms
Base64 encode ratio (SIMD/CN1) 1.300x (30.0% slower)
Base64 SIMD decode 73.000 ms
Base64 decode ratio (SIMD/CN1) 1.058x (5.8% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 5.000 ms
Image createMask (SIMD on) 1.000 ms
Image createMask ratio (SIMD on/off) 0.200x (80.0% faster)
Image applyMask (SIMD off) 17.000 ms
Image applyMask (SIMD on) 21.000 ms
Image applyMask ratio (SIMD on/off) 1.235x (23.5% slower)
Image modifyAlpha (SIMD off) 20.000 ms
Image modifyAlpha (SIMD on) 12.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.600x (40.0% faster)
Image modifyAlpha removeColor (SIMD off) 17.000 ms
Image modifyAlpha removeColor (SIMD on) 10.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.588x (41.2% faster)

ParparVM vs HotSpot (JDK 25): Windows arm64

Runner CPU: ARMv8 (64-bit) Family 8 Model D49 Revision 0, MICROSOFT CORPORATION (baseline windows-arm64@armv8-64-bit-family-8-model-d49-microsoft-corporation)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.06x (base 1.11x, -4.6%) 0.73x (base 0.75x, -3.3%) ok
translator (self) 4 0.86x (base 0.84x, +2.3%) 0.48x (base 0.51x, -4.8%) ok
intArithmetic 4 1.04x (base 1.04x, +0.0%) 0.06x (base 0.06x, +3.1%) ok
longArithmetic 4 0.79x (base 0.80x, -0.1%) 0.06x (base 0.06x, +3.5%) ok
mathTranscendental 4 0.70x (base 0.72x, -3.1%) 0.07x (base 0.06x, +1.7%) ok
arraySequential 4 0.36x (base 0.46x, -20.4%) 0.39x (base 0.39x, +0.1%) ok
arrayRandom 4 0.94x (base 0.94x, -0.1%) 0.23x (base 0.23x, +0.3%) ok
objectAllocation 4 1.79x (base 1.82x, -1.7%) 0.40x (base 0.43x, -7.3%) ok
valueEscape 4 0.76x (base 0.76x, +0.0%) 0.05x (base 0.05x, +3.4%) ok
hashMapChurn 4 1.01x (base 0.98x, +2.1%) 0.12x (base 0.12x, +2.4%) ok
stringBuilding 4 1.54x (base 1.43x, +7.8%) 0.27x (base 0.27x, -0.4%) ok
recursion 4 1.46x (base 1.46x, -0.3%) 0.07x (base 0.07x, +1.1%) ok
quicksort 4 1.01x (base 1.00x, +0.7%) 0.12x (base 0.12x, +0.5%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Linux port (x64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub x64 runner. Baseline: scripts/linux/screenshots.

ParparVM vs HotSpot (JDK 25): Linux x64

Runner CPU: AMD EPYC 9V74 80-Core Processor (baseline linux-x64@amd-epyc-9v74-80-core-processor)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 1.01x (base 0.90x, +13.0%) 0.79x (base 0.96x, -17.4%) ok
translator (self) 4 0.59x (base 0.63x, -6.0%) 0.52x (base 0.46x, +12.4%) ok
intArithmetic 4 1.10x (base 1.10x, -0.0%) 0.04x (base 0.06x, -31.4%) ok
longArithmetic 4 1.08x (base 1.08x, +0.0%) 0.04x (base 0.06x, -29.4%) ok
mathTranscendental 4 1.10x (base 1.09x, +0.2%) 0.04x (base 0.07x, -39.6%) ok
arraySequential 4 2.80x (base 2.81x, -0.5%) 0.36x (base 0.35x, +1.4%) ok
arrayRandom 4 1.02x (base 1.02x, -0.7%) 0.20x (base 0.21x, -4.4%) ok
objectAllocation 4 1.31x (base 1.21x, +8.9%) 0.28x (base 0.39x, -27.7%) ok
valueEscape 4 0.10x (base 0.10x, -0.0%) 0.03x (base 0.06x, -44.3%) ok
hashMapChurn 4 1.09x (base 1.10x, -0.3%) 0.11x (base 0.10x, +9.4%) ok
stringBuilding 4 1.33x (base 1.49x, -10.7%) 0.26x (base 0.26x, +0.1%) ok
recursion 4 1.25x (base 1.24x, +0.7%) 0.04x (base 0.06x, -27.7%) ok
quicksort 4 1.08x (base 1.07x, +0.8%) 0.10x (base 0.11x, -10.4%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Linux port (arm64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub arm64 runner. Baseline: scripts/linux/screenshots-arm.

ParparVM vs HotSpot (JDK 25): Linux arm64

Runner CPU: Neoverse-N2 (baseline linux-arm64@neoverse-n2)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 0.95x (base 1.02x, -6.5%) 0.77x (base 0.66x, +16.0%) ok
translator (self) 4 0.71x (base 0.70x, +1.7%) 0.43x (base 0.43x, +1.0%) ok
intArithmetic 4 1.05x (base 1.04x, +0.0%) 0.03x (base 0.03x, +4.7%) ok
longArithmetic 4 0.79x (base 0.79x, -0.1%) 0.03x (base 0.03x, +5.0%) ok
mathTranscendental 4 1.09x (base 1.10x, -0.3%) 0.04x (base 0.03x, +9.9%) ok
arraySequential 4 0.35x (base 0.36x, -3.9%) 0.37x (base 0.37x, +0.2%) ok
arrayRandom 4 0.94x (base 0.94x, -0.2%) 0.20x (base 0.20x, +0.6%) ok
objectAllocation 4 1.87x (base 1.77x, +6.0%) 0.36x (base 0.37x, -2.1%) ok
valueEscape 4 0.51x (base 0.51x, -0.1%) 0.03x (base 0.03x, +6.4%) ok
hashMapChurn 4 0.87x (base 0.84x, +3.1%) 0.11x (base 0.12x, -5.1%) ok
stringBuilding 4 1.38x (base 1.57x, -12.0%) 0.32x (base 0.26x, +20.4%) ok
recursion 4 1.43x (base 1.43x, -0.5%) 0.04x (base 0.04x, +3.3%) ok
quicksort 4 1.00x (base 0.99x, +0.9%) 0.09x (base 0.09x, +1.2%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 196 screenshots: 196 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 323 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 52ms / native 3ms = 17.3x speedup
SIMD float-mul (64K x300) java 53ms / native 3ms = 17.6x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 46.000 ms
Base64 CN1 decode 53.000 ms
Image encode benchmark iterations 100
Image createMask (SIMD off) 4.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.500x (50.0% faster)
Image applyMask (SIMD off) 32.000 ms
Image applyMask (SIMD on) 25.000 ms
Image applyMask ratio (SIMD on/off) 0.781x (21.9% faster)
Image modifyAlpha (SIMD off) 29.000 ms
Image modifyAlpha (SIMD on) 25.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.862x (13.8% faster)
Image modifyAlpha removeColor (SIMD off) 30.000 ms
Image modifyAlpha removeColor (SIMD on) 24.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.800x (20.0% faster)

ParparVM vs HotSpot (JDK 25): macOS arm64

Runner CPU: Apple M1 (Virtual) (baseline macos-arm64)

2 performance regressions:

  • objectAllocation on all 3 CPUs: RAM 1.12x against a 0.72x baseline (+54.6%, tolerance 35%)
  • stringBuilding on all 3 CPUs: time 1.03x against a 0.84x baseline (+22.1%, tolerance 20%)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (HelloCodenameOne) 3 0.79x (base 0.96x, -17.0%) 0.91x (base 0.93x, -1.9%) ok
translator (self) 3 0.61x (base 0.62x, -2.5%) 0.76x (base 0.78x, -3.0%) ok
intArithmetic 3 1.04x (base 1.03x, +0.7%) 0.12x (base 0.12x, +1.7%) ok
longArithmetic 3 1.03x (base 1.03x, -0.1%) 0.11x (base 0.07x, +60.0%) ok
mathTranscendental 3 0.98x (base 1.01x, -2.2%) 0.12x (base 0.12x, +0.6%) ok
arraySequential 3 0.42x (base 0.42x, -1.0%) 0.53x (base 0.53x, +0.2%) ok
arrayRandom 3 0.99x (base 0.99x, -0.2%) 0.32x (base 0.32x, +0.3%) ok
objectAllocation 3 1.07x (base 1.11x, -3.3%) 1.12x (base 0.72x, +54.6%) REGRESSION (RAM +54.6%)
valueEscape 3 0.49x (base 0.51x, -2.7%) 0.09x (base 0.09x, +0.7%) ok
hashMapChurn 3 1.05x (base 1.18x, -10.6%) 0.08x (base 0.07x, +12.8%) ok
stringBuilding 3 1.03x (base 0.84x, +22.1%) 0.46x (base 0.46x, -1.3%) REGRESSION (time +22.1%)
recursion 3 1.22x (base 1.24x, -1.1%) 0.12x (base 0.12x, +0.3%) ok
quicksort 3 1.00x (base 1.01x, -0.9%) 0.11x (base 0.11x, +0.6%) ok

A change that moves performance ON PURPOSE records the new baseline in vm/selfhost/perf-baseline/pr/6146.json, with the reason, from this job's perf-results.json. The rebaseline is then part of this pull request's diff:

python3 vm/selfhost/calibrate-perf-baseline.py --pr 6146 --reason "<why these benchmarks moved>" perf-results.json

Result: performance regression

shai-almog and others added 2 commits November 2, 2026 02:38
…column, guide snippets from code

The shipped template compiles against the released Codename One, where
VirtualButton.setAnchor is not public, so the touch buttons use the corner
anchor alone and the framework change is dropped. Profile.runner maps to the
VARCHAR(40) its migration creates; PostgreSQL and MySQL refused the mismatch.
The guide's two city route examples are now tagged code in CityRouteTest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…workflows build each target on its own SDK

Pulse is the first sample with a watch app, and its iOS job failed three ways:

- xcodebuild -sdk iphonesimulator built the watch target on the iPhone SDK,
  where its watch-only AppIcon has no applicable content. The destination
  alone picks each target's SDK (pulse.yml, and dash.yml before it gains one).
- The watch slice compiles IOSNative.m with the app's switches, and watchOS has
  no CoreNFC: CN1_INCLUDE_NFC is now off on the watch, as on tvOS.
- The surfaces mirror (applyMirroredSurface, the drain on Java ready) called
  natives that exist only with CN1_USE_WIDGETS; a watch app without widgets
  failed to compile and then to link. Both are now behind that switch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

shai-almog and others added 5 commits November 2, 2026 06:06
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hat include it

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator Author

Apple Watch (watchOS / Core Graphics)

Compared 253 screenshots: 252 matched, 1 updated.

  • Sheet — updated screenshot. Screenshot differs (416x496 px, bit depth 8).

    Sheet
    Preview info: JPEG preview quality 70; JPEG preview quality 70.
    Full-resolution PNG saved as Sheet.png in workflow artifacts.

@shai-almog

shai-almog commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 193 screenshots: 193 matched.
✅ Native iOS Metal screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 3045 seconds

Build and Run Timing

Metric Duration
Simulator Boot 65000 ms
Simulator Boot (Run) 2000 ms
App Install 23000 ms
App Launch 132000 ms
Test Execution 501000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 205ms / native 8ms = 25.6x speedup
SIMD float-mul (64K x300) java 356ms / native 8ms = 44.5x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 70.000 ms
Base64 CN1 decode 76.000 ms
Base64 native encode 1751.000 ms
Base64 encode ratio (CN1/native) 0.040x (96.0% faster)
Base64 native decode 1183.000 ms
Base64 decode ratio (CN1/native) 0.064x (93.6% faster)
Base64 SIMD encode 155.000 ms
Base64 encode ratio (SIMD/CN1) 2.214x (121.4% slower)
Base64 SIMD decode 63.000 ms
Base64 decode ratio (SIMD/CN1) 0.829x (17.1% faster)
Base64 encode ratio (SIMD/native) 0.089x (91.1% faster)
Base64 decode ratio (SIMD/native) 0.053x (94.7% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 9.000 ms
Image createMask (SIMD on) 4.000 ms
Image createMask ratio (SIMD on/off) 0.444x (55.6% faster)
Image applyMask (SIMD off) 499.000 ms
Image applyMask (SIMD on) 50.000 ms
Image applyMask ratio (SIMD on/off) 0.100x (90.0% faster)
Image modifyAlpha (SIMD off) 101.000 ms
Image modifyAlpha (SIMD on) 34.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.337x (66.3% faster)
Image modifyAlpha removeColor (SIMD off) 59.000 ms
Image modifyAlpha removeColor (SIMD on) 67.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 1.136x (13.6% slower)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant