A behavior specification for your application, enforced on every change.

This pull request adds paid bookings through the mock payment app. Ripplo added three workflows for the new behavior and updated the event-type workflow for the new price field. Requiring payment on an event type and confirming a pending booking both pass. Ripplo found one regression, one visual finding, and one bug on a new workflow:
What broke: Hosts cannot cancel unpaid bookings. Clicking "Cancel event" fails with a server error (500) and the booking stays "accepted". Cancelling works on main.
Likely root cause: a backend bug in this pull request's cancel path. Cancelling now refunds the payment first, and that refund step in handleCancelBooking.ts assumes a payment exists — free bookings have none, which causes the crash.
What broke: Hosts cannot read a long attendee email on the booking details card — anything past about 40 characters is cut off at the card's edge. This predates the pull request, it exists on main too.
Likely root cause: a UI bug in the booking details card. The email line in the "Who" section never wraps and the card hides anything past its edge, which clips the text.
Complete your booking: aggredior between tenus and asporto on June 12, 2035
Need to make a change? Reschedule or Cancel
What broke: Paying from a booking's payment link charges the card, but the booking page stays on "Your meeting is awaiting payment" and the host never sees the booking confirmed.
Likely root cause: the payment link marks the charge captured but never writes the booking back to accepted, so the page keeps polling a booking that stays pending.
Create your own booking link with Cal.diy
Frontends lie. Ripplo checks your UI interactions against backend state mutations to make sure your application does what you think it does with no unintended side effects.
Your agent writes the workflow specification. Ripplo compiles each one into a covering set of deterministic tests — no waits, no retries, no flakes — that run on every change.
Ripplo chains your workflows together in the background, running sequences no one wrote a test for, and surfaces the bugs that only appear several workflows deep — each with a replayable repro.
Frontends lie. Ripplo checks your UI interactions against backend state mutations to make sure your application does what you think it does with no unintended side effects.
Your agent writes the workflow specification. Ripplo compiles each one into a covering set of deterministic tests — no waits, no retries, no flakes — that run on every change.
Ripplo chains your workflows together in the background, running sequences no one wrote a test for, and surfaces the bugs that only appear several workflows deep — each with a replayable repro.
Ripplo renders the screens a user will land on and the records that change behind them, captured from the branch. A reviewer sees the effect before reading the diff.
Ripplo runs your workflows against the branch end to end, from the interface a user touches to the rows it writes. Each run seeds its own data and repeats identically, so a red check means the behavior changed.
When a workflow fails, Ripplo posts the failing step with the state going into it and what the application did. You can reproduce it locally from the report.
When your UI changes, Ripplo updates the affected workflows to match and includes the edits in its report. You review them alongside the code.
When you open a pull request, Ripplo attaches a verifiable run that proves the change works. Reviewers see evidence.
mainfromfeat/saved-cartsThis pull request adds recurring availability across the booking flow. Existing booking, availability, and reschedule journeys pass their covered paths, and Ripplo declared gaps where the required data cannot be created. Ripplo found no issues.
What broke: Hosts cannot cancel unpaid bookings. Clicking "Cancel event" fails with a server error (500) and the booking stays "accepted". Cancelling works on main.
Likely root cause: a backend bug in this pull request's cancel path. Cancelling now refunds the payment first, and that refund step in handleCancelBooking.ts assumes a payment exists — free bookings have none, which causes the crash.
Ripplo catches broken behavior the moment it appears. Every failure comes with the replay evidence — the click, the request, the backend state — so you're never guessing at the cause.
Ripplo catalogs your workflows and shows you the click-paths, playbacks, and backend mutations so you can understand how users interact with your application.
