Okay, here's what I want to have a plan for currently. Right now, I can expect that the Candidate generated from a URL InstallRequirement will have a usable source_link field, but I believe I should not rely on that, and be able to generate relevant information from one with that field set to None, such as an AlreadyInstalledCandidate.
Per discussion on GitHub, I should get the equivalent information from direct_url_helpers.dist_get_direct_url(). That function takes a Distribution and returns an Optional[DirectUrl]. If need be, I can convert a Link to a DirectUrl using an adjacent function, so that part should be workable. My next issue is generating a Distribution from an AlreadyInstalledCandidate. That's just the dist field. Glad that part was easy. That field is part of the Candidate interface, so it's possible it'd be more stable to always use it.
Not sure what the preferred way to compare DirectUrl instances is, since there's no comparison methods defined on the class. I'm pretty sure converting them to a dict would work, since the tests do something similar.
Since I've now got a plan for implementing this stuff, I think next I should be putting together tests so I can have some confidence in all of this when I start putting it together.