# Conduit Linux Console/ConVar Re-run - 2026-06-14 ## Scope - Pulled latest Conduit commits from `origin/main`. - Inspected the dynamic console command / convar diff and `docs/linux-bringup.md` test steps. - Rebuilt on Linux with GCC 12. - Deployed to CS2 server `Test Sunucusu`. - Verified dynamic command registration, dynamic command dispatch under profiler scope, plugin convar read/write, engine convar read/write, owner cleanup, and final server state. - Satisfactory server was not modified. ## Git Latest commits: ```text bb58461 (HEAD -> main, origin/main, origin/HEAD) Phase 2: dynamic console commands + convar access a3bd08f Close out Linux verification of the Entity + Player slice de4bda2 Phase 2: schema-backed Entity + Player access, with event bridge 4b79d33 Close out Linux verification of the Phase 2 GameEvents slice a5c1c13 docs: Linux re-test steps for the Phase 2 GameEvents slice ffb57f3 Phase 2 start: dispatch core + GameEvents, with an RTTI vtable finder ``` Pulled range: ```text Updating de4bda2..bb58461 Fast-forward PLAN.md | 4 +- core/CMakeLists.txt | 1 + core/src/conduit/commands.cpp | 52 ++++++++ core/src/conduit/console.cpp | 302 ++++++++++++++++++++++++++++++++++++++++++ core/src/conduit/console.h | 78 +++++++++++ core/src/plugin.cpp | 5 + docs/linux-bringup.md | 58 ++++++-- 7 files changed, 491 insertions(+), 9 deletions(-) create mode 100644 core/src/conduit/console.cpp create mode 100644 core/src/conduit/console.h ``` Working tree after the run: ```text ## main...origin/main ``` ## Build Command: ```sh cmake -S /root/codex/Conduit -B /root/codex/Conduit/build/linux-rerun -G Ninja \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_C_COMPILER=gcc-12 \ -DCMAKE_CXX_COMPILER=g++-12 cmake --build /root/codex/Conduit/build/linux-rerun ``` Result: build and link succeeded. ```text -- Configuring done -- Generating done -- Build files have been written to: /root/codex/Conduit/build/linux-rerun [1/4] Building CXX object core/CMakeFiles/conduit.dir/src/conduit/commands.cpp.o [2/4] Building CXX object core/CMakeFiles/conduit.dir/src/conduit/console.cpp.o [3/4] Building CXX object core/CMakeFiles/conduit.dir/src/plugin.cpp.o [4/4] Linking CXX shared library package/addons/conduit/bin/conduit.so ``` Only warning observed: the existing volatile compound-assignment warning in `commands.cpp`. No failed CMake/Ninja output exists because the build passed. The Linux link path for `CConVar` / `ConVarRefAbstract` symbols passed. ## Deploy Package source: ```text /root/codex/Conduit/build/linux-rerun/package/. ``` Destination: ```text /var/lib/gamepanel/servers/c2b47a90/game/csgo/ ``` CS2 container restarted: ```text gp_c2b47a90 ``` Satisfactory was not touched: ```text /gp_d8f13411 exited running=false exit=130 oom=false ``` ## Load Check RCON: ```text rcon: authenticated --- meta list --- Listing 1 plugin: [01] Conduit (0.1.0-dev) by Conduit Contributors --- conduit_status --- Conduit 0.1.0-dev uptime : 47.4 s game frames : 2251 log file : /home/steam/cs2-dedicated/game/csgo/addons/conduit/logs/conduit-20260614.log crash report: armed (use conduit_crash_test to verify) ``` Startup log: ```text 2026-06-14 14:19:24 [INFO] gamedata: 1 files loaded: 0 signatures, 0 offsets, all valid 2026-06-14 14:19:25 [INFO] entity: armed via CGameEntitySystem vtable 0x7f4c8640ffd8 - entity system not created yet, will resolve on first use after map load 2026-06-14 14:19:25 [INFO] gameevents: armed via CGameEventManager vtable 0x7f4c86410f50 - instance captured on next LoadEventsFromFile 2026-06-14 14:19:25 [INFO] core: Conduit 0.1.0-dev loaded - crash reporter armed, profiler on 2026-06-14 14:19:25 [INFO] gameevents: game event manager connected (0x7f4c86790460) - event listening live 2026-06-14 14:19:36 [INFO] core: first GameFrame observed - hook dispatch confirmed ``` Result: plugin loaded, frames advanced, no Conduit/Metamod load failure. ## Dynamic Command and Profiler Commands: ```text conduit_console conduit_demo alpha bravo charlie conduit_prof ``` Output: ```text rcon: authenticated --- conduit_console --- [Conduit] [INFO] console: command 'conduit_demo' registered (owner 'console_demo') [Conduit] [INFO] console: convar 'conduit_demo_value' created (owner 'console_demo') console: ready, 1 command(s), 1 plugin convar(s) cmd conduit_demo owner=console_demo cvar conduit_demo_value owner=console_demo value=7 --- conduit_demo alpha bravo charlie --- [Conduit] [INFO] console_demo: conduit_demo invoked: argc=4 args='alpha bravo charlie' issuer=server(-1) --- conduit_prof --- owner callsite calls avg p50 p99 max total engine GameFrame 3409 2.53ms 4.19ms 8.39ms 47.48ms 8.62s console_demo conduit_demo 1 63.1us 65.5us 65.5us 63.1us 63.1us ``` Result: dynamic command dispatch works and is profiled under `console_demo / conduit_demo`. ## ConVar Tests Commands: ```text conduit_cvar conduit_demo_value conduit_cvar conduit_demo_value 42 conduit_cvar conduit_demo_value conduit_cvar sv_cheats conduit_cvar sv_gravity conduit_cvar sv_gravity 700 conduit_cvar sv_gravity ``` Output: ```text rcon: authenticated --- conduit_cvar conduit_demo_value --- [Conduit] conduit_demo_value = 7 (int=7 float=7.000 bool=1) --- conduit_cvar conduit_demo_value 42 --- [Conduit] set 'conduit_demo_value' = '42' [Conduit] conduit_demo_value = 42 (int=42 float=42.000 bool=1) --- conduit_cvar conduit_demo_value --- [Conduit] conduit_demo_value = 42 (int=42 float=42.000 bool=1) --- conduit_cvar sv_cheats --- [Conduit] sv_cheats = false (int=0 float=0.000 bool=0) --- conduit_cvar sv_gravity --- [Conduit] sv_gravity = 800.000000 (int=800 float=800.000 bool=1) --- conduit_cvar sv_gravity 700 --- L 06/14/2026 - 14:20:43: server_cvar: "sv_gravity" "700.000000" [Conduit] set 'sv_gravity' = '700' [Conduit] sv_gravity = 700.000000 (int=700 float=700.000 bool=1) --- conduit_cvar sv_gravity --- [Conduit] sv_gravity = 700.000000 (int=700 float=700.000 bool=1) ``` Result: plugin-owned convar read/write passed. Engine convar read/write passed. `sv_gravity` was restored: ```text rcon: authenticated --- conduit_cvar sv_gravity 800 --- L 06/14/2026 - 14:20:56: server_cvar: "sv_gravity" "800.000000" [Conduit] set 'sv_gravity' = '800' [Conduit] sv_gravity = 800.000000 (int=800 float=800.000 bool=1) --- conduit_cvar sv_gravity --- [Conduit] sv_gravity = 800.000000 (int=800 float=800.000 bool=1) ``` ## Owner Cleanup Commands: ```text conduit_concmd_stop conduit_demo x ``` Output: ```text --- conduit_concmd_stop --- [Conduit] removed 2 demo registration(s) --- conduit_demo x --- ``` Result: `conduit_demo x` produced no handler line after cleanup, so the command was removed from the engine. I then called `conduit_console` again to probe the persistence/adopt path: ```text --- conduit_console --- [Conduit] [INFO] console: command 'conduit_demo' registered (owner 'console_demo') [Conduit] [INFO] console: convar 'conduit_demo_value' already registered - adopting (owner 'console_demo') console: ready, 1 command(s), 0 plugin convar(s) cmd conduit_demo owner=console_demo ``` The persisted convar value remained available: ```text --- conduit_cvar conduit_demo_value --- [Conduit] conduit_demo_value = 42 (int=42 float=42.000 bool=1) ``` Final cleanup after the re-register: ```text rcon: authenticated --- conduit_cvar conduit_demo_value --- [Conduit] conduit_demo_value = 42 (int=42 float=42.000 bool=1) --- conduit_concmd_stop --- [Conduit] removed 1 demo registration(s) --- conduit_demo x --- --- conduit_status --- Conduit 0.1.0-dev uptime : 115.6 s game frames : 6615 log file : /home/steam/cs2-dedicated/game/csgo/addons/conduit/logs/conduit-20260614.log crash report: armed (use conduit_crash_test to verify) --- conduit_prof --- owner callsite calls avg p50 p99 max total engine GameFrame 6617 2.34ms 4.19ms 8.39ms 47.48ms 15.50s console_demo conduit_demo 1 63.1us 65.5us 65.5us 63.1us 63.1us ``` ## Finding The adopt path works for name-based access: `conduit_demo_value` stayed at `42` and could be read after re-registration. Potential mismatch: after adoption, `conduit_console` reported `0 plugin convar(s)` and did not list `conduit_demo_value`, despite logging `already registered - adopting`. That means the existing convar is not represented in `g_convars`, so owner cleanup removed only the command on the second cleanup (`removed 1 demo registration(s)`). If the intended behavior is "adopted convars are tracked and listed as plugin-owned", this needs a small fix. If "adopt" only means "treat existing engine convar as accessible by name", the runtime behavior is consistent. ## Final State Docker: ```text /gp_c2b47a90 running running=true exit=0 oom=false /gp_d8f13411 exited running=false exit=130 oom=false ``` Panel DB: ```text uuid | name | status | slug | port ----------+----------------+---------+--------------+------- c2b47a90 | Test Sunucusu | running | cs2 | 27015 d8f13411 | MukemmelSunucu | stopped | satisfactory | 7777 (2 rows) ``` No Conduit/Metamod/signal-specific load failure or crash was observed. Server console had ordinary CS2/Steam/map warnings only.