The site step writes one prefix, .gitsocial/forks/: one non-thin packfile per open head with the objects reachable from the head and from no bucket ref, then manifest.json last, then a sweep of packs the manifest does not name. Nothing outside the prefix changes: no object, no ref, no shard, no page. The list of pull requests and heads reaches core/site through a seam the client and the CLI fill from the review extension. A head over 32 MB of pack gets a tooLarge entry; an unfetched head a pending one.