v2.4.0 — notebook-bridge stale-state fix (#29)
Fixes the JupyterLab notebook-frontend bridge degrading mid-session (#29): notebook_add_cell / notebook_execute_active_cell time out and serve stale cells while the kernel stays alive.
Fixes
- #30 listener-leak: disconnect the previous active cell's
sharedModel.changedlistener before tracking the new one — eliminates the growing concurrent-snapshot storm that wedges the single JupyterLab message chain. - #32
notebook_execute_code: bridge-independent kernel execution via a loopbackjupyter_clientZMQexecute_request. The only route a%gui qtkernel services — recovers measurements even when the frontend bridge is degraded. - #33 frontend hardening: serialized comm handlers (per-comm promise chain, non-blocking
onMsg),NotebookActions.runfired without awaiting, 15s self-healing comm keepalive. - e2e bridge-resilience tests (
test_13_bridge_resilience).
Validation: subset silver bench (6 historically-wedging tasks ×3 seeds) on a sidecar built from this code = 18/18 smoke_pass, 0/18 wedge-signature (vs 7 flagged on the same tasks unfixed); the prior exemplar QDB_SUZ84YW9X went 0/4 (wedged) → 3/4 (clean). e2e 8/8; local repro 30/30 cycles clean.