NEXO 7.9.27 — MCP startup unblocked

Published 2026-04-26. Patch release over v7.9.26.

v7.9.27 fixes a server-startup hang where the synchronous task.owner backfill was loading the multi-minute LocalZeroShotClassifier (mDeBERTa) and exceeding the 60s subprocess gate. Every restart looped over the same legacy rows and the MCP initialize handshake never returned, leaving the server visible as “connected” but exposing zero tools.

What changed

The synchronous migration in auto_update.py now invokes scripts/backfill_task_owner.py --rules-only. The new flag skips the classifier load entirely and relies on the existing regex rules, which complete in milliseconds. Subprocess timeout is reduced from 60s to 30s now that the rules path is not gated on a model load.

Backlog still cleared

Worst case, ambiguous rows fall back to 'shared', which is the documented neutral owner. Deep Sleep / cron can later re-run backfill_task_owner.py without --rules-only to refine the 'shared' rows with the classifier when the runtime is idle and synchronous startup is no longer at risk.

Why it matters

Any install that carried legacy followups/reminders with owner IS NULL and had the local classifier installed was effectively unable to expose nexo_* tools to MCP clients on first restart. The fix is non-breaking and restores handshake to the few-seconds range expected by Claude Code, Codex, and other MCP clients.

Verification

Targeted MCP handshake test against a populated runtime confirms initialize + tools/list respond with 272 tools (including nexo_startup) in under three seconds. Pre-release pytest suite green.

Full changelog entry →