9.4 KiB
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.mdtest 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:
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:
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:
## main...origin/main
Build
Command:
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.
-- 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:
/root/codex/Conduit/build/linux-rerun/package/.
Destination:
/var/lib/gamepanel/servers/c2b47a90/game/csgo/
CS2 container restarted:
gp_c2b47a90
Satisfactory was not touched:
/gp_d8f13411 exited running=false exit=130 oom=false
Load Check
RCON:
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:
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:
conduit_console
conduit_demo alpha bravo charlie
conduit_prof
Output:
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:
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:
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:
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:
conduit_concmd_stop
conduit_demo x
Output:
--- 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:
--- 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:
--- conduit_cvar conduit_demo_value ---
[Conduit] conduit_demo_value = 42 (int=42 float=42.000 bool=1)
Final cleanup after the re-register:
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:
/gp_c2b47a90 running running=true exit=0 oom=false
/gp_d8f13411 exited running=false exit=130 oom=false
Panel DB:
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.