You can use a rootless component in order to define a composite baseline.
You would have one dedicated stream in which:
- you would update with the relevant baselines for each component (rebase)
- you would keep the rootless component with, in its dependencies all the other components
- you would create a baseline each time you want to freeze the list of baselines represented by the other components of that stream.
Creating a baseline when there are many read-only component and one rootless component with create a composite baseline on said rootless component, which will include the baselines of the other root-based components.
You can then have another stream, dedicated for reading a specific (composite) baseline of that rootless component: a view on that stream will give you access to the content of all the root-based components referenced by the composite baseline.