On Monday the 30th I will submit
https://upspin-review.googlesource.com/c/upspin/+/18960. It removes support in upspinfs for hard links. Instead thk link() call will receive the error ENOTSUP.
The reason is that our hard link semantics was causing problems to programs like Mutt that actually check to see that the link is a link. Our hard links were actually copy on write files. Specifically, a link() call resulted in a second DirEntry that pointed to the same Blocks as the first one. This is VERY different than two names referring to the same inode on *nix. We really have no mechanism corresponding to a hard link.
Testing the new semantics with both mutt and git shows that mutt now works and git continues to work. I would be interested in hearing about anything that no longer works.
This change does not affect symbolic links. They continue to work since upspin ones are equivalent to *nix ones.