Ferralk / Architecture
ADR-0003: Two published crates, no C ABI
- Status: Accepted
- Date: 2026-08-18
Context
Matcher-only consumers (the fast-glob audience) should not pull walker
dependencies like ignore and crossbeam-deque. The C API and the zlob
Rust-API migration facade were artifacts of the abandoned upstream-rewrite
model. Corpus, harness, oracle, and bench tooling need workspace members
regardless of the publishing layout.
Decision
One Cargo workspace with exactly two published crates:
ferralk-glob— the matcher: dependency-light (memchronly),#![forbid(unsafe_code)].ferralk— the walker engine; depends on and re-exportsferralk-glob.
Unpublished members: corpus, harness, oracle, bench. No C ABI. No zlob
migration facade; a compatibility guide documents the API mapping instead.
Consequences
- Clean dependency story per audience; the stable matcher can version independently from the faster-moving walker at the API level.
- One workspace version governs both published crates. Release Please updates
the workspace manifest, the internal
ferralk→ferralk-globdependency, and the workspace lockfile in one release PR; the publish workflow sendsferralk-globto crates.io beforeferralk. - Non-Rust consumers are out of scope for now.
Scope confirmation
On 2026-08-19, the Rust-only boundary was reconfirmed for Ferralk 1.0. The frozen zlob corpus covers the public Rust-shaped semantics; C ABI, loader/TLS, callback, result-buffer, and libc-shell surfaces remain explicit non-goals. A future compatibility layer is a separate product decision rather than a compatibility requirement of these two crates.