Hm, it's not really about a "best practice" as different system implementations have vastly different design goals. Some may assume "same binary on both ends", some may not. Some may want to spare every possible bit on the wire, and some don't care since payloads will out-weight the identifiers every time considerably. At every approach there are tradeoffs, and the goal of the language is to allow those system implementations to make those tradeoffs.
I'm aware of a few very different implementations, all of which would make quite different tradeoffs here. Either way, it is the goal of the proposal under review to allow for this flexibility because the implementations will learn in practice what tradeoffs they must take here. This may sound a bit hand-wavy, but I'm actively engaged with a number of use-cases we have in mind here...
Having that said, a "good default, that works in simple things" is the mangled names as they allow the most user friendly "i can call anything i can expose" semantics.
Currently we have open sourced and are focused on the peer to peer server-side focused cluster implementation: Swift.org - Introducing Swift Distributed Actors It'll use mangled names for now*
* continue reading why "for now"
No, not all systems can rely on shared knowledge.
Yes, such "user provided stable name" for methods is exactly what I'd like to get to in future work on this feature. We called this exact annotation "stable name" in some discussions 
It is an additional improvement and logical next step to improve the versioning story of the model to allow people to use compressed names etc. There's a lot to polish about versioning, but such "stable name" and other techniques is exactly what we're hinting at in the Future Directions of the previous (SE-0336) proposal here: (https://github.com/apple/swift-evolution/blob/main/proposals/0336-distributed-actor-isolation.md#future-directions.
I don't that a model that "always must give stable names to things" can be the default. A great getting started experience is important for this feature; and same as with Akka and my previous work there, it is important to get people wrap their heads around "aha, this is how it can work", and only once they need to go stable, bother them with many "before you go to prod" additional settings, tweaks etc (one such thing could be "do stable names").
To address this explicitly: it is not an "alternative considered" per se, because such optional attribute I still think is something we'll want for our improved versioning story -- which is a future direction and mentioned a little bit in the previous proposal.
We could add to alternatives considered "always force setting stable names" I guess; but not sure process wise, since that's the previous proposal.
The "that type" in my sentence may have been ambiguous and mislead you there. I was calling out why the ABI function name sucks for wire formats, and that we indeed will want to offer something better (again, see versioning "future directions").
By that type I meant that:
- caller has
class X,
- caller is system "v1", knows of distributed method
hello(x: X)
- recipient actually has changed X to a struct,
struct X
- caller calls `hello(x:)
- target identification is naive, and uses the mangled name
- recipient cannot locate the target handle because it is registered under a function mangled name that includes the struct X, and not class...
Because all of the interaction was made over the network... and e.g. X was put through Codable on both sides... we literarily don't care if it's a struct or not, we just want to know "yeah, it's that X" but the Swift ABI is too strict for that.
So that's the situation I was pointing at how the ABI names are too strict.
We are very aware of this and will be working on improvements in future versions to add other encodings to the RemoteCallTarget so this way systems can use them in the future when able to; and without us breaking API/ABI of the distributed actors feature.
It absolutely is possible to implement calls to non-swift, although it is not a primary goal of this design.
The only piece which is, as you say, "tied to swift calling convention" is the generic substitutions. And you would not really be able to express the exact method overload semantics as swift in another language, so... I don't think that matters -- you would not support complex generics when calling into a different language and that's it I guess.
As for the rest, the encoder is rather boring:
- for every argument, recordArgument
- record return type
- record error type
There's nothing "super tied to Swift" here -- that's just how function invocations look like 
On that note though, and on improving the simplicity to call other languages:
I am pondering the addition of the name parameter to:
func recordArgument<Arg: SerializationRequirement>(
name: StaticString, <<< we could add that...
argument: Argument
) throws
because it would make it simpler to stuff arguments into a hash with the parameters named... Not sure if it's necessary, but the implementation and performance costs of that are very low so I want to float the idea. It is something @Slava_Pestov suggested while we were reviewing the API and I quite liked the idea.
We are interested in "fixing" Codable, more than you probably think we are even :-)
But it is not something we can block the distributed actor feature on. And neither would Codable, even a "fixed one" be acceptable for some use-cases we are interested in -- which may even avoid traditional serialization per-se, and used shared memory and other techniques...
So all in all, I see your points, but I think we're on track on a road towards all the perfect things, but it'll take time to get there. Stable names and things like those arrived at competing implementations many years after the initial versions, so we're not alone in this game of catch up hah.