NEXO 7.11.5 — Desktop-managed installs now block the standalone dashboard cleanly
Published 2026-04-28. Patch release over v7.11.4 — same feature set, but one live-runtime contract contradiction removed.
What broke after v7.11.4
v7.11.4 repaired the packaged-runtime parity gaps and then the live runtime exposed one more bug during final validation. The product had two incompatible opinions about the standalone dashboard LaunchAgent on Desktop-managed installs:
nexo doctor --plane installation_livecorrectly treated a standalonecom.nexo.dashboard.plistas drift when Desktop already managed the product surface.- Cron sync and the watchdog still expected
dashboardas a core keepalive service because product-mode only blockedevolution.
The result was a loop with no stable state. If you repaired the install drift by removing the standalone dashboard LaunchAgent, the watchdog failed because it still expected dashboard. If you refreshed the runtime to satisfy the watchdog, the standalone dashboard came back and installation_live degraded again.
The fix
The contract now closes at the product-mode layer itself:
DESKTOP_DISABLED_FEATURES = ("evolution", "dashboard")
def is_cron_blocked(cron_id):
return clean in DESKTOP_DISABLED_FEATURES and desktop_product_requested()
Before this patch, is_cron_blocked() was effectively a one-off cron_id == "evolution" check. That meant every caller that trusted product-mode — cron sync, watchdog monitor generation, and any manifest filtering path — still saw dashboard as active even though the install doctor said the opposite. v7.11.5 adds dashboard to the same disabled-features contract that already governed evolution, so Desktop-managed installs now have one consistent answer:
- standalone dashboard blocked
- not installed
- not monitored
Why this is a product fix, not a local workaround
The tempting workaround was to edit the installed runtime by hand or just leave whichever warning looked less bad. That would have been the wrong layer. The contradiction lived in product code, so the fix belongs in the repo, then in a validated release, then in a supported runtime refresh. v7.11.5 is exactly that follow-up patch.
Validation
Targeted regression coverage for the contract change:
pytest -q tests/test_product_mode.py tests/test_cron_sync.py tests/test_doctor.py
125 passed
The full release wrapper also stayed green after the follow-up patch:
scripts/pre-release-verify.sh --release v7.11.5
2321 passed, 2 skipped, 1 xfailed, 4 xpassed
Operational result
On a Desktop-managed host, a runtime refreshed to v7.11.5 no longer oscillates between an installation_live warning and a watchdog FAIL over com.nexo.dashboard. The dashboard contract is stable again.
Full changelog entry → · src/product_mode.py · tests/test_product_mode.py