WithCancelCause возвращает контекст и cancel(cause). При вызове cancel(err) причина сохраняется. context.Cause(ctx) возвращает эту ошибку или nil. Удобно различать отмену по таймауту, по пользователю или по ошибке дочерней операции.
ctx, cancel := context.WithCancelCause(parent)
cancel(fmt.Errorf("reason"))
if err := context.Cause(ctx); err != nil { ... }