Repository navigation
Wayline: a full-stack ride-hailing sample, its CI and an Initializr template - #5984
shai-almog wants to merge 47 commits into
Conversation
…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>
|
Compared 12 screenshots: 12 matched. |
|
@codex review |
|
Developer Guide build artifacts are available for download from this workflow run:
Developer Guide quality checks: |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Cloudflare Preview
|
There was a problem hiding this comment.
💡 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".
|
Compared 206 screenshots: 206 matched. |
|
Compared 170 screenshots: 170 matched. Native Android coverage
✅ Native Android screenshot tests passed. Native Android coverage
Benchmark ResultsDetailed Performance Metrics
|
✅ Continuous Quality ReportTest & Coverage
Static Analysis
Generated automatically by the PR CI workflow. |
|
Compared 185 screenshots: 185 matched. Benchmark ResultsDetailed Performance Metrics
ParparVM vs HotSpot (JDK 25): Windows x64Runner CPU: Intel64 Family 6 Model 207 Stepping 2, GenuineIntel (baseline 1 improvement past the baseline, which fails until rebaselined:
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
A change that moves performance ON PURPOSE records the new baseline in Result: improved past the baseline: rebaseline required |
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>
|
Compared 185 screenshots: 185 matched. Benchmark ResultsDetailed Performance Metrics
ParparVM vs HotSpot (JDK 25): Windows arm64Runner CPU: ARMv8 (64-bit) Family 8 Model D49 Revision 0, MICROSOFT CORPORATION (baseline 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
Result: no regression |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
✅ ByteCodeTranslator Quality ReportTest & Coverage
Benchmark Results
Static Analysis
Generated automatically by the PR CI workflow. |
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>
|
Compared 163 screenshots: 163 matched. |
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>
|
@codex review |
There was a problem hiding this comment.
💡 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".
|
Compared 185 screenshots: 185 matched. Benchmark ResultsDetailed Performance Metrics
|
|
Compared 185 screenshots: 185 matched. ParparVM vs HotSpot (JDK 25): Linux x64Runner CPU: AMD EPYC 9V45 96-Core Processor (baseline 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
Result: no regression |
|
Compared 185 screenshots: 185 matched. ParparVM vs HotSpot (JDK 25): Linux arm64Runner CPU: Neoverse-N2 (baseline 1 performance regression:
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
A change that moves performance ON PURPOSE records the new baseline in Result: performance regression |
- 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>
…one Stripe customer per account The lock, file, stack-overflow, uncaught-exception and float-formatting tests ran once per JDK although none depends on which javac compiled them; they now run on the oldest and the newest. The job's limit goes from 120 to 150 minutes: passing runs were within a slow runner's variance of the old one. Creating a Stripe customer now carries an idempotency key, so two first cards started together do not leave a second customer behind. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1c69128490
ℹ️ 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".
…eview fixes Changing a password removes the account's other grants, so a refresh token on a lost device stops working; closing an account removes them all. Saving or uploading to a driving application holds it against being handed in meanwhile. The map drops overzoomed pieces that left the view instead of drawing them all, and bounds the labels it keeps. The JavaScript port's storage shim no longer logs a prefix of what it stores. The bytecode check takes only the sibling modules the application ships, not test-scoped ones, and the stub goal deletes the stubs it no longer emits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…indows x64 translator time PMD forbids comparing references, and the piece waiting under a key is told from one it replaced by a serial number instead. The Windows x64 translator time is bimodal on its runner; its baseline is taken from two runs and now sits between the groups. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two runs of the same code sit at 0.49 and 0.52 against 0.45, either side of the 15% tolerance; the cause is the one already recorded for the hello rows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f16fb9ddfe
ℹ️ 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".
# Conflicts: # .github/workflows/parparvm-tests.yml
A past ride no longer carries its driver's current position. Closing an account deletes the rider's record at the payment processor, and neither a card nor an account can be removed while a ride's charge is still being asked about. A different account signing in on a device no longer sees or saves the last account's home, work, contact and ride options, and a half of the account's values that never arrived is fetched again rather than overwritten. Two first saves of the settings take turns. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: af8fa1e2f0
ℹ️ 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".
…erlay after #6010 A driver's balance counts only fares that were paid for. An account in the middle of a ride cannot be blocked, and a live connection opening while a block or a role change commits reads the account again once registered. #6010 rebaselined two of the rows this overlay moved, from the same values. Windows arm64 translator RAM is left to its 0.513, which covers this change's runs; Windows x64 hello RAM now chains from #6010's 0.828 to this change's two runs, 1.154. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7fd2e60f00
ℹ️ 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".
…back - Accounts.changePassword holds the profile before checking the old password, so two changes made together cannot both pass it. - Applications.approve holds the applicant's profile, as blocking does, so the rewrite of the sign-in row cannot undo a block that committed between. - A card tip counts toward the balance only while its ride is paid: a refund returns it with the fare. - The earnings screen's day/week/month totals count a fare only once paid, matching the balance; the trip still counts. - LocationManager sets the request before bindListener(), which every port reads it from (priority on iOS/Android, accuracy in the browser). - BackendWebApp.copy refuses a destination inside or around the staged app instead of copying it into itself or deleting its source. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e2d0860d58
ℹ️ 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".
- PhoneVerification keeps the code before a resend good until it would have expired: SMS order is not guaranteed and the first code can arrive last. At most two live codes; using either uses both up. - BackendWebApp.stage refuses a bundle inside the output directory, which is emptied before the bundle is read. - The Gradle backendPackage up-to-date check compares the whole staged web app (names, lengths, times), not only index.html. - The browser geolocation shim answers -1 for "no watch" and clears a watch whose id is 0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8d4c6f5d88
ℹ️ 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".
…build freshness - Accepting an offer holds the driver's profile and re-checks the account is enabled, so a block cannot land between the guard and the accept. - The SMS code kept across a resend keeps its own remaining guesses. - Saving payout details holds the profile: the first save has no row. - Production admin bootstrap treats a concurrent instance's insert as done. - backendWebApp is never up to date: its bundle is not a snapshot input. - The bytecode compliance check counts checked sibling modules' classes when deciding whether its last result still holds. - MapView wheel zoom keeps its sign; WheelEvent's doc stated the wrong wheel direction for a positive deltaY, which the ports negate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9acdd0e56c
ℹ️ 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".
- A refund Stripe answers pending (or requires_action) is recorded as REFUND_PENDING, not REFUNDED. Payments.settleRefunds asks the processor every minute until both the fare's and the tip's refunds succeed (REFUNDED) or either fails or is canceled (REFUND_FAILED, not retried). The tip's refund reference is kept in a new tip_refund_ref column. Receipts, the admin screens and the guides show both states; the simulated processor's 4000 0000 0000 7726 card refunds slowly. - A customer created at the processor while the account was being closed is deleted again instead of being kept for a missing user. - A driver's first state report and a driving application's submit hold the profile when there is no row of their own to hold yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
theme.css.checksums is the CSS CLI's incremental cache, left beside the stylesheet by a compile run by hand; it does not belong in the sample and made the Initializr template drift. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… time The first run of this branch on the Intel Family 6 Model 207 runner, which the overlay had no rows for; the reason is recorded in the overlay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What this is
scripts/waylineis 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.@Transactionalservices, 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.scripts/sync-initializr-wayline.py(CI fails on drift). The grub and tweet templates are removed.Framework changes the sample needed or uncovered
cn1:backend-webappand the GradlebackendWebApptask: build the app for the browser and let the server host it.ResponseStatusException;ConcurrencyFailureExceptionfor write conflicts and deadlocks (MariaDB's snapshot isolation reports error 1020 where other engines change no row).FrameRetireLiveReceiverIntegrationTest).GridLayoutpreferred height counts implicit rows;GeneralPathgrows geometrically; JavaSE mixed-font width uses advances.Testing
Run locally on the merged tree:
scripts/wayline/screenshots.run-web-e2e.shin headless Chromium.Not verified:
.github/workflows/wayline.ymlhas never run on GitHub.🤖 Generated with Claude Code