5.1.0 is the output of a single audit: NEXO-AUDIT-2026-04-11. It walked every subsystem introduced between 4.x and 5.0 looking for loops that had been opened but not closed — adaptive signals that got computed but never surfaced, evolution proposals that got accepted but never applied, skills that got promoted but never composed, hook runs that could drop silently, and so on. About 46% of the originally-flagged items turned out to be false positives under empirical verification. What remained is what actually shipped in this release.
Evolution, adaptive, skills, and cortex now close their own loops
- Accepted evolution proposals auto-apply on the next cycle.
nexo-evolution-run.pynow readsevolution_logrows markedacceptedand runs them through the auto-proposal executor with snapshot and rollback, backed by the new idempotent migrationm38. No more forever-pending approvals. - Outcome patterns auto-promote to draft skills.
skills_runtime.auto_promote_outcome_patterns_to_skills()materializes recurring successful patterns into draft skills without manual curation, and a Voyager-style detector groupsskill_usageby session to surface co-occurring skill pairs as composite-skill candidates. - Retroactive learnings. Adding a new learning now walks recent decisions, scores them against the rule, and opens deterministic
NF-RETRO-L<id>-D<id>followups for every decision the learning would have changed. Exposed vianexo_learning_apply_retroactively. - Adaptive rollbacks are visible. When adaptive learned-weights roll back, the runtime now surfaces that as a visible followup on the next heartbeat instead of hiding the signal inside
adaptive_log. - Cortex keeps watching itself. A new quality cron runs every 6 hours, watches accept rate, linked-success rate, and override gap, and opens
NF-CORTEX-QUALITY-DROPidempotently when the decision engine starts drifting between cycles.
Cognitive subsystems get externally observable
- Dream + somatic reranking.
cognitive._search.search()now accepts adream_weightparameter and reranks dream-insight memories through it, while a new somatic boost step (max +0.10) folds emotional salience into the same reranking path. Both signals are first-class instead of dead columns. - State watchers auto-open and auto-resolve followups. When a watcher fires, it opens a deterministic
NF-WATCHER-{id}followup; when it clears, the followup resolves. Watcher activity is always externally observable instead of being buried in runtime logs. - Correction fatigue surfaces as a followup. Cognitive-decay now opens a visible followup when the fatigue signal crosses its threshold, so the operator sees the runtime is getting tired of correcting the same thing instead of only adjusting memory weights invisibly.
- Hook lifecycle observability. A new
hook_runstable (migrationm39) +nexo_hook_runsMCP tool expose recent hook runs, failure streaks, and a health summary. Hook drops are no longer invisible.
Bitemporal Knowledge Graph exports
NEXO's knowledge graph has been bitemporal since 4.x — every edge carries valid_from / valid_until, and the upsert/delete helpers maintain them. What it was missing was a way to emit the graph in a format external tools could ingest. 5.1.0 fixes that with nexo_kg_export:
- JSON-LD output uses an
nexo:*vocabulary so the graph is semantic-web friendly and human-readable. - GraphML output plugs into igraph, Gephi, NetworkX, and Cytoscape for serious graph analysis.
as_ofparameter replays the historical snapshot that was valid at any instant — this is what makes the export actually bitemporal rather than just "current state dumped to a file".
OpenTelemetry, opt-in
A new src/observability.py module soft-imports opentelemetry and only activates when OTEL_EXPORTER_OTLP_ENDPOINT or OTEL_SERVICE_NAME is set. tool_span() is a no-op context manager when OTEL is disabled and a real span with ai.tool.* semantic attributes when enabled. The result: NEXO can be wired into any OTEL backend (Honeycomb, Jaeger, Tempo, Grafana Cloud, Dash0, Signoz, etc) without taking a hard dependency on OTEL for users who don't want it.
CI gates on every PR
The operational gap 5.0.x left open was not in the runtime — it was in the release pipeline. A PR could break the release contract and nobody would notice until tag push. 5.1.0 closes that:
- ruff lint workflow enforces
E9 / F63 / F7 / F82 / F821on every PR and push. Baseline pass fixed 5 latentF821bugs. - bandit security workflow runs at high severity / high confidence. Baseline pass fixed 10 weak-hash flags (
usedforsecurity=False) across protocol, deep-sleep, and daily-self-audit scripts. - Coverage baseline tests pin the contract surface area of decay, trust, plugin loader, cognitive, and release so a refactor cannot silently delete them.
verify_release_readiness.py --cinow runs on every PR, not just tags. A PR that breaks the release contract fails loudly immediately.
Safer update path
Two long-standing footguns are gone in 5.1.0:
- Concurrent
nexo updateprotection.auto_updateis now guarded by a POSIXflockwith stale-steal at 10 minutes, so two overlapping update runs cannot stomp each other mid-sync. - LaunchAgent hot-reload. On macOS, a version bump now
launchctl unloads and reloads everycom.nexo.*.plist, so long-lived crons pick up the new codebase immediately instead of running the pre-bump version until the next reboot.
Honest feature matrix vs peers
The new benchmarks/results/comparison-vs-competition-2026-04.md lays out where NEXO wins, where it is on par, and where peers lead — across Letta, Mem0, Zep, Graphiti, Cognee, and DSPy. No cherry-picking. The defensible differentiators end up being the bitemporal knowledge graph, the metacognitive guard, trust scoring, Atkinson-Shiffrin decay, and the native MCP surface.
What did not change
5.1.0 does not replace the 5.0.0 story. Goal profiles, Decision Cortex v2, outcome-backed skill evolution, and the broader runtime pack are still the backbone. This release makes that backbone observable and maintainable under itself instead of relying on the operator to remember to look at every subsystem.
If you want the exact release record, open the 5.1.0 changelog section. If you want to dig into the new graph exports and observability paths, start from Features or the docs map. If you are on an older install, nexo update will handle the migration and cron reload automatically.