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 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 service hands PID 1 to an init that does reap orphans, and would close the whole class
rather than one source of it. rather than one source of it.
- BUG/NODE: **every python node on the dev stack fails to build** with - CHORE/INFRA: the engine and the worker speak a version-matched protocol, but only the
`RemoteError: the worker answered request None while <n> was outstanding` — the reply the engine hot-reloads — uvicorn watches `/app/backend`, and a worker process holds the code
pool read off the pipe parsed as JSON but carried neither an `id` nor an `event`, so it started with until it is respawned. So a protocol change reaches one side and not the
`_exchange` retires the worker and the node goes red. It is not the rebuild scope: a other, which is how every python node came to fail with `RemoteError: the worker answered
whole-pipeline `reload()` produces the same error on the same nodes. Worth checking against request None`. `compose.dev.yml` now mounts `worker/fluksio_worker` beside
the orphaned workers above, since both follow uvicorn `--reload`. It is why `backend/fluksio`, which closes the image half. The reload half is open: editing worker
`runtime.spec.ts` "the logs panel shows what a node printed" fails — nothing runs, so source restarts nothing, and the running pool keeps the old code.
nothing prints.
- CHORE/UI: the portal's aggregate tiles have no not-reporting state. A figure an - 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 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 # sync above — only `docker compose watch` does. Without the mount the
# container serves the source baked into the image until it is rebuilt. # container serves the source baked into the image until it is rebuilt.
- ../backend/fluksio:/app/backend/fluksio - ../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: environment:
SMTP_HOST: "mailcatcher" SMTP_HOST: "mailcatcher"
SMTP_PORT: "1025" SMTP_PORT: "1025"