BrainState outputs.
One-liner: anything that maps trials to embeddings plugs in; Nimbus owns personalization, uncertainty gating, and cheap online updates — not the trunk.


Ladder legend (plain language)
Blue
rec % on the figure = how much of the L0→L3 accuracy gain L1 recovers: (acc_L1 − acc_L0) / (acc_L3 − acc_L0). ≥FT means L1 matches or beats L3.
How the Paper 1 / 1b numbers were produced (datasets, bandpass, session split, synthetic stress): Evidence → How the experiments work.
Classical CSP / bandpower / Riemann features still work. Use
Personalizer(encoder=None) or the standalone heads (NimbusLDA, …) documented under Models.Start here
Encoder contract
wrap → Personalizer → save/load rules.BrainState
App-facing intents, presets, and bridges.
Evidence
Head vs probe vs FT, LDA/QDA/Softmax, REVE, transfer map.
Python Quickstart
Fit a Personalizer in a few minutes.
Minimal example
Integrator checklist
- When to adapt — use the thin helper with a user-supplied threshold (not an automatic multi-level cascade):
partial_fit) when shift clears tau; full fine-tune stays a manual escape hatch. See Evidence.
-
Trial gate (different signal) —
preset="research"/"consumer"; inspectBrainState.rejected,need_more_data,uncertainty. See BrainState. -
Head stability — after online updates, use
calibration_sufficienton an unlabeled pool. -
Encoder swap — freeze trunk; match
embedding_dim; never pass logits as embeddings; keepmodel_idconsistent acrosssave/load. See Encoder contract.
Next read
Encoder contract
Wrap rules and save/load.
BrainState
App-facing intents and presets.
API Reference
Personalizer and middleware symbols.
Heads / Models
LDA, QDA, Softmax, STS.