//! Cross-platform scenario tests (CLAUDE.md section 7). //! //! This crate holds the **golden decision tables**: declarative schedules, //! inputs, and expected decisions that are run against the core engine. //! //! # Why this is a contract, not a test suite //! //! Unit tests check the engine against itself. These check that *every platform* //! agrees with the engine. Android, Linux and Windows each map their own app //! identity — package name, desktop-file id, exe path — onto a //! [`blocker_core::model::Target`], and every case here runs through that mapping //! too. If Linux resolves Discord to a different target than Android does, a case //! fails at build time instead of becoming a bug report from whichever platform //! nobody was testing that week. //! //! # The rule that keeps it honest //! //! **A case is added before the engine changes.** A table written after the code //! records current behaviour and can never catch a regression — it would be a //! transcript, not a specification. Reviewing a PR that changes engine behaviour //! therefore means checking that a case was added or updated in the same commit. //! //! # Layout //! //! - [`golden`] — the case format, the harness, and the builder DSL //! - [`tables`] — the cases themselves, grouped by scenario //! - [`coverage`] — which CLAUDE.md scenario each case claims, and the check that //! nothing went uncovered //! - [`purity`] — a mechanical check that the core has not gained I/O, plus the //! clock-tampering fixtures that cannot be expressed as data //! //! [`purity`] is `cfg(test)` because its checks are `#[test]` functions in this //! library's unit-test build, not library API. They run under `cargo test`. pub mod coverage; pub mod golden; pub mod tables; #[cfg(test)] mod purity; #[cfg(test)] mod run;