We have released RumiCar Simulator v10.1.0. The release notes below are also available on GitHub.
v10.1.0
Fixes to places where an official race’s result could depend on the verifier’s language settings, the order in which entries were read, or what was selected in the browser (Stage BI; the driving physics is untouched — driving on the shipped courses and the result of the shipped official sample race are unchanged; the official sample race’s verifyHash e9f1da0b and the frozen hashes f0–f3 are the same as before). (1) Starting-grid order — entries are ordered by submission time (submittedAt), and entries with the same time were ordered by author name, but that comparison depended on the language settings of the environment (measured: the order differed between a Turkish environment and English or Japanese ones), so the same race could line up differently depending on where it was verified. Entries that also shared the author name kept the order in which they were read. The comparison now uses character-code order, which does not depend on language settings, and decides by submission time → author name (car name if there is none) → car name → the entry’s contents (language, program, car type). (2) Entries after the deadline — entries submitted after the race’s entry deadline (entryWindow.close) still started. Entries submitted after the deadline are now left out (an entry submitted at exactly the deadline still starts). When there is a deadline, entries whose submission time cannot be read are also left out. Only ISO 8601 times with a time zone are read (e.g. 2026-10-11T09:00:00+09:00 or …Z); times without a time zone mean different things in different environments, so they are not read. The official-record generator refuses a race whose deadline itself cannot be read (a re-run in the browser treats it as having no deadline). (3) Authors in the result — the official record (result.json) looked up each car’s author by car name, so when two entries had the same car name, the second one was also given the first one’s author. It is now looked up by the car’s position in the field. (4) Defaults for unwritten settings now match between generating and re-verifying a record — when a race definition had no time limit (maxSec), the generator ran with a time derived from the course and the number of laps, while “Re-run locally to verify (reference)” and “👻 You vs world best” in the browser stopped at 180 seconds; when it had no regime, the generator ran on the tabletop and the browser ran in whatever regime was selected at the time. The defaults for laps, regime, crash rule, car-to-car contact, time limit, physics engine and so on are now decided by a single function, so the generator and “Re-run locally to verify (reference)” run under the same conditions (tabletop when no regime is given; a time derived from the course and laps when no time limit is given). “👻 You vs world best” also uses the same defaults for laps, regime, crash rule and time limit. result.json now records the time limit actually used as maxSec, and regime records tabletop instead of null when it is not written (the conditions the generator runs under do not change, so the driving and the verifyHash of official records are the same as in earlier versions; only the value in result.json’s regime field changes). A page that still has parts loaded from an older version asks you to reload instead of re-running. (5) Cost check in budget classes — a car-type definition (carDef) that gives only some performance values races with the rest filled in from the Normal FR, but the budget check worked it out differently (a definition without a top speed was counted as the car type with the same key — or the default car if there was none — ignoring the values it gave), so a car over budget could pass. The cost is now measured on the definition filled in the same way as in the race (e.g. a definition giving only acceleration, understeer and mass: 58 → 81). A carDef without a key is not used in the race — the car of its car type (carType) runs instead — so the check now measures that car type. The costs of fully specified carDefs and of entries that give only a car-type key are unchanged. We also raised the number of permanent verification gates from 77 to 78 (wf_bi1_field.mjs, which checks the order, deadline, authors, defaults and budget check of the official field).
Verifying this release yourself
git clone https://github.com/RumiCar-group/RumiCar-Simulator.git
cd RumiCar-Simulator
node wf_run_all.mjs # the full assertion-gate suiteThe suite runs from a fresh clone with no dependencies beyond Node.js.
The real-browser checks under browser/ additionally need npm install and a display.
