Mount the worker source in dev so it cannot fall behind the engine
Docs / docs (push) Successful in 47s
Playwright Tests / test-playwright (1, 2) (push) Failing after 29s
Playwright Tests / test-playwright (2, 2) (push) Failing after 21s
pre-commit / pre-commit (push) Failing after 2m9s
Test Backend / test-backend (push) Failing after 51s
Compose Smoke Test / test-compose (push) Failing after 22s
Playwright Tests / merge-reports (push) Failing after 1m13s

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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StpRc2C6au1WJ1EUU7fsfu
This commit is contained in:
2026-08-23 19:15:06 +02:00
co-authored by Claude Opus 5
parent c8d12361d6
commit 0a49b6e947
2 changed files with 12 additions and 8 deletions
+7 -8
View File
@@ -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 <n> 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
+5
View File
@@ -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"