(** The agent, as the compiler reaches it when both are in one process. [flan dev] builds one binary that is the compiled program and holds this compiler; the agent's listener thread and this one are threads in it. So a request that used to be a connect, a write and a read on a unix socket looping back into this address space is a call into [vendor/agent/flan_agent.c] instead. [None] means there is no agent in this process — the [flan] binary that builds the merged program, [flan reload], the two-process daemon, every test. The answer comes from the linker rather than from a flag: the symbol is weak in [dynload_stubs.c] and is null in a binary that links no [flan_agent.o]. [Dev] falls back to the socket on [None], which is what keeps [--two-process] working unchanged. What does *not* change is where a delivery lands. The agent still only publishes to its ring; the game thread picks the job up when it next reaches a frame boundary. The rule that keeps the collector away from the frame thread — the game thread never calls into OCaml, requests are left somewhere and picked up — is the same rule with the same mechanism. This is the compiler thread calling C, never the other way. *) external request : string -> string option = "flan_agent_direct"