v6.0.0 made caller mandatory on every invocation of run_automation_prompt. That was the right call for scripts living inside the repo — each one deserves a deliberate tier that a reviewer can see. It was the wrong call for scripts that live in the operator's ~/.nexo/scripts/ tree: they cannot edit the public repo, so every one of them silently collapsed to the generic agent_run/generic tier and lost its per-script identity. v6.0.2 closes that gap without opening a backdoor to the registry.

The new contract

Any caller whose id starts with the reserved prefix personal/ now bypasses the registry entirely. The resolver evaluates in this order and returns the first valid hit:

  1. explicit_tier (new keyword-only argument on the resolver; tier="..." kwarg on the public wrappers).
  2. user_default passed explicitly (rare; mostly internal).
  3. preferences.default_resonance read from brain/calibration.json on disk.
  4. DEFAULT_RESONANCE"alto" since v5.9.0.

Invalid tier values (typos, unknown strings) are treated as "no hint" and the resolver falls through to the next step. There is no silent crash, and there is no silent promotion — a personal/ caller without any of the four signals always ends at alto.

The wrappers picked up tier everywhere

The new kwarg propagates through every public surface a personal script might touch:

If a script needs a direct effort override (the xhigh / max buckets without the tier semantics) it can still pass reasoning_effort= as before — that argument still wins, because the whole tier system is a convenience over the raw effort string.

Backcompat

Caller shapev6.0.0 behaviourv6.0.2 behaviour
nexo_chat (USER_FACING)user_default or DEFAULTunchanged
deep-sleep/extract (SYSTEM_OWNED)pinned tierunchanged
unknown/callerUnregisteredCallerErrorunchanged
personal/anythingUnregisteredCallerErrorresolves via new precedence

The guide

Because the new prefix exists specifically so a NEXO session can help an operator author a new personal script, v6.0.2 ships docs/personal-scripts-guide.md. It covers:

Tests

Three new pytest modules cover every path: test_personal_caller_prefix.py (the four-step precedence, typo rejection, registered-caller backcompat, and the resolve_model_and_effort passthrough), test_run_automation_prompt_tier_kwarg.py (tier resolution at the agent_runner layer and signature guard), and test_nexo_agent_run_tier_flag.py (CLI flag propagation). Full suite: 1079 passed, 1 skipped.

Full changelog →