Decide the public Rust API before the tag makes it permanent.
Why one epic
Three questions freeze together at v1 and none of them has an owner today.
After the tag each is a breaking change; before it, each is free.
Children
Typed errors at the boundary. The library returns anyhow::Result from its entry points and from the public Extension trait, while the typed Refusal vocabulary already exists and is discarded at exactly the seam a caller would match on.
The front door. Fifteen bare pub mod lines and zero pub use, so every internal module path is public API. Plus #[must_use] absent from roughly fourteen consuming builder methods, and #[non_exhaustive] applied to the error enums but not to the all-pub-field config structs, which is inverted.
The crate partition. One 23,000-line crate with no primitives layer, so anything wanting to parse a component.toml pulls wasmtime, redb, alloy-provider and hyper.
The standard being applied
reth and alloy, deliberately. reth confines eyre to binaries and returns typed errors from libraries, splits its surface across many crates and keeps its primitives layer dependency-light. alloy re-exports its core types at the facade root and treats anything reachable in a public signature as something the facade must re-export.
The tree already matches them in several places worth not regressing: additive feature flags, builders that consume self, newtypes over primitive obsession, sealed traits, #[non_exhaustive] on wire enums, and a clippy.toml used as capability policy that is more disciplined than either upstream.
Exit
Each question is answered and recorded, whether the answer is a change or a deliberate acceptance.
Decide the public Rust API before the tag makes it permanent.
Why one epic
Three questions freeze together at v1 and none of them has an owner today.
After the tag each is a breaking change; before it, each is free.
Children
Typed errors at the boundary. The library returns
anyhow::Resultfrom its entry points and from the publicExtensiontrait, while the typedRefusalvocabulary already exists and is discarded at exactly the seam a caller would match on.The front door. Fifteen bare
pub modlines and zeropub use, so every internal module path is public API. Plus#[must_use]absent from roughly fourteen consuming builder methods, and#[non_exhaustive]applied to the error enums but not to the all-pub-field config structs, which is inverted.The crate partition. One 23,000-line crate with no primitives layer, so anything wanting to parse a
component.tomlpulls wasmtime, redb, alloy-provider and hyper.The standard being applied
reth and alloy, deliberately. reth confines
eyreto binaries and returns typed errors from libraries, splits its surface across many crates and keeps its primitives layer dependency-light. alloy re-exports its core types at the facade root and treats anything reachable in a public signature as something the facade must re-export.The tree already matches them in several places worth not regressing: additive feature flags, builders that consume
self, newtypes over primitive obsession, sealed traits,#[non_exhaustive]on wire enums, and aclippy.tomlused as capability policy that is more disciplined than either upstream.Exit
Each question is answered and recorded, whether the answer is a change or a deliberate acceptance.