GraphReFly handle-protocol core dispatcher.
This crate is the heart of the protocol: dispatcher, message tiers,
batch coalescing, wave engine, dep tracking, equals-substitution,
first-run gate, PAUSE/RESUME with lockIds, INVALIDATE broadcast,
versioning lifecycle, atomic dep mutation (set_deps).
It operates entirely on opaque HandleId integers —
user values T never enter the core. Per-language bindings (napi-rs for
JavaScript, pyo3 for Python, wasm-bindgen for WASM) hold the
value-to-handle registry. Equals-substitution under
EqualsMode::Identity is a u64 compare with zero FFI; user-fn
invocation is the only mandatory boundary crossing per fn fire.
Status (2026-05-03)
M1 first slice — warm-up modules ([message], [handle], [clock],
[boundary]). The dispatcher itself, batch engine, PAUSE/RESUME, and
set_deps follow incrementally. See
~/src/graphrefly-ts/docs/implementation-plan.md Phase 13.7 for the
full slice plan; reference impl at
~/src/graphrefly-ts/src/__experiments__/handle-core/.
Safety
No unsafe is permitted in this crate or anywhere in the workspace.
Enforced by #![forbid(unsafe_code)] at the root. See CLAUDE.md
Rust invariant 1.