k-fold cross-validation was done (the cv.folds parameter to gbm), but that doesn’t help when the model overfits like hell.
I agree this is probably what happened. From the estimation object I see around a total of 3500 training samples with around 90 predictors. 3-fold cross-validation was done so at each iteration only around 2150 samples were used for training... And it seems none of the samples were used for out-of-sample checking.