Process exit codes
The worker refuses to run when any of these are detected at start. The failure exits the process with the code; nothing on the server is touched.MISSING_SESSION_KEYS and DUPLICATE_SECTION_TARGET are raised by the session_agent_harness section
validator, which the loader runs at preflight; they still exit the process before any section is contacted.
DUPLICATE_SECTION_TARGET has a second, section-level realization too: when a section’s session_id is
a spelling (uuid or alias) that resolves, after attach, to a session another section is already serving
under a different spelling — something this static check cannot see — that one section refuses while the
rest of the worker keeps running. See
Session Agent Harness → Reference.
Section, thread, and transient codes are scoped to a job type. For session_agent_harness, see
Reference.
Instance command codes
These come fromblobhub-worker instance show/instance stop, not from start’s preflight — they are
raised while inspecting or stopping an already-running worker, not while one is coming up.
Full behavior:
blobhub-worker instance.
Generic limitations
These trade-offs apply regardless of which job type a section runs. Job-type-specific limitations are documented with the job type.No hot configuration reload
Editing the profile’sconfig.yaml does not affect a running worker. Restart the worker
(blobhub-worker start) to pick up changes.
Single-process per profile
Each worker runs in a single Python process and does not distribute work across machines or scale beyondconcurrency.max_agents (in-process). The lock is held per profile, not per machine, so
one machine may run several workers side by side — --profile prod and --profile staging at once, each with
its own configuration, cursors and lock. What is still refused is a second worker on the same profile.

