This is a map of the tree as it stands, not a specification. Where it and an
ADR disagree, the ADR is the decision and this page is out of date; say so and
fix it.
The parts
The shell spawns
cordial-run as a sibling binary with --lib-dir --apk --profile --host-libc --game-activity, and hands over the profile’s flock.
Rules that shape it
Nothing points into the engine.libroblox.so is mapped, relocated and
called, and that is all. Every arrow touching it points outward: the engine asks,
Cordial answers. There is no hooking, patching or injected script environment;
those are absent from the API, not disabled, so a fork has no primitive to
re-enable
(ADR-001,
ADR-003).
Plugins never reach the engine side. They talk to the broker, which holds the
permission and performs the effect; presence.set takes a presence structure and
Cordial owns the Discord socket
(ADR-007). The bwrap layer under
Deno can only subtract
(ADR-018).
One process is one window is one profile. A profile is storage; an instance
is a window. Several clients may run at once, but two on one profile are refused,
because two processes writing one appData and one cookie store corrupt Roblox’s
storage (ADR-012).
The engine’s network stack is not touched. Cordial does not proxy, inspect or
rewrite it: Roblox’s cURL talks to Roblox directly, and RtcIoRna, the real-time
game transport, is not HTTP at all. That is why there is no http_proxy-shaped
setting and the per-profile VPN gate is a launch gate rather than a tunnel
(ADR-016).
How the engine is answered
Every name the engine imports resolves one of three ways. The split is printed at startup (about 99 Cordial, 502 host glibc, 49 stubs), so it can be checked rather than assumed.
A stub that returns success sends the engine off on an answer that is not true,
and it fails somewhere unrelated.
native/opensles.cpp returns
SL_RESULT_FEATURE_UNSUPPORTED instead of a dead engine object; that is the
pattern.
The renderer is chosen by absence. The engine imports zero Vulkan symbols and
91 EGL/GL ones, and picks its backend with dlopen at run time. Selecting GLES
means withholding the virtual libvulkan soname; there is no flag for it.
FStringDebugGraphicsPreferredBackend was measured to be inert and the code that
set it was deleted.