TiGa-RCE commited on
Commit
2a138ca
·
verified ·
1 Parent(s): be1eee5

Improve onboarding, useful defaults and continuation guidance

Browse files
BETA_TESTING.md CHANGED
@@ -38,7 +38,7 @@ restricted source repository as the app entry point.
38
 
39
  The worker preserves Formula (Type 0), Rally (Type 1), Snowmobile (Type 2), and Truck (Type 3) on import, in candidate exports, and in run reports. Formula imports retain legacy ordered output subsets. Fresh networks for all vehicles require Steering and Acceleration; Rally, Snowmobile and Truck imports must also retain those outputs. Snowmobile Handbrake is unavailable in the original editor. Networks allow at most 20 inputs (13 raycasts plus 7 other sensors), 12 total layers, and 16 neurons per hidden layer. The maximum is `[20]+[16]*10+[5]` (2,869 parameters) for Formula, Rally and Truck; Snowmobile has at most four outputs, `[20]+[16]*10+[4]` (2,852 parameters). All 13 game sensor types use original-game defaults for omitted parameters. These are vanilla worker limits, not support for arbitrary modified-game networks.
40
 
41
- The preview shows tile layout and terrain, not collision geometry. Star challenges are not evaluated.
42
 
43
  ## CUDA reference check
44
 
 
38
 
39
  The worker preserves Formula (Type 0), Rally (Type 1), Snowmobile (Type 2), and Truck (Type 3) on import, in candidate exports, and in run reports. Formula imports retain legacy ordered output subsets. Fresh networks for all vehicles require Steering and Acceleration; Rally, Snowmobile and Truck imports must also retain those outputs. Snowmobile Handbrake is unavailable in the original editor. Networks allow at most 20 inputs (13 raycasts plus 7 other sensors), 12 total layers, and 16 neurons per hidden layer. The maximum is `[20]+[16]*10+[5]` (2,869 parameters) for Formula, Rally and Truck; Snowmobile has at most four outputs, `[20]+[16]*10+[4]` (2,852 parameters). All 13 game sensor types use original-game defaults for omitted parameters. These are vanilla worker limits, not support for arbitrary modified-game networks.
40
 
41
+ The map preview shows tile layout and terrain, not collision geometry or live driving. When a track has supported conditions, the app runs a bounded fresh replay of the named controller with fixed weights and reports a prediction. It does not award or accumulate original-game stars. Opponent races and unsupported conditions remain unchecked; built-in tracks are reconstructed replicas.
42
 
43
  ## CUDA reference check
44
 
BUCKET_BUNDLE.md CHANGED
@@ -4,6 +4,8 @@ The browser supports explicit local-file export/import and optional direct save/
4
 
5
  Bucket storage starts disconnected. After an explicit HF OAuth authorization for `openid profile write-repos`, the user enters an existing private bucket ID and connects. Connected-run autosave is on by default and can be turned off; disconnected or manual-only runs make no bucket storage calls. HF describes `write-repos` as read/write access to personal repositories; the grant is broader than one selected bucket, is not a bucket-only permission, and its mapping to bucket access and minimum required scope still needs live qualification. During storage operations, the page-memory token and selected bundle pass through this app server to the user-owned bucket. The app removes temporary files after an operation and exposes no bucket deletion, overwrite, creation or visibility controls. An observed expired/denied response clears the connection; the UI does not claim advance token-expiry knowledge. Provider-side logs and retention are outside the app's deletion guarantee. The token is not included in the portable bundle. With autosave, the browser verifies output and confirms server deletion before sending the network and sanitized run report to the bucket. A failure preserves the received local candidate; a batch stops before its next run if saving is not confirmed. A separate local CLI guide is distributed with the candidate tooling for users who prefer local bucket transfer.
6
 
 
 
7
  ## Envelope
8
 
9
  The only top-level fields are `schema`, `version`, and `artifacts`. The schema is `ald.portable-bundle`. Legacy version `1` remains readable. Version `2` adds a validated analysis archive for new training and frozen-evaluation results. The required artifact slot is `selected_network`; optional fixed slots are `selected_track`, `selected_recipe`, and `run_receipt`. Version 2 also carries `analysis_archive`. Unknown slots or fields are rejected.
 
4
 
5
  Bucket storage starts disconnected. After an explicit HF OAuth authorization for `openid profile write-repos`, the user enters an existing private bucket ID and connects. Connected-run autosave is on by default and can be turned off; disconnected or manual-only runs make no bucket storage calls. HF describes `write-repos` as read/write access to personal repositories; the grant is broader than one selected bucket, is not a bucket-only permission, and its mapping to bucket access and minimum required scope still needs live qualification. During storage operations, the page-memory token and selected bundle pass through this app server to the user-owned bucket. The app removes temporary files after an operation and exposes no bucket deletion, overwrite, creation or visibility controls. An observed expired/denied response clears the connection; the UI does not claim advance token-expiry knowledge. Provider-side logs and retention are outside the app's deletion guarantee. The token is not included in the portable bundle. With autosave, the browser verifies output and confirms server deletion before sending the network and sanitized run report to the bucket. A failure preserves the received local candidate; a batch stops before its next run if saving is not confirmed. A separate local CLI guide is distributed with the candidate tooling for users who prefer local bucket transfer.
6
 
7
+ Recipe libraries have separate explicit Save, Refresh, and Import actions. They contain settings and batch references only—not networks, tracks, run results, or credentials. Import asks before replacing the current browser library and never starts a run. Run autosave does not upload the recipe library.
8
+
9
  ## Envelope
10
 
11
  The only top-level fields are `schema`, `version`, and `artifacts`. The schema is `ald.portable-bundle`. Legacy version `1` remains readable. Version `2` adds a validated analysis archive for new training and frozen-evaluation results. The required artifact slot is `selected_network`; optional fixed slots are `selected_track`, `selected_recipe`, and `run_receipt`. Version 2 also carries `analysis_archive`. Unknown slots or fields are rejected.
DATA_POLICY.md CHANGED
@@ -85,10 +85,15 @@ The runner candidate has a separate browser-local recipe library. Saving is
85
  explicit; settings and reward mixes, recipe names, and batch recipe references
86
  are stored under the app's single `tiga.ald.recipes.v1` localStorage key. The
87
  application does not put track/network bytes, job keys, run results, HF identity
88
- or credentials in this library. It does not use cookies for recipes or send the
89
- library to the server. A run sends only its selected settings and input files.
90
- Recipes persist across page reloads; they are site/browser-specific and clearing
91
- site data removes them. Export/import transfers a settings-only JSON library.
 
 
 
 
 
92
  Clear saved recipes removes only this app's recipe key, independently of server
93
  result deletion and browser result discard.
94
 
 
85
  explicit; settings and reward mixes, recipe names, and batch recipe references
86
  are stored under the app's single `tiga.ald.recipes.v1` localStorage key. The
87
  application does not put track/network bytes, job keys, run results, HF identity
88
+ or credentials in this library. It does not use cookies for recipes. By default,
89
+ the library stays in this browser and is not sent to the server. Separate explicit
90
+ actions can save, list, and restore the settings-only library in an existing
91
+ private bucket; those actions require the optional HF bucket authorization and
92
+ send the library through this app server. Import asks before replacing the browser
93
+ library and never starts a run. A run sends only its selected settings and input
94
+ files. Recipes persist across page reloads; they are site/browser-specific and
95
+ clearing site data removes them. Local-file export/import also transfers a
96
+ settings-only JSON library.
97
  Clear saved recipes removes only this app's recipe key, independently of server
98
  result deletion and browser result discard.
99
 
FRONTEND_SOURCE.json CHANGED
@@ -1 +1 @@
1
- {"base_provenance":{"output_sha256":"a145fbb303a85c728a530d98fbea998677c1c62a2589c46af9b8b287e4ce1f48","scope":"Frontend only; no engine, private data, track assets, API calls or storage copied","source":"Runner r14 single-engine browser UI; selected .track tile renderer added from simulator atlas","source_sha256":"65d1e5f2c4e19b4951b828e82510005ab99a5270cf3dcb9f4eaa0fa1af8c40f8"},"identity_note":"The historical source fields describe the base frontend; local packaged file hashes describe this candidate's derived frontend.","local_customization_id":"v1.2-winners-frozen-evaluation","packaged_frontend_files":{"assets/track-atlas.json":"d97c8900e3e5fb17734b5bd61d1f4f4b196d9be30af9848e2e273ae7e4079ae4","client.js":"747b85d297a9459ce17aefb468b3688f24e2efc6b6e1598f6b8da48d3b63a677","hf-auth.js":"3f3938bbc0935e4e9230c094029ef46e03beea74be199887c50e053e03dafcfe","index.html":"6f1b8992ed6bb8483ac09ef24c85da01f23e4a8df2b807a7f7fe5e67d4da27ed","track-library.js":"351ec4c026b49420ce963f4310cb000d9e987fd28e6dac5ecd0176509340f6e6","track-map.js":"ab5374aa49c7ccec90a787ee8c56cd71beb56b903bf2bbc322783e6f43c009f0"},"packaged_frontend_sha256":"4bb0f248bf75289d0d67c6d57b1dad80216e575b352f0664931f49ea5df3ca47"}
 
1
+ {"base_provenance":{"output_sha256":"a145fbb303a85c728a530d98fbea998677c1c62a2589c46af9b8b287e4ce1f48","scope":"Frontend only; no engine, private data, track assets, API calls or storage copied","source":"Runner r14 single-engine browser UI; selected .track tile renderer added from simulator atlas","source_sha256":"65d1e5f2c4e19b4951b828e82510005ab99a5270cf3dcb9f4eaa0fa1af8c40f8"},"identity_note":"The historical source fields describe the base frontend; local packaged file hashes describe this candidate's derived frontend.","local_customization_id":"v1.2-winners-frozen-evaluation","packaged_frontend_files":{"assets/track-atlas.json":"d97c8900e3e5fb17734b5bd61d1f4f4b196d9be30af9848e2e273ae7e4079ae4","client.js":"96426083c2987332d3393f77bc30438237b186ef0465263f16ba79b304433453","help.html":"ea4b9b0a391f956458e745d2579cdeb89946af0d80bbfbf63cf2e07eb8de2eb3","hf-auth.js":"3f3938bbc0935e4e9230c094029ef46e03beea74be199887c50e053e03dafcfe","index.html":"7c79a0c56e619ae2e86951e805c4e13b76035c618b423278aee69c8e45c51d4d","track-library.js":"351ec4c026b49420ce963f4310cb000d9e987fd28e6dac5ecd0176509340f6e6","track-map.js":"ab5374aa49c7ccec90a787ee8c56cd71beb56b903bf2bbc322783e6f43c009f0"},"packaged_frontend_sha256":"40653451e93118ceb69174e7dee0bee6f4da02669540db7de9f508b981995e2d"}
README.md CHANGED
@@ -10,14 +10,39 @@ hf_oauth_scopes:
10
  - write-repos
11
  ---
12
 
13
- Public GPU app package. Its intended topology is a publicly reachable app at https://tiga-rce-ald-tao-gpu.hf.space/ with the GPU Space source repository restricted; the standalone CPU Space remains private. Deployment status and build-specific qualification are recorded in the release receipt. The native runner accepts Formula (Type 0), Rally (Type 1), Snowmobile (Type 2), and Truck (Type 3) networks and selects a packaged trusted scene template from the network type. Build-specific native vehicle support must be qualified with the matching simulator and importer binaries recorded in the release receipt. CPU runs anonymously. GPU is explicitly selected and subject to available HF allowance; optional HF sign-in uses the official OAuth flow and needs no personal token entry.
14
 
15
- The selected track map previews tile layout and asphalt/dirt/ice directly from the selected file. Twenty-eight reconstructed editor-format tracks are included. Settings-only recipes and batches save in the visitor's browser. Formula networks preserve legacy ordered output subsets. Fresh networks for all vehicles require Steering and Acceleration. Rally, Snowmobile and Truck imports must also retain those required outputs; Snowmobile cannot use Handbrake. Formula imports keep the previously supported ordered subsets. Networks have at most 20 inputs (13 raycasts plus 7 other sensors), 12 total layers and 16 neurons per hidden layer. The maximum is `[20]+[16]*10+[5]` (2,869 parameters) for Formula, Rally and Truck; Snowmobile uses up to four outputs (`[20]+[16]*10+[4]`, 2,852 parameters). All 13 game sensor types use original-game defaults for omitted parameters. These limits describe this vanilla worker contract, not unrestricted modified-game networks.
16
 
17
- Application-controlled inputs and intermediate files are temporary. Outputs are held in memory for at most five minutes and deleted sooner after verified download by default; a single-run visitor may explicitly keep the result until that five-minute deadline. This is not a provider-wide zero-data-retention guarantee. Read DATA_POLICY.md and TRACK_LIBRARY.md. Upstream code and license: https://github.com/Zorro909/driving_sim_rs. Open upstream PRs 19 and 21 are not included.
18
 
19
- Feedback issues: https://github.com/seeker-cyber-maker/driving_sim_rs/issues/new.
20
 
21
- ## Candidate: outcome archives and frozen evaluation
22
 
23
- This revision adds distinct fitness, fastest-lap and clean-lap network snapshots; per-car measurements for all supported reward channels; and evaluation without changing weights. Connected bucket saves include the analysis and winner files. See WINNERS_AND_EVALUATION.md for criteria, comparison limits and data handling. The original recipe remains user-controlled. Build-specific acceptance and hosted qualification are recorded separately.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  - write-repos
11
  ---
12
 
13
+ This package is the public GPU app at https://tiga-rce-ald-tao-gpu.hf.space/. Its source repository remains restricted; the standalone CPU Space is private. The app also offers an anonymous CPU route. Build-specific deployment and qualification status belong in the release receipt.
14
 
15
+ # Start here
16
 
17
+ This lab lets you experiment with small driving controllers in a packaged simulator. You can make a controller in the browser or load a compatible `.evolution` file, then ask the simulator to evaluate it or train a group of candidates. You do not need the original game installed to try the 28 built-in replica tracks and browser editor.
18
 
19
+ The app is a separate, bounded experiment. It does not control the original game, reproduce its full campaign, or grant official stars or progression. Its track map previews tiles and terrain; it is not a live driving view. The built-in tracks are reconstructed replicas, and a successful simulation run is not proof of original-game physics parity.
20
 
21
+ ## A first run
22
 
23
+ 1. Click **Choose a track** and select one of the built-in replicas. You can instead upload a `.track` file. The map is a layout and terrain preview.
24
+ 2. Click **Create starter network** to make a small controller in this page, or choose a `.evolution` file/use the **Network editor**. Choose a vehicle for a new starter network; imported controllers keep their own vehicle type. The starter is held in the browser and does not begin training.
25
+ 3. Click **Review first-run settings**. The starter recipe is 32 candidates × 20 generations × 900 ticks per generation (15 simulated seconds per car per generation), mutation 0.3, decay 0, and a distance-only reward of +100. Collision and idle elimination are off; selection uses one parent and keeps one elite candidate. These are a starting point, not a promise of a fast or clean lap. Use **Apply first-run settings to this form** only if you want to reset the current form; saved recipes remain unchanged.
26
+ 4. CPU runs without an HF account. Under **Action**, choose **Train a population** or **Frozen evaluation · one policy, unchanged weights**, then click the run button to begin. Training evolves a group of candidate controllers; a generation is one round of simulation and selection. Reward settings tell the trainer which measured outcomes to favor.
27
+ 5. Click **Download result** to receive the result and reveal its winner, measurements, and supported challenge checks. Connected bucket autosave handles delivery instead. A challenge check replays the named network with fixed weights; it predicts conditions for the replica track and does not award stars in the original game.
28
+ 6. Download a controller or portable bundle to keep it locally. You can also connect an existing private Hugging Face bucket for optional saves. Read the storage note below before authorizing bucket access.
29
+
30
+ ## Compute and storage
31
+
32
+ On the public GPU app, **CPU** is the anonymous option and does not use GPU allowance. **GPU** runs are subject to Hugging Face's GPU allowance; anonymous allowance may be limited. Optional HF sign-in associates a request with your account but does not guarantee available quota. Sign-in can reload the page and clear selected files, so sign in before choosing files if you want to use it. The standalone CPU Space is private.
33
+
34
+ Your input files stay in the browser until you start a run or explicitly include them in a local export or bucket save. The app holds processing copies and results temporarily; by default it deletes a result after the browser verifies receipt, and all results expire within five minutes. This is an application-level retention design, not a provider-wide zero-data-retention guarantee. The full handling rules are in [DATA_POLICY.md](DATA_POLICY.md).
35
+
36
+ Recipes and batches are saved in this browser by default. After connecting an existing private bucket, automatic run saving is on by default and can be turned off. Recipe-library Save, Refresh, and Import remain separate explicit actions; they transfer settings only and never start a run. Bucket authorization uses HF OAuth, not a personal access token. It requests HF's `write-repos` permission, which HF describes as read/write access to personal repositories. That permission is broader than one bucket and is not a bucket-only grant. The app only operates on the existing private bucket you enter. See [BUCKET_BUNDLE.md](BUCKET_BUNDLE.md) before connecting.
37
+
38
+ ## Network limits
39
+
40
+ The packaged worker supports Formula, Rally, Snowmobile, and Truck. Networks can use up to 20 inputs (13 raycasts plus 7 other sensors), 12 total layers, and 16 neurons per hidden layer. Formula, Rally, and Truck support up to five outputs; Snowmobile supports up to four and cannot use Handbrake. Fresh networks for every vehicle require Steering and Acceleration. Formula imports retain previously supported ordered output subsets; Rally, Snowmobile, and Truck imports must include Steering and Acceleration and follow their vehicle-specific output rules. Supported sensors use original-game defaults when optional parameters are omitted. These are the vanilla worker limits, not support for arbitrary modified-game networks. See [TRACK_LIBRARY.md](TRACK_LIBRARY.md) for track scope and provenance, and [WINNERS_AND_EVALUATION.md](WINNERS_AND_EVALUATION.md) for result interpretation.
41
+
42
+ ## Results and evaluation
43
+
44
+ A training result can include the final-generation fitness winner, the fastest completed-lap controller, and a clean-lap controller when one qualifies. A controller may fill more than one role; unavailable roles are labeled. Per-car records cover supported reward channels, but population-relative ranks are not absolute scores across separate runs. Frozen evaluation uses one controller with unchanged weights. See [WINNERS_AND_EVALUATION.md](WINNERS_AND_EVALUATION.md) for the exact rules and comparison limits.
45
+
46
+ The app can check supported track conditions after a run by replaying the named controller with fixed weights. This may add time to the run. The result is a bounded prediction for the reconstructed track. It does not award or accumulate original-game stars; opponent races and unsupported conditions remain unchecked.
47
+
48
+ The simulator is based on [driving_sim_rs](https://github.com/Zorro909/driving_sim_rs), upstream revision `b90b8af06ffc4ea4e4fd703becd1107a48b8e5e0`; the release receipt records the packaged build and local changes. The package includes the upstream [MIT license](LICENSE). Upstream pull requests 19 and 21 are not included. Feedback: [open an editable issue draft](https://github.com/seeker-cyber-maker/driving_sim_rs/issues/new). It is not submitted automatically. Review the draft and remove private names or data before posting. Never attach tokens, job keys, private networks, proprietary tracks, or unrelated logs.
RELEASE_MANIFEST.json CHANGED
@@ -1 +1 @@
1
- {"backend":"gpu","files":{".gitattributes":"c2ad16718fc51c888d32efc88c8f6e23ebe5fcf6f48e2954f896ba9770f24d72","BETA_TESTING.md":"27e2492f9fe87cc04f52de2974b685b44041f7de9fa1155926b66c436f0bc613","BINARY_PROVENANCE.json":"fa2b6c8962a0ec704ce7db417e7747abfc8af79f9f31effd242c013d8bdeca5f","BUCKET_BUNDLE.md":"a802f658220f5eabc1a98ea4a5217989b54084d4993943c1faafbad36d421131","CUDA_REFERENCE.md":"f7453c3254d244f8b0de41fde5851cb025159f5cea4a4d1a5d8208a955550c6c","DATA_POLICY.md":"7e8b31b5ad30f35e5d7242c13bdb356191ae05c81dcea2709172974e82546e4d","FEEDBACK.md":"f95b8f6afbf4a360976c0edca5d52f5b3a0b668c9a944d4947b840a7c53a122a","FRONTEND_SOURCE.json":"d684d7aefd4ea5a332571b80abd435911b22c7ae883372dcd4f7f7acc8ca1ffe","GODOT_LICENSE":"fb2b3bb82c60f1e76841ba2122eb902f8e39c151476fe21ce10c9a05d1045304","IMPORTER_BUILD_RECEIPT.json":"4ba5c533cc617105478e4d85c83f456a7dfa68b1388049624619871ba9e42e9d","LICENSE":"53d5851b6440feeae36f72a5f57fcab37858c48b7084765ece4b0c54b9a28ed8","README.md":"cb234a47d1aef9ec17ac72cddca0d7b82abe868cbd3acd992bb8abb0759a18c2","STORAGE_BOUNDARY.md":"ac6946e1fd54be0786d71c24ec499bb898e63c20fd064c3c0bb3bba7046a0c57","TRACK_LIBRARY.md":"be64c91633ef6696233df537afeef4c5175b2d55daac9336758d9eb3d24763c9","UPSTREAM.json":"e71d256ab4fea9a684c211f91086cd8a3eec518686eb54474e79352b20eeed79","WINNERS_AND_EVALUATION.md":"c3df1b0e7c6ce76c2660159c9b74bd7c35af02be2fcad1b8022e3bb47677bebe","analysis_result.py":"0a5d73fe8dbca934b21823b8ffbd50b0baaef8e15a39e32604eefe16f01d1cf2","app.py":"78ddccd56e5c217b89681c5dcbee451b6a5868398c4f75bd2b4db33c235d800f","app_release.py":"7482559c667a665fd3cb6aa8af6c78422a822b515e14589db8306f7fd4860a8b","assets/formula_template.json":"80f745df82bb7be45af52785fd582460bcddc63c5a4e1d8375d85b3122db4c6b","assets/rally_template.json":"7350a3fe28d9b4da7a0965ae6ea7ca3472fb7885303e342310d63a0dce80851c","assets/snowmobile_template.json":"12d30545876011fd6fccdd3e721f9c465938c9c58ac99338205481d5e7ac6742","assets/track-atlas.json":"d97c8900e3e5fb17734b5bd61d1f4f4b196d9be30af9848e2e273ae7e4079ae4","assets/truck_template.json":"a83bffea4d5e818c135ab3aba68a47aa288d6ad0e7b8bd9c95ed0dea9e9df2f7","bin/altd-sim":"3aa1d364e0117f553a52404ae336efcfebd827fc0ca347e811196cbe31e32849","bin/extract_saved_track":"3a7733c45b4301a786fcbfe92660a1c484749272da5f608d62f34878bd4ff31a","bin/libaltd_gpu.so":"3b1b88bccc06a21acc33ac4400af016d55a7e3d8727136a0c43b541f3c7887ca","bucket_storage.py":"73977f5c23c513848a6451fd603609211d829126438db803288ebf4469d1893d","build_info.py":"03efdd1bca81022669a9184667b89d4f1096faba6a83c0514322dd419a938e1f","builtin_tracks.py":"52cb4a285a6079cec7f7610de8af80570f1644a02cf9979e47d2d49736e24cb5","builtin_tracks/catalog.json":"65006e70a87a5a53e3738166b0895bc4db9f99767dd891d917b68029abb4e80a","builtin_tracks/tracks/Replica A01 Beginner.track":"ca5749537450430794e2eade2e0ac72fa141a4f225e13e2f8ef842abb948ff15","builtin_tracks/tracks/Replica A02 Sharp Turns.track":"097f1ea8edf041112b690d0638075630716ddc03c7d0b1980ddcbeaf5071c8d4","builtin_tracks/tracks/Replica A03 High Speed.track":"88917c63847be1854b989bb28a23af7eeacb964c3e7df9579953aebc9496e6af","builtin_tracks/tracks/Replica A04 Dirt.track":"7f4fe58516227b15898d14bb0abb9a0856126d24fcd793884f051f7a4fae521d","builtin_tracks/tracks/Replica A05 Two Terrains.track":"c4ee2842920d99cdfe3eebdcad59a77e24b626380acef0d02a39ea1e23823e2a","builtin_tracks/tracks/Replica A06 Ice.track":"fccb9a159a06d1b986c6fe7d5bb89c0cabad3a005531f4e0d71f6e37254ada34","builtin_tracks/tracks/Replica A07 Three Terrains.track":"a8fa652ad451e2702a23d5f3429eb0b6a6408bf6a2a76a73d549023e481875c6","builtin_tracks/tracks/Replica A08 Long.track":"3e259bd227776ca847d35baaea88b5e8af57cc920643bf71563176bd6554ad65","builtin_tracks/tracks/Replica A09 Sharpest.track":"5362cea3c564dce8f4f22fcd4b798347931dfaa4e65b84624944952b3e0b0d2a","builtin_tracks/tracks/Replica B01 Oval.track":"0df5755150c145a35edc6c8693f429e5b9ff4b12210ba67cbfcb932c58faf158","builtin_tracks/tracks/Replica B02 Snake.track":"210e699b1fa5f2624a2ff0969b73a20af7bc56bf774f4fd282f6109f80bfdb3c","builtin_tracks/tracks/Replica B03 Slalom.track":"a8bab86f93e3072bf27a81a354220c137207b9fc0b548372c8dab93639a18a24","builtin_tracks/tracks/Replica B04 Rally.track":"9d2fc668a7c86aabb9ca9dbfdbd21dff0d099c5d77029aa2ae96b6c7b9efd3f0","builtin_tracks/tracks/Replica B05 Racetrack.track":"d0804ebc17646d2f7c3be65cfe0f6e94033417e75b101a8c598a69131a170079","builtin_tracks/tracks/Replica B06 Hard.track":"8b1a10fd8485405d7f73abca8890f4845145227177c9ac07ac9a1d79f28908f9","builtin_tracks/tracks/Replica B07 Drift.track":"d6d46216882cb63d55b1e8ce81ffa67f1c95ffd0a86a72806b8fd23973c6ce0a","builtin_tracks/tracks/Replica B08 Arctic Circle.track":"229128e86a87089f781b072a4c677ff729cf8488b1d74ad75cfb43655b9f4a16","builtin_tracks/tracks/Replica B09 Checkered.track":"bec4dbd0edc35e0e4f4d1035c608a0c56bbc99e7301f640f8e2eddba0100b2fe","builtin_tracks/tracks/Replica R01 Blitzring.track":"14b52a7cbbf7de5606c772c74730c0e8776f39ed72955fef5ae1f7c2d8ccef77","builtin_tracks/tracks/Replica R02 Desert Rally.track":"653286b00f2f04450e698d8b8e9d4ecb268064b323b182d2de9db7d017b22238","builtin_tracks/tracks/Replica R03 Glacier.track":"0e1b42ce51ae91a8702e173013a090d00145e518bb47d7a659cb1d1fdff011b5","builtin_tracks/tracks/Replica R04 Truck Maze.track":"d7b89d64e118506e6cec259057886d9267ca4c6fab570e7ba0d6641e8f822f11","builtin_tracks/tracks/Replica R05 Endurance 500.track":"dde36ad5f627bce65d45a96d46a68497f8d446f6011c9df19ee51ce71375cba8","builtin_tracks/tracks/Replica R06 Mix.track":"9de8d912a59001ea13baa7f1b4f92884b8cddf91978f31e19f3237975713f739","builtin_tracks/tracks/Replica R07 Mirage Marina.track":"8c6764f3accb1a8372d910d57f4f681572dd40c590c4a3d03517379bb360fcd7","builtin_tracks/tracks/Replica R08 Demolition Derby.track":"6f11a9ffbcb477c9d19964566b1b612d2a94675605246e93e21f27bbbdb357ef","builtin_tracks/tracks/Replica R09 Eau Noir.track":"3ec0a78478cca1a4f0d2d98ac81f40783928adf271b70f0c32d295a6da2cdaa9","builtin_tracks/tracks/Replica The Champions Trial.track":"a3bfb76422affc774b44c739b0636d08acb901fa7615b9adcb52c069f79834e1","client.js":"747b85d297a9459ce17aefb468b3688f24e2efc6b6e1598f6b8da48d3b63a677","delivery.py":"6bdba2e87c3e19a41440cb16103695af27105f8bafbae38948bbb1b936ed0c1b","gpu_tickets.py":"b81aadb5ed42cec9212d44da7e7bbb7b413c5bd517383cac0b49ec9b4d659c92","hf-auth.js":"3f3938bbc0935e4e9230c094029ef46e03beea74be199887c50e053e03dafcfe","hf_identity.py":"913fb1e089af21f376e8359a20cbc838d5bcd7971def6989a4382d53c1127b37","index.html":"6f1b8992ed6bb8483ac09ef24c85da01f23e4a8df2b807a7f7fe5e67d4da27ed","native/analysis.patch":"42f79de67cb0734cffb2a7582f5479cab42ab82675884b8b42b9f158d46a98e8","native/build-receipt.json":"559a7e4e382f9f7caa1c5ceb566a5a0bbefad2ed3a2e2cf604e31c9c3890c348","native/source-receipt.json":"36feba861501baf8672884476bbeed5e375254cbb4feffb9f4f90aa61a415a93","portable_bundle.py":"aeeb2a81bcdf50bd013f3fa76e20c7c955c8f15344836596cd1043b1b7171026","requirements.txt":"fc7e0703ad2289fd3926a36efbdce8c61f0edc00f7575a87e2b565e46588c5a4","server.py":"da8ade96d68b89f328ee371d177f7272bd6f1d78832bff34c6eedaa3fe93ef96","star_check.py":"61d35bcede5dab75911b2734ff20cb38f7a06bde9fd58c2eff67f5833b260d40","steam_leaderboard.py":"d76397c39cae58f636ddf9a9be1a46ae3d77fefd6b7269feac73d34d97165481","track-library.js":"351ec4c026b49420ce963f4310cb000d9e987fd28e6dac5ecd0176509340f6e6","track-map.js":"ab5374aa49c7ccec90a787ee8c56cd71beb56b903bf2bbc322783e6f43c009f0","training_config.py":"3d7fcaad585b474380e825649e4add3412494bbd68b48b3b14bd1b954e817ad0","vendor/gradio-client/LICENSE":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","vendor/gradio-client/dist/index.min.js":"fdd776db8633354f118fe2908c980592283968737e6b91dc3aa86d648da5c3fd","vendor/gradio-client/package.json":"96c5b9e6d3587fb7bd8e5bb28775ece222de1043045afc4e6389c88db137ad0e","vendor/hf-oauth/LICENSE":"d6e7b19451c1b3d1d66353bb4b1274138953b3bfd9ae60c56e77b1f548796982","vendor/hf-oauth/index.js":"53282844000a171011e547f6472a3846bb4cecb5071adafea079fcac3a2aee7e","vendor/hf-oauth/package.json":"fafd4d8891023a1961546a7d3bc25cd24f64923a2ebfc449fe6d516a2949bda8","worker.py":"9d7d0d8e8730067658bbd6d5cddb20dca194a42cf885d389e193784fe8f15438"},"interface":"single-engine-runner-with-map-winners-analysis-v1","upstream_revision":"b90b8af06ffc4ea4e4fd703becd1107a48b8e5e0"}
 
1
+ {"backend":"gpu","files":{".gitattributes":"c2ad16718fc51c888d32efc88c8f6e23ebe5fcf6f48e2954f896ba9770f24d72","BETA_TESTING.md":"829dae67ec37dac2a4e7b178ab5ee4fc5f63896af132fbff457a5e35141fe94d","BINARY_PROVENANCE.json":"fa2b6c8962a0ec704ce7db417e7747abfc8af79f9f31effd242c013d8bdeca5f","BUCKET_BUNDLE.md":"cb7a0f023d5a1f93f0288c6a5646b64f8f3e9d36150c0730aea94590e5b80260","CUDA_REFERENCE.md":"f7453c3254d244f8b0de41fde5851cb025159f5cea4a4d1a5d8208a955550c6c","DATA_POLICY.md":"fc5978528abe1c21c14882417ac8a706e04a0831bbd3fdb3de8c64442c1a7b3d","FEEDBACK.md":"f95b8f6afbf4a360976c0edca5d52f5b3a0b668c9a944d4947b840a7c53a122a","FRONTEND_SOURCE.json":"a1e31beb032873eb0f635bfdde4011e1d600d335262c9a33bc9bf1234016c243","GODOT_LICENSE":"fb2b3bb82c60f1e76841ba2122eb902f8e39c151476fe21ce10c9a05d1045304","IMPORTER_BUILD_RECEIPT.json":"4ba5c533cc617105478e4d85c83f456a7dfa68b1388049624619871ba9e42e9d","LICENSE":"53d5851b6440feeae36f72a5f57fcab37858c48b7084765ece4b0c54b9a28ed8","README.md":"c0fb705dff468ea502a0a810f47a450f5d2f42c0c3b0178c3b662b27a327b8a5","STORAGE_BOUNDARY.md":"1d0cab6c82723f1879d7b437bab6b0d21248436bce161f3fbfe6c0e83b9e87a1","TRACK_LIBRARY.md":"be64c91633ef6696233df537afeef4c5175b2d55daac9336758d9eb3d24763c9","UPSTREAM.json":"e71d256ab4fea9a684c211f91086cd8a3eec518686eb54474e79352b20eeed79","WINNERS_AND_EVALUATION.md":"f281cf496763c59c50a79161cfff1a46d3529edfcfaaa14962c9a3f2d4f9446f","analysis_result.py":"0a5d73fe8dbca934b21823b8ffbd50b0baaef8e15a39e32604eefe16f01d1cf2","app.py":"78ddccd56e5c217b89681c5dcbee451b6a5868398c4f75bd2b4db33c235d800f","app_release.py":"7482559c667a665fd3cb6aa8af6c78422a822b515e14589db8306f7fd4860a8b","assets/formula_template.json":"80f745df82bb7be45af52785fd582460bcddc63c5a4e1d8375d85b3122db4c6b","assets/rally_template.json":"7350a3fe28d9b4da7a0965ae6ea7ca3472fb7885303e342310d63a0dce80851c","assets/snowmobile_template.json":"12d30545876011fd6fccdd3e721f9c465938c9c58ac99338205481d5e7ac6742","assets/track-atlas.json":"d97c8900e3e5fb17734b5bd61d1f4f4b196d9be30af9848e2e273ae7e4079ae4","assets/truck_template.json":"a83bffea4d5e818c135ab3aba68a47aa288d6ad0e7b8bd9c95ed0dea9e9df2f7","bin/altd-sim":"3aa1d364e0117f553a52404ae336efcfebd827fc0ca347e811196cbe31e32849","bin/extract_saved_track":"3a7733c45b4301a786fcbfe92660a1c484749272da5f608d62f34878bd4ff31a","bin/libaltd_gpu.so":"3b1b88bccc06a21acc33ac4400af016d55a7e3d8727136a0c43b541f3c7887ca","bucket_storage.py":"73977f5c23c513848a6451fd603609211d829126438db803288ebf4469d1893d","build_info.py":"03efdd1bca81022669a9184667b89d4f1096faba6a83c0514322dd419a938e1f","builtin_tracks.py":"52cb4a285a6079cec7f7610de8af80570f1644a02cf9979e47d2d49736e24cb5","builtin_tracks/catalog.json":"4a7bba4385713e985d1427a0da35dcc32d5ecfd73d93cad7520563deb8685670","builtin_tracks/tracks/Replica A01 Beginner.track":"ca5749537450430794e2eade2e0ac72fa141a4f225e13e2f8ef842abb948ff15","builtin_tracks/tracks/Replica A02 Sharp Turns.track":"097f1ea8edf041112b690d0638075630716ddc03c7d0b1980ddcbeaf5071c8d4","builtin_tracks/tracks/Replica A03 High Speed.track":"88917c63847be1854b989bb28a23af7eeacb964c3e7df9579953aebc9496e6af","builtin_tracks/tracks/Replica A04 Dirt.track":"7f4fe58516227b15898d14bb0abb9a0856126d24fcd793884f051f7a4fae521d","builtin_tracks/tracks/Replica A05 Two Terrains.track":"c4ee2842920d99cdfe3eebdcad59a77e24b626380acef0d02a39ea1e23823e2a","builtin_tracks/tracks/Replica A06 Ice.track":"fccb9a159a06d1b986c6fe7d5bb89c0cabad3a005531f4e0d71f6e37254ada34","builtin_tracks/tracks/Replica A07 Three Terrains.track":"a8fa652ad451e2702a23d5f3429eb0b6a6408bf6a2a76a73d549023e481875c6","builtin_tracks/tracks/Replica A08 Long.track":"3e259bd227776ca847d35baaea88b5e8af57cc920643bf71563176bd6554ad65","builtin_tracks/tracks/Replica A09 Sharpest.track":"5362cea3c564dce8f4f22fcd4b798347931dfaa4e65b84624944952b3e0b0d2a","builtin_tracks/tracks/Replica B01 Oval.track":"0df5755150c145a35edc6c8693f429e5b9ff4b12210ba67cbfcb932c58faf158","builtin_tracks/tracks/Replica B02 Snake.track":"210e699b1fa5f2624a2ff0969b73a20af7bc56bf774f4fd282f6109f80bfdb3c","builtin_tracks/tracks/Replica B03 Slalom.track":"a8bab86f93e3072bf27a81a354220c137207b9fc0b548372c8dab93639a18a24","builtin_tracks/tracks/Replica B04 Rally.track":"9d2fc668a7c86aabb9ca9dbfdbd21dff0d099c5d77029aa2ae96b6c7b9efd3f0","builtin_tracks/tracks/Replica B05 Racetrack.track":"d0804ebc17646d2f7c3be65cfe0f6e94033417e75b101a8c598a69131a170079","builtin_tracks/tracks/Replica B06 Hard.track":"8b1a10fd8485405d7f73abca8890f4845145227177c9ac07ac9a1d79f28908f9","builtin_tracks/tracks/Replica B07 Drift.track":"d6d46216882cb63d55b1e8ce81ffa67f1c95ffd0a86a72806b8fd23973c6ce0a","builtin_tracks/tracks/Replica B08 Arctic Circle.track":"229128e86a87089f781b072a4c677ff729cf8488b1d74ad75cfb43655b9f4a16","builtin_tracks/tracks/Replica B09 Checkered.track":"bec4dbd0edc35e0e4f4d1035c608a0c56bbc99e7301f640f8e2eddba0100b2fe","builtin_tracks/tracks/Replica R01 Blitzring.track":"14b52a7cbbf7de5606c772c74730c0e8776f39ed72955fef5ae1f7c2d8ccef77","builtin_tracks/tracks/Replica R02 Desert Rally.track":"653286b00f2f04450e698d8b8e9d4ecb268064b323b182d2de9db7d017b22238","builtin_tracks/tracks/Replica R03 Glacier.track":"0e1b42ce51ae91a8702e173013a090d00145e518bb47d7a659cb1d1fdff011b5","builtin_tracks/tracks/Replica R04 Truck Maze.track":"d7b89d64e118506e6cec259057886d9267ca4c6fab570e7ba0d6641e8f822f11","builtin_tracks/tracks/Replica R05 Endurance 500.track":"dde36ad5f627bce65d45a96d46a68497f8d446f6011c9df19ee51ce71375cba8","builtin_tracks/tracks/Replica R06 Mix.track":"9de8d912a59001ea13baa7f1b4f92884b8cddf91978f31e19f3237975713f739","builtin_tracks/tracks/Replica R07 Mirage Marina.track":"8c6764f3accb1a8372d910d57f4f681572dd40c590c4a3d03517379bb360fcd7","builtin_tracks/tracks/Replica R08 Demolition Derby.track":"6f11a9ffbcb477c9d19964566b1b612d2a94675605246e93e21f27bbbdb357ef","builtin_tracks/tracks/Replica R09 Eau Noir.track":"3ec0a78478cca1a4f0d2d98ac81f40783928adf271b70f0c32d295a6da2cdaa9","builtin_tracks/tracks/Replica The Champions Trial.track":"a3bfb76422affc774b44c739b0636d08acb901fa7615b9adcb52c069f79834e1","client.js":"96426083c2987332d3393f77bc30438237b186ef0465263f16ba79b304433453","delivery.py":"6bdba2e87c3e19a41440cb16103695af27105f8bafbae38948bbb1b936ed0c1b","gpu_tickets.py":"b81aadb5ed42cec9212d44da7e7bbb7b413c5bd517383cac0b49ec9b4d659c92","help.html":"ea4b9b0a391f956458e745d2579cdeb89946af0d80bbfbf63cf2e07eb8de2eb3","hf-auth.js":"3f3938bbc0935e4e9230c094029ef46e03beea74be199887c50e053e03dafcfe","hf_identity.py":"913fb1e089af21f376e8359a20cbc838d5bcd7971def6989a4382d53c1127b37","index.html":"7c79a0c56e619ae2e86951e805c4e13b76035c618b423278aee69c8e45c51d4d","native/analysis.patch":"42f79de67cb0734cffb2a7582f5479cab42ab82675884b8b42b9f158d46a98e8","native/build-receipt.json":"559a7e4e382f9f7caa1c5ceb566a5a0bbefad2ed3a2e2cf604e31c9c3890c348","native/source-receipt.json":"36feba861501baf8672884476bbeed5e375254cbb4feffb9f4f90aa61a415a93","portable_bundle.py":"aeeb2a81bcdf50bd013f3fa76e20c7c955c8f15344836596cd1043b1b7171026","requirements.txt":"fc7e0703ad2289fd3926a36efbdce8c61f0edc00f7575a87e2b565e46588c5a4","server.py":"1f82c9046324661d7bd4acf1cf37eef3445f985351159d88acdcaf89d1edf859","star_check.py":"61d35bcede5dab75911b2734ff20cb38f7a06bde9fd58c2eff67f5833b260d40","steam_leaderboard.py":"d76397c39cae58f636ddf9a9be1a46ae3d77fefd6b7269feac73d34d97165481","track-library.js":"351ec4c026b49420ce963f4310cb000d9e987fd28e6dac5ecd0176509340f6e6","track-map.js":"ab5374aa49c7ccec90a787ee8c56cd71beb56b903bf2bbc322783e6f43c009f0","training_config.py":"3d7fcaad585b474380e825649e4add3412494bbd68b48b3b14bd1b954e817ad0","vendor/gradio-client/LICENSE":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","vendor/gradio-client/dist/index.min.js":"fdd776db8633354f118fe2908c980592283968737e6b91dc3aa86d648da5c3fd","vendor/gradio-client/package.json":"96c5b9e6d3587fb7bd8e5bb28775ece222de1043045afc4e6389c88db137ad0e","vendor/hf-oauth/LICENSE":"d6e7b19451c1b3d1d66353bb4b1274138953b3bfd9ae60c56e77b1f548796982","vendor/hf-oauth/index.js":"53282844000a171011e547f6472a3846bb4cecb5071adafea079fcac3a2aee7e","vendor/hf-oauth/package.json":"fafd4d8891023a1961546a7d3bc25cd24f64923a2ebfc449fe6d516a2949bda8","worker.py":"9d7d0d8e8730067658bbd6d5cddb20dca194a42cf885d389e193784fe8f15438"},"interface":"single-engine-runner-with-map-winners-analysis-v1","upstream_revision":"b90b8af06ffc4ea4e4fd703becd1107a48b8e5e0"}
STORAGE_BOUNDARY.md CHANGED
@@ -5,7 +5,7 @@ same settings contract is used independently of the selected storage policy.
5
 
6
  | Layer | Current implementation | Lifetime / deletion |
7
  |---|---|---|
8
- | Recipe library | Injected storage adapter, browser localStorage | Explicit save; own-key clear; settings/names/references only |
9
  | Track / network editor | Browser File/Blob objects | Page memory; selected for upload only on Start |
10
  | Built-in replica library | Read-only, allow-listed release files; anonymous catalog/file endpoints | Intentionally persistent shared references; not erased by job deletion; user uploads never enter the catalog |
11
  | Selected built-in track | Synchronized selectors and one verified Blob | Page memory across runs; no cookie, recipe or localStorage persistence |
@@ -20,13 +20,15 @@ same settings contract is used independently of the selected storage policy.
20
  | User private bucket | Separate optional connection; autosave is on by default after connection and can be disabled; explicit Save, Refresh and Restore remain available | Verified run output is sent through the app server only after result deletion is confirmed; a failed save keeps the local candidate; bucket objects remain until managed elsewhere |
21
 
22
  `recipes.cjs` has no host/network dependency. Its `createStore(storage)` receives
23
- only getItem/setItem/removeItem capabilities. A future bucket adapter must keep
24
- the recipe schema separate from the artifact store, not add credentials or file
25
- bytes to recipe JSON. A public profile must not inherit private persistent
26
- artifact storage implicitly. Server cleanup must never clear the recipe library;
27
- clearing recipes must never delete a server job, bucket, or downloaded file.
 
 
28
 
29
- The app has no persistent HF identity or bucket credential storage, telemetry, or automatic recipe upload. Optional bucket authorization requests `write-repos`, which HF describes as read/write access to personal repositories; that scope is broader than one selected bucket, and a bucket-only minimum permission has not been confirmed. Explicit bucket operations and connected autosave send the selected bundle and page-memory OAuth token through this app server. Application-level cleanup does not make provider-wide retention claims. Browser-local storage is site-specific and may be
30
  blocked by browser privacy settings. A local runner and an HF iframe do not
31
  automatically share their library; explicit JSON export/import is the bridge.
32
 
 
5
 
6
  | Layer | Current implementation | Lifetime / deletion |
7
  |---|---|---|
8
+ | Recipe library | Browser localStorage by default; optional explicit private-bucket adapter | Settings, names, and batch references only; bucket actions are separate from run autosave |
9
  | Track / network editor | Browser File/Blob objects | Page memory; selected for upload only on Start |
10
  | Built-in replica library | Read-only, allow-listed release files; anonymous catalog/file endpoints | Intentionally persistent shared references; not erased by job deletion; user uploads never enter the catalog |
11
  | Selected built-in track | Synchronized selectors and one verified Blob | Page memory across runs; no cookie, recipe or localStorage persistence |
 
20
  | User private bucket | Separate optional connection; autosave is on by default after connection and can be disabled; explicit Save, Refresh and Restore remain available | Verified run output is sent through the app server only after result deletion is confirmed; a failed save keeps the local candidate; bucket objects remain until managed elsewhere |
21
 
22
  `recipes.cjs` has no host/network dependency. Its `createStore(storage)` receives
23
+ only getItem/setItem/removeItem capabilities. The optional bucket adapter is
24
+ separate from the browser recipe store and run-artifact store. It moves only the
25
+ validated settings-only recipe library after an explicit user action; it does
26
+ not add credentials or file bytes to recipe JSON. Bucket import asks before
27
+ replacing the browser library and never starts a run. Server cleanup must never
28
+ clear the recipe library; clearing recipes must never delete a server job,
29
+ bucket, or downloaded file.
30
 
31
+ The app has no persistent HF identity or bucket credential storage or telemetry. Recipe uploads are never automatic. Optional bucket authorization requests `write-repos`, which HF describes as read/write access to personal repositories; that scope is broader than one selected bucket, and a bucket-only minimum permission has not been confirmed. Explicit bucket operations and connected run autosave send the selected bundle or settings-only recipe library and page-memory OAuth token through this app server. Application-level cleanup does not make provider-wide retention claims. Browser-local storage is site-specific and may be
32
  blocked by browser privacy settings. A local runner and an HF iframe do not
33
  automatically share their library; explicit JSON export/import is the bridge.
34
 
WINNERS_AND_EVALUATION.md CHANGED
@@ -2,6 +2,15 @@
2
 
3
  Training still uses the recipe you select. This app adds records you can inspect afterwards; it does not choose a curriculum or change your rewards automatically.
4
 
 
 
 
 
 
 
 
 
 
5
  ## What a training result preserves
6
 
7
  - **Fitness winner:** the best car under your selected reward recipe in the final evaluated population. This is the usual primary network download.
 
2
 
3
  Training still uses the recipe you select. This app adds records you can inspect afterwards; it does not choose a curriculum or change your rewards automatically.
4
 
5
+ ## Continue a winner or evaluate it unchanged
6
+
7
+ After **Download result** receives the run (or connected bucket autosave finishes), the result panel lists the available winners. Select a role in **Winner to continue or evaluate**, then choose what to do with it:
8
+
9
+ - **Continue training** stages that winner's weights as the next training input and returns the run mode to training. It does not start a run. The selected track is retained unless you choose another one.
10
+ - **Evaluate unchanged** stages the same weights for frozen evaluation. It does not start a run or mutate the controller.
11
+
12
+ In either case, review the track and settings, then click the run button when you are ready. It reads **Run training** in training mode and **Evaluate policy (weights frozen)** in frozen mode. The winner action only prepares the next run; it does not start it or reuse the previous run's measurements as new evidence.
13
+
14
  ## What a training result preserves
15
 
16
  - **Fitness winner:** the best car under your selected reward recipe in the final evaluated population. This is the usual primary network download.
builtin_tracks/catalog.json CHANGED
@@ -7,8 +7,8 @@
7
  "artwork_or_opponent_controllers_included": false,
8
  "original_race_parameters_included": false,
9
  "native_geometry_catalog_included": false,
10
- "integration_status": "local_input_and_native_import_verified_not_deployed",
11
- "challenge_runtime_status": "definitions_transferred_not_evaluated_by_current_HF_worker",
12
  "tracks": [
13
  {
14
  "file": "tracks/Replica A01 Beginner.track",
 
7
  "artwork_or_opponent_controllers_included": false,
8
  "original_race_parameters_included": false,
9
  "native_geometry_catalog_included": false,
10
+ "integration_status": "hosted_worker_accepts_bundled_replicas_not_original_game_validated",
11
+ "challenge_runtime_status": "supported_conditions_receive_bounded_fixed_policy_prediction; original_opponent_races_and_unsupported_conditions_not_evaluated",
12
  "tracks": [
13
  {
14
  "file": "tracks/Replica A01 Beginner.track",
client.js CHANGED
@@ -49,7 +49,7 @@ const trackSource=()=>trackLibrary?trackLibrary.file():Promise.resolve($('track'
49
  async function runTrackSource(priorContext=null){
50
  const trackInfo=trackLibrary?.info()??{source:'upload'},file=await trackSource();
51
  if(file)return {file,trackInfo};
52
- if(trackInfo.source==='upload'&&$('run_mode')?.value==='evaluate'&&selectedWinner&&priorContext?.trackBytes?.length){
53
  return {file:new Blob([priorContext.trackBytes],{type:'application/octet-stream'}),trackInfo:priorContext.trackInfo??trackInfo};
54
  }
55
  throw Error('Choose or select a track before starting this run.');
@@ -82,6 +82,8 @@ function buttons() {
82
  if($('analysis_download'))$('analysis_download').disabled=busy||!localAnalysis;
83
  if($('descriptor_show'))$('descriptor_show').disabled=busy||!localAnalysis||localAnalysis.mode!=='train';
84
  if($('compare_winners'))$('compare_winners').disabled=busy||!localAnalysis||!selectedWinnerRoles().length;
 
 
85
  if($('compare_add'))$('compare_add').disabled=busy||!localAnalysis||localAnalysis.mode!=='evaluate';
86
  if($('bundle_export'))$('bundle_export').disabled=unavailable||pairedAnalysisPending;
87
  if($('bundle_import'))$('bundle_import').disabled=unavailable;
@@ -111,7 +113,34 @@ function syncRunModeUI(unavailable=busy||!!job||bundleRestoring||bucketOperation
111
  ?'Frozen evaluation uses the selected policy unchanged in a fresh car. Mutation, decay, crossover, reproduction and winner selection are disabled.'
112
  :'Training uses your selected recipe and records winner policies and per-car measurements.';
113
  }
114
- if($('run_mode'))$('run_mode').addEventListener('change',()=>{syncRunModeUI();buttons();});
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  function renderBucketConnection(){
116
  const connected=!!bucketToken&&!!bucketId;
117
  const authorized=!!window.HFAuth?.getStorageToken?.();
@@ -645,18 +674,20 @@ function renderAnalysisPanel(){
645
  const laps=document.createElement('td');laps.textContent=w.status==='available'?String(w.forward_laps):'—';
646
  const contacts=document.createElement('td');contacts.textContent=w.status==='available'?String(w.physical_contacts):'—';
647
  const distance=document.createElement('td');distance.textContent=w.status==='available'&&w.total_actual_distance!==null?w.total_actual_distance.toFixed(3):'Not reported';
648
- const action=document.createElement('td');if(w.status==='available'){const option=document.createElement('option');option.value=role;option.textContent=label+' · '+w.candidate_id;select.append(option);const button=document.createElement('button');button.type='button';button.textContent='Use policy';button.onclick=()=>useWinner(role);const download=document.createElement('button');download.type='button';download.textContent='Download weights';download.onclick=()=>downloadBytes(localAnalysis.winnerNetworks[role].bytes,'ald-winner-'+role+'-'+w.candidate_id+'.evolution','application/octet-stream');action.append(button,download);}else action.textContent='—';
649
  for(const cell of [checkCell,candidate,id,gen,fitness,lap,laps,contacts,distance,action])tr.append(cell);tbody.append(tr);
650
  }
651
  if($('evaluationStatus'))$('evaluationStatus').textContent=summary.mode==='evaluate'?'Frozen evaluation complete. Scores are not shown as winner fitness; these physical measurements describe this policy and conditions.':'Choose policies to compare by selecting winner roles.';
652
  renderEvaluationRows();
653
  }
654
- async function useWinner(role){
 
655
  const item=localAnalysis?.winnerNetworks?.[role]??comparisonPlan?.winnerNetworks?.[role];if(!item)throw Error('That winner policy is unavailable');
656
  const file=new File([item.bytes],role+'-'+item.candidate_id+'.evolution',{type:'application/octet-stream'});
657
  window.TrainingClient.useNetwork(file);selectedWinner=role;
658
  if($('winner_continue'))$('winner_continue').value=role;
659
- if($('run_mode'))$('run_mode').value='evaluate';syncRunModeUI();buttons();say('Selected '+role.replaceAll('_',' ')+' policy for frozen evaluation. Choose the same track and conditions for comparisons.');
 
660
  }
661
  function renderEvaluationRows(){
662
  const tbody=$('evaluationRows');if(!tbody)return;tbody.replaceChildren();
@@ -732,7 +763,9 @@ if($('compare_winners'))$('compare_winners').onclick=async()=>{
732
  $('run').click();
733
  }catch(error){$('analysisStatus').textContent='Comparison could not start: '+error.message;$('evaluationStatus').textContent=error.message;}
734
  };
735
- if($('winner_use'))$('winner_use').onclick=()=>useWinner($('winner_continue').value||'fitness');
 
 
736
  if($('descriptor_show'))$('descriptor_show').onclick=showDescriptor;
737
  if($('compare_add'))$('compare_add').onclick=addFrozenEvaluation;
738
  if($('compare_clear'))$('compare_clear').onclick=()=>{comparisonRows=[];comparisonPlan=null;renderEvaluationRows();if($('evaluationStatus'))$('evaluationStatus').textContent='Comparison cleared.';};
 
49
  async function runTrackSource(priorContext=null){
50
  const trackInfo=trackLibrary?.info()??{source:'upload'},file=await trackSource();
51
  if(file)return {file,trackInfo};
52
+ if(trackInfo.source==='upload'&&selectedWinner&&priorContext?.trackBytes?.length){
53
  return {file:new Blob([priorContext.trackBytes],{type:'application/octet-stream'}),trackInfo:priorContext.trackInfo??trackInfo};
54
  }
55
  throw Error('Choose or select a track before starting this run.');
 
82
  if($('analysis_download'))$('analysis_download').disabled=busy||!localAnalysis;
83
  if($('descriptor_show'))$('descriptor_show').disabled=busy||!localAnalysis||localAnalysis.mode!=='train';
84
  if($('compare_winners'))$('compare_winners').disabled=busy||!localAnalysis||!selectedWinnerRoles().length;
85
+ if($('winner_continue_train'))$('winner_continue_train').disabled=unavailable||!localAnalysis?.winnerNetworks?.[$('winner_continue')?.value||'fitness'];
86
+ if($('winner_use'))$('winner_use').disabled=unavailable||!localAnalysis?.winnerNetworks?.[$('winner_continue')?.value||'fitness'];
87
  if($('compare_add'))$('compare_add').disabled=busy||!localAnalysis||localAnalysis.mode!=='evaluate';
88
  if($('bundle_export'))$('bundle_export').disabled=unavailable||pairedAnalysisPending;
89
  if($('bundle_import'))$('bundle_import').disabled=unavailable;
 
113
  ?'Frozen evaluation uses the selected policy unchanged in a fresh car. Mutation, decay, crossover, reproduction and winner selection are disabled.'
114
  :'Training uses your selected recipe and records winner policies and per-car measurements.';
115
  }
116
+ if($('run_mode'))$('run_mode').addEventListener('change',()=>{
117
+ syncRunModeUI();buttons();
118
+ if(selectedWinner)say($('run_mode').value==='train'
119
+ ?'Selected policy is staged as the starting network for training. The next Run click starts a training run with the selected recipe.'
120
+ :'Selected policy is ready for frozen evaluation. Its weights stay unchanged; the next Run click starts it.');
121
+ });
122
+ function showFirstRunTab(tab,focusId){
123
+ document.querySelector('[data-tab="'+tab+'"]')?.click();
124
+ requestAnimationFrame(()=>$(focusId)?.focus());
125
+ }
126
+ if($('first_run_track'))$('first_run_track').onclick=()=>showFirstRunTab('drive','trackPresetDrive');
127
+ if($('first_run_settings'))$('first_run_settings').onclick=()=>showFirstRunTab('training','population');
128
+ if($('starter_create'))$('starter_create').onclick=async()=>{
129
+ try{
130
+ if(busy||job||bundleRestoring||bucketOperation)throw Error('Wait for the current operation to finish before changing the selected network');
131
+ if(networkSource()||localResult){
132
+ if(!(await window.appConfirm('Replace the selected network with a new small starter? This does not start a run. The received result stays in this page until you discard it or close the page.',{heading:'Create starter network',confirmLabel:'Replace with starter'})))return;
133
+ }
134
+ const type=Number($('starter_vehicle').value),outputs=type===2?[0,1,3,4]:[0,1,2,3,4];
135
+ const value=window.NetworkEditor.fresh({type,shape:[6,4],outputs,seed:42105,xavier:true,bias:false,name:'Fresh '+['Formula','Rally','Snowmobile','Truck'][type]+' starter'});
136
+ const compressed=await new Response(new Blob([JSON.stringify(value)]).stream().pipeThrough(new CompressionStream('gzip'))).blob();
137
+ if(compressed.size>1048576)throw Error('Starter network exceeds the supported file limit');
138
+ if(busy||job||bundleRestoring||bucketOperation)throw Error('A run or storage action started before the starter was ready');
139
+ window.TrainingClient.useNetwork(new File([compressed],'starter-'+['formula','rally','snowmobile','truck'][type]+'-6-4.evolution',{type:'application/octet-stream'}));
140
+ selectedWinner=null;$('starter_network_status').textContent='Small '+['Formula','Rally','Snowmobile','Truck'][type]+' network created and selected in this page. No run started; choose a track and click Run when ready.';
141
+ say('Starter network is ready. Choose a track, review settings if needed, then start the run yourself.');buttons();
142
+ }catch(error){$('starter_network_status').textContent='Starter not created: '+displayError(error);}
143
+ };
144
  function renderBucketConnection(){
145
  const connected=!!bucketToken&&!!bucketId;
146
  const authorized=!!window.HFAuth?.getStorageToken?.();
 
674
  const laps=document.createElement('td');laps.textContent=w.status==='available'?String(w.forward_laps):'—';
675
  const contacts=document.createElement('td');contacts.textContent=w.status==='available'?String(w.physical_contacts):'—';
676
  const distance=document.createElement('td');distance.textContent=w.status==='available'&&w.total_actual_distance!==null?w.total_actual_distance.toFixed(3):'Not reported';
677
+ const action=document.createElement('td');if(w.status==='available'){const option=document.createElement('option');option.value=role;option.textContent=label+' · '+w.candidate_id;select.append(option);const download=document.createElement('button');download.type='button';download.textContent='Download weights';download.onclick=()=>downloadBytes(localAnalysis.winnerNetworks[role].bytes,'ald-winner-'+role+'-'+w.candidate_id+'.evolution','application/octet-stream');action.append(download);}else action.textContent='—';
678
  for(const cell of [checkCell,candidate,id,gen,fitness,lap,laps,contacts,distance,action])tr.append(cell);tbody.append(tr);
679
  }
680
  if($('evaluationStatus'))$('evaluationStatus').textContent=summary.mode==='evaluate'?'Frozen evaluation complete. Scores are not shown as winner fitness; these physical measurements describe this policy and conditions.':'Choose policies to compare by selecting winner roles.';
681
  renderEvaluationRows();
682
  }
683
+ async function useWinner(role,mode='evaluate'){
684
+ if(mode!=='train'&&mode!=='evaluate')throw Error('Choose whether to continue training or evaluate unchanged weights');
685
  const item=localAnalysis?.winnerNetworks?.[role]??comparisonPlan?.winnerNetworks?.[role];if(!item)throw Error('That winner policy is unavailable');
686
  const file=new File([item.bytes],role+'-'+item.candidate_id+'.evolution',{type:'application/octet-stream'});
687
  window.TrainingClient.useNetwork(file);selectedWinner=role;
688
  if($('winner_continue'))$('winner_continue').value=role;
689
+ if($('run_mode'))$('run_mode').value=mode;syncRunModeUI();buttons();
690
+ say(mode==='train'?'Selected '+role.replaceAll('_',' ')+' policy as the starting network for a new training run. The next Run click starts it with the selected recipe.':'Selected '+role.replaceAll('_',' ')+' policy for frozen evaluation. Its weights will stay unchanged; the next Run click starts it.');
691
  }
692
  function renderEvaluationRows(){
693
  const tbody=$('evaluationRows');if(!tbody)return;tbody.replaceChildren();
 
763
  $('run').click();
764
  }catch(error){$('analysisStatus').textContent='Comparison could not start: '+error.message;$('evaluationStatus').textContent=error.message;}
765
  };
766
+ if($('winner_continue'))$('winner_continue').addEventListener('change',buttons);
767
+ if($('winner_continue_train'))$('winner_continue_train').onclick=()=>useWinner($('winner_continue').value||'fitness','train');
768
+ if($('winner_use'))$('winner_use').onclick=()=>useWinner($('winner_continue').value||'fitness','evaluate');
769
  if($('descriptor_show'))$('descriptor_show').onclick=showDescriptor;
770
  if($('compare_add'))$('compare_add').onclick=addFrozenEvaluation;
771
  if($('compare_clear'))$('compare_clear').onclick=()=>{comparisonRows=[];comparisonPlan=null;renderEvaluationRows();if($('evaluationStatus'))$('evaluationStatus').textContent='Comparison cleared.';};
help.html ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta name="color-scheme" content="dark light">
7
+ <title>AI Learns to Drive — Help</title>
8
+ <style>
9
+ :root{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:#e8eef6;background:#101923;line-height:1.6}*{box-sizing:border-box}body{margin:0}.wrap{width:min(920px,100% - 32px);margin:0 auto;padding:28px 0 56px}header,.section{background:#172330;border:1px solid #304255;border-radius:14px;padding:22px;margin:0 0 16px}h1,h2{line-height:1.2;margin-top:0}h1{font-size:clamp(1.8rem,5vw,2.6rem);margin-bottom:.45rem}h2{font-size:1.35rem;margin-bottom:.6rem}p,ul,ol{max-width:74ch}a{color:#8dc8ff}a:focus-visible{outline:3px solid #ffd166;outline-offset:3px;border-radius:3px}.eyebrow{color:#a8c9e8;font-size:.8rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.lead{font-size:1.08rem}.callout{border-left:4px solid #62c7a5;padding:.65rem 1rem;background:#112b2b;border-radius:0 8px 8px 0}nav ul{display:flex;flex-wrap:wrap;gap:.45rem 1.1rem;padding-left:1.2rem}.steps li{margin:.6rem 0}.pill{display:inline-block;background:#24364a;border-radius:999px;padding:.15rem .55rem;font-size:.9rem}.small{color:#bdc8d5;font-size:.94rem}code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;color:#d8e8fb}footer{padding:8px 4px;color:#bdc8d5}@media(max-width:600px){.wrap{width:min(100% - 20px,920px);padding-top:10px}header,.section{padding:16px;border-radius:10px}nav ul{display:block}nav li{margin:.25rem 0}}
10
+ </style>
11
+ </head>
12
+ <body>
13
+ <main class="wrap">
14
+ <header>
15
+ <p class="eyebrow">A bounded simulator experiment</p>
16
+ <h1>AI Learns to Drive — Help</h1>
17
+ <p class="lead">Create or load a driving controller, train a population of candidates, and inspect what happened. The app simulates cars behind the scenes. The map is a track-layout and terrain preview; it does not show cars driving.</p>
18
+ <p class="small">This guide opens in a new tab to keep your current run and unsaved choices in place. Close this tab to return to the lab.</p>
19
+ <p class="callout">You can try the built-in replica tracks and browser network editor without installing the original game. This lab does not reproduce the full game, award official stars, or change game progress.</p>
20
+ <nav aria-label="Help topics"><ul>
21
+ <li><a href="#first-run">Start a run</a></li><li><a href="#concepts">Basic ideas</a></li><li><a href="#continue">Continue a winner</a></li><li><a href="#compare">Compare policies</a></li><li><a href="#storage">Files and storage</a></li><li><a href="#limits">Limits and compute</a></li><li><a href="#feedback">Feedback</a></li>
22
+ </ul></nav>
23
+ </header>
24
+
25
+ <section class="section" id="first-run">
26
+ <h2>Start your first run</h2>
27
+ <ol class="steps">
28
+ <li>On <strong>Drive &amp; view</strong>, click <strong>Choose a track</strong> and select a built-in replica, or upload a <code>.track</code> file.</li>
29
+ <li>Pick a vehicle for a new network, then click <strong>Create starter network</strong>. It makes a small controller in this page only; it does not start training. You can instead upload a compatible <code>.evolution</code> file or use <strong>Network editor</strong>.</li>
30
+ <li>Click <strong>Review first-run settings</strong>. The starting settings are 32 candidates, 20 generations, and 900 ticks per generation (15 simulated seconds per car per generation), mutation 0.3, decay 0, one parent, and one elite candidate. The reward is distance-only (+100); collision and idle elimination are off. These values are a starting experiment, not a promise of a lap.</li>
31
+ <li>Choose <strong>CPU — no GPU allowance</strong> for the no-sign-in option. Under <strong>Action</strong>, select <strong>Train a population</strong>, then click <strong>Run training</strong>. For an unchanged single controller, select <strong>Frozen evaluation · one policy, unchanged weights</strong>; the run button changes to <strong>Evaluate policy (weights frozen)</strong>.</li>
32
+ <li>When the run finishes, click <strong>Download result</strong> to receive the controller and reveal winner and challenge details. If connected bucket autosave is on, it handles result delivery for you.</li>
33
+ </ol>
34
+ <p class="small">To restore the form's starter values later, use <strong>Apply first-run settings to this form</strong>. This changes the current form only; saved recipes stay as they are.</p>
35
+ </section>
36
+
37
+ <section class="section" id="concepts">
38
+ <h2>Basic ideas</h2>
39
+ <ul>
40
+ <li><strong>Network or controller:</strong> reads its configured sensors and produces vehicle controls. Its vehicle type and output order are part of the file.</li>
41
+ <li><strong>Population:</strong> a group of candidate controllers evaluated during training.</li>
42
+ <li><strong>Generation:</strong> one round of simulation and selection. Training may mutate or recombine candidates between generations.</li>
43
+ <li><strong>Reward:</strong> a weighted choice of measured outcomes the trainer should favor. Reward settings guide selection; they do not change the simulator's physics.</li>
44
+ <li><strong>Frozen evaluation:</strong> runs one policy with unchanged weights. It does not train or create a winner population.</li>
45
+ <li><strong>Recipe:</strong> a reusable set of training settings and reward choices. Recipes are saved in this browser by default; they do not contain networks, tracks, or results.</li>
46
+ </ul>
47
+ <p>Training measurements and fresh challenge checks are simulator results for reconstructed tracks. A supported challenge check replays the named current network with fixed weights; it does not accumulate stars across runs or evaluate original-game opponent races.</p>
48
+ <p>Challenge checks use the selected driving settings, including collision elimination, and the chosen run duration or the track’s longer challenge deadline, capped at 300 simulated seconds. This extra replay may add processing time. A condition that is not met within that replay is not proof that the network could never meet it in a longer run.</p>
49
+ </section>
50
+
51
+ <section class="section" id="continue">
52
+ <h2>Continue a winner</h2>
53
+ <p>After the result has been received, select a role from <strong>Winner to continue or evaluate</strong>:</p>
54
+ <ul>
55
+ <li>Click <strong>Continue training</strong> to stage those weights as the next training input and return the form to training mode.</li>
56
+ <li>Click <strong>Evaluate unchanged</strong> to stage the same weights for frozen evaluation.</li>
57
+ </ul>
58
+ <p>Neither choice starts a run. Review the track and settings, then click <strong>Run training</strong> or <strong>Evaluate policy (weights frozen)</strong> to start the selected action. The chosen track is retained unless you change it. The prior run's measurements are not reused as new evidence.</p>
59
+ <p>Fitness winner means the best candidate under your chosen reward in the final generation. Fastest lap is the fastest completed forward lap observed during training. A clean-lap winner must meet the configured forward-lap count with zero physical contacts. One controller may fill multiple roles, and a role can be unavailable.</p>
60
+ </section>
61
+
62
+ <section class="section" id="compare">
63
+ <h2>Compare policies</h2>
64
+ <p>Frozen comparison runs selected policies in fresh simulations with their weights unchanged. Use the same track, vehicle, duration, controller frequency, collision and idle settings, and compute backend when you want a direct comparison. The app marks incompatible conditions instead of treating them as equivalent.</p>
65
+ <p>Look at lap time, completed laps, contacts, distance, and challenge status together. A short run may end before a lap or challenge deadline. A challenge result is a bounded prediction for the replica track conditions; it is not an original-game award or a Steam leaderboard result.</p>
66
+ </section>
67
+
68
+ <section class="section" id="storage">
69
+ <h2>Files, privacy, and storage</h2>
70
+ <p>Your selected files stay in the browser until you start a run or explicitly save/export them. Processing copies and undelivered results are temporary; results expire within five minutes and are deleted after verified browser receipt by default. The app's cleanup does not establish provider-wide zero-data retention.</p>
71
+ <p>Run results stay in page memory after download until you discard them, replace them, or close the page. Download the network or a portable bundle if you want a local copy.</p>
72
+ <p>Recipes are settings-only and save in this browser by default. Local JSON export/import is also available. Optional private-bucket storage requires a separate explicit HF authorization; its <code>write-repos</code> permission is broader than one bucket. After connecting an existing private bucket, automatic run saving starts on by default and can be turned off. Recipe-library save/list/import are separate actions and transfer settings only; importing asks before replacing the local recipe library and never starts a run. The app does not create or delete buckets.</p>
73
+ <p>Read the full <a href="/policy" target="_blank" rel="noopener">data policy</a> before using private files or bucket storage.</p>
74
+ </section>
75
+
76
+ <section class="section" id="limits">
77
+ <h2>Limits and compute</h2>
78
+ <p>The worker supports Formula, Rally, Snowmobile, and Truck. Networks support at most 20 inputs, 12 total layers, and 16 neurons per hidden layer. Formula, Rally, and Truck support up to five outputs; Snowmobile supports up to four and cannot use Handbrake. Fresh controllers for every vehicle require Steering and Acceleration; Formula imports retain their supported ordered output subsets.</p>
79
+ <p>The runner limits a job to 4,000,000 population × generation × tick units and a 25-second training execution window. Results and analysis have separate size limits. These are bounded vanilla-worker limits, not support for arbitrary modified-game networks or full original-game parity.</p>
80
+ <p>The public GPU app also provides CPU execution without GPU allowance. GPU runs use HF allowance; optional HF sign-in can associate a request with your account but does not guarantee quota. Sign-in can reload the page, so do it before choosing files if needed.</p>
81
+ <p>These are bounded vanilla-worker limits. They do not cover arbitrary modified-game networks or establish full original-game physics parity.</p>
82
+ </section>
83
+
84
+ <section class="section" id="feedback">
85
+ <h2>Feedback</h2>
86
+ <p><a href="https://github.com/seeker-cyber-maker/driving_sim_rs/issues/new" target="_blank" rel="noopener">Open an editable GitHub issue draft</a>. It is not submitted automatically. Review the draft before posting and remove private names or data. Do not attach tokens, job keys, private networks, proprietary tracks, or unrelated logs.</p>
87
+ </section>
88
+ <footer><a href="/" target="_blank" rel="noopener">Open the training app</a><p class="small">This opens a fresh app page. Close this guide tab to return to your existing page.</p></footer>
89
+ </main>
90
+ </body>
91
+ </html>
index.html CHANGED
@@ -28,8 +28,9 @@
28
  };
29
  })();
30
  </script>
31
- <header><div class="eyebrow">AI LEARNS TO DRIVE · TRAINING LAB</div><h1>Train, inspect, repeat.</h1><p class="intro">Pick a track and network, run a bounded training session, and keep your recipes in this browser.</p><details class="about"><summary>About this beta and its data handling</summary><p>Simulator by <a href="https://github.com/Zorro909/driving_sim_rs">Zorro909</a>; interface and hosting by <a href="https://github.com/seeker-cyber-maker/driving_sim_rs">TiGa</a>. Inspired by the <a href="https://store.steampowered.com/app/3312030/AI_Learns_To_Drive/">game by ActivationFunction</a>. Built-in tracks are reconstructed replicas. For supported conditions, the lab checks the run’s final fitness policy (or frozen input) with a bounded fresh replay. It predicts conditions only and does not award or accumulate original-game stars; opponent races and other unsupported conditions remain unchecked.</p><p>Uploaded files are used for the requested run. Results are held briefly in application memory and deleted after verified download or expiry. Browser recipes contain settings only. <a href="/policy" target="_blank" rel="noopener">Read the data policy</a>.</p></details><p><a id="feedbackLink" href="https://github.com/seeker-cyber-maker/driving_sim_rs/issues/new" target="_blank" rel="noopener">Report a problem on GitHub</a> · Opens an editable draft and never submits it. Review details before posting; export a run receipt separately if it helps explain the issue.</p><p id="buildLabel" class="hint">Build: connecting…</p></header>
32
- <nav class="tabs" aria-label="Lab sections"><button data-tab="drive" aria-selected="true">1 · Drive & view</button><button data-tab="training" aria-selected="false">2 · Training runs & presets</button><button data-tab="batch" aria-selected="false">3 · Batches</button><button data-tab="editor" aria-selected="false">4 · Network editor</button></nav><div id="drive" class="pane"><div class="grid"><section class="card"><h2>Simulation</h2><label for="run_mode">Action</label><select id="run_mode"><option value="train" selected>Train a population</option><option value="evaluate">Frozen evaluation · one policy, unchanged weights</option></select><p id="run_mode_help" class="hint">Training uses the selected recipe. Frozen evaluation runs the selected policy in a fresh car without changing its weights.</p><button id="run" disabled>Run training</button><p id="starCheckNotice" class="hint">After a run, the app automatically checks challenges for the current network when this track provides them. It uses the same driving settings with fixed weights and the selected run duration, or the track's longer challenge deadline up to 300 seconds, so the run may take longer. It checks this network only; it does not award game stars or combine progress across runs.</p><p class="hint">Select or create a network below to enable training. Review settings on tab 2 before running.</p><p>Supports Formula, Rally, Snowmobile and Truck networks. Control outputs follow the original vehicle editor rules. Network shape and supported sensors are bounded by the original game contract.</p>
 
33
  <p id="computeBlock"><label for="backend">Compute</label><select id="backend" disabled><option value="cpu">CPU — no GPU allowance</option><option id="gpuOption" value="gpu" disabled>GPU — uses GPU allowance</option></select></p><p id="backendNote" class="hint">Checking available backends…</p>
34
  <div id="connectionRecovery" hidden><button id="retry" type="button">Reconnect to app</button><p class="hint">Checks server availability. Does not restart training, sign you in, or reset GPU allowance.</p></div>
35
  <div id="gpuAccount" aria-label="Optional GPU account"><p><button id="hfSignIn" type="button" disabled>Sign in with HF for account GPU allowance</button><span id="hfAccount" hidden></span> <button id="hfSignOut" type="button" disabled hidden>Disconnect account</button></p><p id="hfIdentity" role="status" class="hint">CPU needs no sign-in. Checking optional GPU account connection…</p>
@@ -51,7 +52,7 @@
51
  <div id="winnerTools" hidden>
52
  <p class="hint">A network can fill more than one winner role. Select roles to compare; duplicate policies run once. Fitness is final-generation population-relative and is not compared across generations or policy evaluations.</p>
53
  <div class="table-scroll"><table><thead><tr><th>Compare</th><th>Role</th><th>Candidate</th><th>Generation / car</th><th>Selection fitness</th><th>Best lap</th><th>Forward laps</th><th>Physical contacts</th><th>Distance (simulation units)</th><th>Action</th></tr></thead><tbody id="winnerRows"></tbody></table></div>
54
- <p><label for="winner_continue">Network to continue or save</label><select id="winner_continue"><option value="">Primary fitness result</option></select> <button id="winner_use" type="button">Use selected network</button></p>
55
  <div class="toolbar"><button id="compare_winners" type="button" disabled>Compare selected winners</button><button id="analysis_download" type="button" disabled>Download full analysis archive</button></div><p class="hint">Comparison starts one frozen evaluation per distinct selected policy, in sequence. It uses the currently selected track, vehicle, tick limit, control rate and collision/idle settings, then holds those conditions fixed for the full comparison.</p>
56
  <details><summary>Inspect complete measurements for an evaluated car</summary><div class="row"><label for="descriptor_generation">Generation<input id="descriptor_generation" type="number" min="1" value="1"></label><label for="descriptor_car">Car index<input id="descriptor_car" type="number" min="0" value="0"></label></div><button id="descriptor_show" type="button" disabled>Show all descriptors</button><p id="descriptor_status" role="status"></p><div id="descriptor_tables"></div></details>
57
  </div>
@@ -64,25 +65,25 @@
64
  <details id="bucketStorage"><summary>Connect to an existing private bucket</summary><p>Bucket storage is optional. Authorizing storage also identifies your account for GPU requests; ordinary GPU sign-in remains available with the basic identity permission. Then enter your existing private bucket ID. Connected runs automatically save by default; uncheck this option to keep run saves manual. No personal token is requested or stored.</p><p id="bucket_scope_notice" class="privacy-note">HF describes the requested <code>write-repos</code> permission as read/write access to your personal repositories. That grant is broader than one selected bucket and is not a bucket-only permission; the app limits its own operations to the bucket you enter. The minimum current scope for bucket read/write has not been confirmed by HF.</p><button id="bucket_authorize" type="button" hidden disabled>Authorize bucket access with HF</button><p id="bucket_auth_unavailable" class="hint" hidden>HF bucket authorization is unavailable for this app. Local bundle export remains available.</p><p id="bucket_auth_status" role="status" aria-live="polite">Checking optional HF bucket authorization…</p><div id="bucketConnectForm" hidden><label for="bucket_id">Private bucket ID</label><input id="bucket_id" type="text" autocomplete="off" placeholder="username/bucket-name" disabled><button id="bucket_connect" type="button" disabled>Connect bucket</button></div><div id="bucketConnected" hidden><p id="bucket_account"></p><label class="keep-result"><input id="bucket_autosave" type="checkbox" checked> Automatically save every verified completed network and run log to this bucket</label><p class="hint">For each completed run, the browser fetches and verifies the network, then confirms server deletion before sending the network and sanitized log to your bucket. If deletion is not confirmed, no save occurs. If bucket saving is not confirmed, the verified local candidate stays available to download or retry; the remote save may have completed. Each batch step saves before the next starts, and a failed save stops the batch.</p><button id="bucket_disconnect" type="button">Disconnect bucket and clear HF authorization</button><div class="toolbar"><button id="bucket_save" type="button" disabled>Save selected bundle</button><button id="bucket_refresh" type="button" disabled>Refresh saved bundles</button></div><label for="bucket_items">Saved bundles from this app</label><select id="bucket_items" size="4" disabled><option value="">Refresh to list saved bundles</option></select><button id="bucket_restore" type="button" disabled>Restore selected bundle</button><hr><h3 id="bucketRecipeTitle" tabindex="-1">Recipe library (settings only)</h3><p class="hint">Save and import the validated recipes and batch definitions from this browser. This 32 KB library contains settings only; networks, tracks, run results and access tokens are never included. Import asks before replacing the local recipe library and never starts a run.</p><div class="toolbar"><button id="bucket_recipe_save" type="button" disabled>Save recipe library</button><button id="bucket_recipe_refresh" type="button" disabled>Refresh saved recipe libraries</button></div><label for="bucket_recipe_items">Saved recipe libraries</label><select id="bucket_recipe_items" size="4" disabled><option value="">Refresh to list saved recipe libraries</option></select><button id="bucket_recipe_import" type="button" disabled>Import selected recipe library</button><p id="bucket_recipe_status" role="status" aria-live="polite">No recipe library bucket action requested.</p></div><p id="bucket_status" role="status" aria-live="polite">Not connected. Bucket storage is optional.</p></details></details>
65
  <p id="deadline"></p><p id="status" role="status">Ready. Inputs remain on this device until you run the test.</p>
66
  <details><summary>Effective training settings</summary><pre id="effectiveSettings"></pre></details><details><summary>Generation results</summary><pre id="generationHistory"></pre></details><details><summary>About star challenge checks</summary><p>After a run, supported conditions are checked against its named policy with a bounded fresh replay. Results appear in the Star challenge check panel when available. These are predictions for the reconstructed replica track, not original-game awards; opponent races and unsupported conditions are left unchecked.</p></details></section></div>
67
- </div><section id="training" class="pane" hidden><div class="card"><h2>Training settings</h2><p class="hint">Choose the track on Drive & view. Choose the training settings and reward mix here, then start the run on Drive & view. Recipes and batch sequences are saved in this browser.</p><p><label for="trackPresetTraining">Training track</label><select id="trackPresetTraining" data-track-library disabled><option value="">Upload a custom track</option></select></p><p data-track-status role="status" class="hint">Loading built-in replica tracks…</p><div id="training_controls"><label for="training_ticks">Simulated ticks per generation</label><input id="training_ticks" type="number" min="1" max="18000" value="60"><small>60 ticks = one simulated second. Current preview limit: population × generations × ticks ≤ 4,000,000; execution timeout 25 seconds.</small>
68
- <div class="row"><div><label for="population">Population</label><input id="population" type="number" min="1" max="128" value="8" disabled><small>1–128 cars in this beta.</small></div><div><label for="generations">Generations</label><input id="generations" type="number" min="1" max="1000" value="30" disabled><small>1–1,000; try 20–50 before review.</small></div></div>
69
- <label id="mutation_label" for="mutation">Mutation rate</label><input id="mutation" type="number" min="0" max="4.2" step="0.01" value="0.1" disabled><small>Use a positive mutation rate, including when continuing an uploaded network. A one-generation run still evaluates the uploaded parent.</small>
70
 
71
  <details id="native_settings"><summary>Native evolution settings</summary>
72
- <label for="preset">Recommended starting recipe</label><select id="preset" disabled><option value="custom">Custom / keep current settings</option><option value="starter">First laps · mutation 0.3, decay 0.0005</option><option value="explore">Wide exploration · mutation 0.5, decay 0.0005</option><option value="refine">Established driver · mutation 0.1, decay 0.0001</option><option value="speed">Lap refinement · mutation 0.05, decay 0</option></select><small>Starting hypotheses, not proven optimums. Change stages after stable improvement.</small>
73
  <label for="schedule">Mutation schedule for this run</label><select id="schedule" disabled><option value="fixed">Fixed · change stages manually</option><option value="linear">Linear start → end</option><option value="geometric">Geometric start → end</option></select>
74
- <div id="end_rate_group" hidden><label for="mutation_end">End mutation rate</label><input id="mutation_end" type="number" min="0" max="4.2" step="0.01" value="0.1" disabled><small>Geometric schedules require positive start and end rates.</small></div>
75
  <label><input id="adaptive_mutation" type="checkbox" disabled> Adaptive mutation · normalize for network size</label><small>Architecture scaling, not progress-aware adjustment. Decay is fixed; adaptive decay isn't exposed by this CLI.</small>
76
  <label for="selection">Parent selection</label><select id="selection" disabled><option value="best">Best</option><option value="tournament">Tournament</option><option value="roulette">Roulette</option></select>
77
- <div class="row"><div><label for="parents">Selected parents</label><input id="parents" type="number" min="1" value="1" disabled><small>1–population; start with 3.</small></div><div><label for="elite">Preserved elites</label><input id="elite" type="number" min="0" value="1" disabled><small>0–population; start with 1.</small></div></div>
78
  <label for="crossover">Crossover</label><select id="crossover" disabled><option value="none">Off</option><option value="single_point">Single point</option><option value="uniform">Uniform</option></select>
79
  <label for="decay">Weight decay</label><input id="decay" type="number" min="0" max="1" step="0.0001" value="0" disabled><small>Allowed 0–1; suggested 0–0.001. Decay 0.05 shrinks children by 5%.</small>
80
  </details>
81
  <details id="reward_settings"><summary>Rewards · presets and up to five metrics</summary>
82
- <label for="reward_preset">Reward preset</label><select id="reward_preset" disabled><option value="custom">Custom</option><option value="distance">First laps · distance only</option><option value="center">Example mix · center, clearance, collisions</option><option value="clean">Clean driving · distance + collision penalty</option><option value="lap">Lap refinement · best lap only</option></select>
83
  <div id="rewards"></div><button id="add" disabled>+ Add reward</button><small>Weights −100…+100; absolute shares normalize to 100%. Five distinct metrics maximum. The current vehicle runner accepts these metrics; choose them for the behavior you want to train.</small>
84
  </details></div>
85
- <details id="run_settings"><summary>Run settings · timing and elimination</summary><div class="row"><div><label for="control_hz">Decisions per second</label><select id="control_hz" disabled><option>60</option><option>30</option><option>15</option></select></div><div><label for="workers">Parallel simulations</label><select id="workers" disabled><option>1</option><option selected>2</option><option>3</option><option>4</option></select></div></div><small>Physics runs at 60 Hz. CPU jobs can use 1–4 worker threads.</small><div id="seed_group"><label for="seed">Random seed</label><input id="seed" type="number" min="0" max="2147483647" value="42105" disabled></div><label><input id="collision" type="checkbox" disabled> Eliminate on wall contact</label><label><input id="idle" type="checkbox" disabled> Eliminate when stuck</label><label for="clean_min_laps">Minimum forward laps for a clean-lap winner</label><input id="clean_min_laps" type="number" min="1" max="100" value="2"><small>Winner classification only. Zero physical contacts are required. This does not change your reward recipe.</small></details></div><div id="libraries" class="card"><h3>Recipes · A–J · saved in this browser</h3>
86
  <p>Each recipe contains the training settings and reward mix. Tracks, networks and results stay out of the recipe library. Saving a recipe sends nothing to the server. Settings are sent when you start a run.</p>
87
  <div class="row"><label for="recipe_slot">Recipe slot<select id="recipe_slot"><option>A</option><option>B</option><option>C</option><option>D</option><option>E</option><option>F</option><option>G</option><option>H</option><option>I</option><option>J</option></select></label><label for="recipe_name">Recipe name<input id="recipe_name" maxlength="80" value="My recipe"></label></div>
88
  <button id="recipe_save">Save current settings</button> <button id="recipe_load">Load recipe</button>
@@ -305,10 +306,11 @@
305
  q('training_ticks').value=data.ticks;q('rewards').replaceChildren();data.rewards.forEach(rewardRow);
306
  q('recipe_draft').value=JSON.stringify(data,null,2);
307
  }
308
- const editable=[...fields,'training_ticks','add','reward_preset','preset'];
309
  for(const id of editable)q(id).disabled=false;
310
  q('end_rate_group').hidden=false;
311
- applySettings(api.defaults);
 
312
  window.getTrainingSettings=executableSettings;
313
  let stagedPortableRecipe=false;
314
  window.getPortableRecipe=()=>{
@@ -336,7 +338,7 @@
336
  q('preset').onchange=()=>{
337
  const k=q('preset').value;if(k==='custom')return;
338
  const data=currentSettings();data.mutation={starter:.3,explore:.5,refine:.1,speed:.05}[k];data.mutation_end=data.mutation;
339
- data.decay={starter:.0005,explore:.0005,refine:.0001,speed:0}[k];applySettings(data);
340
  };
341
  for(const id of ['mutation','mutation_end','decay'])q(id).addEventListener('input',()=>{q('preset').value='custom';});
342
  let store;
@@ -353,6 +355,10 @@
353
  };
354
  window.getBatchPlan=()=>window.BatchTraining.plan(read(),q('batch_slot').value);
355
  const action=fn=>async()=>{try{await fn();}catch(error){message('Not completed: '+error.message);}};
 
 
 
 
356
  q('recipe_apply_draft').onclick=action(()=>{applySettings(JSON.parse(q('recipe_draft').value));q('preset').value='custom';q('reward_preset').value='custom';message('Draft applied to the training form. No run started.');});
357
  q('recipe_save').onclick=action(async()=>{
358
  const book=read(),slot=q('recipe_slot').value;
 
28
  };
29
  })();
30
  </script>
31
+ <header><div class="eyebrow">AI LEARNS TO DRIVE · TRAINING LAB</div><h1>Train, inspect, repeat.</h1><p class="intro">Choose a track and car, create or select a network, then train and inspect the result. Cars are simulated behind the scenes; the map shows track layout, not moving cars.</p><p><a href="/help#first-run" target="_blank" rel="noopener">Help &amp; tutorial</a> · <a id="feedbackLink" href="https://github.com/seeker-cyber-maker/driving_sim_rs/issues/new" target="_blank" rel="noopener">Report a problem</a> (opens an editable draft; review it before posting)</p><details class="about"><summary>About this beta and its data handling</summary><p>Simulator by <a href="https://github.com/Zorro909/driving_sim_rs">Zorro909</a>; interface and hosting by <a href="https://github.com/seeker-cyber-maker/driving_sim_rs">TiGa</a>. Inspired by the <a href="https://store.steampowered.com/app/3312030/AI_Learns_To_Drive/">game by ActivationFunction</a>. Built-in tracks are reconstructed replicas. For supported conditions, the lab checks the run’s final fitness policy (or frozen input) with a bounded fresh replay. It predicts conditions only and does not award or accumulate original-game stars; opponent races and other unsupported conditions remain unchecked.</p><p>Uploaded files are used for the requested run. Results are held briefly in application memory and deleted after verified download or expiry. Browser recipes contain settings only. <a href="/policy" target="_blank" rel="noopener">Read the data policy</a>.</p></details><p id="buildLabel" class="hint">Build: connecting…</p></header>
32
+ <section id="firstRunGuide" class="card" aria-labelledby="firstRunTitle"><h2 id="firstRunTitle">Start with one small run</h2><p>1. Choose a track. 2. Create or upload a network. 3. Review the first-run settings. 4. Click Run training when ready. After completion, click Download result to receive winner and challenge details; a connected bucket with automatic saving retrieves them for you. The first run may not complete a lap.</p><div class="toolbar"><button id="first_run_track" type="button">Choose a track</button><button id="first_run_settings" type="button">Review first-run settings</button></div><p><a href="/help#first-run" target="_blank" rel="noopener">Open the step-by-step tutorial</a></p></section>
33
+ <nav class="tabs" aria-label="Lab sections"><button data-tab="drive" aria-selected="true">1 · Drive & view</button><button data-tab="training" aria-selected="false">2 · Training runs & presets</button><button data-tab="batch" aria-selected="false">3 · Batches</button><button data-tab="editor" aria-selected="false">4 · Network editor</button></nav><div id="drive" class="pane"><div class="grid"><section class="card"><h2>Simulation</h2><div class="toolbar" aria-label="Create a starter network"><label for="starter_vehicle">Starter car</label><select id="starter_vehicle"><option value="0" selected>Formula</option><option value="1">Rally</option><option value="2">Snowmobile</option><option value="3">Truck</option></select><button id="starter_create" type="button">Create starter network</button></div><p id="starter_network_status" class="hint" role="status">Creates a small network in this page only. It does not start a run or change saved recipes.</p><label for="run_mode">Action</label><select id="run_mode"><option value="train" selected>Train a population</option><option value="evaluate">Frozen evaluation · one policy, unchanged weights</option></select><p id="run_mode_help" class="hint">Training uses the selected recipe. Frozen evaluation runs the selected policy in a fresh car without changing its weights.</p><button id="run" disabled>Run training</button><p id="starCheckNotice" class="hint">After each run, supported star challenges are checked with unchanged weights. Results are predictions, not game awards. <a href="/help#concepts" target="_blank" rel="noopener">How checks work</a>.</p><p class="hint">Select or create a network below to enable training. Review settings on tab 2 before running.</p><p>Supports Formula, Rally, Snowmobile and Truck networks. Control outputs follow the original vehicle editor rules. Network shape and supported sensors are bounded by the original game contract.</p>
34
  <p id="computeBlock"><label for="backend">Compute</label><select id="backend" disabled><option value="cpu">CPU — no GPU allowance</option><option id="gpuOption" value="gpu" disabled>GPU — uses GPU allowance</option></select></p><p id="backendNote" class="hint">Checking available backends…</p>
35
  <div id="connectionRecovery" hidden><button id="retry" type="button">Reconnect to app</button><p class="hint">Checks server availability. Does not restart training, sign you in, or reset GPU allowance.</p></div>
36
  <div id="gpuAccount" aria-label="Optional GPU account"><p><button id="hfSignIn" type="button" disabled>Sign in with HF for account GPU allowance</button><span id="hfAccount" hidden></span> <button id="hfSignOut" type="button" disabled hidden>Disconnect account</button></p><p id="hfIdentity" role="status" class="hint">CPU needs no sign-in. Checking optional GPU account connection…</p>
 
52
  <div id="winnerTools" hidden>
53
  <p class="hint">A network can fill more than one winner role. Select roles to compare; duplicate policies run once. Fitness is final-generation population-relative and is not compared across generations or policy evaluations.</p>
54
  <div class="table-scroll"><table><thead><tr><th>Compare</th><th>Role</th><th>Candidate</th><th>Generation / car</th><th>Selection fitness</th><th>Best lap</th><th>Forward laps</th><th>Physical contacts</th><th>Distance (simulation units)</th><th>Action</th></tr></thead><tbody id="winnerRows"></tbody></table></div>
55
+ <p><label for="winner_continue">Winner to continue or evaluate</label><select id="winner_continue"><option value="">Primary fitness result</option></select> <button id="winner_continue_train" type="button" disabled>Continue training</button> <button id="winner_use" type="button" disabled>Evaluate unchanged</button></p>
56
  <div class="toolbar"><button id="compare_winners" type="button" disabled>Compare selected winners</button><button id="analysis_download" type="button" disabled>Download full analysis archive</button></div><p class="hint">Comparison starts one frozen evaluation per distinct selected policy, in sequence. It uses the currently selected track, vehicle, tick limit, control rate and collision/idle settings, then holds those conditions fixed for the full comparison.</p>
57
  <details><summary>Inspect complete measurements for an evaluated car</summary><div class="row"><label for="descriptor_generation">Generation<input id="descriptor_generation" type="number" min="1" value="1"></label><label for="descriptor_car">Car index<input id="descriptor_car" type="number" min="0" value="0"></label></div><button id="descriptor_show" type="button" disabled>Show all descriptors</button><p id="descriptor_status" role="status"></p><div id="descriptor_tables"></div></details>
58
  </div>
 
65
  <details id="bucketStorage"><summary>Connect to an existing private bucket</summary><p>Bucket storage is optional. Authorizing storage also identifies your account for GPU requests; ordinary GPU sign-in remains available with the basic identity permission. Then enter your existing private bucket ID. Connected runs automatically save by default; uncheck this option to keep run saves manual. No personal token is requested or stored.</p><p id="bucket_scope_notice" class="privacy-note">HF describes the requested <code>write-repos</code> permission as read/write access to your personal repositories. That grant is broader than one selected bucket and is not a bucket-only permission; the app limits its own operations to the bucket you enter. The minimum current scope for bucket read/write has not been confirmed by HF.</p><button id="bucket_authorize" type="button" hidden disabled>Authorize bucket access with HF</button><p id="bucket_auth_unavailable" class="hint" hidden>HF bucket authorization is unavailable for this app. Local bundle export remains available.</p><p id="bucket_auth_status" role="status" aria-live="polite">Checking optional HF bucket authorization…</p><div id="bucketConnectForm" hidden><label for="bucket_id">Private bucket ID</label><input id="bucket_id" type="text" autocomplete="off" placeholder="username/bucket-name" disabled><button id="bucket_connect" type="button" disabled>Connect bucket</button></div><div id="bucketConnected" hidden><p id="bucket_account"></p><label class="keep-result"><input id="bucket_autosave" type="checkbox" checked> Automatically save every verified completed network and run log to this bucket</label><p class="hint">For each completed run, the browser fetches and verifies the network, then confirms server deletion before sending the network and sanitized log to your bucket. If deletion is not confirmed, no save occurs. If bucket saving is not confirmed, the verified local candidate stays available to download or retry; the remote save may have completed. Each batch step saves before the next starts, and a failed save stops the batch.</p><button id="bucket_disconnect" type="button">Disconnect bucket and clear HF authorization</button><div class="toolbar"><button id="bucket_save" type="button" disabled>Save selected bundle</button><button id="bucket_refresh" type="button" disabled>Refresh saved bundles</button></div><label for="bucket_items">Saved bundles from this app</label><select id="bucket_items" size="4" disabled><option value="">Refresh to list saved bundles</option></select><button id="bucket_restore" type="button" disabled>Restore selected bundle</button><hr><h3 id="bucketRecipeTitle" tabindex="-1">Recipe library (settings only)</h3><p class="hint">Save and import the validated recipes and batch definitions from this browser. This 32 KB library contains settings only; networks, tracks, run results and access tokens are never included. Import asks before replacing the local recipe library and never starts a run.</p><div class="toolbar"><button id="bucket_recipe_save" type="button" disabled>Save recipe library</button><button id="bucket_recipe_refresh" type="button" disabled>Refresh saved recipe libraries</button></div><label for="bucket_recipe_items">Saved recipe libraries</label><select id="bucket_recipe_items" size="4" disabled><option value="">Refresh to list saved recipe libraries</option></select><button id="bucket_recipe_import" type="button" disabled>Import selected recipe library</button><p id="bucket_recipe_status" role="status" aria-live="polite">No recipe library bucket action requested.</p></div><p id="bucket_status" role="status" aria-live="polite">Not connected. Bucket storage is optional.</p></details></details>
66
  <p id="deadline"></p><p id="status" role="status">Ready. Inputs remain on this device until you run the test.</p>
67
  <details><summary>Effective training settings</summary><pre id="effectiveSettings"></pre></details><details><summary>Generation results</summary><pre id="generationHistory"></pre></details><details><summary>About star challenge checks</summary><p>After a run, supported conditions are checked against its named policy with a bounded fresh replay. Results appear in the Star challenge check panel when available. These are predictions for the reconstructed replica track, not original-game awards; opponent races and unsupported conditions are left unchecked.</p></details></section></div>
68
+ </div><section id="training" class="pane" hidden><div class="card"><h2>Training settings</h2><p class="hint">Choose the track on Drive & view. The first-run settings are a starting point; you can change them or load one of your saved recipes. Starting a new run never rewrites your saved recipes.</p><p><button id="starter_settings_reset" type="button">Apply first-run settings to this form</button> <span id="starter_settings_status" role="status" aria-live="polite">Saved recipes are unchanged.</span></p><p><label for="trackPresetTraining">Training track</label><select id="trackPresetTraining" data-track-library disabled><option value="">Upload a custom track</option></select></p><p data-track-status role="status" class="hint">Loading built-in replica tracks…</p><div id="training_controls"><label for="training_ticks">Simulated ticks per generation</label><input id="training_ticks" type="number" min="1" max="18000" value="900"><small>60 ticks = one simulated second. The first-run setting is 900 ticks (15 simulated seconds) per generation. Current preview limit: population × generations × ticks ≤ 4,000,000; execution timeout 25 seconds.</small>
69
+ <div class="row"><div><label for="population">Population</label><input id="population" type="number" min="1" max="128" value="32" disabled><small>1–128 cars in this beta. The first-run setting is 32.</small></div><div><label for="generations">Generations</label><input id="generations" type="number" min="1" max="1000" value="20" disabled><small>1–1,000; the first-run setting is 20.</small></div></div>
70
+ <label id="mutation_label" for="mutation">Mutation rate</label><input id="mutation" type="number" min="0" max="4.2" step="0.01" value="0.3" disabled><small>Use a positive mutation rate, including when continuing an uploaded network. A one-generation run still evaluates the uploaded parent.</small>
71
 
72
  <details id="native_settings"><summary>Native evolution settings</summary>
73
+ <label for="preset">Recommended starting recipe</label><select id="preset" disabled><option value="custom">Custom / keep current settings</option><option value="starter" selected>First laps · mutation 0.3, no decay</option><option value="explore">Wide exploration · mutation 0.5, decay 0.0005</option><option value="refine">Established driver · mutation 0.1, decay 0.0001</option><option value="speed">Lap refinement · mutation 0.05, decay 0</option></select><small>Starting hypotheses, not proven optimums. Change stages after stable improvement.</small>
74
  <label for="schedule">Mutation schedule for this run</label><select id="schedule" disabled><option value="fixed">Fixed · change stages manually</option><option value="linear">Linear start → end</option><option value="geometric">Geometric start → end</option></select>
75
+ <div id="end_rate_group" hidden><label for="mutation_end">End mutation rate</label><input id="mutation_end" type="number" min="0" max="4.2" step="0.01" value="0.3" disabled><small>Geometric schedules require positive start and end rates.</small></div>
76
  <label><input id="adaptive_mutation" type="checkbox" disabled> Adaptive mutation · normalize for network size</label><small>Architecture scaling, not progress-aware adjustment. Decay is fixed; adaptive decay isn't exposed by this CLI.</small>
77
  <label for="selection">Parent selection</label><select id="selection" disabled><option value="best">Best</option><option value="tournament">Tournament</option><option value="roulette">Roulette</option></select>
78
+ <div class="row"><div><label for="parents">Selected parents</label><input id="parents" type="number" min="1" value="1" disabled><small>1–population; first-run setting is 1.</small></div><div><label for="elite">Preserved elites</label><input id="elite" type="number" min="0" value="1" disabled><small>0–population; start with 1.</small></div></div>
79
  <label for="crossover">Crossover</label><select id="crossover" disabled><option value="none">Off</option><option value="single_point">Single point</option><option value="uniform">Uniform</option></select>
80
  <label for="decay">Weight decay</label><input id="decay" type="number" min="0" max="1" step="0.0001" value="0" disabled><small>Allowed 0–1; suggested 0–0.001. Decay 0.05 shrinks children by 5%.</small>
81
  </details>
82
  <details id="reward_settings"><summary>Rewards · presets and up to five metrics</summary>
83
+ <label for="reward_preset">Reward preset</label><select id="reward_preset" disabled><option value="custom">Custom</option><option value="distance" selected>First laps · distance only (+100 total score)</option><option value="center">Example mix · center, clearance, collisions</option><option value="clean">Clean driving · distance + collision penalty</option><option value="lap">Lap refinement · best lap only</option></select>
84
  <div id="rewards"></div><button id="add" disabled>+ Add reward</button><small>Weights −100…+100; absolute shares normalize to 100%. Five distinct metrics maximum. The current vehicle runner accepts these metrics; choose them for the behavior you want to train.</small>
85
  </details></div>
86
+ <details id="run_settings"><summary>Run settings · timing and elimination</summary><div class="row"><div><label for="control_hz">Decisions per second</label><select id="control_hz" disabled><option>60</option><option selected>30</option><option>15</option></select></div><div><label for="workers">Parallel simulations</label><select id="workers" disabled><option>1</option><option selected>1</option><option>2</option><option>3</option><option>4</option></select></div></div><small>Physics runs at 60 Hz. CPU jobs can use 1–4 worker threads.</small><div id="seed_group"><label for="seed">Random seed</label><input id="seed" type="number" min="0" max="2147483647" value="42105" disabled></div><label><input id="collision" type="checkbox" disabled> Eliminate on wall contact</label><label><input id="idle" type="checkbox" disabled> Eliminate when stuck</label><label for="clean_min_laps">Minimum forward laps for a clean-lap winner</label><input id="clean_min_laps" type="number" min="1" max="100" value="2"><small>Winner classification only. Zero physical contacts are required. This does not change your reward recipe.</small></details></div><div id="libraries" class="card"><h3>Recipes · A–J · saved in this browser</h3>
87
  <p>Each recipe contains the training settings and reward mix. Tracks, networks and results stay out of the recipe library. Saving a recipe sends nothing to the server. Settings are sent when you start a run.</p>
88
  <div class="row"><label for="recipe_slot">Recipe slot<select id="recipe_slot"><option>A</option><option>B</option><option>C</option><option>D</option><option>E</option><option>F</option><option>G</option><option>H</option><option>I</option><option>J</option></select></label><label for="recipe_name">Recipe name<input id="recipe_name" maxlength="80" value="My recipe"></label></div>
89
  <button id="recipe_save">Save current settings</button> <button id="recipe_load">Load recipe</button>
 
306
  q('training_ticks').value=data.ticks;q('rewards').replaceChildren();data.rewards.forEach(rewardRow);
307
  q('recipe_draft').value=JSON.stringify(data,null,2);
308
  }
309
+ const editable=[...fields,'training_ticks','add','reward_preset','preset','starter_settings_reset'];
310
  for(const id of editable)q(id).disabled=false;
311
  q('end_rate_group').hidden=false;
312
+ const firstRunSettings={...api.defaults,population:32,generations:20,ticks:900,mutation:0.3,mutation_end:0.3,parents:1,elite:1,decay:0,workers:1,collision:false,idle:false,rewards:[{metric:'total_score',type:'default',weight:100}]};
313
+ applySettings(firstRunSettings);q('preset').value='starter';q('reward_preset').value='distance';
314
  window.getTrainingSettings=executableSettings;
315
  let stagedPortableRecipe=false;
316
  window.getPortableRecipe=()=>{
 
338
  q('preset').onchange=()=>{
339
  const k=q('preset').value;if(k==='custom')return;
340
  const data=currentSettings();data.mutation={starter:.3,explore:.5,refine:.1,speed:.05}[k];data.mutation_end=data.mutation;
341
+ data.decay={starter:0,explore:.0005,refine:.0001,speed:0}[k];applySettings(data);
342
  };
343
  for(const id of ['mutation','mutation_end','decay'])q(id).addEventListener('input',()=>{q('preset').value='custom';});
344
  let store;
 
355
  };
356
  window.getBatchPlan=()=>window.BatchTraining.plan(read(),q('batch_slot').value);
357
  const action=fn=>async()=>{try{await fn();}catch(error){message('Not completed: '+error.message);}};
358
+ q('starter_settings_reset').onclick=action(async()=>{
359
+ if(!(await window.appConfirm('Replace the current form settings and reward mix with the first-run starter? Saved recipes will not change.',{heading:'Apply first-run settings',confirmLabel:'Apply starter'})))return;
360
+ applySettings(firstRunSettings);q('preset').value='starter';q('reward_preset').value='distance';q('starter_settings_status').textContent='First-run settings applied to this form. Saved recipes are unchanged; no run started.';
361
+ });
362
  q('recipe_apply_draft').onclick=action(()=>{applySettings(JSON.parse(q('recipe_draft').value));q('preset').value='custom';q('reward_preset').value='custom';message('Draft applied to the training form. No run started.');});
363
  q('recipe_save').onclick=action(async()=>{
364
  const book=read(),slot=q('recipe_slot').value;
server.py CHANGED
@@ -326,6 +326,8 @@ def create_app(worker=run_reported,store=None,gpu_worker=None,track_library=None
326
  def feedback(): return FileResponse(ROOT/'FEEDBACK.md',media_type='text/plain')
327
  @app.get('/policy')
328
  def policy(): return FileResponse(ROOT/'DATA_POLICY.md',media_type='text/plain')
 
 
329
  @app.post('/api/process')
330
  async def process(request:Request):
331
  if not admission.acquire(blocking=False): raise HTTPException(429,'Worker busy; try later')
 
326
  def feedback(): return FileResponse(ROOT/'FEEDBACK.md',media_type='text/plain')
327
  @app.get('/policy')
328
  def policy(): return FileResponse(ROOT/'DATA_POLICY.md',media_type='text/plain')
329
+ @app.get('/help')
330
+ def help_page(): return FileResponse(ROOT/'help.html',media_type='text/html')
331
  @app.post('/api/process')
332
  async def process(request:Request):
333
  if not admission.acquire(blocking=False): raise HTTPException(429,'Worker busy; try later')