The "empty {}" paper cut
NEXO Desktop's Preferencias → Avanzado tab displays two JSON blocks side by side: calibration.json (personality, language, name, mood history — editable from the other tabs) and profile.json (results of the deep-scan that NEXO Brain runs at onboarding). The design is that both exist. But for anyone whose onboarding was interrupted before v5.9.x — or anyone who picked up NEXO before the flow fully stabilised — profile.json never actually landed on disk. The calibration file carried role and technical_level inside meta.*, but the profile tab rendered {} with no context. Looked broken. Was not, technically, but operator-wise it absolutely was.
The fix, both sides
Brain side. New _bootstrap_profile_from_calibration_meta(dest) runs inside _run_runtime_post_sync() on every nexo update, right after the v5.10.1 effort→resonance migration. When brain/profile.json is missing, empty, or corrupt and brain/calibration.json carries at least one of:
• meta.role
• meta.technical_level
• name
• language
…the helper seeds profile.json with those fields plus "source": "auto_update._bootstrap_profile_from_calibration_meta" so future audits know where the data came from. Never overwrites a populated profile. Never raises. Idempotent by construction — a second run sees the populated file and does nothing.
Desktop side (v0.11.2). The Avanzado tab now prefixes each JSON block with a short, non-technical explanation of what lives inside and where on disk. When profile.json is still absent (no onboarding hints to seed from), the tab renders a framed placeholder saying the basic fields live meanwhile inside calibration.meta and name, instead of the previous empty {}. Shipped alongside v5.10.2 and uploaded to systeam.es.
Test regression also fixed
tests/test_resonance_map.py::test_user_facing_caller_with_no_user_default_uses_alto used to read the real ~/.nexo/brain/calibration.json on the machine running the suite. After the v5.10.1 migration wrote default_resonance=maximo on our dev box, that test started asserting against the real fs state instead of the intended library default and failed. Fixed by monkeypatching _load_user_default_resonance to return an empty string, isolating the test from the host filesystem. Should have been there on day one; it is now.
Tests
10 new cases in tests/test_auto_update_bootstrap_profile.py — each seeding path, the two no-op paths (profile already populated / calibration absent or useless), idempotency on a second run, corrupt-JSON recoveries on both files, and the empty-string filter that prevents seeding a profile with {"role": ""}. Full suite: 1021 passed, 1 skipped.
Upgrading
Run nexo update. If your profile.json was missing and your calibration.json had at least one of the four supported fields, you will find a fresh profile.json on disk and the Desktop Avanzado tab will render it with a labelled header. If your profile was already populated, nothing changes — same idempotent discipline as v5.10.1. Install NEXO Desktop v0.11.2 from the in-app update banner or from systeam.es/nexo-desktop/ to pick up the new block-by-block explanations.