NEXO 7.7.0 — constructor-guardian-90 pass 2: the six gaps left partial in v7.6 are now closed

Published 2026-04-22. Minor release over v7.6.0.

v7.6 closed the big drift between the enforcement map and the two engines (contract parity for all eight rule types, per-instance after_tool satisfaction, four default-mode bumps). It also shipped with a candid list of six items that were still partial. v7.7 closes those.

Gap 1 — Autonomous detector for multi_step_task_detected

v7.6 added raise_event() and dispatched the on_event rule for multi_step_task_detected, but no component actually raised the event. v7.7 wires a heuristic into on_tool_call: three recent Edit / Write / Task calls without a prior nexo_skill_match raise the event exactly once per task cycle. Both a subsequent nexo_skill_match and a nexo_task_close clear the latch.

Gap 2 — Expanded done-claim vocabulary in the R16 classifier

The on_event trigger done_claimed_with_open_task only fires when R16's classifier returns yes. Pre-v7.7 the classifier prompt only listed "finished / completed / shipped / done". v7.7 matches sent / delivered / published / deployed / released / fixed / resolved / merged / pushed, plus Spanish equivalents (listo / hecho / terminado / enviado / arreglado / desplegado / publicado / lanzado / resuelto / mergeado). The rail covers the full close-claim vocabulary the checklist called out.

Gap 3 — R_CATALOG extended to plain Edit/Write of artefacts

R_CATALOG used to fire only on nexo_*_create / _open / _add. That missed the common path: an agent materialising a skill / plugin / script by just writing the file. v7.7 extends the trigger set: Edit / Write into paths containing /skills/, /plugins/, /personal/scripts/, /.nexo/skills/, /templates/core-prompts/, /src/plugins/, and similar artefact fragments now trigger the probe. The discovery set also grew from 6 to 8: nexo_personal_scripts_list and nexo_plugin_list now count as "I checked what already exists" relief signals.

Gap 4 — R_PRIMITIVE_CHOICE — SK-CREATE-NEXO-PRIMITIVE as enforcement

Before v7.7 the skill "Create NEXO Primitive" was a guide that the agent could ignore. v7.7 turns it into runtime enforcement via the new R_PRIMITIVE_CHOICE rule (module src/r_primitive_choice.py). It fires on Edit/Write of a brand-new artefact file (no prior Read/Grep/Edit on the same path) without a recent primitive-choice probe (nexo_skill_match, nexo_tool_explain, nexo_skill_apply). Disjoint from R_CATALOG: R_CATALOG nudges on every artefact-path write without inventory consultation; R_PRIMITIVE_CHOICE nudges specifically on new-artefact creation without primitive choice. Default mode: soft so false-positive rate can be observed before promoting to hard.

Gap 5 — R11_plugin_load_pre_inventory hardened

guardian_default.json v1.5.0 raises R11_plugin_load_pre_inventory from soft to hard. The pre-inventory gate for plugin_load was one of the clearest low-FP rules in recent telemetry; the soft mode was legacy from before the gate was well-calibrated. Desktop's mirror (nexo-desktop/enforcement-engine.js) matches.

Gap 6 — Tests e2e por carril crítico

New file tests/test_v77_enforcement_gaps.py pins twelve invariants across six rails:

What stays exactly as v7.6 shipped it

Contract parity (8/8 types dispatched by both engines), per-instance after_tool satisfaction, raise_event / reset_task_cycle / on_tool_call_before API, learning_add grace 0, task_open threshold 4/must, R15/R17/R22/R_CATALOG at hard, R34 at soft — all preserved. v7.7 is an additive pass, not a redesign.

Pytest

2070 passing (+14 vs v7.6). The ten unrelated pre-existing failures in test_cli_scripts / test_client_sync / test_doctor / test_evolution persist — environment-specific TTY / client-detection edge cases confirmed against clean main and tracked separately.

Honest delta

All six originally-listed gaps are landed. The checklist had ~50 line-items in total and v7.6 + v7.7 together cover the ones that affect the primary obedience rail. The residual items (ambient UI polish, additional telemetry dashboards, cross-cutting audits on already-covered rules) are non-nuclear and will move through normal sprint rhythm.

Related: full v7.7.0 changelog · v7.6.0 release notes · source on GitHub