I am not a DDD expert (only after 100 pages in Eric Evan’s book), but I can tell you what happened in our case with the e-commerce catalog.
Initially, we had such a business stream in the same limited application context, based on data and requesting user roles / permissions that we changed state transitions (you said links, but this is really his heart, links are just one way of presenting state transitions) presented to the user. This worked fine, but there was a lot of repeating logic. Then we added a search application, which was another limited context, because it represented the same data, but in different collections / groups, and we did not want them to go out of sync.
We moved on to the implementation of CQRS, so most of our business logic is “pre-calculated”, so it somewhat resembles the “partner context” as part of our projection from the recording model to the reading model. We do not store links specifically, but instead allow behavior on the data. Both the catalog application and the search application use this reading model and behavior flags to determine state transitions for presentation to the client.
Some things happen on the fly when a resource is requested, almost at the serialization stage. We aimed them to be as calculated as possible, but what we cannot pre-calculate (just because of scale) is material based solely on the user. Like the recommended search, which uses BI data in the search engine to return results. We could pre-calculate this for each individual user, but the numbers are too large for our systems right now. Therefore, we send the main resource, designed for applications (from the main context), and pass it through another partner context for further clarification.
another use case - some links are provided only to an authenticated user and, thus, are hidden from anonymous users. We do this in the main context of applications, but this is starting to hinder a little, because their presence indicates what the user behind the request can do in other applications (for example, change the password), and our context is not really the authority that the user can do this in another application. It would be better to pass the resource into their context and force them to process it before we return it to the user. One simple solution that we used for this was that instead of deeply binding to functions in an external context, we contact the root resource of this context and allow it to represent transition states. This means that there are 2 requests, but it clears the places / powers of the logic.