Aha. Now I understand.
Obviously, this is a common mistake. But now I see what the intention is.
Francismori7 is correct. Go back and read his responses.
Whenever something that is being used by hundreds or thousands or hundreds of thousands of people seems to have a bug, I have to ask myself, "Is it the code or is it my understanding that is flawed?"
And logically, in such a scenario, it is very likely that it is my understanding that is flawed. Such was the case here.
The subscription name should NOT change when swapping the plan. Think about it: you call swap() from the (named) subscription object. So why would that object's name change? It shouldn't. What should change is only the Stripe plan.
The subscription object is, as Francismori7 pointed out, its own entity, and it should not be confused as merely a label for the Stripe plan.
In most scenarios a user will have just one subscription, but in some cases might have multiple subscriptions representing access to different things.
For example, a user might have a subscription to video lessons and a separate subscription to a forum. Each could have its own levels of access, determined by a stripe plan. For example, maybe (and this is a weak example, but all that comes to mind quickly) one could have read-only access to forums or one could have read-write access. Each is a different plan, but the subscription is the same - forum.
Want to upgrade from read-only to read-write? Okay, then call auth()->user()->subscription("forum")->swap("read-write")