lanekeep-engine 0.8.1

Rule execution engine for lanekeep.
Documentation
[package]
name = "lanekeep-engine"
description = "Rule execution engine for lanekeep."
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
authors.workspace = true
keywords.workspace = true
categories.workspace = true

[dependencies]
# For folding the two engines' host surfaces into one cache-key field. Same digest the cache,
# the config loader and the component loader already key on, so a reader meets one hash across
# the project rather than four.
blake3 = { workspace = true }
lanekeep-cache = { workspace = true }
lanekeep-config = { workspace = true }
lanekeep-core = { workspace = true }
lanekeep-js = { workspace = true }
lanekeep-lang = { workspace = true }
lanekeep-query = { workspace = true }
# For the two cache-key inputs a component run depends on: the hash of the WIT host API and
# whatever is bound beside it, and the hash of the compilation environment `wasmtime` checks a
# precompiled artifact against. Both are read from where they are defined rather than restated
# here, which is what the edge buys — a second copy of a cache-key input is a drift source, and
# the failure it produces is a warm run serving an answer computed under conditions that no
# longer hold. It costs `wasmtime` and `cranelift` in the binary from this point rather than
# from Task 16, which is where the plan expected the edge; the alternative was writing the
# reservation, the guard and the version down twice.
lanekeep-wasm = { workspace = true }
memchr = { workspace = true }
rayon = { workspace = true }
thiserror = { workspace = true }
tree-sitter = { workspace = true }

[dev-dependencies]
lanekeep-lang-js = { workspace = true }
# `benches/crossings.rs` only. The Rust grammar, because its subject is a rule that checks Rust;
# the arena, because the crossing count is taken by replaying the rule against the same
# `NodeArena` both engines call.
#
# Deliberately *not* `lanekeep-rules`, whose component this bench also needs. That crate
# dev-depends on `lanekeep-testkit`, which depends on this one, so a dev-dependency here would
# close a cycle in the publication order — and `cargo publish` resolves a cycle by refusing.
# `crossings.rs` reads the component's bytes from its path instead.
lanekeep-lang-rust = { workspace = true }
lanekeep-languages = { workspace = true }
lanekeep-nodes = { workspace = true }

[[bench]]
name = "corpus"
# No harness: this is a budget gate, not a statistical comparison against a stored
# baseline. See the bench's own documentation for why criterion is the wrong shape here.
harness = false

[[bench]]
name = "crossings"
# No harness, for the same reason `corpus` has none: this measures a difference between two
# matched corpora rather than a distribution, and criterion would time the setup it exists to
# subtract.
harness = false

[lints]
workspace = true