Encoder contract
The encode hook is not a gap — it is the product boundary. Nimbus does not host DL architectures. Integrators (or thin shortcuts) supply embeddings.
Rules:
- Freeze the trunk before personalizing
- Feed embeddings, never class logits
Personalizer.loadrequires re-attaching the encoder- Optional
embedding_dim=validates embedding width
Canonical recipe
(n, d) so LDA/QDA heads can consume them. Spatial/temporal structure is collapsed at the encoder boundary, not inside the Bayesian head.
Optional shortcuts
Named helpers only reduce boilerplate. Architectures stay outside core:Personalizer / BrainState contract — not a confirmatory accuracy bake-off.
Active learning → personalization
UseCalibrationSession (or suggest_next_trial) to choose labels, then: