This release adds 2 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+14 more
Affected surfaces
Summary
AI summaryFixed strict guardrail blocking edits when session_id omitted and added pytest CI gate.
Full changelog
[6.0.5] - 2026-04-17
Fixed
- Pre-tool strict guardrail blocked every
Edit/Writewith "unknown target" when Claude Code's PreToolUse payload omittedsession_id. Theprocess_pre_tool_eventresolver consulted onlypayload["session_id"]. Several Claude Code versions deliver PreToolUse without that field, so_resolve_nexo_sidreturned"", the strict branch recorded astrict_protocol_write_without_startupdebt, and the formatter emitted "NEXO STRICT MODE BLOCKED THIS EDIT — Start the shared-brain session first: callnexo_startup, thennexo_task_open, before editing (unknown target)" even when the user already had an open task, an acknowledged guard, and a tracked file. Tracked as learning #411. A partial fix shipped in 6.0.3 (handle_guard_checkpersistssession_id) but it did not cover the missing-payload case for edits. - Two
tests/test_hook_guardrails.pypre-tool cases silently regressed in 6.0.2+ and no CI job ranpytestto catch it.test_process_pre_tool_event_allows_public_contribution_checkoutandtest_process_pre_tool_event_does_not_treat_runtime_home_as_live_repo_when_not_git_checkoutassertedresult["skipped"] is True, result["reason"] == "lenient mode", which stopped being the correct assertion once public-contribution mode began preserving strict discipline and only relaxing the live-repo guard. Both tests now assert the specific property they were designed to guard (noautomation_live_repo_write_blockeddebt, noautomation_live_reporeason code) and create the protocol task the strict path expects. test_non_tty_returns_lenientinheritedNEXO_INTERACTIVE=1from the parent shell (NEXO Desktop /claudeterminal) and read strict instead of lenient._force_ttynow clearsNEXO_INTERACTIVEviamonkeypatchso the TTY signal is the only thing steering strictness. Without the cleanup the test masked regressions for any contributor running pytest from inside an interactive NEXO client.
Added
.github/workflows/tests.yml. CI now runspytest tests/ -q --maxfail=5on every PR and push tomain. Up to v6.0.4 CI only executedruff,bandit,verify_release_readiness, andverify_client_parity, so three pre-tool test failures shipped unnoticed. Release discipline gains pytest as a blocking gate.src/hook_guardrails.py::_read_claude_session_id_from_coordination(). Fallback helper used byprocess_pre_tool_eventwhenpayload["session_id"]is absent. Reads$NEXO_HOME/coordination/.claude-session-id(written on SessionStart by the NEXO hook) and falls through to~/.nexo/coordination/.claude-session-id. Fail-closed semantics preserved: when neither source yields a session id the guardrail still blocks withmissing_startup.tests/test_hook_guardrails.pygains two new cases covering both the happy path (payload omitssession_idbut coordination file is present) and the fail-closed path (both payload and coordination file empty → still blocks).
Changed
src/hook_guardrails.py::process_pre_tool_event. Resolution now walks payload → coordination file → empty. No behavioural change for callers that already supplysession_id.
Housekeeping
NF-TEST-PROTOCOL-API-REFACTORfollowup captures twotests/test_protocol.pycases (test_task_close_opens_protocol_debt_when_done_without_evidence,test_task_open_previews_anticipatory_warnings_without_firing_trigger) that assert API shape that no longer exists. Markedxfail(strict=False)in this release so the newtests.ymlgate stays green; both will be revisited with the handle_task_close / cognitive-trigger refactor landing in a subsequent patch.
Merged from branch fix/purge-legacy-python-claude-hooks (PR #208)
- Purge legacy Python Claude hooks on sync (commit 9e42b03).
- Harden macOS test/runtime isolation (commit 6005288). Smoke installs on macOS no longer touch launchd real; tests run in an isolated launchd namespace so
nexo installon a developer laptop can never clobber the user's live LaunchAgents.
What's Changed
- v6.0.5 — Fix strict hook unknown-target + pytest CI + macOS isolation + legacy hooks purge by @wazionapps in https://github.com/wazionapps/nexo/pull/208
Full Changelog: https://github.com/wazionapps/nexo/compare/v6.0.4...v6.0.5
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About wazionapps/nexo
Cognitive memory for AI agents with Atkinson-Shiffrin memory model (STM/LTM/sensory register), semantic RAG, Ebbinghaus decay, trust scoring, and 76+ MCP tools.
Related context
Beta — feedback welcome: [email protected]