@AnotherZach You don't necessarily have to add those routes, I just added in the question marks because I wasn't sure if those routes would even connect in the proper direction (I haven't looked at much of the space route stuff, apart from asteroid_spawn_definitions for my other mods).
Table should be simple enough to make, using Factorio code to extract it dynamically from an existing modlist (I'm not sure how well a standalone table would be, as it would have to constantly be updated depending on the changes that other planet mods make, as uncommon as that might be, or additions to the planetary table when a new planet mod releases)
As for the science/lab/tech issues and fixes; that seems to be an ongoing problem among modmakers. The biggest issue appears to be recursion and exceptions. Some mods like Lignumis have loops that add science packs to all techs, depending on which science pack they already use, which may conflict with other mods (like Cerys) that add their own labs and expect to use science in a different way.
So not all labs need all science packs, and not all technologies need to have certain science added to it. The more planet mods are added, the more exceptions need to be made. And this is before taking into account any overhaul or overhaul-adjacent mods like AAI Industry or mods that just change things about the base game like Nuclear Science or any of SafTheLamb's wood-related mods.
From a third-party standpoint, I wouldn't want modmakers to have to worry about compatibility that much; it isn't that difficult to write up a compatibility patch between any two mods, depending on what the error is. Compatibility patches would always load after the base mods too, so no need to worry about load order or whether something needs to run during data-updates or data-final-fixes.
And lastly, about the querying for all available science, I'm not sure exactly what you mean? You can always make a loop like:
local message = ""
for name, tech in pairs(data.raw.technology) do
message = message.."\n"..name
end
error(message)
That should write output the name of every technology in the game. If you only want to know specific properties of a table, you can change the looping message line to something like:
message = message.."\n"..name..":\n"..serpent.block(tech.unit)
That should output the name of tech, followed by its science pack requirements. Oh, might need an if statement to check if tech.unit exists before adding it to the message, since trigger techs don't have those. If you just want the entire technology table, then you can scrap the entire message and for looping stuff, and just write:
error(serpent.block(data.raw.technology))
That will output everything in the technology table at that exact point in time (best to run during data-final-fixes, to get what will likely be the finalized result)
EDIT: Oh, and one final thing, to check if a mod exists during either the settings or data loading step, you can use
if mods["internal-name-of-mod"] then
...
end
where the internal name is the one you would use under info.json, and the one that appears in the URL for the mod page. Like this mod's internal name would be "kry-all-planet-mods"