# Module Dependencies in Luprex Modules are listed in dependency order — each module's dependencies all appear earlier in the list. Where a dependency comes only from the `.cpp` file (not the `.hpp`), it is marked **(cpp-only)**. - **eng-malloc** — custom deterministic memory allocator - **enginewrapper** — pure C interface for driver/driven boundary - **spookyv2** — hash function - **util** → spookyv2 - **luastack** → util - **luavector** → luastack - **traceback** → luastack - **debugcollector** → util - **streambuffer** → eng-malloc, luastack, util - **table** → luastack - **pprint** → luastack, table, util - **drivenengine** → enginewrapper, invocation, streambuffer, util - **json** → luastack, util - **http** → drivenengine, json(cpp-only), luastack, streambuffer - **planemap** → luastack, util - **luasnap** → luastack, streambuffer - **serializelua** → luastack, streambuffer - **sched** → luastack, streambuffer - **idalloc** → debugcollector, luastack, streambuffer - **invocation** → enginewrapper, streambuffer - **source** → debugcollector, luastack, luasnap, streambuffer, table(cpp-only), traceback, util - **animqueue** → debugcollector, luastack, streambuffer, util - **printbuffer** → debugcollector, invocation, streambuffer, util - **world** → animqueue, debugcollector, http, idalloc, invocation, luasnap, luastack, planemap, printbuffer, pprint, sched, serializelua, source, streambuffer, table, traceback - **lpxclient** → drivenengine, invocation, printbuffer, util, world - **lpxserver** → drivenengine, luastack, printbuffer, util, world - **eng-tests** → drivenengine, streambuffer, world ## Observations ### http depends on drivenengine (header-level) `http.hpp` includes `drivenengine.hpp` because it uses `SharedChannel` (defined in drivenengine). Meanwhile, `world` depends on both `http` and `drivenengine`, and `drivenengine` depends on `world`. This creates a layering tangle: ``` world -> http -> drivenengine -> world ``` The `SharedChannel` type (`std::shared_ptr`) is really an I/O concept from the driver boundary. Moving `SharedChannel` and `Channel` into a smaller, lower-level header (perhaps `enginewrapper.hpp` or a new `channel.hpp`) would let `http` drop its dependency on `drivenengine` entirely. ### world is a mega-consumer (16 dependencies) `world` depends on nearly every other module. This is expected for the central game-state container, but it does make `world` hard to test in isolation. The `world-*.cpp` split into multiple files helps readability but doesn't reduce coupling.