- Added a first-class async effect system plus runtime plumbing: Effect builders (run, timer, fire) live in Sources/SwifTeaCore/Effect.swift:1-98, and the runtime now installs an action queue, effect runner, and scene hook via
initializeEffects() with safe SwifTea.dispatch/cancelEffects APIs (Sources/SwifTeaCore/Runtime.swift:29-188). TerminalDimensions gained a lock-protected override stack so size overrides remain thread-safe during concurrent tests
(Sources/SwifTeaCore/Terminal.swift:22-64).
- Reworked the TaskRunner demo to rely entirely on effects: actions now cover toast ticks, per-step progress, and completion notifications (Sources/Examples/TaskRunner/TaskRunnerApp.swift:11-199), state exposes timer cadence and minimum
run duration (Sources/Examples/TaskRunner/TaskRunnerState.swift:5-157), and the view model drives progress/finish reducers that enqueue toasts and clamp remaining times (Sources/Examples/TaskRunner/TaskRunnerViewModel.swift:31-115).
Snapshot tests dispatch the new async actions instead of hand-ticking the reducer (Tests/SwifTeaTaskRunnerExampleTests/TaskRunnerSnapshotTests.swift:21-57).
- Documented the new behavior in the README’s “Async Effects & Dispatch” section (README.md:63-68) and flipped the roadmap entry to “Implemented” with follow-up work noted (docs/TUIDesignRoadmap.md:20-27).
- Hardened the test suite: added coverage for Effect.timer (Tests/SwifTeaCoreTests/EffectTests.swift:1-24), introduced a shared SnapshotSync.cursorBlinkerLock so notebook and text-field snapshots can force cursor visibility without
trampling one another (Tests/TestSupport/CursorBlinkerTestLock.swift:1-9, Tests/SwifTeaNotebookExampleTests/NotebookTestHelpers.swift:8-25, Tests/SwifTeaUITests/TextFieldTests.swift:150-209).