--- title: "1.8.1 — Restarting nodes catch themselves up" description: "A node whose job engine restarts — which every deploy causes — now reconciles itself the moment it comes back, instead of depending on a broadcast it may have been offline for or waiting out the ten-minute sweep. Built on a new engine startup-hook point any app can register on. Also adds a scoped pu…" date: "2026-08-09" tags: ["release"] canonical: "https://django-mojo.sitesmojo.com/changelog/1-8-1/" --- A node whose job engine restarts — which every deploy causes — now reconciles itself the moment it comes back, instead of depending on a broadcast it may have been offline for or waiting out the ten-minute sweep. Built on a new engine startup-hook point any app can register on. Also adds a scoped publish-capture helper to testit that ends a class of parallel-test flakes. ### Added - Job engines have a startup hook point: `jobs.register_startup_hook("myapp.services.boot.on_engine_start")` from an app's `AppConfig.ready()`. Hooks run on the engine's worker pool when a runner daemon starts — never on shells, management commands, or test runs. - A hook that raises or fails to load is logged and skipped; it cannot prevent the engine from starting or delay job consumption. - `testit` gains `th.capture_publishes(match, side_effect=..., result=...)`: capture only the job publishes a test owns and forward everything else to the real publisher. Process-global publish mocks silently swallowed parallel modules' real jobs; the bundled test suites now use scoped capture throughout. ### Changed - Edge nodes converge on engine startup. A restarting node re-derives its own desired state immediately instead of waiting for the periodic sweep, closing the window where work addressed to "every runner" during a fleet restart quietly skipped the slowest machine. Honors `EDGE_CONVERGE_ENABLED`, runs locally, and publishes nothing.