Skip to content

Wayline: a full-stack ride-hailing sample, its CI and an Initializr template - #5984

Open
shai-almog wants to merge 28 commits into
masterfrom
wayline-sample
Open

shai-almog wants to merge 28 commits into
masterfrom
wayline-sample

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

What this is

scripts/wayline is a modern successor to the ride-hailing app of "Create an Uber clone in 14 days": one Maven project in one language, a Codename One app styled with CSS and a Codename One Backend server. The roles the server gives an account decide what it opens on: a rider's map, a driver's screen or an administrator's console. It runs on phones, as a desktop app, and hosted by its own server in a browser.

  • App: sign-in (authorization code + PKCE against the built-in authorization server), phone verification, rider / driver / admin modes, keyless vector maps with routing and proxied place search, wallet and receipts, driver onboarding with documents, admin charts, moderation and pricing, light and dark themes, five languages including RTL, analytics after consent.
  • Server: ORM entities behind repositories, @Transactional services, Flyway-style migrations (per-engine variants where the SQL differs), matching, a ride state machine that settles races in the database, simulated or Stripe payments, a WebSocket live channel.
  • Initializr: offered as a template, kept in step with the sample by scripts/sync-initializr-wayline.py (CI fails on drift). The grub and tweet templates are removed.
  • Developer guide: two chapters, "A ride-hailing app from three sides" and "Building on the sample", covering the structure, moving to PostgreSQL / MySQL and hosting, adding a migration, an external OIDC provider, real SMS, analytics, payments and maps.

Framework changes the sample needed or uncovered

  • cn1:backend-webapp and the Gradle backendWebApp task: build the app for the browser and let the server host it.
  • Shared-contract modules in an app reactor; ResponseStatusException; ConcurrencyFailureException for write conflicts and deadlocks (MariaDB's snapshot isolation reports error 1020 where other engines change no row).
  • Build-time weaving no longer exposes private types in generated code.
  • ParparVM: a receiver that escapes is no longer retired at frame exit (new FrameRetireLiveReceiverIntegrationTest).
  • Vector maps: tile queue with stand-ins and pruning, label collision grid, halos, road hierarchy in light and dark, kinetic pan, zoom about the cursor.
  • JavaScript port: geolocation no longer blocks the EDT waiting for a position that never arrives; asynchronous XHR; coalesced accessibility refresh; released text layers.
  • JavaSE test runner retires each test's threads and listeners; a test process killed by the OS is reported as such instead of "Tests failed".
  • GridLayout preferred height counts implicit rows; GeneralPath grows geometrically; JavaSE mixed-font width uses advances.

Testing

Run locally on the merged tree:

  • Server: 65 tests on the JVM and as a native binary (SQLite). Before the merge, also on PostgreSQL 16 and MySQL 8.4 (JVM and native), MariaDB 10.11 (JVM) and MariaDB 11.8 (JVM and native).
  • Simulator end-to-end: 11/11 on the phone layout and 11/11 on the desktop layout, against screenshots in scripts/wayline/screenshots.
  • Hosted browser app: run-web-e2e.sh in headless Chromium.
  • Initializr: 7/7 tests, template parity, and a generated project that builds and passes its server tests.
  • Before the merge: core unit tests (7,715), build-engine (2,452), Maven plugin (440), Gradle plugin (35), JavaSE port (489), backend (935), with SpotBugs at zero in each and the repository gates passing; the translator suite with the GC verifier clean on the new test.

Not verified:

  • .github/workflows/wayline.yml has never run on GitHub.
  • No Android or iOS device run; map and JavaScript-port screenshot baselines of other suites may need reseeding.
  • Desktop map panning in the browser is not faster than before (tile rasterization on the EDT); zoom is.
  • The external-OIDC section of the guide is design guidance that has not been built end to end.
  • Analytics reaches the cloud console only from a device build.

🤖 Generated with Claude Code

shai-almog and others added 2 commits October 10, 2026 10:11
…emplate

scripts/wayline is one Maven project in one language: a Codename One app
styled with CSS, and a Codename One Backend server. The role the server
gives an account decides what it opens on: a rider's map, a driver's
screen or an administrator's console, on a phone, on the desktop and
hosted by the server itself in a browser.

The server keeps its data in ORM entities behind repositories, with
transactional services and Flyway-style migrations, and runs on SQLite,
PostgreSQL, MySQL and MariaDB. It has sign-in through the built-in
authorization server, phone verification, driver applications, matching,
payments (simulated or Stripe), statistics and a live WebSocket channel.
The app reports usage to Codename One analytics after consent.

Tested like hellocodenameone: server tests on the JVM and as a native
binary, simulator end-to-end tests with screenshots on phone and desktop,
a headless-browser check of the hosted app, and a generated-project check
(.github/workflows/wayline.yml). The Initializr offers it as a template,
kept in step by scripts/sync-initializr-wayline.py, and the developer
guide gains a user's and an implementor's chapter.

Framework changes the sample needed or uncovered:

- cn1:backend-webapp and the Gradle backendWebApp task build the app for
  the browser and let the server host it.
- Shared-module contracts in an app reactor; ResponseStatusException;
  ConcurrencyFailureException for write conflicts and deadlocks, which
  MariaDB's snapshot isolation reports where other engines change no row.
- Build-time weaving no longer exposes private types in generated code.
- ParparVM: a receiver that escapes is no longer retired at frame exit.
- Vector maps: tile queue with stand-ins, label collision grid, halos,
  road hierarchy, kinetic pan, zoom about the cursor.
- JavaScript port: geolocation no longer blocks the EDT waiting for a
  position that never arrives; asynchronous XHR; coalesced accessibility
  refresh; released text layers.
- JavaSE test runner retires each test's threads and listeners, and a
  killed test process is reported as such.
- GridLayout preferred height counts implicit rows; GeneralPath grows
  geometrically; JavaSE mixed-font width uses advances.

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

shai-almog commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@github-actions

github-actions Bot commented Oct 10, 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)

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-13T12:50:29.620448Z 3d3119e Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6794d2d704

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread CodenameOne/src/com/codename1/maps/MapView.java
Comment thread CodenameOne/src/com/codename1/maps/vector/VectorMapEngine.java
@shai-almog

shai-almog commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

@shai-almog

shai-almog commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 170 screenshots: 170 matched.

Native Android coverage

  • 📊 Line coverage: 16.01% (26002/162390 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 14.37% (122147/850229), branch 9.91% (8466/85441), complexity 7.81% (6525/83503), method 11.59% (4648/40094), class 19.78% (960/4853)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 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/625 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)
      • com.codename1.androidcompat.androidx.constraintlayout.core.widgets.com.codename1.androidcompat.androidx.constraintlayout.core.widgets.Flow – 0.00% (0/576 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 16.01% (26002/162390 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 14.37% (122147/850229), branch 9.91% (8466/85441), complexity 7.81% (6525/83503), method 11.59% (4648/40094), class 19.78% (960/4853)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 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/625 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)
      • com.codename1.androidcompat.androidx.constraintlayout.core.widgets.com.codename1.androidcompat.androidx.constraintlayout.core.widgets.Flow – 0.00% (0/576 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 223ms / native 47ms = 4.7x speedup
SIMD float-mul (64K x300) java 124ms / native 94ms = 1.3x 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 70.000 ms
Base64 CN1 decode 68.000 ms
Base64 native encode 340.000 ms
Base64 encode ratio (CN1/native) 0.206x (79.4% faster)
Base64 native decode 237.000 ms
Base64 decode ratio (CN1/native) 0.287x (71.3% faster)
Image encode benchmark status skipped (SIMD unsupported)

@github-actions

github-actions Bot commented Oct 10, 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)
    • ✅ core-unittests: 0 findings (no issues)
    • ✅ ios: 0 findings (no issues)
    • ✅ javac: 0 findings (no issues)
    • ✅ project-model: 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

shai-almog commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 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 47ms / native 3ms = 15.6x speedup
SIMD float-mul (64K x300) java 45ms / native 3ms = 15.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 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) 11.000 ms
Image createMask (SIMD on) 5.000 ms
Image createMask ratio (SIMD on/off) 0.455x (54.5% faster)
Image applyMask (SIMD off) 39.000 ms
Image applyMask (SIMD on) 41.000 ms
Image applyMask ratio (SIMD on/off) 1.051x (5.1% slower)
Image modifyAlpha (SIMD off) 31.000 ms
Image modifyAlpha (SIMD on) 20.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.645x (35.5% faster)
Image modifyAlpha removeColor (SIMD off) 18.000 ms
Image modifyAlpha removeColor (SIMD on) 14.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.778x (22.2% 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)

1 performance regression:

  • hello (WinHelloMain) on all 4 CPUs: RAM 1.22x against a 0.77x baseline (+58.8%, 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 15% (time) / 15% (RAM) away from its baseline in vm/selfhost/perf-baseline/ fails: above it is a regression, below it an improvement that has to be rebaselined (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.33x (base 1.38x, -3.3%) 1.22x (base 0.77x, +58.8%) REGRESSION (RAM +58.8%)
translator (self) 4 0.79x (base 0.78x, +1.8%) 0.55x (base 0.55x, +0.4%) ok
intArithmetic 4 1.10x (base 1.10x, +0.4%) 0.05x (base 0.06x, -3.2%) ok
longArithmetic 4 1.08x (base 1.08x, +0.1%) 0.05x (base 0.06x, -1.1%) ok
mathTranscendental 4 0.85x (base 0.85x, +0.5%) 0.06x (base 0.06x, -1.9%) ok
arraySequential 4 1.83x (base 1.72x, +6.5%) 0.38x (base 0.38x, +0.2%) ok
arrayRandom 4 1.03x (base 1.01x, +1.8%) 0.23x (base 0.23x, -0.1%) ok
objectAllocation 4 1.27x (base 1.25x, +1.4%) 0.29x (base 0.29x, -2.8%) ok
valueEscape 4 0.10x (base 0.10x, -1.4%) 0.04x (base 0.04x, -0.9%) ok
hashMapChurn 4 1.43x (base 1.39x, +2.6%) 0.09x (base 0.10x, -3.9%) ok
stringBuilding 4 1.39x (base 1.36x, +2.4%) 0.27x (base 0.28x, -4.1%) ok
recursion 4 1.38x (base 1.43x, -3.4%) 0.06x (base 0.06x, +0.3%) ok
quicksort 4 1.11x (base 1.11x, -0.6%) 0.12x (base 0.12x, -0.7%) ok

A change that moves performance ON PURPOSE records the new baseline in vm/selfhost/perf-baseline/pr/5984.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 5984 --reason "<why these benchmarks moved>" perf-results.json

Result: performance regression

Gradle: a project in Java and Kotlin failed in compileJava with two copies
of one generated mapper. Kotlin's pass compiles the Java it has not seen
yet only to resolve types, and that output was read as a dependency's, so a
@mapped Java class was mapped by both passes. AnnotationProcessing now takes
the class directories that are the module's own and offers nothing out of
them.

wayline.yml: the simulator job runs in the pr-ci-container image and the
workflow could not pull it without packages: read.

Sample server:
- A refund is refused while a tip on the ride is still being charged, so a
  tip can no longer land on a ride that was refunded without it.
- A ride left completed with its payment pending is settled by a scheduled
  pass; settling is safe to repeat.
- The card limit is enforced where a card is saved, not only where a setup
  starts.
- Two registrations racing for one e-mail answer 409, not a server error.
- Changing an account's roles closes the live channel it has open.

Sample client: tokens are stored under a name made from the server's
address, and cleared when the address changes, so one server's tokens are
never sent to another.

Maps: a map removed while gliding is taken off the form that animates it,
and a failed tile is asked for again when its delay runs out, without
waiting for something else to repaint the map.

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

shai-almog commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 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 49ms / native 3ms = 16.3x speedup
SIMD float-mul (64K x300) java 49ms / native 2ms = 24.5x 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 70.000 ms
Base64 SIMD encode 78.000 ms
Base64 encode ratio (SIMD/CN1) 1.300x (30.0% slower)
Base64 SIMD decode 71.000 ms
Base64 decode ratio (SIMD/CN1) 1.014x (1.4% 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) 20.000 ms
Image applyMask (SIMD on) 19.000 ms
Image applyMask ratio (SIMD on/off) 0.950x (5.0% faster)
Image modifyAlpha (SIMD off) 18.000 ms
Image modifyAlpha (SIMD on) 13.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.722x (27.8% faster)
Image modifyAlpha removeColor (SIMD off) 20.000 ms
Image modifyAlpha removeColor (SIMD on) 14.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.700x (30.0% 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 15% (time) / 15% (RAM) away from its baseline in vm/selfhost/perf-baseline/ fails: above it is a regression, below it an improvement that has to be rebaselined (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 0.99x (base 1.11x, -10.5%) 1.27x (base 1.28x, -0.3%) ok
translator (self) 4 0.85x (base 0.84x, +1.2%) 0.52x (base 0.51x, +3.2%) ok
intArithmetic 4 1.04x (base 1.04x, -0.0%) 0.06x (base 0.06x, +1.2%) ok
longArithmetic 4 0.79x (base 0.80x, -0.2%) 0.06x (base 0.06x, +1.5%) ok
mathTranscendental 4 0.73x (base 0.72x, +1.4%) 0.06x (base 0.06x, +0.2%) ok
arraySequential 4 0.42x (base 0.46x, -7.5%) 0.39x (base 0.39x, -0.1%) ok
arrayRandom 4 0.94x (base 0.94x, +0.0%) 0.23x (base 0.23x, +0.0%) ok
objectAllocation 4 1.76x (base 2.81x, -37.2%) 0.42x (base 0.43x, -2.9%) ok
valueEscape 4 0.76x (base 0.76x, +0.0%) 0.05x (base 0.05x, -0.0%) ok
hashMapChurn 4 0.97x (base 0.98x, -1.1%) 0.12x (base 0.12x, -0.0%) ok
stringBuilding 4 1.51x (base 1.43x, +6.0%) 0.27x (base 0.27x, +0.1%) ok
recursion 4 1.47x (base 1.46x, +0.3%) 0.06x (base 0.07x, -0.4%) ok
quicksort 4 1.01x (base 1.00x, +0.5%) 0.12x (base 0.12x, -0.2%) ok

Result: no regression

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

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

✅ ByteCodeTranslator Quality Report

Test & Coverage

  • ✅ Tests: 826 total, 0 failed, 57 skipped

Benchmark Results

  • Execution Time: 7753 ms

  • Hotspots (Top 20 sampled methods):

    • 13.17% java.lang.Object.hashCode (159 samples)
    • 10.69% com.codename1.tools.translator.IteratorEscape.mangle (129 samples)
    • 6.21% com.codename1.tools.translator.BytecodeMethod.equals (75 samples)
    • 5.72% java.lang.System.identityHashCode (69 samples)
    • 4.39% java.util.ArrayList.indexOf (53 samples)
    • 3.23% com.codename1.tools.translator.classfile.analysis.Frame.execute (39 samples)
    • 2.49% com.codename1.tools.translator.IteratorEscape.ctorOnlyStoresParamsIntoThis (30 samples)
    • 2.40% com.codename1.tools.translator.bytecodes.Invoke.findMethodUp (29 samples)
    • 1.99% com.codename1.tools.translator.BytecodeMethod.updateInlinableFieldDependencies (24 samples)
    • 1.66% java.util.AbstractCollection.containsAll (20 samples)
    • 1.41% com.codename1.tools.translator.DeadFieldElimination.run (17 samples)
    • 1.41% java.lang.StringBuilder.append (17 samples)
    • 1.33% com.codename1.tools.translator.Parser.cullMethods (16 samples)
    • 1.33% java.lang.String.equals (16 samples)
    • 1.24% java.util.HashMap.hash (15 samples)
    • 1.16% com.codename1.tools.translator.ByteCodeClass.hasDeclaredMethod (14 samples)
    • 1.08% com.codename1.tools.translator.ByteCodeClass.markDependencies (13 samples)
    • 0.99% com.codename1.tools.translator.ByteCodeClass.generateCCode (12 samples)
    • 0.99% com.codename1.tools.translator.NativeSymbolIndex.<init> (12 samples)
    • 0.91% java.io.FileOutputStream.writeBytes (11 samples)
  • ⚠️ Coverage report not generated.

Static Analysis

  • ✅ SpotBugs: no findings (report was not generated by the build).
  • ⚠️ PMD report not generated.
  • ⚠️ Checkstyle report not generated.

Generated automatically by the PR CI workflow.

shai-almog and others added 3 commits October 10, 2026 21:58
The vector map engine draws differently on this branch, so the four map
screenshots are reseeded from this branch's CI captures.

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

The JavaScript port on this branch brings the ARIA overlay up to date after
the screen goes quiet rather than on every change, so a bounds read 150ms
after a wheel event could still describe the list part way through the
scroll, and the click then selected a different sample.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…S 27 map baselines

build-ios-app.sh checked that MAVEN_HOME holds a Maven and then ran ./mvnw
regardless, so the Wayline iOS job failed with 'No such file or directory'.
It now uses the application's wrapper where there is one and that Maven
otherwise, as build-android-app.sh does.

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

shai-almog commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 163 screenshots: 163 matched.
✅ Native Apple TV (tvOS, Metal) screenshot tests passed.

shai-almog and others added 3 commits October 11, 2026 07:51
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ed the macOS map baselines

A name that follows a bend is drawn a straight stretch at a time. The
stretches were laid out by each letter's width measured on its own, which
a font with kerning sets wider than the same letters drawn together, so
on iOS and Mac Catalyst a name read "Bro adway" where the road turned.

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

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e18980f1b5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@shai-almog

shai-almog commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 matched.
Native Windows port, REAL shipping pipeline: the hellocodenameone screenshot suite rendered by a binary CROSS-COMPILED on Linux (clang-cl + xwin, WebView2 linked) and RUN on a Windows x64 runner. 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 76ms / native 5ms = 15.2x speedup
SIMD float-mul (64K x300) java 67ms / native 6ms = 11.1x 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 72.000 ms
Base64 CN1 decode 89.000 ms
Base64 SIMD encode 108.000 ms
Base64 encode ratio (SIMD/CN1) 1.500x (50.0% slower)
Base64 SIMD decode 107.000 ms
Base64 decode ratio (SIMD/CN1) 1.202x (20.2% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 10.000 ms
Image createMask (SIMD on) 5.000 ms
Image createMask ratio (SIMD on/off) 0.500x (50.0% faster)
Image applyMask (SIMD off) 24.000 ms
Image applyMask (SIMD on) 24.000 ms
Image applyMask ratio (SIMD on/off) 1.000x (0.0% slower)
Image modifyAlpha (SIMD off) 32.000 ms
Image modifyAlpha (SIMD on) 22.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.688x (31.3% faster)
Image modifyAlpha removeColor (SIMD off) 29.000 ms
Image modifyAlpha removeColor (SIMD on) 17.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.586x (41.4% faster)

@shai-almog

shai-almog commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 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 7763 64-Core Processor (baseline linux-x64@amd-epyc-7763-64-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 15% (time) / 15% (RAM) away from its baseline in vm/selfhost/perf-baseline/ fails: above it is a regression, below it an improvement that has to be rebaselined (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.84x (base 0.85x, -0.9%) 1.09x (base 1.02x, +7.0%) ok
translator (self) 4 0.51x (base 0.63x, -19.0%) 0.52x (base 0.52x, -0.8%) ok
intArithmetic 4 1.13x (base 1.12x, +0.8%) 0.06x (base 0.06x, +0.1%) ok
longArithmetic 4 1.08x (base 1.08x, +0.0%) 0.06x (base 0.05x, +2.5%) ok
mathTranscendental 4 1.08x (base 1.08x, -0.1%) 0.08x (base 0.07x, +3.2%) ok
arraySequential 4 2.12x (base 2.00x, +5.9%) 0.36x (base 0.36x, -0.1%) ok
arrayRandom 4 0.97x (base 0.91x, +7.1%) 0.23x (base 0.21x, +9.4%) ok
objectAllocation 4 1.63x (base 1.65x, -1.0%) 0.27x (base 0.37x, -27.5%) ok
valueEscape 4 0.10x (base 0.10x, -0.4%) 0.04x (base 0.04x, +1.3%) ok
hashMapChurn 4 1.50x (base 1.48x, +1.0%) 0.10x (base 0.09x, +4.1%) ok
stringBuilding 4 1.41x (base 1.39x, +1.6%) 0.26x (base 0.26x, +0.2%) ok
recursion 4 1.38x (base 1.25x, +10.3%) 0.08x (base 0.08x, -0.5%) ok
quicksort 4 1.09x (base 1.07x, +1.5%) 0.12x (base 0.11x, +8.1%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 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)

1 performance regression:

  • hello (LinuxHelloMain) on all 4 CPUs: RAM 1.01x against a 0.87x baseline (+16.8%, tolerance 15%)

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 15% (time) / 15% (RAM) away from its baseline in vm/selfhost/perf-baseline/ fails: above it is a regression, below it an improvement that has to be rebaselined (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.94x (base 0.93x, +1.1%) 1.01x (base 0.87x, +16.8%) REGRESSION (RAM +16.8%)
translator (self) 4 0.74x (base 0.70x, +6.1%) 0.49x (base 0.45x, +9.8%) ok
intArithmetic 4 1.05x (base 1.04x, +0.0%) 0.03x (base 0.03x, -2.7%) ok
longArithmetic 4 0.79x (base 0.79x, -0.1%) 0.03x (base 0.03x, -0.6%) ok
mathTranscendental 4 1.10x (base 1.10x, +0.0%) 0.03x (base 0.03x, +2.2%) ok
arraySequential 4 0.35x (base 0.36x, -4.2%) 0.37x (base 0.37x, +0.2%) ok
arrayRandom 4 0.93x (base 0.94x, -0.3%) 0.20x (base 0.20x, -0.5%) ok
objectAllocation 4 1.96x (base 1.77x, +10.8%) 0.36x (base 0.38x, -3.6%) ok
valueEscape 4 0.51x (base 0.51x, -0.1%) 0.03x (base 0.03x, +3.0%) ok
hashMapChurn 4 0.83x (base 0.84x, -1.6%) 0.12x (base 0.12x, -4.4%) ok
stringBuilding 4 1.38x (base 1.36x, +1.1%) 0.26x (base 0.26x, -0.5%) ok
recursion 4 1.56x (base 1.43x, +8.5%) 0.03x (base 0.04x, -3.0%) ok
quicksort 4 0.99x (base 0.99x, +0.0%) 0.09x (base 0.09x, +0.2%) ok

A change that moves performance ON PURPOSE records the new baseline in vm/selfhost/perf-baseline/pr/5984.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 5984 --reason "<why these benchmarks moved>" perf-results.json

Result: performance regression

shai-almog and others added 2 commits October 11, 2026 09:31
- A charge that fails without the processor saying whether it took the
  money leaves the ride pending and is asked for again under the same key;
  only a refused card is a failed payment. The same for a tip, which stays
  on the ride and can be sent again with the same amount.
- A rider's two requests and two rides choosing one driver now take turns
  on the rider's and the driver's row, so neither ends in two rides.
- The limit on guesses at a phone code is applied by the statement that
  counts the guess.
- The driver role is not withdrawn from a driver who is on a ride.
- A reconnect timer left over from before the live channel was restarted
  no longer opens a second connection.

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

The template check built the generated app with no display, and the theme
compiler opens a window; it now takes a virtual display from xvfb-run on a
Linux machine without one, as server.sh does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
shai-almog and others added 3 commits October 11, 2026 17:01
# Conflicts:
#	scripts/initializr/common/src/test/java/com/codename1/initializr/model/GeneratorModelMatrixTest.java
# Conflicts:
#	maven/codenameone-maven-plugin/src/main/java/com/codename1/maven/BackendPackageMojo.java
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

Benchmark Results

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

Build and Run Timing

Metric Duration
Simulator Boot 2000 ms
Simulator Boot (Run) 1000 ms
App Install 14000 ms
App Launch 3000 ms
Test Execution 409000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 101ms / native 3ms = 33.6x speedup
SIMD float-mul (64K x300) java 132ms / native 5ms = 26.4x 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 105.000 ms
Base64 CN1 decode 114.000 ms
Base64 native encode 1689.000 ms
Base64 encode ratio (CN1/native) 0.062x (93.8% faster)
Base64 native decode 1002.000 ms
Base64 decode ratio (CN1/native) 0.114x (88.6% faster)
Base64 SIMD encode 115.000 ms
Base64 encode ratio (SIMD/CN1) 1.095x (9.5% slower)
Base64 SIMD decode 52.000 ms
Base64 decode ratio (SIMD/CN1) 0.456x (54.4% faster)
Base64 encode ratio (SIMD/native) 0.068x (93.2% faster)
Base64 decode ratio (SIMD/native) 0.052x (94.8% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 6.000 ms
Image createMask (SIMD on) 1.000 ms
Image createMask ratio (SIMD on/off) 0.167x (83.3% faster)
Image applyMask (SIMD off) 45.000 ms
Image applyMask (SIMD on) 26.000 ms
Image applyMask ratio (SIMD on/off) 0.578x (42.2% faster)
Image modifyAlpha (SIMD off) 48.000 ms
Image modifyAlpha (SIMD on) 22.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.458x (54.2% faster)
Image modifyAlpha removeColor (SIMD off) 35.000 ms
Image modifyAlpha removeColor (SIMD on) 40.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 1.143x (14.3% slower)

@shai-almog

shai-almog commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

Benchmark Results

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

Build and Run Timing

Metric Duration
Simulator Boot 86000 ms
Simulator Boot (Run) 1000 ms
App Install 17000 ms
App Launch 1000 ms
Test Execution 426000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 77ms / native 4ms = 19.2x speedup
SIMD float-mul (64K x300) java 88ms / native 5ms = 17.6x 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 63.000 ms
Base64 CN1 decode 60.000 ms
Base64 native encode 736.000 ms
Base64 encode ratio (CN1/native) 0.086x (91.4% faster)
Base64 native decode 570.000 ms
Base64 decode ratio (CN1/native) 0.105x (89.5% faster)
Base64 SIMD encode 54.000 ms
Base64 encode ratio (SIMD/CN1) 0.857x (14.3% faster)
Base64 SIMD decode 61.000 ms
Base64 decode ratio (SIMD/CN1) 1.017x (1.7% slower)
Base64 encode ratio (SIMD/native) 0.073x (92.7% faster)
Base64 decode ratio (SIMD/native) 0.107x (89.3% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 10.000 ms
Image createMask (SIMD on) 15.000 ms
Image createMask ratio (SIMD on/off) 1.500x (50.0% slower)
Image applyMask (SIMD off) 93.000 ms
Image applyMask (SIMD on) 101.000 ms
Image applyMask ratio (SIMD on/off) 1.086x (8.6% slower)
Image modifyAlpha (SIMD off) 167.000 ms
Image modifyAlpha (SIMD on) 146.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.874x (12.6% faster)
Image modifyAlpha removeColor (SIMD off) 82.000 ms
Image modifyAlpha removeColor (SIMD on) 46.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.561x (43.9% faster)

@shai-almog

shai-almog commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

Benchmark Results

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

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 56ms / native 3ms = 18.6x speedup
SIMD float-mul (64K x300) java 60ms / native 3ms = 20.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 active (NEON-accelerated)
Base64 CN1 encode 48.000 ms
Base64 CN1 decode 55.000 ms
Image encode benchmark iterations 100
Image createMask (SIMD off) 7.000 ms
Image createMask (SIMD on) 4.000 ms
Image createMask ratio (SIMD on/off) 0.571x (42.9% faster)
Image applyMask (SIMD off) 62.000 ms
Image applyMask (SIMD on) 53.000 ms
Image applyMask ratio (SIMD on/off) 0.855x (14.5% faster)
Image modifyAlpha (SIMD off) 47.000 ms
Image modifyAlpha (SIMD on) 59.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.255x (25.5% slower)
Image modifyAlpha removeColor (SIMD off) 59.000 ms
Image modifyAlpha removeColor (SIMD on) 44.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.746x (25.4% faster)

ParparVM vs HotSpot (JDK 25): macOS arm64

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

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 15% (time) / 15% (RAM) away from its baseline in vm/selfhost/perf-baseline/ fails: above it is a regression, below it an improvement that has to be rebaselined (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%) 1.31x (base 1.34x, -2.6%) ok
translator (self) 3 0.62x (base 0.62x, -0.3%) 0.62x (base 0.57x, +9.4%) ok
intArithmetic 3 1.04x (base 1.03x, +0.9%) 0.12x (base 0.12x, +1.4%) ok
longArithmetic 3 1.00x (base 1.03x, -2.8%) 0.11x (base 0.07x, +63.8%) ok
mathTranscendental 3 1.01x (base 1.01x, -0.0%) 0.12x (base 0.12x, -0.2%) ok
arraySequential 3 0.46x (base 0.42x, +8.6%) 0.53x (base 0.53x, +0.3%) ok
arrayRandom 3 0.96x (base 0.99x, -2.8%) 0.33x (base 0.32x, +0.3%) ok
objectAllocation 3 1.02x (base 1.11x, -7.7%) 0.72x (base 0.81x, -11.5%) ok
valueEscape 3 0.50x (base 0.51x, -2.1%) 0.09x (base 0.09x, -0.9%) ok
hashMapChurn 3 1.02x (base 1.18x, -13.3%) 0.07x (base 0.07x, +10.9%) ok
stringBuilding 3 0.93x (base 0.84x, +10.7%) 0.46x (base 0.46x, -0.7%) ok
recursion 3 1.27x (base 1.24x, +2.6%) 0.12x (base 0.12x, -0.2%) ok
quicksort 3 0.99x (base 1.01x, -1.7%) 0.11x (base 0.11x, +1.3%) ok

Result: no regression

shai-almog and others added 2 commits October 12, 2026 08:57
@shai-almog

shai-almog commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

Benchmark Results

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

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 52ms / native 2ms = 26.0x speedup
SIMD float-mul (64K x300) java 65ms / native 2ms = 32.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 60.000 ms
Base64 CN1 decode 57.000 ms
Base64 native encode 688.000 ms
Base64 encode ratio (CN1/native) 0.087x (91.3% faster)
Base64 native decode 295.000 ms
Base64 decode ratio (CN1/native) 0.193x (80.7% faster)
Base64 SIMD encode 56.000 ms
Base64 encode ratio (SIMD/CN1) 0.933x (6.7% faster)
Base64 SIMD decode 46.000 ms
Base64 decode ratio (SIMD/CN1) 0.807x (19.3% faster)
Base64 encode ratio (SIMD/native) 0.081x (91.9% faster)
Base64 decode ratio (SIMD/native) 0.156x (84.4% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 7.000 ms
Image createMask (SIMD on) 10.000 ms
Image createMask ratio (SIMD on/off) 1.429x (42.9% slower)
Image applyMask (SIMD off) 52.000 ms
Image applyMask (SIMD on) 62.000 ms
Image applyMask ratio (SIMD on/off) 1.192x (19.2% slower)
Image modifyAlpha (SIMD off) 86.000 ms
Image modifyAlpha (SIMD on) 51.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.593x (40.7% faster)
Image modifyAlpha removeColor (SIMD off) 73.000 ms
Image modifyAlpha removeColor (SIMD on) 74.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 1.014x (1.4% slower)

shai-almog and others added 2 commits October 12, 2026 21:41
# Conflicts:
#	scripts/initializr/common/src/main/resources/common.zip
The CSS compiler no longer opens a window, so the virtual display the
template check, server.sh and the web job arranged for it goes, along with
the designer jar the simulator's pom passed along.

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

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1dc66ed703

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

shai-almog and others added 2 commits October 13, 2026 08:01
…ore review fixes

- A refund the server claimed and never recorded is asked for again; the
  processor's refund is keyed by the charge, so a repeat is one refund.
- A closed account's e-mail is retired (hash kept), since its rides stay
  filed under it and a re-registration would inherit them.
- Role changes and blocks hold both profiles and re-read the acting
  admin, so two admins cannot remove each other at once.
- A failed SMS send discards only its own code.
- Closing an account asks for the password again.
- /api/geo is rate limited.
- Recent destinations belong to the account that chose them.
- The location listener is removed when the last watcher leaves.

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

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 92cdab1910

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/build-engine/src/main/java/com/codename1/maven/BackendWebApp.java Outdated
shai-almog and others added 3 commits October 13, 2026 12:57
… nine more review fixes

- Closing an account, removing a card, choosing the default card, keeping
  a first payment customer and sending a phone code hold the profile row,
  so each takes turns with a ride being asked for and with itself.
- A guess at a phone code is claimed against the hash that was read.
- A driver's status report holds the driver's row before reading it.
- A card tip counts toward the balance once its charge is recorded.
- A ride gives the rider's and the driver's usernames only to their
  owners and to an admin.
- The app ignores profile answers that arrive after the session changed.
- The staged web root is withheld only when the active profile, not any
  profile file, declares cn1.webapp.root.

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

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

if (result.labels != null) {
labels.put(key, result.labels);
}

P2 Badge Evict label data together with rendered tiles

When a vector tile is loaded, its label candidates are inserted into the unbounded labels map, while only the corresponding image is kept in the 256-entry rendered LRU. Panning across new regions therefore evicts rasterized tiles but retains every label list ever seen (including overzoom label sets), so a long map session continually grows memory and can eventually exhaust a mobile heap. Bound this data or remove its keys whenever the associated rendered tile or decoded parent is evicted.


try {
console.log("LF-SHIM:set-ok key=" + nk + " valType=" + valCtor
+ " serLen=" + (serialised == null ? "null" : serialised.length)
+ " serPrefix=" + (serialised == null ? "null" : serialised.substring(0, Math.min(60, serialised.length))));
} catch (_l) {}

P2 Badge Stop logging prefixes of stored browser values

Every JavaScript-port storage write prints the first 60 characters of the serialized value, and the read path prints another prefix. Storage.writeObject() values reach this shim as byte arrays, so this base64 text is a reversible prefix of the original serialization; short stored strings can be exposed in full, and longer sensitive values such as the plain-fallback OIDC token document are partially disclosed in browser-console or captured diagnostic logs. Remove the value prefixes and log only non-sensitive metadata such as the key and length.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +241 to +243
Long cents = session.createQuery("select coalesce(sum(r.fareCents), 0) from Ride r "
+ "where r.driver = :driver and r.state = :completed "
+ "and r.paymentStatus = :paid and r.updatedAt >= :since", Long.class)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Calculate dashboard earnings from the driver's share

For every paid ride with a nonzero commission, this query reports the rider's gross fareCents as the driver's Today/Week earnings in DriverForm, while the detailed earnings screen and cash-out balance use driverCents. The main driver dashboard therefore displays more money than the driver actually earned or can withdraw; sum the driver's share, plus only any settled tip if that endpoint is intended to include tips.

Useful? React with 👍 / 👎.

for (int iter = 0; iter < rides.size(); iter++) {
Ride ride = rides.get(iter);
long at = ride.updatedAt;
long earned = ride.driverCents + ride.tipCents;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Exclude unsettled tips from period earnings

When a tip charge ends with an ambiguous IOException, the ride deliberately retains tipCents while no Payment.tipRef exists. Although the current PayoutRepository.tips() fix excludes that amount from tips and the cash-out balance, this loop still adds it to Today, Week, Month, and the daily chart, so the detailed earnings screen claims the driver earned money that may never have been charged. Apply the same settled-card-tip predicate here while continuing to include cash tips.

Useful? React with 👍 / 👎.

Comment on lines +882 to +883
if (retryPending) {
return;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reschedule retries when an earlier tile deadline appears

When a timer is already pending for a repeatedly failing tile with a long backoff, a newly failed visible tile reaches this return even though its first retry is due sooner. The sole timer may be waiting for up to 60 seconds, so the new hole ignores its configured 2-second retry until that unrelated deadline fires. Track the scheduled deadline and replace or supplement the timer whenever wait is earlier.

Useful? React with 👍 / 👎.

Comment on lines +39 to +41
# What the hosted web app runs on: the browser side of the JavaScript
# port, which no test here reached before the `web` job.
- 'Ports/JavaScriptPort/src/main/webapp/**'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Trigger the hosted-web job for JavaScript port sources

In the inspected wayline.yml pull-request filter, only Ports/JavaScriptPort/src/main/webapp/** triggers this workflow, even though the hosted app also compiles and runs src/main/java implementations such as NetworkConnection and HTML5Implementation. A future PR changing those classes will therefore skip Wayline's only full hosted-app sign-in test despite the workflow comment saying this path covers the browser side; include the Java source tree, or the whole JavaScript port, in this filter.

Useful? React with 👍 / 👎.

Comment on lines +85 to +87
int month = (text.charAt(5) - '0') * 10 + (text.charAt(6) - '0');
int day = (text.charAt(8) - '0') * 10 + (text.charAt(9) - '0');
return month >= 1 && month <= 12 && day >= 1 && day <= 31;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Validate the day against its actual month

For any driver application date whose day is 29–31, this check accepts it solely because the day is at most 31, even when that date cannot exist, such as 2026-02-31 or 2025-04-31. Applications.date() relies on this method for both date of birth and licence expiry and then compares the strings without parsing them, so invalid identity and licence dates can be submitted and approved. Check month lengths and February's leap-year rule before accepting the value.

Useful? React with 👍 / 👎.

Comment on lines +136 to +138
PayoutDto paid = pay(driver);
if (takeBackIfOverdrawn(driver, paid.id)) {
throw new ResponseStatusException(409, "There is nothing to cash out");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Serialize concurrent cash-outs before writing the ledger

When two cash-out requests for one driver both commit their payout rows before either reaches this check, both see the shared balance as overdrawn and each deletes its own row. Both requests then return 409 and no payout remains even though the original positive balance is still present, contradicting the intended behavior that only one request is taken back. Serialize the operation on a stable per-driver row, or atomically claim the available balance before creating the payout.

Useful? React with 👍 / 👎.

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