← Lab notebook

Grip is the rack going light

We build Seat Time, our browser driving sim, at AI Maker Lab with AI coding agents. Our new tyre texture passed its spectrum checks. On our first G923 drive, it felt “like vibration added rather than feedback from the road / tyre friction”. About seven hours after it landed, we reversed the design.

That was the week of 26 October 2026. We wanted the wheel to tell us what the tyres were doing. We also wanted each recorded engine to sound like one engine throughout its rev range. Both problems looked tractable in measurements. Both needed a decision that the measurements couldn't make for us.

We gave the rim a tyre texture

The first texture combined rolling, contact and sliding signals in an 8–120 Hz device band. The agents used an ISO 8608 class-A road profile as an input. ISO 8608 describes reporting road-profile measurements; choosing that profile didn't certify our wheel feel.

The raw texture measured about two device-command levels in root-mean-square amplitude, a measure of signal size over time. These were HID levels: discrete output values sent to a human interface device. WebHID exposes that kind of device communication to web applications with explicit user access. It doesn't tell us whether a vibration conveys useful driving information.

We had kept the effect separate from the driving physics. In the recorded comparison, switching texture on or off left the simulated drive bit-identical. That made the experiment easier to interpret. The car hadn't gained grip when we enabled the effect; we had changed what reached our hands.

It felt like vibration added

Our G923 drive rejected the premise. GT7 and Assetto Corsa were our personal feel benchmarks here, not subjects of a comparative review. We wanted a connection to tyre friction. The extra movement read as something laid over the steering instead.

The output path had also changed the signal more than its raw spectrum suggested. A carry mechanism around the wheel's dead band turned the texture into a roughly square-wave signal. Its amplitude was about 5.4 levels, against about 2.1 levels before that treatment. Those are root-mean-square render measurements, not torque measured at the rim.

The rejected texture measured about 2.1 command levels raw and 5.4 after dead-band carry, in root-mean-square amplitude.
The carry made a different signal. These are rounded historical render values, not a recorded waveform or a hardware torque measurement.

There were two things to undo. We removed the carry, but reducing the amplitude alone wouldn't answer the design question. The texture had grown with grip use. We were adding activity precisely where another steering signal already had something useful to say.

Grip is the rack going light

The useful cue was already in the rack torque: its aligning contribution falls as the tyre approaches its lateral limit. Slip angle is the difference between where a wheel points and where it travels. As that angle grows, lateral force and aligning torque don't have to peak together.

Pneumatic trail explains the difference. The tyre's lateral force acts at an offset within the contact patch, producing a restoring moment. As slip angle increases, the force's point of action moves toward the patch centre, so the offset shrinks. The moment can therefore fall while lateral force is still growing. A Stanford dissertation on steering torque and tyre limits describes this mechanism and the resulting torque decline.

Our steering checks already required the torque peak to come before the lateral limit. Our interpretation was simple: let that reduction in steering effort carry the grip cue. An added vibration that grows through the same interval can compete with it. This is how we chose to communicate our tyre model, not a claim that every steering system feels identical.

Scrub only when the tyre slides

The reversal restricted the rim's added tyre texture to scrub beyond the lateral peak. Below it, that added scrub contribution is zero. The DualSense controller retained grip-use texture; we didn't assume a gamepad and a steering wheel needed the same message.

The below-limit skid-pad render then stayed near the straight-line baseline: 2.11–2.17 levels against 2.13–2.15. The total output remained nonzero and close to that baseline; the added scrub contribution below the lateral peak was zero.

The reversal has no recorded hardware drive yet. We can say what the agents changed and what the render measured. We can't borrow the earlier G923 drive to declare this later version right. That distinction matters most when the whole reason for changing direction was a drive.

A second channel, tuned by hand

We also experimented with the G923's Logitech TRUEFORCE channel. During the hardware experiment, we felt scrub working, but still reported “a bit of wheel buzz”. It didn't consistently reflect the tyre state. The agents responded with separate voices for rolling, approaching the limit, sliding, rear-wheel spin, lock-up and kerbs.

Our by-feel calibration set base values of 0.015 for slicks, 0.030 for road tyres and 0.085 for karts. We chose a combined cap of 0.240 for a loaded front tyre still gripping. These are our control values, not physical constants or measured forces. Applying them to the in-game voices was another change, and those calibrated voices have no recorded hardware drive yet.

We started writing feel decisions into specifications so later agent work had something concrete to preserve. The road-car throttle knee near 0.62 became a controllability contract. Recording the decision didn't make it universally correct; it stopped the next implementation from silently replacing it.

The engine that sounded like three cars

The audio work had already taken a similar wrong turn earlier that week. Short recorded regions produced an audible repeat every one to two seconds at held revs. The agents tried a cycle-based player that stitched short runs from different moments. It also used fill recordings from other cars.

A report described Compact Sports as sounding “like a city car, then a formula car, then a turbo”. The record doesn't identify the listener, so we can't call that our listening verdict. It does record the withdrawal: the new player was removed about eleven hours after arriving on 26 October.

Its loop detector had improved. That was the uncomfortable part. Repetition was only one failure mode, and the player had traded some repetition for changing character. A lower loop score couldn't establish that the result still sounded like one engine accelerating.

One take per region, shuffled

The next approach kept up to eighteen seconds from one recording per region. Roughly three-second, phase-aligned pieces were shuffled with short joins. The pieces had more room to vary without reaching into another car's recording to fill the gaps.

We approved before-and-after clips for seven cars, covering cruise and near-redline holds. In the detector results, loop prominence fell below 0.08 on eleven of fourteen holds. That number belongs to the loop measure used in those renders. It isn't a realism score, and the seven-car listening decision doesn't approve the fleet after later changes.

The engine repair sequence moved from a withdrawn cycle player to shuffled single-take pieces, then source and throttle repairs.
The sequence within 26–31 October is recorded history, not a time-scaled chart. Each repair addressed a different audible failure.

Keeping one take per region narrowed the problem. We could then ask whether the recording itself suited the vehicle, rather than treating every character change as a transition problem. The karts supplied a very direct answer.

Our karts were playing an ATV

We said the karts sounded “like a 4-stroke”. They were playing a four-stroke all-terrain-vehicle recording. Its top recording was being played at up to 2.12 times its original rate. The sound mapping first reduced that peak to 1.20 times; the later source repair replaced the bank with a 125 cc two-stroke recording.

The distinction isn't just a different pitch preset. In the basic per-cylinder cycle, a two-stroke engine fires once per crankshaft revolution. A four-stroke fires once every two revolutions. Yamaha's engine-cycle explanation lays out that mechanical difference. Speeding up a four-stroke recording doesn't turn its source into a two-stroke engine.

The kart top-recording peak playback rate fell from 2.12 times to 1.20 times before the later two-stroke source replacement.
First we reduced the stretch; then we changed the source. The replacement two-stroke bank also kept the top rate at or below 1.20 times.

The replacement bank has no recorded listening verdict yet. It addresses the documented source mismatch, but that isn't the same as hearing the kart through a complete drive. We kept that question open instead of turning a sensible source choice into a finished result.

One engine through the throttle

Throttle transitions exposed another seam. Partial throttle blended two weakly correlated recordings, and we had reported the engine changing in the middle of the throttle. The revised mix gave the on-load recording ownership above a throttle value of 0.25.

A later adaptive crossfade reduced reported level dips from 6–10 decibels to at most one in the cited cases. Compact Sports remained an exception: its dip fell from 7.5 to 1.7 decibels. Leaving that exception beside the headline result matters. Otherwise “fixed” would hide the car that still missed it.

We preferred the adaptive crossfade by ear on five cars. The timbre-jump detector disagreed, counting 703 jumps across the fleet instead of 601. We kept the listening preference and the disagreement together. Six cars had become jumpier in the earlier throttle repair, and their subsequent state was only partly remeasured. There was no basis for calling the current fleet listening-approved.

What Gemini could and couldn't hear

Gemini helped flag discrete faults that we could check, such as sped-up playback. It was much less useful for deciding engine type or whether a source suited a car. In our recorded trials, those judgments were near noise, and pairwise preferences mostly followed clip order.

It also rejected clips from both builds and called high-rev engine stems tyre squeal. That made it an advisory fault finder for this work. We could ask it where to investigate, then compare against the source, detector and listening report. We couldn't ask it to supply the missing human verdict.

The same boundary applied to video sound checks. We chose a loudness target of −14 ±1 loudness units relative to full scale, with true peak at or below −1.5 decibels relative to full scale. EBU R 128 and ITU-R BS.1770 explain the measurements. Those were our export targets, not the EBU broadcast target. Passing them meant measured, not listened to.

The next drive still matters

We ended the week with a narrower job for every tool. The detector could find repetition; the render could reveal added amplitude. Our hands and ears still decided what the signal meant. The scrub-only reversal and calibrated tyre voices both have no recorded G923 hardware drive yet.

Open Seat Time, then Settings → Haptics, and try a corner for the wheel-going-light cue. TRUEFORCE tyre feel is experimental and off by default. Next we wanted to follow that limit into a deliberate rear-wheel slide.

Previously: Fast for visitors on phones. Next episode: Drift, and the AI driver.

Notes and sources

Measured — Texture figures are retained device-level renders from this build week, not new wheel measurements. The rounded 2.1 and 5.4 values describe raw texture and dead-band carry. The below-limit comparison is 2.11–2.17 on the skid pad versus 2.13–2.15 on the straight. Our mapping used one command level as 1/127 of a nominal 2.3 N·m range; that conversion is not a measured rim force.

Our feel report / chosen design values — The rejected texture and the early second-channel experiment have recorded G923 feedback. The slick, road and kart calibration values, combined cap and throttle knee are our choices. The scrub-only reversal and calibrated in-game voices have no recorded hardware drive yet. Our interpretation of the rack cue follows the pneumatic-trail mechanism in the linked Stanford dissertation; it isn't a universal wheel calibration.

Measured / our listening report — The loop result covers fourteen holds and listening clips for seven cars at that stage. The kart playback comparison is a retained render result; another earlier render rounded its starting value to 2.11 times. The new two-stroke bank has no recorded listening verdict. The five-car crossfade preference coexists with the worse fleet-wide jump count and partly remeasured regressions. Compact Sports' three-car description is an unattributed historical report, not a quote assigned to us.

Sourced facts / AI-model output — ISO 8608 supplies road-profile context, WebHID supplies device-access context, Yamaha supplies the engine-cycle explanation, and EBU/ITU supply loudness terminology and measurement context. These sources don't validate Seat Time. Gemini's judgments are model outputs from our trials, not acceptance. Google owns Gemini; Logitech owns the G923 and TRUEFORCE marks; DualSense is a Sony trademark. We imply no vendor support or endorsement. GT7 and Assetto Corsa appear only as our feel benchmarks. AI assisted this article's research synthesis, writing and localization. No source audio is redistributed here.

Keep reading