BoreaSettings names one loader: it carries GameDirectoryPath and StarMapDirectoryPath, mirrored by IGamePathProvider.GetStarMapDirectoryPath, GamePathProvider, BoreaSettingsDto and BoreaSettingsMapper.
GetStarMapDirectoryPath has no caller outside the tests and the test double, StarMapDirectoryPath is only round-tripped by the mapper, and GamePathProvider is never constructed in Borea.App. There are no call sites to follow and no behaviour to preserve.
Installing a loader per RFC 0035 also needs [provides].launch, content-dir and the [provides.configure] write, and [provides] is never stamped into a release file so it has to be re-read from the authored listing.
The change:
BoreaSettingsnames one loader: it carriesGameDirectoryPathandStarMapDirectoryPath, mirrored byIGamePathProvider.GetStarMapDirectoryPath,GamePathProvider,BoreaSettingsDtoandBoreaSettingsMapper.GetStarMapDirectoryPathhas no caller outside the tests and the test double,StarMapDirectoryPathis only round-tripped by the mapper, andGamePathProvideris never constructed inBorea.App. There are no call sites to follow and no behaviour to preserve.Installing a loader per RFC 0035 also needs
[provides].launch,content-dirand the[provides.configure]write, and[provides]is never stamped into a release file so it has to be re-read from the authored listing.The change:
BoreaSettings: replaceStarMapDirectoryPathwith a loader-id-to-path map, rebuilt throughModIds.Comparerthe wayModMetadatarebuildsLinks. Validate each key withModIds.Validateand keep the existing whitespace rejection per path.IGamePathProvider:GetLoaderDirectoryPath(string loaderId)returning null when unknown, andGamePathProviderfollows.BoreaSettingsDtotakes a dictionary likeModMetadataDto.Linksso Tomlyn writes it as a table, and the mapper maps both directions.ModIds.Comparersince TOML keys are case-sensitive and ids are not.