Cooldown profiles and the unprefixed URLs share a packument's cache row,
but each chose its format by its own policy: abbreviated without
cooldown, full with it. With cooldown on for only some of them, a request
without cooldown that revalidated the row stored the abbreviated
packument. The next request under cooldown rejected it and fetched the
full one again, even within metadata_ttl, and had no stale copy to serve
when the upstream failed.
Cooldown in the global policy or in any profile now makes all of them
request the full packument, as upstream.npm_full_metadata does. URLs
without cooldown are then served full packuments too.
A metadata fetch always ran on a context detached from its first
caller, so a client could request many uncached documents under
different names and hang up at once, leaving one upstream fetch per
request running to the HTTP client's timeout, each buffering up to
metadata_max_size. Artifact fetches only detach while they hold one of
maxDetachedFetches slots. Metadata fetches now do the same with their
own 64 slots; beyond that, a fetch ends with its first caller.