diff --git a/NOTEPAD.md b/NOTEPAD.md index a4e026d..6f4a19e 100644 --- a/NOTEPAD.md +++ b/NOTEPAD.md @@ -72,14 +72,13 @@ Specific changes reloader, which reaps nothing that is not its own child. `init: true` on the backend service hands PID 1 to an init that does reap orphans, and would close the whole class rather than one source of it. -- BUG/NODE: **every python node on the dev stack fails to build** with - `RemoteError: the worker answered request None while was outstanding` — the reply the - pool read off the pipe parsed as JSON but carried neither an `id` nor an `event`, so - `_exchange` retires the worker and the node goes red. It is not the rebuild scope: a - whole-pipeline `reload()` produces the same error on the same nodes. Worth checking against - the orphaned workers above, since both follow uvicorn `--reload`. It is why - `runtime.spec.ts` "the logs panel shows what a node printed" fails — nothing runs, so - nothing prints. +- CHORE/INFRA: the engine and the worker speak a version-matched protocol, but only the + engine hot-reloads — uvicorn watches `/app/backend`, and a worker process holds the code + it started with until it is respawned. So a protocol change reaches one side and not the + other, which is how every python node came to fail with `RemoteError: the worker answered + request None`. `compose.dev.yml` now mounts `worker/fluksio_worker` beside + `backend/fluksio`, which closes the image half. The reload half is open: editing worker + source restarts nothing, and the running pool keeps the old code. - CHORE/UI: the portal's aggregate tiles have no not-reporting state. A figure an installation never sends renders through `?? 0`, so a missing field reads as a confident diff --git a/docker/compose.dev.yml b/docker/compose.dev.yml index 69a4fc3..7ed4204 100644 --- a/docker/compose.dev.yml +++ b/docker/compose.dev.yml @@ -112,6 +112,11 @@ services: # sync above — only `docker compose watch` does. Without the mount the # container serves the source baked into the image until it is rebuilt. - ../backend/fluksio:/app/backend/fluksio + # The worker speaks a protocol the engine version-matches, so mounting one + # without the other leaves a reloaded engine talking to the worker baked + # into the image — which is how every python node came to fail with + # "the worker answered request None" after a protocol change. + - ../worker/fluksio_worker:/app/worker/fluksio_worker environment: SMTP_HOST: "mailcatcher" SMTP_PORT: "1025"