disallowed-types = [
    # Safety checks to keep SlateDB safe for deterministic simulation testing (DST)
    # OsRng is allow-invalid because rand 0.10 (transitive via object_store 0.13) no longer re-exports it at this path
    { path = "rand::rngs::OsRng", reason = "Use slatedb_common::DbRand instead", allow-invalid = true },
    { path = "rand::rngs::ThreadRng", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand::rngs::StdRng", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand::rngs::SmallRng", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand::prelude::SmallRng", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand::prelude::StdRng", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand::prelude::ThreadRng", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_chacha::ChaChaRng", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_chacha::ChaChaCore", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_chacha::ChaCha8Core", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_chacha::ChaCha8Rng", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_chacha::ChaCha12Core", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_chacha::ChaCha12Rng", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_chacha::ChaCha20Core", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_chacha::ChaCha20Rng", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xorshift::XorShiftRng", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro256PlusPlus", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro256Plus", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro256StarStar", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro128PlusPlus", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro128Plus", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro128StarStar", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::SplitMix64", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoroshiro64Star", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoroshiro64StarStar", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoroshiro128Plus", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoroshiro128PlusPlus", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoroshiro128StarStar", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro128Plus", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro128PlusPlus", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro128StarStar", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro256Plus", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro256PlusPlus", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro256StarStar", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro512Plus", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro512PlusPlus", reason = "Use slatedb_common::DbRand instead" },
    { path = "rand_xoshiro::Xoshiro512StarStar", reason = "Use slatedb_common::DbRand instead" },
    { path = "uuid::Builder", reason = "Use crate::utils::IdGenerator instead" },
    { path = "ulid::Generator", reason = "Use crate::utils::IdGenerator instead" },
    { path = "std::time::Instant", reason = "Use tokio::time::Instant instead" },
    { path = "std::time::SystemTime", reason = "Use slatedb_common::clock::SystemClock instead" },
    { path = "std::thread::Builder", reason = "Use tokio::task::Builder instead" },
    { path = "object_store::prefix::PrefixStore", reason = "Use SlateDB's explicit builder path handling instead" },
]
disallowed-methods = [
    # Safety checks to keep SlateDB safe for deterministic simulation testing (DST)
    { path = "rand::random", reason = "Use slatedb_common::DbRand instead" },
    # thread_rng is allow-invalid because rand 0.10 (transitive via object_store 0.13) no longer re-exports it at this path
    { path = "rand::thread_rng", reason = "Use slatedb_common::DbRand instead", allow-invalid = true },
    # prelude versions are allow-invalid since they may not be in scope
    { path = "rand::prelude::random", reason = "Use slatedb_common::DbRand instead", allow-invalid = true },
    { path = "rand::prelude::thread_rng", reason = "Use slatedb_common::DbRand instead", allow-invalid = true },
    { path = "std::time::SystemTime::now", reason = "Use slatedb_common::clock::SystemClock instead" },
    { path = "std::time::SystemTime::elapsed", reason = "Use slatedb_common::clock::SystemClock instead" },
    { path = "std::option::Option::unwrap", reason = "Use expect instead" },
    { path = "std::result::Result::unwrap", reason = "Use expect instead" },
    { path = "chrono::Utc::now", reason = "Use slatedb_common::clock::SystemClock instead" },
    { path = "ulid::Ulid::new", reason = "Use crate::utils::IdGenerator instead" },
    # uuid::Uuid::new_v* are allow-invalid since each version is behind a feature flag, and thus not visible
    { path = "uuid::Uuid::new_v1", reason = "Use crate::utils::IdGenerator instead", allow-invalid = true },
    { path = "uuid::Uuid::new_v3", reason = "Use crate::utils::IdGenerator instead", allow-invalid = true },
    { path = "uuid::Uuid::new_v4", reason = "Use crate::utils::IdGenerator instead", allow-invalid = true },
    { path = "uuid::Uuid::new_v5", reason = "Use crate::utils::IdGenerator instead", allow-invalid = true },
    { path = "uuid::Uuid::new_v6", reason = "Use crate::utils::IdGenerator instead", allow-invalid = true },
    { path = "uuid::Uuid::new_v7", reason = "Use crate::utils::IdGenerator instead", allow-invalid = true },
    { path = "uuid::Uuid::new_v8", reason = "Use crate::utils::IdGenerator instead", allow-invalid = true },
    { path = "std::thread::spawn", reason = "Use tokio::task::spawn instead" },
    { path = "std::thread::sleep", reason = "Use tokio::time::sleep instead" },
    { path = "tokio::sync::mpsc::UnboundedSender::send", reason = "Use DbStatusManager::create_safe_channel instead" },
    { path = "tokio::task::spawn_blocking", reason = "Use tokio::task::spawn instead" },
    { path = "tokio::time::Instant::now", reason = "Use slatedb_common::clock::SystemClock instead" },
    { path = "tokio::time::interval", reason = "Use slatedb_common::clock::SystemClock instead" },
    { path = "tokio::time::interval_at", reason = "Use slatedb_common::clock::SystemClock instead" },
    { path = "tokio::time::sleep", reason = "Use slatedb_common::clock::SystemClock instead" },
    { path = "tokio::time::sleep_until", reason = "Use slatedb_common::clock::SystemClock instead" },
    { path = "tokio::time::timeout", reason = "Use slatedb_common::clock::SystemClock instead" },
    { path = "tokio::time::timeout_at", reason = "Use slatedb_common::clock::SystemClock instead" },
    # advance/pause/resume are allow-invalid since they are only visible in tests
    { path = "tokio::time::advance", reason = "Use slatedb_common::clock::SystemClock instead", allow-invalid = true },
    { path = "tokio::time::pause", reason = "Use slatedb_common::clock::SystemClock instead", allow-invalid = true },
    { path = "tokio::time::resume", reason = "Use slatedb_common::clock::SystemClock instead", allow-invalid = true },
    # Keep SST writes tagged: BufWriter::new produces an untagged upload. Use
    # tablestore::tagged_buf_writer so the write carries its ObjectStoreCallTag.
    { path = "object_store::buffered::BufWriter::new", reason = "Use tablestore::tagged_buf_writer so SST writes carry their ObjectStoreCallTag" },
]
disallowed-macros = [
    { path = "tracing::info", reason = "Use log::info instead" },
    { path = "tracing::warn", reason = "Use log::warn instead" },
    { path = "tracing::error", reason = "Use log::error instead" },
    { path = "tracing::debug", reason = "Use log::debug instead" },
    { path = "tracing::trace", reason = "Use log::trace instead" },
    { path = "std::eprintln", reason = "Use log::error instead" },
    { path = "std::eprint", reason = "Use log::error instead" },
    { path = "std::println", reason = "Use log::info instead" },
    { path = "std::print", reason = "Use log::info instead" },
]
