From 775d151307deeb9e711ee79256e0897a5eb758a1 Mon Sep 17 00:00:00 2001 From: stroblme Date: Sun, 23 Aug 2026 19:15:06 +0200 Subject: [PATCH] Mount the worker source in dev so it cannot fall behind the engine The engine and the worker speak a version-matched protocol, but compose.dev.yml mounted only backend/fluksio: a reloaded engine talked to the worker baked into the image. Adding the request id to that protocol therefore left every python node failing with "the worker answered request None", because the old worker echoed no id at all. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01StpRc2C6au1WJ1EUU7fsfu --- NOTEPAD.md | 15 +++++++-------- docker/compose.dev.yml | 5 +++++ 2 files changed, 12 insertions(+), 8 deletions(-) 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"