1/6

A single-line error is often useless on its own. "could not load config" tells an operator nothing they did not already know.

Error::source is the standard way to attach the reason:

impl Error for LoadFailed {
    fn source(&self) -> Option<&(dyn Error + 'static)> {
        Some(&self.cause)
    }
}

Each layer adds what it was trying to do and keeps the layer below intact. Walking the chain then produces the whole story, from the intent down to the syscall.