← Lab notebook

Like-for-like, and the squat hunt

We build Seat Time, our browser driving sim, with AI coding agents at AI Maker Lab. On 28 October, we had 142 physics test files in the simulation alone. Most checked our own answers against other answers from the same model. Meanwhile, our Sable S1 still gave us a more direct question on our G923 steering wheel: where was the squat—the rear settling under acceleration—when the rear wheels spun?

We wanted an outside comparison before changing the car again. That comparison did expose missing physics. It also exposed mistakes in the reference setup we had built. Between 28 October and 3 November, the work became a hunt through both sides of the test.

Our green checks had a blind spot

The first audit separated real-data checks, self-consistency checks and pinned results. A pinned result records an existing answer so changes cannot slip past unnoticed. That is useful for keeping a build stable. It cannot establish whether the original answer describes a car.

We asked the agents to map 97 physical phenomena and classify the evidence behind each one. Independent models, published numbers and measured data received different weights. Identities and copies of our own calculations could not stand in for independent evidence. The report stayed advisory; it did not automatically block releases.

Its first count was 36 covered, 14 disagreements, 38 blind spots and 9 waivers. Of 46 parameter groups for the Sable S1, 30 lacked sources. “Covered” was our own verdict under chosen rules, not certification. Even that modest word needed its conditions attached: the framework allowed weaker evidence for low-importance rows.

The drift lessons showed how a reference can run out before a test does. We measured the share of tyre-time outside every tyre reference, then added reference cases at drift slips. That share fell from 46.2% to 1.1%. We had expanded the comparisons using other tyre models, not collected new road measurements. The remaining excursions included extreme slip and loads outside the reference range.

The rigid car was answering a different question

Our first steering comparison mixed two different cars. Seat Time allowed the steering linkage to deflect under load; the Chrono reference was rigid. Compliance means that this deflection changes the wheel angle. Asking the rigid model to judge the full compliant car hid the very difference we needed to understand.

The understeer gradient—the extra steering required as cornering acceleration rises—was 1.19 versus 0.638 degrees per g. With our steering made rigid for the comparison, it became 0.702 versus 0.638. The step-steer yaw gap moved from −27% to +1%. Those were diagnostic variants, not a reason to delete compliance from the game.

Compare compliant steering separately; pair rigid Seat Time steering with rigid Chrono steering for the model comparison.
Diagram of the recorded comparison design. Matching modelled parts made the steering disagreement smaller; it did not validate the compliant car.

Chrono::Vehicle’s documentation describes vehicles assembled from suspension, steering, tyre and driveline models. That modularity helped us ask narrower questions. We kept the compliance plausibility check separate because its source was only a second-hand relay of published ranges. It did not deserve the weight of a measurement we had inspected.

The reference needed debugging too

A wheelspin disagreement started with our reference readout. Its estimate of rolling radius made undriven front wheels report a longitudinal slip ratio of −0.016. Correcting the conversion brought that to −0.0006. We had nearly treated a readout error as a tyre problem.

Acceleration had a different trap. Our harness, the comparison program, saved the final 0.25-millisecond integration step instead of the average over the logging interval. That sampling choice distorted one regrip comparison. Averaging the interval moved its correlation from 0.79 to 0.92. Other acceleration disagreements remained; one logging fix did not excuse the whole list.

Then we found an inertia tensor assigned to the wrong axes in our Chrono test car. Roll inertia was 3,870.8 instead of 820.3 kg·m², about 4.7 times too large. The documented Chrono axes are forward, left and up. Moving numbers between conventions without moving their meaning had made the reference resist roll far too strongly.

Tyre response time needed the same care. Relaxation describes force building over travel rather than appearing instantly. Chrono’s tyre documentation distinguishes transient slip equations and belt dynamics across its models. In our recorded comparison, the reference setup lacked the at-speed relaxation represented by our tyre belt. Giving both sides that response brought a frequency-response check inside our criterion. We withdrew our earlier explanation that Seat Time’s yaw mode was simply less damped.

Free flight left nowhere for the reaction to hide

The squat investigation began with our wheel report: no squat or bite under power while the rears spun. Our load-transfer identities passed. An early planning estimate put wheel spin-up reaction at about 0.1° of body pitch and judged it too small to justify a change. That estimate was not a test of whether angular momentum was conserved.

We stripped the question down to free flight. With no net external torque, changing the wheels’ angular momentum must produce an opposite change elsewhere in the car. This is the conservation rule described by OpenStax. The test did not need a tyre-grip theory or a driver verdict to decide it.

The wheels lost 97.6 N·m·s of angular momentum. Our body gained zero. With the missing reaction included, the body gained 97.8 N·m·s. Whatever the effect felt like through the wheel, zero was the wrong answer to that isolated test.

Adding the reaction changed braking, airborne and limit checks across the fleet. We first kept it optional, then attributed the changed results before enabling it. Some checks closed; some exposed harness artefacts; others had passed because the reaction was missing. We did not widen their bands to make the change disappear. The wheel-reaction work reached the release labelled physics 16.

The rear still sat too low

The second problem survived that fix. In the recorded stock first-gear launch, Seat Time produced 3.62 degrees of squat per g against Chrono’s 3.21. That was about 13% higher. The rear sat 39.3 mm low instead of 31.4 mm. We now had a specific gap to explain rather than a general request for more movement.

We ruled out five candidates: inertia mapping, bump stops, anti-squat geometry, halfshaft flexibility and the measurement itself. The bump stops never reached their 70 mm clearance. A rigid halfshaft still gave 3.62 deg/g. Acceleration matched the change in speed over time. The geometry comparison also matched, so changing it would have been tuning around the cause.

Anti-squat concerns how suspension geometry resists acceleration-induced body movement. The public suspension notes by Joseph Saginaw illustrate the side-view geometry; they are introductory notes, not evidence for our car’s dimensions. Our elimination came from comparing the two recorded models.

Stock launch squat was 3.62 degrees per g versus Chrono 3.21; after force routing changed, nine variants gave 3.25 to 3.34.
Recorded model-to-model results, not real-car measurements. The five eliminated candidates belong to the stock-launch investigation.

The clue was the upward component of tyre force in the tilted body’s coordinates. We applied it straight to the body, bypassing the suspension. At about 1.9° of pitch, it was roughly 110 N at each rear wheel. Through a 14.6 N/mm spring rate, that corresponds to about 7.5 mm—close to the measured 7.9 mm gap.

The force had taken a shortcut

We changed the route so that force loaded the hub and reached the body through the spring and links. Across nine variants, squat became 3.25–3.34 deg/g against the same 3.21 reference. The remaining difference was about +1% to +4%. We had changed the mechanism responsible for the gap, rather than its acceptance band.

The old model sent tyre body-up force directly to the body; the correction routes it through the hub, spring and links.
Force-path diagram, not a suspension drawing to scale. It isolates the body-up component of the tyre’s in-plane force.

Enabling it exposed another miss in second gear: −10.5% against the reference. Aligning the starting speed and acceleration readout reduced that to −7.4%, inside our chosen 10% limit. Again, part of the work belonged in the harness. The remaining gap was attributed to Chrono’s smaller loaded rolling radius, not simply labelled solved.

By 3 November, that force-path change was still in the unreleased physics-18 work. Since then—source checked on 6 November—it has reached the main code line and is enabled in play. That code now identifies itself as physics 20. This is a source-state update, not a fresh drive report. The squat change has no recorded hardware drive yet.

We had also explained away a road obstacle

Kaede supplied a smaller version of the same lesson. On 29 October, Gemini’s advisory vision review flagged a grey bridge slab across the road, with model confidence 0.95. A written note closed it against a ground-sheet finding about 250 m away. The record does not identify who wrote that note.

We later found an obstacle in the middle of the road. The bridge span stood up to 0.33 m above the asphalt, and its downhill abutment left a 0.49 m wall. The road fell while the bridge pieces stayed level. A plausible explanation had been accepted without matching it to the thing in the picture.

The new rule required a matching measured finding within 15 m or a named human override. Otherwise, the audit failed. A new detector found both pieces in the old build and neither in the fix. The wider vision sweep still had only 64 of 442 views reviewed in the retained record; the local bridge result was not complete course coverage.

The count went backwards too

Coverage did not climb smoothly. The recorded per-commit history included 59 covered, then 57, 56 and 54 before recovering. Those records include merged development histories, not a strict sequence of main-line releases. Stale generated tables and newly recorded disagreements also moved the count. Waivers rose from 9 to 19; we have no complete recorded explanation for that increase.

The late journal snapshot showed 69 covered and 9 disagreements; an unreleased snapshot reached 70 and 8. The 6 November source check instead shows 68 covered, 10 disagreements, no blind spots and 19 waivers. We are keeping the lower number visible. No blind spots means no rows in that category under our rules, not complete evidence for every aspect of driving.

The lane-change row also shows why the headline needs reading. It counts as covered through published speeds while a separate Chrono comparison still disagrees. ISO 3888-2 defines an obstacle-avoidance test track; invoking it does not certify our simulation. The older 2011 edition is withdrawn and replaced by the 2025 edition. Lift-off, clutch response and other disagreements remain in our report.

Pick a validation experiment in the Physics Lab. Our next idea was to step back from individual fixes and ask what five weeks of building had taught us.

Previously: drift, and the AI driver · Next episode: five weeks in

Notes and sources

Measured / first-party record: the October audit counted 142 simulation test files. Its first report was 36 covered, 14 disagreements, 38 blind spots and 9 waivers across 97 phenomena; 30 of 46 Sable S1 parameter groups lacked sources. The 46.2% to 1.1% tyre-time result measures reference-envelope reach, not measured tyre accuracy. Coverage history is per commit. The dated 6 November source snapshot is 68/10/0/19. These are retained development records, not experiments rerun for this article.

Model comparison / first-party record: steering values, slip readouts, acceleration correlation, inertia correction and squat figures compare our configured models. The stock-launch baseline is 3.62 versus 3.21 deg/g; the correction gave 3.25–3.34 across nine variants. The free-flight record is wheels −97.6 N·m·s, body 0 before and +97.8 after. Our interpretation: the 110 N and spring-rate arithmetic explains the force-path gap. Chosen rules: evidence weighting, tolerances, waivers and the 15 m reconciliation distance are ours. No recorded hardware drive yet for the squat change.

AI-model output / first-party record: 0.95 is Gemini’s confidence, not a probability measured by us. Bridge heights are geometry measurements; 64/442 is the retained vision-review extent. The closing note’s author is not recorded. The wider new-detector run and post-merge live check were not recorded complete at merge.

Sourced facts: Project Chrono, Chrono::Vehicle and its BSD-3-Clause licence. Our historical reference used Chrono::Vehicle 10.0.0. Tasora et al., “Chrono: An Open Source Multi-physics Dynamics Engine”, 2016, pp. 19–49, is the verified project citation. The public abstract and bibliographic record were read, not the paywalled chapter. Chrono is an independent model, not an endorsement or measured car data.

Background sources: OpenStax on angular momentum, Chrono’s Pacejka and other tyre-model documentation, Saginaw’s suspension notes, and ISO’s lane-change scope and edition status. Public sources checked on 6 November 2026. AI assisted this article’s research synthesis, writing, figures and localization; AI Maker Lab owns the build and its decisions.

Keep reading