A thorough audit of practice/qualifying/heats/finals, bump-up,
judging and pause/timer code (requested by the user) found several
real, concrete bugs, fixed together:
- Qualifying reseed sorted heats as text ("H10" before "H2"),
scrambling grids at 10+ heats; now sorts numerically and reports a
clear warning instead of silently dropping/ghosting heats when the
participant count changes.
- A driver with zero laps in a finished heat/final (DNS) vanished
entirely - not just from that round, but silently from every future
reseeded round and the final grid. Now backfilled as a real,
last-place "DNS" row.
- Bump-up did nothing at all with "reserve bump slots" off (mains
were already seeded full, so the old capacity check always
blocked it), and a promoted driver stayed double-entered in their
old main's upcoming leg. An oversized bump count could also blow
the main-letter naming past "Z". All three fixed.
- Judging undo restored an absolute snapshot instead of reversing its
own delta - undoing two penalties out of order could leave a live
penalty behind two "undone" log entries. Now always nets correctly
regardless of undo order.
- A competitor's elapsed time didn't exclude paused time (only the
session clock did), making a paused heat's results incomparable to
an unpaused one in qualifying ranking. Finishing while paused also
dropped the final pause segment, so the displayed elapsed time kept
growing after finish. Both fixed.
Verified with new unit tests for every fix (including a new
session_control.test.js - that file had zero prior coverage) and a
real headless-browser run confirming the judging-undo and bump-up
fixes end to end through the actual UI.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
35 lines
1.2 KiB
JSON
35 lines
1.2 KiB
JSON
{
|
|
"name": "rc-racecore",
|
|
"version": "1.10.3",
|
|
"private": true,
|
|
"description": "RC RaceCore live timing and race control with AMMC ingest and SQLite persistence",
|
|
"engines": {
|
|
"node": ">=22 <27",
|
|
"npm": ">=10"
|
|
},
|
|
"allowScripts": {
|
|
"better-sqlite3": true
|
|
},
|
|
"scripts": {
|
|
"preinstall": "node scripts/preinstall.js",
|
|
"postinstall": "node scripts/verify-install.js",
|
|
"start": "node scripts/serverctl.js start",
|
|
"start:fg": "node server.js",
|
|
"stop": "node scripts/serverctl.js stop",
|
|
"status": "node scripts/serverctl.js status",
|
|
"restart": "node scripts/serverctl.js restart",
|
|
"update": "node scripts/serverctl.js update",
|
|
"verify": "node scripts/verify-install.js",
|
|
"backup:restore": "node scripts/restore-backup.js",
|
|
"audit:prod": "npm audit --omit=dev",
|
|
"test": "node --experimental-default-type=module tests/run.js",
|
|
"test:browser": "node --experimental-default-type=module tests/browser_smoke.js",
|
|
"setup:windows": "powershell -NoProfile -ExecutionPolicy Bypass -File windows/setup.ps1"
|
|
},
|
|
"dependencies": {
|
|
"better-sqlite3": "^12.11.1",
|
|
"express": "5.2.1",
|
|
"qrcode": "^1.5.4"
|
|
}
|
|
}
|