3da8545464
Clients need one Forge to install internal modules and forgeapi.puppet.com ones with dependencies resolved across both; puppet has no virtual type. - merge member `/v3/releases?module=` lists newest first, the earlier member winning a duplicate version - cache merges, and modules no member has, for the merge TTL - paginate over the merged list with Forge-root-relative links and `file_uri` - serve `/v3/modules/<slug>` with the highest merged version as `current_release` - 302 release details and downloads to the owning member; fail closed with 502 on a member error - add docs/puppet/virtual.md and an e2e-docker case driving real `puppet module install` and r10k Reviewed-on: #160 Co-authored-by: unkin-agent <unkin-agent@unkin.net> Co-committed-by: unkin-agent <unkin-agent@unkin.net>