Architecture
graph LR
browser[Browser] -->|forms| adapter[task-adapter-htmx]
adapter -->|Tasks trait| contract[task-contract]
impl[task-impl-timescale] -->|implements| contract
impl --> db[(TimescaleDB)]
server[servers/web] -.->|selects| adapter
server -.->|selects| implThe slices
examples/skills-only-app-task-tracker/
crates/task-contract/contractTask, inputs, rules, Tasks and TaskRepository portscrates/task-impl-timescale/implementationTask service, repository, migrationcrates/task-adapter-htmx/adapterList page, create form, handlersservers/web/compositionLogin stack, session, providers, routerReading the wiring
servers/web names the concrete types exactly twice: once for the
implementation behind TaskRepository, once for the adapter's state — then
hands them to the host. Everything else is generic over the contract, so a
different store or a REST adapter can replace a piece without touching the
rules.