From documentation:
The Fiber#resume method accepts an arbitrary number of parameters, if it is the first call to resume then they will be passed as block arguments. Otherwise they will be the return value of the call to Fiber.yield
Your second call to resume is only returning the value returned by Fiber#yield, which would be simply 3.