# Conduit Linux Accumulated Re-run - 2026-06-15 ## Scope - Pulled all accumulated commits from `origin/main`. - Inspected the changed files and current `docs/linux-bringup.md`. - Rebuilt Conduit on Linux with GCC 12. - Deployed to CS2 server `Test Sunucusu`. - Verified the new timer, chat interception, usermessage/chat-send, and console adopt paths. - Cleaned temporary test subscriptions/timers/commands. - Satisfactory server was not modified. ## Git Previous local HEAD before this run: ```text bb58461 Phase 2: dynamic console commands + convar access ``` Pulled commits: ```text 43855ff PLAN: chat ships plain (white) via UTIL_SayTextFilter; color is a follow-up 8afbeec chat: send via UTIL_SayTextFilter again (plain text works; SayText2 shows nothing) faded69 docs: refresh README (Phase 2 status + what works) and PLAN chat-send entry 18e7970 chat colors: prefer UTIL_SayText2Filter (renders color codes) 1743147 PLAN: chat send visually verified on Windows (msgType 0 = chat); colors pending 4b3d322 PLAN: correct the chat-send entry (native UTIL_SayTextFilter, SDK drift finding) 4ba6019 chat sending: call native UTIL_SayTextFilter instead of building the usermessage a4af862 Phase 2: usermessages + chat sending (SayText2) 6985830 Phase 2: chat interception (say / say_team) a375e05 Phase 2: game-thread timers driven by GameFrame 62e4ca0 Close out Linux verification of the Commands & ConVars slice 15cc25e console: track adopted convars under their owner ``` Diff summary: ```text PLAN.md | 8 +- README.md | 17 +++- core/CMakeLists.txt | 3 + core/src/conduit/chat.cpp | 165 ++++++++++++++++++++++++++++++++++++++ core/src/conduit/chat.h | 46 +++++++++++ core/src/conduit/commands.cpp | 131 ++++++++++++++++++++++++++++++ core/src/conduit/console.cpp | 23 +++++- core/src/conduit/timers.cpp | 181 ++++++++++++++++++++++++++++++++++++++++++ core/src/conduit/timers.h | 47 +++++++++++ core/src/conduit/usermsg.cpp | 147 ++++++++++++++++++++++++++++++++++ core/src/conduit/usermsg.h | 23 ++++++ core/src/plugin.cpp | 16 ++++ docs/linux-bringup.md | 76 +++++++++++++++--- gamedata/core.json | 15 +++- ``` 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/7] Building CXX object core/CMakeFiles/conduit.dir/src/conduit/timers.cpp.o [2/7] Building CXX object core/CMakeFiles/conduit.dir/src/conduit/commands.cpp.o [3/7] Building CXX object core/CMakeFiles/conduit.dir/src/conduit/usermsg.cpp.o [4/7] Building CXX object core/CMakeFiles/conduit.dir/src/conduit/console.cpp.o [5/7] Building CXX object core/CMakeFiles/conduit.dir/src/conduit/chat.cpp.o [6/7] Building CXX object core/CMakeFiles/conduit.dir/src/plugin.cpp.o [7/7] Linking CXX shared library package/addons/conduit/bin/conduit.so ``` Only warning observed: ```text /root/codex/Conduit/core/src/conduit/commands.cpp:521:13: warning: compound assignment with volatile-qualified left operand is deprecated [-Wvolatile] ``` No failed CMake/Ninja output exists because the build passed. ## Deploy And Load Deployed: ```text /root/codex/Conduit/build/linux-rerun/package/. ``` To: ```text /var/lib/gamepanel/servers/c2b47a90/game/csgo/ ``` Load checks: ```text --- meta list --- Listing 1 plugin: [01] Conduit (0.1.0-dev) by Conduit Contributors --- conduit_status --- Conduit 0.1.0-dev uptime : 73.6 s game frames : 3983 log file : /home/steam/cs2-dedicated/game/csgo/addons/conduit/logs/conduit-20260615.log crash report: armed (use conduit_crash_test to verify) ``` Gamedata and usermessage function resolution: ```text --- conduit_gamedata --- gamedata: 1 files, 2 signatures, 0 offsets [ok] UTIL_SayText2Filter server 0x7fd2de250b30 (core.json) [ok] UTIL_SayTextFilter server 0x7fd2de2508d0 (core.json) --- conduit_usermsg --- [Conduit] [INFO] usermsg: chat sending live via UTIL_SayTextFilter (0x7fd2de2508d0) - plain text, no color yet usermessages: chat sending live (SayText2 resolved, SayText resolved) ``` Startup log: ```text 2026-06-15 10:50:26 [INFO] gamedata: 1 files loaded: 2 signatures, 0 offsets, all valid 2026-06-15 10:50:27 [INFO] entity: armed via CGameEntitySystem vtable 0x7fd2dec4ffd8 2026-06-15 10:50:27 [INFO] gameevents: armed via CGameEventManager vtable 0x7fd2dec50f50 2026-06-15 10:50:27 [INFO] chat: ready - hook installs on first subscriber 2026-06-15 10:50:27 [INFO] core: Conduit 0.1.0-dev loaded - crash reporter armed, profiler on 2026-06-15 10:50:27 [INFO] gameevents: game event manager connected (0x7fd2defd0460) 2026-06-15 10:50:37 [INFO] core: first GameFrame observed - hook dispatch confirmed ``` Entity system still resolves on Linux at `GameResourceServiceServerV001+0x50`: ```text --- conduit_entity --- [Conduit] [INFO] entity: entity system connected (0x7fd2da446000) via GameResourceServiceServerV001+0x50 - vtable matches CGameEntitySystem entity system: connected slot 0 cs_player_controller team=2 pawn=player health=100 slot 1 cs_player_controller team=3 pawn=player health=100 ``` ## Timer Tests Schedule/list: ```text --- conduit_timer_after 2 --- [Conduit] one-shot timer #1 scheduled in 2.00 s --- conduit_timer_every 1 --- [Conduit] repeating timer #2 every 1.00 s (stops after 5) --- conduit_timers --- timers: 2 active #1 owner=timer_test once next in 1938 ms #2 owner=timer_test repeat next in 969 ms ``` Log block: ```text 2026-06-15 10:51:55 [INFO] timer_test: repeat timer tick 1 2026-06-15 10:51:56 [INFO] timer_test: one-shot timer fired 2026-06-15 10:51:56 [INFO] timer_test: repeat timer tick 2 2026-06-15 10:51:57 [INFO] timer_test: repeat timer tick 3 2026-06-15 10:51:58 [INFO] timer_test: repeat timer tick 4 2026-06-15 10:51:59 [INFO] timer_test: repeat timer tick 5 2026-06-15 10:51:59 [INFO] timer_test: repeat timer self-cancelled after 5 ticks ``` After firing: ```text --- conduit_timers --- timers: 0 active --- conduit_prof --- timer_test timer 6 71.5us 131.1us 131.1us 101.4us 429.0us ``` Group cancel: ```text --- conduit_timer_every 1 --- [Conduit] repeating timer #3 every 1.00 s (stops after 5) --- conduit_timer_after 30 --- [Conduit] one-shot timer #4 scheduled in 30.00 s --- conduit_timers --- timers: 2 active #3 owner=timer_test repeat next in 937 ms #4 owner=timer_test once next in 29969 ms --- conduit_timer_stop --- [Conduit] cancelled 2 test timer(s) --- conduit_timers --- timers: 0 active ``` Result: timers passed, including self-cancel from inside callback and owner group cancel. ## Chat Interception Tests RCON output: ```text --- conduit_chat --- chat: 0 subscriber(s), interception hook off --- conduit_chat_listen --- [Conduit] [INFO] chat: 'chat_test' subscribed to chat [Conduit] listening to chat --- conduit_chat --- chat: 1 subscriber(s), interception hook on owner=chat_test hits=0 --- say "hello from server" --- [Conduit] [INFO] chat_test: say slot=-1: "hello from server" [All Chat][Console (0)]: "hello from server" L 06/15/2026 - 10:53:03: "Console<0>" say ""hello from server"" --- say "this has badword inside" --- [Conduit] [INFO] chat_test: say slot=-1: "this has badword inside" [SUPPRESSED] --- say_team "x" --- [Conduit] [INFO] chat_test: say_team slot=-1: "x" --- conduit_prof --- chat_test chat 3 97.0us 131.1us 131.1us 127.4us 290.9us ``` Conduit log: ```text 2026-06-15 10:53:03 [INFO] chat: 'chat_test' subscribed to chat 2026-06-15 10:53:03 [INFO] chat_test: say slot=-1: "hello from server" 2026-06-15 10:53:03 [INFO] chat_test: say slot=-1: "this has badword inside" [SUPPRESSED] 2026-06-15 10:53:03 [INFO] chat_test: say_team slot=-1: "x" ``` The suppressed `badword` message did not echo as `[All Chat]` in the RCON output. Cleanup: ```text --- conduit_chat_stop --- [Conduit] removed 1 chat subscriber(s) --- conduit_chat --- chat: 0 subscriber(s), interception hook off --- say "after stop visible" --- [All Chat][Console (0)]: "after stop visible" L 06/15/2026 - 10:53:20: "Console<0>" say ""after stop visible"" --- conduit_chat --- chat: 0 subscriber(s), interception hook off ``` Result: chat interception, suppression, say_team distinction, profiler scope, and hook removal all passed. ## Chat Sending / UserMessages Commands: ```text --- conduit_usermsg --- usermessages: chat sending live (SayText2 resolved, SayText resolved) --- conduit_say linux broadcast test --- [Conduit] PrintToAll sent --- conduit_say_player 0 private_ping --- [Conduit] PrintToPlayer(0) sent --- conduit_usermsg --- usermessages: chat sending live (SayText2 resolved, SayText resolved) ``` Result: Linux signatures resolve and native send calls return `sent`. This verifies the server-side path and no crash. I cannot visually confirm client rendering from this environment; per latest plan this path sends plain white text through `UTIL_SayTextFilter`. ## Console Adopt Fix This re-tested the previously observed adopted-convar listing issue. ```text --- 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_cvar conduit_demo_value 42 --- [Conduit] set 'conduit_demo_value' = '42' [Conduit] conduit_demo_value = 42 (int=42 float=42.000 bool=1) --- conduit_concmd_stop --- [Conduit] removed 2 demo registration(s) --- 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), 1 plugin convar(s) cmd conduit_demo owner=console_demo cvar conduit_demo_value owner=console_demo value=42 ``` Final cleanup: ```text --- conduit_concmd_stop --- [Conduit] removed 2 demo registration(s) --- conduit_demo x --- ``` Result: adopt tracking is fixed. Adopted convar now appears under `1 plugin convar(s)` and owner cleanup removes 2 registrations. ## Final Runtime State ```text --- conduit_status --- Conduit 0.1.0-dev uptime : 248.6 s game frames : 15184 log file : /home/steam/cs2-dedicated/game/csgo/addons/conduit/logs/conduit-20260615.log crash report: armed (use conduit_crash_test to verify) --- conduit_timers --- timers: 0 active --- conduit_chat --- chat: 0 subscriber(s), interception hook off --- conduit_events --- game events: manager connected, 0 subscription(s), 0 event(s) registered, FireEvent detour off --- conduit_usermsg --- usermessages: chat sending live (SayText2 resolved, SayText resolved) ``` Final profiler: ```text engine GameFrame 13848 2.77ms 4.19ms 8.39ms 39.34ms 38.34s timer_test timer 6 71.5us 131.1us 131.1us 101.4us 429.0us chat_test chat 3 97.0us 131.1us 131.1us 127.4us 290.9us core SchemaFindField 3 13.2us 8.2us 32.8us 31.7us 39.5us ``` ## Final Server 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) ``` ## Notes - No Conduit/Metamod/signal-specific load failure or crash was observed. - Server console contained ordinary CS2/Steam/map warnings and warmup long-frame messages. - No watchdog stall block appeared during this run. - CS2 panel status was `stopped` after Docker restart; I updated only the CS2 row back to `running`. Satisfactory remained `stopped`.