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| impl

The slices

examples/skills-only-app-task-tracker/
crates/task-contract/contractTask, inputs, rules, Tasks and TaskRepository ports
crates/task-impl-timescale/implementationTask service, repository, migration
crates/task-adapter-htmx/adapterList page, create form, handlers
servers/web/compositionLogin stack, session, providers, router

Reading 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.