Repository navigation
Conversation
Rewrite the statements the released code no longer supports: the client API in the examples, the data-channel socket pattern, result streaming, enum dispatch, and the multi-node claim. Describe the transport family, the socket root and the launch check that keeps servers apart. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Brings
paper.mdin line with the code at v0.6.4 (1d8160b, which is alsomain). No library code changes. Paths below are undersrc/zmqruntime/unless they start withtests/oropenhcs/. The repository has noCHANGELOG.md, so the source was the only reference.Nothing was executed: the machine was loaded, no environment was created and no test was run. Every name and call signature in the code example was checked by reading the source:
ExecutionClientandExecutionSubmissionResponseare importable fromzmqruntime.execution(execution/init.py:11, 26-30),ExecuteRequestfromzmqruntime.messages(messages.py:591-604), the three abstract methods the subclass must define areserialize_task(execution/client.py:388),_spawn_server_processandsend_data(client.py:1473-1479), the constructor takesport(execution/client.py:52-61), andlaunch().to_argument(),submit_execution(task, config),ExecutionSubmissionResponse.from_wire(...).require_execution_id(context)andwait_for_completion(execution_id)exist with those signatures (client.py:927; messages.py:1022; execution/client.py:94, 118; execution/responses.py:74, 86). The example was not run.serve.py,pipeline_codeandconfig_codein it are placeholders, as in the old example.Claim ledger
submit_executionreturns the ID;poll_statusandwait_for_completionfollow itfrom zmqruntime import ExecutionClientExecutionClientis not exported from the package root; the example imports it fromzmqruntime.executionExecutionClient(port=5555)can be instantiatedserialize_task,_spawn_server_process,send_data); the example now defines a subclassclient.execute(...)is non-blocking and "returns execution_id immediately" (twice)executesubmits and then waits for completion. The example usessubmit_executionclient.get_status(exec_id),client.get_results(exec_id)(three uses)poll_status/wait_for_completion; the second code block was removedgrep -rn "get_results|def get_status" srcis emptyconnectattaches to a usable server or starts one". How the process is started is the application's abstract_spawn_server_process; the library owns the lock, the readiness wait and the check that the server which answered is the one just startedControlMessageType.dispatchandget_handler_methodControlMessageTypeis a plain enum with eight members and no methods.ExecutionServerholds a dict from member to bound handler. The listing was removedzmqruntime"powers distributed execution in OpenHCS"Found false or misleading: 13 of 23 (4, 5, 6, 8, 9, 10, 11, 14, 15, 16, 18, 21, 22). Unverifiable: 19 (and the node count in 21).
New statements, with their source
TransportDeclaration(abstract) withTcpTransportDeclarationandIpcTransportDeclaration;TransportModeresolves a member to its class through the registry (transport_modes.py:32, 264, 426; config.py:17-29).<prefix>-<port>.sockinsocket_root() / ipc_socket_dir;socket_root()defaults to~/.<app_name>and is the override point (transport_modes.py:454-463; config.py:95-106, 128-136). OpenHCS overrides it per checkout (openhcs/runtime/zmq_config.py:85).private_endpointyields a config whose socket directory is a newprivate-*directory under the socket root, removed on exit (transport_modes.py:588-600; tests/test_transport.py:199-223).EndpointLaunchwith the code root, the starting process and the audience (server.py:102-104, 289-303; messages.py:953-996).EndpointLaunchMismatchError, and the refused server is left running (client.py:954-971, 1212-1223; messages.py:1002-1015, 1032-1041; tests/test_endpoint_launch.py:63-88).ExecutionServermaps eachControlMessageTypemember to a handler (messages.py:404-416, 591-710; execution/server.py:96-104).For the owner
Places where the code does less than "isolation" might suggest. These are findings, and the paper does not claim otherwise:
ZMQClient.shutdown_endpoint_on_port(client.py:1404-1431) sends a shutdown to whatever answers at the address if it advertises the capability; it compares no code root or audience. A process that knows the address can stop another session's server.connectcan still kill a process it did not start. When the address is occupied but nothing answers a ready ping, and no live startup owner is recorded,_connect_lockedcallskill_processes_on_portfor both ports (client.py:1140-1152). For TCPpreserve_unresponsive_endpointis alwaysFalseand the kill targets any local process listening on that port number, also when the client's host is remote (transport_modes.py:336-368). For IPC a socket with a live binder is preserved (transport_modes.py:547-552). A server that answers and is refused is never killed.private_endpointreserves nothing. It returns the first unbound port pair; the docstring says another process can bind it first (transport_modes.py:412-423). The paper states the private directory only "for IPC".launched_byrecords itself as owner and never sees an orphan (server.py:66-70, 100-104). Passing it is the application's job in_spawn_server_process._interrupt_executionterminates every Python child of the server that is not a preserved kind (execution/server.py:381-384, 494-508). With one execution running at a time this is the running one's workers. The thread runningexecute_taskis not interrupted.ZMQServer.kill_processes_on_port(server.py:341-373,lsof/kill -9/taskkill) has no caller in the library.*this trusts every peer that can reach the port. The paper does not discuss security; you may want a sentence.Could not verify:
paper.bib; JOSS reviewers usually ask for citations here. I added none because I could not confirm DOIs from this machine.ubuntu-latestonly (.github/workflows/tests.yml:11, 27). The Windows statement in the paper is read fromis_supported, not from a test run.Bib changes:
Hintjens2013changed from@articleto@book(it is the O'Reilly book; fields unchanged) and is now cited once at the first mention of ZeroMQ. The old paper cited nothing, so all three entries were unused.Beazley2009andGorelick2020remain unused and will not render; delete them or cite them. No reference was added.Not changed: title, front matter (the
dateis still 15 January 2026), authors, section headings. The old paper had no acknowledgements or AI-usage section.Word count (
wc -w paper.md): 420 before, 481 after.🤖 Generated with Claude Code