← Lab notebook

Chasing ‘sim-grade’: writing down the gap, rebuilding the tyre

On September 30, we wrote down what was missing from Seat Time, our browser driving sim at AI Maker Lab. We build it with AI coding agents: Claude Code and Orca sessions wrote most code and engineering records. We directed the work and made the decisions. The game already had a reduced tyre model, a Physics Lab and 294 passing tests. We still couldn't say what “sim-grade” meant for us.

We wanted a list the agents could work through, then a fuller tyre model running in a browser tab. The port eventually matched an independent evaluator within 3e-11 newtons. That was a satisfying answer to the code question. Whether our tyres represented real tyres remained unanswered.

We wrote the gap down in 20 rows

The gap map covered 20 physics areas against mechanisms described in commercial sims' public documentation. Each row separated what we had, what was documented elsewhere, what was missing and how to test it. Unverified reference claims stayed marked as unverified. This was our work list, not a league table.

Every fix needed a test that failed first. The agents used it.fails to retain a known failure, then changed it to an ordinary test after fixing the cause. Three top-priority fixes covered the differential, brakes and aerodynamics. A next-priority fix addressed the time step. The work added 59 net passing tests and brought the Lab to 23 experiments.

The thermal fix went backwards

One proposed fix misread the car's lateral axis. It was meant to correct which tyre shoulder took the load. Review caught the mistake, and we reverted the change that day. A guard test now checks that inward lateral force loads the outer shoulder on both wheel sides.

That reversal mattered more than another green row. The recorded second review was static: it inspected the changes without independently running tests.

We built the machinery to check ourselves

Telemetry import, replay comparison and offline fitting came before moving the player cars. We added three reference cars as a separate place to try the model. Their parameter records still contained many unsourced values. Calling them “reference cars” didn't make them measured vehicles.

The first phase left player cars bit-identical at the recorded checkpoints. The next phase improved a torque-free energy test: drift went from +0.2311% to −0.000142% at 400 Hz. Checkpoint restoration also reproduced the state exactly across 17 cars and 10,000 steps each. These were useful checks on our machinery, not evidence about real-road grip.

The equations matched; the tyre was still a question

We had the agents implement Magic Formula 6.1, the tyre model associated with Pacejka's Tire and Vehicle Dynamics. The runtime read a .tir parameter file. It covered braking and cornering forces separately and together, plus load, pressure, camber, turn slip and aligning torque. Low-speed and reverse handling belonged in the port too.

The comparisons had different jobs. Against our earlier evaluator, the maximum force difference was 5.46e-12 N. Across 2,696 fixture points from MFeval.jl, the maxima were 5.5e-12 N longitudinally and 2.8e-11 N laterally. The aligning-torque comparison without turn slip differed by 3.1e-13 N·m. We documented a turn-slip torque difference: our implementation followed the book where the comparison version retained placeholders.

Our separate fitting check used a chosen normalized tolerance of 0.05. Its held-out errors were 0.0414 longitudinally and 0.0336 laterally. Those dimensionless fit errors cannot share a scale with force differences in newtons. The tiny evaluator differences told us the checked calculations agreed. They didn't supply the missing measurements of a real tyre.

Reference cars first, then the player cars

The full model changed the reference GT3 substantially. Its skidpad result fell from 1.479 g to 1.066 g. Meanwhile, all 17 player cars still used the reduced model. That separation let us see the change without silently handing it to every player car.

For the migration, we chose continuity. Each player car received a synthetic fit to its own previous curves; the acceptance measurements didn't feed those fits. All 17 cars kept their existing bands. No checked metric drifted more than the chosen 3% gate, and lap times stayed within 0.7%. This stage also gave up the full model's independent camber-spin physics on player cars: its separate treatment of the spin effect from a tilted tyre. No measured tyre data entered the migration, and we have no recorded hardware drive of it.

A mode switch made the force jump

The migration exposed a discontinuity in turn slip, the tyre's response while its heading rotates. The code switched that mode when the turn-slip input became nonzero. On the reference tyre, lateral force jumped from −147 N to −12 N across the switch. Those are the two sides of the bug, not results before and after a repair. We made the mode persistent instead.

A turn-slip mode switch changes reference-tyre lateral force from −147 N to −12 N; these are not before-and-after repair values.
The force changed abruptly at a software mode boundary.

A separate feedback loop ran through compliance steer: load-induced steering deflection fed the steering-rate calculation. Dividing by the time step made that loop stronger as the step shrank. We took steering rate from the commanded wheel angles instead. At half the time step, the GT3 understeer error fell from 7.18 to 0.0002 deg/g—degrees of steering response per unit of lateral acceleration.

GT3 understeer error at half the time step falls from 7.18 to 0.0002 deg/g after removing the compliance-steer feedback loop.
Here, dt/2 means half the simulation's usual time step. Changing the input to the steering-rate calculation removed the time-step sensitivity in this check.

Tyre state made the migration more than a curve swap

Gas, temperature, wear and contact-mass transients—the short-lived response of the modelled mass at the road contact—arrived on the reference tyres, then on player tyres. None of that introduced measured tyre data. The player-state stage improved the barrier peak-force convergence metric from 0.080 to 0.0050. It also accepted a +7.17% rack-torque drift on one car. The earlier 3% gate described the first migration stage, not every later change.

The tests became slower, so the agents cached the first-peak solver's results. The recorded QA run reproduced identical behaviour at 140 checkpoints and made the convergence test files 1.105× faster. That's the supported result, not a claim about browser frame rate. Later stages extended the work into chassis, steering, aerodynamics, brakes and driveline systems.

Nine compounds had almost the same answer

The later engineering record described the nine compounds as having “felt nearly identical”. The record doesn't identify a driver. The numerical problem was clearer: compounds mostly scaled peak grip, while wear rate never reached the tread model.

On the road car, lateral force divided by vertical load at a 1° slip angle occupied a narrow 0.33–0.35 range. Giving the compounds their own profiles widened it to 0.34–0.57. The change wasn't playtested in the browser. We could show different curves; we couldn't yet say they felt different.

On the road car, lateral force divided by vertical load at a 1° slip angle spans 0.33–0.35 before compound profiles and 0.34–0.57 after; no browser playtest was recorded.
Fy at 1° / Fz means lateral force at a 1° slip angle divided by vertical load. The profiles separated the measured responses in the test, leaving the driving question open.

We needed rules for the score, too

The scorecard grew out of the Physics Lab described in Episode 1: the starting line. We later separated player cars from reference cars in its revised version. Otherwise, work on a reference tyre could make a player car look better supported than it was.

We also wrote down what evidence could count. On October 2, we allowed higher-fidelity simulation into our internal “measured” category when real data was unobtainable. That remained simulation evidence, not a physical measurement. On October 12, we limited public non-manufacturer sources to cited estimates, never validation data.

Those rules didn't mean limits could never move. We approved four revisions explicitly, including a GT3 warm-up floor from 85°C to 83.5°C. When regressions appeared, we fixed their causes: a skidpad result recovered from 0.785 to 0.8005 g against a chosen 0.80 g floor. Removing a double-counted camber offset cut a kart's kerb-slip metric from 0.180 to 0.025. An implicit plank-damper calculation reduced the recorded acceleration from 29.5 to 24.8 m/s².

The provisional tyre score came back down

We had given the tyre rows provisional top marks. Later, the reference parameter file turned out to be an unattributed example with unknown measurement provenance. A same-named copy elsewhere differed in 144 coefficients. We withdrew the provisional score. A usable licence hadn't established where the measurements came from.

That left us with better equations, a more deliberate migration and an unresolved tyre-data problem. Our analytical bands still mostly checked the model against itself. The next physics idea was to seek open data, then compare like with like.

Drive Seat Time. This opens the current game, not the historical build; the Physics Lab requires sign-in and access. Next in the journal, we turn to a problem we could hear: Episode 3: our first engine sounded 8-bit.

Notes and sources

Measured — The test counts, energy drift, evaluator differences, migration bands, lap-time changes, bug values, cache result and compound ranges above summarize our retained engineering records from September–October 2026. They are first-party test outputs, not independent validation. Figures are diagrams of those recorded values, not new measurements or historical screenshots.

Chosen design value — The normalized 0.05 fit tolerance, 3% migration gate, scorecard rubric and acceptance limits were our choices. The evidence-category decisions were project rules. The later accepted rack-torque change belongs to a different migration stage.

Sourced fact — Hans B. Pacejka, Tire and Vehicle Dynamics, 3rd edition, Elsevier, 2012 (publisher entry). MFeval, by Marco Furlan Tassara, evaluates Magic Formula parameter files under BSD-3-Clause. Credit also goes to matheusft's MFeval.jl — High-Performance Pacejka Magic Formula Tyre Model Implementation, whose licence is headed MIT and includes an attribution request. These credits imply no endorsement. The parameter-file provenance finding is our first-party historical finding, not a claim that either evaluator supplies measured tyres.

Our interpretation — Agreement with an evaluator supports the checked implementation of equations. It does not establish real grip. The gap map and scorecard tracked our work, not parity with commercial sims.

Not yet driven on hardware — No hardware drive is recorded for the migration. The compound-profile change was not playtested in the browser. “Felt nearly identical” is wording in an engineering record, with no driver attributed here. AI also assisted with writing and translating this article.

Keep reading