* Ship precompiled eGPU model and camera warps
Compile f78ed37d-afad-4dbc-8050-40ea885eedde/12864 through xx/ml_tools/openpilot_compile using the pinned tinygrad version.
* Precompile the existing master driving model
Use the unchanged master ONNX (SHA-256 6fee5937923c74848df4a63f6239eb6331c6274dd4bdb7a5d6ec0388a8b543d5) instead of updating the trained model.
* Compile camera warps on device
* Remove obsolete ONNX chunking and big model build check
* Chunk model artifacts only during release packaging
* Require model and camera warps for Chestnut readiness
* Recompile precompiled CPU helpers for the runtime host
* Ship the eGPU model with an ARM submission helper
* Exempt model pickles from the build product size limit
* Use tinygrad generic ONNX compiler artifacts
* Keep compiler temporary model buffers off device tmpfs
* Keep recurrent model state updates on the GPU
* Use compiled output buffers and swap recurrent state inputs
* Note when ONNX chunk reassembly can be removed
* Bump tinygrad to rebased compilers and AMD queue fix
* Keep recurrent buffers fixed and use faster USB argument updates
* Bump tinygrad for faster model startup
* modeld: use tinygrad ONNX and warp compilers for driving and DM
* Bump tinygrad with current openpilot model compile tests
* modeld: prioritize tinygrad compiler imports in build environment
* Use compiler branch based on openpilot's pinned tinygrad
* modeld: invoke tinygrad compilers without firmware patch
* modeld: move history queues into ONNX
* Move ONNX history export into xx exporter
* Rename ONNX image input to new_img
* Combine ONNX model history state
* Revert model history README addition
* Keep float32 input packing from master
* Rename model input specs to input shapes
models: add a refresh models button to mici, gate and show progress on both panels
Adds the refresh-models tile to the mici models panel (it was missing there),
factoring the sync-key trigger + in-progress check into refresh_model_list()
and refresh_in_progress() shared with the big UI.
On both UIs the refresh button is now gated on offroad + not-downloading +
not-refreshing (the manager runs offroad-only and its per-tick manifest fetch
sits above a blocking download loop, so a refresh queued in either state would
stick), and shows progress while the manager refetches: mici shows "fetching..."
on the tile, the big UI flips its button from REFRESH to "FETCHING..." to match
its FETCHING.../SELECT/CLEAR label style (as in the OSM panel), replacing the
old fire-and-forget popup.
Claude-Session: https://claude.ai/code/session_01EGMnVnSk5inGTrd7kuDVG9
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: James Vecellio-Grant <159560811+Discountchubbs@users.noreply.github.com>
* cabana: show persistent UI FPS
* cabana: render whole fps in monospace
* cabana: keep fps aligned beside centered progress
* cabana: move fps to top right
* Revert "cabana: move fps to top right"
This reverts commit 51a5334aec79807f8102b9a6f1f902f22814d5c7.
* cabana: add browser sign-in for remote routes
* cabana: use shared dialog styling for browser sign-in
* cabana: support spacious centered action buttons
* cabana: vertically center sign-in states
* cabana: keep sign-in layout stable between states
* cabana: center sign-in error text
* cabana: avoid hint flash when retrying sign-in
* replay: retry failed segment loads
* replay: rename test helper for spellcheck
* replay: include portable temporary directory declaration
* replay: name attempt limit and shorten test delays
* replay: drop timing-dependent retry tests
models: don't block the ui on an unset LagdToggleDelay
Params.get's second positional is `block`, not a fallback value, so
get("LagdToggleDelay", "0.2") passes block=True and does a blocking read.
When the param is unset this spins the ui thread until it appears, freezing
the models panel (the description is rebuilt every frame). Read it the same
way livedelay/lagd_toggle.py does.
Claude-Session: https://claude.ai/code/session_01EGMnVnSk5inGTrd7kuDVG9
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: James Vecellio-Grant <159560811+Discountchubbs@users.noreply.github.com>
* modeld: set the valid flag on modelDataV2SP
modelDataV2SP was published with new_message's default valid=False, so
the message was permanently invalid. Nothing acts on that today because
selfdrived lists it under ignore_valid, but it shows up as invalid in
every commIssue dump and hides any real problem behind a false one.
Copy modelV2's flag, the same way fill_model_msg already does for
drivingModelData.
Assisted-by: Claude
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* modeld_v2: set the valid flag on modelDataV2SP
The sunnypilot model runner publishes the same message and had the same
gap. Copy modelV2's flag here too, so both daemons agree.
Assisted-by: Claude
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: James Vecellio-Grant <159560811+Discountchubbs@users.noreply.github.com>
build-single-tinygrad-model and build-all-tinygrad-models gain a docs_repo
input (default sunnypilot/sunnypilot-models) so a fork can run either against
its own gh-pages catalog, next to the existing hf_repo input for the dataset.
build-all's setup job now checks out the repo and branch it was dispatched
from instead of sunnypilot/sunnypilot's default branch. That keeps the
manifest's tinygrad_ref tied to the code that compiled the models, and lets a
fork run the full rebuild against its own dataset and docs repo.
Claude-Session: https://claude.ai/code/session_01EGMnVnSk5inGTrd7kuDVG9
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: James Vecellio-Grant <159560811+Discountchubbs@users.noreply.github.com>
Both are disabled in the Actions tab and have not run in months:
- Release Drafter (release-drafter.yml) and its config
.github/release-drafter.yml: last run 2025-12-18
- Debug Discourse Posting (test-discourse.yaml.yml): one-off debug
workflow from #1435, last run 2025-10-28
The post-to-discourse composite action is kept; the prebuilt workflow
still uses it. docs, stale and jenkins scan are also disabled here but
are inherited from commaai/openpilot and left in place to avoid
modify/delete conflicts on every upstream sync.
Claude-Session: https://claude.ai/code/session_01WAnUCRcA7Hp68qxyL11Wvm
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: James Vecellio-Grant <159560811+Discountchubbs@users.noreply.github.com>
* cabana: align center tabs and keep signal panel docked
* cabana: prevent panels from docking into the tabless center
* cabana: use native docking for the Signals panel
* cabana: migrate dock tabs when loading the layout
models: add a clear cache button to mici, gate and show progress on both panels
Adds the clear-cache tile to the mici models panel (trash slide-to-confirm),
factoring the cache-size math into model_cache_size_mb() shared with the big UI.
On both UIs the clear button is now gated on offroad + not-downloading +
not-clearing (the manager runs offroad-only, so a clear queued onroad would
never be serviced and would stick), and shows progress while the manager works:
mici shows "clearing..." on the tile, the big UI flips its button to
"CLEARING..." to match its FETCHING.../SELECT/CLEAR label style (as in the OSM
panel).
Claude-Session: https://claude.ai/code/session_01EGMnVnSk5inGTrd7kuDVG9
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Cabana: standardize floating dropdown menus
* Cabana: use uniform items in menus and combo lists
* Cabana: remove dropdown test and explanatory comments