Everything detection needs, resolved once per run.
File type → the extractor that reads it.
File types marked not text and naming no extractor — they go down the multi-modal path.
Byte signatures, longest first so a more specific match wins.
Everything detection needs, resolved once per run.