methodI2Nexact

"runtimeMethod namedOwnerInternal desc" -> named method: the EXACT reverse, holding precisely the rows reverseMethod has to refuse. Owner alone would not identify them — proguard reuses one name for several signatures of a single class — so the descriptor is part of the key.

Parser.pruneExact cuts it down to those rows once parsing is done, so its size tracks the real collision count rather than a guess: nearly every row survives on a spigot bundle, nearly none on intermediary/srg. The runtime name comes FIRST so that prune is a plain prefix read.

Keyed by the NAMED owner, so Parser.recordMethod needs no extra plumbing; namedMethodOn demaps the caller's runtime one for them. desc is in the RUNTIME namespace: Parser.pruneExact rewrites the file's own (named) one through runtimeDesc on the way in, because every caller arrives holding a descriptor read off live reflection.