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
M1 complete (dispatcher, batch/wave engine, PAUSE/RESUME, set_deps,
lifecycle, partitioned concurrency). Track progress in
docs/migration-status.md. TS reference prototype:
~/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.