← All articles

5 September 2026

Five teachings, five manuals, and one table nobody had opened

RideComposer was placing climbs in classes that forbid them — and its own checker approved, because it read the same table. We went back through the theory with the manuals open, one teaching at a time.

A Spinning® Endurance Quick Ride was placing climbs. The same software, seconds later, flagged those climbs as forbidden in Endurance.

Both statements came out of the same file. That is where this has to start.

A marker grading from the student's own copy

Since the start of September, RideComposer can check a ride you built by hand: does this track belong in this zone? is this technique playable at this cadence? It never blocks anything — it points things out.

To point anything out, it needs a reference. It reads a table that maps, for each teaching and each class type, the techniques allowed in each zone. It is the very same table the Quick Ride uses to generate a class.

In principle that is clean: what the application proposes and what it checks cannot drift apart. But it assumes the table is right. And that table had never been checked against the manuals. It had been carried over as-is from an earlier version of the software, passed along from release to release, and it even carried a reassuring comment: "table validated in the field". It had not been.

A checker that inherits the error it is supposed to catch does not merely let it through — it certifies it. That is the most uncomfortable part of this whole story, and it is the part you only see by opening the books.

So we opened the books

We went back through the theory one teaching at a time, each manual next to the keyboard. Here is what each one gave us.

Spinning® — Instructor manual, Johnny G, the energy zones chapter, pages 3.09 to 3.19. The table was wrong in several places. Endurance does allow climbs, which we were forbidding. Race Day, on the other hand, loses standing runs and sprints: the manual says plainly that there are no pedalling accelerations. And Jumps on Hill leave Endurance for Interval, the only class where jumping is permitted.

Schwinn® — theory workbook, § 4.4, pages 55 and 60 to 63. A pleasant surprise: the eight technique lists matched their manual word for word. One single discrepancy, on a figure shown to the instructor: the heart rate for the Hill class, which is now the one printed in the workbook.

Globe Cycling and BICA — BICA manual, page 38 for the technique summary, then the classes chapter, one class profile at a time. All seven classes were gone through line by line. The Combination joins Highland and Summit, which the manual does show; Running takes its place there too; and the two flexions specific to BICA are brought back to the only two classes the manual shows them in, Interval and Fartlek. Every heart-rate range on display now comes from the manual, page reference included.

Free Ride — the open teaching, meant for non-certified instructors, follows the BICA grid. So it gets the benefit of the same review.

The choice we did not make: harmonising

Put the five theories side by side and the temptation is immediate. They contradict each other. The cadence ceiling is not the same everywhere: most teachings stop at 110 revolutions per minute, Spinning allows more, and its syllabus simply sets no bound at all for some techniques. We could pick a middle value, declare it sensible, and have only one rule to maintain.

We did the opposite, and it is a design decision worth stating out loud: each teaching applies its own manual, and nothing else. There is no shared fallback value left anywhere. Choose Spinning and you get Spinning's rules; choose BICA and you get BICA's — including where the two disagree.

The reasoning is simple. Spinning and Schwinn theory have twenty-five years of practice behind them; Globe's and BICA's are recent. It is not a piece of software's job to arbitrate between them. A certified instructor who picks a teaching in RideComposer is choosing to apply their own certification — the one they will be assessed on, and the one they paid for. Serving them an average would have them teach something nobody teaches.

In practice: each teaching now has its own ceiling table, fed by its own document. Along the way we found a missing value in Globe and BICA — the flat sprint, capped at 100 revolutions per minute by their official manual.

What showed up most on the bike

Two defects found along the way reached the ride you actually get.

The main body of the class was not honouring its own cadence range. A zone announcing "60 to 80 RPM" was receiving tracks at 84 and 86. We fixed the main selection — and the defect survived. There was a second door: the pass that tops up a ride that has come out too short filtered only on intensity, and since it takes the longest track that still fits, it was quietly dropping mountain work into a flat body. Both doors are shut, and a test now counts the places in the code able to add a track, so that a third one cannot appear unnoticed.

A recovery class was being generated with no warm-up at all — no Warm Up, no Cool Down. It was written and argued for in the code: a class made entirely of recovery is already a warm-up. Seen on screen, that argument does not survive thirty seconds. A main body is a main body: you do not start it cold and you do not walk away from it without coming back down. Recovery now gets five minutes of warm-up, and a test sweeps all seventeen class types to check that none can fall back to zero.

One last, lighter item: the Quick Ride was not really shuffling its tracks. It returned something close to library order, which made successive draws look oddly alike. It now draws at random for real.

What it is worth

Every table is now sourced in the code: each zone of each class cites the page and the sentence of the manual it comes from. And each manual has its own test, which pins the written theory down and fails if somebody changes it without opening the book.

RideComposer's test suite went from 299 to 492 over the course of this work. That is not a marketing figure: it is the number of rules the software can no longer lose in silence, the way it had lost these.

All of it ships in version 1.3.0.

If a rule RideComposer shows you does not match what your manual says, write to us — with the page. It is the best way to get us to open a book we had not opened.