Two bugs fixed:
1. TestConsumer's default param (tasks=[]) created a new array ref every render,
causing an infinite useEffect loop with setTasks. Fixed with stable EMPTY_TASKS constant.
2. KeyboardProvider's context value was a new object literal every render.
Wrapped in useMemo to prevent unnecessary consumer re-renders.
3. Destructured useKeyboard() return in test to use stable callback refs
instead of the whole context object as useEffect deps.
Also: added root vitest.config.ts with workspace projects for mono-repo test runs.