Thank you for being patient! We're working hard on resolving the issue
Tento docs should make architectural boundaries visible. If a crate cannot be explained as a small public API with explicit host seams, the code probably needs better encapsulation.
Each crate should expose a narrow set of stable entry points:
Everything else should stay private until multiple callers need it.
Provider crates should follow this shape:
tento-{provider}
default build SDK: HTTP/OAuth/models only
connector feature Row + Integration implementations
sync-plugin feature optional lona-sync provider/executor
The default SDK build should not depend on Lona host models, row stores, or
sync orchestration. When host behavior is needed, expose a trait such as
GoogleBackendDeps, GarminBackendDeps, or WeatherBackend and let the host
adapt its own storage and credential types.
Host seams should be explicit traits, not callback bags hidden in app code. A good seam says:
Provider crates can declare the seam, but concrete lona-* types should stay
in host crates such as lona-rows or lona-so.
External service details belong in the owning crate:
Application code should call high-level SDK methods. If a caller needs to know too much about a vendor API, add a method to the provider crate instead of duplicating the protocol at the call site.
Script modules are operational entry points. They may wire env config, logging, and command output, but they should delegate core behavior to the crate API.
If the only way to use a crate is through its script commands, the crate still needs a library-level API before other code should depend on it.