todoapp-core
The domain core of tda: entities, capabilities, and the ports (traits) that
adapters implement. No I/O, no runtime, no framework dependencies — this
crate compiles without touching a filesystem, a network, or an async runtime
executor.
- Task = a stable identity (id + timestamps) plus a set of capabilities
(
Status,Notes,Schedule,Estimate,Tags,Assignment,Recurrence,IssueRef,Attachments,Archived,TimeLog) — composition instead of a fixed field list. Seetda-spec.md§3. - The decider pattern:
decide(capability-keyed guards, first denial wins) →Events →apply(capability-keyed state changes). Seetda-spec.md§5a. - Ports (
ComponentStore,TaskEntityStore, …) are defined here and implemented by adapters (todoapp-store-mem,todoapp-store-turso).
This crate sits at the bottom of the dependency rule:
adapters → app → core. Nothing above may leak into it — this is enforced by
mise run lint (lint:core-no-io, a cargo tree denylist).
See the root README and tda-spec.md
for the full picture; CLAUDE.md for contributor
conventions.