disallowed-types = [
    { path = "alloc::boxed::Box", reason = "borromean core must remain no_alloc and avoid heap-backed wrappers" },
    { path = "alloc::borrow::Cow", reason = "borromean core must remain no_alloc and avoid heap-backed wrappers" },
    { path = "alloc::collections::BTreeMap", reason = "borromean core must remain no_alloc and avoid heap-backed wrappers" },
    { path = "alloc::collections::BTreeSet", reason = "borromean core must remain no_alloc and avoid heap-backed wrappers" },
    { path = "alloc::collections::BinaryHeap", reason = "borromean core must remain no_alloc and avoid heap-backed wrappers" },
    { path = "alloc::collections::LinkedList", reason = "borromean core must remain no_alloc and avoid heap-backed wrappers" },
    { path = "alloc::collections::VecDeque", reason = "borromean core must remain no_alloc and avoid heap-backed wrappers" },
    { path = "alloc::rc::Rc", reason = "borromean core must avoid heap-backed indirection and task wiring" },
    { path = "alloc::string::String", reason = "borromean core must remain no_alloc and avoid heap-backed wrappers" },
    { path = "alloc::sync::Arc", reason = "borromean core must avoid heap-backed indirection and task wiring" },
    { path = "alloc::vec::Vec", reason = "borromean core must remain no_alloc and avoid heap-backed wrappers" },
    { path = "core::task::RawWaker", reason = "wakeups remain the caller I/O implementation's responsibility" },
    { path = "core::task::RawWakerVTable", reason = "wakeups remain the caller I/O implementation's responsibility" },
    { path = "core::task::Waker", reason = "wakeups remain the caller I/O implementation's responsibility" },
    { path = "async_std::task::JoinHandle", reason = "borromean core must not assume runtime-owned task handles", allow-invalid = true },
    { path = "futures_timer::Delay", reason = "borromean core must not depend on internal timer facilities", allow-invalid = true },
    { path = "glommio::LocalExecutor", reason = "borromean core must not depend on a specific executor", allow-invalid = true },
    { path = "smol::Executor", reason = "borromean core must not depend on a specific executor", allow-invalid = true },
    { path = "std::sync::mpsc::Receiver", reason = "borromean core must not assume background worker queues", allow-invalid = true },
    { path = "std::sync::mpsc::Sender", reason = "borromean core must not assume background worker queues", allow-invalid = true },
    { path = "std::sync::mpsc::SyncSender", reason = "borromean core must not assume background worker queues", allow-invalid = true },
    { path = "std::thread::JoinHandle", reason = "borromean core must not assume thread support", allow-invalid = true },
    { path = "tokio::runtime::Runtime", reason = "borromean core must not depend on a specific async runtime", allow-invalid = true },
    { path = "tokio::task::JoinHandle", reason = "borromean core must not assume runtime-owned task handles", allow-invalid = true },
]

disallowed-methods = [
    { path = "async_executor::Executor::spawn", reason = "borromean core must not spawn background workers", allow-invalid = true },
    { path = "async_std::task::block_on", reason = "borromean core must not depend on a runtime-owned executor loop", allow-invalid = true },
    { path = "async_std::task::spawn", reason = "borromean core must not spawn background workers", allow-invalid = true },
    { path = "async_std::task::spawn_blocking", reason = "borromean core must not spawn background workers", allow-invalid = true },
    { path = "core::task::Context::waker", reason = "wakeups remain the caller I/O implementation's responsibility" },
    { path = "embassy_executor::Spawner::spawn", reason = "borromean core must not depend on a specific executor", allow-invalid = true },
    { path = "futures_timer::Delay::new", reason = "borromean core must not depend on internal timer facilities", allow-invalid = true },
    { path = "smol::block_on", reason = "borromean core must not depend on a runtime-owned executor loop", allow-invalid = true },
    { path = "smol::spawn", reason = "borromean core must not spawn background workers", allow-invalid = true },
    { path = "std::sync::mpsc::channel", reason = "borromean core must not assume background worker queues", allow-invalid = true },
    { path = "std::sync::mpsc::sync_channel", reason = "borromean core must not assume background worker queues", allow-invalid = true },
    { path = "std::thread::Builder::spawn", reason = "borromean core must not assume thread support", allow-invalid = true },
    { path = "std::thread::spawn", reason = "borromean core must not assume thread support", allow-invalid = true },
    { path = "tokio::spawn", reason = "borromean core must not spawn background workers", allow-invalid = true },
    { path = "tokio::task::spawn", reason = "borromean core must not spawn background workers", allow-invalid = true },
    { path = "tokio::task::spawn_blocking", reason = "borromean core must not spawn background workers", allow-invalid = true },
]

disallowed-macros = [
    { path = "alloc::format", reason = "borromean core must remain no_alloc and avoid heap-backed formatting" },
    { path = "alloc::vec", reason = "borromean core must remain no_alloc and avoid heap-backed collections" },
]
