//! Shared in-memory port adapters for Phase 5 trait integration tests.
//!
//! Each adapter is HashMap-backed and intentionally minimal — Sub-cycle B
//! exercises the engine wiring, not the substrate adapter logic itself.
//! Production substrates (KVRocks, Postgres, HTTP userinfo) live in
//! chat-auth / pas-external; their behavior is verified at those crates'
//! boundary, not here.
//!
//! Each adapter has two constructors:
//!
//! - `new()` — happy-path substrate: tracks state in memory.
//! - `failing()` — always returns `Transient`, lets engine integration
//!   tests prove the fail-closed posture (substrate down → reject token,
//!   not admit).
//!
//! Mutex poison recovery via `.unwrap_or_else(|p| p.into_inner())` keeps
//! the workspace lint (`clippy::unwrap_used` deny) clean — the lint
//! flags `Result::unwrap` only, not `unwrap_or_else`.

#![allow(dead_code)] // each test file uses a subset

pub mod epoch;
pub mod observability;
pub mod replay;
pub mod session;

pub use epoch::MemoryEpochRevocation;
pub use observability::{CapturedEvent, EventCapture};
pub use replay::MemoryReplayDefense;
pub use session::MemorySessionRevocation;
