[INFO] cloning repository https://github.com/charlenopires/tictactoe-multiplayer
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/charlenopires/tictactoe-multiplayer" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fcharlenopires%2Ftictactoe-multiplayer", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fcharlenopires%2Ftictactoe-multiplayer'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 611fae918d02aa0cde4728b40759feded53bf446
[INFO] checking charlenopires/tictactoe-multiplayer/611fae918d02aa0cde4728b40759feded53bf446 against d8df82673d5911b6112a85bf91d9adefb2c66a1a for pr-162242
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fcharlenopires%2Ftictactoe-multiplayer" "/workspace/builds/worker-3-tc1/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-3-tc1/source'...
[INFO] [stderr] done.
[INFO] [stderr] Updating files:  17% (1606/9220)
Updating files:  18% (1660/9220)
Updating files:  19% (1752/9220)
Updating files:  19% (1772/9220)
Updating files:  20% (1844/9220)
Updating files:  20% (1908/9220)
Updating files:  21% (1937/9220)
Updating files:  22% (2029/9220)
Updating files:  23% (2121/9220)
Updating files:  24% (2213/9220)
Updating files:  25% (2305/9220)
Updating files:  26% (2398/9220)
Updating files:  27% (2490/9220)
Updating files:  28% (2582/9220)
Updating files:  29% (2674/9220)
Updating files:  30% (2766/9220)
Updating files:  31% (2859/9220)
Updating files:  32% (2951/9220)
Updating files:  33% (3043/9220)
Updating files:  34% (3135/9220)
Updating files:  35% (3227/9220)
Updating files:  36% (3320/9220)
Updating files:  37% (3412/9220)
Updating files:  37% (3424/9220)
Updating files:  38% (3504/9220)
Updating files:  39% (3596/9220)
Updating files:  40% (3688/9220)
Updating files:  41% (3781/9220)
Updating files:  42% (3873/9220)
Updating files:  43% (3965/9220)
Updating files:  44% (4057/9220)
Updating files:  45% (4149/9220)
Updating files:  46% (4242/9220)
Updating files:  47% (4334/9220)
Updating files:  48% (4426/9220)
Updating files:  49% (4518/9220)
Updating files:  50% (4610/9220)
Updating files:  51% (4703/9220)
Updating files:  52% (4795/9220)
Updating files:  53% (4887/9220)
Updating files:  54% (4979/9220)
Updating files:  55% (5071/9220)
Updating files:  56% (5164/9220)
Updating files:  57% (5256/9220)
Updating files:  58% (5348/9220)
Updating files:  59% (5440/9220)
Updating files:  60% (5532/9220)
Updating files:  61% (5625/9220)
Updating files:  62% (5717/9220)
Updating files:  62% (5737/9220)
Updating files:  63% (5809/9220)
Updating files:  64% (5901/9220)
Updating files:  65% (5993/9220)
Updating files:  66% (6086/9220)
Updating files:  67% (6178/9220)
Updating files:  68% (6270/9220)
Updating files:  69% (6362/9220)
Updating files:  70% (6454/9220)
Updating files:  71% (6547/9220)
Updating files:  72% (6639/9220)
Updating files:  73% (6731/9220)
Updating files:  73% (6742/9220)
Updating files:  74% (6823/9220)
Updating files:  75% (6915/9220)
Updating files:  76% (7008/9220)
Updating files:  77% (7100/9220)
Updating files:  78% (7192/9220)
Updating files:  79% (7284/9220)
Updating files:  80% (7376/9220)
Updating files:  81% (7469/9220)
Updating files:  82% (7561/9220)
Updating files:  83% (7653/9220)
Updating files:  84% (7745/9220)
Updating files:  84% (7820/9220)
Updating files:  85% (7837/9220)
Updating files:  86% (7930/9220)
Updating files:  87% (8022/9220)
Updating files:  88% (8114/9220)
Updating files:  89% (8206/9220)
Updating files:  90% (8298/9220)
Updating files:  91% (8391/9220)
Updating files:  92% (8483/9220)
Updating files:  93% (8575/9220)
Updating files:  94% (8667/9220)
Updating files:  95% (8759/9220)
Updating files:  96% (8852/9220)
Updating files:  96% (8907/9220)
Updating files:  97% (8944/9220)
Updating files:  98% (9036/9220)
Updating files:  98% (9069/9220)
Updating files:  99% (9128/9220)
Updating files: 100% (9220/9220)
Updating files: 100% (9220/9220), done.
[INFO] started tweaking git repo https://github.com/charlenopires/tictactoe-multiplayer
[INFO] finished tweaking git repo https://github.com/charlenopires/tictactoe-multiplayer
[INFO] tweaked toml for git repo https://github.com/charlenopires/tictactoe-multiplayer written to /workspace/builds/worker-3-tc1/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/charlenopires/tictactoe-multiplayer on toolchain d8df82673d5911b6112a85bf91d9adefb2c66a1a
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+d8df82673d5911b6112a85bf91d9adefb2c66a1a" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/charlenopires/tictactoe-multiplayer already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+d8df82673d5911b6112a85bf91d9adefb2c66a1a" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]  Downloading crates ...
[INFO] [stderr]   Downloaded syn v2.0.105
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:8683fc1fc2eb5c9ac98e0d076ab094b2ffac7f99da555d2b6a2e27f346de2ec7" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] 8dafed8cd3899e4b7f072cb24cd47805590ad00f02bd4791d681a080f6066f0f
[INFO] running `Command { std: "docker" "start" "8dafed8cd3899e4b7f072cb24cd47805590ad00f02bd4791d681a080f6066f0f", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "8dafed8cd3899e4b7f072cb24cd47805590ad00f02bd4791d681a080f6066f0f", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "8dafed8cd3899e4b7f072cb24cd47805590ad00f02bd4791d681a080f6066f0f" "/opt/rustwide/cargo-home/bin/cargo" "+d8df82673d5911b6112a85bf91d9adefb2c66a1a" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "8dafed8cd3899e4b7f072cb24cd47805590ad00f02bd4791d681a080f6066f0f", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-w" "/opt/rustwide/workdir" "--user" "0:0" "8dafed8cd3899e4b7f072cb24cd47805590ad00f02bd4791d681a080f6066f0f" "/opt/rustwide/cargo-home/bin/cargo" "+d8df82673d5911b6112a85bf91d9adefb2c66a1a" "check" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling proc-macro2 v1.0.97
[INFO] [stderr]    Compiling libc v0.2.175
[INFO] [stderr]     Checking http v1.3.1
[INFO] [stderr]     Checking futures-sink v0.3.31
[INFO] [stderr]    Compiling zerocopy v0.8.26
[INFO] [stderr]     Checking tracing v0.1.41
[INFO] [stderr]     Checking sha1 v0.10.6
[INFO] [stderr]     Checking futures-channel v0.3.31
[INFO] [stderr]     Checking utf-8 v0.7.6
[INFO] [stderr]     Checking anstyle v1.0.11
[INFO] [stderr]    Compiling serde_json v1.0.142
[INFO] [stderr]     Checking sync_wrapper v1.0.2
[INFO] [stderr]     Checking matchit v0.7.3
[INFO] [stderr]     Checking bitflags v2.9.1
[INFO] [stderr]     Checking anstream v0.6.20
[INFO] [stderr]     Checking clap_builder v4.5.44
[INFO] [stderr]    Compiling quote v1.0.40
[INFO] [stderr]     Checking http-body v1.0.1
[INFO] [stderr]     Checking http-body-util v0.1.3
[INFO] [stderr]    Compiling syn v2.0.105
[INFO] [stderr]     Checking parking_lot_core v0.9.11
[INFO] [stderr]     Checking signal-hook-registry v1.4.6
[INFO] [stderr]     Checking getrandom v0.2.16
[INFO] [stderr]     Checking socket2 v0.6.0
[INFO] [stderr]     Checking mio v1.0.4
[INFO] [stderr]     Checking rand_core v0.6.4
[INFO] [stderr]     Checking tower-http v0.5.2
[INFO] [stderr]     Checking parking_lot v0.12.4
[INFO] [stderr]     Checking ppv-lite86 v0.2.21
[INFO] [stderr]     Checking rand_chacha v0.3.1
[INFO] [stderr]     Checking rand v0.8.5
[INFO] [stderr]    Compiling wasm-bindgen-backend v0.2.100
[INFO] [stderr]    Compiling futures-macro v0.3.31
[INFO] [stderr]    Compiling tokio-macros v2.5.0
[INFO] [stderr]    Compiling serde_derive v1.0.219
[INFO] [stderr]    Compiling thiserror-impl v1.0.69
[INFO] [stderr]    Compiling pin-project-internal v1.1.10
[INFO] [stderr]    Compiling async-trait v0.1.88
[INFO] [stderr]    Compiling clap_derive v4.5.45
[INFO] [stderr]     Checking tokio v1.47.1
[INFO] [stderr]     Checking futures-util v0.3.31
[INFO] [stderr]    Compiling wasm-bindgen-macro-support v0.2.100
[INFO] [stderr]    Compiling axum-macros v0.4.2
[INFO] [stderr]     Checking pin-project v1.1.10
[INFO] [stderr]     Checking thiserror v1.0.69
[INFO] [stderr]     Checking tungstenite v0.24.0
[INFO] [stderr]     Checking clap v4.5.45
[INFO] [stderr]    Compiling wasm-bindgen-macro v0.2.100
[INFO] [stderr]     Checking wasm-bindgen v0.2.100
[INFO] [stderr]     Checking serde v1.0.219
[INFO] [stderr]     Checking js-sys v0.3.77
[INFO] [stderr]     Checking axum-core v0.4.5
[INFO] [stderr]     Checking tower v0.4.13
[INFO] [stderr]     Checking hyper v1.6.0
[INFO] [stderr]     Checking tower v0.5.2
[INFO] [stderr]     Checking tokio-tungstenite v0.24.0
[INFO] [stderr]     Checking web-sys v0.3.77
[INFO] [stderr]     Checking hyper-util v0.1.16
[INFO] [stderr]     Checking serde_urlencoded v0.7.1
[INFO] [stderr]     Checking serde_path_to_error v0.1.17
[INFO] [stderr]     Checking axum v0.7.9
[INFO] [stderr]     Checking multiplayer-tic-tac-toe v0.1.0 (/opt/rustwide/workdir)
[INFO] [stdout] warning: unused import: `std::time::Duration`
[INFO] [stdout]    --> src/security.rs:205:9
[INFO] [stdout]     |
[INFO] [stdout] 205 |     use std::time::Duration;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::time::Duration`
[INFO] [stdout]    --> src/security.rs:205:9
[INFO] [stdout]     |
[INFO] [stdout] 205 |     use std::time::Duration;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `key`, `is_server`, `player1`, and `player2` are never read
[INFO] [stdout]   --> src/session.rs:19:9
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub struct Session {
[INFO] [stdout]    |            ------- fields in this struct
[INFO] [stdout] 19 |     pub key: String,
[INFO] [stdout]    |         ^^^
[INFO] [stdout] 20 |     pub is_server: bool,
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout] 21 |     pub player1: Option<String>,
[INFO] [stdout]    |         ^^^^^^^
[INFO] [stdout] 22 |     pub player2: Option<String>,
[INFO] [stdout]    |         ^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Session` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `remove_session` is never used
[INFO] [stdout]   --> src/session.rs:70:18
[INFO] [stdout]    |
[INFO] [stdout] 25 | impl SessionManager {
[INFO] [stdout]    | ------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 70 |     pub async fn remove_session(&self, key: &str) {
[INFO] [stdout]    |                  ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `broadcast_tx` is never read
[INFO] [stdout]   --> src/websocket.rs:25:9
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub struct GameState {
[INFO] [stdout]    |            --------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 25 |     pub broadcast_tx: Arc<Mutex<HashMap<String, broadcast::Sender<String>>>>,
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `GameState` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Player` is never constructed
[INFO] [stdout]   --> src/websocket.rs:30:12
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub struct Player {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `key` is never read
[INFO] [stdout]   --> src/websocket.rs:40:9
[INFO] [stdout]    |
[INFO] [stdout] 39 | pub struct SessionState {
[INFO] [stdout]    |            ------------ field in this struct
[INFO] [stdout] 40 |     pub key: String,
[INFO] [stdout]    |         ^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SessionState` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Player` is never constructed
[INFO] [stdout]   --> src/game_logic.rs:38:12
[INFO] [stdout]    |
[INFO] [stdout] 38 | pub struct Player {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `get_game_state` is never used
[INFO] [stdout]    --> src/game_logic.rs:125:18
[INFO] [stdout]     |
[INFO] [stdout]  50 | impl GameManager {
[INFO] [stdout]     | ---------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 125 |     pub async fn get_game_state(&self, game_id: &str) -> Option<Game> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `InvalidPlayerSymbol` is never constructed
[INFO] [stdout]    --> src/game_logic.rs:147:5
[INFO] [stdout]     |
[INFO] [stdout] 142 | pub enum GameError {
[INFO] [stdout]     |          --------- variant in this enum
[INFO] [stdout] ...
[INFO] [stdout] 147 |     InvalidPlayerSymbol,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `GameError` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_player_symbol` is never used
[INFO] [stdout]    --> src/game_logic.rs:187:8
[INFO] [stdout]     |
[INFO] [stdout] 187 | pub fn validate_player_symbol(symbol: char) -> Result<(), GameError> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `max_session_age`, `rate_limit_window`, `max_requests_per_window`, and `session_key_length` are never read
[INFO] [stdout]   --> src/security.rs:15:9
[INFO] [stdout]    |
[INFO] [stdout] 14 | pub struct SecurityConfig {
[INFO] [stdout]    |            -------------- fields in this struct
[INFO] [stdout] 15 |     pub max_session_age: Duration,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^
[INFO] [stdout] 16 |     pub rate_limit_window: Duration,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 17 |     pub max_requests_per_window: u32,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 18 |     pub session_key_length: usize,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SecurityConfig` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RateLimiter` is never constructed
[INFO] [stdout]   --> src/security.rs:33:12
[INFO] [stdout]    |
[INFO] [stdout] 33 | pub struct RateLimiter {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new` and `is_allowed` are never used
[INFO] [stdout]   --> src/security.rs:40:12
[INFO] [stdout]    |
[INFO] [stdout] 38 | impl RateLimiter {
[INFO] [stdout]    | ---------------- associated items in this implementation
[INFO] [stdout] 39 |     /// Creates a new rate limiter
[INFO] [stdout] 40 |     pub fn new(config: SecurityConfig) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 48 |     pub async fn is_allowed(&self, identifier: &str) -> bool {
[INFO] [stdout]    |                  ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `sessions` and `config` are never read
[INFO] [stdout]   --> src/security.rs:72:9
[INFO] [stdout]    |
[INFO] [stdout] 71 | pub struct SecureSessionManager {
[INFO] [stdout]    |            -------------------- fields in this struct
[INFO] [stdout] 72 |     pub sessions: Arc<RwLock<HashMap<String, SessionInfo>>>,
[INFO] [stdout]    |         ^^^^^^^^
[INFO] [stdout] 73 |     pub config: SecurityConfig,
[INFO] [stdout]    |         ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `key`, `created_at`, `player_count`, `is_server`, and `valid` are never read
[INFO] [stdout]   --> src/security.rs:79:9
[INFO] [stdout]    |
[INFO] [stdout] 78 | pub struct SessionInfo {
[INFO] [stdout]    |            ----------- fields in this struct
[INFO] [stdout] 79 |     pub key: String,
[INFO] [stdout]    |         ^^^
[INFO] [stdout] 80 |     pub created_at: Instant,
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout] 81 |     pub player_count: u32,
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout] 82 |     pub is_server: bool,
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout] 83 |     pub valid: bool,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SessionInfo` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `generate_secure_key`, `validate_session`, `create_secure_session`, and `cleanup_expired_sessions` are never used
[INFO] [stdout]    --> src/security.rs:96:12
[INFO] [stdout]     |
[INFO] [stdout]  86 | impl SecureSessionManager {
[INFO] [stdout]     | ------------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  96 |     pub fn generate_secure_key(&self) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 107 |     pub async fn validate_session(&self, key: &str) -> bool {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 120 |     pub async fn create_secure_session(&self, is_server: bool) -> String {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 140 |     pub async fn cleanup_expired_sessions(&self) {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `InputValidator` is never constructed
[INFO] [stdout]    --> src/security.rs:151:12
[INFO] [stdout]     |
[INFO] [stdout] 151 | pub struct InputValidator;
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated functions `validate_session_key`, `validate_move_coordinates`, `validate_player_symbol`, and `sanitize_input` are never used
[INFO] [stdout]    --> src/security.rs:155:12
[INFO] [stdout]     |
[INFO] [stdout] 153 | impl InputValidator {
[INFO] [stdout]     | ------------------- associated functions in this implementation
[INFO] [stdout] 154 |     /// Validates a session key format (4 alphanumeric characters)
[INFO] [stdout] 155 |     pub fn validate_session_key(key: &str) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 164 |     pub fn validate_move_coordinates(index: usize) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 169 |     pub fn validate_player_symbol(symbol: char) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 174 |     pub fn sanitize_input(input: &str) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SecurityError` is never used
[INFO] [stdout]    --> src/security.rs:182:10
[INFO] [stdout]     |
[INFO] [stdout] 182 | pub enum SecurityError {
[INFO] [stdout]     |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `rate_limit_check` is never used
[INFO] [stdout]    --> src/security.rs:191:14
[INFO] [stdout]     |
[INFO] [stdout] 191 | pub async fn rate_limit_check(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `key`, `is_server`, `player1`, and `player2` are never read
[INFO] [stdout]   --> src/session.rs:19:9
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub struct Session {
[INFO] [stdout]    |            ------- fields in this struct
[INFO] [stdout] 19 |     pub key: String,
[INFO] [stdout]    |         ^^^
[INFO] [stdout] 20 |     pub is_server: bool,
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout] 21 |     pub player1: Option<String>,
[INFO] [stdout]    |         ^^^^^^^
[INFO] [stdout] 22 |     pub player2: Option<String>,
[INFO] [stdout]    |         ^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Session` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `remove_session` is never used
[INFO] [stdout]   --> src/session.rs:70:18
[INFO] [stdout]    |
[INFO] [stdout] 25 | impl SessionManager {
[INFO] [stdout]    | ------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 70 |     pub async fn remove_session(&self, key: &str) {
[INFO] [stdout]    |                  ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `broadcast_tx` is never read
[INFO] [stdout]   --> src/websocket.rs:25:9
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub struct GameState {
[INFO] [stdout]    |            --------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 25 |     pub broadcast_tx: Arc<Mutex<HashMap<String, broadcast::Sender<String>>>>,
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `GameState` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Player` is never constructed
[INFO] [stdout]   --> src/websocket.rs:30:12
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub struct Player {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `key` is never read
[INFO] [stdout]   --> src/websocket.rs:40:9
[INFO] [stdout]    |
[INFO] [stdout] 39 | pub struct SessionState {
[INFO] [stdout]    |            ------------ field in this struct
[INFO] [stdout] 40 |     pub key: String,
[INFO] [stdout]    |         ^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SessionState` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Player` is never constructed
[INFO] [stdout]   --> src/game_logic.rs:38:12
[INFO] [stdout]    |
[INFO] [stdout] 38 | pub struct Player {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `get_game_state` is never used
[INFO] [stdout]    --> src/game_logic.rs:125:18
[INFO] [stdout]     |
[INFO] [stdout]  50 | impl GameManager {
[INFO] [stdout]     | ---------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 125 |     pub async fn get_game_state(&self, game_id: &str) -> Option<Game> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `InvalidPlayerSymbol` is never constructed
[INFO] [stdout]    --> src/game_logic.rs:147:5
[INFO] [stdout]     |
[INFO] [stdout] 142 | pub enum GameError {
[INFO] [stdout]     |          --------- variant in this enum
[INFO] [stdout] ...
[INFO] [stdout] 147 |     InvalidPlayerSymbol,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `GameError` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_player_symbol` is never used
[INFO] [stdout]    --> src/game_logic.rs:187:8
[INFO] [stdout]     |
[INFO] [stdout] 187 | pub fn validate_player_symbol(symbol: char) -> Result<(), GameError> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `rate_limit_window` and `max_requests_per_window` are never read
[INFO] [stdout]   --> src/security.rs:16:9
[INFO] [stdout]    |
[INFO] [stdout] 14 | pub struct SecurityConfig {
[INFO] [stdout]    |            -------------- fields in this struct
[INFO] [stdout] 15 |     pub max_session_age: Duration,
[INFO] [stdout] 16 |     pub rate_limit_window: Duration,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 17 |     pub max_requests_per_window: u32,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SecurityConfig` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RateLimiter` is never constructed
[INFO] [stdout]   --> src/security.rs:33:12
[INFO] [stdout]    |
[INFO] [stdout] 33 | pub struct RateLimiter {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new` and `is_allowed` are never used
[INFO] [stdout]   --> src/security.rs:40:12
[INFO] [stdout]    |
[INFO] [stdout] 38 | impl RateLimiter {
[INFO] [stdout]    | ---------------- associated items in this implementation
[INFO] [stdout] 39 |     /// Creates a new rate limiter
[INFO] [stdout] 40 |     pub fn new(config: SecurityConfig) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 48 |     pub async fn is_allowed(&self, identifier: &str) -> bool {
[INFO] [stdout]    |                  ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `key`, `player_count`, `is_server`, and `valid` are never read
[INFO] [stdout]   --> src/security.rs:79:9
[INFO] [stdout]    |
[INFO] [stdout] 78 | pub struct SessionInfo {
[INFO] [stdout]    |            ----------- fields in this struct
[INFO] [stdout] 79 |     pub key: String,
[INFO] [stdout]    |         ^^^
[INFO] [stdout] 80 |     pub created_at: Instant,
[INFO] [stdout] 81 |     pub player_count: u32,
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout] 82 |     pub is_server: bool,
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout] 83 |     pub valid: bool,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SessionInfo` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `cleanup_expired_sessions` is never used
[INFO] [stdout]    --> src/security.rs:140:18
[INFO] [stdout]     |
[INFO] [stdout]  86 | impl SecureSessionManager {
[INFO] [stdout]     | ------------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 140 |     pub async fn cleanup_expired_sessions(&self) {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated functions `validate_move_coordinates`, `validate_player_symbol`, and `sanitize_input` are never used
[INFO] [stdout]    --> src/security.rs:164:12
[INFO] [stdout]     |
[INFO] [stdout] 153 | impl InputValidator {
[INFO] [stdout]     | ------------------- associated functions in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 164 |     pub fn validate_move_coordinates(index: usize) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 169 |     pub fn validate_player_symbol(symbol: char) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 174 |     pub fn sanitize_input(input: &str) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SecurityError` is never used
[INFO] [stdout]    --> src/security.rs:182:10
[INFO] [stdout]     |
[INFO] [stdout] 182 | pub enum SecurityError {
[INFO] [stdout]     |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `rate_limit_check` is never used
[INFO] [stdout]    --> src/security.rs:191:14
[INFO] [stdout]     |
[INFO] [stdout] 191 | pub async fn rate_limit_check(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr] warning: unused dependency `tower`
[INFO] [stderr]   --> Cargo.toml:24:15
[INFO] [stderr]    |
[INFO] [stderr] 24 | [dependencies.tower]
[INFO] [stderr]    |               ^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `cargo::unused_dependencies` is set to `warn` by default
[INFO] [stderr] help: consider removing the dependency on `tower`
[INFO] [stderr] warning: unused dependency `tower`
[INFO] [stderr]   --> Cargo.toml:36:19
[INFO] [stderr]    |
[INFO] [stderr] 36 | [dev-dependencies.tower]
[INFO] [stderr]    |                   ^^^^^^
[INFO] [stderr]    |
[INFO] [stderr] help: consider removing the dependency on `tower`
[INFO] [stderr] warning: unused dependency `tower-http`
[INFO] [stderr]   --> Cargo.toml:28:15
[INFO] [stderr]    |
[INFO] [stderr] 28 | [dependencies.tower-http]
[INFO] [stderr]    |               ^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr] help: consider removing the dependency on `tower-http`
[INFO] [stderr] warning: `multiplayer-tic-tac-toe` (manifest) generated 3 warnings
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 00s
[INFO] running `Command { std: "docker" "inspect" "8dafed8cd3899e4b7f072cb24cd47805590ad00f02bd4791d681a080f6066f0f", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "8dafed8cd3899e4b7f072cb24cd47805590ad00f02bd4791d681a080f6066f0f", kill_on_drop: false }`
[INFO] [stdout] 8dafed8cd3899e4b7f072cb24cd47805590ad00f02bd4791d681a080f6066f0f
