From 3ce6b8532001f6d8f29d945a2a465edae0d978f1 Mon Sep 17 00:00:00 2001 From: unknown <356261005@qq.com> Date: Sat, 20 Jun 2026 03:45:58 +0800 Subject: [PATCH 1/2] Add protocol frame codec recovery tests --- backend/src/protocol/codec.rs | 180 +++++++++++++++++++--- backend/src/protocol/frame_tests.rs | 226 ++++++++++++++++++++++++++++ backend/src/protocol/mod.rs | 2 + 3 files changed, 391 insertions(+), 17 deletions(-) create mode 100644 backend/src/protocol/frame_tests.rs diff --git a/backend/src/protocol/codec.rs b/backend/src/protocol/codec.rs index f9186a43..bcbe646c 100644 --- a/backend/src/protocol/codec.rs +++ b/backend/src/protocol/codec.rs @@ -22,8 +22,8 @@ // `perf/zero-copy-codec` branch but was never merged because the scatter-gather // I/O implementation was incomplete for TLS connections. -use crate::protocol::{ProtocolError, MAX_MESSAGE_SIZE, MIN_COMPATIBLE_VERSION, PROTOCOL_VERSION}; -use std::io::{Cursor, Read, Write}; +use crate::protocol::{ProtocolError, MIN_COMPATIBLE_VERSION, PROTOCOL_VERSION}; +use std::io::{Cursor, Read}; // --------------------------------------------------------------------------- // FRAME CONSTANTS @@ -35,6 +35,9 @@ pub const FRAME_MAGIC: u32 = 0x544F5446; /// Size of the frame header in bytes. pub const FRAME_HEADER_SIZE: usize = 24; +/// Size of the reserved header field in bytes. +const FRAME_RESERVED_SIZE: usize = 8; + /// Maximum frame payload size (16 MB). pub const FRAME_MAX_PAYLOAD_SIZE: usize = 16 * 1024 * 1024; @@ -129,7 +132,7 @@ impl FrameEncoder { buf.extend_from_slice(&frame.flags.to_be_bytes()); buf.extend_from_slice(&(frame.payload.len() as u32).to_be_bytes()); buf.extend_from_slice(&frame.sequence.to_be_bytes()); - buf.extend_from_slice(&[0u8; 4]); // reserved + buf.extend_from_slice(&[0u8; FRAME_RESERVED_SIZE]); // reserved // Payload buf.extend_from_slice(&frame.payload); @@ -142,7 +145,9 @@ impl FrameEncoder { Ok(buf) } - pub fn encode_stream<'a>(frames: impl Iterator) -> Result, ProtocolError> { + pub fn encode_stream<'a>( + frames: impl Iterator, + ) -> Result, ProtocolError> { let mut buf = Vec::new(); for frame in frames { buf.extend_from_slice(&Self::encode(frame)?); @@ -158,6 +163,7 @@ impl FrameEncoder { pub struct FrameDecoder { buffer: Vec, partial_frame: Option>, + accepted_frames: u64, } impl FrameDecoder { @@ -165,13 +171,33 @@ impl FrameDecoder { Self { buffer: Vec::with_capacity(FRAME_MAX_SIZE), partial_frame: None, + accepted_frames: 0, } } + pub fn accepted_frames(&self) -> u64 { + self.accepted_frames + } + pub fn feed(&mut self, data: &[u8]) { self.buffer.extend_from_slice(data); } + fn discard_until_next_magic(&mut self) { + let magic = FRAME_MAGIC.to_be_bytes(); + if let Some(pos) = self + .buffer + .windows(magic.len()) + .enumerate() + .skip(1) + .find_map(|(idx, window)| (window == magic).then_some(idx)) + { + self.buffer.drain(..pos); + } else { + self.buffer.clear(); + } + } + pub fn decode(&mut self) -> Result, ProtocolError> { if self.buffer.len() < FRAME_HEADER_SIZE { return Ok(None); @@ -181,54 +207,77 @@ impl FrameDecoder { // Read and validate magic let mut magic_bytes = [0u8; 4]; - cursor.read_exact(&mut magic_bytes).map_err(|_| ProtocolError::InvalidMessage)?; + cursor + .read_exact(&mut magic_bytes) + .map_err(|_| ProtocolError::InvalidMessage)?; let magic = u32::from_be_bytes(magic_bytes); if magic != FRAME_MAGIC { - self.buffer.clear(); + self.discard_until_next_magic(); return Err(ProtocolError::InvalidMessage); } // Read version let mut version_bytes = [0u8; 1]; - cursor.read_exact(&mut version_bytes).map_err(|_| ProtocolError::InvalidMessage)?; + cursor + .read_exact(&mut version_bytes) + .map_err(|_| ProtocolError::InvalidMessage)?; let version = version_bytes[0]; if version < MIN_COMPATIBLE_VERSION as u8 || version > PROTOCOL_VERSION as u8 { - self.buffer.clear(); + self.discard_until_next_magic(); return Err(ProtocolError::UnsupportedVersion); } // Read message type let mut type_bytes = [0u8; 1]; - cursor.read_exact(&mut type_bytes).map_err(|_| ProtocolError::InvalidMessage)?; + cursor + .read_exact(&mut type_bytes) + .map_err(|_| ProtocolError::InvalidMessage)?; let message_type = type_bytes[0]; // Read flags let mut flags_bytes = [0u8; 2]; - cursor.read_exact(&mut flags_bytes).map_err(|_| ProtocolError::InvalidMessage)?; + cursor + .read_exact(&mut flags_bytes) + .map_err(|_| ProtocolError::InvalidMessage)?; let flags = u16::from_be_bytes(flags_bytes); // Read payload length let mut len_bytes = [0u8; 4]; - cursor.read_exact(&mut len_bytes).map_err(|_| ProtocolError::InvalidMessage)?; + cursor + .read_exact(&mut len_bytes) + .map_err(|_| ProtocolError::InvalidMessage)?; let payload_length = u32::from_be_bytes(len_bytes) as usize; if payload_length > FRAME_MAX_PAYLOAD_SIZE { - self.buffer.clear(); + self.discard_until_next_magic(); return Err(ProtocolError::MessageTooLarge); } // Read sequence number let mut seq_bytes = [0u8; 4]; - cursor.read_exact(&mut seq_bytes).map_err(|_| ProtocolError::InvalidMessage)?; + cursor + .read_exact(&mut seq_bytes) + .map_err(|_| ProtocolError::InvalidMessage)?; let sequence = u32::from_be_bytes(seq_bytes); // Skip reserved bytes - let mut reserved = [0u8; 4]; - cursor.read_exact(&mut reserved).map_err(|_| ProtocolError::InvalidMessage)?; + let mut reserved = [0u8; FRAME_RESERVED_SIZE]; + cursor + .read_exact(&mut reserved) + .map_err(|_| ProtocolError::InvalidMessage)?; // Check if we have the full frame let checksum_size = if flags & FLAG_CHECKSUMED != 0 { 4 } else { 0 }; let total_frame_size = FRAME_HEADER_SIZE + payload_length + checksum_size; + if reserved != [0u8; FRAME_RESERVED_SIZE] { + if self.buffer.len() >= total_frame_size { + self.buffer.drain(..total_frame_size); + } else { + self.buffer.clear(); + } + return Err(ProtocolError::InvalidMessage); + } + if self.buffer.len() < total_frame_size { return Ok(None); } @@ -258,6 +307,7 @@ impl FrameDecoder { // Remove consumed bytes from buffer self.buffer.drain(..total_frame_size); + self.accepted_frames += 1; let frame = Frame { version, @@ -332,8 +382,7 @@ mod tests { #[test] fn test_frame_encode_decode() { let payload = b"Hello, World!".to_vec(); - let frame = Frame::new(0x01, payload.clone()) - .with_checksum(); + let frame = Frame::new(0x01, payload.clone()).with_checksum(); let encoded = FrameEncoder::encode(&frame).unwrap(); @@ -390,4 +439,101 @@ mod tests { let result = decoder.decode(); assert!(matches!(result, Err(ProtocolError::ChecksumMismatch))); } + + #[test] + fn test_truncated_header_and_payload_do_not_decode_or_corrupt_buffer() { + let frame = Frame::new(0x01, b"payload".to_vec()).with_checksum(); + let encoded = FrameEncoder::encode(&frame).unwrap(); + + for cut in [0, 1, FRAME_HEADER_SIZE - 1] { + let mut decoder = FrameDecoder::new(); + decoder.feed(&encoded[..cut]); + + assert!(decoder.decode().unwrap().is_none()); + assert_eq!(decoder.buffered_bytes(), cut); + } + + let payload_cut = FRAME_HEADER_SIZE + frame.payload.len() - 1; + let mut decoder = FrameDecoder::new(); + decoder.feed(&encoded[..payload_cut]); + + assert!(decoder.decode().unwrap().is_none()); + assert_eq!(decoder.buffered_bytes(), payload_cut); + } + + #[test] + fn test_invalid_payload_length_is_rejected_without_panic() { + let mut encoded = FrameEncoder::encode(&Frame::new(0x01, Vec::new())).unwrap(); + encoded[8..12].copy_from_slice(&((FRAME_MAX_PAYLOAD_SIZE as u32) + 1).to_be_bytes()); + + let mut decoder = FrameDecoder::new(); + decoder.feed(&encoded); + + assert!(matches!( + decoder.decode(), + Err(ProtocolError::MessageTooLarge) + )); + assert_eq!(decoder.buffered_bytes(), 0); + + let valid = Frame::new(0x02, b"valid after invalid length".to_vec()).with_sequence(7); + let valid_encoded = FrameEncoder::encode(&valid).unwrap(); + decoder.feed(&valid_encoded); + + let decoded = decoder.decode().unwrap().unwrap(); + assert_eq!(decoded.sequence, 7); + assert_eq!(decoded.payload, b"valid after invalid length"); + assert_eq!(decoder.buffered_bytes(), 0); + } + + #[test] + fn test_invalid_reserved_bytes_are_rejected_and_next_frame_decodes() { + let mut invalid = FrameEncoder::encode(&Frame::new(0x01, Vec::new())).unwrap(); + invalid[16] = 0x80; + + let valid = Frame::new(0x02, b"after reserved".to_vec()).with_sequence(42); + let valid_encoded = FrameEncoder::encode(&valid).unwrap(); + + let mut decoder = FrameDecoder::new(); + decoder.feed(&invalid); + decoder.feed(&valid_encoded); + + assert!(matches!( + decoder.decode(), + Err(ProtocolError::InvalidMessage) + )); + assert_eq!(decoder.buffered_bytes(), valid_encoded.len()); + + let decoded = decoder.decode().unwrap().unwrap(); + assert_eq!(decoded.message_type, 0x02); + assert_eq!(decoded.sequence, 42); + assert_eq!(decoded.payload, b"after reserved"); + assert_eq!(decoder.buffered_bytes(), 0); + } + + #[test] + fn test_checksum_mismatch_preserves_following_valid_frame() { + let mut invalid = + FrameEncoder::encode(&Frame::new(0x01, b"bad checksum".to_vec()).with_checksum()) + .unwrap(); + invalid[FRAME_HEADER_SIZE] ^= 0x01; + + let valid = Frame::new(0x03, b"after checksum".to_vec()).with_sequence(99); + let valid_encoded = FrameEncoder::encode(&valid).unwrap(); + + let mut decoder = FrameDecoder::new(); + decoder.feed(&invalid); + decoder.feed(&valid_encoded); + + assert!(matches!( + decoder.decode(), + Err(ProtocolError::ChecksumMismatch) + )); + assert_eq!(decoder.buffered_bytes(), valid_encoded.len()); + + let decoded = decoder.decode().unwrap().unwrap(); + assert_eq!(decoded.message_type, 0x03); + assert_eq!(decoded.sequence, 99); + assert_eq!(decoded.payload, b"after checksum"); + assert_eq!(decoder.buffered_bytes(), 0); + } } diff --git a/backend/src/protocol/frame_tests.rs b/backend/src/protocol/frame_tests.rs new file mode 100644 index 00000000..dfff4894 --- /dev/null +++ b/backend/src/protocol/frame_tests.rs @@ -0,0 +1,226 @@ +use super::codec::{ + Frame, FrameDecoder, FrameEncoder, FRAME_HEADER_SIZE, FRAME_MAGIC, FRAME_MAX_PAYLOAD_SIZE, +}; +use super::{ProtocolError, PROTOCOL_VERSION}; + +fn encoded_frame(message_type: u8, payload: &[u8], checksum: bool) -> Vec { + let mut frame = Frame::new(message_type, payload.to_vec()); + if checksum { + frame = frame.with_checksum(); + } + FrameEncoder::encode(&frame).expect("test frame should encode") +} + +fn set_payload_length(encoded: &mut [u8], length: u32) { + encoded[8..12].copy_from_slice(&length.to_be_bytes()); +} + +fn set_reserved_nonzero(encoded: &mut [u8]) { + encoded[16] = 0x80; +} + +fn corrupt_checksum(encoded: &mut [u8]) { + let last = encoded.len() - 1; + encoded[last] ^= 0x01; +} + +fn assert_error(result: Result, ProtocolError>, expected: ProtocolError) { + match result { + Err(actual) => assert_eq!(actual, expected), + Ok(None) => panic!("expected {expected:?}, got incomplete frame"), + Ok(Some(frame)) => panic!("expected {expected:?}, got frame {frame:?}"), + } +} + +#[test] +fn encoded_header_size_matches_decoder_contract() { + let payload = b"size-check"; + let encoded = encoded_frame(0x01, payload, false); + + assert_eq!(encoded.len(), FRAME_HEADER_SIZE + payload.len()); + assert_eq!(&encoded[..4], &FRAME_MAGIC.to_be_bytes()); +} + +#[test] +fn truncated_header_returns_none_without_panic() { + let encoded = encoded_frame(0x02, b"payload", false); + let mut decoder = FrameDecoder::new(); + + decoder.feed(&encoded[..FRAME_HEADER_SIZE - 1]); + + assert!(decoder.decode().unwrap().is_none()); + assert_eq!(decoder.buffered_bytes(), FRAME_HEADER_SIZE - 1); + assert_eq!(decoder.accepted_frames(), 0); +} + +#[test] +fn truncated_payload_returns_none_without_panic() { + let encoded = encoded_frame(0x03, b"payload", false); + let mut decoder = FrameDecoder::new(); + + decoder.feed(&encoded[..FRAME_HEADER_SIZE + 3]); + + assert!(decoder.decode().unwrap().is_none()); + assert_eq!(decoder.buffered_bytes(), FRAME_HEADER_SIZE + 3); + assert_eq!(decoder.accepted_frames(), 0); +} + +#[test] +fn truncated_payload_completes_after_more_bytes_arrive() { + let encoded = encoded_frame(0x04, b"complete me", false); + let split = FRAME_HEADER_SIZE + 4; + let mut decoder = FrameDecoder::new(); + + decoder.feed(&encoded[..split]); + assert!(decoder.decode().unwrap().is_none()); + + decoder.feed(&encoded[split..]); + let decoded = decoder.decode().unwrap().unwrap(); + + assert_eq!(decoded.message_type, 0x04); + assert_eq!(decoded.payload, b"complete me"); + assert_eq!(decoder.accepted_frames(), 1); + assert_eq!(decoder.buffered_bytes(), 0); +} + +#[test] +fn invalid_magic_preserves_following_valid_frame() { + let mut invalid = encoded_frame(0x05, b"bad magic", false); + invalid[0] ^= 0xFF; + let valid = encoded_frame(0x06, b"after magic", false); + + let mut decoder = FrameDecoder::new(); + decoder.feed(&invalid); + decoder.feed(&valid); + + assert_error(decoder.decode(), ProtocolError::InvalidMessage); + assert_eq!(decoder.buffered_bytes(), valid.len()); + + let decoded = decoder.decode().unwrap().unwrap(); + assert_eq!(decoded.message_type, 0x06); + assert_eq!(decoded.payload, b"after magic"); + assert_eq!(decoder.accepted_frames(), 1); +} + +#[test] +fn unsupported_version_preserves_following_valid_frame() { + let mut invalid = encoded_frame(0x07, b"bad version", false); + invalid[4] = (PROTOCOL_VERSION as u8).saturating_add(1); + let valid = encoded_frame(0x08, b"after version", false); + + let mut decoder = FrameDecoder::new(); + decoder.feed(&invalid); + decoder.feed(&valid); + + assert_error(decoder.decode(), ProtocolError::UnsupportedVersion); + assert_eq!(decoder.buffered_bytes(), valid.len()); + + let decoded = decoder.decode().unwrap().unwrap(); + assert_eq!(decoded.message_type, 0x08); + assert_eq!(decoded.payload, b"after version"); + assert_eq!(decoder.accepted_frames(), 1); +} + +#[test] +fn oversize_payload_length_preserves_following_valid_frame() { + let mut invalid = encoded_frame(0x09, b"oversize", false); + set_payload_length(&mut invalid, (FRAME_MAX_PAYLOAD_SIZE + 1) as u32); + let valid = encoded_frame(0x0A, b"after oversize", false); + + let mut decoder = FrameDecoder::new(); + decoder.feed(&invalid); + decoder.feed(&valid); + + assert_error(decoder.decode(), ProtocolError::MessageTooLarge); + assert_eq!(decoder.buffered_bytes(), valid.len()); + + let decoded = decoder.decode().unwrap().unwrap(); + assert_eq!(decoded.message_type, 0x0A); + assert_eq!(decoded.payload, b"after oversize"); + assert_eq!(decoder.accepted_frames(), 1); +} + +#[test] +fn nonzero_reserved_bytes_are_rejected() { + let mut invalid = encoded_frame(0x0B, b"reserved", false); + set_reserved_nonzero(&mut invalid); + + let mut decoder = FrameDecoder::new(); + decoder.feed(&invalid); + + assert_error(decoder.decode(), ProtocolError::InvalidMessage); + assert_eq!(decoder.buffered_bytes(), 0); + assert_eq!(decoder.accepted_frames(), 0); +} + +#[test] +fn valid_frame_after_invalid_reserved_bytes_decodes() { + let mut invalid = encoded_frame(0x0C, b"reserved", false); + set_reserved_nonzero(&mut invalid); + let valid = encoded_frame(0x0D, b"after reserved", false); + + let mut decoder = FrameDecoder::new(); + decoder.feed(&invalid); + decoder.feed(&valid); + + assert_error(decoder.decode(), ProtocolError::InvalidMessage); + assert_eq!(decoder.buffered_bytes(), valid.len()); + + let decoded = decoder.decode().unwrap().unwrap(); + assert_eq!(decoded.message_type, 0x0D); + assert_eq!(decoded.payload, b"after reserved"); + assert_eq!(decoder.accepted_frames(), 1); +} + +#[test] +fn checksum_mismatch_preserves_following_valid_frame() { + let mut invalid = encoded_frame(0x0E, b"bad checksum", true); + corrupt_checksum(&mut invalid); + let valid = encoded_frame(0x0F, b"after checksum", false); + + let mut decoder = FrameDecoder::new(); + decoder.feed(&invalid); + decoder.feed(&valid); + + assert_error(decoder.decode(), ProtocolError::ChecksumMismatch); + assert_eq!(decoder.buffered_bytes(), valid.len()); + + let decoded = decoder.decode().unwrap().unwrap(); + assert_eq!(decoded.message_type, 0x0F); + assert_eq!(decoded.payload, b"after checksum"); + assert_eq!(decoder.accepted_frames(), 1); +} + +#[test] +fn decode_all_returns_all_complete_frames_and_leaves_partial_buffered() { + let first = encoded_frame(0x10, b"first", false); + let second = encoded_frame(0x11, b"second", false); + let partial = encoded_frame(0x12, b"partial", false); + + let mut decoder = FrameDecoder::new(); + decoder.feed(&first); + decoder.feed(&second); + decoder.feed(&partial[..FRAME_HEADER_SIZE + 2]); + + let frames = decoder.decode_all().unwrap(); + + assert_eq!(frames.len(), 2); + assert_eq!(frames[0].payload, b"first"); + assert_eq!(frames[1].payload, b"second"); + assert_eq!(decoder.accepted_frames(), 2); + assert_eq!(decoder.buffered_bytes(), FRAME_HEADER_SIZE + 2); +} + +#[test] +fn empty_payload_frame_decodes_and_increments_counter() { + let encoded = encoded_frame(0x13, b"", false); + let mut decoder = FrameDecoder::new(); + decoder.feed(&encoded); + + let decoded = decoder.decode().unwrap().unwrap(); + + assert_eq!(decoded.message_type, 0x13); + assert!(decoded.payload.is_empty()); + assert_eq!(decoder.accepted_frames(), 1); + assert_eq!(decoder.buffered_bytes(), 0); +} diff --git a/backend/src/protocol/mod.rs b/backend/src/protocol/mod.rs index 3323f4c5..5bc3f057 100644 --- a/backend/src/protocol/mod.rs +++ b/backend/src/protocol/mod.rs @@ -25,6 +25,8 @@ pub mod events; pub mod messages; pub mod serialize; pub mod validate; +#[cfg(test)] +mod frame_tests; pub mod codec; pub mod rpc; From 043405c959cb1f72c747a576aa58d45d6dc87b6c Mon Sep 17 00:00:00 2001 From: fengyangxxx <356261005@qq.com> Date: Fri, 19 Jun 2026 19:50:49 +0000 Subject: [PATCH 2/2] Add build diagnostics for 3ce6b853 --- diagnostic/build-3ce6b853.json | 87 +++++++++++++++++++++++++++++++++ diagnostic/build-3ce6b853.logd | Bin 0 -> 39064 bytes 2 files changed, 87 insertions(+) create mode 100644 diagnostic/build-3ce6b853.json create mode 100644 diagnostic/build-3ce6b853.logd diff --git a/diagnostic/build-3ce6b853.json b/diagnostic/build-3ce6b853.json new file mode 100644 index 00000000..a50d05ac --- /dev/null +++ b/diagnostic/build-3ce6b853.json @@ -0,0 +1,87 @@ +{ + "generated_at": "2026-06-19T19:50:46.583903+00:00", + "commit": "3ce6b853", + "diagnostic_logd": "diagnostic/build-3ce6b853.logd", + "diagnostic_logd_error": null, + "message_blocker": null, + "chunked": false, + "chunk_size_bytes": null, + "password": "0c6ebf67e9e942199d8c", + "decrypt_command": "encryptly unpack diagnostic/build-3ce6b853.logd --password 0c6ebf67e9e942199d8c", + "total_modules": 10, + "passed": 7, + "failed": 3, + "modules": [ + { + "name": "backend", + "status": "PASS", + "elapsed_seconds": 49.557, + "artifact": "/workspace/TentOfTrials-issue2/backend/target", + "output": "\u001b[1m\u001b[92m Compiling\u001b[0m icu_normalizer_data v2.2.0\n\u001b[1m\u001b[92m Compiling\u001b[0m icu_normalizer v2.2.0\n\u001b[1m\u001b[92m Compiling\u001b[0m idna_adapter v1.2.2\n\u001b[1m\u001b[92m Compiling\u001b[0m idna v1.1.0\n\u001b[1m\u001b[92m Compiling\u001b[0m url v2.5.8\n\u001b[1m\u001b[92m Compiling\u001b[0m tower-http v0.6.11\n\u001b[1m\u001b[92m Compiling\u001b[0m reqwest v0.12.28\n\u001b[1m\u001b[92m Compiling\u001b[0m tent-backend v0.1.0 (/workspace/TentOfTrials-issue2/backend)\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused import: `warn`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/ai/embeddings.rs:28:28\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m28\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use tracing::{debug, info, warn};\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m\n \u001b[1m\u001b[94m= \u001b[0m\u001b[1mnote\u001b[0m: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused import: `error`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/ai/inference.rs:25:22\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m25\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use tracing::{debug, error, info, warn};\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused imports: `error` and `warn`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/ai/mod.rs:40:22\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m40\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use tracing::{debug, error, info, warn};\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^\u001b[0m \u001b[1m\u001b[33m^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused imports: `c_int` and `c_uint`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/bridge.rs:38:20\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m38\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use std::os::raw::{c_int, c_uint, c_ulong};\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^\u001b[0m \u001b[1m\u001b[33m^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused import: `std::ffi::CString`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/legacy.rs:35:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m35\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use std::ffi::CString;\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused import: `c_char`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/legacy.rs:36:20\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m36\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use std::os::raw::{c_char, c_ulong};\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused import: `CStr`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/types.rs:27:16\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m27\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use std::ffi::{CStr, CString};\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused imports: `c_double` and `c_long`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/types.rs:29:28\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m29\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use std::os::raw::{c_char, c_double, c_int, c_uint, c_void, c_long, c_ulong};\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^\u001b[0m \u001b[1m\u001b[33m^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused import: `AtomicBool`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/legacy/deprecations.rs:14:25\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m14\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use std::sync::atomic::{AtomicBool, AtomicU64, AtomicUsize, Ordering};\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused imports: `EntityKind` and `legacy_normalize_phone_number`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/legacy/v1_compat.rs:8:47\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m8\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use crate::legacy::deprecations::{LegacyUuid, EntityKind, LegacyPagination, legacy_normalize_phone_number};\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused import: `super::ProtocolError`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/protocol/validate.rs:27:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m27\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use super::ProtocolError;\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused import: `Ordering`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/protocol/rpc.rs:25:36\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m25\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use std::sync::atomic::{AtomicU64, Ordering};\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused imports: `Duration` and `Instant`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/protocol/rpc.rs:27:17\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m27\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use std::time::{Duration, Instant};\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^\u001b[0m \u001b[1m\u001b[33m^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused imports: `Deserialize` and `Serialize`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/protocol/rpc.rs:28:13\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m28\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use serde::{Deserialize, Serialize};\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused import: `MAX_MESSAGE_SIZE`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/protocol/rpc.rs:31:28\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m31\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use super::{ProtocolError, MAX_MESSAGE_SIZE, DEFAULT_TIMEOUT_MS};\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused imports: `FrameDecoder` and `FrameEncoder`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/protocol/rpc.rs:32:27\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m32\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use super::codec::{Frame, FrameEncoder, FrameDecoder, FLAG_REQUIRES_ACK};\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: use of deprecated unit variant `legacy::deprecations::EntityKind::Team`: Teams are now Organizations. Use Organization instead.\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/legacy/deprecations.rs:244:25\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m244\u001b[0m \u001b[1m\u001b[94m|\u001b[0m EntityKind::Team => \"org\", // Legacy mapping\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m\n \u001b[1m\u001b[94m= \u001b[0m\u001b[1mnote\u001b[0m: `#[warn(deprecated)]` on by default\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: use of deprecated unit variant `legacy::deprecations::EntityKind::Project`: Projects were removed in the Platform v2 migration\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/legacy/deprecations.rs:245:25\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m245\u001b[0m \u001b[1m\u001b[94m|\u001b[0m EntityKind::Project => \"workspace\", // Legacy mapping\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: use of deprecated unit variant `legacy::deprecations::EntityKind::Team`: Teams are now Organizations. Use Organization instead.\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/legacy/deprecations.rs:266:25\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m266\u001b[0m \u001b[1m\u001b[94m|\u001b[0m EntityKind::Team\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: use of deprecated unit variant `legacy::deprecations::EntityKind::Project`: Projects were removed in the Platform v2 migration\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/legacy/deprecations.rs:267:31\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m267\u001b[0m \u001b[1m\u001b[94m|\u001b[0m | EntityKind::Project\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: variable does not need to be mutable\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/bridge.rs:317:13\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m317\u001b[0m \u001b[1m\u001b[94m|\u001b[0m let mut buffer = unsafe { &mut *c_buffer };\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m----\u001b[0m\u001b[1m\u001b[33m^^^^^^\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m|\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94mhelp: remove this `mut`\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m\n \u001b[1m\u001b[94m= \u001b[0m\u001b[1mnote\u001b[0m: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused variable: `initialized`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/bridge.rs:440:13\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m440\u001b[0m \u001b[1m\u001b[94m|\u001b[0m let initialized = Arc::new(AtomicBool::new(true));\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^\u001b[0m \u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_initialized`\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m\n \u001b[1m\u001b[94m= \u001b[0m\u001b[1mnote\u001b[0m: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: variable does not need to be mutable\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/legacy.rs:267:13\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m267\u001b[0m \u001b[1m\u001b[94m|\u001b[0m let mut buffer = unsafe { &mut *c_buffer };\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m----\u001b[0m\u001b[1m\u001b[33m^^^^^^\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m|\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94mhelp: remove this `mut`\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused variable: `value`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/legacy/deprecations.rs:508:15\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m508\u001b[0m \u001b[1m\u001b[94m|\u001b[0m for (key, value) in configs {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^\u001b[0m \u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_value`\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused variable: `obj`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/protocol/validate.rs:282:25\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m282\u001b[0m \u001b[1m\u001b[94m|\u001b[0m if let Some(obj) = value.as_object() {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^\u001b[0m \u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_obj`\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: type `BridgeStats` is more private than the item `ConnectorBridge::stats`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/bridge.rs:415:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m415\u001b[0m \u001b[1m\u001b[94m|\u001b[0m pub fn stats(&self) -> BridgeStats {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m \u001b[1m\u001b[33mmethod `ConnectorBridge::stats` is reachable at visibility `pub`\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[92mnote\u001b[0m: but type `BridgeStats` is only usable at visibility `pub(self)`\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/bridge.rs:225:1\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m225\u001b[0m \u001b[1m\u001b[94m|\u001b[0m struct BridgeStats {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[92m^^^^^^^^^^^^^^^^^^\u001b[0m\n \u001b[1m\u001b[94m= \u001b[0m\u001b[1mnote\u001b[0m: `#[warn(private_interfaces)]` on by default\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: type `CircuitState` is more private than the item `ConnectorBridge::circuit_state`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/bridge.rs:423:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m423\u001b[0m \u001b[1m\u001b[94m|\u001b[0m pub fn circuit_state(&self) -> CircuitState {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m \u001b[1m\u001b[33mmethod `ConnectorBridge::circuit_state` is reachable at visibility `pub`\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[92mnote\u001b[0m: but type `CircuitState` is only usable at visibility `pub(self)`\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/bridge.rs:79:1\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m 79\u001b[0m \u001b[1m\u001b[94m|\u001b[0m enum CircuitState {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[92m^^^^^^^^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: constant `NCP_TEMPERATURE` is never used\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/ai/mod.rs:53:7\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m53\u001b[0m \u001b[1m\u001b[94m|\u001b[0m const NCP_TEMPERATURE: f64 = 0.42;\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m\n \u001b[1m\u001b[94m= \u001b[0m\u001b[1mnote\u001b[0m: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: constant `MIN_CONFIDENCE_THRESHOLD` is never used\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/ai/mod.rs:61:7\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m61\u001b[0m \u001b[1m\u001b[94m|\u001b[0m const MIN_CONFIDENCE_THRESHOLD: f64 = 0.65;\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: constant `MAX_INFERENCE_RETRIES` is never used\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/ai/mod.rs:65:7\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m65\u001b[0m \u001b[1m\u001b[94m|\u001b[0m const MAX_INFERENCE_RETRIES: u32 = 5;\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: fields `discovery`, `broker`, and `registry` are never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/ai/mod.rs:173:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m171\u001b[0m \u001b[1m\u001b[94m|\u001b[0m pub struct AiOrchestrator {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m--------------\u001b[0m \u001b[1m\u001b[94mfields in this struct\u001b[0m\n\u001b[1m\u001b[94m172\u001b[0m \u001b[1m\u001b[94m|\u001b[0m /// Reference to the service discovery subsystem\n\u001b[1m\u001b[94m173\u001b[0m \u001b[1m\u001b[94m|\u001b[0m discovery: Arc>,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^\u001b[0m\n\u001b[1m\u001b[94m174\u001b[0m \u001b[1m\u001b[94m|\u001b[0m /// Reference to the message broker subsystem\n\u001b[1m\u001b[94m175\u001b[0m \u001b[1m\u001b[94m|\u001b[0m broker: Arc>,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^\u001b[0m\n\u001b[1m\u001b[94m176\u001b[0m \u001b[1m\u001b[94m|\u001b[0m /// Reference to the service registry subsystem\n\u001b[1m\u001b[94m177\u001b[0m \u001b[1m\u001b[94m|\u001b[0m registry: Arc>,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: field `window_start` is never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/ai/embeddings.rs:661:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m658\u001b[0m \u001b[1m\u001b[94m|\u001b[0m pub struct ContextWindowManager {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m--------------------\u001b[0m \u001b[1m\u001b[94mfield in this struct\u001b[0m\n\u001b[1m\u001b[94m...\u001b[0m\n\u001b[1m\u001b[94m661\u001b[0m \u001b[1m\u001b[94m|\u001b[0m window_start: Instant,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: constant `MAX_RETRIES` is never used\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/ai/inference.rs:41:7\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m41\u001b[0m \u001b[1m\u001b[94m|\u001b[0m const MAX_RETRIES: u32 = 3;\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: constant `RETRY_BASE_DELAY_MS` is never used\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/ai/inference.rs:44:7\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m44\u001b[0m \u001b[1m\u001b[94m|\u001b[0m const RETRY_BASE_DELAY_MS: u64 = 1000;\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: fields `api_key`, `base_url`, and `client` are never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/ai/inference.rs:453:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m452\u001b[0m \u001b[1m\u001b[94m|\u001b[0m pub struct AnthropicClient {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m---------------\u001b[0m \u001b[1m\u001b[94mfields in this struct\u001b[0m\n\u001b[1m\u001b[94m453\u001b[0m \u001b[1m\u001b[94m|\u001b[0m api_key: String,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^\u001b[0m\n\u001b[1m\u001b[94m454\u001b[0m \u001b[1m\u001b[94m|\u001b[0m base_url: String,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^\u001b[0m\n\u001b[1m\u001b[94m455\u001b[0m \u001b[1m\u001b[94m|\u001b[0m models: Vec,\n\u001b[1m\u001b[94m456\u001b[0m \u001b[1m\u001b[94m|\u001b[0m client: reqwest::Client,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m\n \u001b[1m\u001b[94m= \u001b[0m\u001b[1mnote\u001b[0m: `AnthropicClient` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: field `routing_table` is never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/ai/inference.rs:719:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m716\u001b[0m \u001b[1m\u001b[94m|\u001b[0m pub struct ModelRouter {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m-----------\u001b[0m \u001b[1m\u001b[94mfield in this struct\u001b[0m\n\u001b[1m\u001b[94m...\u001b[0m\n\u001b[1m\u001b[94m719\u001b[0m \u001b[1m\u001b[94m|\u001b[0m routing_table: RwLock>,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m\n \u001b[1m\u001b[94m= \u001b[0m\u001b[1mnote\u001b[0m: `ModelRouter` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: field `cost_history` is never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/ai/inference.rs:951:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m947\u001b[0m \u001b[1m\u001b[94m|\u001b[0m pub struct TokenCounter {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m------------\u001b[0m \u001b[1m\u001b[94mfield in this struct\u001b[0m\n\u001b[1m\u001b[94m...\u001b[0m\n\u001b[1m\u001b[94m951\u001b[0m \u001b[1m\u001b[94m|\u001b[0m cost_history: RwLock>,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: constant `HEALTH_CHECK_TIMEOUT_MS` is never used\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/bridge.rs:64:7\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m64\u001b[0m \u001b[1m\u001b[94m|\u001b[0m const HEALTH_CHECK_TIMEOUT_MS: u64 = 1000;\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: field `id` is never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/bridge.rs:152:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m151\u001b[0m \u001b[1m\u001b[94m|\u001b[0m struct PoolEntry {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m---------\u001b[0m \u001b[1m\u001b[94mfield in this struct\u001b[0m\n\u001b[1m\u001b[94m152\u001b[0m \u001b[1m\u001b[94m|\u001b[0m id: usize,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: method `stats` is never used\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/bridge.rs:195:8\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m163\u001b[0m \u001b[1m\u001b[94m|\u001b[0m impl ConnectionPool {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m-------------------\u001b[0m \u001b[1m\u001b[94mmethod in this implementation\u001b[0m\n\u001b[1m\u001b[94m...\u001b[0m\n\u001b[1m\u001b[94m195\u001b[0m \u001b[1m\u001b[94m|\u001b[0m fn stats(&self) -> PoolStats {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: struct `PoolStats` is never constructed\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/bridge.rs:203:8\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m203\u001b[0m \u001b[1m\u001b[94m|\u001b[0m struct PoolStats {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: fields `circuit_breaker_trips` and `health_check_failures` are never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/connector/bridge.rs:229:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m225\u001b[0m \u001b[1m\u001b[94m|\u001b[0m struct BridgeStats {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m-----------\u001b[0m \u001b[1m\u001b[94mfields in this struct\u001b[0m\n\u001b[1m\u001b[94m...\u001b[0m\n\u001b[1m\u001b[94m229\u001b[0m \u001b[1m\u001b[94m|\u001b[0m circuit_breaker_trips: u64,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n\u001b[1m\u001b[94m230\u001b[0m \u001b[1m\u001b[94m|\u001b[0m health_check_failures: u64,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m\n \u001b[1m\u001b[94m= \u001b[0m\u001b[1mnote\u001b[0m: `BridgeStats` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: field `consumers` is never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/messaging/mod.rs:38:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m35\u001b[0m \u001b[1m\u001b[94m|\u001b[0m pub struct MessageBroker {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m-------------\u001b[0m \u001b[1m\u001b[94mfield in this struct\u001b[0m\n\u001b[1m\u001b[94m...\u001b[0m\n\u001b[1m\u001b[94m38\u001b[0m \u001b[1m\u001b[94m|\u001b[0m consumers: DashMap>>,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: field `version` is never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/protocol/messages.rs:293:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m291\u001b[0m \u001b[1m\u001b[94m|\u001b[0m pub struct MessageRegistry {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m---------------\u001b[0m \u001b[1m\u001b[94mfield in this struct\u001b[0m\n\u001b[1m\u001b[94m292\u001b[0m \u001b[1m\u001b[94m|\u001b[0m handlers: HashMap,\n\u001b[1m\u001b[94m293\u001b[0m \u001b[1m\u001b[94m|\u001b[0m version: u32,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: field `version` is never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/protocol/serialize.rs:258:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m255\u001b[0m \u001b[1m\u001b[94m|\u001b[0m struct Schema {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m------\u001b[0m \u001b[1m\u001b[94mfield in this struct\u001b[0m\n\u001b[1m\u001b[94m...\u001b[0m\n\u001b[1m\u001b[94m258\u001b[0m \u001b[1m\u001b[94m|\u001b[0m version: u32,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: fields `required` and `default_value` are never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/protocol/serialize.rs:264:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m261\u001b[0m \u001b[1m\u001b[94m|\u001b[0m struct SchemaField {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m-----------\u001b[0m \u001b[1m\u001b[94mfields in this struct\u001b[0m\n\u001b[1m\u001b[94m...\u001b[0m\n\u001b[1m\u001b[94m264\u001b[0m \u001b[1m\u001b[94m|\u001b[0m required: bool,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^\u001b[0m\n\u001b[1m\u001b[94m265\u001b[0m \u001b[1m\u001b[94m|\u001b[0m default_value: Option,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: variant `Custom` is never constructed\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/protocol/serialize.rs:276:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m269\u001b[0m \u001b[1m\u001b[94m|\u001b[0m enum FieldValidation {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m---------------\u001b[0m \u001b[1m\u001b[94mvariant in this enum\u001b[0m\n\u001b[1m\u001b[94m...\u001b[0m\n\u001b[1m\u001b[94m276\u001b[0m \u001b[1m\u001b[94m|\u001b[0m Custom(String),\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: fields `next_request_id`, `pending_requests`, `serializer`, and `timeout_ms` are never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/protocol/rpc.rs:218:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m217\u001b[0m \u001b[1m\u001b[94m|\u001b[0m pub struct RpcClient {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m---------\u001b[0m \u001b[1m\u001b[94mfields in this struct\u001b[0m\n\u001b[1m\u001b[94m218\u001b[0m \u001b[1m\u001b[94m|\u001b[0m next_request_id: AtomicU64,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^\u001b[0m\n\u001b[1m\u001b[94m219\u001b[0m \u001b[1m\u001b[94m|\u001b[0m pending_requests: Arc, RpcError>>>>>,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^^\u001b[0m\n\u001b[1m\u001b[94m220\u001b[0m \u001b[1m\u001b[94m|\u001b[0m serializer: Serializer,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^\u001b[0m\n\u001b[1m\u001b[94m221\u001b[0m \u001b[1m\u001b[94m|\u001b[0m timeout_ms: u64,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: field `serializer` is never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/protocol/rpc.rs:271:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m269\u001b[0m \u001b[1m\u001b[94m|\u001b[0m pub struct RpcServer {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m---------\u001b[0m \u001b[1m\u001b[94mfield in this struct\u001b[0m\n\u001b[1m\u001b[94m270\u001b[0m \u001b[1m\u001b[94m|\u001b[0m handlers: HashMap,\n\u001b[1m\u001b[94m271\u001b[0m \u001b[1m\u001b[94m|\u001b[0m serializer: Serializer,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: field `events` is never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/registry/mod.rs:31:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m28\u001b[0m \u001b[1m\u001b[94m|\u001b[0m pub struct ServiceRegistry {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m---------------\u001b[0m \u001b[1m\u001b[94mfield in this struct\u001b[0m\n\u001b[1m\u001b[94m...\u001b[0m\n\u001b[1m\u001b[94m31\u001b[0m \u001b[1m\u001b[94m|\u001b[0m events: Arc>>,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^\u001b[0m\n\n\u001b[1m\u001b[33mwarning\u001b[0m: `tent-backend` (lib) generated 50 warnings (run `cargo fix --lib -p tent-backend` to apply 21 suggestions)\n\u001b[1m\u001b[92m Finished\u001b[0m `dev` profile [unoptimized + debuginfo] target(s) in 49.48s" + }, + { + "name": "frontend", + "status": "PASS", + "elapsed_seconds": 38.758, + "artifact": "/workspace/TentOfTrials-issue2/frontend/dist", + "output": "> tent-frontend@0.0.0 build\n> tsc -b && vite build\n\nvite v6.4.3 building for production...\ntransforming...\n\u2713 100 modules transformed.\nrendering chunks...\ncomputing gzip size...\ndist/index.html 0.63 kB \u2502 gzip: 0.35 kB\ndist/assets/state-BkjSKDbY.js 8.91 kB \u2502 gzip: 3.54 kB \u2502 map: 57.15 kB\ndist/assets/vendor-CREcWLHI.js 48.93 kB \u2502 gzip: 17.25 kB \u2502 map: 481.27 kB\ndist/assets/index-CyxcoTyU.js 231.32 kB \u2502 gzip: 72.16 kB \u2502 map: 1,045.57 kB\n\u2713 built in 4.86s" + }, + { + "name": "market", + "status": "PASS", + "elapsed_seconds": 7.723, + "artifact": "/workspace/TentOfTrials-issue2/market/market", + "output": "go: downloading go.uber.org/zap v1.27.0\ngo: downloading github.com/google/uuid v1.6.0\ngo: downloading github.com/gorilla/websocket v1.5.3\ngo: downloading github.com/shopspring/decimal v1.4.0\ngo: downloading go.uber.org/multierr v1.10.0" + }, + { + "name": "frailbox", + "status": "FAIL", + "elapsed_seconds": 0.227, + "artifact": null, + "output": "gcc -Wall -Wextra -Wpedantic -std=c2x -O2 -g -D_FORTIFY_SOURCE=3 -fstack-protector-strong -fPIE -Iinclude -MMD -MP -c src/arena.c -o build/src/arena.o\nsrc/arena.c: In function 'region_alloc':\nsrc/arena.c:13:36: error: 'MAP_ANONYMOUS' undeclared (first use in this function)\n 13 | int mmap_flags = MAP_PRIVATE | MAP_ANONYMOUS;\n | ^~~~~~~~~~~~~\nsrc/arena.c:13:36: note: each undeclared identifier is reported only once for each function it appears in\nsrc/arena.c:17:23: error: 'MAP_HUGETLB' undeclared (first use in this function)\n 17 | mmap_flags |= MAP_HUGETLB;\n | ^~~~~~~~~~~\nsrc/arena.c: In function 'arena_contains':\nsrc/arena.c:179:17: warning: comparison of distinct pointer types lacks a cast\n 179 | ptr < (char *)region->start + region->size) {\n | ^\nmake: *** [Makefile:27: build/src/arena.o] Error 1" + }, + { + "name": "engine", + "status": "FAIL", + "elapsed_seconds": 3.132, + "artifact": null, + "output": "[ 11%] Building CXX object CMakeFiles/trial-engine.dir/main.cpp.o\n/workspace/TentOfTrials-issue2/frailbox/engine/main.cpp:12:10: fatal error: format: No such file or directory\n 12 | #include \n | ^~~~~~~~\ncompilation terminated.\ngmake[2]: *** [CMakeFiles/trial-engine.dir/build.make:76: CMakeFiles/trial-engine.dir/main.cpp.o] Error 1\ngmake[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/trial-engine.dir/all] Error 2\ngmake: *** [Makefile:136: all] Error 2" + }, + { + "name": "compliance", + "status": "PASS", + "elapsed_seconds": 1.825, + "artifact": "/workspace/TentOfTrials-issue2/compliance/build", + "output": "" + }, + { + "name": "v2-market-stream", + "status": "PASS", + "elapsed_seconds": 0.04, + "artifact": null, + "output": "Syntax OK\nruby: warning: shebang line ending with \\r may cause problems" + }, + { + "name": "nfc-scanner", + "status": "PASS", + "elapsed_seconds": 0.008, + "artifact": null, + "output": "" + }, + { + "name": "openapi-haskell", + "status": "FAIL", + "elapsed_seconds": 0, + "artifact": null, + "output": "Command not found: [Errno 2] No such file or directory: 'ghc'" + }, + { + "name": "openapi-tools", + "status": "PASS", + "elapsed_seconds": 0.015, + "artifact": null, + "output": "" + } + ], + "pr_note": "Include the encrypted diagnostic logd artifact(s): diagnostic/build-3ce6b853.logd. The encrypted .logd is the required diagnostic content for PR review; this JSON file is metadata. Maintainers may ask you to remove these diagnostic artifacts before merging." +} diff --git a/diagnostic/build-3ce6b853.logd b/diagnostic/build-3ce6b853.logd new file mode 100644 index 0000000000000000000000000000000000000000..161df98af55a911e3d7dc754ed7df09e6ecc721c GIT binary patch literal 39064 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 literal 0 HcmV?d00001