Simulate optimistic UI: apply update immediately, then rollback on failure.
solve(items, mutation, succeeds) where mutation is { id, newValue }:
1. Apply immediately to a copy.
2. If succeeds is false, rollback to original.
3. Return final list.
Sample tests