Yes, my solution is wrong.
The task library actually uses coroutines and functions like task.spawn are just abstractions of the coroutine library.
In other words task and coroutine are the same, except task simplifies the process in exchange for less control - at least that’s what roblox says:
In most cases using a function is sufficient, but for more advanced cases it’s recommended you familiarize yourself with the coroutine library.