Используйте глагол %w в fmt.Errorf: он оборачивает ошибку, сохраняя цепочку для errors.Is и errors.As.
if err != nil {
return fmt.Errorf("config load: %w", err)
}
Обёрнутая ошибка реализует Unwrap() error, поэтому errors.Is(err, originalErr) и errors.As(err, &target) работают.
return fmt.Errorf("config load: %v", err)
Глагол %v только добавляет текст в сообщение, но не оборачивает ошибку - цепочка теряется, errors.Is по оригинальной ошибке не сработает.
%w - обёртка с сохранением цепочки%v - только форматирование, без обёртки