werkator build succeeded after 00:52
Three servers, three lessons the quirk table could not express before. NATS was the easy one: nats-server takes --port, and the flag wins over the port in the config the image ships. RabbitMQ reads RABBITMQ_NODE_PORT, but the port it is given is not the only one it derives from it — the Erlang distribution port is that plus 20000. A node port above 45535 makes it refuse to boot, and the kernel's ephemeral range, which freePort draws from, starts at 32768: more than half of werkdock's choices would have been wrong. A quirk can now cap what werkdock picks, and werkdock looks for a free port itself below the cap. A requested port above it is refused with the reason rather than handed to a server that dies in an Erlang stack trace. Mosquitto cannot be moved at all. Its port comes from the config the image ships, whose explicit listener switches off the default one that -p sets; measured, the flag is simply ignored. Its entry therefore names a user and no port knob — and it is still worth having, because without the user mosquitto does not start (it drops privileges itself and cannot setgroups in a user namespace), and with the entry werkdock reports 1883 unmoved instead of a port nothing answers on. All five tests for these are in werkprobe, including queue and topic delivery through RabbitMQ and a topic through MQTT. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>