Under the hood
Config loading now distinguishes read errors from parse errors, and both trigger the fallback-to-cache path.
Internal config-loading state now tracks a lastGetConfigOutcome enum with values "parsed", "parse-error", "read-error", and "enoent", replacing the previous boolean lastGetConfigWasParseError. Callers now branch on both parse-error and read-error cases to trigger fallback-to-cache behavior, where previously only parse errors did, and the outcome is surfaced as a readRejected flag alongside the returned config.